commit 25a72c3c866ac3f99857af1621c9a4502bf799dc Author: Alice Vital Date: Tue Mar 8 20:25:51 2022 +0300 Initial commit diff --git a/Apophysis.res b/Apophysis.res new file mode 100644 index 0000000..1427fa0 Binary files /dev/null and b/Apophysis.res differ diff --git a/ApophysisAV.dpr b/ApophysisAV.dpr new file mode 100644 index 0000000..e7ff67f --- /dev/null +++ b/ApophysisAV.dpr @@ -0,0 +1,238 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} +program ApophysisAV; + +{$SetPEFlags $20} + +uses + Forms, + Dialogs, + SysUtils, + Vcl.Themes, + Vcl.Styles, + Binary in 'IO\Binary.pas', + Base64 in 'IO\Base64.pas', + sdStringTable in 'System\sdStringTable.pas', + CustomDrawControl in 'System\CustomDrawControl.pas', + LibXmlComps in 'System\LibXmlComps.pas', + LibXmlParser in 'System\LibXmlParser.pas', + RegexHelper in 'System\RegexHelper.pas', + CurvesControl in 'System\CurvesControl.pas', + {$ifndef Apo7X64} + AsmRandom in 'System\AsmRandom.pas', + {$endif } + Global in 'Core\Global.pas', + CommandLine in 'IO\CommandLine.pas', + MissingPlugin in 'IO\MissingPlugin.pas', + Settings in 'IO\Settings.pas', + Translation in 'Core\Translation.pas', + Chaotica in 'Core\Chaotica.pas', + Bezier in 'Core\Bezier.pas', + RndFlame in 'Flame\RndFlame.pas', + ControlPoint in 'Flame\ControlPoint.pas', + cmapdata in 'ColorMap\cmapdata.pas', + cmap in 'ColorMap\cmap.pas', + GradientHlpr in 'ColorMap\GradientHlpr.pas', + XFormMan in 'Core\XFormMan.pas', + XForm in 'Flame\XForm.pas', + BaseVariation in 'Core\BaseVariation.pas', + RenderingCommon in 'Rendering\RenderingCommon.pas', + RenderingInterface in 'Rendering\RenderingInterface.pas', + RenderingImplementation in 'Rendering\RenderingImplementation.pas', + BucketFillerThread in 'Rendering\BucketFillerThread.pas', + RenderThread in 'Rendering\RenderThread.pas', + ImageMaker in 'Rendering\ImageMaker.pas', + varSinusoidal in 'Variations\varSinusoidal.pas', + varLog in 'Variations\varLog.pas', + varModulus in 'Variations\varModulus.pas', + varSphyp3D in 'Variations\varSphyp3D.pas', + varInversion3D in 'Variations\varInversion3D.pas', + varRings2 in 'Variations\varRings2.pas', + varFan2 in 'Variations\varFan2.pas', + varWedge in 'Variations\varWedge.pas', + varEpispiral in 'Variations\varEpispiral.pas', + varBwraps in 'Variations\varBwraps.pas', + varPDJ in 'Variations\varPDJ.pas', + varJuliaN in 'Variations\varJuliaN.pas', + varJuliaScope in 'Variations\varJuliaScope.pas', + varJulia3Djf in 'Variations\varJulia3Djf.pas', + varJulia3Dz in 'Variations\varJulia3Dz.pas', + varJuliaN3Dx in 'Variations\varJuliaN3Dx.pas', + varJulian2DC in 'Variations\varJulian2DC.pas', + varCurl in 'Variations\varCurl.pas', + varCurl3D in 'Variations\varCurl3D.pas', + varRadialBlur in 'Variations\varRadialBlur.pas', + varSuperShape in 'Variations\varSuperShape.pas', + varNBlur in 'Variations\varNBlur.pas', + varBlurCircle in 'Variations\varBlurCircle.pas', + varBlurZoom in 'Variations\varBlurZoom.pas', + varBlurPixelize in 'Variations\varBlurPixelize.pas', + varFalloff2 in 'Variations\varFalloff2.pas', + varRectangles in 'Variations\varRectangles.pas', + varSplits in 'Variations\varSplits.pas', + varSeparation in 'Variations\varSeparation.pas', + varBipolar in 'Variations\varBipolar.pas', + varLoonie in 'Variations\varLoonie.pas', + varEscher in 'Variations\varEscher.pas', + varScry in 'Variations\varScry.pas', + varNGon in 'Variations\varNGon.pas', + varFoci in 'Variations\varFoci.pas', + varUnpolar in 'Variations\varUnpolar.pas', + varLazysusan in 'Variations\varLazysusan.pas', + varDCBubble in 'Variations\varDCBubble.pas', + varMobius in 'Variations\varMobius.pas', + varButterfly in 'Variations\varButterfly.pas', + varBoarders2 in 'Variations\varBoarders2.pas', + varAffine3D in 'Variations\varAffine3D.pas', + varHyperboloid in 'Variations\varHyperboloid.pas', + varCirclize in 'Variations\varCirclize.pas', + varCircleCrop in 'Variations\varCircleCrop.pas', + varCrop in 'Variations\varCrop.pas', + varTriangleCrop in 'Variations\varTriangleCrop.pas', + varSphereCrop in 'Variations\varSphereCrop.pas', + varElliptic in 'Variations\varElliptic.pas', + varWaves2 in 'Variations\varWaves2.pas', + varAuger in 'Variations\varAuger.pas', + varFlux in 'Variations\varFlux.pas', + varCpow3 in 'Variations\varCpow3.pas', + varGlynnSim1 in 'Variations\varGlynnSim1.pas', + varGlynnSim2 in 'Variations\varGlynnSim2.pas', + varGlynnSim3 in 'Variations\varGlynnSim3.pas', + varHypertile in 'Variations\varHypertile.pas', + varHypertile1 in 'Variations\varHypertile1.pas', + varHypertile2 in 'Variations\varHypertile2.pas', + varHypertile3D in 'Variations\varHypertile3D.pas', + varHypertile3D1 in 'Variations\varHypertile3D1.pas', + varHypertile3D2 in 'Variations\varHypertile3D2.pas', + varTaurus in 'Variations\varTaurus.pas', + varPreSpherical in 'Variations\varPreSpherical.pas', + varPreSinusoidal in 'Variations\varPreSinusoidal.pas', + varPreDisc in 'Variations\varPreDisc.pas', + varPreBoarders2 in 'Variations\varPreBoarders2.pas', + varPreBwraps in 'Variations\varPreBwraps.pas', + varPreCircleCrop in 'Variations\varPreCircleCrop.pas', + varPreCrop in 'Variations\varPreCrop.pas', + varPreFalloff2 in 'Variations\varPreFalloff2.pas', + varPostBoarders2 in 'Variations\varPostBoarders2.pas', + varPostBwraps in 'Variations\varPostBwraps.pas', + varPostCurl in 'Variations\varPostCurl.pas', + varPostCurl3D in 'Variations\varPostCurl3D.pas', + varPostCircleCrop in 'Variations\varPostCircleCrop.pas', + varPostCrop in 'Variations\varPostCrop.pas', + varPostFalloff2 in 'Variations\varPostFalloff2.pas', + varPostSpherical in 'Variations\varPostSpherical.pas', + varPostSinusoidal in 'Variations\varPostSinusoidal.pas', + varProjective in 'Variations\varProjective.pas', + varHandkerchief in 'Variations\varHandkerchief.pas', + varJulia in 'Variations\varJulia.pas', + varEx in 'Variations\varEx.pas', + varExponential in 'Variations\varExponential.pas', + varBlob in 'Variations\varBlob.pas', + varHeart in 'Variations\varHeart.pas', + varPower in 'Variations\varPower.pas', + varTwinTrian in 'Variations\varTwinTrian.pas', + varBlade in 'Variations\varBlade.pas', + varTangent in 'Variations\varTangent.pas', + varCosine in 'Variations\varCosine.pas', + varBent2 in 'Variations\varBent2.pas', + varPopcorn2 in 'Variations\varPopcorn2.pas', + varDisc2 in 'Variations\varDisc2.pas', + varSecant in 'Variations\varSecant.pas', + varZVortex in 'Variations\varZVortex.pas', + varArch in 'Variations\varArch.pas', + varTanhSpiral in 'Variations\varTanhSpiral.pas', + varCothSpiral in 'Variations\varCothSpiral.pas', + varGenericPlugin in 'Variations\varGenericPlugin.pas', + Main in 'Forms\Main.pas' {MainForm}, + Tracer in 'Forms\Tracer.pas' {TraceForm}, + About in 'Forms\About.pas' {AboutForm}, + Adjust in 'Forms\Adjust.pas' {AdjustForm}, + Browser in 'Forms\Browser.pas' {GradientBrowser}, + Editor in 'Forms\Editor.pas' {EditForm}, + FormExport in 'Forms\FormExport.pas' {ExportDialog}, + formPostProcess in 'Forms\formPostProcess.pas' {frmPostProcess}, + FormRender in 'Forms\FormRender.pas' {RenderForm}, + Fullscreen in 'Forms\Fullscreen.pas' {FullscreenForm}, + LoadTracker in 'Forms\LoadTracker.pas' {LoadForm}, + Mutate in 'Forms\Mutate.pas' {MutateForm}, + Options in 'Forms\Options.pas' {OptionsForm}, + Save in 'Forms\Save.pas' {SaveForm}, + SavePreset in 'Forms\SavePreset.pas' {SavePresetForm}, + SplashForm in 'Forms\SplashForm.pas' {SplashWindow}, + Template in 'Forms\Template.pas' {TemplateForm}, + Curves in 'Forms\Curves.pas' {CurvesForm}, + Preview in 'Forms\Preview.pas' {PreviewForm}, + FormFavorites in 'Forms\FormFavorites.pas' {FavoritesForm}, + ScriptForm in 'Forms\ScriptForm.pas' {ScriptEditor}, + ScriptRender in 'Forms\ScriptRender.pas' {ScriptRenderForm}, + ColorRangeForm in 'Forms\ColorRangeForm.pas' {ColorSelection}, + Chaos in 'Forms\Chaos.pas' {ChaosForm}, + VarOrderForm in 'Forms\VarOrderForm.pas' {VarOrder}; + +{$R *.res} + {$R Apophysis.res} +begin + + ReportMemoryLeaksOnShutdown := true; + + InitializePlugins; + + SplashWindow := TSplashWindow.Create(Application); + SplashWindow.Show; + + Application.Initialize; + SplashWindow.Update; + + {$ifdef Apo7X64} + Application.Title := 'Apophysis AV (64 bit)'; + {$else} + Application.Title := 'Apophysis AV (32 bit)'; + {$endif} + Application.HelpFile := 'ApophysisAV.chm'; + Application.CreateForm(TMainForm, MainForm); + Application.CreateForm(TTraceForm, TraceForm); + Application.CreateForm(TAboutForm, AboutForm); + Application.CreateForm(TAdjustForm, AdjustForm); + Application.CreateForm(TGradientBrowser, GradientBrowser); + Application.CreateForm(TEditForm, EditForm); + Application.CreateForm(TfrmPostProcess, frmPostProcess); + Application.CreateForm(TRenderForm, RenderForm); + Application.CreateForm(TFullscreenForm, FullscreenForm); + Application.CreateForm(TLoadForm, LoadForm); + Application.CreateForm(TMutateForm, MutateForm); + Application.CreateForm(TOptionsForm, OptionsForm); + Application.CreateForm(TSaveForm, SaveForm); + Application.CreateForm(TSavePresetForm, SavePresetForm); + Application.CreateForm(TTemplateForm, TemplateForm); + Application.CreateForm(TCurvesForm, CurvesForm); + Application.CreateForm(TPreviewForm, PreviewForm); + Application.CreateForm(TFavoritesForm, FavoritesForm); + Application.CreateForm(TScriptEditor, ScriptEditor); + Application.CreateForm(TScriptRenderForm, ScriptRenderForm); + Application.CreateForm(TColorSelection, ColorSelection); + Application.CreateForm(TChaosForm, ChaosForm); + Application.CreateForm(TVarOrder, VarOrder); + Application.UpdateFormatSettings := False; + FormatSettings.DecimalSeparator := '.'; + Application.Run; +end. + + diff --git a/ApophysisAV.dproj b/ApophysisAV.dproj new file mode 100644 index 0000000..8d94345 --- /dev/null +++ b/ApophysisAV.dproj @@ -0,0 +1,1277 @@ + + + {AC01F3AB-4101-4C09-A648-1CC8E2C412D5} + ApophysisAV.dpr + True + Release + 3 + Application + VCL + 18.8 + Win32 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + CompanyName=;FileDescription=IFS Fractal Generator;FileVersion=1.0.1.0;InternalName=Apophysis;LegalCopyright=Alice Koryagina;LegalTrademarks=;OriginalFilename=Apophysis Phoenix Edition;ProductName=Apophysis Phoenix Edition;ProductVersion=1.0.1.0 + $(BDS)\bin\default_app.manifest + ApophysisAV_Icon2.ico + false + false + vcl;rtl;dbrtl;adortl;vcldb;vclx;bdertl;vcldbx;dsnap;cds;bdecds;teeui;teedb;tee;dss;visualclx;visualdbclx;dsnapcrba;dsnapcon;VclSmp;vclie;xmlrtl;inet;inetdbbde;inetdbxpress;inetdb;nmfast;webdsnap;websnap;soaprtl;dbexpress;dbxcds;dclOffice2k;FlatStyle_D6;S303_R60;RzLPDB60;RzLPND60;vclshlctrls;B302vr60;VirtualTreesD6;o403_r60;ibxpress;CSP20I60;Rz30Ctls60;Rz30DBCtls60;indy;Indy60;vclactnband;$(DCC_UsePackage) + 00400000 + false + false + false + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;System.Win;$(DCC_Namespace) + false + ..\..\out + $(BDS)\lib\Debug;$(BDS)\Lib\Debug\Indy10;$(DELPHI)\Lib\Debug;$(DCC_UnitSearchPath) + false + true + false + false + false + false + ..\..\out\dcu + false + false + 1033 + false + ApophysisAV + true + "Cyan Night|VCLSTYLE|$(BDSCOMMONDIR)\Styles\CyanNight.vsf";"Ruby Graphite|VCLSTYLE|$(BDSCOMMONDIR)\Styles\RubyGraphite.vsf" + 1 + + + ..\..\Out\x86\ + ..\..\Out\x86\dcu\ + Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + CompanyName=;FileDescription=IFS Fractal Editor;FileVersion=1.0.1.0;InternalName=Apophysis;LegalCopyright=Alice Koryagina;LegalTrademarks=;OriginalFilename=Apophysis AV "Phoenix Edition";ProductName=Apophysis Phoenix Edition;ProductVersion=1.0.1.0 + ApophysisAV_Icon.ico + + + ..\..\Out\x64\ + ..\..\Out\x64\dcu\ + Apo7X64;$(DCC_Define) + Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + CompanyName=;FileDescription=IFS Fractal Editor;FileVersion=1.0.1.0;InternalName=Apophysis;LegalCopyright=Alice Koryagina;LegalTrademarks=;OriginalFilename=Apophysis AV "Phoenix Edition";ProductName=Apophysis Phoenix Edition;ProductVersion=1.0.1.0 + ApophysisAV_Icon.ico + + + false + 0 + 0 + RELEASE;$(DCC_Define) + + + CompanyName=Alice V., Apophysis Developers;FileDescription=RIFS Fractal Editor;FileVersion=1.0.1.0;InternalName=Apophysis;LegalCopyright=© 2021 Alice V. Koryagina;LegalTrademarks=;OriginalFilename=ApophysisAV.exe;ProductName=Apophysis AV "Phoenix Edition";ProductVersion=1.0.1.0 + true + Debug + ApophysisAV_Icon.ico + + + true + CompanyName=Alice V., Apophysis Developers;FileDescription=RIFS Fractal Editor;FileVersion=1.0.1.0;InternalName=Apophysis;LegalCopyright=© 2021 Alice V. Koryagina;LegalTrademarks=;OriginalFilename=ApophysisAV_64.exe;ProductName=Apophysis AV "Phoenix Edition";ProductVersion=1.0.1.0 + Debug + ApophysisAV_Icon.ico + + + DEBUG;$(DCC_Define) + false + true + CompanyName=;FileDescription=IFS Fractal Editor;FileVersion=1.0.1.0;InternalName=ApophysisAV;LegalCopyright=Alice Koryagina;LegalTrademarks=;OriginalFilename=Apophysis AV "Phoenix Edition";ProductName=Apophysis Phoenix Edition;ProductVersion=1.0.1.0 + + + true + true + Debug + CompanyName=Apophysis Developers Team;FileDescription=RIFS Fractal Editor;FileVersion=1.0.1.0;InternalName=Apophysis;LegalCopyright=© 2021 Alice V. Koryagina;LegalTrademarks=;OriginalFilename=ApophysisAV.exe;ProductName=Apophysis AV "Phoenix Edition";ProductVersion=1.0.1.0 + ApophysisAV_Icon1.ico + + + true + false + true + true + Debug + CompanyName=Apophysis Developers Team;FileDescription=RIFS Fractal Editor;FileVersion=1.0.1.0;InternalName=Apophysis;LegalCopyright=© 2021 Alice V. Koryagina;LegalTrademarks=;OriginalFilename=ApophysisAV64.exe;ProductName=Apophysis AV "Phoenix Edition";ProductVersion=1.0.1.0 + ApophysisAV_Icon.ico + + + + MainSource + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MainForm
+
+ +
TraceForm
+
+ +
AboutForm
+
+ +
AdjustForm
+
+ +
GradientBrowser
+
+ +
EditForm
+
+ +
ExportDialog
+
+ +
frmPostProcess
+
+ +
RenderForm
+
+ +
FullscreenForm
+
+ +
LoadForm
+
+ +
MutateForm
+
+ +
OptionsForm
+
+ +
SaveForm
+
+ +
SavePresetForm
+
+ +
SplashWindow
+
+ +
TemplateForm
+
+ +
CurvesForm
+
+ +
PreviewForm
+
+ +
FavoritesForm
+
+ +
ScriptEditor
+
+ +
ScriptRenderForm
+
+ +
ColorSelection
+
+ +
ChaosForm
+
+ +
VarOrder
+
+ + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + Delphi.Personality.12 + + + + + ApophysisAV.dpr + + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + True + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1031 + 1252 + + + + IFS Fractal Generator + 1.0.0.0 + Apophysis + Alice Koryagina + + ApophysisAV + Apophysis AV Phoenix Edition + 1.0.0.0 + + + + + True + True + + False + + + + .\ + true + + + + + ApophysisAV.exe + true + + + + + ApophysisAV.exe + true + + + + + .\ + true + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + classes + 1 + + + classes + 1 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + 1 + + + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + + + 12 + + + + +
diff --git a/ApophysisAV.res b/ApophysisAV.res new file mode 100644 index 0000000..b396713 Binary files /dev/null and b/ApophysisAV.res differ diff --git a/ApophysisAV_Icon.ico b/ApophysisAV_Icon.ico new file mode 100644 index 0000000..60c1248 Binary files /dev/null and b/ApophysisAV_Icon.ico differ diff --git a/ColorMap/GradientHlpr.pas b/ColorMap/GradientHlpr.pas new file mode 100644 index 0000000..d26d290 --- /dev/null +++ b/ColorMap/GradientHlpr.pas @@ -0,0 +1,190 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit GradientHlpr; + +interface + +uses + windows, Graphics, Cmap; + +const + PixelCountMax = 32768; + +type + pRGBTripleArray = ^TRGBTripleArray; + TRGBTripleArray = array[0..PixelCountMax - 1] of TRGBTriple; + +type + TGradientHelper = class + private + procedure RGBBlend(a, b: integer; var Palette: TColorMap); + public + function GetGradientBitmap(Index: integer; const hue_rotation: double): TBitmap; + function RandomGradient: TColorMap; + end; + +var + GradientHelper: TGradientHelper; + +implementation + +uses + Global; + +{ TGradientHelper } + +function TGradientHelper.GetGradientBitmap(Index: integer; const hue_rotation: double): TBitmap; +var + BitMap: TBitMap; + i, j: integer; + Row: pRGBTripleArray; + pal: TColorMap; +begin + GetCMap(index, hue_rotation, pal); + + BitMap := TBitMap.create; + Bitmap.PixelFormat := pf24bit; + BitMap.Width := 256; + BitMap.Height := 2; + + for j := 0 to Bitmap.Height - 1 do begin + Row := Bitmap.Scanline[j]; + for i := 0 to Bitmap.Width - 1 do begin + Row[i].rgbtRed := Pal[i][0]; + Row[i].rgbtGreen := Pal[i][1]; + Row[i].rgbtBlue := Pal[i][2]; + end + end; + + Result := BitMap; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TGradientHelper.RandomGradient: TColorMap; +var + a, b, i, n, nodes: integer; + c: byte; + rgb: array[0..2] of double; + hsv: array[0..2] of double; + pal: TColorMap; +begin + rgb[0] := 0; + rgb[1] := 0; + rgb[2] := 0; + + inc(MainSeed); + RandSeed := Mainseed; + nodes := random((MaxNodes - 1) - (MinNodes - 2)) + (MinNodes - 1); + n := 256 div nodes; + b := 0; + hsv[0] := 0.01 * (random(MaxHue - (MinHue - 1)) + MinHue); + hsv[1] := 0.01 * (random(MaxSat - (MinSat - 1)) + MinSat); + hsv[2] := 0.01 * (random(MaxLum - (MinLum - 1)) + MinLum); + hsv2rgb(hsv, rgb); + Pal[0][0] := Round(rgb[0] * 255); + Pal[0][1] := Round(rgb[1] * 255); + Pal[0][2] := Round(rgb[2] * 255); + c := 0; + repeat + a := b; + if EqualStripes then + b := b + n + else begin + inc(c); + if c = nodes then + b := 255 + else begin + i := Random(256 - b); + b := b + i; + end; + end; + hsv[0] := 0.01 * (random(MaxHue - (MinHue - 1)) + MinHue); + hsv[1] := 0.01 * (random(MaxSat - (MinSat - 1)) + MinSat); + hsv[2] := 0.01 * (random(MaxLum - (MinLum - 1)) + MinLum); + hsv2rgb(hsv, rgb); + if b > 255 then b := 255; + Pal[b][0] := Round(rgb[0] * 255); + Pal[b][1] := Round(rgb[1] * 255); + Pal[b][2] := Round(rgb[2] * 255); + case randColorBlend of + 0: RGBBlend(a, b, pal); + 1: HSVBlend(a, b, pal); + else + for i := a + 1 to b - 1 do + begin + Pal[i][0] := Round(rgb[0] * 255); + Pal[i][1] := Round(rgb[1] * 255); + Pal[i][2] := Round(rgb[2] * 255); + end; + end; + until b = 255; + Result := Pal; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TGradientHelper.RGBBlend(a, b: integer; var Palette: TColorMap); +{ Linear blend between to indices of a palette } +var + c, v: real; + vrange, range: real; + i: integer; +begin + if a = b then + begin + Exit; + end; + range := b - a; + vrange := Palette[b mod 256][0] - Palette[a mod 256][0]; + c := Palette[a mod 256][0]; + v := vrange / range; + for i := (a + 1) to (b - 1) do + begin + c := c + v; + Palette[i mod 256][0] := Round(c); + end; + vrange := Palette[b mod 256][1] - Palette[a mod 256][1]; + c := Palette[a mod 256][1]; + v := vrange / range; + for i := a + 1 to b - 1 do + begin + c := c + v; + Palette[i mod 256][1] := Round(c); + end; + vrange := Palette[b mod 256][2] - Palette[a mod 256][2]; + c := Palette[a mod 256][2]; + v := vrange / range; + for i := a + 1 to b - 1 do + begin + c := c + v; + Palette[i mod 256][2] := Round(c); + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + GradientHelper := TGradientHelper.create; +finalization + GradientHelper.Free; +end. diff --git a/ColorMap/cmap.pas b/ColorMap/cmap.pas new file mode 100644 index 0000000..fd07fbc --- /dev/null +++ b/ColorMap/cmap.pas @@ -0,0 +1,426 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} +unit Cmap; + +interface + +uses sysutils, classes; + +type + TColorMap = array[0..255, 0..3] of integer; + +type + EFormatInvalid = class(Exception); + +const + RANDOMCMAP = -1; + NRCMAPS = 704; + +procedure GetCmap(var Index: integer; const hue_rotation: double; out cmap: TColorMap); +procedure GetCmapName(var Index: integer; out Name: string); +procedure rgb2hsv(const rgb: array of double; out hsv: array of double); +procedure hsv2rgb(const hsv: array of double; out rgb: array of double); +function GetGradient(FileName, Entry: string): string; +function GetPalette(strng: string; var Palette: TColorMap): boolean; +procedure GetTokens(s: string; var mlist: TStringList); +procedure HSVBlend(a, b: integer; var Palette: TColorMap); // AV +procedure RGBBlend(a, b: integer; var Palette: TColorMap); +procedure Brighten(const n: byte; var r, g, b: byte); // AV + +implementation + +uses + cmapdata, Math; + +procedure rgb2hsv(const rgb: array of double; out hsv: array of double); +var + maxval, minval: double; + del: double; +begin + Maxval := Max(rgb[0], Max(rgb[1], rgb[2])); + Minval := Min(rgb[0], Min(rgb[1], rgb[2])); + + hsv[2] := maxval; // v + + if (Maxval > 0) and (maxval <> minval) then begin + del := maxval - minval; + hsv[1] := del / Maxval; //s + + hsv[0] := 0; + if (rgb[0] > rgb[1]) and (rgb[0] > rgb[2]) then begin + hsv[0] := (rgb[1] - rgb[2]) / del; + end else if (rgb[1] > rgb[2]) then begin + hsv[0] := 2 + (rgb[2] - rgb[0]) / del; + end else begin + hsv[0] := 4 + (rgb[0] - rgb[1]) / del; + end; + + if hsv[0] < 0 then + hsv[0] := hsv[0] + 6; + + end else begin + hsv[0] := 0; + hsv[1] := 0; + end; +end; + +procedure hsv2rgb(const hsv: array of double; out rgb: array of double); +var + j: integer; + f, p, q, t, v: double; +begin + try +// rgb[0] := 0; +// rgb[1] := 0; +// rgb[2] := 0; + + j := floor(hsv[0]); + + f := hsv[0] - j; + v := hsv[2]; + p := hsv[2] * (1 - hsv[1]); + q := hsv[2] * (1 - hsv[1] * f); + t := hsv[2] * (1 - hsv[1] * (1 - f)); + case j of + 0: begin rgb[0] := v; rgb[1] := t; rgb[2] := p; end; + 1: begin rgb[0] := q; rgb[1] := v; rgb[2] := p; end; + 2: begin rgb[0] := p; rgb[1] := v; rgb[2] := t; end; + 3: begin rgb[0] := p; rgb[1] := q; rgb[2] := v; end; + 4: begin rgb[0] := t; rgb[1] := p; rgb[2] := v; end; + 5: begin rgb[0] := v; rgb[1] := p; rgb[2] := q; end; + end; + except on EMathError do + end; +end; + +procedure GetCmap(var Index: integer; const hue_rotation: double; out cmap: TColorMap); +var + i: Integer; + rgb: array[0..2] of double; + hsv: array[0..2] of double; +begin + if Index = RANDOMCMAP then + Index := Random(NRCMAPS); + + if (Index < 0) or (Index >= NRCMAPS) then + Index := 0; + + for i := 0 to 255 do begin + rgb[0] := cmaps[Index][i][0] / 255.0; + rgb[1] := cmaps[Index][i][1] / 255.0; + rgb[2] := cmaps[Index][i][2] / 255.0; + + rgb2hsv(rgb, hsv); + hsv[0] := hsv[0] + hue_rotation * 6; + hsv2rgb(hsv, rgb); + + cmap[i][0] := Round(rgb[0] * 255); + cmap[i][1] := Round(rgb[1] * 255); + cmap[i][2] := Round(rgb[2] * 255); + end; +end; + +procedure GetCmapName(var Index: integer; out Name: string); +begin + if Index = RANDOMCMAP then + Index := Random(NRCMAPS); + + if (Index < 0) or (Index >= NRCMAPS) then + Index := 0; + + Name := CMapNames[Index]; +end; + + +procedure RGBBlend(a, b: integer; var Palette: TColorMap); +{ Linear blend between to indices of a palette } +var + c, v: real; + vrange, range: real; + i: integer; +begin + if a = b then + begin + Exit; + end; + range := b - a; + vrange := Palette[b mod 256][0] - Palette[a mod 256][0]; + c := Palette[a mod 256][0]; + v := vrange / range; + for i := (a + 1) to (b - 1) do + begin + c := c + v; + Palette[i mod 256][0] := Round(c); + end; + vrange := Palette[b mod 256][1] - Palette[a mod 256][1]; + c := Palette[a mod 256][1]; + v := vrange / range; + for i := a + 1 to b - 1 do + begin + c := c + v; + Palette[i mod 256][1] := Round(c); + end; + vrange := Palette[b mod 256][2] - Palette[a mod 256][2]; + c := Palette[a mod 256][2]; + v := vrange / range; + for i := a + 1 to b - 1 do + begin + c := c + v; + Palette[i mod 256][2] := Round(c); + end; +end; + +procedure HSVBlend(a, b: integer; var Palette: TColorMap); +{ AV: Linear HSV interpolation} +var i, range: integer; + rgb, hsv, rgb1, hsv1, rgb2, hsv2: array [0..2] of double; + + function lerp(range, b, i: integer; p1, p2: double): double; + var k: double; + begin + k := (b - i)/range; + Result := k * p1 + (1 - k) * p2; + end; +begin + if a = b then Exit; + range := b - a; + for i := 0 to 2 do begin + rgb1[i] := double(Palette[a][i]); + rgb2[i] := double(Palette[b][i]); + end; + rgb2hsv(rgb1, hsv1); + rgb2hsv(rgb2, hsv2); + for i := (a + 1) to (b - 1) do + begin + hsv[0] := lerp(range, b, i, hsv1[0], hsv2[0]); + hsv[1] := lerp(range, b, i, hsv1[1], hsv2[1]); + hsv[2] := lerp(range, b, i, hsv1[2], hsv2[2]); + hsv2rgb(hsv, rgb); + Palette[i][0] := Round(rgb[0]); + Palette[i][1] := Round(rgb[1]); + Palette[i][2] := Round(rgb[2]); + end; +end; + +procedure Brighten(const n: byte; var r, g, b: byte); +var rgb, hsv: array [0..2] of double; +begin + rgb[0] := double(r); + rgb[1] := double(g); + rgb[2] := double(b); + rgb2hsv(rgb, hsv); + hsv[2] := hsv[2] + n; + // if (hsv[2] < 0) then hsv[2] := 0 + // else if (hsv[2] > 255) then hsv[2] := 255; + hsv2rgb(hsv, rgb); + r := Round(rgb[0]); + g := Round(rgb[1]); + b := Round(rgb[2]); +end; + +function GetVal(token: string): string; +var + p: integer; +begin + p := Pos('=', token); + Delete(Token, 1, p); + Result := Token; +end; + +function ReplaceTabs(str: string): string; +{Changes tab characters in a string to spaces} +var + i: integer; +begin + for i := 1 to Length(str) do + begin + if str[i] = #9 then + begin + Delete(str, i, 1); + Insert(#32, str, i); + end; + end; + Result := str; +end; + +procedure GetTokens(s: string; var mlist: TStringList); +var + test, token: string; +begin + mlist.clear; + test := s; + while (Length(Test) > 0) do + begin + while (Length(Test) > 0) and CharInSet(test[1],[#32]) do + Delete(test, 1, 1); + if (Length(Test) = 0) then + exit; + token := ''; + while (Length(Test) > 0) and (not CharInSet(test[1],[#32])) do + begin + token := token + test[1]; + Delete(test, 1, 1); + end; + mlist.add(token); + end; +end; + + +function GetPalette(strng: string; var Palette: TColorMap): boolean; +{ Loads a palette from a gradient string } +var + Strings: TStringList; + index, i: integer; + Tokens: TStringList; + Indices, Colors: TStringList; + a, b: integer; +begin + GetPalette := True; + Strings := TStringList.Create; + Tokens := TStringList.Create; + Indices := TStringList.Create; + Colors := TStringList.Create; + try + try + Strings.Text := strng; + if Pos('}', Strings.Text) = 0 then raise EFormatInvalid.Create('No closing brace'); + if Pos('{', Strings[0]) = 0 then raise EFormatInvalid.Create('No opening brace.'); + GetTokens(ReplaceTabs(Strings.Text), Tokens); + i := 0; + while (Pos('}', Tokens[i]) = 0) and (Pos('opacity:', Lowercase(Tokens[i])) = 0) do + begin + if Pos('index=', LowerCase(Tokens[i])) <> 0 then + Indices.Add(GetVal(Tokens[i])) + else if Pos('color=', LowerCase(Tokens[i])) <> 0 then + Colors.Add(GetVal(Tokens[i])); + inc(i) + end; + for i := 0 to 255 do + begin + Palette[i][0] := 0; + Palette[i][1] := 0; + Palette[i][2] := 0; + end; + if Indices.Count = 0 then raise EFormatInvalid.Create('No color info'); + for i := 0 to Indices.Count - 1 do + begin + try + index := StrToInt(Indices[i]); + while index < 0 do inc(index, 400); + index := Round(Index * (255 / 399)); + indices[i] := IntToStr(index); + assert(index>=0); + assert(index<256); + Palette[index][0] := StrToInt(Colors[i]) mod 256; + Palette[index][1] := trunc(StrToInt(Colors[i]) / 256) mod 256; + Palette[index][2] := trunc(StrToInt(Colors[i]) / 65536); + except + end; + end; + i := 1; + repeat + a := StrToInt(Indices[i - 1]); + b := StrToInt(Indices[i]); + RGBBlend(a, b, Palette); + inc(i); + until i = Indices.Count; + if (Indices[0] <> '0') or (Indices[Indices.Count - 1] <> '255') then + begin + a := StrToInt(Indices[Indices.Count - 1]); + b := StrToInt(Indices[0]) + 256; + RGBBlend(a, b, Palette); + end; + except on EFormatInvalid do + begin + Result := False; + end; + end; + finally + Tokens.Free; + Strings.Free; + Indices.Free; + Colors.Free; + end; +end; + +function GetGradient(FileName, Entry: string): string; +var + FileStrings: TStringList; + GradStrings: TStringList; + i: integer; +begin + FileStrings := TStringList.Create; + GradStrings := TStringList.Create; + try + try + FileStrings.LoadFromFile(FileName); + for i := 0 to FileStrings.count - 1 do + if Pos(Entry + ' ', Trim(FileStrings[i])) = 1 then break; + GradStrings.Add(FileStrings[i]); + repeat + inc(i); + GradStrings.Add(FileStrings[i]); + until Pos('}', FileStrings[i]) <> 0; + GetGradient := GradStrings.Text; + except on exception do + Result := ''; + end; + finally + GradStrings.Free; + FileStrings.Free; + end; +end; + +function LoadGradient(FileName, Entry: string; var gString: string; var Pal: TColorMap): boolean; +var + FileStrings: TStringList; + GradStrings: TStringList; + i: integer; +begin + FileStrings := TStringList.Create; + GradStrings := TStringList.Create; + try + try + FileStrings.LoadFromFile(FileName); + for i := 0 to FileStrings.count - 1 do + if Pos(Entry + ' ', Trim(FileStrings[i])) = 1 then break; + GradStrings.Add(FileStrings[i]); + repeat + inc(i); + GradStrings.Add(FileStrings[i]); + until Pos('}', FileStrings[i]) <> 0; + gString := GradStrings.Text; + Result := GetPalette(GradStrings.Text, Pal); + except on exception do + Result := False; + end; + finally + GradStrings.Free; + FileStrings.Free; + end; +end; + + +end. + diff --git a/ColorMap/cmapdata.pas b/ColorMap/cmapdata.pas new file mode 100644 index 0000000..ba368e7 --- /dev/null +++ b/ColorMap/cmapdata.pas @@ -0,0 +1,47946 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} +unit cmapdata; + +// updated on 2004-12-10 by Ralf Lehmann to match Flam3's color maps from: +// "@(#) $Id: cmapdata.pas,v 1.2 2005/09/08 16:52:12 zueuk Exp $" +// Last Hack: Alice V. Koryagina, fixme! + +interface + +Const + NMAPS = 703; + cmaps : array[0..NMAPS,0..255,0..2] of byte = +( +// 0 south-sea-bather +((185, 234, 235), (193, 238, 235), (197, 242, 235), (201, 242, 235), + (201, 246, 235), (205, 246, 235), (205, 246, 235), (205, 242, 235), + (209, 242, 235), (210, 238, 235), (209, 242, 225), (214, 242, 235), + (221, 246, 254), (213, 242, 244), (242, 250, 244), (226, 242, 235), + (222, 242, 235), (214, 242, 235), (214, 242, 244), (209, 238, 244), + (209, 238, 244), (205, 238, 244), (205, 238, 235), (201, 238, 235), + (201, 238, 235), (201, 238, 244), (201, 238, 244), (201, 242, 244), + (205, 242, 244), (209, 242, 244), (210, 242, 244), (209, 246, 244), + (205, 242, 244), (197, 242, 244), (189, 242, 244), (189, 242, 244), + (185, 238, 244), (181, 242, 244), (189, 242, 244), (193, 242, 244), + (197, 242, 254), (197, 242, 254), (189, 242, 244), (181, 242, 244), + (177, 242, 244), (181, 238, 244), (189, 234, 235), (189, 234, 235), + (193, 230, 235), (193, 230, 235), (189, 230, 225), (181, 230, 225), + (165, 230, 225), (165, 226, 225), (161, 226, 235), (157, 230, 234), + (153, 222, 244), (165, 226, 244), (165, 230, 244), (165, 230, 244), + (169, 226, 244), (173, 226, 235), (177, 226, 235), (177, 222, 235), + (177, 226, 235), (177, 230, 244), (177, 226, 244), (177, 226, 244), + (177, 226, 244), (173, 226, 244), (169, 226, 244), (161, 230, 254), + (157, 230, 254), (165, 234, 244), (173, 234, 244), (177, 238, 234), + (185, 238, 235), (193, 238, 235), (197, 238, 235), (197, 238, 235), + (201, 238, 235), (201, 242, 244), (197, 242, 244), (197, 238, 244), + (197, 234, 244), (197, 234, 244), (197, 234, 244), (193, 230, 235), + (193, 230, 235), (197, 234, 225), (197, 230, 226), (194, 226, 207), + (206, 155, 132), (178, 127, 113), (166, 132, 85), (145, 128, 85), + (154, 128, 85), (162, 114, 85), (162, 118, 75), (182, 114, 75), + (186, 127, 103), (210, 164, 132), (198, 226, 198), (201, 234, 225), + (206, 238, 216), (222, 171, 131), (206, 155, 122), (190, 144, 122), + (202, 151, 122), (219, 163, 132), (230, 183, 150), (250, 233, 206), + (222, 234, 235), (209, 238, 235), (193, 226, 235), (189, 222, 235), + (181, 222, 235), (173, 226, 244), (169, 226, 244), (169, 226, 244), + (173, 230, 244), (173, 234, 235), (173, 234, 234), (173, 230, 235), + (173, 226, 235), (173, 226, 234), (177, 230, 226), (181, 230, 226), + (189, 230, 235), (193, 230, 244), (197, 234, 244), (201, 234, 244), + (201, 238, 244), (201, 238, 244), (201, 238, 244), (201, 238, 244), + (201, 238, 244), (201, 242, 244), (201, 242, 244), (201, 242, 244), + (201, 242, 244), (201, 242, 244), (197, 238, 244), (193, 238, 254), + (177, 238, 254), (173, 230, 244), (177, 230, 244), (177, 234, 244), + (181, 238, 244), (189, 238, 244), (193, 242, 244), (201, 246, 244), + (205, 246, 244), (205, 246, 244), (205, 246, 244), (205, 242, 244), + (205, 238, 244), (205, 238, 254), (201, 238, 254), (197, 238, 254), + (193, 238, 244), (193, 238, 244), (193, 234, 244), (193, 234, 235), + (193, 234, 235), (193, 234, 235), (189, 234, 244), (185, 234, 244), + (181, 234, 244), (181, 230, 244), (181, 230, 244), (181, 234, 244), + (189, 234, 244), (193, 234, 244), (197, 234, 235), (197, 234, 235), + (201, 234, 235), (201, 234, 244), (205, 234, 244), (205, 238, 244), + (205, 238, 244), (205, 238, 244), (205, 242, 244), (201, 242, 235), + (201, 242, 235), (197, 242, 235), (193, 234, 244), (185, 230, 244), + (181, 226, 244), (181, 226, 244), (181, 230, 244), (181, 230, 244), + (185, 234, 235), (189, 238, 235), (189, 242, 235), (193, 238, 235), + (197, 238, 235), (197, 238, 235), (197, 238, 225), (193, 234, 225), + (189, 222, 216), (170, 148, 113), (117, 104, 66), (72, 55, 37), + (11, 12, 9), (36, 44, 37), (76, 117, 103), (158, 145, 113), + (177, 206, 197), (189, 226, 216), (189, 234, 226), (193, 238, 235), + (189, 238, 244), (189, 238, 244), (189, 238, 244), (185, 234, 244), + (185, 234, 244), (185, 230, 244), (189, 230, 235), (189, 230, 235), + (189, 234, 244), (193, 238, 244), (197, 242, 254), (201, 246, 254), + (201, 242, 254), (197, 238, 254), (193, 238, 244), (189, 238, 235), + (185, 234, 235), (177, 230, 234), (181, 230, 235), (181, 230, 235), + (185, 226, 235), (181, 230, 235), (189, 230, 235), (193, 234, 235), + (193, 234, 244), (189, 234, 244), (185, 230, 244), (181, 230, 244), + (177, 230, 244), (177, 230, 235), (169, 226, 235), (169, 226, 235), + (161, 222, 225), (137, 190, 197), (158, 145, 122), (149, 124, 103), + (133, 121, 103), (141, 106, 75), (141, 95, 66), (133, 99, 66), + (121, 108, 66), (121, 100, 56), (117, 104, 65), (93, 89, 56) + ), + +// 1 sky-flesh +((166, 148, 122), (219, 162, 132), (238, 212, 178), (250, 237, 206), + (238, 250, 235), (226, 242, 235), (218, 242, 225), (206, 242, 225), + (206, 238, 225), (206, 234, 207), (182, 169, 141), (178, 138, 103), + (178, 130, 103), (170, 147, 113), (177, 198, 179), (181, 230, 225), + (185, 230, 235), (189, 230, 244), (197, 230, 244), (201, 234, 244), + (205, 234, 244), (205, 238, 244), (201, 234, 235), (197, 234, 225), + (193, 222, 207), (170, 148, 122), (145, 127, 94), (117, 100, 66), + (60, 64, 47), (20, 36, 28), (8, 20, 9), (20, 28, 18), + (56, 60, 37), (113, 91, 56), (145, 106, 75), (166, 121, 85), + (190, 137, 103), (230, 190, 169), (218, 230, 226), (214, 238, 235), + (209, 238, 244), (205, 238, 244), (205, 238, 244), (201, 238, 244), + (197, 234, 244), (197, 234, 244), (197, 230, 244), (197, 230, 244), + (197, 230, 244), (193, 234, 244), (185, 230, 244), (177, 226, 235), + (157, 206, 206), (120, 153, 141), (96, 133, 132), (108, 141, 141), + (141, 177, 178), (173, 226, 225), (177, 230, 235), (185, 234, 235), + (185, 242, 244), (197, 242, 244), (197, 238, 244), (197, 238, 244), + (197, 238, 244), (193, 234, 244), (189, 230, 235), (185, 214, 197), + (154, 144, 122), (150, 127, 94), (146, 128, 85), (133, 115, 75), + (133, 120, 75), (125, 107, 75), (125, 112, 85), (133, 111, 75), + (141, 101, 66), (129, 106, 75), (137, 106, 66), (133, 102, 66), + (141, 91, 66), (141, 93, 56), (137, 93, 47), (117, 87, 37), + (109, 74, 37), (56, 44, 28), (12, 20, 9), (4, 16, 0), + (12, 28, 9), (52, 47, 28), (80, 76, 47), (113, 91, 56), + (121, 94, 56), (125, 98, 56), (113, 87, 37), (85, 63, 28), + (40, 44, 28), (12, 12, 9), (0, 12, 0), (4, 24, 9), + (28, 60, 37), (56, 88, 75), (121, 104, 84), (145, 132, 103), + (170, 160, 132), (193, 226, 207), (197, 238, 225), (205, 242, 235), + (205, 242, 244), (205, 238, 244), (201, 238, 244), (201, 238, 244), + (201, 238, 244), (197, 238, 244), (193, 234, 244), (189, 230, 235), + (189, 226, 225), (186, 189, 151), (186, 150, 103), (166, 135, 94), + (166, 134, 94), (162, 130, 94), (162, 130, 94), (166, 130, 85), + (162, 130, 85), (158, 126, 75), (150, 118, 75), (158, 113, 75), + (150, 117, 66), (154, 117, 66), (149, 114, 75), (158, 131, 85), + (166, 139, 85), (174, 142, 85), (182, 155, 113), (198, 194, 169), + (205, 230, 216), (205, 234, 235), (197, 222, 244), (193, 226, 244), + (185, 230, 244), (181, 226, 244), (177, 226, 226), (145, 165, 160), + (158, 144, 103), (158, 144, 94), (166, 143, 94), (186, 160, 122), + (197, 222, 207), (202, 226, 226), (201, 234, 235), (197, 234, 235), + (193, 238, 244), (189, 234, 244), (173, 226, 244), (173, 222, 235), + (137, 157, 160), (137, 120, 113), (129, 124, 103), (141, 132, 94), + (158, 126, 94), (170, 143, 113), (178, 185, 160), (185, 230, 225), + (189, 230, 235), (193, 234, 235), (193, 234, 235), (193, 234, 225), + (182, 194, 170), (162, 144, 113), (146, 119, 85), (113, 92, 66), + (68, 64, 37), (24, 32, 9), (0, 16, 9), (0, 12, 9), + (12, 16, 18), (56, 47, 28), (113, 83, 46), (133, 90, 56), + (150, 108, 56), (154, 109, 66), (158, 104, 66), (153, 100, 56), + (165, 95, 47), (158, 103, 47), (158, 108, 56), (158, 104, 66), + (157, 110, 75), (158, 104, 75), (162, 113, 75), (162, 108, 75), + (158, 113, 66), (170, 112, 66), (174, 116, 75), (182, 124, 75), + (174, 120, 75), (182, 124, 85), (190, 142, 103), (214, 192, 169), + (210, 230, 225), (214, 234, 235), (214, 234, 235), (210, 234, 235), + (209, 234, 235), (205, 234, 235), (205, 238, 235), (202, 238, 235), + (197, 238, 235), (197, 238, 235), (197, 238, 235), (197, 238, 235), + (201, 238, 235), (202, 238, 235), (205, 238, 235), (205, 238, 235), + (210, 242, 235), (214, 242, 235), (214, 238, 225), (210, 234, 226), + (198, 210, 188), (178, 151, 122), (158, 115, 103), (125, 107, 85), + (92, 97, 94), (48, 76, 66), (12, 24, 28), (8, 12, 18), + (4, 8, 9), (16, 28, 18), (56, 56, 37), (100, 75, 56), + (133, 98, 66), (146, 110, 85), (154, 123, 94), (158, 140, 103), + (178, 177, 141), (185, 230, 216), (193, 234, 235), (197, 234, 235), + (206, 234, 225), (206, 234, 207), (214, 162, 132), (190, 137, 94), + (178, 125, 94), (170, 123, 94), (170, 125, 94), (166, 135, 113), + (178, 168, 141), (185, 226, 207), (181, 230, 235), (185, 230, 244), + (185, 230, 244), (181, 226, 235), (190, 210, 198), (170, 152, 113) + ), + +// 2 blue-bather +((125, 100, 84), (162, 99, 75), (174, 99, 75), (182, 115, 104), + (190, 124, 122), (190, 137, 141), (194, 153, 151), (206, 161, 160), + (218, 173, 169), (230, 169, 188), (238, 172, 197), (234, 180, 197), + (234, 176, 188), (222, 180, 188), (222, 173, 179), (226, 161, 169), + (226, 149, 169), (214, 141, 151), (210, 141, 151), (198, 145, 141), + (194, 137, 132), (190, 132, 122), (178, 124, 104), (150, 104, 85), + (113, 92, 75), (56, 64, 75), (52, 68, 103), (48, 60, 122), + (40, 60, 132), (39, 56, 132), (40, 56, 122), (36, 52, 122), + (36, 52, 103), (40, 36, 56), (31, 24, 47), (12, 24, 37), + (4, 20, 28), (0, 16, 28), (4, 16, 28), (12, 24, 28), + (40, 31, 37), (52, 40, 56), (44, 48, 66), (52, 56, 113), + (48, 68, 141), (56, 81, 160), (64, 85, 170), (68, 97, 179), + (72, 97, 188), (72, 97, 188), (72, 101, 188), (72, 105, 179), + (76, 101, 179), (80, 101, 179), (173, 124, 123), (186, 136, 132), + (186, 141, 132), (190, 141, 141), (190, 141, 132), (190, 145, 132), + (194, 141, 132), (190, 137, 132), (186, 137, 132), (177, 128, 132), + (76, 105, 179), (80, 105, 188), (84, 109, 188), (186, 153, 151), + (190, 157, 151), (198, 161, 151), (202, 165, 160), (202, 161, 170), + (202, 165, 170), (202, 169, 170), (202, 169, 170), (206, 173, 170), + (206, 173, 170), (210, 173, 170), (210, 169, 170), (202, 165, 160), + (202, 165, 160), (202, 161, 151), (198, 153, 151), (198, 145, 141), + (194, 145, 141), (194, 145, 141), (198, 145, 132), (198, 136, 122), + (182, 120, 113), (170, 103, 94), (158, 88, 75), (84, 60, 56), + (48, 52, 56), (40, 40, 47), (36, 48, 47), (40, 48, 56), + (40, 52, 66), (40, 52, 113), (48, 56, 132), (52, 68, 151), + (60, 81, 170), (72, 93, 179), (72, 97, 179), (72, 97, 179), + (72, 97, 179), (73, 93, 170), (169, 111, 122), (186, 128, 132), + (186, 132, 132), (190, 128, 141), (194, 116, 132), (182, 115, 113), + (190, 111, 104), (178, 99, 85), (170, 84, 75), (117, 84, 84), + (68, 60, 85), (52, 68, 113), (48, 64, 132), (56, 73, 141), + (109, 88, 122), (158, 116, 104), (169, 124, 113), (161, 128, 113), + (73, 101, 170), (72, 101, 179), (72, 101, 179), (73, 97, 170), + (165, 120, 113), (170, 120, 113), (178, 124, 113), (182, 120, 113), + (178, 119, 103), (154, 107, 85), (121, 96, 94), (52, 64, 132), + (44, 64, 132), (48, 68, 141), (52, 73, 151), (56, 85, 160), + (64, 89, 170), (64, 93, 170), (64, 93, 170), (68, 93, 170), + (68, 97, 170), (84, 97, 151), (145, 104, 94), (174, 80, 75), + (162, 72, 66), (84, 60, 65), (64, 52, 66), (52, 48, 66), + (77, 73, 75), (141, 100, 84), (170, 116, 104), (182, 120, 113), + (182, 120, 113), (178, 124, 113), (174, 124, 122), (141, 104, 132), + (64, 77, 151), (52, 68, 151), (48, 64, 141), (44, 56, 141), + (52, 68, 151), (56, 81, 170), (68, 89, 179), (64, 97, 188), + (72, 97, 188), (76, 101, 188), (76, 105, 188), (80, 109, 188), + (182, 137, 151), (194, 149, 151), (198, 153, 160), (198, 153, 160), + (194, 153, 151), (186, 149, 141), (186, 141, 132), (169, 128, 122), + (76, 101, 179), (72, 101, 179), (68, 101, 179), (60, 93, 170), + (52, 81, 160), (48, 73, 151), (52, 73, 151), (60, 77, 151), + (129, 100, 113), (169, 120, 113), (182, 132, 122), (186, 132, 122), + (186, 132, 122), (170, 124, 123), (76, 97, 170), (68, 93, 170), + (68, 93, 170), (68, 85, 170), (64, 85, 170), (64, 81, 160), + (68, 85, 122), (129, 92, 84), (170, 95, 75), (178, 91, 75), + (186, 111, 94), (194, 119, 94), (186, 119, 104), (186, 132, 113), + (186, 136, 113), (182, 140, 113), (174, 128, 113), (166, 120, 113), + (80, 84, 151), (56, 73, 151), (52, 68, 151), (48, 68, 151), + (48, 68, 151), (44, 64, 151), (44, 64, 141), (44, 68, 141), + (48, 73, 141), (48, 73, 141), (44, 73, 151), (56, 85, 170), + (68, 97, 179), (72, 97, 188), (72, 101, 188), (72, 105, 198), + (76, 101, 188), (80, 109, 188), (186, 141, 141), (186, 141, 141), + (194, 149, 151), (202, 157, 151), (206, 157, 151), (202, 161, 151), + (198, 153, 141), (194, 149, 132), (190, 148, 122), (186, 136, 113), + (182, 123, 104), (182, 115, 104), (166, 103, 75), (113, 92, 65), + (56, 60, 56), (36, 52, 47), (36, 52, 47), (32, 44, 37), + (56, 39, 28), (146, 68, 66), (174, 80, 66), (182, 87, 66), + (194, 107, 104), (194, 111, 113), (194, 115, 113), (190, 116, 103) + ), + +// 3 no-name +((16, 9, 9), (57, 50, 24), (85, 76, 49), (100, 96, 80), + (121, 117, 88), (138, 105, 74), (141, 92, 73), (144, 76, 66), + (139, 70, 53), (127, 60, 43), (99, 44, 25), (75, 35, 29), + (61, 27, 18), (41, 12, 9), (19, 8, 8), (13, 8, 8), + (14, 8, 8), (31, 12, 10), (45, 34, 14), (71, 49, 21), + (89, 72, 38), (103, 70, 29), (107, 74, 31), (107, 76, 31), + (95, 75, 35), (82, 65, 33), (68, 40, 18), (52, 24, 12), + (41, 11, 7), (16, 7, 7), (11, 6, 6), (8, 6, 6), + (7, 6, 6), (8, 6, 6), (8, 6, 6), (9, 7, 7), + (11, 8, 8), (13, 8, 12), (15, 9, 13), (19, 18, 20), + (41, 32, 16), (59, 53, 27), (87, 74, 37), (115, 89, 34), + (129, 97, 34), (137, 107, 44), (136, 103, 35), (136, 108, 36), + (141, 109, 38), (137, 109, 44), (139, 113, 45), (140, 111, 47), + (140, 108, 50), (155, 102, 67), (148, 101, 76), (151, 100, 78), + (153, 105, 84), (155, 104, 89), (162, 113, 99), (170, 123, 116), + (172, 140, 123), (168, 144, 123), (168, 140, 121), (169, 140, 125), + (164, 141, 121), (165, 135, 116), (156, 123, 99), (153, 117, 94), + (141, 104, 88), (132, 93, 72), (99, 89, 54), (90, 75, 43), + (46, 45, 33), (17, 26, 41), (16, 20, 38), (18, 25, 32), + (47, 42, 23), (65, 58, 32), (92, 75, 43), (116, 93, 36), + (122, 96, 37), (135, 97, 41), (138, 87, 56), (147, 91, 69), + (141, 91, 68), (140, 85, 58), (140, 88, 69), (143, 84, 66), + (135, 76, 53), (134, 76, 53), (130, 71, 46), (127, 70, 44), + (126, 66, 43), (128, 71, 43), (127, 87, 31), (126, 89, 30), + (131, 93, 34), (129, 97, 33), (128, 91, 34), (122, 87, 34), + (112, 76, 30), (96, 67, 28), (79, 48, 24), (56, 39, 21), + (36, 32, 19), (19, 17, 22), (15, 8, 14), (12, 8, 12), + (10, 8, 8), (10, 7, 7), (9, 7, 8), (8, 8, 8), + (9, 8, 8), (10, 8, 8), (11, 8, 8), (13, 8, 8), + (16, 9, 8), (36, 11, 8), (49, 18, 14), (69, 39, 21), + (96, 59, 24), (122, 75, 23), (139, 97, 32), (148, 109, 39), + (148, 119, 52), (148, 120, 58), (148, 118, 60), (148, 106, 81), + (150, 108, 81), (156, 110, 86), (162, 117, 98), (165, 127, 114), + (162, 144, 123), (145, 144, 133), (140, 140, 125), (139, 142, 126), + (141, 161, 177), (169, 153, 146), (166, 152, 140), (167, 148, 135), + (171, 143, 125), (167, 138, 120), (167, 128, 110), (163, 118, 96), + (154, 109, 85), (146, 100, 76), (136, 80, 58), (117, 58, 52), + (84, 46, 39), (62, 27, 19), (47, 15, 8), (25, 8, 8), + (14, 8, 8), (14, 8, 8), (32, 11, 7), (48, 17, 11), + (70, 35, 17), (88, 44, 27), (118, 51, 33), (119, 65, 38), + (119, 65, 38), (122, 66, 43), (116, 69, 36), (101, 76, 38), + (90, 73, 39), (68, 53, 25), (43, 33, 21), (17, 20, 31), + (15, 17, 34), (16, 16, 29), (14, 10, 21), (15, 8, 17), + (38, 26, 16), (67, 35, 14), (91, 51, 19), (106, 58, 20), + (121, 72, 23), (124, 83, 26), (118, 86, 39), (105, 91, 37), + (90, 73, 40), (63, 56, 33), (26, 30, 32), (16, 17, 32), + (14, 15, 27), (12, 8, 17), (14, 8, 14), (17, 8, 8), + (40, 11, 7), (53, 24, 15), (75, 31, 18), (103, 48, 18), + (122, 55, 33), (120, 71, 30), (130, 88, 30), (141, 101, 40), + (139, 100, 51), (139, 103, 70), (120, 121, 97), (118, 113, 124), + (137, 138, 123), (137, 140, 123), (130, 131, 117), (123, 123, 98), + (128, 125, 108), (125, 125, 93), (151, 109, 83), (169, 127, 69), + (166, 129, 66), (167, 131, 62), (167, 130, 62), (160, 123, 54), + (155, 129, 57), (152, 124, 55), (153, 124, 53), (154, 120, 46), + (154, 119, 48), (146, 116, 53), (135, 108, 46), (128, 107, 56), + (104, 95, 65), (92, 85, 52), (93, 80, 46), (81, 68, 35), + (59, 51, 27), (41, 32, 16), (20, 11, 9), (13, 8, 8), + (12, 8, 8), (12, 8, 8), (13, 8, 8), (13, 7, 7), + (16, 8, 8), (36, 9, 7), (49, 15, 7), (50, 15, 10), + (54, 21, 14), (63, 27, 16), (67, 28, 16), (70, 27, 20), + (74, 26, 16), (80, 31, 17), (86, 30, 16), (84, 37, 20), + (98, 55, 20), (101, 65, 25), (111, 70, 23), (121, 83, 29), + (122, 96, 37), (130, 105, 44), (126, 103, 44), (108, 94, 64), + (109, 98, 68), (106, 98, 69), (106, 102, 74), (116, 105, 71) + ), + +// 4 pillows +((75, 58, 47), (58, 43, 43), (43, 34, 28), (28, 28, 22), + (17, 17, 17), (17, 17, 17), (17, 17, 17), (11, 17, 11), + (11, 11, 11), (11, 11, 11), (11, 11, 11), (11, 11, 11), + (11, 11, 11), (11, 17, 11), (17, 17, 17), (28, 17, 17), + (43, 22, 17), (60, 28, 22), (77, 45, 28), (94, 54, 32), + (119, 68, 34), (141, 90, 45), (173, 101, 50), (191, 106, 50), + (203, 117, 67), (186, 117, 78), (175, 112, 67), (141, 96, 62), + (128, 79, 62), (113, 73, 51), (114, 66, 43), (122, 77, 43), + (151, 73, 22), (160, 73, 28), (138, 73, 22), (117, 65, 26), + (103, 60, 37), (83, 49, 26), (77, 49, 20), (60, 28, 17), + (45, 17, 11), (26, 17, 11), (17, 17, 17), (17, 17, 17), + (17, 17, 17), (28, 22, 17), (39, 22, 22), (54, 34, 28), + (60, 34, 22), (81, 34, 22), (81, 34, 17), (87, 39, 17), + (104, 45, 11), (131, 50, 0), (156, 61, 0), (153, 67, 5), + (136, 67, 5), (125, 50, 11), (107, 51, 17), (107, 51, 17), + (104, 50, 17), (102, 51, 17), (90, 62, 34), (83, 54, 32), + (92, 64, 30), (96, 68, 39), (96, 62, 45), (104, 73, 56), + (119, 79, 56), (126, 81, 58), (136, 96, 62), (136, 96, 62), + (136, 90, 56), (117, 83, 54), (102, 73, 51), (100, 60, 49), + (96, 60, 43), (96, 62, 39), (90, 62, 39), (90, 62, 39), + (86, 64, 41), (86, 64, 47), (81, 58, 52), (71, 54, 49), + (73, 62, 56), (92, 75, 69), (119, 79, 90), (130, 102, 102), + (145, 162, 173), (175, 192, 197), (210, 216, 227), (243, 243, 243), + (252, 246, 252), (246, 246, 241), (250, 250, 239), (246, 246, 241), + (242, 197, 157), (201, 121, 88), (169, 112, 96), (141, 102, 90), + (134, 84, 79), (107, 68, 68), (85, 51, 62), (69, 49, 49), + (54, 39, 39), (45, 34, 28), (34, 28, 22), (34, 22, 17), + (54, 22, 17), (58, 20, 32), (62, 35, 35), (73, 51, 39), + (79, 56, 39), (81, 58, 47), (92, 64, 47), (96, 68, 51), + (92, 75, 58), (107, 85, 62), (111, 83, 60), (113, 85, 62), + (122, 66, 77), (134, 83, 83), (121, 76, 93), (119, 73, 84), + (103, 70, 65), (104, 73, 56), (100, 66, 49), (86, 64, 47), + (73, 62, 45), (73, 51, 39), (56, 39, 28), (28, 28, 28), + (17, 22, 17), (17, 17, 17), (17, 17, 17), (22, 28, 22), + (28, 39, 45), (28, 53, 78), (64, 58, 52), (75, 51, 51), + (100, 60, 54), (119, 68, 79), (121, 76, 76), (145, 62, 79), + (130, 85, 73), (147, 84, 34), (179, 56, 56), (158, 73, 22), + (171, 73, 11), (201, 5, 11), (182, 49, 0), (153, 61, 11), + (153, 78, 11), (167, 78, 5), (150, 56, 11), (134, 50, 5), + (124, 22, 11), (109, 17, 17), (96, 34, 22), (83, 45, 22), + (83, 39, 17), (73, 34, 22), (62, 28, 22), (54, 28, 17), + (41, 35, 18), (28, 22, 17), (22, 17, 17), (17, 17, 17), + (11, 17, 11), (11, 17, 11), (11, 17, 11), (17, 17, 17), + (17, 17, 17), (17, 17, 17), (17, 17, 17), (17, 17, 17), + (11, 11, 11), (11, 11, 11), (5, 5, 5), (5, 5, 5), + (0, 5, 0), (0, 11, 0), (0, 11, 0), (0, 11, 0), + (0, 11, 0), (5, 11, 5), (5, 11, 5), (11, 17, 5), + (17, 11, 11), (26, 11, 11), (34, 17, 11), (52, 17, 11), + (56, 28, 22), (60, 34, 34), (62, 37, 37), (75, 49, 43), + (66, 54, 49), (66, 54, 49), (60, 54, 49), (62, 51, 45), + (66, 45, 39), (69, 43, 43), (58, 32, 47), (45, 34, 39), + (34, 28, 28), (34, 34, 22), (45, 39, 28), (52, 47, 35), + (71, 54, 43), (79, 51, 56), (96, 68, 79), (119, 79, 90), + (149, 115, 109), (164, 169, 175), (185, 191, 196), (222, 228, 233), + (241, 241, 241), (254, 214, 186), (240, 206, 139), (203, 128, 78), + (186, 112, 78), (173, 90, 67), (141, 84, 51), (124, 79, 56), + (113, 79, 62), (86, 81, 75), (86, 86, 118), (134, 134, 156), + (167, 139, 162), (197, 140, 135), (173, 127, 116), (155, 133, 104), + (141, 102, 79), (156, 90, 67), (169, 106, 50), (164, 101, 28), + (151, 73, 16), (116, 45, 17), (88, 34, 17), (77, 28, 11), + (66, 17, 17), (36, 5, 5), (22, 11, 0), (17, 20, 0), + (17, 11, 5), (17, 11, 0), (11, 11, 11), (11, 11, 11), + (11, 11, 11), (11, 11, 11), (5, 11, 5), (5, 17, 5), + (5, 17, 5), (5, 11, 5), (11, 11, 11), (17, 11, 11) + ), + +// 5 mauve-splat +((22, 22, 22), (22, 22, 22), (22, 17, 20), (22, 11, 15), + (17, 5, 11), (11, 5, 11), (11, 5, 11), (11, 5, 11), + (11, 5, 11), (11, 5, 11), (11, 5, 11), (11, 5, 15), + (11, 11, 15), (11, 11, 15), (11, 11, 17), (17, 11, 17), + (17, 17, 17), (17, 17, 17), (17, 17, 17), (17, 11, 11), + (17, 11, 11), (17, 11, 11), (17, 5, 11), (11, 5, 9), + (5, 5, 5), (5, 5, 5), (5, 5, 5), (5, 5, 9), + (5, 5, 11), (5, 5, 15), (11, 5, 17), (17, 5, 17), + (17, 5, 15), (17, 5, 15), (11, 5, 11), (11, 5, 11), + (11, 5, 11), (11, 5, 11), (11, 5, 15), (11, 11, 17), + (11, 11, 17), (17, 11, 17), (17, 11, 20), (17, 5, 22), + (17, 11, 20), (22, 11, 20), (22, 17, 22), (22, 22, 22), + (22, 28, 17), (22, 28, 22), (22, 22, 22), (22, 22, 22), + (22, 22, 22), (22, 22, 22), (22, 22, 22), (22, 17, 22), + (22, 17, 20), (22, 17, 17), (22, 17, 17), (28, 17, 17), + (28, 17, 17), (22, 17, 17), (22, 11, 17), (22, 11, 17), + (17, 17, 17), (17, 17, 22), (17, 11, 22), (11, 11, 17), + (11, 11, 17), (11, 11, 17), (5, 11, 15), (5, 5, 11), + (5, 0, 11), (5, 0, 9), (5, 5, 5), (11, 5, 5), + (17, 5, 5), (22, 11, 11), (22, 17, 17), (28, 22, 22), + (28, 22, 22), (28, 22, 22), (28, 22, 34), (28, 22, 37), + (22, 17, 32), (17, 11, 30), (11, 11, 24), (11, 11, 20), + (11, 11, 20), (11, 5, 26), (11, 5, 20), (11, 5, 20), + (11, 5, 20), (11, 5, 17), (11, 5, 17), (17, 5, 17), + (17, 5, 17), (17, 5, 20), (17, 5, 20), (17, 5, 20), + (22, 11, 26), (17, 11, 32), (26, 20, 39), (28, 28, 43), + (77, 66, 72), (96, 122, 101), (174, 172, 129), (84, 139, 146), + (240, 195, 184), (191, 112, 78), (159, 90, 73), (210, 73, 44), + (120, 94, 66), (107, 90, 90), (84, 88, 90), (118, 90, 67), + (85, 96, 107), (66, 100, 117), (75, 75, 64), (54, 80, 74), + (54, 66, 54), (39, 45, 17), (28, 28, 28), (32, 32, 32), + (45, 39, 34), (83, 37, 37), (131, 28, 11), (213, 22, 0), + (218, 16, 5), (148, 27, 0), (75, 16, 22), (43, 22, 17), + (28, 22, 11), (22, 22, 5), (32, 17, 0), (28, 37, 0), + (17, 17, 5), (17, 22, 11), (17, 17, 11), (17, 11, 11), + (17, 11, 11), (17, 11, 11), (11, 11, 11), (11, 5, 11), + (11, 5, 11), (11, 5, 11), (17, 5, 11), (17, 5, 11), + (17, 5, 11), (11, 0, 11), (11, 0, 11), (11, 0, 11), + (11, 0, 11), (11, 5, 11), (11, 5, 11), (11, 5, 11), + (11, 5, 11), (11, 5, 11), (11, 11, 11), (11, 11, 15), + (11, 5, 17), (11, 5, 17), (17, 5, 17), (17, 5, 17), + (17, 11, 17), (17, 11, 17), (17, 11, 17), (17, 11, 17), + (17, 11, 15), (17, 11, 11), (17, 11, 5), (11, 11, 0), + (17, 5, 0), (17, 5, 5), (17, 5, 5), (17, 5, 11), + (17, 5, 11), (17, 5, 11), (17, 5, 11), (17, 0, 11), + (17, 0, 11), (17, 0, 5), (11, 5, 5), (11, 5, 5), + (5, 5, 5), (0, 0, 5), (5, 5, 5), (11, 5, 5), + (11, 5, 5), (11, 11, 11), (11, 11, 11), (11, 11, 11), + (11, 5, 11), (11, 5, 11), (11, 5, 11), (11, 5, 11), + (11, 5, 11), (5, 5, 15), (5, 0, 15), (5, 0, 17), + (11, 0, 17), (11, 0, 15), (11, 0, 11), (11, 0, 11), + (11, 0, 11), (11, 0, 9), (11, 0, 5), (11, 0, 0), + (11, 0, 0), (11, 0, 5), (11, 0, 5), (11, 0, 5), + (11, 5, 5), (17, 5, 5), (17, 5, 5), (17, 11, 11), + (17, 11, 11), (17, 11, 11), (17, 11, 11), (20, 11, 11), + (22, 17, 11), (22, 17, 17), (22, 17, 17), (22, 17, 17), + (17, 11, 17), (17, 11, 17), (17, 11, 17), (17, 11, 17), + (17, 11, 17), (17, 11, 17), (17, 11, 17), (17, 11, 17), + (17, 11, 17), (17, 11, 17), (17, 11, 17), (17, 11, 20), + (17, 11, 22), (17, 17, 26), (17, 22, 30), (22, 22, 32), + (28, 17, 28), (28, 17, 22), (34, 17, 26), (37, 26, 20), + (45, 28, 22), (54, 49, 26), (100, 51, 51), (77, 56, 50), + (77, 58, 58), (50, 78, 90), (49, 54, 60), (71, 50, 56), + (62, 58, 52), (60, 66, 22), (79, 68, 45), (45, 34, 37) + ), + +// 6 facial-treescape 6 +((39, 34, 26), (52, 37, 56), (37, 60, 58), (52, 73, 52), + (73, 85, 51), (110, 87, 59), (164, 147, 127), (133, 105, 88), + (166, 134, 117), (122, 133, 142), (137, 125, 91), (150, 129, 56), + (152, 101, 0), (135, 73, 39), (62, 71, 17), (39, 86, 17), + (34, 62, 22), (37, 77, 43), (39, 62, 34), (39, 79, 28), + (45, 92, 51), (54, 79, 49), (52, 64, 58), (49, 69, 49), + (39, 64, 45), (47, 62, 30), (39, 62, 17), (39, 49, 11), + (45, 45, 17), (39, 49, 22), (34, 54, 28), (32, 55, 35), + (39, 56, 39), (45, 51, 34), (45, 60, 34), (34, 49, 22), + (28, 39, 17), (20, 35, 15), (22, 34, 11), (17, 39, 11), + (22, 28, 11), (17, 34, 11), (17, 39, 17), (11, 28, 11), + (11, 28, 5), (11, 28, 11), (17, 28, 11), (22, 22, 11), + (22, 17, 5), (22, 11, 0), (22, 11, 0), (22, 17, 0), + (22, 17, 0), (35, 20, 9), (60, 22, 17), (82, 39, 16), + (81, 49, 20), (132, 80, 41), (135, 123, 90), (178, 166, 112), + (197, 203, 169), (205, 233, 222), (178, 218, 212), (107, 158, 175), + (50, 96, 132), (49, 86, 103), (37, 55, 55), (34, 45, 39), + (34, 39, 34), (28, 28, 34), (34, 22, 22), (28, 17, 17), + (22, 22, 17), (22, 22, 17), (22, 17, 17), (17, 17, 11), + (15, 20, 9), (17, 22, 5), (22, 26, 0), (22, 28, 0), + (34, 32, 0), (28, 32, 5), (34, 28, 5), (34, 28, 0), + (28, 28, 0), (34, 22, 11), (34, 22, 11), (28, 17, 17), + (28, 22, 11), (28, 22, 11), (22, 22, 11), (22, 28, 11), + (22, 28, 17), (22, 28, 17), (17, 22, 22), (17, 17, 17), + (22, 17, 11), (22, 17, 11), (22, 17, 11), (22, 17, 11), + (22, 11, 11), (17, 11, 11), (17, 11, 11), (17, 11, 11), + (15, 9, 9), (22, 5, 5), (22, 11, 5), (22, 11, 5), + (22, 17, 5), (22, 22, 5), (17, 22, 5), (17, 28, 11), + (17, 28, 11), (17, 26, 11), (11, 22, 11), (11, 22, 11), + (11, 17, 5), (11, 17, 5), (5, 17, 5), (11, 17, 0), + (11, 17, 5), (17, 17, 5), (17, 17, 11), (17, 22, 17), + (22, 28, 22), (28, 28, 37), (22, 39, 64), (51, 83, 73), + (85, 117, 74), (122, 176, 142), (193, 222, 227), (220, 231, 237), + (215, 226, 232), (250, 216, 154), (244, 205, 109), (195, 114, 69), + (149, 114, 58), (93, 103, 53), (62, 71, 34), (51, 54, 22), + (39, 34, 17), (32, 26, 20), (17, 22, 11), (11, 11, 11), + (11, 5, 5), (11, 5, 5), (11, 5, 5), (11, 11, 5), + (11, 11, 0), (11, 11, 5), (17, 11, 5), (17, 11, 5), + (17, 17, 5), (17, 22, 5), (11, 22, 0), (11, 17, 0), + (11, 11, 0), (11, 11, 0), (11, 5, 0), (17, 5, 0), + (20, 5, 0), (17, 5, 0), (17, 5, 0), (17, 0, 0), + (17, 0, 0), (11, 0, 0), (11, 5, 0), (11, 5, 0), + (11, 5, 0), (0, 0, 0), (11, 5, 0), (5, 5, 0), + (5, 5, 0), (5, 11, 0), (5, 11, 5), (11, 11, 5), + (17, 17, 5), (17, 22, 0), (22, 28, 0), (22, 37, 5), + (26, 37, 9), (28, 43, 15), (26, 57, 29), (43, 68, 43), + (28, 64, 43), (28, 69, 34), (32, 80, 35), (41, 77, 47), + (56, 96, 68), (73, 110, 76), (45, 111, 79), (82, 105, 94), + (62, 114, 116), (67, 147, 147), (78, 175, 197), (180, 220, 220), + (216, 222, 222), (250, 210, 131), (180, 123, 95), (121, 87, 59), + (73, 68, 39), (58, 72, 44), (51, 66, 34), (37, 49, 32), + (34, 39, 22), (28, 34, 17), (28, 22, 11), (22, 17, 11), + (17, 11, 5), (17, 11, 5), (17, 11, 0), (11, 11, 0), + (11, 11, 0), (11, 11, 0), (17, 17, 0), (22, 22, 5), + (26, 26, 9), (28, 34, 11), (28, 34, 11), (26, 37, 15), + (28, 39, 17), (28, 34, 22), (28, 32, 22), (32, 32, 20), + (34, 34, 17), (34, 37, 17), (39, 43, 11), (37, 43, 15), + (34, 39, 17), (34, 37, 11), (28, 32, 11), (22, 28, 11), + (28, 28, 11), (26, 26, 9), (34, 34, 11), (45, 28, 11), + (49, 37, 15), (54, 39, 22), (69, 39, 28), (56, 39, 28), + (41, 35, 26), (34, 34, 28), (28, 34, 28), (26, 34, 22), + (28, 37, 22), (34, 39, 22), (34, 45, 22), (34, 39, 22), + (34, 39, 17), (34, 37, 17), (45, 39, 11), (45, 39, 20), + (45, 39, 22), (51, 39, 17), (49, 43, 20), (51, 57, 36) + ), + +// 7 fasion-bug +((24, 19, 26), (45, 31, 41), (67, 45, 51), (122, 31, 44), + (144, 31, 39), (145, 29, 37), (146, 30, 35), (150, 30, 36), + (144, 30, 36), (133, 33, 35), (69, 45, 44), (47, 34, 40), + (35, 29, 36), (31, 25, 30), (27, 23, 27), (26, 21, 26), + (27, 22, 28), (30, 24, 33), (32, 28, 34), (37, 34, 41), + (48, 43, 47), (59, 53, 56), (83, 77, 73), (95, 77, 69), + (123, 90, 77), (130, 109, 88), (124, 116, 98), (148, 142, 112), + (176, 164, 120), (201, 192, 153), (214, 208, 194), (228, 222, 206), + (230, 224, 205), (230, 225, 201), (230, 221, 202), (229, 213, 190), + (219, 190, 158), (176, 152, 111), (141, 109, 83), (152, 73, 69), + (156, 58, 53), (146, 125, 94), (182, 149, 123), (218, 205, 144), + (229, 216, 191), (230, 222, 205), (230, 224, 218), (230, 226, 219), + (228, 226, 220), (230, 227, 221), (232, 228, 217), (236, 232, 204), + (233, 231, 191), (230, 222, 199), (229, 219, 200), (217, 212, 198), + (221, 209, 181), (199, 168, 145), (156, 127, 125), (92, 74, 81), + (69, 50, 51), (55, 40, 50), (41, 34, 40), (29, 29, 34), + (23, 24, 32), (21, 24, 29), (22, 21, 28), (24, 20, 27), + (30, 21, 29), (37, 25, 29), (45, 25, 32), (56, 30, 34), + (108, 29, 38), (142, 30, 39), (149, 34, 37), (150, 32, 36), + (148, 30, 36), (146, 29, 36), (142, 29, 35), (136, 31, 36), + (72, 50, 53), (63, 47, 50), (59, 48, 48), (57, 45, 49), + (63, 48, 51), (78, 55, 58), (92, 80, 76), (126, 112, 95), + (167, 147, 117), (206, 160, 142), (204, 195, 168), (214, 206, 190), + (172, 155, 142), (146, 130, 123), (115, 95, 88), (90, 74, 81), + (61, 54, 56), (55, 40, 52), (49, 40, 43), (46, 41, 45), + (44, 42, 46), (46, 42, 46), (46, 38, 40), (42, 41, 37), + (37, 33, 33), (34, 27, 27), (31, 23, 28), (29, 21, 23), + (25, 18, 23), (24, 13, 21), (22, 14, 21), (20, 15, 21), + (19, 16, 21), (19, 17, 21), (20, 16, 23), (22, 17, 24), + (25, 19, 25), (28, 19, 27), (31, 21, 29), (44, 24, 36), + (52, 33, 41), (66, 40, 44), (122, 29, 33), (142, 28, 35), + (143, 28, 35), (140, 31, 34), (119, 34, 33), (68, 40, 40), + (43, 30, 33), (31, 19, 27), (24, 16, 20), (18, 14, 17), + (16, 12, 16), (13, 12, 16), (12, 11, 17), (13, 11, 16), + (15, 12, 16), (18, 14, 18), (22, 20, 24), (27, 25, 29), + (37, 33, 35), (52, 39, 43), (69, 45, 48), (127, 30, 36), + (142, 29, 36), (148, 30, 36), (152, 29, 38), (156, 29, 39), + (156, 28, 35), (154, 28, 36), (148, 29, 32), (145, 33, 33), + (138, 32, 34), (74, 48, 52), (59, 40, 50), (48, 34, 44), + (44, 34, 40), (38, 33, 36), (31, 31, 36), (33, 28, 34), + (41, 26, 31), (46, 27, 37), (58, 37, 41), (116, 28, 35), + (139, 27, 33), (144, 27, 35), (149, 29, 39), (153, 31, 38), + (156, 31, 39), (157, 33, 39), (154, 36, 40), (151, 34, 42), + (145, 30, 37), (136, 27, 35), (95, 24, 29), (49, 32, 25), + (32, 24, 25), (25, 20, 23), (20, 17, 24), (18, 16, 23), + (17, 15, 21), (18, 16, 22), (16, 15, 24), (20, 16, 27), + (18, 19, 35), (32, 25, 35), (42, 36, 38), (46, 42, 41), + (52, 53, 45), (67, 68, 46), (98, 75, 65), (101, 69, 63), + (146, 34, 48), (150, 33, 43), (157, 33, 41), (160, 30, 39), + (160, 32, 39), (162, 29, 37), (161, 35, 40), (171, 37, 38), + (157, 37, 40), (151, 36, 40), (144, 32, 39), (138, 32, 38), + (79, 44, 48), (61, 41, 46), (55, 36, 39), (47, 32, 42), + (35, 28, 35), (27, 24, 29), (27, 21, 27), (22, 20, 26), + (19, 20, 24), (16, 18, 24), (15, 16, 22), (15, 16, 23), + (15, 19, 22), (16, 16, 22), (17, 15, 22), (14, 16, 21), + (12, 15, 20), (15, 13, 20), (18, 14, 21), (19, 16, 21), + (22, 16, 21), (25, 20, 21), (24, 22, 25), (25, 24, 29), + (29, 25, 31), (32, 27, 32), (31, 27, 33), (31, 25, 29), + (27, 21, 26), (28, 19, 26), (26, 16, 24), (25, 17, 23), + (23, 14, 23), (19, 15, 22), (16, 14, 19), (14, 13, 18), + (13, 11, 18), (15, 12, 18), (16, 14, 17), (15, 15, 19), + (16, 16, 20), (16, 16, 21), (18, 15, 23), (20, 16, 23), + (23, 18, 26), (24, 19, 33), (29, 18, 30), (35, 24, 32), + (43, 28, 34), (55, 32, 37), (69, 42, 43), (131, 27, 32) + ), + +// 8 leafy-face +((42, 37, 33), (31, 23, 25), (23, 19, 22), (20, 20, 24), + (24, 23, 25), (31, 25, 25), (47, 37, 39), (64, 40, 39), + (81, 51, 51), (74, 59, 57), (73, 69, 63), (77, 81, 72), + (95, 98, 94), (200, 168, 134), (215, 188, 153), (223, 209, 177), + (238, 225, 207), (237, 227, 215), (238, 227, 201), (225, 195, 162), + (210, 182, 147), (191, 163, 133), (91, 98, 97), (75, 74, 79), + (70, 70, 67), (73, 69, 59), (83, 76, 55), (84, 74, 55), + (107, 79, 73), (197, 132, 96), (218, 159, 116), (222, 174, 130), + (225, 182, 134), (222, 182, 137), (220, 173, 131), (215, 164, 114), + (163, 109, 88), (103, 83, 68), (90, 83, 61), (145, 104, 88), + (208, 163, 121), (209, 174, 138), (213, 176, 151), (213, 178, 151), + (211, 183, 143), (206, 174, 133), (197, 154, 120), (89, 91, 91), + (72, 77, 78), (66, 71, 69), (64, 66, 63), (62, 56, 59), + (60, 59, 58), (58, 58, 55), (56, 54, 54), (50, 51, 48), + (60, 47, 46), (65, 50, 46), (65, 50, 46), (67, 52, 49), + (66, 59, 57), (65, 67, 59), (68, 73, 68), (78, 84, 80), + (130, 120, 108), (206, 162, 135), (217, 172, 144), (223, 184, 152), + (224, 188, 154), (226, 188, 154), (226, 187, 152), (225, 190, 148), + (226, 195, 144), (224, 195, 146), (220, 190, 147), (223, 190, 153), + (226, 193, 152), (227, 192, 152), (223, 187, 152), (223, 187, 147), + (227, 184, 143), (223, 184, 141), (221, 174, 135), (204, 162, 130), + (130, 108, 102), (82, 82, 75), (74, 77, 63), (70, 76, 63), + (68, 71, 63), (68, 71, 63), (66, 72, 63), (71, 76, 66), + (78, 89, 77), (138, 122, 109), (205, 166, 137), (210, 179, 149), + (213, 182, 152), (222, 189, 155), (226, 199, 156), (237, 210, 172), + (240, 227, 199), (238, 229, 214), (238, 231, 222), (239, 232, 227), + (235, 230, 227), (230, 228, 223), (220, 217, 207), (203, 193, 176), + (206, 166, 149), (194, 148, 118), (87, 98, 78), (72, 89, 71), + (82, 86, 69), (139, 116, 93), (208, 167, 123), (219, 170, 135), + (219, 179, 138), (218, 182, 149), (214, 176, 151), (212, 174, 147), + (198, 160, 136), (98, 97, 97), (78, 76, 82), (68, 71, 71), + (60, 66, 68), (65, 67, 69), (67, 72, 71), (82, 87, 80), + (168, 130, 113), (208, 164, 139), (209, 167, 138), (189, 141, 129), + (99, 86, 90), (80, 75, 64), (82, 71, 63), (83, 77, 68), + (98, 94, 96), (202, 155, 123), (219, 170, 130), (212, 164, 117), + (142, 106, 92), (81, 81, 74), (72, 73, 68), (71, 73, 67), + (73, 79, 69), (83, 99, 85), (164, 149, 121), (207, 166, 140), + (213, 177, 153), (224, 193, 170), (222, 210, 207), (223, 222, 215), + (232, 231, 225), (233, 227, 226), (226, 226, 223), (218, 226, 216), + (222, 222, 214), (222, 213, 199), (225, 191, 157), (213, 184, 148), + (209, 176, 138), (199, 165, 128), (96, 96, 95), (75, 77, 69), + (70, 67, 64), (68, 61, 60), (68, 62, 59), (70, 63, 58), + (74, 72, 63), (82, 88, 77), (175, 142, 113), (217, 171, 125), + (221, 170, 130), (207, 159, 122), (112, 86, 73), (83, 64, 60), + (51, 41, 43), (29, 27, 31), (21, 18, 24), (13, 11, 15), + (19, 16, 17), (22, 17, 23), (30, 24, 29), (46, 37, 41), + (44, 41, 44), (43, 46, 38), (32, 32, 27), (25, 26, 28), + (28, 22, 25), (32, 30, 32), (41, 41, 42), (43, 41, 47), + (47, 50, 49), (55, 55, 53), (58, 63, 60), (61, 68, 58), + (64, 70, 57), (67, 74, 62), (75, 76, 65), (88, 89, 83), + (176, 145, 118), (206, 166, 144), (224, 190, 168), (238, 223, 210), + (233, 230, 225), (233, 229, 224), (227, 218, 210), (220, 188, 162), + (204, 167, 151), (150, 142, 132), (85, 97, 95), (75, 78, 72), + (70, 70, 65), (67, 64, 57), (63, 61, 52), (57, 55, 49), + (62, 56, 46), (60, 59, 46), (61, 59, 52), (64, 61, 58), + (64, 68, 57), (62, 70, 54), (62, 67, 54), (63, 67, 55), + (64, 64, 55), (66, 65, 51), (67, 65, 50), (69, 65, 51), + (69, 65, 54), (76, 66, 55), (84, 65, 54), (121, 72, 64), + (197, 132, 96), (217, 166, 119), (222, 178, 124), (225, 188, 129), + (224, 188, 138), (222, 184, 139), (209, 178, 141), (206, 171, 134), + (162, 144, 108), (78, 90, 81), (67, 76, 72), (72, 72, 72), + (83, 70, 82), (114, 112, 105), (203, 167, 143), (213, 184, 157), + (219, 210, 199), (221, 220, 210), (218, 213, 200), (183, 173, 165), + (107, 106, 103), (77, 83, 78), (74, 83, 75), (82, 95, 83) + ), + +// 9 mouldy-sun +((17, 11, 11), (11, 11, 11), (11, 11, 5), (11, 17, 0), + (11, 17, 0), (17, 22, 0), (22, 28, 0), (34, 28, 11), + (51, 39, 22), (69, 64, 24), (84, 105, 50), (129, 135, 73), + (189, 166, 78), (195, 194, 78), (207, 189, 83), (208, 180, 95), + (214, 203, 90), (214, 197, 90), (207, 179, 105), (191, 173, 92), + (191, 163, 90), (180, 158, 62), (177, 149, 45), (180, 146, 39), + (174, 145, 55), (159, 130, 65), (126, 109, 60), (144, 104, 34), + (148, 104, 45), (153, 115, 48), (146, 93, 31), (154, 96, 17), + (163, 115, 25), (180, 123, 16), (183, 138, 28), (173, 129, 45), + (210, 135, 61), (225, 146, 67), (197, 174, 123), (148, 193, 193), + (191, 191, 180), (204, 192, 170), (213, 196, 139), (203, 208, 135), + (165, 185, 156), (113, 124, 90), (67, 113, 50), (77, 84, 26), + (60, 68, 20), (66, 64, 20), (83, 69, 20), (120, 82, 20), + (159, 104, 11), (172, 126, 39), (186, 134, 45), (208, 146, 39), + (242, 146, 44), (206, 148, 39), (164, 121, 45), (145, 95, 45), + (128, 84, 34), (89, 39, 22), (58, 28, 17), (43, 22, 11), + (28, 17, 11), (22, 11, 11), (22, 11, 11), (22, 11, 11), + (17, 11, 11), (11, 5, 26), (11, 11, 11), (17, 11, 17), + (17, 17, 11), (22, 22, 5), (17, 11, 0), (22, 22, 0), + (17, 22, 0), (17, 11, 0), (28, 17, 0), (37, 11, 0), + (49, 22, 5), (62, 39, 0), (71, 58, 9), (119, 73, 0), + (164, 72, 28), (186, 117, 22), (203, 157, 33), (242, 174, 50), + (248, 208, 89), (244, 239, 154), (254, 248, 169), (237, 220, 135), + (240, 206, 88), (231, 186, 72), (203, 174, 50), (178, 146, 39), + (139, 127, 16), (116, 101, 11), (94, 81, 5), (51, 58, 0), + (22, 32, 0), (17, 26, 0), (11, 17, 0), (5, 17, 0), + (5, 5, 5), (0, 0, 0), (5, 0, 0), (11, 5, 0), + (11, 5, 5), (11, 5, 5), (17, 5, 5), (17, 5, 5), + (22, 5, 5), (22, 5, 5), (17, 5, 5), (17, 5, 5), + (17, 5, 5), (11, 11, 0), (11, 11, 0), (11, 5, 5), + (11, 5, 5), (17, 5, 0), (17, 5, 0), (17, 5, 0), + (17, 5, 0), (22, 5, 5), (17, 0, 0), (17, 0, 0), + (17, 0, 0), (17, 5, 5), (17, 17, 11), (11, 17, 9), + (11, 22, 0), (11, 28, 0), (17, 39, 17), (45, 69, 0), + (62, 86, 25), (84, 98, 11), (107, 99, 17), (119, 93, 17), + (122, 99, 20), (134, 101, 28), (141, 112, 22), (150, 110, 33), + (130, 113, 39), (128, 111, 75), (133, 132, 87), (165, 142, 120), + (197, 163, 135), (220, 202, 146), (225, 225, 180), (229, 229, 190), + (250, 239, 199), (244, 233, 188), (242, 237, 163), (218, 200, 127), + (225, 202, 118), (224, 201, 105), (227, 205, 91), (225, 208, 78), + (237, 220, 44), (237, 197, 50), (248, 191, 67), (225, 174, 89), + (181, 146, 85), (144, 138, 76), (124, 124, 51), (108, 119, 43), + (96, 99, 42), (73, 73, 28), (71, 52, 20), (79, 50, 22), + (79, 39, 22), (93, 50, 56), (154, 90, 84), (158, 107, 67), + (162, 127, 66), (197, 163, 50), (210, 176, 47), (203, 168, 33), + (180, 139, 0), (152, 118, 5), (125, 80, 0), (96, 73, 11), + (69, 45, 11), (54, 28, 22), (39, 34, 22), (34, 34, 22), + (28, 28, 17), (28, 28, 11), (39, 22, 5), (34, 22, 0), + (28, 24, 0), (22, 28, 5), (28, 34, 20), (51, 52, 30), + (66, 54, 24), (94, 60, 46), (126, 86, 47), (132, 118, 82), + (158, 140, 90), (208, 168, 101), (214, 197, 140), (233, 227, 188), + (252, 240, 201), (252, 252, 212), (252, 246, 201), (250, 244, 176), + (254, 242, 152), (254, 220, 95), (248, 208, 84), (231, 174, 44), + (203, 157, 28), (194, 126, 0), (191, 123, 5), (190, 112, 5), + (175, 118, 16), (138, 116, 0), (107, 99, 0), (99, 96, 14), + (91, 89, 20), (54, 64, 9), (39, 28, 17), (28, 17, 17), + (17, 11, 11), (11, 5, 5), (11, 5, 5), (11, 5, 5), + (11, 5, 5), (11, 5, 5), (5, 5, 5), (5, 0, 0), + (5, 0, 0), (11, 0, 0), (11, 5, 0), (11, 5, 5), + (17, 5, 5), (17, 11, 17), (17, 17, 17), (28, 33, 33), + (57, 63, 46), (77, 71, 34), (91, 75, 43), (124, 88, 33), + (155, 112, 11), (186, 135, 22), (203, 146, 39), (231, 157, 39), + (225, 168, 50), (237, 203, 90), (239, 233, 148), (252, 235, 189), + (248, 242, 208), (229, 218, 224), (244, 244, 210), (237, 208, 169) + ), + +// 10 sunny-harvest +((0, 0, 0), (34, 4, 13), (71, 19, 23), (105, 20, 32), + (107, 51, 32), (102, 30, 34), (70, 23, 27), (52, 20, 20), + (18, 6, 8), (4, 0, 1), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (8, 5, 6), (16, 12, 21), (58, 29, 30), (89, 49, 39), + (116, 94, 73), (149, 126, 100), (193, 171, 144), (208, 199, 181), + (213, 202, 184), (204, 203, 195), (227, 209, 188), (228, 210, 184), + (219, 200, 171), (216, 190, 148), (212, 182, 123), (211, 171, 108), + (189, 137, 88), (173, 125, 72), (167, 123, 82), (157, 127, 103), + (184, 159, 137), (204, 180, 162), (205, 185, 156), (206, 182, 146), + (200, 168, 133), (170, 131, 87), (163, 112, 64), (145, 103, 68), + (132, 98, 68), (123, 102, 49), (93, 65, 39), (84, 57, 33), + (86, 64, 30), (118, 81, 44), (137, 96, 57), (148, 118, 62), + (159, 116, 64), (176, 136, 77), (195, 143, 90), (206, 164, 112), + (186, 160, 114), (169, 130, 85), (151, 114, 89), (121, 104, 81), + (112, 93, 68), (102, 77, 53), (86, 52, 33), (76, 49, 28), + (82, 63, 30), (92, 79, 38), (113, 102, 71), (132, 128, 98), + (154, 155, 150), (201, 187, 161), (207, 191, 163), (215, 191, 174), + (204, 181, 165), (185, 169, 137), (143, 133, 100), (99, 88, 80), + (61, 41, 39), (41, 16, 21), (17, 3, 12), (6, 0, 3), + (0, 0, 0), (0, 0, 0), (3, 1, 3), (16, 8, 9), + (54, 24, 30), (65, 63, 43), (85, 87, 72), (124, 122, 90), + (182, 154, 108), (201, 174, 136), (202, 181, 122), (207, 183, 113), + (218, 169, 91), (208, 146, 67), (213, 132, 64), (227, 133, 48), + (226, 130, 48), (223, 124, 47), (213, 122, 45), (211, 112, 41), + (215, 101, 43), (214, 103, 44), (205, 112, 45), (194, 106, 42), + (175, 100, 37), (169, 89, 35), (164, 74, 39), (166, 83, 42), + (163, 74, 36), (176, 92, 35), (187, 102, 42), (202, 116, 54), + (218, 131, 45), (229, 156, 54), (229, 164, 62), (229, 179, 77), + (224, 183, 95), (222, 193, 115), (224, 189, 123), (218, 195, 149), + (223, 200, 158), (215, 190, 172), (202, 179, 157), (154, 144, 119), + (143, 122, 97), (122, 94, 70), (119, 85, 51), (101, 45, 32), + (97, 47, 31), (83, 35, 29), (71, 29, 33), (56, 21, 24), + (16, 8, 21), (2, 0, 3), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (16, 10, 8), (23, 16, 11), + (62, 40, 29), (92, 66, 41), (138, 99, 61), (193, 146, 50), + (215, 170, 60), (222, 164, 57), (229, 168, 54), (233, 168, 56), + (236, 175, 55), (238, 180, 55), (236, 177, 57), (235, 179, 60), + (236, 183, 59), (231, 190, 63), (234, 184, 61), (236, 173, 60), + (233, 169, 59), (235, 170, 58), (235, 166, 58), (233, 160, 58), + (233, 151, 58), (233, 150, 59), (226, 137, 53), (231, 125, 50), + (219, 101, 46), (202, 98, 45), (207, 84, 39), (193, 77, 37), + (190, 74, 37), (178, 62, 39), (179, 52, 35), (183, 57, 36), + (191, 62, 40), (190, 80, 45), (187, 97, 43), (170, 114, 57), + (174, 124, 71), (181, 151, 81), (205, 170, 95), (218, 189, 119), + (215, 190, 114), (227, 191, 103), (225, 190, 96), (235, 192, 73), + (235, 186, 67), (233, 174, 68), (233, 152, 56), (216, 126, 43), + (198, 94, 40), (183, 72, 41), (151, 71, 39), (128, 43, 33), + (89, 14, 25), (25, 15, 6), (6, 0, 2), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (3, 0, 1), (18, 4, 7), (33, 13, 19), (60, 28, 33), + (74, 44, 36), (87, 53, 35), (93, 62, 37), (122, 84, 46), + (121, 88, 45), (141, 90, 51), (140, 67, 41), (122, 81, 49), + (139, 60, 40), (135, 61, 34), (150, 57, 34), (145, 38, 38), + (149, 64, 37), (123, 56, 32), (154, 40, 39), (158, 46, 36), + (175, 45, 38), (179, 56, 41), (164, 72, 39), (160, 85, 40), + (150, 81, 47), (166, 93, 48), (157, 99, 55), (135, 106, 66), + (116, 109, 74), (136, 114, 90), (141, 108, 86), (159, 115, 69), + (180, 133, 80), (211, 175, 110), (214, 190, 145), (224, 203, 178), + (232, 226, 194), (235, 218, 187), (225, 213, 184), (212, 196, 164), + (193, 177, 137), (180, 135, 90), (175, 113, 57), (198, 110, 44), + (208, 113, 41), (222, 136, 45), (233, 152, 53), (235, 157, 54), + (231, 160, 55), (231, 160, 54), (228, 151, 52), (216, 130, 45), + (197, 106, 43), (173, 84, 39), (150, 67, 37), (133, 55, 31) + ), + +// 11 peach-tree +((170, 59, 28), (170, 63, 28), (129, 68, 37), (68, 84, 37), + (77, 109, 37), (81, 121, 47), (81, 113, 47), (93, 113, 56), + (101, 133, 75), (117, 141, 85), (137, 161, 94), (141, 162, 84), + (194, 173, 65), (218, 139, 47), (222, 119, 37), (214, 103, 47), + (214, 106, 37), (194, 95, 28), (145, 76, 37), (76, 105, 37), + (52, 80, 18), (32, 68, 9), (32, 60, 18), (32, 48, 18), + (32, 56, 18), (44, 72, 18), (64, 105, 37), (97, 137, 56), + (141, 178, 94), (170, 198, 122), (238, 209, 122), (250, 225, 84), + (230, 151, 46), (230, 122, 37), (230, 122, 37), (219, 105, 37), + (202, 94, 37), (182, 76, 28), (133, 55, 18), (84, 43, 9), + (36, 27, 9), (28, 32, 0), (28, 48, 9), (32, 64, 9), + (64, 92, 28), (84, 121, 56), (105, 145, 75), (145, 174, 103), + (150, 178, 113), (149, 174, 113), (141, 170, 113), (113, 141, 85), + (81, 109, 66), (64, 68, 47), (36, 52, 28), (16, 24, 18), + (12, 12, 9), (4, 8, 0), (0, 4, 0), (0, 4, 0), + (0, 4, 0), (0, 0, 0), (4, 0, 0), (12, 0, 0), + (16, 11, 0), (36, 15, 0), (68, 23, 18), (129, 38, 18), + (170, 55, 18), (194, 95, 28), (178, 124, 47), (154, 174, 103), + (166, 194, 122), (170, 202, 122), (178, 210, 141), (190, 218, 160), + (190, 210, 151), (202, 214, 151), (226, 222, 132), (182, 218, 141), + (182, 210, 141), (186, 206, 141), (190, 206, 151), (198, 206, 169), + (210, 218, 179), (234, 230, 197), (234, 234, 197), (250, 241, 188), + (246, 229, 188), (234, 192, 141), (210, 172, 150), (190, 202, 150), + (178, 198, 151), (182, 206, 141), (182, 202, 141), (182, 198, 132), + (170, 202, 132), (166, 198, 132), (158, 186, 122), (141, 178, 113), + (113, 149, 75), (81, 117, 56), (60, 84, 37), (48, 64, 28), + (24, 56, 9), (20, 40, 9), (20, 24, 9), (12, 16, 9), + (7, 12, 9), (4, 8, 9), (8, 4, 9), (20, 7, 9), + (28, 15, 9), (36, 23, 9), (80, 39, 18), (129, 47, 18), + (178, 59, 18), (198, 87, 37), (219, 102, 37), (222, 102, 37), + (222, 117, 28), (226, 135, 28), (230, 142, 28), (242, 146, 37), + (250, 155, 28), (246, 187, 28), (234, 127, 47), (250, 188, 103), + (250, 225, 112), (250, 225, 84), (254, 211, 46), (254, 207, 46), + (254, 208, 74), (218, 181, 94), (149, 120, 103), (89, 121, 66), + (64, 93, 47), (32, 60, 18), (20, 44, 9), (4, 24, 0), + (0, 12, 0), (4, 8, 0), (0, 4, 0), (0, 4, 0), + (0, 4, 0), (4, 0, 0), (4, 0, 0), (4, 4, 0), + (4, 4, 0), (4, 8, 0), (4, 8, 0), (4, 8, 0), + (0, 4, 0), (0, 0, 0), (0, 0, 9), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (4, 0, 0), (4, 4, 0), (12, 8, 0), + (16, 16, 0), (32, 16, 0), (56, 27, 9), (89, 51, 9), + (125, 67, 9), (166, 63, 18), (178, 72, 18), (198, 90, 28), + (190, 107, 37), (157, 112, 56), (153, 99, 47), (89, 121, 56), + (85, 101, 56), (113, 72, 28), (182, 80, 37), (206, 98, 37), + (210, 102, 37), (214, 110, 28), (214, 110, 28), (218, 118, 37), + (222, 110, 28), (226, 114, 37), (222, 110, 47), (238, 111, 65), + (198, 160, 84), (169, 148, 112), (161, 186, 122), (170, 194, 132), + (190, 206, 151), (206, 214, 160), (226, 238, 188), (246, 238, 197), + (254, 250, 254), (250, 254, 206), (242, 254, 206), (230, 238, 197), + (198, 214, 160), (170, 194, 132), (145, 149, 113), (84, 109, 66), + (56, 64, 37), (28, 44, 18), (24, 36, 9), (20, 20, 9), + (32, 19, 9), (48, 15, 9), (101, 39, 18), (137, 47, 18), + (166, 51, 19), (145, 55, 18), (101, 47, 18), (68, 39, 18), + (32, 56, 9), (28, 44, 9), (20, 28, 9), (16, 20, 9), + (8, 16, 0), (8, 16, 0), (4, 12, 0), (4, 16, 0), + (8, 20, 9), (16, 32, 9), (20, 48, 18), (40, 72, 18), + (68, 109, 37), (97, 129, 56), (137, 170, 103), (149, 182, 113), + (145, 182, 113), (129, 161, 94), (105, 133, 75), (68, 89, 56), + (60, 76, 37), (48, 64, 37), (60, 68, 28), (113, 55, 18), + (166, 51, 19), (190, 76, 28), (202, 91, 28), (210, 94, 28), + (210, 98, 28), (198, 87, 18), (158, 55, 9), (105, 34, 0), + (44, 15, 0), (20, 4, 0), (12, 0, 0), (8, 4, 0), + (4, 8, 0), (8, 16, 0), (16, 32, 9), (28, 52, 9) + ), + +// 12 fire-dragon +((88, 3, 9), (64, 0, 9), (44, 3, 9), (24, 4, 9), + (15, 0, 9), (16, 4, 9), (28, 8, 9), (40, 4, 9), + (48, 3, 0), (52, 0, 0), (52, 0, 0), (48, 0, 0), + (40, 0, 0), (28, 4, 0), (16, 0, 0), (8, 0, 9), + (8, 0, 9), (15, 0, 9), (28, 0, 0), (40, 0, 0), + (44, 0, 0), (48, 0, 0), (56, 4, 0), (56, 3, 0), + (52, 0, 0), (48, 0, 0), (40, 0, 0), (28, 0, 0), + (16, 0, 0), (4, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 4, 0), + (0, 4, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (4, 0, 0), (8, 4, 0), (12, 4, 0), (24, 4, 0), + (32, 4, 0), (40, 4, 9), (48, 4, 9), (52, 3, 9), + (68, 3, 9), (81, 4, 0), (101, 3, 0), (117, 0, 0), + (137, 0, 9), (158, 0, 9), (182, 0, 9), (202, 7, 0), + (210, 10, 0), (202, 7, 0), (190, 0, 9), (174, 0, 9), + (145, 3, 9), (113, 3, 0), (89, 3, 0), (68, 3, 9), + (48, 7, 9), (36, 4, 9), (20, 0, 0), (8, 0, 0), + (4, 0, 0), (4, 0, 0), (4, 0, 0), (8, 4, 0), + (24, 4, 0), (40, 4, 0), (60, 3, 0), (84, 3, 0), + (109, 3, 0), (125, 3, 0), (145, 0, 0), (158, 0, 0), + (162, 0, 0), (162, 0, 0), (162, 0, 0), (162, 0, 0), + (162, 3, 0), (153, 7, 9), (157, 11, 0), (153, 0, 0), + (145, 3, 0), (129, 0, 0), (109, 0, 0), (89, 0, 0), + (73, 3, 0), (52, 3, 0), (36, 4, 0), (16, 0, 0), + (8, 0, 0), (4, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 9), (4, 0, 9), + (0, 0, 9), (0, 0, 9), (0, 0, 9), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 4, 0), (0, 4, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (4, 0, 0), + (16, 0, 0), (40, 4, 0), (60, 0, 0), (73, 0, 0), + (97, 0, 0), (113, 0, 0), (133, 0, 0), (157, 0, 0), + (166, 7, 0), (182, 7, 0), (174, 10, 0), (174, 15, 9), + (166, 29, 0), (157, 35, 9), (121, 30, 9), (93, 15, 9), + (93, 11, 9), (92, 11, 0), (89, 3, 9), (88, 3, 9), + (80, 3, 9), (76, 0, 0), (68, 0, 0), (64, 3, 0), + (68, 3, 0), (76, 0, 0), (89, 3, 0), (105, 0, 0), + (121, 0, 0), (145, 0, 0), (158, 0, 0), (162, 3, 0), + (153, 18, 9), (169, 7, 0), (166, 0, 0), (174, 3, 0), + (174, 0, 0), (178, 0, 0), (178, 3, 0), (182, 3, 0), + (190, 11, 9), (206, 14, 9), (234, 58, 9), (246, 131, 28), + (242, 179, 28), (250, 187, 37), (250, 233, 84), (246, 254, 102), + (250, 254, 140), (254, 249, 140), (250, 241, 102), (242, 195, 46), + (246, 159, 46), (186, 91, 37), (137, 43, 18), (101, 55, 18), + (76, 39, 18), (56, 11, 9), (44, 11, 9), (28, 4, 0), + (16, 0, 0), (4, 0, 0), (4, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (4, 0, 0), + (8, 4, 0), (16, 8, 0), (24, 4, 0), (36, 7, 0), + (40, 4, 0), (32, 0, 0), (28, 0, 0), (20, 0, 0), + (12, 0, 0), (8, 0, 0), (4, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (4, 0, 0), + (8, 0, 0), (24, 0, 0), (44, 3, 0), (60, 0, 0), + (77, 0, 0), (101, 0, 0), (133, 3, 0), (162, 30, 0), + (182, 47, 0), (194, 79, 18), (197, 107, 18), (206, 95, 18), + (198, 86, 18), (198, 47, 0), (190, 39, 9), (194, 18, 9), + (182, 7, 0), (182, 10, 0), (186, 22, 9), (190, 22, 9), + (206, 66, 9), (230, 98, 9), (246, 134, 9), (246, 155, 28), + (238, 138, 9), (238, 142, 37), (226, 126, 18), (190, 87, 9), + (141, 48, 0), (125, 43, 9), (101, 15, 9), (101, 0, 9), + (97, 3, 0), (92, 7, 0), (89, 15, 9), (77, 24, 9), + (85, 7, 0), (64, 7, 0), (60, 3, 0), (52, 7, 0), + (48, 4, 0), (44, 4, 0), (44, 3, 0), (48, 0, 0), + (44, 0, 0), (40, 7, 0), (36, 4, 0), (28, 0, 0) + ), + +// 13 ice-dragon +((96, 43, 37), (113, 80, 75), (157, 120, 103), (174, 141, 122), + (178, 161, 151), (194, 173, 160), (186, 169, 170), (165, 141, 150), + (153, 129, 141), (141, 133, 131), (137, 129, 131), (137, 133, 141), + (141, 137, 141), (157, 157, 160), (161, 173, 188), (165, 189, 216), + (181, 205, 235), (193, 222, 235), (189, 226, 244), (193, 230, 244), + (197, 230, 254), (197, 226, 254), (189, 226, 244), (185, 222, 244), + (173, 209, 244), (157, 193, 235), (133, 177, 226), (120, 169, 235), + (124, 173, 225), (133, 185, 225), (144, 198, 235), (149, 193, 244), + (157, 201, 244), (161, 197, 235), (169, 193, 226), (161, 185, 197), + (177, 177, 179), (185, 177, 188), (193, 193, 207), (226, 222, 216), + (246, 246, 235), (254, 254, 254), (254, 254, 254), (254, 254, 254), + (250, 254, 254), (237, 245, 254), (209, 230, 244), (193, 201, 216), + (181, 173, 188), (173, 161, 179), (161, 157, 160), (145, 137, 141), + (149, 120, 122), (133, 96, 94), (121, 60, 56), (97, 56, 46), + (80, 39, 37), (60, 15, 18), (44, 19, 9), (48, 19, 18), + (56, 23, 18), (60, 31, 37), (64, 39, 56), (76, 52, 65), + (92, 72, 103), (97, 101, 122), (117, 113, 132), (125, 117, 132), + (133, 117, 122), (137, 117, 113), (125, 109, 94), (117, 92, 84), + (117, 88, 84), (133, 97, 94), (141, 100, 94), (133, 104, 113), + (129, 121, 132), (128, 145, 178), (116, 162, 216), (121, 149, 197), + (116, 112, 151), (108, 92, 122), (76, 48, 85), (56, 40, 66), + (60, 31, 37), (52, 27, 28), (44, 27, 28), (48, 19, 28), + (48, 27, 28), (56, 31, 47), (68, 56, 75), (96, 92, 113), + (113, 117, 151), (108, 153, 197), (108, 158, 225), (100, 154, 235), + (100, 158, 235), (108, 158, 235), (141, 189, 244), (157, 201, 244), + (169, 210, 244), (173, 209, 244), (165, 205, 244), (148, 197, 254), + (140, 193, 254), (116, 185, 254), (104, 173, 244), (100, 162, 244), + (96, 154, 244), (100, 158, 244), (104, 158, 244), (104, 165, 244), + (108, 181, 244), (141, 197, 244), (169, 210, 244), (185, 226, 244), + (205, 238, 254), (218, 246, 254), (230, 250, 254), (234, 254, 254), + (234, 254, 244), (213, 250, 244), (189, 242, 244), (177, 226, 254), + (173, 226, 244), (160, 226, 254), (173, 234, 254), (189, 238, 254), + (221, 246, 254), (250, 254, 254), (254, 254, 254), (254, 254, 254), + (250, 254, 254), (234, 250, 254), (222, 242, 254), (201, 226, 244), + (181, 210, 235), (161, 202, 235), (149, 189, 235), (120, 173, 235), + (108, 177, 235), (108, 177, 244), (112, 181, 244), (140, 197, 244), + (157, 205, 244), (177, 218, 244), (193, 234, 235), (214, 246, 244), + (222, 246, 254), (226, 250, 254), (222, 246, 244), (209, 226, 235), + (193, 197, 216), (173, 177, 207), (161, 161, 179), (145, 133, 150), + (125, 100, 122), (100, 72, 84), (88, 52, 66), (80, 48, 56), + (88, 43, 47), (68, 39, 47), (72, 39, 56), (80, 43, 56), + (80, 52, 65), (88, 64, 75), (113, 97, 103), (125, 129, 151), + (116, 154, 207), (104, 158, 235), (100, 158, 235), (100, 158, 244), + (100, 166, 254), (104, 173, 254), (100, 173, 244), (104, 189, 254), + (132, 202, 254), (161, 201, 244), (185, 202, 244), (201, 226, 254), + (221, 230, 254), (233, 250, 254), (250, 254, 254), (254, 254, 254), + (250, 250, 254), (230, 238, 235), (206, 202, 207), (178, 169, 169), + (149, 129, 132), (117, 88, 103), (93, 60, 65), (105, 56, 56), + (113, 56, 56), (133, 88, 75), (141, 108, 94), (149, 137, 132), + (170, 165, 169), (182, 190, 198), (214, 214, 226), (217, 230, 244), + (217, 234, 244), (209, 234, 254), (197, 226, 235), (173, 194, 226), + (149, 173, 198), (157, 165, 179), (149, 149, 160), (149, 121, 122), + (129, 100, 103), (113, 76, 84), (96, 56, 65), (92, 52, 56), + (88, 52, 56), (84, 68, 56), (97, 85, 94), (112, 109, 132), + (128, 129, 150), (133, 137, 179), (137, 157, 188), (161, 157, 169), + (161, 141, 150), (166, 136, 132), (153, 132, 122), (157, 120, 113), + (169, 141, 131), (198, 173, 160), (202, 177, 170), (218, 210, 207), + (246, 238, 244), (250, 254, 254), (254, 254, 254), (254, 254, 254), + (250, 254, 254), (238, 250, 244), (222, 242, 244), (218, 214, 226), + (190, 190, 198), (181, 177, 178), (185, 173, 169), (194, 173, 169), + (181, 173, 179), (161, 165, 179), (157, 169, 179), (141, 173, 207), + (133, 173, 216), (136, 169, 226), (137, 149, 188), (125, 121, 132), + (96, 92, 103), (84, 64, 75), (80, 60, 66), (88, 60, 66), + (104, 76, 85), (129, 125, 122), (161, 161, 169), (201, 193, 197) + ), + +// 14 german-landscape +((61, 62, 43), (52, 48, 45), (42, 44, 39), (37, 39, 34), + (33, 39, 23), (36, 44, 22), (46, 54, 32), (51, 55, 33), + (45, 49, 38), (45, 49, 38), (45, 45, 45), (45, 45, 45), + (35, 35, 35), (35, 39, 28), (36, 44, 22), (36, 44, 22), + (31, 39, 17), (31, 39, 17), (31, 39, 17), (31, 39, 17), + (31, 39, 17), (31, 39, 17), (28, 34, 18), (23, 29, 13), + (25, 29, 18), (30, 34, 23), (30, 34, 23), (33, 39, 23), + (36, 44, 22), (39, 48, 22), (45, 43, 38), (55, 55, 44), + (60, 54, 45), (63, 61, 54), (69, 68, 58), (70, 66, 54), + (66, 64, 48), (70, 69, 45), (79, 75, 50), (77, 85, 55), + (94, 101, 63), (100, 123, 70), (115, 123, 80), (131, 132, 106), + (134, 139, 102), (131, 130, 80), (120, 105, 63), (110, 98, 70), + (96, 76, 62), (77, 68, 57), (65, 79, 60), (72, 79, 65), + (90, 95, 69), (102, 99, 77), (118, 130, 107), (137, 163, 141), + (159, 182, 173), (167, 178, 180), (177, 170, 179), (178, 172, 183), + (183, 179, 196), (165, 177, 194), (151, 168, 185), (127, 154, 156), + (131, 133, 141), (132, 125, 149), (133, 139, 140), (151, 129, 154), + (163, 157, 170), (169, 168, 176), (164, 174, 180), (168, 179, 193), + (168, 187, 195), (161, 179, 194), (161, 195, 194), (174, 198, 204), + (193, 227, 202), (210, 230, 224), (214, 223, 214), (240, 234, 209), + (219, 215, 201), (201, 197, 192), (204, 180, 172), (197, 156, 171), + (184, 157, 167), (169, 156, 169), (177, 129, 137), (148, 105, 71), + (111, 83, 64), (101, 79, 57), (93, 80, 50), (81, 73, 45), + (79, 79, 47), (85, 89, 56), (100, 94, 74), (119, 120, 84), + (154, 109, 96), (132, 132, 120), (133, 188, 112), (124, 180, 99), + (130, 156, 103), (111, 139, 75), (102, 109, 62), (94, 94, 54), + (91, 79, 57), (86, 72, 56), (86, 70, 53), (78, 68, 49), + (68, 57, 46), (58, 58, 44), (53, 59, 43), (50, 54, 43), + (46, 50, 28), (41, 49, 27), (39, 48, 22), (39, 48, 22), + (39, 48, 22), (39, 48, 22), (44, 53, 27), (47, 57, 33), + (54, 63, 37), (70, 71, 45), (75, 79, 40), (84, 78, 41), + (96, 93, 46), (110, 106, 55), (122, 115, 50), (142, 158, 73), + (137, 185, 77), (132, 178, 79), (135, 150, 71), (114, 109, 53), + (97, 92, 58), (86, 97, 78), (97, 96, 62), (113, 121, 90), + (110, 129, 129), (138, 144, 170), (164, 173, 181), (183, 184, 200), + (194, 193, 202), (214, 210, 211), (208, 220, 216), (210, 220, 212), + (205, 202, 204), (186, 186, 193), (186, 173, 176), (176, 155, 152), + (185, 123, 88), (172, 130, 65), (161, 126, 53), (120, 106, 56), + (98, 83, 60), (76, 70, 51), (58, 58, 47), (58, 58, 44), + (64, 67, 43), (70, 78, 42), (80, 97, 50), (99, 111, 58), + (104, 140, 59), (113, 144, 62), (145, 139, 67), (164, 133, 60), + (172, 133, 65), (184, 149, 59), (158, 135, 56), (134, 109, 56), + (114, 100, 58), (106, 103, 65), (109, 108, 64), (114, 120, 75), + (123, 134, 118), (136, 147, 152), (145, 168, 187), (156, 179, 183), + (153, 174, 190), (153, 172, 190), (143, 161, 178), (130, 139, 150), + (114, 116, 120), (93, 89, 82), (87, 81, 62), (79, 79, 47), + (75, 85, 47), (76, 87, 46), (77, 85, 45), (84, 88, 45), + (87, 97, 46), (97, 97, 47), (116, 108, 56), (159, 130, 57), + (170, 120, 72), (137, 103, 67), (108, 85, 65), (99, 75, 56), + (87, 78, 54), (78, 68, 46), (69, 68, 44), (70, 64, 45), + (73, 67, 48), (77, 75, 55), (84, 88, 65), (97, 102, 83), + (108, 119, 128), (131, 146, 146), (151, 162, 177), (168, 172, 190), + (180, 182, 200), (168, 187, 195), (182, 190, 196), (194, 197, 197), + (212, 210, 202), (221, 217, 208), (220, 217, 217), (218, 217, 216), + (210, 205, 204), (200, 182, 162), (223, 194, 83), (220, 174, 75), + (225, 173, 78), (214, 151, 77), (170, 115, 76), (125, 88, 80), + (101, 83, 60), (88, 83, 55), (86, 91, 47), (83, 91, 50), + (82, 92, 57), (98, 99, 70), (114, 116, 69), (117, 137, 99), + (129, 148, 127), (143, 157, 168), (161, 171, 179), (160, 168, 189), + (153, 157, 182), (155, 139, 161), (179, 116, 112), (158, 104, 89), + (164, 97, 83), (161, 97, 68), (173, 102, 80), (182, 119, 100), + (181, 144, 157), (170, 170, 169), (156, 158, 172), (130, 141, 156), + (115, 140, 140), (124, 139, 130), (131, 155, 114), (130, 160, 116), + (126, 149, 104), (134, 148, 136), (147, 157, 172), (163, 178, 187) + ), + +// 15 no-name +((218, 222, 188), (238, 230, 197), (238, 242, 206), (238, 242, 207), + (230, 238, 225), (234, 238, 216), (242, 241, 235), (242, 245, 216), + (230, 242, 206), (222, 234, 197), (214, 218, 198), (206, 210, 188), + (194, 202, 169), (190, 202, 160), (206, 214, 170), (222, 226, 197), + (234, 237, 206), (234, 242, 197), (222, 226, 197), (194, 202, 170), + (174, 190, 170), (165, 178, 150), (162, 169, 141), (150, 162, 132), + (141, 141, 122), (133, 137, 113), (133, 141, 113), (133, 133, 103), + (121, 125, 103), (121, 125, 103), (113, 121, 94), (101, 109, 85), + (77, 93, 66), (52, 64, 37), (48, 64, 37), (48, 56, 28), + (44, 60, 28), (44, 52, 28), (36, 44, 18), (36, 36, 0), + (36, 44, 9), (40, 52, 9), (56, 64, 18), (48, 64, 28), + (64, 80, 47), (85, 105, 66), (101, 117, 85), (108, 125, 94), + (116, 141, 113), (116, 137, 132), (116, 141, 132), (120, 141, 132), + (121, 137, 122), (121, 133, 113), (117, 125, 103), (113, 121, 94), + (108, 113, 94), (109, 112, 94), (108, 121, 94), (104, 117, 94), + (105, 113, 85), (109, 117, 85), (109, 117, 85), (105, 113, 85), + (101, 113, 85), (105, 109, 85), (100, 113, 94), (104, 112, 103), + (104, 112, 103), (104, 108, 103), (108, 108, 94), (113, 113, 94), + (121, 121, 103), (129, 133, 113), (125, 145, 113), (133, 146, 122), + (133, 146, 122), (125, 146, 132), (121, 146, 132), (120, 146, 141), + (120, 141, 141), (116, 141, 132), (116, 146, 132), (117, 146, 122), + (108, 133, 103), (100, 121, 94), (89, 105, 75), (170, 87, 0), + (56, 68, 28), (48, 60, 28), (44, 60, 28), (52, 64, 37), + (80, 97, 75), (93, 109, 94), (100, 113, 94), (96, 113, 94), + (96, 117, 94), (104, 117, 94), (108, 121, 94), (108, 121, 94), + (113, 121, 103), (112, 121, 103), (108, 125, 103), (104, 121, 103), + (108, 121, 103), (108, 117, 103), (113, 117, 94), (113, 117, 94), + (117, 121, 94), (117, 125, 94), (129, 141, 94), (141, 146, 94), + (141, 146, 103), (154, 154, 113), (154, 162, 122), (154, 162, 122), + (154, 161, 122), (146, 154, 113), (137, 146, 103), (129, 133, 94), + (125, 125, 85), (105, 121, 75), (97, 109, 66), (68, 76, 37), + (56, 68, 28), (64, 81, 37), (69, 77, 37), (113, 109, 66), + (121, 125, 75), (129, 125, 85), (121, 121, 85), (109, 117, 85), + (105, 125, 85), (108, 121, 94), (101, 121, 84), (104, 121, 94), + (100, 121, 103), (100, 121, 103), (104, 117, 94), (100, 113, 94), + (100, 108, 94), (101, 109, 85), (77, 88, 66), (52, 64, 37), + (44, 56, 28), (32, 40, 28), (28, 20, 9), (24, 24, 0), + (4, 20, 0), (8, 16, 0), (12, 24, 0), (28, 40, 9), + (36, 48, 18), (60, 68, 37), (93, 101, 85), (117, 121, 85), + (133, 137, 94), (137, 145, 113), (150, 162, 113), (154, 162, 122), + (158, 170, 122), (158, 170, 122), (170, 174, 113), (166, 170, 122), + (162, 170, 122), (161, 165, 122), (150, 158, 122), (133, 150, 122), + (129, 146, 122), (120, 146, 122), (117, 146, 122), (117, 141, 122), + (112, 129, 103), (125, 125, 103), (137, 137, 103), (146, 154, 113), + (158, 170, 122), (170, 182, 132), (178, 182, 141), (182, 186, 151), + (194, 202, 151), (178, 190, 141), (178, 182, 141), (170, 178, 141), + (162, 174, 132), (154, 166, 122), (146, 158, 122), (133, 154, 122), + (125, 150, 122), (125, 146, 122), (125, 146, 132), (125, 146, 132), + (129, 150, 132), (133, 150, 132), (133, 150, 132), (129, 146, 132), + (133, 154, 132), (133, 154, 132), (141, 154, 132), (146, 150, 132), + (158, 169, 132), (174, 178, 132), (170, 186, 132), (178, 190, 141), + (182, 194, 160), (198, 202, 160), (198, 206, 170), (214, 218, 179), + (218, 226, 197), (210, 214, 188), (190, 194, 160), (170, 182, 141), + (158, 166, 122), (146, 154, 113), (137, 137, 113), (129, 125, 103), + (125, 125, 103), (129, 120, 103), (125, 125, 94), (121, 121, 94), + (121, 129, 94), (129, 125, 103), (129, 125, 103), (129, 129, 103), + (129, 137, 113), (133, 145, 122), (137, 146, 122), (150, 157, 122), + (150, 158, 122), (146, 150, 132), (150, 154, 141), (146, 146, 132), + (137, 145, 132), (129, 146, 132), (125, 146, 141), (120, 146, 141), + (116, 146, 141), (120, 146, 141), (120, 150, 151), (129, 150, 141), + (129, 150, 141), (129, 154, 141), (133, 154, 141), (137, 158, 141), + (137, 158, 141), (141, 162, 151), (149, 162, 151), (141, 162, 151), + (150, 166, 141), (154, 161, 141), (158, 169, 132), (158, 166, 122), + (162, 165, 113), (158, 166, 113), (154, 166, 113), (149, 157, 113) + ), + +// 16 living-mud-bomb +((193, 144, 35), (153, 117, 33), (133, 107, 35), (102, 76, 20), + (96, 67, 20), (79, 51, 16), (70, 47, 16), (66, 52, 16), + (64, 48, 16), (64, 47, 16), (61, 44, 16), (58, 41, 16), + (58, 42, 16), (64, 46, 16), (72, 48, 16), (85, 52, 18), + (86, 60, 18), (88, 64, 22), (85, 76, 24), (75, 76, 24), + (89, 56, 15), (84, 47, 16), (84, 46, 16), (84, 43, 16), + (84, 41, 16), (84, 40, 16), (84, 40, 16), (84, 39, 16), + (84, 39, 16), (84, 39, 16), (81, 39, 16), (79, 39, 16), + (75, 39, 16), (66, 39, 16), (64, 40, 16), (55, 40, 16), + (51, 40, 16), (48, 40, 16), (48, 40, 16), (49, 42, 16), + (53, 43, 16), (55, 41, 16), (55, 41, 16), (53, 41, 16), + (49, 40, 16), (48, 40, 16), (48, 40, 16), (48, 40, 16), + (48, 40, 16), (48, 40, 16), (48, 40, 16), (48, 38, 16), + (48, 38, 16), (48, 38, 16), (48, 38, 16), (48, 38, 16), + (45, 35, 16), (48, 38, 16), (48, 38, 16), (49, 40, 16), + (53, 40, 16), (58, 40, 16), (64, 40, 16), (75, 39, 16), + (81, 39, 16), (83, 39, 16), (84, 39, 16), (81, 39, 16), + (79, 39, 16), (75, 40, 16), (68, 47, 16), (64, 48, 16), + (64, 48, 16), (64, 48, 16), (58, 46, 16), (56, 44, 16), + (56, 44, 16), (53, 43, 16), (49, 40, 16), (48, 40, 16), + (48, 40, 16), (48, 40, 16), (48, 40, 16), (49, 40, 16), + (55, 41, 16), (63, 43, 16), (68, 47, 16), (79, 49, 16), + (93, 56, 15), (96, 68, 20), (120, 84, 20), (151, 110, 35), + (186, 141, 35), (236, 162, 35), (246, 167, 44), (238, 165, 35), + (226, 153, 33), (185, 106, 22), (128, 82, 15), (96, 70, 20), + (84, 60, 22), (72, 48, 16), (62, 47, 16), (55, 42, 16), + (49, 40, 16), (48, 40, 16), (48, 40, 16), (48, 40, 16), + (48, 40, 16), (48, 40, 16), (48, 40, 16), (48, 40, 16), + (48, 40, 16), (48, 40, 16), (48, 40, 16), (48, 40, 16), + (48, 40, 16), (48, 40, 16), (49, 40, 16), (55, 40, 16), + (58, 40, 16), (64, 42, 16), (68, 46, 16), (70, 47, 16), + (77, 43, 16), (81, 40, 16), (84, 39, 16), (85, 39, 16), + (91, 39, 15), (96, 39, 16), (96, 39, 16), (94, 39, 16), + (91, 39, 16), (85, 39, 16), (85, 39, 16), (84, 39, 16), + (84, 39, 16), (84, 39, 16), (84, 39, 16), (84, 39, 16), + (84, 39, 16), (84, 39, 16), (84, 39, 16), (84, 39, 16), + (84, 39, 16), (84, 39, 16), (85, 39, 16), (87, 42, 16), + (91, 43, 16), (96, 43, 16), (100, 40, 16), (106, 52, 22), + (124, 75, 17), (164, 105, 21), (217, 135, 30), (239, 162, 49), + (248, 175, 48), (237, 159, 49), (202, 125, 32), (163, 84, 15), + (130, 76, 20), (106, 71, 22), (98, 53, 15), (91, 43, 16), + (84, 41, 16), (77, 39, 16), (68, 39, 16), (64, 42, 16), + (64, 44, 16), (68, 47, 16), (75, 46, 16), (84, 42, 16), + (91, 40, 16), (98, 39, 16), (100, 40, 16), (101, 50, 15), + (117, 55, 15), (120, 53, 15), (120, 51, 15), (120, 54, 15), + (106, 52, 15), (102, 43, 15), (100, 39, 16), (92, 39, 16), + (87, 39, 16), (85, 39, 16), (84, 39, 16), (84, 39, 16), + (84, 39, 16), (84, 39, 16), (84, 39, 16), (84, 39, 16), + (84, 39, 16), (84, 39, 16), (84, 39, 16), (84, 39, 16), + (84, 39, 16), (84, 39, 16), (84, 39, 16), (85, 39, 16), + (92, 39, 16), (100, 39, 16), (100, 39, 16), (117, 46, 15), + (127, 62, 15), (175, 55, 15), (192, 53, 15), (237, 60, 15), + (247, 74, 20), (230, 62, 17), (184, 53, 15), (182, 56, 15), + (134, 48, 15), (128, 67, 20), (128, 78, 28), (137, 103, 28), + (188, 128, 30), (229, 153, 35), (245, 151, 35), (248, 133, 41), + (248, 106, 31), (202, 107, 22), (137, 94, 35), (108, 76, 15), + (93, 56, 15), (84, 47, 16), (84, 45, 16), (84, 42, 16), + (81, 39, 16), (81, 39, 16), (73, 39, 16), (64, 40, 16), + (58, 40, 16), (55, 39, 16), (49, 40, 16), (48, 40, 16), + (48, 40, 16), (48, 40, 16), (48, 40, 16), (48, 40, 16), + (48, 40, 16), (49, 40, 16), (53, 40, 16), (57, 40, 16), + (64, 40, 16), (66, 39, 16), (70, 39, 16), (77, 39, 16), + (81, 39, 16), (84, 39, 16), (84, 39, 16), (81, 41, 16), + (77, 40, 16), (68, 46, 16), (64, 47, 16), (64, 47, 16) + ), + +// 17 cars +((43, 30, 36), (38, 26, 33), (29, 22, 30), (32, 24, 32), + (31, 31, 35), (40, 39, 36), (51, 56, 42), (69, 71, 43), + (92, 94, 54), (116, 120, 64), (183, 130, 77), (221, 172, 85), + (218, 188, 136), (187, 189, 148), (190, 191, 173), (176, 180, 172), + (159, 184, 170), (142, 161, 152), (126, 135, 130), (104, 119, 98), + (98, 83, 78), (81, 60, 64), (87, 41, 42), (90, 44, 36), + (78, 35, 32), (59, 24, 34), (57, 24, 32), (54, 32, 38), + (51, 35, 37), (54, 32, 39), (64, 51, 38), (74, 59, 34), + (82, 70, 38), (91, 96, 51), (132, 137, 68), (207, 152, 66), + (229, 204, 97), (217, 199, 117), (213, 222, 147), (218, 215, 178), + (193, 204, 181), (177, 197, 185), (171, 199, 191), (165, 182, 185), + (155, 161, 156), (116, 122, 129), (91, 87, 99), (72, 74, 85), + (63, 55, 63), (44, 41, 50), (34, 33, 45), (33, 25, 34), + (27, 23, 28), (33, 21, 25), (39, 33, 24), (47, 45, 38), + (52, 51, 45), (67, 62, 56), (92, 82, 69), (120, 118, 89), + (152, 134, 85), (164, 135, 91), (152, 152, 93), (155, 166, 95), + (146, 157, 118), (138, 166, 102), (130, 164, 111), (133, 155, 93), + (113, 136, 88), (102, 131, 85), (96, 100, 60), (90, 81, 57), + (69, 70, 37), (59, 63, 38), (58, 49, 37), (49, 39, 39), + (43, 36, 32), (33, 23, 30), (27, 17, 30), (27, 19, 31), + (26, 23, 29), (24, 20, 27), (26, 21, 29), (33, 24, 32), + (45, 32, 37), (51, 45, 46), (70, 66, 62), (108, 94, 78), + (174, 107, 74), (205, 144, 56), (210, 171, 78), (205, 194, 148), + (211, 201, 178), (205, 226, 197), (195, 210, 202), (183, 207, 199), + (178, 206, 195), (162, 203, 184), (156, 195, 177), (158, 187, 169), + (152, 186, 156), (152, 162, 151), (143, 143, 137), (147, 147, 111), + (125, 138, 102), (125, 124, 97), (122, 132, 68), (109, 114, 62), + (92, 94, 49), (82, 73, 41), (72, 55, 49), (69, 50, 39), + (67, 49, 47), (69, 62, 60), (70, 70, 80), (84, 93, 100), + (96, 132, 114), (106, 133, 125), (113, 130, 123), (117, 128, 114), + (136, 138, 123), (143, 160, 126), (151, 174, 128), (157, 188, 118), + (165, 184, 135), (173, 203, 155), (186, 219, 163), (198, 226, 180), + (195, 244, 191), (203, 247, 199), (207, 238, 196), (205, 244, 226), + (221, 248, 232), (236, 250, 236), (222, 247, 232), (207, 230, 212), + (190, 212, 200), (165, 190, 191), (136, 162, 173), (107, 133, 128), + (96, 116, 109), (92, 105, 77), (76, 72, 69), (89, 76, 60), + (100, 92, 76), (120, 118, 98), (150, 164, 137), (167, 198, 158), + (188, 218, 157), (209, 237, 162), (215, 244, 184), (222, 254, 212), + (236, 253, 238), (246, 253, 239), (252, 252, 241), (251, 254, 243), + (248, 252, 241), (243, 251, 238), (242, 240, 224), (239, 239, 213), + (211, 229, 209), (224, 229, 197), (215, 229, 179), (203, 228, 197), + (190, 220, 180), (182, 218, 163), (159, 197, 139), (133, 167, 129), + (120, 145, 128), (106, 130, 110), (79, 82, 94), (64, 64, 70), + (52, 44, 57), (42, 31, 43), (39, 42, 46), (58, 59, 61), + (76, 73, 84), (108, 107, 114), (140, 148, 145), (169, 178, 165), + (195, 205, 186), (213, 227, 209), (218, 244, 225), (241, 253, 215), + (241, 254, 212), (239, 248, 180), (233, 247, 175), (223, 225, 171), + (183, 192, 147), (152, 143, 122), (123, 118, 103), (105, 112, 95), + (90, 89, 94), (76, 77, 89), (79, 88, 98), (96, 110, 112), + (116, 116, 116), (134, 134, 134), (144, 156, 164), (138, 166, 175), + (153, 184, 183), (166, 201, 161), (174, 218, 170), (179, 215, 175), + (182, 191, 169), (171, 184, 169), (149, 164, 168), (136, 158, 163), + (116, 131, 127), (92, 120, 99), (78, 101, 65), (77, 78, 61), + (66, 68, 48), (66, 67, 44), (75, 72, 52), (92, 77, 66), + (153, 100, 68), (178, 87, 59), (168, 60, 50), (152, 53, 43), + (92, 77, 50), (79, 68, 52), (68, 59, 66), (63, 59, 72), + (57, 71, 73), (79, 83, 91), (111, 110, 95), (134, 120, 91), + (182, 74, 55), (189, 30, 39), (189, 28, 37), (167, 26, 34), + (159, 32, 36), (97, 36, 37), (63, 36, 40), (48, 27, 36), + (40, 23, 24), (32, 22, 16), (24, 17, 23), (22, 17, 25), + (23, 17, 25), (24, 20, 27), (24, 19, 24), (26, 19, 26), + (30, 18, 26), (33, 16, 29), (36, 19, 27), (33, 19, 27), + (35, 22, 27), (45, 27, 21), (50, 34, 37), (49, 44, 43), + (64, 53, 45), (80, 69, 52), (92, 94, 68), (127, 123, 85) + ), + +// 18 unhealthy-tan +((218, 205, 192), (223, 205, 183), (219, 202, 177), (205, 193, 171), + (206, 186, 157), (189, 170, 147), (173, 151, 130), (163, 143, 129), + (160, 142, 119), (156, 141, 120), (159, 150, 133), (168, 161, 143), + (183, 172, 164), (211, 200, 191), (216, 206, 199), (218, 212, 211), + (220, 213, 206), (222, 213, 203), (223, 209, 199), (212, 203, 192), + (205, 194, 176), (198, 180, 151), (187, 160, 127), (173, 141, 106), + (153, 126, 101), (130, 108, 88), (104, 96, 79), (88, 76, 64), + (72, 59, 51), (67, 48, 48), (63, 42, 44), (58, 35, 38), + (60, 41, 45), (64, 46, 45), (76, 56, 50), (80, 60, 53), + (92, 66, 57), (96, 70, 58), (99, 77, 64), (105, 84, 67), + (114, 91, 71), (118, 97, 79), (121, 104, 84), (123, 105, 82), + (114, 101, 82), (113, 96, 72), (113, 89, 64), (113, 81, 60), + (108, 67, 51), (102, 65, 52), (88, 63, 53), (79, 54, 49), + (74, 48, 48), (65, 46, 47), (69, 46, 44), (68, 41, 43), + (70, 46, 46), (73, 48, 49), (77, 54, 52), (77, 58, 54), + (90, 70, 59), (93, 76, 64), (97, 85, 67), (101, 93, 81), + (115, 106, 87), (125, 112, 97), (141, 124, 97), (147, 121, 104), + (146, 120, 104), (138, 114, 91), (134, 109, 85), (122, 96, 75), + (111, 83, 66), (106, 70, 62), (102, 65, 53), (92, 58, 51), + (83, 49, 49), (83, 48, 46), (83, 54, 49), (94, 66, 56), + (99, 70, 54), (103, 75, 58), (108, 79, 63), (113, 85, 64), + (119, 90, 72), (123, 98, 76), (128, 102, 78), (130, 107, 78), + (131, 108, 79), (132, 104, 79), (131, 100, 79), (135, 99, 73), + (135, 98, 71), (131, 100, 70), (124, 94, 70), (118, 91, 71), + (114, 93, 70), (105, 96, 69), (105, 90, 67), (105, 86, 64), + (104, 81, 63), (103, 75, 62), (94, 73, 56), (88, 72, 58), + (85, 74, 59), (92, 70, 60), (87, 74, 60), (96, 79, 62), + (101, 87, 70), (112, 102, 77), (124, 107, 84), (133, 108, 87), + (143, 114, 92), (148, 119, 99), (149, 124, 104), (149, 124, 106), + (150, 131, 104), (165, 140, 109), (175, 148, 113), (189, 164, 131), + (199, 178, 144), (202, 182, 160), (209, 192, 178), (214, 202, 191), + (220, 210, 194), (219, 207, 192), (222, 204, 181), (208, 192, 165), + (196, 169, 138), (184, 153, 118), (176, 142, 104), (165, 129, 92), + (155, 115, 75), (142, 110, 77), (136, 108, 82), (136, 108, 84), + (134, 110, 84), (134, 115, 87), (136, 116, 90), (146, 123, 95), + (148, 126, 98), (149, 127, 102), (149, 125, 101), (149, 127, 97), + (150, 125, 99), (148, 124, 97), (140, 120, 92), (136, 118, 86), + (131, 118, 86), (129, 109, 85), (128, 108, 85), (125, 108, 89), + (126, 107, 97), (131, 112, 95), (140, 126, 101), (153, 135, 112), + (171, 147, 118), (195, 164, 136), (204, 177, 144), (199, 179, 149), + (201, 185, 160), (199, 184, 162), (182, 170, 153), (172, 156, 140), + (158, 148, 125), (144, 139, 121), (132, 125, 112), (129, 121, 100), + (124, 110, 92), (112, 100, 84), (104, 84, 68), (100, 76, 67), + (98, 75, 63), (94, 76, 60), (94, 76, 60), (94, 73, 60), + (102, 78, 61), (111, 81, 65), (113, 89, 65), (123, 93, 71), + (128, 101, 78), (132, 108, 80), (133, 108, 84), (130, 109, 80), + (123, 102, 78), (117, 101, 75), (112, 94, 71), (106, 86, 67), + (106, 82, 65), (109, 82, 60), (111, 84, 57), (113, 84, 57), + (118, 88, 57), (121, 92, 64), (125, 98, 69), (129, 106, 74), + (132, 109, 79), (143, 119, 82), (162, 125, 87), (168, 133, 95), + (162, 140, 115), (158, 144, 132), (156, 152, 147), (155, 152, 150), + (161, 159, 156), (183, 168, 159), (188, 174, 151), (190, 171, 145), + (194, 170, 143), (193, 173, 146), (193, 167, 145), (188, 163, 138), + (180, 155, 124), (162, 140, 118), (148, 123, 100), (137, 106, 85), + (130, 99, 76), (123, 94, 68), (124, 91, 62), (121, 89, 64), + (123, 91, 64), (126, 94, 69), (131, 97, 75), (128, 98, 75), + (123, 96, 72), (117, 94, 66), (117, 92, 65), (111, 89, 63), + (102, 83, 63), (90, 75, 60), (84, 66, 59), (79, 55, 55), + (72, 49, 52), (71, 46, 48), (72, 46, 48), (75, 50, 48), + (79, 54, 52), (92, 62, 53), (99, 67, 54), (109, 75, 59), + (122, 79, 55), (126, 89, 63), (132, 94, 67), (136, 97, 67), + (138, 102, 70), (135, 106, 80), (139, 114, 91), (152, 126, 96), + (163, 130, 101), (159, 134, 104), (162, 141, 109), (168, 136, 101), + (152, 132, 103), (151, 123, 95), (142, 115, 83), (138, 108, 78) + ), + +// 19 daffodil +((17, 0, 0), (54, 34, 22), (92, 62, 28), (128, 122, 46), + (214, 134, 0), (248, 152, 0), (242, 157, 5), (225, 157, 5), + (172, 143, 56), (133, 110, 56), (90, 90, 51), (65, 65, 46), + (66, 54, 43), (54, 54, 47), (37, 51, 45), (34, 49, 34), + (34, 60, 28), (39, 52, 36), (34, 45, 28), (51, 51, 30), + (49, 49, 32), (54, 49, 32), (49, 45, 26), (45, 39, 17), + (34, 28, 11), (22, 22, 11), (17, 17, 11), (17, 17, 5), + (17, 5, 5), (11, 5, 11), (5, 11, 11), (5, 5, 5), + (5, 0, 0), (5, 0, 0), (11, 5, 5), (11, 5, 5), + (11, 5, 5), (11, 5, 5), (11, 5, 0), (11, 5, 5), + (11, 0, 0), (11, 0, 0), (17, 0, 0), (17, 5, 0), + (28, 5, 5), (47, 22, 11), (75, 43, 20), (114, 83, 46), + (186, 134, 50), (239, 146, 11), (254, 146, 0), (237, 152, 5), + (210, 135, 28), (114, 101, 43), (68, 66, 22), (54, 60, 32), + (45, 56, 34), (51, 60, 28), (51, 54, 28), (47, 51, 24), + (54, 49, 15), (54, 49, 11), (51, 28, 5), (43, 26, 0), + (28, 22, 0), (22, 17, 0), (28, 34, 0), (30, 45, 15), + (43, 41, 15), (45, 45, 22), (49, 45, 22), (51, 45, 22), + (47, 37, 22), (45, 39, 22), (32, 32, 20), (28, 17, 17), + (22, 11, 11), (17, 11, 11), (17, 11, 11), (17, 17, 17), + (17, 17, 17), (17, 22, 17), (17, 20, 15), (17, 22, 5), + (17, 17, 0), (17, 11, 0), (17, 5, 5), (22, 11, 5), + (24, 9, 9), (28, 17, 11), (34, 22, 11), (41, 28, 17), + (45, 39, 22), (51, 53, 29), (68, 62, 34), (101, 78, 56), + (155, 116, 65), (220, 151, 73), (242, 157, 39), (254, 186, 39), + (248, 203, 33), (248, 191, 27), (248, 163, 11), (254, 134, 0), + (254, 129, 0), (212, 95, 0), (127, 62, 28), (77, 59, 25), + (60, 58, 32), (60, 63, 35), (68, 79, 45), (85, 93, 59), + (96, 96, 56), (103, 81, 92), (82, 124, 147), (60, 111, 139), + (45, 73, 131), (49, 83, 83), (51, 62, 68), (58, 52, 52), + (49, 43, 43), (35, 36, 36), (34, 34, 22), (22, 22, 20), + (22, 22, 26), (22, 17, 26), (22, 17, 17), (22, 17, 11), + (22, 22, 17), (22, 22, 17), (26, 32, 20), (28, 34, 22), + (34, 45, 26), (49, 49, 37), (56, 56, 49), (77, 71, 66), + (109, 112, 92), (120, 160, 159), (180, 186, 180), (218, 224, 190), + (239, 233, 205), (207, 218, 178), (158, 168, 123), (127, 155, 96), + (107, 113, 90), (66, 77, 66), (54, 79, 54), (49, 69, 49), + (56, 68, 36), (39, 72, 48), (49, 86, 63), (90, 102, 79), + (139, 133, 94), (179, 179, 122), (237, 214, 157), (246, 235, 189), + (248, 225, 163), (248, 208, 129), (248, 208, 73), (254, 197, 44), + (254, 197, 44), (248, 185, 56), (208, 180, 73), (189, 155, 59), + (152, 141, 79), (127, 138, 73), (138, 144, 67), (135, 141, 79), + (150, 156, 94), (177, 148, 103), (214, 180, 118), (246, 217, 161), + (244, 198, 159), (246, 229, 178), (254, 237, 180), (254, 237, 180), + (246, 223, 172), (171, 191, 142), (147, 152, 118), (147, 141, 107), + (135, 141, 107), (149, 131, 104), (158, 141, 108), (152, 141, 118), + (156, 154, 128), (188, 165, 154), (231, 208, 169), (248, 226, 186), + (248, 226, 197), (208, 225, 197), (175, 179, 152), (151, 145, 117), + (119, 124, 96), (86, 100, 66), (62, 85, 51), (45, 71, 22), + (49, 64, 26), (60, 69, 25), (101, 87, 50), (145, 113, 56), + (214, 135, 28), (248, 163, 16), (248, 169, 22), (254, 174, 16), + (254, 180, 11), (254, 180, 16), (242, 174, 11), (254, 168, 5), + (254, 157, 0), (254, 151, 0), (254, 157, 0), (254, 174, 0), + (254, 186, 0), (254, 191, 16), (242, 197, 28), (196, 178, 60), + (152, 130, 68), (113, 124, 59), (100, 100, 56), (68, 79, 59), + (53, 60, 39), (49, 37, 32), (39, 28, 22), (34, 17, 17), + (28, 22, 17), (34, 22, 11), (34, 32, 11), (49, 37, 15), + (56, 39, 28), (60, 47, 32), (77, 57, 31), (90, 80, 48), + (107, 116, 65), (164, 118, 84), (188, 148, 109), (197, 152, 107), + (231, 197, 129), (197, 174, 95), (158, 152, 95), (133, 121, 65), + (111, 82, 71), (90, 60, 54), (92, 75, 47), (110, 70, 42), + (132, 88, 50), (186, 112, 50), (220, 129, 28), (224, 117, 22), + (180, 95, 28), (102, 60, 34), (60, 60, 20), (43, 52, 15), + (26, 43, 5), (17, 31, 0), (11, 28, 5), (28, 22, 17) + ), + +// 20 rose +((113, 33, 37), (84, 23, 37), (55, 27, 28), (36, 40, 18), + (32, 56, 9), (60, 77, 18), (56, 101, 27), (60, 81, 28), + (52, 89, 18), (48, 85, 28), (40, 68, 28), (40, 56, 28), + (40, 52, 28), (76, 30, 28), (105, 18, 18), (121, 22, 19), + (125, 21, 28), (105, 22, 28), (84, 19, 28), (56, 23, 28), + (36, 36, 28), (32, 40, 28), (28, 36, 18), (28, 32, 18), + (27, 32, 9), (48, 27, 9), (77, 22, 9), (101, 15, 9), + (137, 14, 9), (150, 21, 19), (162, 28, 38), (178, 38, 57), + (166, 35, 86), (166, 39, 86), (178, 44, 86), (178, 47, 95), + (174, 68, 113), (170, 182, 170), (177, 190, 188), (181, 198, 179), + (166, 170, 160), (182, 52, 105), (198, 44, 96), (166, 31, 86), + (154, 30, 67), (146, 29, 47), (129, 25, 28), (101, 22, 18), + (68, 22, 18), (52, 23, 18), (36, 36, 18), (28, 36, 18), + (32, 44, 18), (36, 48, 18), (40, 56, 28), (52, 60, 28), + (52, 73, 28), (64, 73, 28), (101, 26, 28), (125, 25, 28), + (141, 22, 28), (129, 18, 28), (109, 21, 28), (76, 26, 28), + (48, 52, 37), (60, 72, 28), (73, 97, 47), (77, 109, 85), + (92, 133, 122), (100, 133, 132), (96, 133, 131), (85, 113, 85), + (93, 96, 47), (93, 117, 47), (113, 108, 37), (125, 63, 47), + (141, 29, 38), (146, 25, 28), (146, 22, 28), (146, 25, 38), + (146, 25, 57), (150, 26, 66), (158, 30, 76), (158, 35, 86), + (162, 27, 86), (166, 27, 86), (158, 34, 76), (153, 34, 57), + (141, 29, 47), (121, 33, 37), (76, 59, 37), (48, 60, 37), + (28, 56, 28), (28, 40, 18), (20, 28, 18), (20, 24, 18), + (23, 24, 18), (24, 32, 28), (28, 36, 37), (40, 39, 37), + (64, 23, 28), (101, 22, 28), (141, 19, 38), (146, 22, 47), + (150, 21, 47), (158, 26, 57), (150, 22, 47), (150, 21, 57), + (146, 22, 47), (141, 18, 38), (137, 21, 28), (137, 22, 28), + (133, 21, 28), (133, 21, 18), (113, 18, 9), (133, 20, 18), + (141, 21, 19), (146, 21, 28), (150, 21, 28), (154, 28, 28), + (158, 24, 28), (150, 28, 28), (154, 28, 38), (166, 33, 48), + (166, 25, 48), (154, 22, 47), (158, 30, 57), (162, 31, 67), + (162, 43, 76), (157, 140, 56), (129, 170, 103), (166, 186, 169), + (181, 189, 198), (173, 189, 207), (169, 185, 188), (154, 170, 170), + (182, 52, 133), (178, 44, 115), (178, 40, 105), (182, 56, 114), + (150, 170, 160), (165, 186, 188), (165, 185, 188), (112, 158, 160), + (104, 133, 113), (76, 113, 75), (85, 92, 47), (133, 30, 38), + (150, 29, 28), (158, 28, 28), (158, 29, 28), (170, 25, 28), + (166, 37, 38), (157, 30, 48), (150, 26, 57), (146, 22, 66), + (150, 34, 67), (150, 33, 57), (150, 25, 47), (146, 22, 47), + (146, 19, 38), (137, 21, 28), (109, 21, 28), (72, 19, 28), + (48, 27, 28), (43, 40, 37), (36, 44, 28), (36, 52, 28), + (48, 60, 37), (52, 77, 37), (52, 81, 47), (60, 77, 56), + (60, 85, 56), (77, 109, 66), (77, 125, 65), (77, 133, 56), + (93, 141, 46), (101, 146, 66), (93, 133, 74), (81, 129, 83), + (105, 137, 75), (109, 162, 94), (113, 158, 84), (121, 162, 85), + (142, 154, 66), (113, 141, 75), (109, 129, 56), (101, 121, 47), + (109, 137, 47), (97, 121, 37), (81, 117, 37), (73, 97, 28), + (81, 93, 18), (109, 25, 28), (129, 25, 28), (141, 25, 28), + (141, 22, 28), (141, 22, 28), (141, 21, 28), (137, 21, 37), + (93, 19, 28), (68, 19, 28), (51, 19, 28), (24, 24, 37), + (23, 24, 28), (24, 24, 18), (24, 24, 18), (27, 24, 18), + (28, 24, 18), (47, 23, 28), (63, 23, 28), (88, 19, 28), + (121, 18, 19), (133, 24, 19), (146, 21, 28), (146, 21, 28), + (146, 21, 28), (146, 18, 28), (146, 18, 28), (146, 18, 28), + (146, 17, 28), (146, 18, 28), (146, 21, 28), (146, 21, 19), + (146, 21, 19), (146, 17, 19), (141, 21, 19), (141, 21, 19), + (141, 21, 19), (133, 21, 19), (129, 21, 19), (109, 18, 18), + (80, 26, 18), (56, 27, 18), (32, 32, 18), (28, 28, 18), + (32, 32, 18), (56, 19, 18), (80, 19, 18), (113, 22, 28), + (146, 26, 57), (154, 34, 67), (161, 51, 85), (107, 133, 132), + (150, 174, 170), (165, 186, 179), (154, 174, 170), (124, 154, 122), + (170, 55, 85), (174, 39, 67), (182, 55, 66), (170, 37, 47), + (158, 32, 38), (145, 26, 38), (125, 25, 28), (68, 23, 28) + ), + +// 21 healthy-skin +((250, 225, 235), (194, 165, 188), (157, 133, 141), (137, 100, 94), + (96, 60, 47), (72, 43, 28), (60, 35, 28), (52, 23, 18), + (35, 16, 9), (35, 16, 9), (35, 16, 9), (32, 8, 0), + (31, 12, 9), (24, 12, 9), (35, 16, 18), (40, 19, 28), + (56, 27, 28), (80, 39, 47), (113, 64, 65), (141, 84, 75), + (166, 95, 85), (182, 107, 94), (186, 107, 94), (190, 111, 94), + (186, 111, 94), (182, 111, 85), (154, 92, 66), (141, 88, 47), + (105, 68, 46), (81, 51, 18), (56, 27, 18), (52, 23, 9), + (35, 16, 18), (27, 12, 18), (24, 8, 18), (0, 0, 0), + (0, 0, 0), (24, 4, 18), (35, 8, 18), (44, 12, 18), + (44, 20, 18), (44, 19, 18), (40, 12, 18), (52, 19, 18), + (52, 19, 28), (40, 16, 28), (35, 12, 28), (39, 16, 28), + (52, 23, 28), (56, 27, 28), (68, 39, 28), (76, 48, 47), + (101, 64, 65), (133, 100, 84), (158, 112, 94), (186, 119, 94), + (198, 136, 113), (206, 152, 132), (210, 157, 141), (226, 161, 160), + (238, 164, 160), (238, 180, 169), (246, 184, 169), (250, 184, 169), + (246, 180, 159), (242, 172, 150), (250, 160, 141), (242, 152, 122), + (242, 148, 122), (234, 144, 113), (234, 144, 122), (222, 145, 132), + (214, 149, 132), (214, 149, 122), (219, 149, 122), (210, 165, 132), + (219, 165, 141), (234, 172, 150), (238, 176, 150), (238, 176, 150), + (246, 176, 140), (250, 164, 141), (242, 160, 131), (234, 156, 113), + (234, 144, 103), (219, 128, 94), (214, 123, 85), (210, 119, 94), + (214, 124, 103), (226, 140, 113), (238, 152, 131), (238, 164, 141), + (238, 164, 150), (234, 160, 150), (238, 156, 141), (242, 148, 141), + (219, 141, 132), (210, 136, 122), (198, 119, 104), (194, 119, 103), + (182, 103, 94), (174, 103, 85), (170, 95, 75), (166, 88, 85), + (150, 88, 85), (149, 92, 75), (146, 96, 85), (141, 88, 75), + (121, 76, 65), (96, 60, 56), (84, 52, 47), (80, 47, 37), + (84, 51, 28), (92, 60, 37), (113, 60, 47), (137, 84, 56), + (166, 95, 75), (182, 115, 85), (186, 128, 104), (206, 157, 132), + (222, 165, 151), (238, 184, 169), (246, 197, 206), (246, 213, 244), + (234, 226, 254), (242, 226, 244), (214, 202, 207), (219, 169, 160), + (214, 149, 132), (219, 145, 122), (210, 137, 113), (214, 128, 113), + (210, 120, 104), (202, 124, 103), (206, 128, 113), (198, 119, 104), + (194, 107, 94), (178, 99, 85), (158, 84, 75), (154, 80, 75), + (137, 68, 66), (125, 68, 65), (125, 64, 56), (137, 72, 56), + (146, 84, 56), (158, 107, 75), (166, 111, 85), (182, 128, 103), + (202, 153, 141), (222, 185, 169), (246, 209, 188), (246, 222, 244), + (250, 226, 244), (246, 221, 244), (230, 205, 225), (206, 202, 198), + (226, 185, 179), (238, 184, 169), (234, 172, 150), (210, 161, 122), + (210, 141, 113), (190, 111, 94), (170, 103, 85), (146, 84, 75), + (117, 60, 56), (96, 47, 47), (80, 43, 37), (72, 39, 37), + (76, 43, 47), (96, 60, 47), (113, 76, 56), (141, 92, 66), + (162, 116, 94), (182, 140, 113), (190, 161, 150), (198, 157, 179), + (206, 169, 179), (210, 173, 170), (206, 160, 151), (194, 153, 151), + (194, 148, 151), (166, 133, 122), (149, 120, 113), (129, 104, 103), + (125, 100, 103), (101, 80, 84), (84, 56, 47), (80, 56, 37), + (88, 47, 37), (101, 56, 47), (121, 72, 56), (154, 88, 66), + (186, 115, 94), (202, 145, 132), (218, 161, 160), (230, 172, 169), + (226, 181, 188), (205, 185, 207), (202, 185, 198), (178, 174, 170), + (161, 137, 141), (133, 112, 113), (129, 84, 84), (100, 68, 56), + (84, 51, 47), (72, 39, 37), (72, 39, 28), (80, 43, 28), + (92, 64, 47), (117, 88, 75), (133, 112, 94), (170, 128, 103), + (186, 157, 141), (186, 165, 151), (186, 157, 160), (169, 149, 160), + (170, 137, 132), (170, 120, 104), (178, 111, 94), (186, 107, 94), + (194, 107, 85), (198, 111, 85), (186, 115, 85), (178, 111, 85), + (178, 107, 85), (178, 95, 56), (149, 63, 37), (101, 52, 47), + (84, 39, 37), (72, 31, 28), (72, 27, 28), (60, 27, 28), + (48, 31, 28), (56, 31, 28), (68, 35, 28), (68, 35, 28), + (80, 39, 28), (89, 56, 37), (113, 76, 56), (137, 96, 75), + (157, 120, 94), (178, 140, 103), (202, 153, 132), (198, 149, 141), + (198, 145, 132), (198, 128, 104), (194, 119, 94), (174, 103, 85), + (146, 104, 85), (145, 100, 85), (145, 104, 85), (153, 112, 103), + (170, 112, 103), (194, 119, 94), (214, 132, 94), (230, 140, 103) + ), + +// 22 orange +((123, 106, 57), (97, 100, 60), (91, 83, 58), (70, 74, 54), + (70, 71, 53), (59, 68, 51), (59, 56, 32), (54, 61, 44), + (57, 72, 57), (67, 74, 62), (81, 97, 76), (95, 114, 91), + (109, 114, 82), (115, 113, 84), (112, 120, 98), (128, 131, 98), + (130, 137, 106), (134, 142, 106), (150, 151, 107), (149, 150, 114), + (149, 152, 123), (148, 156, 135), (170, 161, 127), (188, 121, 129), + (228, 101, 100), (234, 92, 73), (224, 66, 57), (195, 72, 57), + (121, 65, 36), (86, 54, 32), (75, 73, 38), (29, 34, 39), + (54, 52, 52), (53, 57, 62), (60, 78, 68), (63, 69, 77), + (64, 89, 73), (84, 105, 77), (84, 114, 95), (98, 122, 108), + (120, 143, 125), (132, 158, 138), (138, 165, 137), (139, 162, 137), + (154, 153, 159), (178, 155, 163), (176, 154, 155), (183, 159, 157), + (187, 171, 130), (169, 174, 143), (165, 183, 130), (170, 171, 138), + (175, 179, 129), (159, 175, 124), (155, 156, 122), (143, 142, 110), + (131, 129, 116), (125, 128, 116), (127, 121, 131), (119, 119, 134), + (115, 118, 132), (121, 139, 133), (123, 138, 124), (124, 141, 130), + (136, 154, 141), (140, 148, 158), (131, 149, 158), (91, 155, 182), + (100, 132, 171), (83, 129, 184), (82, 128, 193), (85, 149, 207), + (93, 183, 236), (113, 192, 242), (137, 196, 237), (127, 191, 237), + (119, 187, 234), (114, 170, 214), (109, 156, 197), (144, 153, 173), + (153, 147, 160), (169, 161, 168), (175, 185, 189), (158, 196, 225), + (143, 193, 219), (161, 186, 214), (179, 185, 193), (199, 168, 158), + (225, 119, 116), (235, 102, 114), (230, 100, 108), (217, 112, 120), + (176, 143, 147), (141, 135, 141), (113, 145, 147), (95, 128, 153), + (103, 125, 146), (112, 129, 127), (122, 133, 106), (135, 148, 97), + (144, 134, 85), (163, 136, 81), (160, 143, 93), (198, 163, 73), + (220, 178, 61), (213, 162, 67), (201, 149, 50), (161, 119, 68), + (186, 108, 93), (166, 138, 99), (152, 149, 140), (156, 158, 164), + (142, 180, 213), (138, 181, 225), (117, 187, 236), (90, 177, 233), + (83, 153, 201), (111, 136, 164), (136, 113, 115), (187, 103, 92), + (236, 100, 67), (228, 75, 48), (247, 68, 36), (248, 69, 32), + (241, 64, 42), (233, 68, 41), (218, 64, 51), (136, 85, 64), + (96, 85, 68), (100, 103, 79), (91, 100, 77), (106, 99, 68), + (121, 113, 71), (136, 148, 79), (147, 152, 81), (158, 154, 91), + (191, 168, 101), (200, 179, 97), (190, 173, 101), (185, 175, 112), + (177, 194, 115), (172, 183, 132), (175, 191, 149), (149, 177, 132), + (136, 156, 131), (125, 139, 122), (107, 132, 119), (97, 119, 102), + (89, 109, 92), (84, 92, 72), (75, 75, 66), (79, 80, 73), + (76, 91, 73), (77, 106, 93), (76, 101, 107), (92, 121, 107), + (98, 125, 119), (112, 148, 137), (139, 170, 156), (150, 187, 213), + (144, 193, 230), (145, 192, 228), (146, 191, 222), (167, 180, 181), + (158, 185, 154), (157, 177, 121), (155, 160, 89), (158, 168, 78), + (172, 175, 93), (186, 158, 73), (186, 158, 73), (181, 153, 84), + (151, 157, 88), (133, 154, 91), (130, 151, 99), (132, 147, 98), + (126, 139, 105), (123, 129, 103), (106, 111, 96), (84, 95, 105), + (74, 81, 89), (71, 64, 92), (77, 73, 81), (90, 101, 83), + (96, 100, 90), (105, 105, 97), (115, 114, 97), (117, 122, 95), + (134, 137, 83), (136, 138, 55), (150, 126, 52), (110, 118, 59), + (85, 107, 55), (89, 96, 60), (76, 76, 53), (68, 67, 37), + (72, 73, 59), (90, 87, 73), (115, 107, 86), (144, 110, 76), + (150, 121, 87), (152, 123, 95), (139, 140, 106), (132, 144, 123), + (141, 151, 150), (162, 158, 160), (169, 178, 175), (185, 199, 218), + (191, 205, 221), (185, 202, 221), (185, 195, 212), (189, 197, 144), + (194, 177, 136), (213, 196, 90), (220, 182, 64), (208, 164, 76), + (238, 106, 91), (236, 103, 85), (240, 88, 83), (239, 80, 72), + (239, 82, 57), (236, 68, 52), (246, 65, 43), (245, 63, 26), + (244, 67, 16), (244, 78, 17), (244, 82, 23), (243, 76, 23), + (247, 69, 28), (243, 74, 28), (244, 72, 44), (238, 86, 55), + (243, 75, 60), (225, 84, 71), (159, 92, 97), (124, 125, 103), + (113, 117, 105), (92, 113, 100), (95, 113, 101), (106, 111, 113), + (107, 115, 109), (110, 115, 99), (117, 123, 90), (119, 123, 75), + (134, 122, 81), (130, 128, 71), (132, 142, 75), (155, 155, 94), + (163, 164, 121), (160, 152, 148), (130, 165, 160), (107, 163, 204), + (94, 183, 235), (96, 188, 238), (106, 180, 234), (126, 172, 209) + ), + +// 23 white-ivy +((242, 242, 254), (208, 231, 197), (163, 197, 152), (141, 175, 118), + (107, 152, 73), (96, 147, 51), (79, 124, 45), (79, 107, 28), + (85, 107, 22), (96, 124, 39), (107, 147, 62), (113, 164, 96), + (135, 169, 135), (152, 203, 152), (178, 212, 178), (208, 231, 197), + (220, 242, 225), (212, 246, 246), (208, 237, 254), (197, 242, 254), + (169, 233, 225), (169, 220, 186), (152, 208, 163), (152, 203, 152), + (163, 186, 152), (146, 163, 158), (156, 156, 156), (144, 158, 158), + (135, 152, 124), (118, 152, 118), (101, 130, 113), (82, 82, 82), + (58, 32, 32), (56, 28, 28), (84, 84, 39), (96, 113, 33), + (107, 130, 22), (118, 152, 28), (141, 175, 34), (135, 175, 67), + (113, 164, 90), (118, 152, 101), (112, 141, 112), (101, 137, 112), + (101, 135, 101), (96, 130, 96), (84, 118, 84), (67, 113, 62), + (56, 107, 51), (56, 107, 45), (68, 102, 34), (73, 124, 51), + (79, 118, 79), (107, 141, 96), (130, 164, 124), (158, 180, 141), + (186, 186, 169), (214, 220, 208), (239, 239, 239), (246, 246, 246), + (254, 254, 254), (254, 254, 254), (242, 254, 254), (242, 248, 254), + (237, 242, 248), (231, 242, 242), (220, 237, 203), (214, 208, 118), + (163, 197, 56), (169, 163, 28), (147, 169, 50), (141, 158, 84), + (118, 164, 118), (113, 169, 118), (107, 158, 118), (73, 141, 101), + (45, 128, 56), (34, 85, 34), (28, 73, 28), (28, 77, 28), + (45, 90, 56), (84, 118, 84), (118, 152, 118), (152, 180, 152), + (175, 203, 175), (197, 231, 208), (208, 231, 254), (208, 231, 254), + (208, 220, 254), (206, 214, 197), (192, 169, 169), (171, 180, 175), + (174, 208, 174), (180, 209, 180), (197, 231, 191), (220, 237, 214), + (237, 242, 237), (246, 246, 246), (254, 254, 254), (254, 254, 254), + (254, 254, 254), (242, 254, 254), (242, 254, 254), (242, 248, 254), + (237, 237, 248), (225, 225, 225), (231, 163, 163), (150, 112, 112), + (96, 84, 79), (82, 82, 82), (56, 96, 56), (50, 92, 45), + (34, 85, 28), (39, 90, 39), (73, 115, 73), (124, 135, 101), + (158, 175, 129), (163, 186, 163), (186, 209, 186), (208, 214, 254), + (208, 225, 254), (208, 208, 254), (174, 208, 197), (152, 192, 152), + (118, 152, 118), (84, 124, 79), (62, 101, 56), (28, 73, 28), + (5, 51, 0), (34, 0, 0), (0, 52, 0), (0, 51, 0), + (0, 52, 0), (11, 62, 5), (28, 79, 22), (28, 73, 28), + (56, 83, 11), (68, 68, 0), (45, 51, 0), (73, 96, 28), + (84, 101, 33), (90, 102, 28), (79, 130, 51), (90, 143, 112), + (90, 175, 118), (152, 203, 152), (163, 209, 186), (186, 220, 254), + (208, 225, 254), (220, 220, 254), (220, 220, 254), (220, 225, 254), + (220, 231, 254), (220, 231, 254), (231, 231, 254), (231, 231, 254), + (231, 231, 254), (231, 242, 254), (220, 254, 254), (208, 254, 254), + (208, 254, 254), (197, 254, 254), (208, 254, 254), (220, 254, 254), + (231, 248, 254), (231, 237, 254), (231, 231, 254), (231, 231, 254), + (231, 231, 254), (231, 237, 254), (231, 242, 254), (231, 242, 254), + (231, 242, 254), (231, 242, 254), (231, 237, 254), (231, 231, 254), + (231, 231, 254), (220, 237, 254), (220, 237, 254), (197, 254, 254), + (163, 254, 254), (140, 191, 197), (152, 175, 152), (152, 158, 129), + (124, 130, 90), (107, 67, 62), (124, 34, 34), (137, 45, 45), + (153, 51, 51), (153, 51, 51), (175, 95, 67), (141, 141, 112), + (135, 152, 124), (141, 163, 135), (152, 186, 152), (152, 203, 152), + (152, 203, 152), (163, 208, 163), (191, 225, 191), (231, 231, 231), + (220, 231, 254), (220, 225, 254), (220, 225, 254), (231, 231, 254), + (242, 242, 254), (242, 242, 254), (242, 248, 254), (242, 254, 254), + (254, 254, 254), (254, 254, 254), (254, 254, 254), (242, 248, 254), + (242, 242, 254), (231, 242, 254), (231, 242, 254), (231, 242, 254), + (231, 242, 231), (231, 225, 175), (220, 214, 135), (254, 169, 140), + (208, 197, 118), (208, 191, 112), (163, 191, 107), (107, 152, 73), + (96, 147, 51), (90, 141, 51), (90, 135, 39), (85, 136, 51), + (96, 141, 45), (101, 147, 45), (118, 141, 62), (135, 129, 78), + (135, 158, 107), (146, 192, 101), (146, 197, 112), (152, 197, 135), + (152, 203, 152), (186, 214, 186), (208, 242, 231), (220, 237, 254), + (231, 242, 254), (242, 242, 254), (242, 242, 254), (242, 242, 254), + (242, 242, 254), (242, 248, 254), (231, 254, 254), (231, 254, 254), + (231, 242, 254), (237, 237, 248), (214, 237, 220), (186, 220, 180), + (152, 203, 152), (141, 192, 84), (118, 164, 45), (96, 124, 28) + ), + +// 24 summer-makeup +((238, 193, 141), (238, 192, 141), (238, 192, 141), (234, 193, 141), + (234, 193, 141), (234, 193, 141), (230, 193, 141), (230, 189, 141), + (226, 189, 141), (226, 193, 141), (234, 193, 141), (238, 197, 141), + (238, 201, 141), (234, 197, 150), (234, 193, 150), (234, 197, 150), + (230, 193, 150), (226, 189, 141), (222, 185, 132), (219, 177, 113), + (210, 144, 85), (219, 106, 75), (219, 95, 66), (190, 63, 37), + (150, 64, 28), (145, 47, 28), (133, 51, 37), (101, 43, 28), + (84, 51, 37), (80, 52, 37), (80, 56, 37), (80, 60, 47), + (89, 72, 56), (109, 84, 56), (125, 104, 66), (166, 107, 66), + (198, 136, 75), (219, 161, 94), (222, 180, 103), (226, 193, 122), + (226, 189, 122), (222, 180, 113), (219, 169, 103), (198, 140, 85), + (178, 115, 66), (158, 99, 56), (158, 88, 47), (158, 88, 56), + (166, 107, 56), (186, 119, 66), (202, 140, 94), (219, 173, 103), + (230, 180, 113), (230, 180, 122), (226, 180, 122), (219, 165, 113), + (202, 140, 94), (162, 103, 66), (125, 80, 56), (113, 72, 46), + (89, 60, 37), (76, 52, 37), (64, 48, 37), (52, 39, 28), + (40, 35, 28), (36, 36, 28), (32, 36, 37), (36, 36, 37), + (40, 35, 37), (48, 40, 37), (52, 39, 37), (48, 35, 37), + (52, 40, 37), (64, 48, 37), (72, 52, 37), (80, 60, 47), + (96, 68, 56), (97, 68, 56), (100, 68, 56), (97, 64, 56), + (84, 56, 56), (76, 48, 47), (68, 47, 47), (64, 48, 47), + (68, 48, 47), (76, 52, 47), (84, 60, 47), (101, 68, 56), + (117, 84, 65), (137, 88, 66), (166, 103, 66), (206, 136, 75), + (210, 157, 85), (222, 164, 94), (214, 156, 85), (202, 140, 85), + (186, 123, 66), (150, 103, 66), (121, 88, 56), (105, 76, 56), + (88, 60, 47), (76, 48, 47), (64, 48, 37), (56, 44, 37), + (60, 48, 47), (68, 48, 47), (85, 60, 47), (105, 80, 56), + (137, 88, 66), (154, 107, 75), (194, 140, 85), (214, 169, 113), + (219, 177, 122), (222, 180, 141), (137, 145, 151), (88, 104, 94), + (76, 68, 66), (81, 68, 65), (80, 64, 56), (76, 60, 56), + (80, 56, 47), (76, 52, 47), (76, 52, 56), (76, 52, 56), + (68, 52, 56), (56, 44, 56), (48, 39, 47), (48, 35, 47), + (48, 35, 37), (40, 35, 37), (39, 32, 28), (36, 32, 28), + (36, 32, 28), (36, 32, 28), (32, 32, 28), (31, 28, 28), + (28, 32, 28), (31, 32, 28), (24, 32, 28), (31, 28, 28), + (32, 28, 28), (35, 28, 37), (36, 32, 37), (36, 32, 37), + (40, 31, 28), (44, 35, 28), (52, 36, 28), (56, 39, 28), + (52, 35, 37), (60, 39, 37), (52, 40, 37), (48, 40, 37), + (48, 48, 37), (44, 40, 28), (44, 36, 28), (44, 36, 28), + (48, 35, 28), (56, 39, 28), (64, 39, 28), (88, 51, 37), + (117, 72, 46), (146, 80, 56), (166, 111, 56), (198, 136, 75), + (214, 164, 94), (219, 177, 113), (222, 185, 132), (226, 184, 141), + (226, 189, 141), (230, 193, 131), (230, 197, 131), (234, 192, 131), + (230, 184, 131), (222, 185, 132), (230, 184, 131), (230, 184, 131), + (226, 189, 132), (222, 189, 132), (234, 188, 131), (234, 184, 131), + (230, 184, 122), (222, 180, 113), (219, 177, 103), (210, 148, 85), + (194, 132, 66), (190, 106, 56), (170, 95, 56), (174, 91, 47), + (194, 87, 28), (194, 72, 28), (154, 76, 37), (129, 64, 37), + (93, 51, 37), (72, 43, 37), (68, 43, 37), (64, 48, 37), + (60, 52, 37), (68, 52, 37), (89, 64, 47), (113, 84, 56), + (145, 100, 66), (182, 127, 85), (210, 165, 94), (219, 181, 103), + (234, 193, 112), (234, 193, 122), (234, 188, 122), (222, 176, 113), + (202, 148, 94), (186, 119, 75), (170, 103, 66), (146, 92, 75), + (137, 92, 75), (149, 104, 75), (174, 111, 75), (186, 127, 85), + (202, 144, 94), (222, 169, 122), (226, 180, 141), (234, 193, 150), + (234, 201, 160), (234, 205, 169), (234, 201, 160), (230, 197, 150), + (230, 189, 141), (226, 180, 122), (214, 161, 103), (186, 135, 85), + (153, 104, 84), (129, 108, 84), (121, 92, 75), (121, 80, 65), + (113, 76, 56), (121, 72, 56), (117, 72, 46), (125, 68, 47), + (125, 68, 56), (109, 64, 56), (109, 60, 46), (88, 55, 47), + (84, 43, 47), (72, 43, 47), (60, 44, 37), (52, 44, 37), + (44, 40, 37), (40, 35, 28), (36, 36, 28), (36, 36, 37), + (40, 35, 37), (44, 44, 37), (52, 48, 47), (80, 60, 47), + (109, 68, 46), (129, 84, 47), (158, 99, 66), (186, 119, 75) + ), + +// 25 glow-buzz +((182, 91, 37), (141, 84, 37), (121, 68, 46), (93, 60, 46), + (76, 48, 37), (72, 43, 37), (80, 48, 47), (101, 60, 46), + (137, 68, 47), (162, 76, 47), (178, 95, 56), (182, 102, 56), + (182, 99, 47), (182, 87, 47), (194, 84, 56), (198, 84, 56), + (190, 87, 66), (174, 87, 56), (146, 76, 56), (117, 60, 47), + (88, 51, 37), (64, 39, 28), (52, 27, 28), (44, 24, 28), + (40, 24, 28), (40, 23, 28), (40, 23, 28), (40, 23, 28), + (44, 27, 28), (52, 31, 28), (60, 39, 28), (84, 47, 37), + (109, 51, 47), (133, 59, 56), (162, 64, 56), (178, 68, 47), + (190, 68, 56), (198, 72, 47), (198, 72, 47), (198, 72, 47), + (190, 68, 47), (178, 68, 47), (166, 68, 47), (149, 71, 37), + (129, 64, 37), (100, 60, 28), (92, 47, 37), (76, 43, 37), + (72, 48, 37), (76, 52, 47), (100, 56, 56), (133, 76, 56), + (154, 80, 47), (178, 87, 47), (178, 80, 47), (158, 80, 47), + (141, 68, 47), (113, 60, 46), (96, 56, 47), (84, 47, 56), + (84, 48, 47), (92, 55, 47), (100, 51, 46), (96, 51, 47), + (92, 55, 47), (84, 56, 47), (93, 60, 47), (84, 52, 37), + (76, 52, 28), (72, 40, 18), (64, 35, 28), (56, 31, 28), + (48, 32, 37), (44, 35, 37), (48, 31, 37), (56, 35, 37), + (48, 36, 37), (56, 35, 37), (64, 35, 37), (60, 39, 47), + (60, 35, 47), (56, 35, 37), (52, 35, 28), (48, 31, 28), + (48, 31, 28), (44, 31, 28), (44, 31, 28), (44, 28, 28), + (40, 27, 28), (44, 28, 28), (56, 31, 37), (64, 43, 47), + (80, 43, 56), (100, 60, 56), (137, 76, 65), (178, 102, 56), + (210, 123, 66), (198, 144, 75), (214, 148, 75), (219, 157, 75), + (222, 160, 75), (222, 168, 84), (250, 179, 74), (250, 191, 65), + (246, 183, 56), (242, 183, 65), (238, 168, 56), (230, 152, 47), + (242, 159, 56), (219, 145, 75), (214, 128, 122), (222, 176, 169), + (190, 169, 122), (254, 212, 121), (250, 225, 150), (254, 212, 93), + (254, 221, 84), (250, 213, 93), (254, 217, 84), (250, 200, 74), + (254, 212, 84), (246, 208, 74), (254, 208, 74), (254, 191, 56), + (254, 178, 46), (234, 167, 46), (222, 149, 47), (210, 145, 56), + (206, 127, 56), (194, 106, 56), (190, 106, 56), (198, 91, 56), + (190, 91, 47), (186, 106, 56), (198, 119, 47), (219, 132, 56), + (230, 119, 56), (230, 110, 47), (230, 123, 47), (234, 148, 56), + (250, 166, 56), (250, 175, 56), (250, 179, 56), (250, 179, 56), + (238, 171, 56), (219, 153, 66), (230, 152, 56), (210, 140, 47), + (194, 106, 47), (174, 83, 37), (162, 72, 37), (154, 72, 47), + (166, 76, 47), (170, 84, 47), (170, 91, 47), (182, 95, 47), + (186, 84, 56), (198, 87, 56), (210, 102, 56), (226, 110, 56), + (226, 98, 47), (226, 102, 56), (222, 87, 56), (214, 83, 56), + (202, 84, 56), (194, 84, 56), (182, 80, 56), (162, 72, 56), + (146, 76, 47), (137, 64, 47), (125, 64, 47), (109, 56, 56), + (113, 56, 56), (129, 64, 56), (146, 76, 56), (166, 72, 56), + (182, 76, 56), (194, 72, 47), (182, 80, 56), (186, 72, 37), + (186, 59, 28), (194, 72, 37), (206, 72, 47), (206, 83, 37), + (206, 80, 47), (210, 87, 47), (219, 83, 47), (210, 80, 56), + (198, 76, 56), (174, 72, 56), (146, 60, 47), (129, 60, 37), + (109, 51, 28), (92, 47, 28), (101, 51, 28), (121, 51, 37), + (141, 55, 37), (158, 60, 37), (170, 56, 47), (174, 64, 47), + (174, 68, 47), (178, 64, 47), (182, 63, 47), (190, 80, 47), + (202, 80, 47), (202, 87, 47), (198, 83, 47), (182, 83, 47), + (178, 80, 47), (150, 72, 47), (133, 64, 47), (113, 60, 46), + (101, 51, 37), (76, 39, 37), (60, 31, 28), (44, 27, 28), + (40, 23, 28), (39, 19, 18), (36, 16, 18), (36, 16, 18), + (35, 20, 18), (35, 20, 28), (35, 24, 28), (36, 24, 18), + (35, 20, 9), (36, 20, 9), (36, 20, 18), (36, 24, 18), + (44, 31, 18), (56, 35, 28), (72, 43, 37), (96, 43, 37), + (109, 51, 46), (117, 60, 46), (129, 72, 47), (125, 68, 37), + (109, 60, 37), (96, 47, 37), (80, 39, 37), (60, 35, 37), + (48, 27, 28), (44, 27, 18), (40, 23, 18), (40, 23, 18), + (39, 24, 28), (36, 24, 28), (35, 20, 28), (35, 16, 28), + (35, 20, 37), (40, 28, 37), (56, 40, 37), (72, 43, 47), + (97, 52, 46), (113, 51, 47), (162, 60, 47), (186, 68, 47) + ), + +// 26 deep-water +((24, 20, 18), (24, 24, 28), (28, 28, 47), (27, 24, 66), + (24, 28, 75), (23, 28, 75), (23, 28, 66), (19, 28, 47), + (20, 24, 28), (20, 24, 18), (20, 24, 18), (24, 28, 28), + (28, 32, 56), (28, 36, 66), (28, 36, 85), (36, 52, 103), + (48, 64, 113), (48, 56, 122), (44, 64, 122), (52, 64, 132), + (52, 64, 113), (68, 60, 113), (68, 64, 103), (56, 77, 103), + (56, 68, 94), (52, 60, 94), (52, 52, 94), (36, 52, 94), + (36, 52, 85), (36, 40, 66), (32, 32, 56), (24, 24, 28), + (16, 16, 18), (11, 8, 18), (11, 8, 9), (8, 4, 0), + (8, 4, 0), (11, 4, 9), (11, 8, 18), (11, 8, 28), + (16, 16, 28), (19, 28, 37), (24, 32, 56), (24, 40, 75), + (28, 48, 94), (36, 64, 103), (40, 64, 113), (44, 68, 122), + (44, 68, 113), (40, 64, 113), (36, 60, 113), (36, 52, 103), + (28, 48, 94), (32, 40, 75), (36, 36, 66), (32, 36, 56), + (24, 32, 47), (19, 32, 37), (20, 32, 28), (11, 24, 18), + (8, 20, 18), (8, 16, 18), (12, 16, 18), (12, 16, 18), + (15, 20, 18), (16, 20, 28), (20, 28, 37), (23, 32, 47), + (27, 32, 56), (28, 28, 47), (27, 28, 37), (23, 20, 28), + (19, 16, 18), (15, 16, 18), (16, 16, 9), (12, 12, 0), + (8, 12, 0), (8, 8, 0), (8, 8, 9), (8, 8, 9), + (8, 8, 9), (8, 12, 9), (11, 12, 18), (11, 12, 18), + (11, 12, 18), (11, 12, 18), (12, 16, 18), (16, 24, 18), + (24, 32, 18), (28, 44, 37), (40, 52, 37), (48, 56, 66), + (48, 56, 75), (52, 68, 85), (56, 77, 113), (73, 97, 132), + (84, 109, 160), (100, 113, 160), (100, 117, 169), (101, 117, 160), + (104, 129, 151), (113, 129, 151), (104, 125, 170), (104, 125, 170), + (124, 137, 198), (104, 116, 170), (88, 100, 132), (68, 77, 103), + (52, 64, 94), (40, 56, 85), (28, 44, 75), (28, 36, 56), + (24, 32, 47), (24, 28, 28), (24, 24, 18), (20, 24, 18), + (15, 20, 18), (12, 16, 18), (12, 16, 18), (12, 16, 9), + (12, 12, 9), (12, 12, 9), (11, 12, 9), (11, 16, 9), + (12, 16, 9), (16, 16, 9), (16, 20, 0), (16, 24, 0), + (20, 20, 9), (24, 20, 18), (28, 24, 18), (32, 32, 28), + (32, 36, 47), (32, 40, 56), (32, 36, 66), (28, 36, 75), + (28, 36, 75), (28, 36, 75), (28, 36, 75), (28, 36, 66), + (24, 36, 66), (24, 36, 75), (20, 36, 85), (20, 36, 85), + (24, 36, 75), (24, 32, 66), (24, 32, 56), (23, 24, 28), + (20, 20, 18), (16, 16, 9), (16, 16, 9), (16, 20, 9), + (16, 20, 9), (19, 20, 9), (20, 24, 18), (20, 24, 18), + (20, 24, 18), (16, 16, 18), (15, 16, 18), (12, 12, 18), + (11, 12, 9), (11, 12, 9), (8, 12, 9), (12, 8, 9), + (8, 8, 9), (8, 8, 9), (4, 4, 9), (4, 4, 9), + (7, 0, 18), (3, 4, 18), (3, 8, 18), (3, 4, 9), + (4, 4, 9), (8, 8, 9), (8, 8, 9), (12, 12, 9), + (16, 12, 9), (16, 12, 9), (16, 16, 9), (19, 20, 9), + (20, 28, 18), (24, 32, 28), (32, 40, 37), (36, 44, 56), + (56, 68, 75), (84, 101, 113), (117, 125, 151), (149, 165, 188), + (157, 177, 216), (181, 189, 235), (193, 206, 216), (198, 202, 198), + (149, 177, 197), (141, 161, 188), (108, 146, 150), (92, 108, 141), + (68, 73, 113), (56, 64, 103), (48, 56, 94), (36, 52, 85), + (28, 40, 85), (32, 40, 85), (28, 36, 85), (32, 44, 85), + (36, 56, 94), (48, 68, 113), (52, 73, 132), (52, 73, 132), + (48, 73, 141), (56, 72, 141), (64, 81, 141), (73, 93, 141), + (76, 92, 132), (60, 77, 132), (56, 64, 132), (48, 48, 113), + (36, 40, 85), (32, 36, 75), (31, 32, 56), (23, 28, 37), + (19, 20, 28), (11, 20, 18), (7, 16, 9), (7, 16, 9), + (7, 12, 9), (7, 12, 9), (7, 8, 9), (4, 8, 0), + (4, 4, 0), (4, 4, 0), (4, 4, 0), (4, 4, 0), + (7, 8, 9), (8, 12, 9), (8, 16, 9), (11, 16, 18), + (12, 20, 18), (19, 24, 28), (20, 32, 47), (20, 36, 66), + (20, 36, 85), (20, 36, 85), (24, 32, 85), (24, 32, 85), + (23, 28, 85), (19, 28, 85), (20, 32, 85), (23, 32, 85), + (24, 32, 85), (31, 32, 94), (28, 36, 85), (24, 36, 85), + (27, 28, 66), (24, 28, 47), (23, 24, 28), (15, 16, 18) + ), + +// 27 afternoon-beach +((182, 162, 170), (190, 157, 132), (178, 136, 113), (174, 107, 75), + (162, 124, 85), (190, 160, 94), (219, 197, 103), (230, 210, 113), + (254, 245, 131), (254, 254, 159), (254, 254, 178), (250, 254, 206), + (254, 254, 216), (254, 254, 197), (250, 254, 169), (234, 222, 141), + (219, 193, 160), (202, 189, 170), (190, 185, 169), (181, 169, 179), + (181, 157, 179), (169, 153, 188), (173, 157, 198), (161, 149, 188), + (165, 149, 179), (162, 146, 170), (145, 141, 151), (108, 108, 141), + (112, 112, 103), (129, 129, 103), (149, 124, 103), (173, 149, 94), + (206, 149, 94), (234, 168, 103), (250, 192, 112), (250, 200, 112), + (242, 217, 122), (242, 229, 122), (254, 237, 112), (246, 229, 112), + (246, 209, 103), (254, 204, 93), (250, 196, 93), (238, 152, 94), + (194, 127, 75), (186, 111, 66), (190, 127, 75), (222, 168, 94), + (254, 204, 121), (254, 245, 169), (250, 254, 206), (250, 254, 225), + (222, 213, 225), (210, 193, 207), (238, 197, 169), (250, 233, 150), + (254, 249, 159), (254, 254, 169), (254, 254, 197), (250, 254, 216), + (254, 254, 197), (254, 254, 169), (254, 254, 159), (254, 241, 140), + (254, 221, 121), (250, 209, 112), (246, 209, 112), (254, 217, 112), + (254, 221, 121), (250, 225, 140), (238, 197, 169), (226, 185, 207), + (206, 185, 207), (205, 177, 207), (201, 185, 216), (189, 181, 226), + (189, 181, 216), (177, 165, 216), (173, 165, 207), (185, 169, 188), + (202, 165, 188), (219, 181, 160), (230, 184, 141), (234, 180, 131), + (230, 180, 122), (210, 181, 141), (210, 169, 151), (202, 161, 160), + (174, 154, 170), (177, 149, 179), (170, 150, 170), (169, 153, 179), + (166, 162, 170), (161, 165, 151), (174, 162, 151), (178, 157, 141), + (170, 157, 141), (158, 145, 113), (141, 116, 94), (125, 96, 75), + (97, 92, 47), (77, 77, 47), (73, 73, 47), (64, 68, 47), + (68, 64, 47), (64, 60, 47), (60, 52, 47), (56, 48, 47), + (48, 36, 47), (48, 40, 37), (52, 40, 37), (52, 39, 37), + (52, 39, 37), (64, 39, 37), (64, 44, 37), (72, 56, 37), + (64, 60, 37), (68, 60, 37), (84, 56, 56), (117, 76, 65), + (146, 88, 75), (145, 92, 75), (149, 99, 75), (146, 108, 85), + (145, 104, 103), (162, 108, 104), (158, 116, 94), (169, 115, 104), + (157, 129, 94), (162, 153, 103), (182, 186, 113), (222, 214, 122), + (246, 246, 131), (250, 254, 169), (254, 254, 197), (254, 254, 216), + (254, 254, 225), (234, 226, 254), (209, 201, 226), (206, 193, 207), + (210, 177, 198), (181, 165, 179), (162, 141, 160), (145, 121, 122), + (145, 100, 113), (121, 96, 94), (104, 93, 94), (85, 80, 75), + (89, 85, 75), (97, 93, 84), (100, 96, 94), (101, 105, 84), + (121, 121, 103), (137, 129, 113), (150, 150, 103), (182, 152, 103), + (206, 177, 113), (230, 197, 94), (238, 180, 84), (238, 168, 93), + (226, 172, 84), (189, 152, 84), (182, 112, 66), (166, 99, 66), + (133, 80, 56), (88, 59, 47), (68, 48, 47), (64, 44, 47), + (52, 39, 37), (48, 40, 28), (48, 35, 28), (52, 39, 28), + (48, 44, 37), (56, 48, 37), (56, 48, 47), (68, 52, 56), + (76, 64, 56), (85, 76, 65), (113, 88, 75), (117, 92, 84), + (125, 96, 84), (125, 96, 84), (125, 92, 84), (133, 88, 84), + (117, 88, 75), (92, 72, 56), (81, 68, 56), (72, 68, 56), + (68, 68, 56), (76, 76, 66), (81, 81, 75), (85, 77, 75), + (85, 68, 65), (72, 56, 66), (68, 64, 56), (64, 60, 66), + (64, 56, 56), (60, 48, 56), (60, 52, 56), (60, 56, 56), + (60, 56, 47), (68, 60, 47), (68, 64, 56), (73, 73, 56), + (81, 81, 66), (85, 96, 75), (97, 105, 75), (105, 109, 56), + (125, 117, 66), (125, 129, 66), (146, 141, 85), (170, 169, 85), + (198, 202, 113), (234, 205, 112), (250, 192, 112), (238, 172, 103), + (234, 152, 94), (190, 119, 66), (174, 106, 56), (166, 111, 66), + (141, 108, 75), (125, 112, 85), (108, 113, 103), (113, 129, 103), + (133, 125, 122), (182, 145, 160), (202, 161, 179), (210, 193, 179), + (254, 241, 197), (254, 254, 216), (254, 254, 216), (254, 254, 197), + (254, 254, 169), (254, 254, 159), (254, 245, 150), (254, 245, 140), + (250, 229, 131), (226, 206, 122), (182, 182, 113), (162, 141, 94), + (149, 128, 65), (145, 116, 75), (137, 100, 84), (125, 108, 85), + (129, 96, 84), (125, 112, 75), (117, 109, 84), (105, 109, 75), + (97, 109, 75), (101, 105, 75), (121, 112, 66), (141, 112, 75), + (149, 116, 85), (162, 141, 103), (194, 169, 122), (218, 201, 132) + ), + +// 28 dim-beach +((27, 28, 28), (48, 36, 37), (68, 48, 37), (72, 60, 37), + (68, 68, 37), (56, 60, 37), (44, 44, 28), (36, 36, 28), + (32, 32, 28), (28, 32, 28), (28, 28, 28), (28, 28, 28), + (28, 32, 28), (28, 36, 28), (32, 40, 37), (48, 60, 56), + (56, 73, 66), (60, 81, 75), (80, 93, 75), (92, 137, 141), + (100, 170, 160), (133, 185, 188), (153, 194, 188), (141, 182, 169), + (117, 162, 131), (109, 145, 122), (85, 113, 84), (69, 85, 56), + (64, 68, 47), (56, 56, 37), (40, 40, 28), (32, 36, 28), + (31, 32, 28), (28, 32, 28), (28, 32, 28), (32, 32, 28), + (36, 36, 28), (52, 44, 28), (72, 56, 18), (97, 60, 28), + (121, 84, 28), (129, 112, 37), (150, 107, 37), (141, 100, 37), + (129, 84, 28), (109, 72, 28), (64, 73, 28), (48, 44, 28), + (36, 40, 18), (36, 40, 18), (52, 56, 37), (64, 64, 47), + (68, 76, 56), (97, 88, 56), (109, 100, 56), (109, 100, 56), + (93, 97, 66), (68, 76, 66), (48, 76, 75), (48, 56, 56), + (40, 36, 37), (28, 32, 37), (28, 32, 37), (27, 32, 37), + (28, 32, 37), (32, 32, 28), (32, 32, 28), (28, 32, 28), + (28, 32, 28), (28, 28, 28), (27, 28, 28), (24, 28, 18), + (24, 28, 18), (23, 28, 18), (20, 28, 18), (20, 28, 28), + (19, 28, 28), (19, 28, 28), (16, 24, 28), (19, 28, 28), + (20, 28, 28), (24, 32, 28), (24, 36, 28), (24, 40, 28), + (24, 36, 37), (24, 32, 37), (32, 36, 37), (52, 60, 47), + (68, 77, 47), (105, 88, 46), (133, 116, 37), (166, 140, 37), + (182, 153, 103), (214, 206, 132), (222, 218, 169), (230, 234, 188), + (242, 242, 197), (242, 241, 197), (230, 226, 178), (246, 196, 93), + (242, 184, 74), (226, 156, 56), (210, 164, 56), (222, 160, 56), + (214, 156, 47), (222, 163, 37), (222, 152, 37), (214, 157, 37), + (186, 123, 37), (182, 114, 47), (174, 111, 47), (149, 99, 56), + (121, 92, 56), (101, 113, 75), (125, 170, 122), (154, 174, 160), + (185, 202, 188), (198, 218, 198), (169, 198, 188), (141, 178, 169), + (104, 154, 150), (52, 109, 151), (44, 89, 122), (40, 56, 75), + (20, 48, 56), (24, 36, 37), (24, 32, 28), (24, 32, 28), + (24, 32, 28), (24, 32, 28), (27, 32, 28), (28, 32, 28), + (28, 36, 28), (32, 40, 28), (40, 56, 47), (48, 60, 56), + (48, 64, 56), (56, 64, 56), (56, 64, 56), (80, 68, 56), + (92, 60, 46), (113, 96, 47), (150, 111, 56), (153, 128, 66), + (170, 166, 132), (210, 202, 160), (226, 226, 188), (246, 242, 197), + (250, 241, 206), (234, 230, 197), (226, 222, 188), (194, 189, 141), + (153, 145, 103), (105, 101, 66), (73, 77, 56), (60, 64, 47), + (44, 40, 37), (32, 32, 37), (27, 28, 37), (24, 24, 37), + (24, 28, 28), (24, 28, 28), (24, 28, 28), (27, 32, 28), + (31, 32, 28), (32, 36, 28), (40, 48, 37), (48, 64, 47), + (52, 73, 47), (56, 72, 56), (60, 68, 47), (68, 76, 56), + (93, 85, 47), (113, 96, 47), (105, 80, 47), (101, 72, 46), + (104, 72, 56), (97, 76, 46), (92, 68, 37), (89, 76, 37), + (88, 72, 47), (68, 73, 47), (48, 64, 37), (36, 40, 28), + (32, 36, 28), (28, 36, 28), (28, 32, 28), (28, 32, 18), + (32, 28, 18), (28, 28, 28), (28, 28, 28), (24, 28, 28), + (23, 28, 28), (24, 28, 28), (24, 28, 28), (24, 28, 28), + (24, 32, 28), (27, 36, 37), (28, 36, 37), (32, 60, 56), + (48, 64, 56), (48, 68, 56), (52, 73, 56), (52, 72, 56), + (48, 64, 56), (48, 60, 56), (52, 56, 47), (44, 40, 37), + (36, 36, 28), (36, 32, 28), (36, 36, 28), (44, 52, 37), + (60, 60, 47), (60, 64, 47), (68, 73, 56), (77, 84, 56), + (93, 97, 56), (93, 101, 56), (97, 101, 66), (97, 97, 56), + (97, 101, 66), (97, 109, 66), (88, 137, 112), (97, 154, 141), + (108, 158, 141), (116, 166, 160), (125, 182, 160), (125, 178, 141), + (141, 182, 132), (166, 157, 113), (174, 136, 75), (198, 140, 56), + (210, 149, 56), (219, 172, 66), (210, 206, 151), (210, 222, 198), + (214, 230, 207), (222, 230, 207), (226, 226, 197), (206, 206, 151), + (166, 162, 122), (125, 125, 75), (89, 101, 66), (60, 73, 47), + (40, 44, 28), (28, 32, 18), (24, 32, 18), (20, 32, 18), + (24, 32, 28), (28, 36, 37), (36, 40, 47), (36, 52, 66), + (40, 80, 85), (56, 85, 84), (88, 142, 141), (129, 182, 160) + ), + +// 29 cloudy-brick +((202, 206, 188), (178, 186, 160), (153, 157, 141), (129, 141, 122), + (112, 129, 113), (96, 125, 122), (104, 146, 141), (112, 158, 169), + (137, 181, 188), (157, 222, 225), (153, 218, 235), (132, 210, 235), + (100, 198, 216), (84, 154, 188), (60, 117, 122), (48, 80, 94), + (40, 60, 75), (28, 48, 56), (40, 44, 37), (24, 32, 28), + (48, 56, 37), (80, 35, 28), (76, 35, 37), (68, 35, 37), + (68, 39, 28), (68, 39, 37), (68, 72, 56), (56, 68, 47), + (68, 72, 56), (48, 72, 47), (60, 72, 66), (77, 97, 85), + (84, 113, 103), (100, 133, 132), (133, 162, 160), (173, 190, 188), + (189, 210, 198), (193, 218, 207), (193, 218, 216), (193, 218, 216), + (173, 210, 225), (132, 201, 225), (104, 161, 188), (84, 141, 169), + (80, 121, 141), (76, 109, 122), (93, 104, 84), (105, 92, 66), + (129, 80, 56), (145, 95, 28), (153, 95, 28), (174, 111, 66), + (226, 167, 84), (234, 155, 65), (194, 119, 37), (178, 63, 9), + (170, 33, 9), (129, 38, 18), (125, 63, 37), (153, 76, 28), + (170, 107, 56), (246, 188, 74), (246, 196, 103), (250, 217, 159), + (226, 213, 188), (230, 234, 216), (230, 237, 225), (230, 246, 235), + (218, 246, 244), (218, 242, 235), (209, 238, 225), (210, 230, 225), + (206, 222, 226), (197, 218, 216), (189, 218, 207), (185, 210, 207), + (153, 169, 188), (105, 150, 160), (80, 125, 141), (68, 101, 122), + (56, 93, 113), (52, 97, 122), (68, 105, 113), (92, 129, 132), + (129, 150, 141), (185, 177, 141), (242, 196, 122), (202, 165, 132), + (182, 115, 75), (170, 59, 28), (153, 59, 18), (125, 42, 28), + (113, 43, 28), (92, 35, 37), (80, 39, 37), (64, 64, 66), + (52, 76, 85), (56, 89, 84), (56, 81, 85), (64, 85, 94), + (73, 97, 94), (85, 109, 94), (100, 109, 94), (121, 145, 113), + (129, 166, 141), (146, 186, 169), (177, 210, 197), (189, 218, 207), + (197, 218, 226), (197, 222, 226), (206, 222, 226), (217, 226, 225), + (222, 234, 225), (218, 234, 226), (214, 234, 216), (201, 234, 216), + (201, 230, 216), (197, 230, 225), (197, 230, 225), (193, 230, 225), + (193, 230, 226), (193, 230, 226), (189, 242, 235), (201, 242, 244), + (213, 237, 244), (205, 234, 235), (201, 238, 235), (201, 234, 235), + (193, 230, 235), (193, 230, 226), (193, 226, 226), (189, 226, 225), + (181, 230, 225), (161, 198, 207), (108, 166, 178), (92, 153, 160), + (73, 126, 150), (88, 137, 150), (89, 142, 151), (125, 162, 151), + (149, 182, 170), (181, 202, 188), (189, 218, 207), (194, 226, 216), + (201, 230, 225), (205, 230, 225), (213, 234, 225), (214, 234, 225), + (214, 230, 216), (206, 230, 207), (194, 218, 198), (166, 190, 170), + (145, 149, 132), (121, 109, 84), (117, 104, 75), (141, 113, 103), + (166, 141, 132), (182, 174, 160), (206, 214, 179), (218, 238, 207), + (246, 249, 225), (250, 254, 235), (254, 254, 244), (254, 254, 254), + (254, 254, 254), (250, 254, 254), (254, 254, 254), (254, 254, 244), + (250, 250, 244), (246, 250, 244), (242, 250, 244), (230, 245, 235), + (226, 230, 225), (214, 222, 216), (226, 238, 216), (210, 222, 216), + (206, 222, 216), (201, 230, 226), (205, 226, 216), (206, 222, 207), + (198, 222, 207), (202, 222, 207), (201, 226, 216), (197, 222, 216), + (198, 222, 207), (198, 222, 198), (202, 210, 179), (174, 198, 169), + (153, 185, 188), (157, 190, 179), (181, 202, 188), (198, 210, 198), + (202, 210, 198), (193, 218, 207), (198, 226, 207), (206, 230, 207), + (206, 230, 207), (202, 230, 216), (202, 226, 216), (197, 218, 216), + (193, 218, 226), (185, 221, 235), (185, 230, 244), (181, 234, 244), + (173, 234, 244), (173, 230, 244), (116, 207, 235), (76, 194, 216), + (72, 185, 206), (60, 170, 207), (76, 153, 169), (68, 121, 122), + (76, 105, 94), (60, 85, 75), (73, 81, 75), (77, 77, 56), + (76, 68, 66), (73, 89, 85), (97, 80, 65), (80, 64, 47), + (96, 43, 37), (125, 38, 28), (125, 42, 28), (100, 47, 47), + (92, 72, 75), (68, 81, 85), (68, 85, 94), (84, 93, 103), + (72, 113, 122), (100, 149, 141), (133, 170, 169), (185, 202, 207), + (206, 222, 216), (226, 234, 225), (238, 250, 244), (246, 254, 244), + (250, 254, 244), (250, 250, 244), (250, 254, 244), (250, 254, 244), + (254, 254, 244), (250, 254, 235), (250, 254, 235), (250, 254, 225), + (254, 254, 216), (250, 249, 216), (210, 222, 207), (218, 181, 169), + (214, 185, 150), (182, 116, 103), (129, 120, 56), (129, 91, 56), + (125, 88, 65), (105, 88, 84), (129, 129, 113), (149, 161, 160) + ), + +// 30 burning-wood +((80, 35, 28), (92, 39, 28), (97, 39, 28), (96, 39, 37), + (97, 39, 28), (80, 43, 37), (68, 43, 37), (84, 39, 37), + (76, 43, 47), (72, 48, 56), (60, 43, 47), (44, 44, 47), + (36, 32, 37), (31, 28, 37), (27, 28, 37), (28, 32, 37), + (40, 28, 37), (48, 32, 37), (52, 31, 37), (56, 27, 28), + (68, 35, 28), (84, 35, 28), (96, 30, 28), (104, 34, 18), + (105, 30, 18), (97, 34, 18), (88, 34, 18), (76, 35, 28), + (68, 39, 28), (64, 43, 18), (60, 48, 37), (52, 52, 37), + (48, 44, 37), (32, 40, 28), (32, 32, 28), (27, 32, 28), + (28, 28, 28), (28, 28, 18), (31, 28, 18), (31, 28, 18), + (35, 28, 18), (36, 32, 18), (52, 35, 18), (56, 31, 18), + (76, 31, 18), (96, 30, 18), (113, 30, 18), (133, 26, 18), + (145, 26, 18), (154, 22, 19), (162, 22, 18), (174, 25, 0), + (178, 25, 0), (178, 46, 9), (190, 87, 18), (214, 105, 18), + (219, 97, 0), (198, 87, 18), (178, 72, 9), (162, 37, 0), + (158, 22, 0), (158, 22, 9), (154, 22, 0), (146, 22, 0), + (146, 26, 9), (137, 26, 9), (117, 30, 9), (105, 30, 18), + (92, 23, 18), (88, 23, 28), (92, 39, 28), (88, 39, 28), + (80, 52, 47), (72, 56, 56), (84, 68, 65), (73, 73, 75), + (64, 60, 56), (52, 56, 56), (36, 52, 47), (32, 36, 37), + (36, 32, 28), (40, 31, 28), (52, 31, 28), (48, 31, 18), + (60, 27, 18), (76, 31, 18), (88, 31, 18), (100, 30, 9), + (113, 34, 9), (121, 30, 9), (133, 30, 18), (125, 39, 18), + (121, 31, 28), (121, 38, 28), (109, 35, 37), (109, 34, 28), + (105, 31, 28), (101, 34, 28), (84, 35, 37), (72, 31, 37), + (68, 27, 37), (56, 27, 28), (48, 23, 28), (40, 24, 28), + (36, 27, 28), (35, 28, 28), (35, 28, 28), (36, 32, 18), + (48, 31, 18), (80, 43, 18), (101, 64, 28), (141, 76, 28), + (182, 95, 28), (214, 123, 37), (234, 163, 56), (234, 176, 84), + (234, 176, 75), (222, 157, 47), (222, 131, 47), (210, 110, 28), + (222, 79, 37), (194, 38, 18), (202, 14, 9), (206, 26, 19), + (186, 30, 9), (182, 30, 9), (186, 72, 9), (174, 83, 9), + (161, 79, 18), (141, 59, 9), (129, 64, 28), (121, 76, 47), + (121, 63, 56), (133, 46, 37), (125, 47, 28), (129, 43, 28), + (121, 47, 28), (113, 47, 28), (125, 47, 18), (121, 47, 28), + (109, 47, 18), (100, 43, 28), (92, 39, 28), (76, 31, 28), + (56, 31, 28), (48, 31, 37), (40, 27, 28), (35, 28, 28), + (32, 28, 28), (36, 31, 28), (44, 36, 28), (56, 35, 28), + (68, 35, 28), (76, 35, 37), (80, 47, 28), (88, 39, 28), + (88, 43, 37), (101, 43, 28), (105, 39, 28), (109, 43, 28), + (109, 60, 46), (97, 72, 56), (105, 88, 75), (113, 104, 84), + (133, 100, 94), (165, 91, 56), (165, 87, 47), (162, 71, 37), + (166, 59, 28), (162, 63, 18), (149, 64, 18), (150, 59, 18), + (146, 60, 9), (141, 33, 0), (129, 59, 0), (121, 59, 18), + (133, 64, 18), (149, 64, 28), (154, 80, 37), (174, 83, 18), + (182, 91, 18), (198, 96, 18), (202, 110, 28), (202, 106, 37), + (202, 106, 37), (198, 95, 47), (178, 86, 28), (133, 68, 28), + (113, 59, 28), (92, 43, 18), (76, 35, 28), (60, 35, 28), + (56, 31, 28), (64, 31, 28), (68, 27, 28), (72, 31, 28), + (76, 31, 28), (76, 35, 28), (80, 39, 18), (84, 31, 28), + (85, 35, 18), (81, 31, 18), (80, 31, 18), (76, 27, 28), + (64, 27, 28), (56, 27, 28), (44, 27, 28), (36, 28, 28), + (31, 28, 28), (27, 24, 28), (23, 24, 28), (27, 24, 28), + (31, 28, 28), (32, 28, 28), (35, 28, 28), (44, 31, 28), + (68, 31, 28), (88, 43, 28), (109, 60, 28), (133, 64, 28), + (166, 91, 28), (210, 140, 66), (214, 210, 188), (230, 180, 113), + (238, 176, 93), (219, 173, 85), (222, 164, 66), (202, 131, 47), + (174, 103, 47), (141, 100, 47), (121, 88, 66), (80, 60, 47), + (60, 43, 37), (48, 27, 37), (44, 27, 37), (36, 28, 28), + (32, 28, 28), (31, 28, 28), (27, 28, 28), (27, 28, 28), + (24, 28, 28), (27, 28, 28), (27, 28, 28), (31, 28, 28), + (32, 28, 28), (32, 36, 37), (44, 40, 37), (56, 31, 37), + (68, 35, 56), (89, 60, 47), (117, 64, 37), (121, 56, 37), + (125, 56, 47), (109, 47, 37), (105, 47, 37), (92, 27, 37) + ), + +// 31 aquatic-garden +((146, 80, 9), (133, 92, 28), (133, 108, 56), (153, 112, 75), + (141, 125, 84), (133, 113, 65), (105, 76, 56), (80, 72, 37), + (60, 68, 37), (52, 60, 47), (40, 44, 47), (36, 36, 37), + (32, 28, 37), (32, 28, 28), (32, 24, 28), (27, 24, 37), + (27, 28, 37), (28, 32, 37), (40, 44, 47), (60, 64, 56), + (77, 89, 66), (92, 105, 66), (117, 133, 85), (125, 158, 103), + (166, 177, 103), (149, 178, 122), (157, 157, 113), (125, 133, 103), + (109, 96, 94), (81, 93, 75), (64, 85, 75), (52, 68, 56), + (40, 56, 47), (40, 44, 37), (36, 36, 28), (32, 32, 28), + (28, 28, 28), (24, 28, 28), (23, 28, 28), (28, 32, 28), + (36, 36, 28), (40, 40, 28), (56, 39, 28), (72, 48, 28), + (84, 51, 28), (80, 56, 28), (84, 64, 28), (72, 64, 28), + (68, 39, 28), (56, 43, 28), (36, 32, 18), (28, 28, 18), + (24, 28, 28), (23, 24, 28), (20, 20, 28), (23, 20, 28), + (19, 20, 28), (19, 20, 28), (24, 24, 28), (31, 24, 28), + (31, 28, 28), (35, 28, 28), (48, 35, 28), (64, 43, 28), + (72, 52, 37), (76, 56, 37), (72, 52, 37), (56, 39, 28), + (48, 31, 28), (36, 28, 28), (32, 28, 28), (28, 28, 28), + (28, 32, 28), (28, 32, 28), (28, 32, 28), (24, 32, 28), + (24, 32, 28), (24, 32, 28), (24, 32, 28), (24, 32, 28), + (24, 32, 28), (28, 36, 28), (36, 40, 28), (44, 48, 37), + (64, 64, 47), (81, 97, 66), (96, 121, 103), (88, 146, 150), + (96, 158, 169), (100, 158, 179), (100, 150, 160), (100, 129, 141), + (85, 109, 113), (68, 93, 85), (44, 60, 66), (36, 44, 47), + (24, 40, 37), (24, 36, 37), (23, 32, 28), (20, 24, 18), + (24, 24, 18), (23, 20, 9), (24, 32, 18), (36, 44, 18), + (44, 48, 37), (52, 60, 47), (56, 81, 75), (64, 97, 85), + (68, 101, 94), (85, 113, 85), (96, 117, 94), (84, 84, 94), + (68, 80, 85), (64, 73, 75), (56, 56, 56), (52, 56, 47), + (40, 44, 37), (36, 36, 37), (35, 32, 28), (28, 24, 18), + (32, 28, 28), (32, 32, 18), (52, 39, 18), (60, 35, 18), + (84, 47, 37), (81, 55, 37), (80, 72, 56), (64, 76, 66), + (52, 64, 75), (48, 73, 85), (52, 81, 94), (60, 89, 122), + (64, 101, 122), (88, 105, 122), (89, 117, 113), (93, 117, 113), + (100, 117, 113), (100, 125, 103), (104, 125, 103), (109, 129, 85), + (96, 105, 75), (93, 101, 66), (89, 93, 66), (105, 105, 75), + (117, 125, 56), (121, 121, 75), (117, 100, 56), (109, 100, 47), + (89, 93, 56), (84, 93, 66), (73, 85, 66), (56, 64, 47), + (44, 48, 47), (40, 32, 37), (44, 31, 37), (40, 44, 37), + (56, 52, 28), (68, 68, 37), (64, 56, 37), (68, 56, 37), + (64, 48, 47), (48, 52, 47), (40, 40, 47), (32, 36, 37), + (32, 36, 28), (32, 36, 28), (36, 40, 37), (44, 52, 47), + (52, 60, 66), (64, 85, 85), (84, 109, 103), (100, 121, 122), + (104, 145, 151), (116, 158, 141), (112, 150, 151), (108, 129, 132), + (113, 105, 103), (89, 101, 75), (69, 93, 56), (68, 76, 37), + (68, 68, 28), (52, 48, 28), (40, 40, 28), (36, 36, 28), + (32, 36, 28), (32, 32, 28), (32, 32, 28), (32, 32, 28), + (32, 36, 28), (32, 40, 37), (28, 44, 47), (36, 68, 66), + (48, 85, 94), (44, 109, 160), (88, 150, 169), (113, 178, 159), + (116, 170, 169), (133, 173, 179), (92, 154, 197), (36, 93, 170), + (40, 93, 160), (36, 73, 103), (48, 56, 75), (44, 48, 56), + (36, 36, 37), (32, 32, 28), (27, 28, 18), (24, 28, 18), + (20, 32, 18), (24, 28, 18), (19, 28, 18), (19, 24, 28), + (20, 24, 28), (20, 28, 28), (23, 28, 28), (20, 32, 28), + (20, 28, 28), (24, 28, 28), (28, 28, 28), (28, 28, 28), + (28, 32, 28), (32, 32, 28), (36, 32, 37), (40, 36, 47), + (52, 48, 66), (60, 77, 94), (92, 121, 132), (125, 166, 160), + (145, 177, 179), (161, 190, 198), (169, 198, 188), (174, 186, 170), + (166, 186, 170), (145, 170, 132), (141, 162, 85), (129, 133, 85), + (137, 99, 47), (137, 72, 9), (125, 46, 0), (109, 47, 18), + (85, 51, 28), (105, 80, 28), (93, 64, 47), (104, 72, 75), + (125, 121, 94), (129, 137, 113), (108, 150, 122), (96, 146, 131), + (88, 137, 122), (68, 105, 141), (52, 72, 94), (28, 52, 56), + (23, 32, 47), (31, 28, 47), (32, 40, 47), (40, 52, 56) + ), + +// 32 no-name +((24, 24, 9), (24, 28, 9), (24, 28, 18), (28, 28, 18), + (28, 28, 28), (27, 28, 28), (24, 28, 28), (24, 28, 28), + (20, 28, 28), (19, 28, 18), (24, 28, 9), (23, 24, 9), + (20, 24, 18), (19, 20, 18), (20, 20, 18), (19, 20, 28), + (15, 24, 28), (11, 20, 18), (12, 16, 18), (12, 12, 9), + (16, 20, 18), (20, 24, 28), (24, 24, 28), (27, 32, 28), + (32, 36, 28), (32, 44, 28), (32, 52, 37), (48, 60, 37), + (76, 68, 47), (101, 80, 37), (150, 96, 28), (194, 102, 28), + (210, 106, 37), (214, 110, 37), (214, 127, 37), (210, 127, 37), + (206, 132, 47), (214, 156, 47), (226, 168, 47), (246, 191, 46), + (246, 208, 46), (254, 220, 56), (254, 207, 56), (250, 191, 46), + (250, 187, 46), (238, 179, 46), (238, 159, 46), (234, 148, 46), + (222, 136, 37), (218, 148, 37), (222, 179, 47), (230, 200, 37), + (227, 230, 46), (246, 225, 46), (226, 218, 47), (215, 192, 56), + (165, 149, 66), (101, 109, 47), (72, 72, 28), (56, 60, 28), + (40, 44, 28), (32, 32, 18), (28, 28, 18), (24, 32, 18), + (24, 32, 18), (24, 32, 18), (32, 32, 28), (32, 36, 28), + (40, 44, 37), (52, 48, 47), (64, 48, 56), (76, 64, 47), + (89, 64, 47), (109, 80, 56), (154, 96, 56), (190, 107, 47), + (186, 106, 47), (174, 123, 37), (149, 111, 37), (109, 84, 46), + (85, 80, 47), (81, 76, 56), (64, 77, 66), (56, 64, 66), + (48, 52, 56), (32, 36, 47), (28, 36, 37), (28, 32, 28), + (28, 32, 28), (35, 32, 18), (44, 40, 18), (72, 48, 28), + (101, 55, 37), (133, 72, 47), (186, 102, 47), (186, 91, 56), + (149, 84, 56), (109, 80, 56), (137, 99, 47), (162, 108, 47), + (178, 136, 56), (186, 148, 56), (210, 189, 75), (234, 209, 103), + (234, 205, 103), (234, 197, 103), (238, 180, 65), (210, 148, 56), + (226, 115, 65), (222, 115, 75), (198, 110, 66), (182, 110, 47), + (125, 80, 37), (105, 59, 37), (68, 52, 28), (44, 40, 28), + (32, 32, 18), (28, 28, 18), (24, 28, 18), (20, 24, 18), + (23, 24, 18), (28, 32, 28), (40, 40, 37), (52, 48, 37), + (72, 60, 37), (96, 72, 37), (145, 99, 56), (194, 102, 56), + (214, 123, 85), (230, 180, 103), (254, 245, 131), (254, 254, 140), + (250, 254, 197), (234, 234, 188), (190, 173, 151), (129, 146, 141), + (105, 137, 84), (85, 101, 47), (93, 77, 46), (109, 60, 37), + (121, 76, 37), (149, 108, 47), (182, 119, 47), (178, 140, 56), + (186, 144, 47), (194, 136, 47), (194, 123, 37), (178, 115, 37), + (117, 88, 47), (84, 64, 47), (60, 56, 47), (52, 60, 56), + (52, 64, 47), (60, 68, 56), (73, 81, 75), (116, 141, 141), + (182, 186, 151), (218, 222, 169), (206, 206, 179), (150, 166, 151), + (84, 109, 103), (60, 73, 85), (56, 73, 75), (73, 77, 75), + (85, 93, 65), (97, 113, 66), (129, 141, 75), (166, 157, 113), + (182, 169, 113), (198, 156, 103), (186, 132, 66), (174, 119, 47), + (121, 84, 37), (81, 60, 28), (64, 56, 28), (48, 52, 18), + (44, 44, 28), (40, 40, 37), (32, 36, 37), (32, 36, 37), + (40, 40, 37), (48, 48, 47), (48, 73, 56), (73, 117, 46), + (113, 125, 47), (150, 170, 94), (186, 181, 103), (215, 206, 94), + (246, 233, 74), (250, 249, 84), (254, 233, 84), (254, 241, 74), + (254, 229, 56), (250, 229, 56), (254, 225, 65), (250, 233, 84), + (238, 241, 112), (246, 217, 122), (206, 181, 113), (198, 123, 85), + (202, 119, 66), (194, 127, 56), (198, 131, 56), (194, 136, 66), + (222, 185, 84), (234, 230, 112), (254, 249, 112), (254, 254, 131), + (222, 226, 150), (214, 193, 132), (174, 157, 113), (105, 113, 56), + (77, 84, 56), (52, 68, 47), (44, 52, 37), (36, 40, 28), + (32, 36, 28), (36, 40, 28), (36, 36, 28), (40, 32, 37), + (48, 39, 37), (64, 39, 28), (80, 52, 37), (105, 55, 47), + (165, 84, 56), (194, 98, 47), (198, 106, 47), (202, 131, 56), + (238, 172, 84), (242, 196, 103), (250, 213, 103), (246, 221, 74), + (246, 200, 56), (210, 180, 56), (170, 149, 56), (141, 111, 47), + (93, 92, 47), (84, 72, 47), (64, 68, 28), (56, 64, 28), + (44, 52, 28), (36, 44, 28), (36, 36, 28), (40, 40, 28), + (40, 40, 28), (56, 43, 18), (60, 43, 18), (72, 52, 28), + (96, 64, 46), (117, 84, 65), (170, 123, 66), (170, 132, 66), + (121, 72, 56), (100, 55, 46), (56, 48, 37), (36, 36, 37) + ), + +// 33 fall-quilt +((24, 40, 37), (56, 52, 37), (93, 68, 37), (137, 68, 18), + (174, 76, 18), (190, 102, 9), (190, 94, 18), (178, 75, 18), + (162, 64, 18), (129, 60, 18), (105, 76, 18), (77, 68, 28), + (64, 60, 37), (40, 48, 37), (24, 40, 37), (20, 32, 37), + (19, 32, 37), (15, 32, 37), (15, 32, 37), (20, 36, 47), + (24, 40, 56), (24, 40, 56), (28, 40, 56), (28, 44, 56), + (28, 44, 56), (32, 44, 47), (36, 48, 37), (48, 52, 37), + (76, 68, 37), (81, 73, 37), (109, 80, 37), (137, 80, 28), + (170, 87, 37), (194, 98, 18), (198, 102, 18), (210, 110, 18), + (214, 118, 9), (198, 119, 18), (170, 128, 28), (146, 99, 28), + (117, 80, 28), (85, 72, 37), (68, 52, 37), (40, 40, 37), + (24, 36, 28), (19, 32, 28), (24, 24, 28), (32, 28, 28), + (40, 31, 18), (56, 35, 18), (76, 52, 28), (105, 84, 37), + (133, 96, 37), (194, 144, 56), (214, 197, 141), (214, 202, 179), + (234, 230, 216), (250, 233, 225), (250, 233, 216), (222, 193, 169), + (150, 145, 94), (109, 96, 56), (77, 68, 47), (40, 48, 56), + (36, 44, 56), (36, 40, 56), (32, 36, 56), (28, 40, 56), + (24, 36, 47), (20, 32, 47), (20, 32, 37), (24, 36, 37), + (24, 36, 37), (36, 36, 37), (36, 36, 28), (40, 32, 28), + (40, 31, 28), (48, 31, 28), (68, 47, 28), (109, 39, 28), + (129, 46, 18), (133, 47, 9), (162, 59, 0), (198, 114, 9), + (214, 145, 28), (226, 171, 47), (234, 183, 47), (230, 192, 65), + (222, 165, 65), (194, 144, 47), (145, 112, 47), (113, 88, 47), + (93, 72, 46), (60, 60, 47), (36, 48, 47), (32, 44, 47), + (32, 36, 47), (36, 36, 37), (36, 40, 37), (40, 40, 37), + (40, 44, 28), (48, 52, 28), (76, 68, 37), (93, 76, 37), + (113, 88, 28), (170, 123, 28), (194, 122, 28), (210, 132, 18), + (214, 141, 18), (210, 127, 18), (182, 119, 28), (153, 76, 28), + (137, 64, 18), (121, 55, 9), (93, 51, 18), (80, 64, 37), + (97, 76, 37), (113, 84, 37), (166, 115, 47), (214, 173, 75), + (230, 197, 75), (242, 200, 75), (218, 173, 66), (182, 132, 47), + (113, 88, 46), (77, 72, 37), (56, 48, 37), (44, 40, 37), + (35, 24, 28), (24, 12, 18), (23, 12, 18), (27, 20, 18), + (52, 31, 18), (93, 51, 18), (149, 92, 28), (194, 140, 37), + (226, 180, 75), (242, 213, 84), (250, 213, 112), (254, 212, 121), + (238, 222, 141), (250, 233, 197), (254, 241, 216), (250, 237, 225), + (254, 233, 197), (250, 229, 169), (254, 229, 150), (254, 229, 140), + (250, 221, 131), (246, 217, 112), (250, 209, 84), (250, 208, 74), + (238, 192, 56), (214, 131, 28), (186, 72, 9), (146, 38, 0), + (109, 30, 9), (76, 15, 9), (48, 16, 9), (27, 8, 9), + (23, 24, 28), (24, 32, 37), (24, 36, 37), (24, 40, 47), + (32, 44, 47), (40, 44, 56), (56, 52, 56), (89, 64, 56), + (125, 72, 37), (158, 60, 37), (162, 63, 28), (154, 55, 18), + (141, 38, 18), (133, 26, 9), (113, 22, 0), (89, 11, 9), + (73, 11, 0), (52, 11, 9), (36, 20, 0), (40, 16, 9), + (27, 20, 18), (23, 20, 28), (24, 24, 37), (19, 28, 47), + (15, 28, 47), (16, 32, 47), (12, 28, 37), (16, 28, 37), + (19, 28, 37), (16, 28, 37), (24, 36, 28), (40, 35, 18), + (44, 35, 18), (64, 35, 18), (97, 38, 0), (121, 51, 9), + (125, 42, 9), (121, 38, 9), (93, 31, 18), (52, 40, 28), + (36, 40, 47), (32, 44, 47), (32, 48, 47), (32, 48, 47), + (28, 44, 47), (24, 36, 47), (19, 28, 37), (19, 20, 28), + (20, 12, 18), (24, 4, 9), (16, 8, 0), (16, 12, 0), + (20, 12, 9), (20, 20, 18), (16, 28, 28), (16, 28, 37), + (15, 28, 37), (12, 28, 28), (23, 28, 18), (44, 27, 18), + (56, 19, 18), (80, 19, 28), (113, 30, 18), (129, 51, 9), + (145, 79, 28), (186, 127, 28), (226, 163, 47), (234, 192, 65), + (242, 200, 75), (226, 188, 84), (190, 144, 47), (125, 96, 47), + (97, 80, 56), (60, 60, 47), (36, 48, 47), (24, 40, 47), + (20, 32, 47), (16, 28, 47), (12, 24, 37), (12, 20, 37), + (12, 20, 47), (15, 24, 47), (15, 28, 56), (20, 28, 56), + (20, 36, 56), (28, 44, 56), (36, 48, 47), (52, 48, 47), + (77, 73, 37), (109, 88, 56), (125, 96, 47), (186, 127, 37), + (218, 163, 47), (230, 166, 37), (230, 144, 28), (198, 120, 37) + ), + +// 34 night-blue-sky +((3, 12, 66), (4, 12, 66), (7, 12, 66), (7, 8, 56), + (4, 8, 47), (3, 8, 37), (0, 4, 18), (0, 4, 9), + (0, 4, 0), (0, 4, 0), (0, 4, 0), (0, 4, 0), + (0, 4, 9), (0, 4, 18), (3, 4, 18), (4, 4, 18), + (4, 4, 18), (4, 4, 9), (4, 4, 9), (0, 4, 9), + (0, 0, 0), (0, 0, 0), (0, 4, 0), (0, 4, 0), + (4, 4, 9), (4, 4, 18), (4, 4, 18), (4, 8, 18), + (3, 8, 18), (0, 8, 18), (0, 4, 18), (0, 4, 18), + (0, 4, 18), (0, 4, 28), (0, 8, 37), (0, 12, 47), + (3, 12, 56), (3, 16, 66), (3, 16, 75), (3, 12, 75), + (3, 12, 75), (3, 16, 75), (3, 16, 75), (4, 16, 75), + (4, 12, 75), (3, 12, 75), (3, 12, 75), (3, 12, 75), + (0, 12, 66), (3, 8, 56), (3, 8, 56), (3, 8, 56), + (3, 4, 47), (4, 4, 47), (4, 4, 56), (4, 8, 56), + (4, 8, 56), (3, 8, 56), (3, 8, 47), (0, 8, 37), + (0, 8, 28), (0, 4, 28), (0, 4, 18), (0, 4, 18), + (4, 4, 18), (4, 4, 28), (3, 4, 28), (0, 4, 37), + (0, 4, 37), (0, 4, 37), (0, 4, 37), (0, 4, 28), + (0, 0, 18), (0, 0, 9), (0, 0, 9), (0, 4, 9), + (0, 4, 9), (0, 4, 9), (0, 4, 9), (0, 4, 0), + (0, 4, 0), (0, 4, 9), (0, 4, 9), (0, 8, 18), + (0, 8, 28), (0, 4, 28), (0, 4, 28), (3, 4, 28), + (4, 4, 18), (4, 4, 9), (4, 4, 9), (4, 4, 18), + (4, 4, 28), (7, 8, 37), (4, 12, 47), (8, 12, 56), + (7, 12, 66), (7, 16, 75), (7, 16, 75), (11, 16, 75), + (11, 16, 75), (11, 16, 75), (7, 16, 66), (7, 16, 66), + (7, 16, 66), (4, 16, 66), (3, 16, 66), (4, 12, 56), + (4, 8, 47), (4, 4, 37), (4, 4, 28), (4, 0, 18), + (4, 0, 18), (3, 0, 18), (0, 0, 9), (0, 0, 9), + (0, 4, 9), (0, 4, 9), (0, 4, 9), (0, 0, 9), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 9), + (4, 4, 9), (4, 4, 9), (4, 4, 9), (3, 4, 9), + (0, 4, 9), (0, 4, 9), (0, 0, 9), (0, 0, 9), + (0, 0, 9), (0, 4, 9), (0, 4, 9), (4, 4, 9), + (4, 4, 18), (4, 8, 28), (7, 8, 37), (4, 8, 47), + (3, 8, 47), (3, 8, 47), (0, 4, 47), (0, 4, 37), + (0, 4, 37), (0, 4, 37), (0, 4, 37), (0, 4, 47), + (0, 4, 56), (3, 8, 56), (4, 12, 56), (7, 20, 66), + (7, 24, 66), (3, 20, 66), (0, 16, 56), (0, 8, 56), + (0, 4, 47), (0, 4, 28), (0, 4, 18), (4, 4, 9), + (4, 4, 9), (0, 4, 18), (0, 4, 28), (0, 8, 37), + (0, 8, 56), (3, 12, 66), (7, 12, 75), (8, 16, 75), + (8, 16, 85), (7, 20, 85), (8, 20, 75), (7, 16, 75), + (7, 12, 66), (4, 12, 56), (3, 8, 47), (3, 8, 37), + (0, 8, 37), (0, 4, 28), (0, 4, 28), (0, 4, 28), + (0, 4, 28), (0, 4, 28), (0, 4, 28), (0, 8, 28), + (0, 8, 18), (0, 8, 9), (4, 8, 9), (4, 4, 9), + (4, 4, 18), (4, 8, 37), (4, 12, 56), (3, 12, 66), + (3, 16, 66), (3, 16, 56), (4, 16, 56), (8, 12, 56), + (7, 8, 56), (7, 8, 47), (4, 4, 47), (4, 4, 47), + (4, 4, 47), (3, 8, 56), (3, 12, 56), (3, 12, 66), + (3, 12, 66), (3, 12, 75), (3, 12, 75), (4, 12, 75), + (4, 12, 75), (7, 12, 75), (7, 12, 75), (7, 12, 66), + (4, 8, 56), (3, 4, 47), (0, 0, 28), (0, 0, 18), + (0, 0, 9), (0, 0, 9), (0, 0, 9), (4, 0, 9), + (4, 0, 9), (4, 0, 9), (4, 0, 9), (0, 0, 0), + (0, 0, 0), (0, 4, 0), (0, 4, 0), (0, 4, 9), + (0, 4, 9), (4, 4, 9), (4, 4, 9), (4, 4, 9), + (4, 4, 18), (4, 8, 28), (4, 8, 37), (4, 8, 47), + (4, 8, 56), (4, 12, 56), (3, 12, 47), (0, 16, 47), + (0, 8, 37), (0, 8, 28), (0, 4, 18), (0, 4, 9), + (0, 0, 9), (0, 0, 9), (0, 4, 9), (3, 4, 18), + (4, 8, 28), (4, 12, 37), (4, 16, 47), (4, 16, 47), + (4, 12, 37), (4, 8, 28), (4, 4, 18), (4, 4, 9) + ), + +// 35 shadow-iris +((36, 20, 18), (32, 20, 18), (31, 20, 18), (31, 20, 18), + (32, 24, 18), (35, 28, 18), (36, 32, 18), (28, 24, 18), + (27, 20, 18), (24, 16, 18), (23, 12, 18), (23, 12, 18), + (23, 16, 18), (24, 20, 18), (24, 20, 18), (23, 20, 18), + (19, 20, 18), (16, 20, 18), (19, 16, 9), (20, 12, 9), + (23, 12, 9), (24, 16, 9), (24, 20, 9), (24, 20, 9), + (20, 20, 9), (20, 16, 9), (20, 8, 9), (23, 12, 9), + (24, 12, 9), (28, 16, 9), (28, 20, 9), (28, 20, 9), + (27, 20, 9), (24, 20, 18), (23, 16, 18), (23, 16, 18), + (20, 16, 18), (19, 12, 18), (16, 12, 9), (19, 16, 9), + (20, 16, 9), (23, 16, 9), (28, 16, 9), (35, 16, 18), + (44, 20, 28), (56, 23, 37), (64, 19, 47), (76, 23, 47), + (80, 27, 37), (88, 35, 37), (88, 35, 37), (88, 31, 28), + (68, 31, 28), (52, 23, 28), (44, 20, 28), (36, 20, 28), + (35, 24, 28), (35, 24, 28), (35, 24, 28), (35, 20, 28), + (32, 20, 18), (28, 20, 18), (28, 20, 18), (27, 16, 18), + (27, 16, 18), (28, 16, 18), (31, 16, 18), (35, 16, 28), + (40, 19, 28), (48, 23, 37), (60, 23, 47), (72, 31, 56), + (88, 35, 66), (100, 39, 75), (96, 44, 75), (96, 48, 75), + (100, 40, 84), (100, 40, 75), (84, 27, 56), (72, 23, 47), + (56, 23, 37), (44, 23, 18), (36, 20, 9), (35, 16, 9), + (32, 16, 9), (28, 16, 9), (28, 20, 9), (35, 20, 9), + (35, 24, 9), (35, 24, 18), (35, 20, 18), (35, 20, 18), + (35, 24, 18), (36, 24, 28), (40, 23, 28), (44, 23, 28), + (56, 27, 28), (64, 27, 37), (72, 27, 37), (76, 35, 37), + (64, 31, 37), (52, 23, 28), (52, 23, 28), (52, 23, 28), + (60, 27, 37), (64, 23, 37), (68, 27, 47), (72, 27, 47), + (80, 35, 56), (88, 40, 65), (101, 44, 66), (100, 43, 56), + (84, 35, 56), (68, 39, 56), (40, 40, 47), (39, 28, 37), + (40, 23, 28), (43, 20, 28), (44, 23, 28), (48, 23, 37), + (52, 24, 37), (56, 27, 37), (52, 27, 37), (47, 27, 47), + (39, 24, 47), (35, 24, 37), (35, 20, 37), (28, 24, 28), + (28, 24, 18), (24, 24, 18), (23, 20, 18), (19, 16, 18), + (15, 16, 18), (16, 16, 18), (19, 16, 18), (20, 16, 18), + (23, 20, 18), (23, 20, 18), (23, 16, 18), (20, 12, 18), + (24, 12, 18), (27, 12, 18), (31, 16, 18), (32, 16, 18), + (35, 16, 18), (36, 16, 18), (36, 20, 18), (36, 20, 18), + (40, 20, 18), (40, 19, 18), (44, 20, 28), (56, 23, 37), + (64, 23, 56), (76, 31, 66), (84, 68, 75), (108, 60, 94), + (121, 64, 94), (125, 52, 94), (117, 56, 84), (109, 39, 75), + (104, 40, 75), (104, 43, 65), (109, 35, 66), (100, 35, 56), + (80, 31, 47), (72, 19, 37), (56, 19, 28), (52, 19, 28), + (48, 20, 28), (44, 19, 28), (39, 16, 28), (36, 16, 18), + (32, 16, 9), (36, 20, 9), (35, 20, 18), (40, 24, 18), + (48, 23, 28), (72, 31, 37), (92, 31, 56), (113, 44, 84), + (141, 60, 94), (202, 181, 188), (177, 116, 142), (145, 76, 122), + (145, 76, 113), (137, 80, 113), (129, 56, 94), (125, 56, 84), + (121, 47, 75), (104, 35, 66), (96, 35, 56), (84, 31, 47), + (76, 35, 37), (64, 23, 28), (52, 23, 28), (44, 20, 18), + (39, 16, 18), (31, 16, 18), (24, 16, 18), (20, 16, 18), + (16, 12, 9), (16, 12, 9), (16, 12, 9), (16, 16, 9), + (15, 16, 9), (15, 12, 9), (15, 12, 18), (16, 12, 18), + (16, 12, 18), (19, 12, 18), (20, 12, 18), (24, 12, 18), + (27, 12, 18), (27, 16, 28), (27, 16, 28), (27, 16, 28), + (28, 16, 28), (31, 16, 28), (40, 19, 28), (48, 23, 37), + (52, 23, 47), (56, 27, 47), (64, 35, 47), (72, 31, 47), + (68, 35, 47), (60, 36, 47), (48, 31, 37), (40, 24, 28), + (40, 24, 28), (43, 24, 28), (48, 28, 28), (52, 32, 37), + (64, 31, 47), (68, 27, 47), (80, 31, 47), (84, 31, 56), + (88, 35, 56), (96, 35, 56), (96, 31, 56), (84, 31, 56), + (76, 27, 56), (72, 27, 56), (68, 27, 56), (60, 27, 47), + (52, 23, 37), (40, 20, 28), (31, 20, 28), (16, 20, 28), + (20, 12, 28), (20, 12, 28), (23, 12, 18), (27, 16, 18), + (32, 20, 28), (35, 24, 28), (36, 28, 28), (40, 28, 37) + ), + +// 36 solid-sky +((145, 104, 84), (178, 111, 75), (202, 123, 75), (198, 127, 75), + (129, 112, 85), (84, 72, 37), (40, 40, 28), (20, 16, 18), + (11, 4, 28), (12, 4, 28), (23, 24, 28), (0, 93, 141), + (0, 109, 160), (4, 122, 170), (7, 134, 179), (19, 138, 188), + (24, 142, 179), (31, 151, 179), (44, 158, 179), (52, 162, 179), + (129, 117, 122), (190, 137, 103), (214, 152, 66), (206, 131, 37), + (202, 119, 28), (198, 106, 9), (194, 90, 9), (166, 43, 9), + (133, 18, 0), (72, 19, 9), (60, 19, 18), (36, 28, 9), + (36, 36, 18), (52, 60, 37), (0, 101, 150), (0, 109, 150), + (0, 109, 150), (0, 105, 150), (0, 97, 141), (20, 36, 18), + (16, 24, 9), (8, 8, 9), (12, 4, 9), (12, 4, 9), + (11, 4, 9), (8, 4, 9), (4, 4, 9), (7, 4, 9), + (8, 0, 9), (12, 0, 9), (15, 0, 9), (16, 4, 18), + (19, 12, 28), (0, 89, 141), (0, 97, 160), (0, 101, 160), + (0, 101, 150), (60, 60, 37), (68, 31, 18), (105, 30, 9), + (170, 80, 9), (198, 90, 0), (178, 67, 0), (133, 30, 0), + (72, 15, 9), (36, 12, 18), (23, 8, 9), (16, 4, 9), + (19, 8, 9), (27, 20, 18), (52, 44, 37), (4, 105, 150), + (60, 162, 188), (173, 173, 160), (198, 165, 151), (194, 148, 113), + (218, 160, 84), (222, 153, 84), (214, 132, 47), (210, 123, 37), + (202, 111, 28), (218, 118, 28), (202, 119, 47), (149, 104, 85), + (88, 116, 113), (4, 113, 160), (0, 118, 160), (0, 122, 160), + (0, 122, 160), (0, 122, 160), (0, 122, 170), (4, 122, 170), + (0, 118, 170), (0, 114, 170), (0, 109, 160), (0, 101, 150), + (44, 60, 28), (28, 36, 9), (20, 16, 9), (16, 8, 9), + (15, 4, 9), (12, 0, 18), (11, 0, 18), (8, 0, 18), + (8, 0, 18), (12, 4, 9), (15, 4, 9), (20, 4, 9), + (28, 12, 18), (36, 36, 18), (52, 52, 47), (0, 97, 150), + (0, 101, 150), (73, 73, 66), (64, 60, 37), (48, 56, 28), + (64, 64, 47), (0, 105, 150), (0, 118, 160), (4, 122, 170), + (8, 126, 170), (4, 130, 170), (4, 134, 170), (0, 130, 170), + (0, 126, 170), (0, 126, 170), (0, 122, 170), (0, 114, 170), + (0, 105, 160), (0, 93, 150), (16, 32, 28), (16, 12, 18), + (19, 8, 9), (20, 20, 18), (28, 44, 28), (0, 97, 141), + (4, 118, 160), (23, 142, 179), (44, 158, 188), (60, 166, 197), + (60, 166, 197), (68, 170, 197), (72, 170, 197), (72, 173, 197), + (96, 177, 188), (149, 145, 103), (214, 143, 75), (210, 127, 47), + (154, 99, 37), (68, 68, 28), (44, 35, 18), (24, 20, 18), + (15, 8, 18), (7, 4, 18), (4, 0, 18), (3, 4, 18), + (7, 4, 18), (11, 4, 18), (19, 8, 18), (32, 36, 28), + (0, 105, 150), (24, 138, 179), (72, 174, 188), (149, 190, 197), + (206, 218, 207), (210, 222, 207), (218, 210, 207), (218, 218, 198), + (218, 210, 198), (194, 194, 170), (194, 181, 160), (141, 137, 103), + (113, 81, 75), (72, 84, 37), (52, 68, 28), (52, 48, 28), + (68, 64, 28), (81, 80, 37), (141, 88, 47), (194, 106, 37), + (206, 106, 28), (206, 110, 18), (206, 110, 9), (194, 98, 18), + (174, 87, 37), (96, 88, 94), (4, 113, 150), (12, 134, 170), + (19, 142, 179), (31, 147, 179), (39, 151, 188), (48, 158, 188), + (48, 166, 188), (48, 162, 188), (43, 159, 197), (39, 151, 198), + (27, 147, 188), (23, 142, 179), (20, 138, 179), (19, 134, 179), + (8, 130, 179), (4, 122, 160), (4, 109, 160), (0, 97, 150), + (44, 36, 37), (31, 16, 18), (23, 8, 18), (23, 8, 18), + (27, 28, 28), (0, 93, 141), (0, 105, 150), (0, 97, 141), + (48, 39, 37), (28, 28, 18), (32, 24, 9), (44, 15, 9), + (60, 27, 18), (93, 55, 37), (154, 84, 37), (186, 98, 28), + (186, 102, 9), (170, 87, 18), (73, 80, 28), (40, 52, 18), + (40, 36, 18), (48, 35, 18), (64, 60, 18), (149, 75, 0), + (194, 94, 9), (198, 98, 9), (214, 105, 0), (210, 98, 9), + (210, 101, 18), (198, 112, 37), (190, 107, 56), (108, 108, 94), + (4, 105, 150), (0, 105, 160), (0, 109, 160), (0, 105, 160), + (0, 101, 160), (0, 89, 141), (11, 8, 37), (11, 4, 28), + (11, 4, 18), (12, 4, 18), (20, 8, 18), (36, 12, 18), + (64, 19, 9), (77, 11, 0), (109, 19, 0), (169, 14, 9), + (149, 67, 18), (85, 85, 66), (24, 113, 150), (35, 155, 188) + ), + +// 37 misty-field +((84, 89, 103), (96, 100, 94), (101, 105, 85), (93, 105, 84), + (89, 109, 85), (100, 113, 94), (109, 121, 103), (104, 117, 113), + (116, 117, 122), (121, 141, 141), (133, 166, 179), (153, 185, 197), + (161, 185, 207), (157, 189, 207), (161, 185, 207), (157, 177, 207), + (149, 169, 198), (133, 158, 188), (116, 146, 179), (108, 133, 179), + (108, 133, 179), (116, 141, 179), (112, 141, 170), (129, 150, 170), + (133, 157, 188), (141, 161, 188), (137, 153, 169), (125, 141, 141), + (121, 133, 113), (109, 121, 94), (105, 125, 85), (101, 133, 84), + (101, 133, 85), (109, 133, 85), (97, 133, 85), (93, 121, 75), + (97, 125, 85), (101, 117, 85), (105, 117, 75), (89, 117, 75), + (84, 121, 75), (93, 141, 75), (109, 150, 75), (117, 170, 103), + (133, 178, 122), (145, 170, 151), (169, 194, 188), (169, 198, 207), + (173, 193, 207), (169, 189, 207), (169, 189, 216), (165, 189, 216), + (165, 185, 216), (161, 181, 216), (157, 181, 226), (157, 185, 226), + (157, 189, 225), (177, 201, 226), (205, 210, 235), (214, 218, 244), + (214, 222, 244), (209, 222, 244), (205, 218, 244), (193, 214, 235), + (177, 197, 216), (177, 189, 207), (169, 185, 207), (169, 181, 207), + (165, 177, 216), (161, 181, 216), (165, 185, 216), (165, 189, 216), + (169, 193, 216), (177, 197, 216), (193, 206, 226), (206, 222, 226), + (218, 222, 235), (222, 226, 244), (226, 222, 235), (222, 230, 244), + (222, 226, 254), (222, 226, 244), (218, 226, 244), (218, 226, 244), + (222, 234, 244), (214, 226, 244), (205, 218, 235), (185, 197, 216), + (165, 181, 207), (141, 153, 169), (121, 121, 141), (105, 101, 113), + (84, 84, 94), (77, 85, 85), (73, 77, 75), (73, 73, 75), + (73, 73, 75), (73, 77, 75), (73, 85, 85), (77, 97, 85), + (84, 113, 94), (104, 133, 132), (112, 154, 132), (129, 162, 160), + (141, 169, 188), (145, 165, 198), (141, 165, 207), (137, 161, 207), + (124, 165, 207), (64, 139, 207), (64, 139, 207), (64, 135, 207), + (100, 129, 179), (96, 125, 160), (108, 145, 132), (112, 137, 103), + (97, 121, 94), (89, 113, 85), (89, 105, 85), (77, 89, 85), + (77, 81, 84), (77, 73, 75), (77, 73, 75), (77, 77, 75), + (81, 81, 84), (77, 77, 75), (73, 73, 66), (73, 73, 66), + (73, 77, 75), (76, 77, 94), (68, 68, 103), (72, 77, 103), + (92, 100, 132), (124, 133, 141), (145, 161, 179), (165, 185, 207), + (173, 201, 225), (201, 222, 235), (213, 230, 244), (222, 230, 235), + (222, 226, 235), (222, 226, 235), (209, 222, 235), (205, 218, 235), + (185, 206, 226), (173, 197, 216), (169, 189, 216), (165, 189, 207), + (165, 185, 198), (153, 169, 179), (141, 166, 141), (137, 154, 132), + (125, 157, 132), (121, 158, 103), (101, 149, 75), (85, 125, 65), + (81, 117, 75), (72, 109, 94), (77, 85, 85), (80, 81, 94), + (81, 77, 84), (77, 73, 75), (73, 73, 75), (68, 68, 66), + (68, 68, 66), (73, 73, 66), (73, 73, 75), (72, 72, 75), + (81, 85, 75), (81, 89, 75), (81, 89, 75), (85, 97, 75), + (89, 97, 94), (89, 93, 94), (85, 89, 85), (81, 81, 75), + (85, 97, 75), (85, 89, 75), (85, 85, 75), (81, 97, 75), + (81, 105, 66), (85, 97, 66), (85, 101, 75), (81, 101, 75), + (76, 101, 75), (73, 97, 75), (77, 93, 75), (73, 81, 75), + (68, 77, 75), (73, 73, 75), (73, 73, 75), (73, 73, 75), + (73, 73, 75), (73, 73, 66), (81, 85, 75), (81, 97, 66), + (81, 105, 56), (60, 101, 47), (73, 97, 56), (68, 89, 66), + (73, 77, 66), (73, 73, 66), (68, 68, 75), (52, 72, 103), + (44, 81, 141), (60, 130, 207), (60, 135, 207), (64, 138, 198), + (96, 125, 160), (88, 121, 122), (84, 108, 113), (92, 101, 103), + (101, 101, 113), (112, 117, 132), (104, 117, 141), (104, 125, 151), + (116, 133, 170), (128, 145, 188), (128, 157, 198), (129, 154, 207), + (129, 157, 197), (137, 173, 198), (145, 173, 198), (141, 165, 188), + (133, 165, 188), (125, 157, 188), (120, 145, 179), (112, 133, 170), + (96, 121, 160), (100, 117, 151), (72, 105, 122), (68, 89, 113), + (80, 93, 103), (76, 97, 132), (108, 125, 151), (137, 141, 160), + (145, 157, 188), (161, 181, 207), (169, 193, 216), (181, 210, 226), + (193, 222, 235), (197, 218, 235), (181, 201, 226), (165, 193, 216), + (161, 189, 216), (157, 181, 216), (157, 181, 216), (153, 181, 216), + (149, 181, 207), (157, 181, 207), (153, 177, 207), (149, 177, 207), + (149, 177, 207), (141, 169, 207), (137, 165, 198), (128, 161, 198) + ), + +// 38 wooden-highlight +((97, 76, 75), (85, 68, 56), (97, 72, 46), (125, 84, 56), + (141, 100, 85), (149, 107, 113), (137, 116, 122), (153, 112, 113), + (154, 133, 122), (157, 124, 103), (153, 124, 94), (161, 119, 94), + (178, 119, 85), (174, 132, 103), (170, 137, 122), (194, 153, 122), + (166, 124, 123), (162, 125, 123), (170, 120, 103), (178, 131, 85), + (174, 119, 66), (166, 111, 47), (154, 95, 47), (137, 80, 28), + (141, 72, 9), (141, 68, 18), (141, 64, 18), (137, 59, 18), + (125, 55, 9), (141, 51, 9), (125, 51, 9), (117, 51, 18), + (117, 55, 28), (109, 55, 28), (105, 55, 28), (109, 51, 28), + (97, 55, 28), (101, 51, 46), (88, 64, 47), (109, 68, 46), + (141, 96, 66), (166, 120, 85), (170, 119, 66), (174, 111, 75), + (170, 115, 85), (178, 123, 85), (150, 108, 94), (154, 107, 85), + (133, 92, 75), (141, 88, 47), (129, 76, 28), (121, 64, 28), + (133, 72, 28), (137, 80, 37), (146, 88, 37), (150, 96, 47), + (154, 99, 47), (154, 99, 47), (146, 92, 28), (154, 76, 18), + (146, 64, 18), (141, 64, 28), (141, 76, 28), (145, 80, 37), + (158, 95, 47), (174, 106, 37), (178, 110, 47), (170, 102, 28), + (150, 84, 18), (129, 72, 18), (109, 68, 18), (96, 47, 9), + (84, 35, 18), (72, 35, 18), (68, 35, 18), (68, 39, 18), + (76, 43, 28), (84, 43, 28), (92, 51, 28), (100, 55, 28), + (117, 72, 28), (133, 88, 28), (162, 106, 28), (170, 106, 28), + (162, 91, 28), (150, 80, 28), (141, 64, 28), (125, 51, 28), + (117, 47, 18), (101, 42, 18), (84, 39, 18), (60, 31, 9), + (44, 23, 9), (32, 16, 9), (24, 16, 9), (16, 16, 9), + (16, 20, 0), (16, 16, 9), (16, 16, 9), (16, 20, 9), + (20, 20, 9), (27, 20, 9), (27, 20, 9), (27, 24, 9), + (24, 20, 18), (32, 16, 18), (28, 16, 18), (20, 16, 18), + (19, 12, 18), (19, 12, 18), (16, 12, 18), (16, 16, 18), + (16, 16, 18), (15, 16, 18), (16, 16, 18), (19, 16, 18), + (27, 24, 18), (31, 20, 28), (36, 24, 28), (48, 24, 28), + (68, 35, 28), (80, 43, 28), (89, 51, 18), (105, 51, 18), + (109, 51, 18), (121, 51, 18), (121, 42, 9), (121, 51, 18), + (125, 46, 18), (121, 55, 18), (117, 64, 18), (113, 68, 18), + (109, 68, 18), (105, 64, 28), (105, 59, 28), (96, 51, 28), + (80, 43, 28), (56, 27, 28), (44, 19, 28), (36, 24, 28), + (24, 20, 28), (19, 16, 18), (12, 12, 9), (12, 12, 9), + (16, 16, 9), (24, 20, 9), (40, 23, 9), (68, 35, 9), + (85, 43, 9), (105, 42, 9), (109, 47, 18), (109, 47, 18), + (109, 46, 9), (109, 46, 9), (97, 38, 9), (80, 43, 9), + (60, 35, 9), (40, 24, 18), (32, 24, 18), (28, 24, 18), + (28, 24, 18), (40, 28, 18), (44, 23, 18), (56, 31, 18), + (68, 39, 18), (80, 43, 18), (85, 52, 28), (101, 72, 37), + (133, 88, 47), (141, 100, 75), (146, 112, 85), (146, 116, 85), + (146, 107, 75), (121, 72, 37), (113, 60, 28), (88, 47, 28), + (56, 35, 28), (35, 24, 18), (23, 16, 18), (19, 16, 18), + (16, 16, 18), (16, 12, 9), (16, 12, 9), (24, 16, 9), + (35, 20, 9), (48, 27, 9), (56, 31, 18), (60, 31, 18), + (68, 35, 37), (76, 39, 37), (76, 39, 28), (76, 35, 28), + (84, 35, 28), (96, 38, 18), (97, 39, 18), (100, 38, 18), + (84, 39, 28), (68, 35, 18), (56, 27, 18), (44, 23, 18), + (48, 23, 18), (56, 27, 18), (64, 35, 37), (72, 64, 56), + (89, 72, 65), (105, 93, 84), (137, 100, 85), (149, 108, 94), + (150, 104, 85), (129, 92, 84), (101, 84, 75), (101, 72, 37), + (113, 68, 28), (133, 68, 28), (129, 64, 18), (137, 68, 18), + (137, 72, 28), (125, 64, 18), (125, 60, 18), (121, 60, 18), + (117, 55, 18), (101, 47, 28), (84, 47, 28), (68, 39, 28), + (48, 31, 18), (31, 24, 18), (20, 16, 9), (16, 12, 9), + (12, 12, 9), (11, 12, 9), (12, 12, 9), (16, 12, 9), + (24, 12, 9), (31, 12, 9), (35, 16, 9), (60, 23, 9), + (64, 27, 9), (72, 39, 18), (72, 47, 18), (76, 47, 28), + (72, 52, 28), (76, 47, 28), (80, 43, 28), (72, 35, 28), + (64, 31, 18), (60, 31, 9), (40, 27, 9), (27, 20, 9), + (32, 20, 9), (36, 28, 9), (48, 27, 9), (56, 39, 18), + (81, 47, 18), (105, 59, 18), (121, 64, 18), (146, 76, 28) + ), + +// 39 jet-tundra +((109, 92, 75), (105, 85, 75), (105, 85, 75), (97, 89, 75), + (93, 85, 75), (93, 81, 75), (93, 80, 65), (85, 73, 65), + (84, 68, 56), (84, 68, 47), (80, 64, 47), (76, 64, 47), + (72, 60, 37), (68, 64, 37), (72, 64, 47), (77, 73, 47), + (85, 76, 47), (93, 76, 56), (97, 80, 56), (101, 80, 56), + (105, 80, 56), (109, 84, 56), (105, 88, 56), (101, 84, 56), + (97, 80, 56), (93, 76, 56), (85, 68, 47), (72, 60, 47), + (64, 56, 37), (60, 56, 37), (60, 56, 37), (68, 60, 37), + (72, 56, 37), (73, 64, 47), (76, 68, 56), (76, 68, 56), + (81, 64, 56), (80, 68, 56), (81, 73, 56), (85, 80, 65), + (93, 85, 65), (101, 93, 65), (101, 93, 75), (105, 97, 84), + (113, 96, 84), (113, 100, 94), (113, 104, 94), (113, 104, 94), + (117, 108, 94), (121, 108, 85), (121, 104, 84), (121, 104, 75), + (117, 100, 75), (109, 97, 75), (105, 93, 75), (105, 92, 65), + (105, 92, 66), (97, 89, 75), (93, 89, 75), (93, 85, 75), + (85, 77, 65), (81, 73, 65), (81, 72, 56), (77, 72, 56), + (73, 73, 56), (72, 68, 56), (72, 68, 56), (76, 68, 56), + (77, 68, 56), (85, 76, 56), (89, 80, 56), (93, 81, 65), + (97, 89, 75), (105, 92, 75), (113, 92, 75), (121, 92, 75), + (121, 92, 66), (113, 92, 65), (105, 88, 65), (93, 85, 56), + (89, 84, 56), (85, 77, 56), (73, 73, 56), (72, 68, 56), + (72, 64, 47), (68, 60, 47), (68, 60, 47), (64, 60, 47), + (64, 60, 56), (68, 60, 56), (68, 60, 56), (72, 64, 66), + (68, 68, 56), (68, 64, 47), (68, 64, 47), (64, 56, 47), + (56, 52, 37), (56, 52, 37), (52, 52, 37), (52, 52, 37), + (52, 48, 37), (48, 48, 37), (48, 48, 28), (60, 52, 28), + (60, 56, 28), (56, 52, 37), (52, 48, 37), (56, 48, 37), + (56, 48, 37), (60, 48, 37), (72, 60, 47), (85, 72, 56), + (97, 85, 65), (109, 96, 75), (121, 104, 85), (129, 116, 103), + (133, 125, 103), (137, 125, 113), (137, 124, 113), (133, 125, 103), + (137, 116, 103), (133, 112, 103), (129, 112, 94), (125, 116, 85), + (113, 108, 85), (105, 101, 75), (101, 92, 66), (93, 88, 65), + (89, 85, 65), (89, 85, 56), (89, 85, 56), (89, 85, 65), + (89, 89, 75), (93, 89, 84), (104, 104, 94), (108, 96, 94), + (108, 96, 94), (105, 97, 84), (101, 93, 84), (97, 80, 75), + (89, 76, 65), (81, 73, 56), (73, 68, 47), (68, 64, 47), + (60, 56, 47), (56, 56, 47), (64, 64, 47), (72, 68, 47), + (81, 73, 56), (93, 81, 56), (97, 88, 66), (101, 88, 75), + (105, 89, 84), (109, 97, 84), (117, 100, 84), (125, 100, 84), + (125, 100, 84), (121, 100, 84), (121, 104, 84), (121, 108, 94), + (121, 108, 94), (117, 108, 94), (121, 108, 94), (121, 117, 94), + (133, 121, 103), (145, 116, 103), (149, 124, 94), (150, 120, 94), + (154, 120, 94), (158, 128, 85), (158, 132, 85), (137, 120, 75), + (133, 112, 66), (113, 96, 65), (97, 88, 56), (85, 76, 47), + (73, 68, 47), (64, 56, 47), (60, 52, 47), (60, 48, 37), + (64, 52, 37), (73, 60, 37), (85, 72, 47), (89, 76, 47), + (93, 80, 47), (97, 81, 56), (97, 85, 65), (97, 88, 65), + (101, 92, 65), (101, 97, 75), (113, 104, 84), (125, 108, 94), + (133, 116, 103), (145, 120, 113), (154, 137, 122), (178, 149, 141), + (198, 165, 151), (218, 193, 179), (210, 185, 179), (178, 153, 141), + (166, 145, 132), (157, 141, 122), (153, 133, 132), (120, 112, 122), + (125, 108, 113), (121, 100, 94), (113, 97, 75), (109, 93, 65), + (109, 92, 65), (105, 93, 65), (109, 93, 75), (113, 104, 84), + (113, 100, 84), (113, 104, 84), (113, 104, 84), (113, 104, 75), + (109, 96, 66), (105, 92, 56), (105, 92, 56), (105, 88, 47), + (109, 93, 56), (113, 96, 65), (121, 100, 75), (125, 100, 84), + (129, 108, 85), (133, 112, 85), (133, 112, 94), (133, 116, 103), + (137, 120, 103), (145, 124, 103), (137, 120, 103), (141, 116, 94), + (133, 116, 75), (121, 100, 75), (121, 96, 75), (109, 92, 65), + (105, 88, 65), (101, 84, 56), (93, 77, 56), (85, 72, 47), + (80, 68, 37), (72, 64, 37), (68, 64, 28), (60, 56, 28), + (64, 60, 28), (68, 60, 37), (76, 64, 37), (85, 73, 37), + (89, 84, 47), (97, 88, 47), (97, 88, 56), (97, 85, 56), + (97, 80, 56), (93, 76, 56), (81, 72, 56), (73, 68, 56) + ), + +// 40 pastel-lime +((137, 149, 85), (133, 146, 94), (129, 141, 94), (109, 133, 85), + (121, 133, 85), (105, 121, 75), (133, 129, 75), (162, 128, 85), + (190, 107, 66), (158, 111, 37), (198, 115, 56), (202, 152, 66), + (174, 140, 85), (149, 149, 75), (137, 146, 94), (113, 133, 75), + (105, 121, 75), (101, 121, 75), (97, 121, 66), (93, 105, 56), + (93, 85, 56), (113, 76, 56), (146, 88, 18), (162, 59, 9), + (113, 68, 9), (85, 80, 37), (81, 68, 47), (64, 64, 47), + (52, 73, 47), (56, 73, 37), (64, 77, 37), (64, 77, 28), + (68, 73, 37), (68, 77, 37), (77, 89, 47), (89, 109, 56), + (113, 137, 75), (109, 133, 85), (121, 150, 103), (137, 162, 122), + (145, 166, 151), (150, 182, 151), (194, 198, 160), (234, 205, 150), + (214, 185, 132), (214, 181, 94), (210, 157, 103), (198, 144, 94), + (153, 116, 94), (109, 113, 85), (101, 109, 75), (89, 100, 66), + (77, 93, 66), (69, 89, 56), (64, 77, 56), (60, 77, 47), + (56, 81, 56), (56, 76, 56), (56, 73, 56), (60, 73, 56), + (68, 73, 56), (73, 81, 56), (73, 89, 56), (73, 89, 56), + (85, 113, 56), (101, 121, 75), (109, 129, 85), (129, 150, 94), + (141, 166, 113), (166, 173, 103), (162, 178, 132), (174, 182, 132), + (186, 190, 122), (194, 194, 132), (214, 202, 132), (186, 194, 141), + (170, 186, 122), (166, 173, 103), (162, 169, 85), (145, 166, 85), + (125, 133, 85), (109, 117, 66), (105, 109, 66), (97, 97, 56), + (93, 76, 56), (113, 88, 66), (113, 109, 75), (170, 91, 37), + (170, 119, 56), (174, 115, 56), (157, 145, 85), (125, 137, 85), + (109, 113, 75), (105, 109, 75), (101, 101, 75), (97, 105, 66), + (93, 109, 66), (89, 113, 66), (89, 109, 75), (89, 109, 75), + (85, 109, 75), (85, 105, 75), (84, 101, 66), (81, 101, 66), + (81, 101, 66), (81, 101, 66), (85, 105, 66), (85, 105, 56), + (89, 100, 56), (81, 97, 56), (73, 97, 56), (73, 93, 56), + (77, 81, 47), (93, 76, 47), (85, 72, 56), (81, 73, 56), + (81, 80, 66), (89, 73, 75), (101, 85, 84), (113, 96, 84), + (121, 121, 94), (137, 137, 103), (157, 149, 122), (178, 177, 122), + (202, 185, 151), (210, 206, 170), (214, 193, 170), (190, 190, 170), + (182, 190, 151), (170, 186, 160), (174, 190, 151), (170, 194, 151), + (158, 186, 141), (149, 178, 141), (162, 194, 160), (149, 170, 132), + (145, 153, 122), (125, 133, 113), (104, 117, 94), (89, 105, 75), + (77, 93, 66), (64, 76, 56), (56, 64, 56), (60, 60, 56), + (60, 60, 66), (76, 64, 65), (97, 76, 65), (97, 97, 75), + (101, 109, 75), (105, 121, 84), (125, 141, 103), (129, 158, 113), + (133, 158, 122), (129, 154, 122), (129, 158, 113), (117, 150, 103), + (109, 117, 75), (89, 97, 66), (73, 77, 56), (60, 60, 47), + (52, 48, 37), (44, 39, 28), (32, 40, 18), (20, 20, 18), + (23, 20, 28), (20, 24, 37), (19, 28, 37), (36, 32, 37), + (40, 48, 47), (44, 56, 66), (48, 44, 56), (48, 48, 56), + (44, 56, 56), (56, 64, 56), (56, 60, 56), (48, 56, 47), + (52, 52, 47), (60, 48, 47), (48, 48, 47), (48, 48, 47), + (36, 56, 47), (40, 48, 37), (32, 52, 37), (44, 60, 47), + (44, 52, 37), (40, 56, 37), (40, 64, 37), (40, 68, 37), + (48, 56, 28), (56, 68, 37), (48, 52, 28), (56, 64, 37), + (56, 52, 47), (52, 64, 47), (60, 68, 47), (64, 64, 56), + (64, 73, 56), (68, 73, 56), (68, 68, 47), (68, 73, 47), + (60, 77, 47), (68, 76, 47), (68, 81, 56), (60, 81, 56), + (60, 81, 56), (64, 81, 56), (68, 81, 66), (73, 77, 75), + (76, 88, 75), (81, 93, 75), (85, 97, 75), (89, 105, 75), + (89, 109, 75), (93, 117, 75), (93, 113, 85), (101, 117, 84), + (109, 129, 94), (125, 141, 113), (141, 161, 122), (174, 157, 122), + (190, 145, 132), (166, 170, 103), (162, 182, 113), (154, 178, 132), + (150, 174, 113), (141, 170, 132), (137, 170, 122), (137, 162, 113), + (125, 145, 103), (121, 133, 94), (105, 117, 85), (101, 109, 85), + (93, 109, 85), (93, 104, 85), (89, 109, 85), (101, 117, 85), + (117, 137, 103), (117, 150, 113), (116, 133, 113), (97, 109, 94), + (85, 105, 85), (73, 97, 75), (76, 84, 66), (77, 84, 66), + (81, 80, 56), (73, 81, 56), (68, 85, 56), (64, 85, 47), + (56, 85, 47), (69, 81, 47), (73, 81, 56), (68, 81, 47), + (73, 85, 47), (73, 89, 56), (81, 89, 56), (85, 97, 56) + ), + +// 41 hell +((141, 31, 18), (145, 38, 9), (149, 34, 9), (154, 34, 9), + (154, 34, 9), (153, 34, 18), (154, 34, 9), (162, 37, 0), + (166, 37, 0), (174, 46, 0), (186, 54, 0), (198, 67, 0), + (198, 62, 0), (174, 58, 0), (166, 38, 0), (158, 26, 0), + (137, 22, 0), (137, 11, 0), (133, 11, 0), (129, 7, 9), + (137, 22, 0), (137, 26, 9), (129, 26, 9), (141, 30, 0), + (154, 42, 0), (170, 50, 0), (178, 63, 9), (170, 75, 18), + (182, 75, 18), (182, 75, 18), (178, 71, 9), (186, 75, 0), + (186, 75, 9), (190, 67, 9), (194, 67, 9), (202, 63, 9), + (198, 67, 9), (206, 79, 9), (218, 94, 9), (214, 102, 18), + (230, 98, 9), (218, 103, 9), (242, 139, 56), (222, 98, 9), + (210, 86, 9), (194, 75, 28), (182, 63, 9), (170, 42, 9), + (150, 38, 9), (137, 34, 9), (125, 26, 9), (113, 15, 0), + (101, 7, 0), (85, 7, 0), (73, 11, 0), (76, 3, 0), + (73, 11, 0), (85, 11, 0), (89, 15, 9), (97, 26, 9), + (113, 39, 18), (125, 47, 28), (121, 67, 37), (133, 63, 18), + (158, 59, 9), (190, 87, 18), (210, 98, 9), (210, 107, 18), + (218, 103, 18), (214, 98, 9), (202, 90, 9), (182, 74, 9), + (162, 59, 9), (150, 42, 9), (133, 34, 9), (117, 26, 0), + (97, 19, 0), (80, 15, 9), (60, 11, 9), (56, 15, 9), + (56, 15, 0), (56, 7, 0), (64, 7, 0), (77, 15, 0), + (89, 19, 0), (97, 22, 0), (117, 34, 0), (129, 34, 0), + (133, 34, 0), (137, 34, 0), (137, 34, 0), (137, 38, 0), + (133, 34, 0), (129, 34, 0), (121, 27, 0), (113, 22, 0), + (113, 22, 0), (109, 22, 0), (105, 26, 9), (105, 23, 9), + (105, 19, 0), (105, 11, 0), (109, 11, 0), (109, 22, 0), + (113, 26, 0), (117, 31, 0), (121, 34, 0), (125, 30, 0), + (121, 30, 0), (117, 30, 0), (109, 26, 0), (101, 22, 0), + (89, 19, 0), (85, 19, 0), (77, 23, 0), (73, 19, 0), + (73, 19, 0), (68, 15, 9), (76, 19, 0), (76, 15, 9), + (76, 19, 9), (80, 27, 18), (80, 31, 18), (84, 23, 9), + (93, 23, 9), (105, 26, 9), (125, 26, 18), (117, 26, 18), + (105, 27, 18), (97, 31, 18), (93, 27, 18), (97, 23, 9), + (89, 26, 0), (89, 23, 0), (89, 27, 9), (93, 26, 0), + (97, 26, 0), (109, 27, 0), (117, 34, 0), (125, 34, 9), + (133, 34, 9), (141, 34, 0), (146, 34, 0), (154, 33, 0), + (158, 29, 0), (158, 33, 0), (158, 38, 9), (162, 34, 9), + (161, 42, 9), (161, 42, 9), (162, 38, 9), (166, 37, 0), + (170, 37, 0), (170, 50, 0), (174, 63, 0), (178, 63, 9), + (174, 59, 0), (162, 46, 0), (146, 42, 0), (129, 43, 9), + (121, 38, 9), (125, 38, 9), (121, 38, 9), (121, 38, 0), + (117, 42, 0), (121, 46, 9), (125, 42, 9), (129, 44, 18), + (149, 56, 28), (145, 75, 37), (153, 68, 28), (182, 80, 47), + (165, 95, 75), (165, 99, 84), (194, 124, 75), (178, 120, 56), + (173, 87, 37), (174, 83, 37), (174, 79, 28), (169, 55, 28), + (157, 46, 28), (154, 55, 9), (154, 55, 9), (146, 43, 9), + (149, 51, 0), (154, 46, 0), (146, 42, 0), (150, 42, 9), + (150, 38, 9), (146, 34, 9), (141, 39, 18), (133, 43, 18), + (133, 39, 18), (141, 42, 19), (146, 51, 9), (149, 59, 9), + (158, 67, 9), (190, 86, 18), (202, 95, 18), (206, 79, 9), + (194, 72, 0), (174, 63, 9), (149, 51, 18), (133, 46, 9), + (121, 55, 0), (113, 39, 0), (101, 31, 9), (92, 30, 9), + (101, 30, 9), (105, 26, 9), (117, 39, 9), (129, 38, 9), + (133, 34, 9), (137, 34, 9), (137, 38, 9), (141, 38, 9), + (145, 38, 9), (145, 38, 0), (146, 38, 0), (154, 34, 0), + (158, 34, 0), (150, 33, 0), (141, 27, 0), (133, 22, 0), + (125, 22, 0), (125, 22, 0), (121, 18, 0), (121, 18, 0), + (117, 22, 0), (125, 27, 0), (125, 34, 0), (121, 38, 9), + (121, 38, 9), (121, 38, 9), (113, 38, 9), (105, 26, 0), + (101, 19, 0), (97, 15, 0), (97, 15, 0), (85, 15, 0), + (84, 15, 0), (80, 15, 0), (77, 15, 0), (81, 19, 0), + (85, 19, 0), (89, 22, 0), (97, 22, 0), (105, 22, 0), + (113, 15, 9), (125, 26, 9), (129, 30, 0), (129, 30, 0), + (125, 22, 0), (125, 18, 0), (133, 18, 0), (133, 22, 0) + ), + +// 42 indian-coast +((68, 56, 47), (80, 64, 47), (89, 76, 47), (105, 68, 46), + (104, 68, 46), (80, 60, 37), (60, 52, 37), (52, 44, 37), + (44, 40, 37), (36, 40, 37), (32, 32, 37), (40, 44, 28), + (36, 44, 28), (36, 40, 28), (28, 36, 28), (20, 32, 28), + (19, 24, 28), (20, 24, 28), (28, 28, 28), (35, 32, 37), + (27, 36, 37), (12, 36, 47), (20, 36, 28), (32, 32, 28), + (32, 32, 28), (36, 44, 28), (36, 48, 28), (40, 48, 28), + (52, 56, 28), (56, 60, 28), (60, 60, 28), (64, 60, 37), + (81, 77, 47), (93, 89, 47), (109, 92, 37), (113, 88, 47), + (129, 96, 56), (125, 100, 56), (125, 100, 56), (129, 96, 56), + (121, 84, 56), (117, 84, 56), (109, 80, 47), (109, 76, 46), + (97, 80, 47), (85, 77, 56), (84, 76, 56), (81, 72, 66), + (77, 73, 66), (89, 97, 85), (137, 177, 188), (169, 210, 216), + (173, 210, 216), (173, 206, 216), (177, 202, 198), (182, 119, 75), + (166, 103, 56), (162, 99, 56), (178, 123, 75), (181, 206, 207), + (181, 210, 216), (181, 210, 216), (177, 210, 216), (177, 210, 216), + (177, 210, 207), (165, 133, 103), (149, 108, 56), (141, 107, 56), + (145, 103, 56), (145, 100, 56), (158, 103, 75), (169, 210, 197), + (169, 210, 216), (169, 206, 207), (141, 125, 113), (133, 88, 75), + (121, 84, 65), (125, 76, 56), (117, 80, 56), (117, 76, 47), + (121, 80, 46), (121, 88, 47), (125, 84, 56), (133, 92, 56), + (141, 103, 56), (141, 104, 75), (149, 149, 122), (177, 202, 216), + (177, 210, 216), (181, 214, 216), (185, 218, 216), (185, 214, 216), + (181, 210, 226), (181, 210, 226), (177, 210, 226), (173, 210, 216), + (161, 206, 197), (121, 121, 85), (101, 88, 56), (84, 76, 47), + (68, 68, 37), (52, 60, 37), (52, 60, 28), (40, 60, 47), + (56, 68, 28), (77, 64, 37), (109, 72, 46), (133, 88, 56), + (145, 96, 66), (170, 115, 85), (173, 206, 207), (177, 206, 216), + (177, 210, 226), (177, 206, 225), (177, 210, 216), (177, 214, 207), + (137, 137, 113), (129, 100, 75), (113, 88, 56), (93, 76, 37), + (85, 60, 9), (48, 44, 18), (44, 40, 28), (36, 28, 28), + (52, 35, 28), (52, 48, 47), (64, 56, 56), (76, 72, 56), + (93, 85, 56), (117, 109, 84), (157, 206, 207), (165, 206, 225), + (169, 206, 225), (169, 206, 225), (169, 210, 216), (165, 198, 207), + (121, 108, 94), (117, 88, 65), (109, 72, 56), (109, 72, 56), + (85, 72, 56), (80, 68, 56), (80, 64, 56), (76, 68, 56), + (81, 72, 56), (85, 76, 56), (105, 80, 56), (121, 80, 56), + (141, 96, 66), (145, 104, 75), (157, 166, 141), (181, 210, 207), + (189, 210, 216), (185, 214, 216), (185, 210, 207), (186, 127, 85), + (154, 99, 66), (145, 99, 56), (145, 99, 56), (146, 96, 47), + (158, 88, 47), (157, 99, 56), (186, 127, 75), (177, 206, 198), + (169, 210, 216), (153, 194, 207), (108, 104, 94), (85, 89, 75), + (73, 76, 56), (64, 68, 47), (56, 60, 47), (60, 60, 56), + (68, 60, 56), (72, 68, 56), (81, 77, 56), (89, 89, 47), + (93, 88, 56), (105, 97, 84), (165, 186, 197), (189, 206, 216), + (197, 214, 216), (206, 218, 216), (246, 229, 197), (246, 225, 188), + (206, 148, 94), (158, 100, 75), (133, 96, 65), (105, 76, 56), + (72, 60, 56), (32, 48, 56), (32, 48, 56), (32, 48, 56), + (24, 48, 66), (52, 68, 66), (77, 77, 84), (113, 121, 113), + (165, 206, 207), (181, 214, 216), (193, 218, 216), (193, 218, 216), + (202, 218, 216), (202, 218, 216), (202, 210, 198), (186, 131, 75), + (170, 119, 56), (174, 115, 66), (194, 144, 85), (185, 214, 207), + (181, 214, 216), (181, 218, 226), (181, 214, 226), (189, 214, 226), + (193, 218, 226), (197, 218, 226), (206, 218, 226), (206, 218, 226), + (201, 218, 226), (197, 218, 226), (198, 218, 207), (226, 214, 179), + (190, 136, 75), (174, 115, 66), (178, 111, 75), (194, 152, 103), + (185, 214, 207), (181, 210, 216), (177, 202, 216), (149, 133, 113), + (137, 100, 66), (141, 96, 56), (133, 84, 47), (125, 88, 37), + (129, 79, 37), (125, 80, 47), (109, 84, 37), (109, 76, 46), + (93, 80, 47), (68, 64, 47), (60, 60, 37), (60, 60, 37), + (68, 60, 47), (72, 68, 56), (73, 73, 66), (81, 85, 85), + (113, 133, 122), (165, 210, 216), (173, 210, 225), (173, 210, 226), + (173, 210, 216), (169, 214, 216), (165, 210, 207), (129, 125, 85), + (125, 104, 56), (109, 84, 56), (89, 76, 56), (81, 77, 56) + ), + +// 43 dentist-decor +((218, 185, 169), (214, 193, 151), (210, 189, 141), (202, 198, 132), + (178, 169, 113), (166, 162, 103), (149, 133, 94), (133, 120, 103), + (121, 109, 94), (109, 105, 84), (105, 101, 84), (105, 105, 85), + (109, 109, 85), (109, 109, 85), (109, 109, 85), (117, 109, 94), + (129, 129, 103), (137, 146, 94), (146, 166, 94), (146, 166, 85), + (137, 149, 85), (133, 141, 85), (141, 141, 85), (137, 146, 85), + (141, 137, 94), (137, 145, 103), (146, 154, 113), (158, 162, 122), + (157, 166, 113), (154, 170, 113), (150, 170, 122), (166, 182, 132), + (194, 177, 141), (210, 185, 141), (218, 185, 151), (230, 180, 141), + (234, 180, 150), (234, 176, 141), (230, 172, 131), (214, 157, 113), + (198, 145, 113), (182, 128, 103), (153, 108, 94), (141, 100, 84), + (121, 101, 84), (117, 92, 84), (109, 88, 94), (96, 80, 94), + (121, 76, 94), (117, 92, 94), (117, 105, 94), (117, 92, 94), + (129, 100, 94), (133, 125, 103), (153, 132, 103), (174, 141, 122), + (190, 148, 113), (194, 165, 113), (219, 161, 122), (230, 180, 141), + (230, 180, 141), (238, 180, 141), (234, 157, 151), (230, 172, 141), + (234, 157, 160), (234, 156, 150), (230, 157, 169), (222, 149, 151), + (219, 145, 141), (206, 149, 122), (198, 140, 113), (190, 128, 113), + (186, 136, 103), (194, 128, 104), (194, 136, 103), (202, 140, 103), + (202, 145, 113), (202, 152, 113), (210, 152, 113), (222, 161, 113), + (222, 169, 122), (219, 165, 122), (219, 169, 132), (214, 169, 132), + (210, 165, 132), (214, 161, 132), (219, 145, 141), (219, 141, 132), + (222, 141, 141), (219, 145, 141), (214, 161, 141), (206, 168, 132), + (202, 173, 132), (174, 170, 122), (149, 149, 103), (137, 133, 94), + (113, 108, 85), (101, 93, 84), (81, 77, 75), (77, 81, 75), + (85, 85, 84), (109, 97, 84), (137, 112, 75), (149, 112, 94), + (165, 119, 94), (186, 123, 94), (186, 128, 104), (194, 136, 113), + (194, 148, 113), (206, 165, 132), (222, 197, 160), (250, 245, 216), + (222, 197, 160), (214, 181, 160), (214, 181, 179), (250, 197, 197), + (238, 164, 169), (234, 157, 160), (234, 160, 150), (234, 145, 151), + (219, 141, 141), (206, 137, 141), (186, 144, 132), (178, 153, 132), + (166, 165, 122), (162, 170, 113), (146, 166, 103), (137, 150, 103), + (149, 137, 94), (174, 157, 103), (190, 173, 103), (202, 198, 113), + (206, 219, 132), (206, 202, 113), (190, 181, 122), (174, 169, 113), + (141, 141, 94), (105, 113, 85), (77, 81, 75), (60, 64, 66), + (48, 44, 47), (44, 44, 37), (36, 32, 37), (24, 32, 37), + (36, 36, 47), (52, 40, 56), (80, 64, 65), (84, 72, 75), + (105, 88, 84), (121, 113, 103), (145, 141, 113), (162, 149, 122), + (186, 157, 141), (202, 181, 151), (210, 189, 151), (210, 193, 160), + (222, 197, 160), (218, 189, 150), (206, 181, 141), (210, 165, 132), + (210, 153, 122), (210, 153, 122), (219, 141, 132), (219, 137, 132), + (206, 137, 122), (206, 148, 122), (206, 145, 122), (219, 137, 132), + (219, 141, 132), (222, 145, 141), (222, 153, 151), (222, 164, 150), + (219, 153, 151), (219, 145, 151), (206, 137, 151), (169, 132, 141), + (165, 141, 132), (145, 129, 113), (145, 108, 103), (133, 92, 103), + (137, 104, 103), (125, 113, 103), (125, 117, 103), (145, 116, 103), + (161, 128, 103), (178, 152, 94), (178, 161, 103), (178, 165, 94), + (166, 174, 94), (154, 166, 94), (174, 169, 94), (154, 162, 94), + (153, 149, 85), (157, 137, 94), (186, 132, 94), (186, 127, 94), + (190, 128, 94), (194, 136, 104), (190, 136, 104), (194, 140, 94), + (202, 140, 94), (202, 145, 103), (202, 145, 113), (206, 149, 122), + (206, 149, 132), (210, 141, 141), (214, 137, 141), (206, 137, 141), + (206, 137, 132), (198, 141, 132), (198, 145, 122), (194, 145, 122), + (178, 148, 122), (174, 161, 122), (166, 165, 103), (162, 178, 94), + (158, 170, 103), (162, 186, 113), (178, 186, 94), (190, 194, 103), + (190, 177, 122), (198, 173, 132), (186, 161, 151), (206, 145, 151), + (214, 141, 141), (219, 141, 132), (206, 141, 122), (219, 137, 113), + (202, 145, 122), (194, 140, 122), (182, 136, 113), (182, 132, 103), + (149, 120, 94), (121, 105, 84), (93, 76, 65), (85, 68, 66), + (72, 68, 75), (48, 48, 66), (48, 40, 47), (44, 44, 47), + (44, 40, 47), (40, 44, 47), (32, 40, 47), (28, 40, 56), + (32, 36, 56), (44, 44, 56), (68, 56, 66), (85, 81, 65), + (105, 101, 75), (117, 117, 85), (137, 133, 85), (133, 137, 94), + (145, 120, 85), (133, 108, 75), (97, 97, 66), (76, 68, 75) + ), + +// 44 greenland +((173, 210, 188), (169, 185, 198), (145, 169, 198), (141, 161, 188), + (137, 157, 179), (125, 153, 169), (120, 158, 169), (129, 158, 170), + (137, 174, 169), (162, 198, 160), (194, 234, 197), (206, 242, 206), + (229, 242, 225), (254, 238, 225), (254, 233, 216), (250, 237, 216), + (250, 229, 216), (234, 209, 188), (230, 201, 179), (222, 189, 169), + (206, 168, 141), (190, 173, 132), (214, 189, 160), (230, 197, 169), + (234, 201, 188), (230, 210, 197), (242, 225, 216), (250, 242, 235), + (238, 250, 244), (234, 242, 254), (218, 234, 254), (205, 222, 254), + (193, 210, 235), (181, 201, 226), (165, 181, 216), (141, 165, 198), + (137, 165, 188), (137, 169, 188), (145, 178, 170), (162, 210, 169), + (189, 226, 207), (197, 230, 216), (214, 238, 225), (222, 238, 244), + (222, 238, 254), (222, 238, 254), (221, 238, 254), (218, 238, 254), + (213, 242, 244), (197, 238, 225), (181, 230, 216), (177, 197, 216), + (137, 173, 188), (125, 158, 169), (120, 154, 170), (124, 157, 179), + (133, 165, 188), (153, 177, 198), (177, 193, 226), (189, 205, 235), + (201, 218, 235), (210, 238, 225), (214, 242, 225), (218, 242, 226), + (218, 242, 235), (218, 246, 235), (214, 242, 235), (214, 238, 235), + (214, 238, 235), (218, 238, 235), (218, 238, 235), (218, 238, 235), + (218, 238, 225), (214, 242, 225), (206, 238, 216), (198, 230, 207), + (181, 218, 188), (166, 186, 160), (150, 150, 170), (137, 141, 170), + (133, 141, 160), (125, 137, 160), (121, 145, 169), (120, 146, 170), + (124, 150, 170), (112, 153, 169), (116, 146, 170), (120, 154, 170), + (129, 154, 169), (145, 165, 179), (169, 202, 188), (189, 222, 207), + (189, 226, 207), (177, 206, 179), (174, 186, 151), (153, 166, 151), + (133, 146, 151), (133, 146, 151), (116, 141, 151), (108, 133, 151), + (104, 129, 151), (100, 129, 151), (104, 129, 160), (108, 133, 160), + (108, 137, 160), (112, 137, 160), (112, 137, 160), (113, 137, 160), + (116, 137, 160), (112, 141, 160), (112, 141, 170), (108, 141, 170), + (108, 137, 170), (108, 137, 170), (112, 133, 160), (116, 129, 141), + (104, 121, 132), (100, 117, 132), (100, 129, 132), (104, 133, 141), + (116, 133, 141), (116, 133, 151), (133, 141, 160), (145, 145, 160), + (166, 153, 151), (174, 161, 151), (182, 166, 160), (222, 189, 179), + (230, 201, 188), (206, 206, 216), (210, 222, 235), (222, 230, 244), + (222, 234, 254), (222, 234, 254), (226, 234, 254), (226, 234, 254), + (226, 242, 254), (226, 246, 254), (226, 246, 254), (230, 250, 254), + (234, 250, 254), (234, 250, 254), (230, 246, 254), (226, 246, 254), + (222, 242, 254), (218, 242, 244), (210, 238, 225), (193, 230, 216), + (202, 214, 197), (218, 193, 169), (202, 181, 151), (186, 169, 160), + (186, 181, 170), (189, 218, 207), (206, 238, 226), (214, 238, 235), + (222, 238, 244), (218, 234, 244), (213, 222, 244), (205, 218, 244), + (205, 218, 244), (197, 210, 235), (201, 206, 226), (193, 206, 226), + (189, 206, 226), (197, 214, 226), (214, 238, 226), (226, 242, 235), + (230, 246, 244), (230, 246, 244), (226, 246, 244), (222, 238, 244), + (222, 234, 244), (213, 218, 244), (201, 209, 235), (185, 201, 226), + (177, 193, 216), (161, 161, 179), (166, 153, 179), (170, 154, 151), + (178, 161, 151), (178, 169, 151), (202, 173, 151), (222, 193, 169), + (234, 205, 188), (246, 218, 216), (250, 230, 225), (230, 242, 244), + (226, 242, 254), (226, 242, 254), (226, 242, 254), (226, 242, 254), + (225, 238, 254), (222, 238, 254), (222, 238, 254), (222, 238, 254), + (222, 234, 254), (218, 234, 235), (217, 238, 225), (201, 234, 207), + (186, 222, 179), (162, 194, 160), (150, 182, 151), (129, 166, 141), + (125, 158, 132), (141, 146, 122), (145, 141, 132), (174, 153, 132), + (194, 161, 132), (202, 160, 132), (222, 189, 169), (234, 205, 188), + (238, 221, 216), (234, 234, 235), (226, 238, 244), (226, 238, 254), + (226, 238, 254), (226, 238, 254), (226, 238, 254), (230, 242, 254), + (230, 250, 244), (234, 254, 244), (246, 254, 235), (254, 245, 235), + (250, 242, 254), (238, 250, 254), (234, 246, 254), (234, 246, 244), + (234, 246, 244), (230, 242, 244), (226, 238, 244), (226, 242, 244), + (226, 242, 244), (226, 246, 244), (226, 246, 244), (226, 250, 244), + (226, 246, 244), (222, 242, 244), (222, 238, 244), (222, 234, 244), + (214, 226, 244), (205, 218, 244), (185, 201, 235), (173, 193, 216), + (145, 165, 188), (129, 153, 170), (125, 149, 160), (120, 146, 160), + (112, 146, 160), (112, 146, 151), (112, 142, 160), (112, 141, 160), + (112, 141, 170), (116, 141, 170), (116, 141, 170), (112, 141, 169) + ), + +// 45 purple-dress +((198, 96, 142), (206, 108, 142), (198, 136, 122), (178, 153, 132), + (182, 149, 141), (174, 149, 132), (158, 137, 113), (153, 120, 103), + (153, 111, 103), (153, 107, 94), (146, 104, 85), (137, 100, 84), + (121, 92, 84), (109, 89, 84), (109, 85, 84), (109, 85, 84), + (117, 84, 84), (137, 96, 94), (149, 104, 94), (170, 88, 113), + (178, 92, 123), (178, 88, 132), (186, 96, 142), (194, 100, 142), + (194, 104, 132), (182, 128, 113), (173, 132, 113), (162, 136, 113), + (154, 137, 113), (153, 133, 113), (157, 124, 113), (154, 116, 113), + (169, 92, 123), (177, 88, 132), (190, 100, 142), (206, 108, 151), + (219, 121, 170), (238, 141, 188), (246, 168, 207), (246, 205, 188), + (219, 173, 151), (246, 188, 178), (249, 225, 225), (190, 161, 151), + (174, 149, 132), (165, 128, 113), (165, 115, 94), (166, 111, 94), + (174, 120, 103), (170, 132, 113), (166, 141, 122), (165, 141, 122), + (161, 141, 132), (157, 137, 132), (157, 137, 141), (169, 141, 141), + (174, 150, 151), (178, 157, 141), (182, 157, 141), (178, 153, 141), + (186, 161, 151), (210, 117, 161), (218, 121, 161), (219, 121, 161), + (218, 112, 161), (222, 125, 160), (219, 157, 141), (219, 161, 141), + (202, 153, 122), (170, 140, 122), (161, 124, 122), (157, 96, 132), + (149, 88, 132), (153, 88, 132), (157, 84, 122), (161, 80, 123), + (169, 84, 142), (173, 92, 142), (177, 88, 142), (169, 88, 132), + (157, 84, 122), (149, 80, 113), (141, 80, 103), (137, 92, 94), + (145, 104, 94), (146, 116, 94), (145, 124, 103), (150, 129, 103), + (154, 128, 103), (161, 124, 94), (158, 116, 94), (158, 112, 94), + (153, 124, 113), (150, 128, 113), (150, 133, 113), (145, 133, 113), + (145, 133, 122), (153, 129, 132), (153, 133, 132), (154, 133, 132), + (154, 133, 122), (153, 133, 122), (153, 133, 113), (161, 128, 113), + (165, 120, 113), (186, 104, 123), (190, 96, 123), (198, 100, 132), + (202, 104, 132), (198, 104, 132), (182, 100, 132), (170, 112, 123), + (157, 128, 122), (162, 137, 122), (162, 140, 122), (161, 133, 113), + (170, 124, 113), (186, 104, 132), (198, 104, 132), (202, 104, 142), + (206, 104, 142), (206, 104, 142), (202, 100, 142), (202, 96, 142), + (198, 100, 142), (198, 104, 142), (202, 104, 142), (198, 100, 151), + (198, 101, 151), (198, 108, 151), (190, 100, 151), (198, 100, 151), + (194, 100, 142), (190, 104, 142), (182, 104, 132), (165, 120, 113), + (158, 124, 113), (158, 120, 113), (153, 108, 113), (153, 88, 122), + (165, 92, 122), (166, 104, 104), (157, 112, 104), (157, 120, 113), + (154, 120, 113), (149, 125, 113), (149, 116, 113), (141, 112, 103), + (133, 112, 103), (133, 108, 103), (133, 100, 94), (117, 92, 84), + (109, 85, 84), (97, 81, 84), (97, 85, 84), (117, 96, 84), + (145, 104, 94), (157, 111, 103), (174, 100, 123), (186, 96, 132), + (190, 100, 132), (190, 92, 132), (182, 100, 132), (157, 120, 122), + (141, 112, 113), (133, 104, 103), (117, 100, 103), (121, 108, 113), + (137, 116, 113), (145, 124, 113), (149, 129, 122), (153, 132, 122), + (157, 133, 122), (161, 141, 122), (165, 141, 122), (165, 137, 132), + (166, 137, 132), (186, 104, 142), (194, 100, 142), (198, 100, 142), + (198, 104, 142), (194, 100, 142), (190, 104, 132), (178, 124, 113), + (162, 124, 104), (145, 120, 113), (129, 112, 103), (108, 96, 94), + (100, 88, 94), (109, 89, 84), (121, 96, 84), (133, 100, 94), + (141, 104, 94), (137, 104, 94), (121, 100, 94), (108, 92, 94), + (100, 84, 94), (97, 81, 84), (89, 81, 75), (89, 73, 75), + (89, 73, 75), (93, 77, 84), (104, 84, 93), (133, 92, 94), + (161, 84, 122), (186, 96, 142), (198, 104, 151), (210, 112, 161), + (222, 125, 170), (238, 137, 188), (238, 137, 188), (234, 133, 189), + (222, 121, 170), (210, 112, 151), (202, 132, 122), (190, 136, 113), + (202, 149, 113), (186, 132, 104), (182, 128, 103), (182, 123, 104), + (166, 120, 113), (169, 88, 123), (165, 84, 123), (161, 80, 122), + (153, 76, 122), (153, 84, 122), (137, 92, 113), (141, 100, 103), + (141, 112, 113), (149, 120, 122), (145, 116, 122), (145, 120, 122), + (149, 124, 122), (157, 133, 122), (166, 141, 122), (170, 145, 122), + (170, 145, 122), (170, 145, 132), (162, 141, 132), (166, 141, 132), + (170, 137, 132), (194, 108, 151), (198, 112, 161), (198, 108, 161), + (202, 100, 161), (206, 104, 151), (206, 108, 151), (210, 108, 151), + (206, 100, 151), (202, 100, 151), (202, 100, 151), (202, 96, 142), + (198, 96, 142), (194, 92, 132), (178, 88, 123), (166, 84, 123) + ), + +// 46 no-name +((121, 92, 75), (162, 132, 103), (182, 152, 122), (198, 169, 141), + (210, 189, 160), (206, 210, 188), (194, 198, 188), (202, 185, 170), + (206, 181, 160), (206, 177, 151), (202, 177, 160), (198, 177, 151), + (194, 173, 160), (194, 173, 160), (194, 173, 160), (198, 173, 151), + (194, 165, 151), (186, 157, 141), (186, 153, 132), (186, 148, 122), + (170, 128, 94), (145, 84, 66), (109, 64, 37), (81, 68, 37), + (64, 60, 37), (48, 56, 37), (56, 52, 28), (48, 60, 37), + (56, 60, 37), (60, 60, 37), (72, 68, 37), (89, 51, 28), + (109, 59, 28), (133, 72, 28), (166, 115, 66), (186, 148, 103), + (190, 157, 132), (194, 165, 151), (190, 181, 170), (202, 206, 207), + (202, 214, 207), (197, 214, 216), (197, 214, 216), (197, 214, 216), + (193, 214, 216), (197, 214, 216), (201, 214, 216), (206, 214, 216), + (206, 210, 216), (206, 214, 207), (202, 214, 198), (194, 206, 188), + (186, 182, 169), (190, 173, 141), (194, 173, 113), (202, 173, 113), + (214, 181, 122), (230, 193, 141), (230, 201, 160), (234, 201, 169), + (234, 205, 169), (234, 205, 169), (230, 201, 169), (230, 197, 160), + (222, 189, 160), (202, 169, 141), (182, 153, 122), (158, 141, 94), + (121, 76, 56), (85, 52, 37), (68, 35, 28), (60, 40, 37), + (48, 39, 37), (52, 44, 28), (44, 44, 37), (44, 44, 37), + (44, 52, 37), (40, 44, 28), (36, 44, 37), (40, 48, 47), + (44, 44, 47), (48, 44, 47), (56, 48, 56), (68, 48, 56), + (72, 52, 47), (92, 68, 46), (105, 93, 65), (137, 141, 85), + (146, 154, 94), (154, 153, 103), (158, 157, 113), (129, 141, 132), + (84, 97, 85), (64, 81, 66), (44, 60, 47), (36, 44, 47), + (28, 32, 28), (31, 24, 18), (24, 28, 28), (20, 28, 28), + (20, 24, 28), (20, 24, 28), (20, 24, 28), (20, 32, 28), + (20, 32, 28), (20, 32, 28), (20, 36, 28), (32, 36, 37), + (40, 44, 47), (52, 52, 47), (64, 52, 47), (72, 68, 56), + (93, 105, 66), (133, 146, 94), (178, 169, 113), (222, 193, 151), + (234, 205, 169), (242, 217, 188), (222, 226, 207), (222, 226, 216), + (226, 222, 216), (226, 230, 216), (218, 226, 216), (202, 218, 216), + (201, 214, 216), (201, 210, 216), (202, 218, 216), (206, 218, 207), + (210, 218, 207), (234, 209, 179), (230, 205, 169), (226, 193, 160), + (202, 173, 132), (190, 165, 113), (162, 149, 94), (113, 97, 75), + (85, 80, 56), (64, 68, 47), (52, 56, 47), (44, 48, 47), + (40, 52, 47), (44, 52, 56), (52, 60, 56), (72, 72, 66), + (93, 80, 65), (105, 121, 85), (137, 150, 94), (166, 165, 103), + (178, 153, 113), (190, 169, 122), (194, 169, 132), (198, 169, 141), + (202, 185, 160), (202, 214, 198), (198, 214, 207), (198, 210, 207), + (189, 210, 207), (181, 198, 188), (190, 177, 170), (182, 161, 151), + (178, 145, 122), (146, 92, 75), (129, 68, 46), (129, 68, 47), + (141, 112, 85), (186, 153, 122), (219, 193, 160), (234, 209, 178), + (214, 214, 207), (210, 218, 207), (206, 218, 207), (206, 214, 198), + (194, 177, 170), (186, 153, 141), (169, 140, 113), (125, 104, 75), + (97, 80, 75), (77, 77, 66), (72, 76, 75), (97, 109, 75), + (146, 146, 94), (182, 157, 122), (202, 173, 141), (219, 185, 151), + (226, 189, 141), (214, 164, 132), (198, 161, 113), (182, 140, 94), + (141, 92, 66), (109, 59, 46), (117, 72, 46), (146, 88, 66), + (182, 131, 94), (202, 157, 122), (230, 193, 141), (242, 201, 150), + (242, 213, 169), (242, 213, 178), (238, 213, 178), (230, 201, 160), + (226, 193, 141), (206, 168, 113), (194, 161, 94), (170, 153, 103), + (137, 145, 85), (109, 104, 66), (77, 77, 56), (64, 64, 56), + (64, 64, 56), (76, 72, 66), (97, 88, 75), (129, 125, 85), + (169, 149, 122), (182, 145, 132), (190, 145, 132), (190, 157, 132), + (190, 157, 132), (194, 161, 132), (186, 157, 132), (178, 145, 122), + (137, 104, 84), (109, 64, 56), (72, 64, 56), (64, 60, 56), + (60, 64, 47), (60, 68, 47), (60, 64, 47), (68, 64, 56), + (93, 81, 65), (125, 133, 85), (150, 145, 103), (178, 153, 122), + (186, 165, 132), (190, 165, 132), (190, 161, 141), (194, 165, 141), + (190, 165, 132), (190, 165, 132), (190, 164, 132), (190, 161, 122), + (174, 152, 113), (150, 145, 94), (113, 84, 65), (89, 72, 56), + (68, 64, 47), (52, 48, 37), (36, 28, 37), (28, 28, 37), + (19, 32, 37), (16, 24, 28), (19, 20, 18), (16, 20, 28), + (20, 24, 28), (24, 28, 28), (32, 40, 28), (48, 44, 28) + ), + +// 47 spring-flora +((51, 67, 36), (53, 66, 34), (51, 62, 29), (40, 51, 23), +(40, 42, 26), (37, 43, 25), (36, 48, 25), (32, 46, 23), +(34, 44, 22), (21, 28, 17), (18, 19, 14), (16, 17, 11), +(15, 17, 11), (13, 15, 10), (13, 14, 12), (13, 14, 12), +(15, 17, 13), (17, 21, 14), (26, 35, 21), (34, 44, 28), +(42, 51, 39), (49, 59, 39), (50, 64, 54), (55, 57, 63), +(57, 54, 66), (55, 37, 59), (50, 27, 51), (44, 38, 28), +(26, 32, 18), (17, 20, 14), (15, 18, 12), (14, 16, 10), +(14, 14, 9), (18, 18, 13), (19, 23, 16), (31, 41, 36), +(44, 40, 58), (52, 48, 72), (66, 53, 79), (65, 63, 76), +(63, 61, 68), (54, 63, 42), (53, 66, 34), (46, 67, 34), +(46, 62, 32), (35, 51, 24), (26, 35, 19), (18, 19, 14), +(12, 13, 9), (9, 10, 7), (8, 6, 5), (7, 5, 4), +(9, 6, 6), (11, 9, 9), (14, 15, 11), (21, 22, 15), +(44, 31, 50), (48, 27, 54), (55, 39, 59), (53, 32, 59), +(48, 38, 62), (44, 43, 55), (50, 59, 42), (53, 67, 39), +(54, 72, 45), (58, 79, 44), (63, 87, 44), (61, 87, 42), +(58, 79, 42), (56, 74, 36), (50, 72, 34), (45, 66, 34), +(36, 57, 31), (32, 44, 26), (23, 33, 20), (16, 20, 15), +(15, 19, 12), (17, 19, 13), (17, 20, 15), (23, 33, 22), +(30, 46, 29), (36, 55, 32), (41, 62, 33), (46, 67, 34), +(48, 66, 36), (50, 66, 37), (50, 66, 37), (53, 66, 37), +(51, 67, 39), (53, 67, 38), (55, 72, 42), (57, 72, 42), +(52, 72, 45), (52, 72, 45), (49, 72, 45), (49, 72, 42), +(50, 72, 37), (50, 72, 37), (47, 72, 42), (51, 74, 39), +(57, 72, 34), (55, 72, 39), (57, 75, 39), (61, 79, 39), +(70, 81, 37), (76, 89, 51), (82, 102, 67), (86, 112, 73), +(100, 114, 76), (89, 118, 60), (102, 126, 88), (114, 140, 97), +(135, 152, 98), (112, 127, 93), (118, 140, 93), (191, 174, 163), +(143, 154, 113), (99, 127, 100), (93, 120, 59), (79, 102, 60), +(82, 103, 67), (83, 104, 71), (86, 103, 72), (86, 103, 64), +(87, 87, 52), (73, 88, 50), (76, 80, 52), (62, 87, 57), +(70, 88, 50), (71, 84, 56), (70, 75, 50), (67, 74, 44), +(57, 72, 42), (52, 72, 42), (47, 66, 40), (41, 54, 36), +(34, 42, 25), (21, 27, 16), (16, 19, 12), (12, 11, 10), +(10, 8, 7), (7, 5, 5), (6, 4, 4), (5, 4, 3), +(5, 3, 4), (5, 4, 3), (5, 5, 5), (6, 5, 5), +(6, 4, 5), (7, 4, 5), (7, 4, 5), (7, 5, 5), +(8, 6, 6), (10, 8, 7), (13, 11, 10), (14, 15, 11), +(19, 21, 15), (39, 33, 23), (48, 47, 30), (60, 57, 53), +(79, 65, 97), (74, 58, 76), (106, 59, 79), (96, 90, 85), +(84, 62, 85), (88, 79, 94), (80, 82, 72), (70, 69, 59), +(57, 69, 54), (60, 79, 47), (58, 79, 47), (58, 79, 46), +(54, 79, 44), (53, 79, 44), (53, 79, 44), (53, 79, 47), +(55, 79, 50), (60, 79, 50), (62, 87, 49), (60, 87, 52), +(61, 94, 52), (67, 94, 52), (76, 94, 56), (86, 118, 56), +(80, 96, 53), (83, 109, 44), (83, 110, 55), (76, 103, 55), +(73, 102, 54), (68, 88, 50), (63, 79, 44), (57, 72, 39), +(55, 72, 34), (53, 67, 34), (50, 66, 37), (44, 62, 36), +(44, 55, 38), (41, 57, 35), (40, 61, 36), (41, 62, 38), +(44, 72, 42), (55, 79, 41), (61, 87, 47), (67, 94, 47), +(77, 103, 53), (89, 118, 57), (86, 117, 57), (89, 118, 76), +(114, 127, 85), (106, 126, 97), (93, 119, 76), (82, 117, 72), +(73, 102, 59), (60, 87, 52), (49, 72, 45), (39, 57, 34), +(32, 46, 27), (23, 33, 18), (17, 23, 13), (17, 21, 13), +(17, 20, 14), (22, 27, 17), (33, 42, 25), (36, 47, 28), +(44, 57, 31), (49, 62, 33), (49, 63, 35), (45, 58, 33), +(37, 51, 27), (32, 44, 23), (23, 33, 17), (16, 21, 13), +(12, 15, 8), (11, 13, 7), (11, 11, 7), (10, 14, 8), +(12, 12, 9), (13, 15, 8), (15, 19, 11), (19, 23, 15), +(29, 44, 22), (35, 52, 29), (39, 57, 30), (46, 67, 28), +(50, 66, 28), (47, 72, 29), (47, 63, 30), (39, 57, 27), +(32, 51, 25), (28, 40, 25), (21, 26, 17), (19, 23, 15), +(28, 35, 21), (35, 47, 26), (46, 62, 33), (53, 67, 39) +), + +// 48 andi +((53, 15, 5), (77, 47, 22), (92, 69, 39), (112, 83, 55), +(126, 90, 59), (138, 87, 63), (140, 90, 66), (140, 93, 64), +(137, 88, 50), (122, 82, 32), (100, 62, 19), (72, 31, 12), +(52, 2, 1), (20, 0, 0), (2, 0, 0), (2, 0, 0), +(24, 21, 12), (72, 34, 30), (82, 53, 47), (97, 62, 41), +(108, 71, 42), (122, 77, 55), (132, 81, 65), (136, 92, 71), +(137, 92, 71), (137, 94, 71), (136, 92, 71), (135, 82, 69), +(132, 74, 61), (115, 67, 53), (106, 59, 54), (85, 45, 42), +(48, 13, 21), (16, 2, 1), (0, 0, 0), (0, 0, 0), +(0, 0, 0), (2, 0, 0), (46, 17, 5), (73, 36, 18), +(84, 60, 38), (116, 76, 52), (137, 83, 59), (148, 94, 71), +(157, 104, 76), (162, 109, 79), (160, 118, 82), (156, 116, 79), +(153, 110, 79), (148, 102, 73), (148, 93, 72), (143, 87, 65), +(145, 81, 58), (144, 81, 55), (146, 79, 49), (140, 81, 48), +(143, 84, 48), (149, 88, 63), (151, 91, 65), (148, 90, 67), +(145, 87, 68), (144, 87, 68), (138, 91, 68), (137, 88, 62), +(118, 85, 56), (111, 83, 43), (100, 74, 36), (100, 63, 33), +(100, 56, 24), (94, 63, 20), (96, 52, 20), (87, 56, 18), +(88, 48, 14), (72, 38, 7), (68, 23, 6), (69, 20, 11), +(83, 34, 12), (97, 43, 28), (100, 46, 40), (114, 66, 50), +(122, 87, 64), (129, 104, 76), (142, 119, 101), (162, 134, 122), +(170, 150, 140), (168, 162, 155), (184, 175, 167), (178, 167, 159), +(174, 157, 148), (164, 151, 133), (163, 143, 115), (149, 127, 91), +(140, 106, 63), (117, 76, 51), (89, 46, 30), (57, 13, 4), +(23, 0, 0), (2, 0, 0), (0, 0, 0), (0, 0, 0), +(19, 6, 1), (56, 21, 8), (86, 50, 35), (108, 57, 48), +(126, 65, 49), (130, 68, 57), (128, 72, 48), (133, 65, 46), +(128, 68, 40), (135, 65, 29), (120, 66, 24), (130, 57, 20), +(97, 47, 11), (73, 23, 7), (63, 14, 2), (54, 0, 0), +(54, 0, 0), (65, 18, 11), (83, 55, 30), (89, 61, 37), +(105, 74, 43), (116, 89, 52), (130, 96, 61), (129, 97, 66), +(132, 96, 71), (141, 100, 78), (142, 109, 76), (145, 108, 76), +(149, 114, 80), (151, 116, 80), (151, 117, 84), (154, 119, 87), +(170, 128, 103), (177, 137, 108), (173, 147, 120), (172, 152, 124), +(176, 156, 141), (187, 171, 142), (182, 172, 146), (174, 157, 140), +(172, 156, 121), (161, 145, 106), (155, 136, 98), (153, 132, 93), +(148, 118, 87), (150, 108, 77), (149, 100, 74), (150, 93, 72), +(145, 92, 61), (143, 89, 62), (140, 85, 57), (140, 89, 52), +(138, 100, 54), (134, 101, 59), (135, 99, 59), (141, 97, 64), +(142, 94, 66), (138, 98, 59), (132, 99, 54), (130, 96, 49), +(120, 91, 38), (105, 60, 17), (94, 14, 3), (61, 0, 0), +(59, 4, 2), (68, 13, 17), (88, 27, 10), (96, 48, 19), +(111, 73, 37), (125, 88, 42), (130, 94, 50), (140, 96, 58), +(148, 97, 69), (150, 98, 73), (153, 103, 80), (158, 110, 79), +(155, 110, 84), (158, 110, 80), (157, 105, 79), (155, 102, 75), +(152, 98, 73), (154, 97, 72), (163, 96, 70), (164, 106, 80), +(165, 112, 81), (164, 117, 80), (163, 118, 81), (162, 120, 81), +(158, 117, 80), (152, 109, 77), (140, 100, 73), (126, 87, 68), +(118, 80, 61), (105, 63, 45), (91, 53, 25), (88, 44, 12), +(86, 40, 15), (104, 35, 17), (117, 57, 30), (117, 68, 42), +(131, 80, 42), (127, 82, 47), (124, 86, 46), (126, 82, 39), +(120, 86, 40), (109, 68, 30), (104, 60, 25), (95, 65, 24), +(101, 66, 21), (103, 65, 36), (107, 72, 39), (116, 82, 42), +(124, 88, 46), (124, 91, 52), (121, 100, 56), (126, 102, 62), +(131, 100, 70), (136, 96, 72), (140, 95, 72), (142, 93, 72), +(142, 96, 72), (143, 93, 68), (140, 93, 70), (140, 90, 70), +(142, 89, 70), (140, 82, 64), (137, 75, 60), (132, 77, 55), +(125, 87, 60), (120, 89, 62), (128, 104, 70), (136, 111, 76), +(147, 118, 89), (156, 135, 117), (159, 145, 124), (174, 148, 130), +(179, 151, 125), (174, 151, 119), (173, 148, 113), (178, 146, 100), +(170, 143, 112), (161, 138, 109), (161, 134, 92), (160, 125, 81), +(161, 135, 91), (170, 123, 85), (164, 122, 88), (153, 130, 80), +(152, 118, 84), (148, 119, 80), (139, 111, 77), (141, 111, 73), +(137, 109, 79), (135, 108, 93), (143, 111, 94), (148, 128, 100) +), + +// 49 gig-o835 +((56, 97, 85), (76, 105, 84), (77, 117, 84), (76, 109, 94), +(84, 109, 94), (88, 113, 94), (92, 125, 94), (101, 121, 103), +(105, 133, 113), (113, 145, 122), (113, 149, 122), (101, 141, 113), +(92, 125, 103), (84, 113, 94), (81, 101, 75), (56, 97, 66), +(52, 89, 66), (36, 81, 66), (28, 77, 66), (44, 72, 47), +(20, 60, 47), (20, 60, 47), (16, 68, 66), (16, 68, 66), +(4, 68, 75), (4, 81, 84), (12, 89, 103), (16, 101, 122), +(28, 101, 122), (28, 105, 122), (28, 113, 122), (36, 105, 122), +(36, 105, 122), (48, 105, 122), (52, 105, 113), (48, 109, 103), +(44, 101, 93), (40, 97, 84), (48, 89, 75), (40, 76, 56), +(24, 72, 56), (28, 72, 56), (24, 76, 56), (40, 72, 66), +(48, 89, 75), (56, 93, 84), (68, 105, 103), (68, 117, 122), +(68, 117, 122), (72, 117, 122), (72, 121, 113), (76, 121, 113), +(84, 125, 103), (89, 125, 103), (92, 121, 113), (93, 129, 103), +(104, 145, 122), (100, 157, 141), (121, 162, 150), (125, 166, 169), +(161, 182, 169), (173, 210, 197), (161, 186, 160), (137, 178, 179), +(121, 165, 160), (108, 145, 141), (92, 141, 131), (80, 129, 131), +(80, 125, 122), (76, 125, 122), (76, 129, 112), (72, 125, 103), +(72, 117, 103), (72, 117, 103), (68, 121, 113), (60, 121, 112), +(52, 117, 122), (48, 121, 131), (40, 117, 141), (40, 113, 141), +(48, 121, 150), (56, 117, 160), (64, 125, 150), (76, 125, 132), +(89, 138, 132), (100, 146, 141), (112, 154, 150), (117, 149, 151), +(116, 145, 150), (112, 149, 150), (100, 146, 160), (80, 142, 160), +(60, 130, 150), (48, 121, 141), (36, 117, 131), (36, 113, 131), +(56, 113, 131), (68, 121, 131), (76, 125, 132), (84, 137, 131), +(96, 142, 141), (100, 149, 150), (100, 146, 160), (104, 150, 160), +(100, 142, 160), (100, 133, 150), (92, 129, 132), (88, 125, 122), +(89, 121, 103), (80, 113, 103), (72, 105, 94), (72, 101, 85), +(64, 93, 75), (36, 93, 84), (28, 97, 93), (12, 81, 84), +(12, 89, 103), (4, 77, 103), (16, 93, 103), (19, 97, 103), +(32, 93, 94), (48, 97, 94), (64, 105, 94), (76, 117, 94), +(93, 121, 103), (97, 121, 103), (92, 125, 113), (84, 125, 113), +(92, 129, 113), (84, 133, 113), (88, 129, 122), (88, 129, 122), +(92, 129, 122), (96, 129, 122), (108, 129, 122), (112, 141, 132), +(109, 153, 131), (108, 146, 141), (113, 149, 141), (125, 149, 132), +(113, 150, 132), (108, 153, 141), (108, 162, 150), (113, 166, 150), +(112, 154, 141), (116, 149, 141), (117, 153, 141), (120, 154, 151), +(125, 162, 151), (133, 162, 151), (141, 170, 151), (145, 174, 160), +(141, 178, 169), (137, 182, 179), (133, 162, 160), (125, 162, 141), +(121, 157, 132), (117, 146, 122), (109, 145, 122), (96, 133, 113), +(88, 121, 113), (84, 113, 103), (76, 113, 103), (68, 113, 103), +(60, 105, 103), (52, 101, 94), (48, 101, 103), (28, 101, 112), +(32, 109, 131), (28, 105, 132), (32, 113, 132), (39, 117, 131), +(56, 121, 132), (68, 125, 131), (68, 125, 131), (76, 129, 131), +(73, 130, 132), (72, 134, 141), (81, 134, 151), (80, 134, 160), +(84, 134, 150), (84, 134, 141), (88, 129, 132), (100, 133, 132), +(100, 137, 132), (100, 142, 132), (100, 137, 141), (100, 142, 141), +(97, 142, 132), (92, 146, 121), (88, 133, 122), (88, 129, 122), +(88, 129, 122), (88, 133, 122), (96, 137, 122), (96, 137, 122), +(108, 145, 132), (112, 141, 132), (108, 145, 141), (116, 141, 141), +(108, 141, 150), (96, 146, 160), (72, 130, 160), (60, 126, 150), +(44, 117, 141), (36, 109, 131), (40, 105, 122), (44, 109, 122), +(60, 113, 122), (72, 121, 122), (85, 129, 122), (96, 133, 131), +(100, 133, 132), (104, 133, 132), (104, 137, 141), (108, 137, 141), +(104, 133, 141), (100, 133, 132), (92, 121, 122), (88, 117, 122), +(76, 117, 113), (80, 117, 103), (76, 117, 103), (72, 117, 103), +(68, 113, 103), (64, 113, 113), (56, 109, 113), (56, 109, 113), +(48, 113, 113), (52, 113, 112), (60, 117, 122), (73, 126, 132), +(80, 130, 160), (88, 138, 170), (80, 138, 170), (68, 134, 160), +(56, 130, 160), (40, 117, 160), (28, 113, 141), (20, 101, 141), +(24, 97, 132), (16, 97, 122), (20, 97, 112), (36, 97, 94), +(48, 101, 93), (60, 105, 94), (72, 117, 94), (77, 121, 103), +(84, 125, 122), (84, 134, 132), (88, 134, 150), (88, 137, 160), +(84, 142, 160), (76, 133, 141), (80, 125, 132), (80, 121, 122) +), + +// 50 rie02 +((48, 72, 37), (60, 85, 28), (48, 88, 28), (60, 76, 37), +(56, 64, 37), (48, 52, 28), (44, 48, 28), (36, 44, 28), +(24, 36, 18), (20, 36, 18), (24, 40, 18), (28, 44, 18), +(36, 40, 18), (36, 28, 18), (20, 20, 18), (12, 16, 9), +(16, 20, 9), (20, 24, 9), (28, 28, 9), (40, 44, 18), +(56, 52, 28), (68, 64, 37), (88, 72, 47), (85, 93, 47), +(85, 100, 56), (88, 96, 75), (93, 97, 75), (92, 97, 66), +(85, 101, 56), (88, 105, 66), (89, 105, 75), (84, 105, 66), +(89, 113, 66), (113, 141, 85), (133, 157, 122), (141, 190, 150), +(145, 182, 169), (129, 189, 188), (169, 181, 179), (177, 189, 169), +(210, 230, 160), (222, 234, 179), (246, 241, 159), (214, 230, 141), +(190, 218, 160), (198, 226, 122), (234, 246, 121), (218, 209, 112), +(157, 173, 93), (125, 149, 94), (121, 149, 84), (101, 125, 66), +(93, 109, 66), (89, 101, 47), (89, 117, 47), (101, 113, 47), +(113, 125, 56), (125, 133, 75), (153, 141, 84), (153, 157, 103), +(162, 194, 103), (182, 202, 103), (182, 190, 84), (194, 152, 112), +(137, 129, 94), (113, 113, 75), (89, 109, 66), (72, 92, 56), +(60, 89, 56), (56, 92, 56), (60, 93, 47), (64, 88, 47), +(56, 89, 56), (52, 89, 56), (52, 80, 56), (56, 80, 56), +(48, 72, 47), (44, 72, 47), (36, 60, 47), (32, 52, 56), +(36, 56, 66), (36, 56, 56), (36, 68, 56), (48, 88, 56), +(68, 101, 65), (97, 125, 85), (113, 149, 94), (145, 170, 122), +(149, 177, 112), (125, 153, 103), (97, 121, 84), (85, 93, 66), +(60, 64, 66), (36, 44, 47), (20, 36, 28), (12, 24, 18), +(8, 16, 0), (12, 12, 0), (20, 24, 18), (32, 48, 28), +(44, 60, 37), (68, 76, 47), (72, 89, 47), (64, 84, 47), +(81, 88, 47), (72, 93, 28), (60, 76, 47), (56, 56, 47), +(44, 56, 37), (32, 52, 28), (24, 52, 28), (20, 44, 18), +(28, 48, 9), (24, 48, 18), (28, 56, 28), (24, 56, 37), +(24, 56, 37), (28, 56, 37), (36, 60, 47), (48, 72, 37), +(52, 88, 37), (60, 97, 37), (60, 93, 47), (60, 96, 46), +(48, 76, 47), (40, 68, 37), (32, 52, 28), (28, 56, 28), +(16, 44, 18), (16, 40, 18), (16, 44, 9), (28, 48, 9), +(44, 52, 28), (36, 56, 18), (40, 64, 18), (36, 72, 37), +(44, 76, 37), (44, 76, 37), (40, 72, 37), (44, 56, 28), +(36, 52, 28), (28, 48, 28), (32, 40, 28), (32, 32, 18), +(24, 32, 28), (20, 40, 28), (28, 40, 37), (28, 36, 28), +(24, 40, 37), (24, 44, 37), (24, 52, 47), (28, 44, 47), +(28, 40, 37), (28, 48, 37), (20, 40, 37), (12, 40, 28), +(20, 32, 18), (16, 20, 18), (12, 20, 18), (12, 24, 9), +(12, 24, 9), (16, 36, 18), (20, 52, 28), (24, 60, 37), +(32, 76, 47), (44, 80, 56), (44, 81, 47), (48, 97, 47), +(60, 121, 37), (64, 109, 37), (72, 101, 47), (60, 93, 56), +(56, 89, 75), (60, 80, 94), (76, 93, 103), (88, 121, 94), +(101, 129, 75), (97, 145, 75), (93, 133, 56), (113, 157, 65), +(93, 121, 66), (85, 117, 47), (77, 101, 47), (68, 85, 37), +(60, 68, 37), (60, 56, 37), (56, 52, 37), (60, 60, 47), +(80, 80, 56), (88, 104, 75), (117, 129, 94), (149, 173, 113), +(166, 186, 141), (166, 198, 122), (173, 186, 132), (162, 178, 122), +(133, 149, 94), (117, 133, 75), (93, 113, 75), (84, 105, 75), +(60, 97, 75), (64, 68, 66), (44, 64, 75), (36, 52, 66), +(28, 56, 66), (28, 56, 66), (32, 48, 56), (36, 48, 47), +(52, 48, 28), (48, 56, 37), (48, 44, 28), (44, 52, 28), +(56, 56, 28), (60, 60, 28), (64, 68, 37), (80, 80, 56), +(105, 101, 66), (129, 129, 85), (133, 133, 113), (129, 137, 122), +(117, 145, 103), (121, 157, 84), (113, 145, 66), (97, 117, 66), +(76, 105, 56), (72, 113, 56), (68, 129, 56), (60, 125, 55), +(52, 109, 65), (52, 97, 65), (64, 105, 75), (89, 133, 94), +(125, 149, 113), (162, 174, 132), (153, 198, 151), (170, 198, 141), +(169, 206, 141), (174, 210, 132), (181, 214, 131), (169, 214, 140), +(174, 222, 141), (182, 206, 151), (190, 202, 150), (198, 198, 150), +(218, 213, 141), (214, 214, 160), (189, 206, 141), (190, 210, 103), +(174, 210, 75), (117, 153, 56), (105, 133, 56), (105, 125, 56), +(109, 109, 56), (93, 113, 66), (105, 109, 75), (117, 125, 113) +), + +// 51 rie05 +((73, 125, 84), (77, 141, 83), (89, 146, 83), (104, 154, 94), +(109, 170, 103), (146, 198, 113), (162, 214, 132), (182, 226, 160), +(198, 234, 160), (206, 234, 169), (218, 242, 178), (222, 238, 169), +(218, 226, 150), (222, 230, 141), (218, 230, 131), (210, 222, 131), +(206, 222, 122), (190, 219, 113), (203, 226, 122), (206, 226, 103), +(218, 226, 94), (211, 222, 94), (198, 222, 75), (170, 210, 94), +(170, 206, 103), (150, 194, 113), (137, 174, 113), (121, 170, 103), +(129, 174, 113), (129, 182, 113), (146, 198, 132), (162, 222, 160), +(182, 218, 169), (210, 234, 197), (230, 246, 206), (230, 246, 216), +(230, 242, 207), (222, 234, 197), (214, 238, 188), (214, 234, 169), +(214, 230, 150), (210, 230, 131), (198, 230, 122), (186, 219, 122), +(170, 206, 122), (154, 198, 113), (137, 182, 85), (125, 178, 75), +(121, 170, 84), (137, 153, 94), (141, 174, 94), (162, 182, 113), +(193, 201, 141), (205, 205, 178), (222, 230, 197), (234, 250, 206), +(246, 254, 197), (254, 241, 169), (246, 234, 159), (242, 250, 112), +(230, 238, 94), (222, 234, 112), (198, 222, 113), (190, 219, 103), +(198, 206, 103), (186, 214, 103), (174, 214, 113), (166, 218, 113), +(182, 214, 113), (186, 219, 122), (198, 226, 132), (202, 226, 150), +(222, 222, 160), (238, 234, 159), (246, 233, 169), (226, 238, 178), +(210, 234, 169), (198, 234, 160), (198, 230, 150), (202, 226, 132), +(207, 230, 122), (198, 226, 122), (186, 222, 113), (178, 214, 103), +(166, 206, 103), (166, 202, 94), (150, 190, 84), (141, 186, 75), +(153, 174, 66), (165, 169, 66), (150, 182, 85), (158, 194, 94), +(162, 194, 103), (162, 206, 103), (158, 206, 103), (166, 210, 113), +(162, 202, 113), (162, 210, 122), (166, 214, 113), (158, 206, 94), +(142, 194, 85), (129, 174, 85), (121, 166, 75), (121, 174, 75), +(121, 157, 75), (129, 162, 75), (154, 148, 37), (137, 157, 75), +(109, 154, 75), (121, 162, 103), (137, 170, 132), (166, 198, 151), +(178, 218, 169), (182, 214, 179), (185, 210, 179), (178, 218, 169), +(154, 198, 141), (125, 178, 122), (125, 186, 113), (146, 194, 103), +(150, 194, 103), (150, 194, 103), (154, 194, 94), (146, 198, 85), +(142, 194, 85), (142, 182, 85), (141, 182, 84), (146, 194, 75), +(150, 194, 75), (154, 198, 75), (158, 194, 56), (170, 198, 56), +(162, 206, 66), (190, 210, 75), (230, 187, 28), (254, 198, 9), +(242, 208, 37), (242, 225, 75), (246, 237, 112), (222, 242, 159), +(226, 238, 178), (242, 242, 207), (246, 242, 216), (246, 246, 225), +(242, 242, 225), (242, 241, 216), (226, 242, 188), (206, 234, 179), +(194, 226, 150), (178, 214, 132), (162, 210, 122), (129, 194, 103), +(117, 166, 85), (109, 149, 65), (101, 153, 75), (89, 150, 74), +(97, 158, 75), (101, 162, 84), (113, 170, 85), (137, 194, 94), +(154, 206, 103), (170, 206, 94), (189, 193, 84), (238, 208, 65), +(254, 228, 84), (254, 233, 102), (254, 221, 93), (230, 205, 94), +(182, 206, 113), (153, 177, 122), (113, 154, 94), (100, 150, 94), +(84, 129, 93), (73, 121, 75), (65, 117, 65), (61, 113, 56), +(60, 109, 56), (65, 113, 47), (61, 109, 56), (65, 109, 56), +(65, 113, 56), (69, 117, 65), (77, 129, 65), (93, 141, 65), +(93, 150, 74), (113, 158, 85), (133, 170, 85), (146, 190, 103), +(150, 190, 122), (157, 190, 132), (158, 202, 132), (162, 210, 132), +(174, 219, 122), (186, 222, 122), (198, 230, 150), (206, 230, 169), +(214, 230, 179), (222, 234, 197), (230, 246, 216), (238, 237, 225), +(238, 234, 235), (238, 238, 216), (226, 238, 188), (214, 230, 160), +(194, 218, 141), (190, 198, 131), (174, 198, 122), (174, 202, 122), +(174, 214, 122), (182, 219, 122), (194, 214, 132), (198, 226, 160), +(202, 226, 160), (202, 226, 160), (190, 222, 179), (190, 222, 179), +(194, 230, 179), (202, 230, 178), (214, 234, 178), (222, 230, 179), +(218, 234, 178), (210, 230, 169), (206, 218, 169), (182, 222, 160), +(154, 194, 141), (129, 170, 113), (101, 154, 93), (81, 141, 83), +(81, 133, 83), (77, 125, 74), (73, 121, 74), (69, 129, 65), +(73, 121, 74), (77, 129, 74), (109, 133, 75), (97, 146, 75), +(108, 154, 94), (125, 178, 103), (150, 202, 113), (166, 210, 122), +(186, 222, 141), (194, 222, 151), (194, 218, 151), (182, 218, 151), +(162, 218, 131), (170, 214, 122), (174, 210, 122), (182, 210, 122), +(186, 214, 122), (190, 214, 122), (194, 218, 132), (198, 230, 141), +(202, 230, 150), (207, 230, 141), (202, 218, 131), (190, 206, 122) +), + +// 52 rie11 +((174, 144, 103), (129, 96, 85), (117, 80, 66), (105, 92, 56), +(113, 80, 47), (101, 92, 66), (109, 113, 85), (125, 137, 103), +(161, 136, 122), (198, 152, 122), (206, 157, 132), (174, 165, 132), +(145, 158, 103), (113, 117, 94), (88, 92, 66), (68, 68, 56), +(60, 56, 47), (52, 43, 37), (48, 40, 37), (44, 44, 28), +(44, 44, 28), (44, 44, 37), (48, 48, 47), (52, 52, 47), +(52, 52, 47), (52, 52, 47), (44, 52, 56), (52, 56, 56), +(56, 56, 56), (56, 56, 56), (56, 60, 56), (60, 60, 56), +(64, 60, 56), (68, 56, 56), (64, 56, 47), (60, 60, 47), +(56, 56, 37), (52, 52, 37), (48, 48, 37), (48, 44, 37), +(48, 44, 37), (48, 44, 47), (44, 44, 56), (40, 48, 56), +(44, 56, 56), (48, 60, 66), (52, 64, 75), (56, 72, 75), +(81, 85, 85), (105, 97, 84), (121, 121, 103), (153, 125, 103), +(174, 140, 122), (194, 148, 132), (190, 152, 132), (161, 141, 113), +(133, 121, 94), (113, 96, 66), (92, 80, 56), (68, 60, 47), +(60, 52, 37), (52, 43, 28), (48, 35, 28), (48, 40, 28), +(52, 52, 37), (52, 56, 47), (56, 60, 47), (60, 56, 47), +(56, 52, 47), (48, 52, 47), (40, 44, 37), (32, 36, 28), +(32, 36, 28), (28, 32, 28), (36, 36, 28), (48, 48, 37), +(68, 60, 47), (85, 72, 56), (113, 92, 75), (153, 129, 103), +(178, 153, 122), (198, 165, 151), (198, 165, 151), (198, 165, 141), +(158, 154, 113), (133, 133, 94), (101, 97, 66), (76, 60, 47), +(73, 56, 37), (64, 48, 47), (64, 48, 47), (60, 56, 56), +(68, 68, 66), (72, 89, 66), (97, 105, 85), (121, 129, 103), +(145, 145, 122), (194, 165, 132), (210, 165, 141), (210, 173, 141), +(218, 181, 151), (218, 180, 160), (218, 177, 160), (198, 169, 141), +(157, 145, 113), (125, 125, 103), (109, 109, 75), (77, 77, 66), +(72, 76, 66), (73, 73, 75), (68, 60, 66), (60, 56, 56), +(48, 48, 56), (48, 48, 47), (44, 44, 47), (32, 36, 37), +(24, 28, 28), (20, 20, 28), (15, 20, 28), (12, 20, 18), +(12, 16, 18), (12, 16, 9), (12, 20, 9), (16, 16, 9), +(12, 20, 9), (16, 20, 9), (20, 20, 9), (20, 20, 9), +(23, 20, 9), (24, 20, 9), (27, 16, 9), (28, 24, 9), +(24, 20, 9), (23, 20, 18), (19, 20, 18), (24, 20, 18), +(31, 20, 18), (35, 24, 28), (28, 24, 18), (32, 24, 28), +(31, 24, 28), (28, 28, 28), (28, 32, 37), (24, 36, 47), +(28, 32, 47), (28, 32, 37), (23, 24, 28), (23, 20, 28), +(24, 28, 28), (28, 36, 37), (40, 40, 37), (44, 44, 47), +(44, 40, 56), (40, 40, 56), (31, 28, 37), (20, 20, 28), +(19, 16, 28), (16, 16, 28), (16, 16, 18), (16, 20, 18), +(16, 24, 18), (16, 24, 18), (20, 24, 18), (23, 20, 18), +(20, 24, 18), (24, 24, 18), (28, 28, 28), (40, 44, 28), +(48, 60, 37), (56, 60, 47), (56, 72, 56), (64, 72, 56), +(68, 64, 56), (68, 64, 66), (64, 64, 56), (68, 64, 66), +(68, 73, 66), (76, 76, 66), (68, 89, 85), (84, 96, 113), +(113, 117, 103), (145, 137, 122), (149, 141, 132), (137, 141, 122), +(105, 121, 103), (81, 85, 84), (60, 68, 66), (48, 60, 56), +(52, 56, 56), (56, 56, 47), (52, 52, 47), (56, 52, 47), +(60, 43, 47), (56, 48, 47), (52, 44, 47), (48, 31, 37), +(40, 28, 28), (40, 32, 28), (36, 31, 28), (44, 32, 18), +(36, 36, 28), (36, 36, 28), (36, 36, 37), (40, 31, 37), +(36, 36, 37), (40, 36, 37), (48, 39, 37), (52, 40, 37), +(64, 44, 37), (64, 44, 37), (60, 48, 37), (56, 48, 47), +(52, 48, 56), (56, 52, 56), (60, 52, 56), (56, 52, 47), +(56, 48, 37), (60, 56, 37), (56, 48, 37), (52, 48, 37), +(48, 48, 37), (44, 44, 37), (44, 48, 28), (32, 44, 18), +(24, 32, 18), (23, 24, 18), (23, 16, 18), (20, 16, 18), +(15, 20, 28), (12, 24, 28), (15, 28, 28), (24, 24, 28), +(36, 28, 28), (44, 32, 28), (48, 40, 37), (52, 48, 47), +(52, 52, 47), (52, 56, 47), (56, 56, 47), (60, 60, 47), +(68, 56, 47), (76, 56, 47), (85, 64, 56), (121, 76, 56), +(153, 103, 75), (174, 136, 94), (210, 164, 132), (222, 189, 169), +(230, 197, 169), (234, 192, 178), (222, 189, 169), (206, 169, 151), +(174, 149, 132), (125, 112, 94), (64, 64, 47), (15, 16, 9) +), + +// 53 etretat.ppm +((37, 54, 37), (56, 74, 51), (72, 89, 61), (92, 102, 76), +(110, 104, 91), (122, 114, 96), (130, 115, 99), (147, 129, 105), +(156, 123, 113), (158, 122, 110), (154, 117, 112), (128, 105, 86), +(113, 95, 78), (111, 88, 68), (109, 75, 53), (119, 73, 54), +(113, 87, 64), (109, 90, 77), (112, 99, 83), (119, 107, 90), +(119, 106, 100), (111, 114, 107), (108, 108, 119), (111, 132, 117), +(122, 140, 117), (131, 147, 122), (125, 148, 116), (128, 146, 117), +(129, 134, 106), (119, 120, 100), (122, 118, 102), (126, 111, 93), +(128, 105, 83), (127, 100, 79), (116, 96, 68), (115, 95, 71), +(105, 93, 75), (96, 95, 76), (94, 88, 75), (91, 90, 84), +(89, 104, 99), (84, 113, 105), (86, 116, 115), (94, 113, 111), +(99, 115, 105), (90, 106, 97), (75, 101, 90), (66, 98, 88), +(64, 83, 77), (54, 80, 74), (48, 74, 60), (63, 77, 61), +(53, 84, 60), (58, 84, 68), (74, 78, 77), (87, 88, 83), +(102, 100, 95), (120, 112, 109), (142, 128, 126), (157, 150, 131), +(173, 160, 142), (172, 164, 151), (171, 163, 140), (152, 166, 129), +(146, 152, 117), (124, 122, 102), (119, 101, 83), (107, 87, 68), +(98, 77, 59), (83, 73, 56), (71, 70, 54), (64, 69, 53), +(62, 65, 49), (51, 58, 44), (46, 53, 42), (42, 55, 36), +(41, 51, 36), (33, 46, 29), (32, 35, 25), (32, 33, 25), +(32, 33, 26), (34, 33, 25), (49, 41, 28), (53, 42, 32), +(46, 46, 32), (35, 39, 27), (35, 36, 26), (33, 35, 26), +(33, 45, 33), (37, 50, 46), (43, 49, 49), (39, 53, 48), +(46, 60, 57), (64, 73, 61), (76, 83, 70), (98, 92, 88), +(120, 108, 103), (130, 119, 129), (133, 122, 130), (140, 134, 141), +(140, 136, 140), (149, 148, 129), (152, 158, 138), (163, 155, 142), +(166, 158, 139), (164, 150, 138), (160, 129, 117), (164, 127, 110), +(160, 117, 85), (129, 101, 81), (95, 89, 60), (75, 83, 56), +(57, 74, 54), (50, 72, 46), (50, 66, 45), (56, 66, 52), +(59, 61, 52), (54, 61, 52), (47, 62, 45), (48, 57, 47), +(45, 58, 46), (45, 51, 40), (50, 49, 35), (50, 48, 35), +(55, 49, 35), (58, 51, 45), (69, 65, 55), (76, 67, 59), +(85, 76, 68), (90, 80, 66), (96, 75, 58), (95, 73, 58), +(84, 72, 61), (83, 72, 62), (76, 71, 65), (72, 68, 63), +(67, 65, 58), (60, 61, 53), (53, 66, 55), (52, 70, 63), +(47, 70, 64), (48, 65, 61), (45, 66, 47), (41, 58, 40), +(38, 58, 38), (31, 46, 31), (31, 34, 25), (33, 33, 24), +(33, 33, 24), (36, 36, 26), (45, 45, 33), (47, 49, 35), +(49, 48, 38), (58, 57, 46), (71, 66, 49), (74, 71, 57), +(75, 74, 63), (70, 78, 64), (63, 77, 60), (59, 67, 51), +(54, 57, 38), (52, 52, 40), (59, 57, 50), (69, 64, 57), +(80, 83, 68), (98, 92, 81), (116, 107, 100), (135, 122, 110), +(149, 139, 125), (168, 152, 137), (173, 164, 146), (178, 166, 145), +(187, 161, 142), (175, 160, 139), (167, 156, 132), (157, 146, 127), +(154, 127, 107), (137, 103, 78), (118, 89, 65), (97, 74, 55), +(94, 64, 46), (81, 67, 51), (77, 68, 53), (77, 75, 64), +(75, 79, 74), (69, 86, 85), (81, 84, 88), (82, 92, 86), +(87, 93, 88), (91, 98, 98), (95, 112, 99), (100, 109, 98), +(92, 102, 92), (86, 97, 88), (95, 99, 92), (108, 109, 98), +(119, 115, 101), (120, 135, 102), (129, 145, 106), (123, 142, 117), +(121, 136, 119), (108, 117, 110), (101, 118, 101), (92, 104, 89), +(84, 95, 87), (83, 88, 74), (85, 82, 74), (82, 80, 72), +(85, 79, 66), (89, 82, 61), (95, 83, 56), (98, 81, 61), +(101, 80, 68), (92, 81, 69), (90, 84, 74), (94, 86, 82), +(98, 92, 86), (96, 99, 90), (113, 110, 94), (119, 105, 92), +(120, 104, 88), (103, 94, 86), (90, 91, 78), (76, 90, 75), +(78, 83, 79), (70, 84, 73), (66, 92, 77), (76, 94, 87), +(94, 99, 100), (103, 108, 119), (105, 132, 130), (129, 156, 139), +(158, 162, 146), (178, 172, 157), (178, 176, 173), (166, 166, 167), +(125, 150, 143), (97, 132, 135), (105, 129, 130), (104, 126, 123), +(100, 128, 120), (95, 119, 120), (95, 117, 107), (103, 127, 111), +(110, 137, 122), (130, 141, 133), (142, 138, 120), (137, 157, 120), +(139, 133, 110), (131, 123, 109), (127, 112, 99), (120, 105, 95), +(116, 103, 90), (103, 92, 79), (105, 92, 76), (114, 99, 83) +), + +// 54 the-hollow-needle-at-etretat.ppm +((106, 110, 103), (105, 117, 116), (105, 119, 120), (117, 133, 130), +(123, 144, 135), (124, 144, 138), (125, 149, 140), (123, 146, 140), +(122, 149, 150), (127, 156, 144), (128, 155, 142), (137, 151, 143), +(140, 148, 142), (143, 151, 132), (150, 154, 130), (151, 152, 135), +(147, 158, 149), (143, 154, 144), (139, 151, 144), (137, 150, 147), +(143, 152, 149), (137, 149, 146), (137, 147, 142), (134, 146, 140), +(131, 141, 135), (125, 140, 138), (123, 143, 138), (123, 144, 140), +(123, 144, 140), (128, 145, 142), (127, 150, 141), (120, 153, 141), +(125, 157, 144), (131, 159, 151), (134, 161, 147), (143, 160, 151), +(142, 166, 163), (136, 172, 169), (139, 163, 165), (130, 157, 142), +(130, 151, 141), (131, 146, 141), (134, 148, 150), (130, 152, 143), +(130, 156, 138), (132, 155, 137), (137, 158, 132), (134, 153, 129), +(134, 147, 129), (135, 143, 126), (133, 142, 127), (138, 135, 118), +(132, 125, 106), (125, 113, 95), (118, 101, 87), (103, 92, 72), +(78, 69, 55), (64, 59, 54), (59, 56, 53), (60, 58, 54), +(69, 64, 58), (88, 86, 83), (95, 101, 97), (93, 108, 101), +(91, 108, 101), (91, 109, 107), (91, 110, 109), (89, 114, 113), +(93, 112, 109), (93, 108, 105), (101, 112, 108), (107, 116, 118), +(115, 128, 125), (120, 147, 132), (125, 154, 134), (131, 150, 131), +(138, 147, 135), (138, 144, 132), (136, 139, 128), (138, 138, 127), +(138, 138, 115), (137, 134, 102), (132, 131, 102), (137, 124, 97), +(127, 120, 88), (120, 108, 84), (114, 110, 84), (112, 104, 84), +(113, 99, 83), (116, 105, 87), (118, 111, 89), (121, 117, 102), +(126, 127, 112), (131, 131, 121), (136, 137, 128), (136, 136, 130), +(135, 139, 131), (132, 140, 127), (131, 132, 126), (128, 121, 119), +(122, 110, 104), (106, 92, 92), (91, 75, 69), (70, 59, 53), +(60, 55, 52), (59, 54, 51), (59, 55, 48), (57, 54, 50), +(59, 53, 52), (58, 51, 51), (52, 51, 51), (52, 49, 50), +(55, 52, 51), (51, 53, 50), (55, 52, 52), (58, 53, 54), +(55, 55, 57), (58, 61, 59), (58, 79, 76), (85, 101, 93), +(95, 101, 97), (101, 102, 97), (103, 104, 99), (96, 106, 104), +(108, 116, 106), (116, 120, 110), (125, 129, 121), (129, 141, 131), +(129, 141, 135), (130, 139, 132), (126, 128, 128), (114, 120, 117), +(107, 106, 100), (100, 94, 85), (88, 80, 69), (68, 59, 55), +(60, 53, 52), (55, 51, 48), (53, 49, 48), (49, 52, 48), +(47, 50, 45), (47, 46, 47), (49, 44, 43), (51, 43, 42), +(52, 49, 45), (56, 52, 52), (58, 57, 56), (63, 81, 78), +(86, 105, 100), (102, 121, 118), (99, 124, 126), (105, 124, 123), +(117, 127, 119), (129, 135, 121), (133, 141, 123), (136, 139, 115), +(133, 130, 109), (127, 125, 102), (124, 118, 97), (116, 114, 98), +(120, 113, 99), (121, 113, 96), (125, 109, 96), (120, 110, 94), +(119, 106, 92), (112, 106, 92), (106, 94, 90), (92, 84, 78), +(69, 60, 61), (61, 55, 53), (58, 54, 53), (57, 54, 53), +(52, 54, 54), (52, 53, 51), (53, 55, 50), (60, 57, 52), +(71, 66, 59), (91, 97, 89), (96, 106, 102), (106, 121, 116), +(127, 138, 129), (128, 141, 135), (123, 139, 137), (116, 129, 123), +(103, 125, 111), (104, 121, 111), (111, 115, 106), (114, 114, 105), +(121, 111, 103), (120, 115, 110), (122, 120, 112), (127, 124, 112), +(131, 118, 107), (130, 116, 105), (128, 124, 102), (130, 124, 103), +(139, 121, 98), (143, 116, 99), (147, 128, 100), (154, 127, 99), +(147, 135, 109), (157, 128, 102), (158, 130, 115), (162, 148, 115), +(150, 137, 119), (144, 145, 121), (143, 148, 132), (141, 142, 126), +(135, 140, 128), (134, 141, 133), (134, 144, 132), (132, 140, 130), +(131, 142, 130), (132, 141, 128), (134, 141, 126), (133, 141, 123), +(136, 135, 113), (134, 129, 107), (127, 122, 100), (121, 119, 94), +(107, 116, 90), (106, 111, 91), (105, 103, 93), (107, 103, 92), +(108, 111, 94), (112, 119, 107), (114, 128, 121), (119, 139, 131), +(122, 145, 135), (126, 148, 136), (128, 147, 135), (138, 146, 137), +(139, 145, 132), (142, 142, 125), (143, 133, 118), (144, 132, 111), +(142, 136, 110), (140, 136, 110), (135, 130, 115), (132, 123, 106), +(130, 118, 92), (132, 115, 92), (142, 106, 91), (123, 109, 89), +(107, 101, 84), (95, 91, 86), (72, 64, 59), (64, 58, 53), +(59, 54, 54), (59, 56, 51), (63, 57, 55), (71, 69, 68), +(97, 100, 88), (112, 114, 103), (123, 135, 123), (132, 145, 128) +), + +// 55 rouen-cathedral-sunset.ppm +((137, 129, 126), (130, 125, 111), (120, 112, 98), (113, 109, 87), +(100, 101, 83), (91, 93, 81), (78, 84, 72), (82, 89, 66), +(86, 88, 71), (95, 95, 69), (100, 92, 61), (114, 94, 53), +(125, 91, 54), (127, 96, 57), (124, 99, 57), (115, 101, 64), +(101, 98, 68), (96, 101, 80), (100, 106, 87), (104, 104, 90), +(109, 106, 87), (115, 111, 90), (126, 115, 100), (133, 126, 107), +(143, 135, 116), (144, 133, 122), (149, 131, 136), (156, 134, 129), +(145, 134, 125), (141, 128, 118), (133, 129, 109), (131, 125, 111), +(129, 125, 110), (126, 124, 99), (126, 130, 107), (128, 129, 111), +(133, 129, 113), (136, 136, 123), (148, 145, 137), (156, 150, 144), +(159, 153, 146), (159, 150, 152), (160, 152, 145), (156, 147, 147), +(148, 143, 149), (141, 141, 144), (138, 133, 130), (135, 127, 125), +(134, 131, 124), (140, 131, 120), (140, 129, 126), (138, 137, 132), +(138, 138, 149), (135, 149, 160), (134, 149, 164), (134, 153, 171), +(138, 149, 164), (128, 140, 150), (137, 142, 147), (146, 144, 145), +(158, 141, 140), (163, 146, 139), (176, 154, 136), (179, 159, 144), +(187, 167, 151), (198, 171, 154), (190, 158, 132), (166, 145, 107), +(145, 133, 91), (146, 114, 79), (138, 108, 71), (119, 101, 76), +(107, 102, 78), (98, 98, 78), (94, 92, 78), (93, 90, 71), +(91, 88, 60), (90, 82, 53), (88, 77, 52), (73, 74, 52), +(84, 82, 57), (93, 89, 57), (105, 94, 71), (94, 91, 69), +(97, 94, 72), (108, 98, 64), (115, 99, 71), (110, 101, 74), +(115, 107, 73), (128, 112, 75), (142, 113, 73), (148, 117, 75), +(151, 128, 86), (156, 137, 106), (162, 141, 119), (163, 151, 126), +(167, 156, 133), (163, 155, 136), (152, 147, 144), (140, 147, 140), +(133, 139, 127), (126, 130, 125), (124, 125, 113), (115, 119, 108), +(112, 120, 111), (102, 118, 115), (104, 116, 116), (97, 117, 107), +(107, 113, 107), (111, 108, 103), (105, 109, 99), (104, 111, 97), +(106, 106, 91), (105, 101, 88), (108, 102, 85), (107, 102, 78), +(112, 105, 78), (129, 112, 90), (138, 127, 92), (144, 135, 111), +(138, 142, 129), (149, 149, 147), (155, 152, 161), (153, 158, 170), +(155, 159, 171), (163, 158, 161), (167, 155, 153), (173, 159, 145), +(169, 155, 135), (169, 141, 105), (162, 125, 95), (150, 117, 93), +(138, 116, 91), (134, 109, 85), (119, 109, 80), (119, 108, 82), +(122, 108, 77), (124, 105, 74), (125, 111, 79), (120, 109, 77), +(118, 111, 81), (116, 115, 87), (111, 113, 89), (114, 114, 91), +(116, 121, 96), (134, 128, 108), (153, 138, 122), (169, 146, 132), +(181, 154, 130), (168, 153, 130), (152, 142, 119), (143, 135, 108), +(133, 126, 95), (125, 123, 93), (119, 112, 86), (116, 106, 83), +(121, 111, 84), (128, 107, 87), (129, 110, 95), (138, 120, 91), +(140, 124, 91), (144, 126, 93), (141, 131, 91), (128, 122, 90), +(119, 119, 90), (116, 112, 102), (109, 114, 95), (109, 112, 110), +(109, 120, 119), (121, 129, 122), (132, 131, 122), (144, 145, 135), +(158, 148, 141), (175, 158, 144), (180, 158, 149), (187, 171, 158), +(188, 176, 158), (184, 167, 145), (175, 166, 137), (162, 151, 133), +(153, 137, 111), (144, 123, 100), (128, 119, 90), (120, 113, 85), +(113, 110, 80), (115, 104, 72), (116, 100, 68), (124, 101, 64), +(134, 100, 67), (135, 109, 63), (139, 112, 67), (135, 120, 75), +(133, 120, 93), (133, 127, 105), (132, 128, 123), (132, 136, 146), +(134, 143, 152), (140, 153, 164), (141, 154, 168), (142, 155, 165), +(157, 156, 151), (159, 159, 138), (173, 162, 141), (177, 164, 143), +(177, 163, 150), (181, 166, 158), (181, 169, 162), (175, 170, 163), +(179, 164, 162), (175, 162, 155), (161, 155, 148), (158, 157, 147), +(150, 155, 147), (147, 153, 144), (136, 138, 124), (128, 126, 114), +(112, 112, 107), (100, 106, 99), (96, 104, 99), (93, 103, 96), +(103, 102, 89), (111, 104, 84), (112, 102, 80), (118, 102, 74), +(119, 98, 70), (118, 95, 67), (116, 94, 61), (112, 90, 58), +(104, 90, 60), (103, 91, 56), (98, 86, 57), (92, 84, 51), +(89, 84, 60), (106, 82, 55), (111, 90, 56), (113, 85, 56), +(103, 92, 65), (109, 103, 77), (104, 99, 86), (106, 96, 89), +(101, 101, 95), (103, 105, 98), (109, 110, 103), (102, 114, 94), +(112, 114, 107), (126, 117, 99), (136, 130, 104), (150, 140, 107), +(157, 138, 106), (157, 142, 104), (154, 139, 109), (155, 146, 128), +(154, 142, 136), (155, 145, 145), (148, 151, 156), (135, 158, 170) +), + +// 56 the-houses-of-parliament.ppm +((105, 95, 133), (97, 86, 120), (81, 81, 103), (78, 71, 88), +(74, 66, 79), (75, 64, 73), (76, 68, 75), (79, 65, 74), +(81, 71, 74), (83, 74, 81), (88, 74, 87), (91, 81, 96), +(98, 92, 112), (101, 95, 126), (107, 95, 136), (110, 95, 141), +(109, 90, 136), (104, 88, 136), (105, 89, 130), (103, 87, 118), +(102, 88, 117), (105, 87, 110), (101, 84, 111), (105, 90, 112), +(103, 99, 115), (105, 101, 116), (107, 98, 117), (104, 90, 120), +(97, 87, 122), (98, 90, 114), (94, 89, 109), (90, 91, 103), +(88, 82, 96), (82, 76, 86), (78, 74, 77), (70, 72, 69), +(66, 72, 63), (57, 67, 60), (60, 67, 57), (68, 73, 65), +(77, 83, 71), (85, 94, 92), (94, 102, 97), (97, 101, 106), +(101, 101, 100), (99, 99, 106), (100, 98, 109), (103, 94, 112), +(103, 90, 112), (101, 87, 113), (104, 89, 111), (100, 96, 107), +(95, 96, 107), (95, 88, 106), (97, 88, 108), (99, 93, 112), +(98, 90, 105), (99, 89, 96), (97, 90, 96), (96, 87, 99), +(94, 88, 105), (97, 85, 111), (101, 86, 113), (105, 88, 117), +(109, 93, 128), (116, 98, 135), (115, 98, 135), (113, 103, 131), +(112, 105, 138), (108, 99, 133), (107, 95, 124), (109, 94, 123), +(106, 91, 122), (106, 88, 116), (107, 87, 116), (104, 84, 117), +(105, 84, 116), (109, 87, 112), (110, 91, 114), (107, 96, 117), +(111, 92, 117), (107, 89, 116), (105, 86, 118), (105, 80, 127), +(99, 75, 134), (98, 73, 129), (100, 80, 128), (98, 79, 126), +(101, 74, 127), (98, 78, 121), (97, 76, 113), (96, 75, 103), +(92, 76, 99), (88, 79, 90), (87, 75, 90), (90, 74, 94), +(87, 75, 92), (88, 76, 92), (91, 71, 96), (99, 77, 99), +(96, 80, 102), (95, 77, 105), (91, 71, 112), (94, 69, 117), +(98, 78, 117), (103, 87, 122), (114, 90, 141), (109, 96, 134), +(113, 101, 136), (126, 107, 140), (119, 100, 132), (114, 96, 113), +(108, 88, 109), (99, 87, 106), (92, 83, 102), (87, 79, 96), +(88, 76, 95), (85, 74, 97), (87, 69, 102), (88, 71, 101), +(88, 73, 97), (90, 79, 103), (93, 81, 107), (93, 82, 118), +(99, 81, 123), (96, 81, 125), (93, 84, 125), (94, 82, 129), +(100, 90, 128), (101, 97, 124), (100, 99, 116), (107, 103, 112), +(117, 106, 104), (114, 106, 108), (117, 106, 115), (108, 99, 108), +(104, 99, 107), (103, 107, 98), (103, 102, 98), (95, 96, 97), +(95, 94, 91), (87, 87, 83), (87, 79, 87), (81, 73, 84), +(77, 63, 79), (75, 60, 74), (73, 61, 75), (72, 61, 78), +(75, 63, 78), (73, 62, 78), (78, 63, 84), (77, 58, 97), +(85, 66, 100), (87, 65, 102), (82, 72, 104), (81, 66, 105), +(80, 60, 96), (73, 63, 82), (66, 63, 76), (57, 55, 54), +(21, 24, 21), (23, 29, 20), (48, 55, 48), (55, 64, 60), +(63, 67, 69), (70, 66, 72), (81, 74, 83), (89, 79, 89), +(96, 86, 96), (105, 86, 105), (117, 96, 112), (118, 114, 124), +(126, 123, 126), (135, 132, 151), (125, 115, 137), (119, 118, 134), +(109, 109, 133), (109, 101, 128), (112, 107, 128), (109, 104, 122), +(101, 103, 124), (106, 99, 117), (112, 100, 119), (109, 98, 112), +(106, 101, 114), (105, 102, 114), (100, 99, 111), (96, 94, 103), +(94, 89, 94), (94, 88, 88), (88, 92, 82), (82, 92, 73), +(79, 89, 73), (72, 84, 72), (70, 83, 68), (83, 75, 77), +(89, 76, 87), (91, 80, 103), (101, 84, 114), (108, 86, 126), +(110, 87, 139), (115, 90, 142), (124, 85, 142), (107, 82, 129), +(109, 92, 129), (100, 82, 119), (97, 82, 112), (97, 83, 102), +(89, 84, 97), (89, 83, 96), (92, 86, 94), (96, 87, 95), +(99, 86, 92), (95, 84, 96), (94, 85, 93), (91, 84, 85), +(86, 83, 84), (78, 85, 89), (73, 84, 86), (69, 76, 83), +(75, 71, 83), (77, 68, 83), (77, 69, 81), (79, 70, 84), +(80, 69, 82), (77, 68, 83), (78, 69, 85), (83, 72, 86), +(82, 75, 87), (84, 74, 84), (83, 72, 81), (77, 66, 76), +(73, 60, 73), (62, 52, 70), (60, 52, 63), (67, 65, 63), +(80, 68, 65), (84, 78, 71), (87, 78, 86), (88, 82, 93), +(92, 84, 96), (97, 85, 102), (105, 82, 108), (103, 84, 105), +(98, 82, 102), (94, 77, 103), (88, 74, 101), (88, 73, 102), +(89, 74, 104), (88, 75, 115), (90, 81, 118), (95, 83, 122), +(97, 82, 118), (100, 83, 113), (97, 86, 109), (91, 89, 101) +), + +// 57 starry-night.ppm +((23, 26, 18), (27, 29, 21), (30, 29, 21), (29, 30, 22), +(32, 35, 26), (40, 42, 32), (43, 47, 35), (45, 54, 38), +(52, 52, 36), (50, 54, 38), (51, 56, 39), (50, 56, 42), +(50, 60, 42), (52, 63, 47), (60, 68, 51), (69, 73, 55), +(67, 76, 55), (68, 78, 53), (69, 82, 55), (70, 87, 59), +(77, 101, 65), (87, 101, 66), (92, 108, 67), (93, 105, 65), +(93, 107, 65), (90, 110, 66), (93, 110, 65), (95, 111, 69), +(102, 114, 73), (104, 110, 69), (109, 110, 61), (98, 105, 65), +(94, 108, 61), (82, 98, 56), (78, 86, 53), (81, 79, 57), +(81, 82, 62), (88, 91, 60), (99, 93, 62), (95, 106, 64), +(91, 110, 65), (84, 117, 77), (89, 124, 81), (104, 128, 92), +(114, 130, 84), (120, 132, 84), (138, 148, 85), (148, 150, 76), +(134, 147, 76), (131, 138, 78), (110, 108, 66), (96, 89, 57), +(81, 72, 49), (66, 65, 45), (63, 60, 40), (60, 55, 44), +(58, 56, 43), (56, 56, 42), (53, 57, 42), (58, 59, 42), +(57, 61, 41), (57, 65, 42), (57, 65, 45), (59, 61, 49), +(63, 68, 55), (71, 77, 53), (76, 86, 54), (90, 95, 55), +(101, 108, 65), (114, 125, 74), (133, 146, 76), (142, 156, 82), +(161, 168, 92), (177, 178, 94), (177, 173, 93), (167, 158, 86), +(152, 147, 79), (133, 115, 72), (98, 100, 67), (80, 86, 54), +(73, 80, 53), (61, 71, 47), (44, 58, 38), (37, 46, 32), +(35, 38, 27), (29, 35, 23), (28, 36, 25), (28, 38, 24), +(33, 46, 30), (37, 47, 30), (44, 48, 34), (47, 49, 36), +(46, 51, 36), (41, 51, 31), (35, 50, 34), (35, 48, 31), +(42, 51, 35), (46, 53, 44), (53, 62, 43), (60, 70, 49), +(73, 77, 59), (80, 88, 64), (83, 98, 84), (86, 101, 99), +(100, 114, 92), (101, 108, 80), (93, 106, 76), (81, 103, 75), +(87, 101, 75), (85, 113, 85), (78, 110, 80), (83, 109, 74), +(86, 107, 71), (86, 113, 65), (89, 104, 67), (79, 101, 66), +(77, 98, 63), (70, 86, 63), (68, 76, 67), (69, 82, 61), +(73, 82, 59), (72, 84, 61), (70, 90, 69), (80, 98, 83), +(91, 106, 77), (102, 110, 80), (102, 120, 77), (98, 126, 70), +(99, 122, 78), (94, 114, 72), (84, 101, 67), (75, 84, 58), +(76, 78, 53), (69, 77, 48), (64, 65, 44), (58, 64, 43), +(51, 55, 41), (46, 51, 38), (40, 45, 35), (30, 34, 29), +(29, 29, 22), (26, 27, 22), (26, 28, 24), (25, 27, 22), +(28, 28, 22), (31, 30, 25), (37, 34, 28), (41, 37, 29), +(42, 39, 34), (47, 44, 36), (42, 47, 33), (38, 44, 30), +(33, 36, 27), (31, 31, 25), (29, 27, 21), (27, 24, 21), +(24, 26, 19), (23, 26, 18), (20, 18, 14), (24, 25, 18), +(30, 32, 23), (37, 40, 30), (42, 45, 37), (51, 55, 41), +(60, 63, 47), (70, 75, 52), (84, 78, 49), (100, 92, 59), +(112, 106, 63), (118, 115, 66), (121, 131, 78), (122, 138, 89), +(125, 149, 98), (139, 157, 105), (124, 152, 98), (113, 139, 83), +(103, 125, 72), (105, 112, 69), (93, 103, 63), (80, 88, 54), +(73, 78, 53), (61, 76, 49), (57, 66, 47), (54, 68, 47), +(50, 64, 40), (53, 60, 42), (56, 53, 44), (58, 54, 39), +(58, 56, 39), (53, 57, 37), (53, 56, 38), (56, 54, 36), +(52, 49, 33), (42, 44, 30), (35, 38, 26), (29, 35, 24), +(29, 35, 26), (38, 42, 31), (44, 44, 32), (53, 51, 31), +(62, 62, 41), (78, 77, 54), (91, 97, 67), (109, 122, 77), +(136, 138, 83), (149, 149, 83), (163, 154, 83), (167, 153, 89), +(156, 160, 90), (145, 153, 84), (129, 142, 79), (109, 130, 80), +(101, 123, 85), (98, 123, 94), (91, 102, 87), (90, 98, 79), +(94, 92, 81), (83, 92, 66), (78, 84, 59), (74, 77, 55), +(64, 65, 48), (58, 56, 43), (50, 48, 36), (45, 42, 31), +(37, 34, 25), (34, 30, 21), (34, 28, 24), (38, 39, 28), +(47, 48, 35), (52, 52, 41), (56, 59, 43), (59, 68, 57), +(57, 78, 58), (68, 89, 57), (69, 88, 56), (67, 80, 54), +(61, 77, 51), (56, 74, 47), (56, 69, 44), (53, 62, 42), +(51, 56, 42), (53, 53, 45), (51, 52, 44), (51, 54, 48), +(54, 59, 52), (64, 61, 53), (69, 66, 63), (63, 69, 56), +(75, 76, 52), (80, 79, 52), (78, 82, 51), (84, 91, 59), +(92, 100, 65), (97, 104, 63), (98, 99, 61), (92, 93, 57) +), + +// 58 water-lilies-sunset.ppm +((71, 67, 46), (71, 67, 50), (67, 72, 57), (72, 84, 60), +(81, 87, 72), (92, 93, 74), (84, 86, 74), (88, 100, 84), +(83, 84, 73), (77, 74, 68), (68, 62, 56), (60, 59, 48), +(60, 55, 47), (57, 49, 38), (53, 45, 38), (52, 44, 36), +(52, 46, 36), (57, 49, 37), (58, 49, 38), (60, 52, 39), +(63, 57, 43), (70, 60, 45), (80, 65, 48), (85, 71, 52), +(89, 76, 54), (90, 83, 53), (96, 92, 57), (102, 95, 62), +(106, 98, 61), (112, 100, 62), (115, 107, 65), (119, 106, 67), +(129, 111, 70), (132, 119, 74), (130, 120, 71), (126, 118, 69), +(112, 111, 84), (101, 100, 80), (87, 93, 92), (90, 101, 87), +(85, 94, 100), (107, 108, 90), (130, 118, 110), (135, 118, 104), +(153, 156, 127), (183, 183, 126), (189, 184, 126), (177, 165, 100), +(173, 153, 91), (162, 148, 88), (145, 135, 77), (134, 124, 72), +(116, 107, 66), (103, 91, 59), (89, 73, 62), (78, 65, 49), +(69, 58, 43), (67, 51, 41), (63, 50, 42), (66, 51, 48), +(69, 57, 49), (76, 58, 53), (81, 65, 54), (86, 73, 55), +(86, 81, 53), (95, 87, 55), (100, 87, 58), (101, 88, 65), +(112, 87, 80), (117, 98, 73), (114, 106, 68), (120, 110, 68), +(122, 109, 67), (122, 107, 66), (125, 104, 66), (116, 94, 63), +(114, 90, 60), (105, 84, 56), (93, 76, 53), (93, 75, 51), +(91, 75, 52), (84, 76, 49), (83, 73, 48), (82, 74, 48), +(77, 76, 51), (72, 74, 53), (68, 68, 54), (69, 66, 54), +(66, 66, 52), (65, 64, 48), (65, 62, 49), (64, 58, 49), +(63, 58, 46), (62, 60, 46), (61, 60, 46), (58, 57, 44), +(56, 55, 45), (56, 52, 44), (55, 51, 45), (49, 50, 41), +(51, 47, 38), (54, 49, 41), (50, 46, 38), (45, 49, 39), +(44, 47, 36), (50, 47, 34), (48, 44, 33), (51, 44, 34), +(51, 49, 37), (55, 51, 37), (56, 49, 38), (54, 52, 42), +(55, 50, 40), (57, 51, 39), (58, 53, 39), (60, 53, 38), +(59, 54, 40), (61, 55, 41), (61, 58, 43), (64, 60, 43), +(72, 64, 48), (83, 65, 47), (84, 72, 48), (93, 75, 51), +(102, 87, 55), (106, 97, 61), (113, 104, 64), (122, 109, 67), +(133, 113, 69), (136, 116, 69), (142, 123, 72), (142, 123, 74), +(144, 118, 73), (130, 100, 83), (134, 88, 71), (112, 86, 58), +(100, 68, 52), (80, 54, 44), (72, 52, 42), (66, 49, 38), +(63, 55, 41), (63, 57, 42), (63, 60, 44), (70, 64, 47), +(72, 68, 48), (78, 71, 47), (76, 77, 51), (78, 82, 52), +(82, 81, 52), (79, 74, 48), (78, 70, 47), (75, 67, 45), +(67, 64, 43), (62, 59, 42), (59, 55, 42), (57, 53, 40), +(56, 53, 44), (60, 55, 50), (67, 61, 49), (77, 68, 51), +(84, 74, 52), (89, 82, 53), (98, 89, 56), (101, 88, 58), +(102, 90, 59), (101, 95, 69), (95, 95, 61), (96, 94, 59), +(83, 88, 66), (84, 79, 68), (76, 73, 67), (73, 68, 54), +(68, 62, 51), (66, 61, 48), (61, 61, 47), (60, 57, 47), +(57, 55, 44), (57, 54, 40), (57, 56, 40), (57, 54, 39), +(56, 55, 38), (52, 51, 37), (48, 46, 38), (44, 41, 36), +(42, 42, 33), (44, 43, 33), (48, 40, 34), (52, 44, 36), +(57, 47, 42), (57, 49, 42), (62, 55, 41), (64, 55, 44), +(67, 56, 43), (68, 58, 44), (69, 61, 41), (71, 61, 41), +(78, 63, 48), (78, 72, 52), (86, 75, 58), (95, 85, 61), +(110, 99, 68), (119, 111, 69), (134, 124, 74), (149, 132, 78), +(152, 141, 84), (161, 143, 85), (143, 122, 76), (129, 116, 70), +(114, 90, 60), (98, 82, 55), (89, 66, 48), (79, 56, 45), +(74, 53, 44), (71, 54, 46), (66, 54, 42), (64, 56, 40), +(62, 56, 40), (64, 52, 39), (63, 48, 39), (61, 48, 43), +(58, 50, 44), (57, 51, 44), (61, 53, 46), (67, 53, 49), +(68, 57, 48), (71, 60, 52), (70, 63, 49), (69, 61, 48), +(70, 62, 49), (70, 65, 48), (68, 68, 47), (65, 67, 48), +(62, 64, 46), (63, 61, 43), (64, 60, 42), (68, 59, 43), +(72, 61, 44), (79, 56, 45), (85, 65, 47), (85, 71, 52), +(82, 77, 59), (79, 77, 63), (72, 71, 65), (70, 69, 56), +(63, 69, 53), (61, 66, 52), (58, 63, 47), (64, 62, 45), +(67, 59, 48), (71, 63, 51), (74, 64, 54), (74, 72, 52), +(84, 77, 54), (92, 84, 61), (105, 96, 62), (117, 102, 75) +), + +// 59 gogh.chambre-arles.ppm +( + (24, 17, 8), (25, 34, 4), (53, 56, 72), (75, 94, 108), + (86, 110, 145), (99, 141, 175), (125, 154, 163), (166, 146, 109), + (182, 142, 103), (191, 159, 113), (206, 191, 120), (238, 216, 142), + (252, 233, 156), (242, 229, 171), (220, 226, 215), (209, 216, 221), + (207, 213, 224), (199, 215, 224), (189, 208, 223), (171, 194, 208), + (176, 188, 187), (183, 159, 117), (172, 130, 92), (163, 113, 62), + (159, 109, 53), (176, 110, 9), (188, 116, 6), (196, 118, 6), + (202, 123, 10), (209, 126, 15), (200, 127, 38), (193, 145, 91), + (240, 193, 119), (251, 235, 153), (252, 240, 170), (246, 231, 174), + (229, 224, 220), (232, 232, 224), (224, 230, 230), (206, 219, 225), + (194, 207, 215), (177, 193, 190), (205, 177, 130), (196, 149, 101), + (191, 134, 97), (193, 146, 106), (196, 168, 125), (176, 190, 191), + (170, 197, 217), (187, 204, 220), (188, 206, 216), (178, 198, 204), + (171, 191, 183), (173, 147, 108), (162, 121, 84), (154, 108, 70), + (140, 98, 58), (116, 85, 48), (116, 84, 56), (131, 93, 52), + (148, 97, 49), (171, 95, 9), (183, 104, 7), (188, 110, 6), + (190, 110, 4), (193, 109, 2), (198, 109, 1), (193, 107, 1), + (194, 106, 7), (196, 109, 4), (196, 110, 6), (199, 108, 5), + (208, 107, 2), (208, 114, 3), (209, 118, 3), (207, 116, 4), + (207, 118, 1), (205, 116, 2), (205, 115, 2), (203, 113, 2), + (200, 113, 3), (199, 113, 4), (200, 113, 8), (198, 110, 6), + (195, 112, 4), (195, 111, 8), (197, 113, 9), (193, 112, 8), + (193, 108, 14), (169, 119, 67), (172, 143, 109), (171, 184, 178), + (169, 189, 198), (168, 187, 198), (168, 185, 180), (169, 148, 113), + (169, 132, 96), (167, 122, 89), (169, 124, 91), (169, 131, 94), + (166, 155, 102), (148, 172, 162), (129, 172, 187), (136, 170, 194), + (153, 157, 161), (165, 131, 95), (160, 121, 84), (161, 118, 85), + (163, 122, 91), (171, 133, 94), (184, 152, 116), (179, 181, 168), + (177, 188, 203), (169, 193, 202), (163, 191, 202), (149, 178, 194), + (133, 162, 176), (136, 138, 111), (132, 144, 61), (137, 134, 53), + (194, 125, 15), (190, 117, 10), (191, 118, 4), (193, 122, 4), + (200, 125, 8), (207, 130, 2), (210, 134, 2), (216, 134, 8), + (219, 135, 6), (219, 145, 9), (206, 205, 99), (232, 220, 127), + (222, 216, 127), (201, 205, 98), (196, 170, 103), (175, 139, 86), + (151, 118, 83), (115, 102, 102), (110, 133, 148), (120, 156, 176), + (134, 169, 197), (136, 177, 199), (161, 174, 178), (182, 144, 107), + (181, 124, 68), (201, 121, 16), (206, 122, 10), (208, 119, 4), + (214, 118, 1), (220, 132, 10), (212, 144, 55), (234, 182, 112), + (228, 188, 116), (194, 165, 109), (185, 142, 96), (187, 133, 83), + (177, 126, 79), (178, 127, 86), (187, 139, 104), (198, 164, 121), + (209, 185, 155), (216, 212, 192), (221, 224, 217), (227, 230, 223), + (230, 233, 226), (222, 228, 229), (207, 218, 218), (189, 198, 201), + (197, 169, 130), (181, 136, 99), (169, 120, 86), (155, 117, 75), + (153, 114, 75), (151, 110, 72), (144, 106, 72), (144, 104, 68), + (148, 105, 65), (147, 103, 64), (147, 100, 66), (145, 106, 67), + (141, 112, 72), (137, 119, 73), (134, 114, 77), (139, 118, 78), + (150, 115, 79), (164, 119, 78), (185, 138, 95), (195, 171, 118), + (243, 205, 123), (251, 237, 150), (253, 240, 166), (252, 235, 164), + (224, 211, 162), (191, 180, 120), (162, 128, 86), (132, 94, 56), + (84, 77, 37), (55, 30, 16), (64, 34, 7), (112, 61, 7), + (150, 78, 12), (177, 94, 6), (186, 107, 5), (192, 115, 5), + (200, 115, 7), (207, 117, 5), (205, 124, 12), (209, 130, 13), + (196, 163, 88), (221, 200, 109), (247, 221, 145), (239, 223, 166), + (217, 211, 177), (176, 195, 194), (129, 161, 184), (94, 125, 148), + (73, 92, 121), (85, 85, 107), (99, 94, 60), (97, 90, 58), + (106, 72, 24), (133, 77, 14), (143, 80, 7), (128, 63, 11), + (96, 59, 24), (100, 56, 31), (125, 80, 40), (142, 96, 59), + (158, 112, 62), (174, 133, 82), (185, 158, 112), (201, 192, 157), + (196, 206, 208), (197, 216, 223), (202, 212, 223), (198, 212, 215), + (190, 198, 209), (190, 188, 167), (184, 158, 112), (169, 129, 94), + (155, 114, 77), (146, 112, 78), (142, 112, 78), (142, 107, 75), + (142, 107, 69), (138, 104, 65), (144, 98, 61), (153, 107, 52), + (166, 97, 11), (174, 101, 5), (186, 109, 5), (190, 106, 5), + (190, 102, 4), (197, 41, 1), (116, 33, 7), (58, 32, 5) +), + +// 60 gogh.entrance.ppm +( + (2, 2, 1), (6, 5, 8), (5, 8, 7), (8, 15, 8), + (9, 21, 16), (11, 26, 20), (27, 49, 30), (35, 65, 35), + (54, 77, 47), (69, 106, 52), (94, 125, 64), (124, 137, 81), + (148, 157, 87), (169, 182, 104), (190, 193, 116), (207, 207, 129), + (219, 220, 140), (219, 208, 142), (217, 220, 140), (215, 214, 126), + (207, 199, 112), (188, 169, 87), (179, 142, 58), (182, 132, 44), + (185, 143, 29), (198, 203, 65), (220, 214, 99), (231, 222, 117), + (238, 228, 127), (234, 229, 136), (251, 245, 156), (235, 235, 144), + (240, 235, 151), (244, 234, 151), (241, 233, 149), (239, 236, 136), + (241, 230, 124), (233, 232, 116), (223, 216, 105), (213, 204, 98), + (179, 179, 91), (136, 145, 60), (93, 138, 53), (74, 111, 58), + (62, 113, 53), (59, 102, 62), (52, 94, 67), (43, 94, 70), + (45, 87, 61), (39, 83, 56), (38, 87, 54), (62, 100, 47), + (66, 108, 47), (89, 112, 52), (117, 127, 44), (139, 139, 44), + (139, 139, 50), (131, 129, 42), (102, 121, 60), (80, 112, 58), + (68, 94, 42), (47, 88, 28), (35, 68, 39), (42, 56, 54), + (45, 56, 61), (41, 64, 72), (37, 98, 69), (40, 111, 80), + (53, 139, 100), (77, 133, 110), (84, 136, 112), (81, 122, 117), + (77, 95, 121), (71, 97, 103), (59, 97, 100), (54, 90, 90), + (44, 80, 92), (44, 71, 79), (42, 80, 76), (63, 93, 67), + (88, 113, 66), (129, 128, 58), (155, 157, 69), (177, 179, 99), + (194, 197, 109), (206, 201, 124), (221, 216, 120), (233, 236, 121), + (240, 235, 118), (231, 221, 104), (221, 208, 98), (200, 199, 94), + (182, 172, 58), (171, 136, 47), (142, 133, 57), (124, 108, 46), + (81, 97, 48), (77, 94, 46), (89, 92, 52), (125, 84, 42), + (156, 99, 32), (134, 106, 41), (82, 99, 42), (76, 92, 40), + (65, 85, 37), (36, 75, 45), (23, 75, 49), (33, 79, 47), + (29, 90, 53), (41, 104, 75), (61, 112, 79), (74, 134, 72), + (109, 151, 93), (145, 173, 124), (174, 196, 161), (186, 206, 175), + (189, 207, 161), (175, 188, 141), (138, 168, 118), (109, 132, 109), + (73, 101, 101), (55, 95, 82), (46, 73, 57), (20, 55, 43), + (17, 36, 39), (12, 37, 36), (13, 28, 28), (20, 25, 20), + (21, 18, 23), (11, 15, 28), (30, 30, 17), (22, 29, 26), + (21, 28, 22), (19, 42, 22), (30, 37, 23), (31, 38, 30), + (25, 38, 31), (24, 27, 34), (25, 30, 48), (31, 46, 62), + (31, 55, 54), (35, 63, 60), (29, 76, 77), (31, 78, 79), + (36, 91, 82), (45, 90, 99), (49, 97, 111), (64, 108, 108), + (74, 122, 123), (99, 143, 139), (168, 173, 141), (190, 209, 149), + (204, 215, 159), (209, 226, 160), (209, 214, 153), (197, 207, 132), + (185, 180, 115), (169, 158, 102), (144, 149, 73), (102, 133, 62), + (73, 107, 58), (54, 74, 55), (42, 64, 52), (31, 52, 44), + (34, 45, 38), (39, 47, 30), (49, 51, 29), (55, 52, 34), + (44, 53, 45), (55, 76, 60), (81, 95, 78), (105, 124, 100), + (143, 165, 98), (182, 200, 132), (202, 214, 149), (215, 220, 168), + (230, 236, 165), (231, 235, 181), (216, 229, 170), (207, 213, 174), + (194, 210, 185), (180, 219, 201), (140, 198, 201), (142, 188, 193), + (159, 184, 158), (110, 160, 143), (82, 144, 137), (89, 145, 113), + (103, 137, 95), (131, 146, 98), (146, 151, 109), (156, 157, 110), + (196, 190, 134), (207, 201, 144), (208, 209, 154), (208, 211, 148), + (195, 201, 146), (131, 157, 129), (97, 132, 126), (77, 126, 117), + (49, 120, 108), (58, 113, 88), (65, 92, 76), (73, 95, 66), + (89, 94, 62), (123, 96, 47), (160, 100, 40), (165, 107, 42), + (143, 113, 58), (107, 105, 61), (88, 112, 70), (83, 97, 66), + (74, 81, 60), (57, 84, 64), (49, 90, 67), (54, 100, 76), + (60, 96, 84), (67, 115, 90), (98, 124, 91), (105, 118, 89), + (132, 135, 72), (163, 134, 84), (181, 167, 99), (198, 191, 105), + (210, 208, 116), (212, 212, 112), (219, 215, 108), (219, 219, 115), + (219, 221, 131), (227, 218, 137), (231, 228, 139), (228, 228, 135), + (226, 224, 134), (233, 228, 134), (236, 233, 129), (237, 233, 133), + (243, 233, 138), (243, 230, 134), (241, 232, 129), (237, 230, 123), + (226, 217, 108), (213, 211, 99), (193, 191, 89), (163, 175, 74), + (149, 155, 48), (144, 152, 62), (167, 155, 61), (182, 173, 83), + (186, 180, 104), (190, 176, 100), (178, 171, 89), (168, 141, 62), + (144, 137, 64), (107, 111, 51), (79, 86, 46), (35, 31, 17) +), + +// 61 gogh.the-night-cafe.ppm +( + (56, 36, 25), (72, 40, 16), (76, 46, 26), (96, 55, 31), + (121, 71, 41), (145, 88, 46), (161, 90, 60), (168, 109, 63), + (168, 119, 83), (169, 122, 86), (162, 123, 79), (139, 115, 75), + (102, 115, 73), (99, 123, 72), (105, 132, 75), (108, 137, 75), + (133, 147, 94), (146, 139, 137), (179, 173, 130), (198, 185, 140), + (202, 187, 145), (208, 180, 162), (215, 187, 141), (233, 188, 126), + (234, 192, 124), (212, 183, 114), (214, 176, 101), (222, 181, 93), + (214, 174, 83), (210, 165, 80), (207, 161, 83), (199, 155, 77), + (197, 154, 74), (194, 149, 67), (190, 144, 62), (187, 136, 62), + (188, 133, 66), (191, 122, 70), (192, 129, 67), (190, 137, 63), + (194, 137, 62), (196, 143, 64), (195, 149, 70), (200, 155, 70), + (201, 162, 73), (205, 165, 77), (206, 162, 85), (202, 160, 91), + (193, 150, 96), (183, 156, 98), (182, 153, 106), (179, 160, 112), + (163, 157, 107), (165, 147, 91), (163, 143, 88), (172, 137, 83), + (180, 134, 79), (181, 136, 77), (179, 132, 67), (175, 132, 72), + (178, 131, 73), (178, 124, 67), (180, 134, 64), (181, 131, 60), + (188, 126, 59), (181, 116, 63), (168, 117, 60), (173, 101, 61), + (161, 88, 58), (158, 80, 58), (144, 83, 53), (128, 81, 62), + (112, 94, 57), (98, 104, 62), (90, 102, 66), (89, 102, 71), + (99, 93, 83), (112, 100, 85), (127, 103, 76), (144, 107, 69), + (152, 110, 69), (150, 112, 63), (155, 113, 63), (162, 112, 60), + (157, 110, 57), (154, 109, 51), (154, 101, 55), (142, 91, 55), + (118, 79, 54), (107, 74, 48), (105, 74, 45), (103, 67, 36), + (108, 52, 39), (116, 56, 41), (122, 53, 37), (135, 60, 44), + (149, 67, 41), (155, 67, 45), (163, 68, 48), (170, 74, 50), + (175, 81, 55), (176, 98, 43), (173, 109, 37), (167, 112, 51), + (176, 116, 48), (170, 117, 57), (170, 119, 61), (170, 116, 55), + (168, 123, 59), (173, 129, 61), (174, 124, 65), (170, 120, 64), + (156, 126, 59), (157, 110, 61), (158, 93, 69), (140, 100, 55), + (132, 91, 47), (110, 76, 48), (93, 79, 54), (75, 63, 46), + (74, 52, 43), (70, 45, 43), (65, 48, 41), (72, 55, 41), + (80, 57, 37), (88, 61, 37), (97, 66, 44), (104, 66, 46), + (113, 69, 45), (125, 70, 43), (137, 83, 48), (149, 85, 42), + (158, 82, 45), (154, 90, 46), (155, 79, 49), (157, 81, 50), + (161, 80, 48), (165, 76, 55), (165, 75, 56), (160, 70, 49), + (159, 70, 45), (156, 74, 48), (158, 72, 45), (157, 68, 47), + (163, 67, 46), (161, 64, 45), (157, 66, 47), (162, 63, 44), + (162, 58, 43), (155, 59, 44), (154, 67, 47), (154, 76, 52), + (147, 80, 55), (134, 71, 58), (123, 73, 49), (115, 78, 57), + (113, 78, 59), (116, 89, 60), (119, 91, 69), (119, 92, 65), + (123, 92, 58), (129, 97, 52), (146, 103, 57), (152, 109, 61), + (151, 113, 61), (163, 114, 63), (163, 124, 60), (164, 122, 52), + (172, 133, 52), (166, 111, 58), (170, 101, 53), (168, 95, 51), + (163, 91, 51), (160, 91, 51), (160, 92, 52), (165, 97, 52), + (165, 96, 45), (171, 93, 49), (176, 92, 50), (180, 105, 51), + (186, 112, 59), (199, 121, 54), (201, 141, 67), (200, 146, 71), + (205, 156, 72), (207, 162, 76), (208, 165, 77), (212, 169, 86), + (215, 170, 89), (221, 174, 95), (218, 172, 100), (215, 172, 99), + (209, 166, 89), (206, 165, 83), (206, 165, 82), (196, 164, 86), + (195, 162, 91), (190, 160, 90), (189, 154, 92), (177, 149, 84), + (180, 142, 81), (172, 133, 70), (152, 129, 77), (109, 130, 76), + (100, 127, 70), (97, 123, 70), (98, 118, 68), (94, 116, 69), + (90, 113, 68), (87, 97, 55), (88, 80, 63), (92, 80, 57), + (86, 75, 61), (99, 73, 62), (119, 83, 63), (149, 98, 67), + (160, 113, 66), (171, 128, 69), (176, 142, 76), (190, 156, 75), + (204, 170, 86), (214, 175, 100), (225, 179, 110), (238, 201, 109), + (239, 196, 98), (225, 180, 89), (224, 178, 82), (218, 159, 77), + (212, 158, 81), (202, 155, 82), (200, 151, 79), (194, 149, 75), + (188, 141, 69), (188, 144, 69), (177, 140, 68), (188, 140, 66), + (178, 147, 70), (185, 141, 69), (186, 136, 77), (196, 138, 82), + (200, 143, 106), (211, 164, 103), (215, 172, 106), (208, 180, 132), + (202, 174, 141), (180, 169, 126), (181, 163, 117), (166, 141, 101), + (175, 131, 101), (149, 106, 85), (123, 92, 70), (99, 74, 55), + (76, 55, 43), (71, 47, 35), (68, 34, 33), (64, 45, 33) +), + +// 62 gogh.vegetable-montmartre.ppm +( + (40, 43, 29), (44, 40, 28), (66, 55, 30), (91, 61, 30), + (112, 65, 40), (137, 82, 49), (164, 102, 53), (196, 118, 67), + (220, 129, 69), (227, 128, 77), (232, 141, 72), (221, 151, 83), + (236, 161, 80), (225, 161, 82), (225, 163, 80), (221, 168, 96), + (221, 153, 88), (233, 171, 96), (210, 174, 105), (227, 161, 98), + (235, 172, 109), (238, 179, 116), (232, 176, 103), (231, 186, 102), + (227, 184, 110), (210, 171, 118), (190, 161, 102), (178, 160, 101), + (159, 156, 109), (143, 154, 124), (134, 149, 126), (132, 146, 120), + (127, 144, 118), (131, 144, 118), (144, 152, 114), (144, 150, 104), + (163, 143, 102), (185, 147, 93), (193, 154, 98), (199, 155, 92), + (198, 155, 90), (193, 146, 87), (192, 142, 90), (185, 142, 87), + (182, 141, 83), (169, 139, 80), (145, 132, 92), (125, 148, 90), + (127, 138, 106), (123, 137, 121), (120, 136, 121), (116, 132, 118), + (112, 134, 121), (106, 134, 117), (99, 122, 113), (96, 119, 109), + (91, 107, 99), (87, 103, 102), (89, 103, 86), (95, 100, 77), + (97, 96, 72), (95, 90, 64), (98, 89, 79), (100, 95, 69), + (117, 98, 64), (109, 97, 72), (104, 100, 72), (115, 96, 71), + (120, 99, 74), (133, 110, 70), (156, 123, 77), (165, 139, 76), + (177, 146, 79), (194, 150, 88), (210, 148, 87), (213, 156, 85), + (212, 158, 97), (211, 160, 98), (211, 161, 100), (218, 168, 111), + (222, 182, 114), (236, 194, 126), (232, 198, 125), (224, 187, 122), + (211, 183, 126), (228, 198, 141), (182, 189, 131), (151, 169, 141), + (144, 161, 134), (134, 155, 137), (129, 152, 136), (127, 149, 136), + (128, 148, 135), (124, 145, 132), (123, 145, 131), (116, 142, 132), + (111, 136, 131), (108, 130, 128), (107, 126, 122), (99, 122, 111), + (102, 105, 88), (107, 112, 82), (111, 107, 74), (115, 106, 67), + (123, 102, 60), (151, 111, 62), (162, 99, 57), (161, 103, 76), + (161, 115, 73), (154, 121, 70), (148, 125, 66), (139, 123, 78), + (143, 122, 88), (148, 124, 84), (135, 113, 77), (127, 117, 76), + (114, 111, 73), (114, 111, 73), (117, 106, 91), (114, 110, 74), + (111, 114, 83), (104, 111, 97), (99, 122, 112), (98, 124, 119), + (100, 127, 118), (105, 128, 119), (106, 129, 121), (112, 132, 121), + (114, 136, 127), (111, 136, 130), (112, 137, 131), (117, 141, 128), + (121, 147, 130), (125, 145, 126), (125, 141, 122), (124, 141, 120), + (129, 141, 111), (154, 137, 98), (166, 147, 94), (187, 148, 90), + (202, 147, 85), (211, 141, 84), (218, 142, 83), (219, 149, 89), + (227, 156, 96), (222, 155, 94), (210, 153, 97), (204, 152, 96), + (190, 148, 93), (172, 149, 91), (156, 147, 93), (143, 149, 103), + (137, 146, 106), (128, 143, 114), (125, 141, 115), (125, 138, 112), + (124, 131, 98), (122, 123, 91), (119, 120, 88), (105, 115, 79), + (103, 102, 69), (95, 94, 61), (84, 87, 62), (82, 78, 54), + (75, 75, 46), (71, 69, 54), (83, 76, 40), (99, 68, 31), + (101, 66, 33), (95, 48, 18), (107, 55, 26), (105, 60, 35), + (103, 57, 37), (111, 56, 27), (120, 40, 23), (117, 60, 29), + (118, 80, 46), (141, 99, 57), (149, 104, 54), (150, 98, 54), + (126, 88, 37), (128, 68, 33), (121, 73, 34), (117, 65, 22), + (133, 74, 34), (158, 66, 35), (168, 90, 53), (169, 97, 49), + (195, 102, 56), (200, 110, 61), (203, 118, 65), (209, 124, 65), + (196, 126, 55), (181, 128, 57), (174, 125, 72), (171, 121, 70), + (165, 114, 68), (168, 100, 58), (175, 105, 52), (182, 110, 62), + (178, 120, 72), (188, 131, 73), (197, 139, 79), (197, 143, 79), + (196, 155, 89), (195, 163, 97), (193, 159, 110), (193, 173, 124), + (185, 173, 134), (154, 164, 134), (150, 164, 131), (148, 159, 133), + (140, 157, 132), (135, 149, 128), (130, 152, 128), (124, 146, 126), + (121, 144, 124), (118, 142, 125), (116, 135, 118), (119, 130, 102), + (124, 131, 98), (125, 128, 95), (121, 120, 89), (114, 109, 76), + (114, 104, 70), (101, 95, 59), (103, 88, 59), (85, 84, 48), + (92, 75, 43), (97, 79, 55), (85, 85, 40), (97, 74, 35), + (103, 72, 40), (98, 76, 42), (103, 78, 45), (101, 83, 47), + (105, 88, 60), (115, 95, 59), (114, 99, 55), (138, 112, 55), + (151, 122, 65), (171, 130, 69), (175, 125, 74), (195, 135, 72), + (211, 143, 73), (219, 137, 76), (224, 140, 74), (215, 144, 71), + (198, 140, 76), (186, 137, 70), (173, 126, 68), (167, 109, 50), + (147, 102, 55), (110, 85, 39), (87, 62, 37), (52, 51, 30) +), + +// 63 matisse.bonheur-vivre.ppm +( + (3, 3, 3), (39, 31, 46), (91, 59, 63), (169, 125, 81), + (206, 159, 105), (208, 186, 115), (204, 196, 101), (223, 190, 85), + (245, 207, 76), (247, 210, 66), (248, 210, 60), (245, 197, 62), + (222, 186, 74), (207, 176, 85), (191, 155, 108), (161, 126, 102), + (105, 111, 111), (80, 98, 102), (43, 82, 60), (36, 61, 45), + (23, 54, 40), (18, 51, 42), (32, 60, 38), (53, 74, 51), + (73, 98, 67), (118, 135, 93), (175, 161, 120), (219, 165, 132), + (226, 171, 140), (226, 195, 154), (228, 206, 139), (241, 213, 115), + (239, 208, 112), (234, 199, 103), (223, 189, 95), (227, 161, 77), + (220, 151, 71), (205, 158, 48), (202, 142, 41), (184, 121, 37), + (177, 116, 25), (160, 107, 36), (100, 116, 44), (81, 66, 62), + (66, 52, 60), (75, 84, 83), (79, 90, 108), (94, 104, 112), + (122, 120, 122), (175, 163, 125), (212, 176, 145), (221, 190, 167), + (225, 201, 166), (232, 199, 158), (230, 198, 147), (228, 199, 107), + (228, 208, 101), (226, 206, 68), (230, 203, 59), (223, 197, 46), + (243, 199, 23), (232, 203, 40), (217, 191, 46), (218, 173, 35), + (201, 178, 35), (226, 186, 25), (210, 168, 29), (204, 176, 59), + (217, 150, 36), (188, 119, 21), (216, 163, 19), (220, 145, 9), + (225, 159, 1), (223, 157, 1), (219, 135, 0), (204, 134, 21), + (204, 113, 2), (193, 104, 2), (195, 112, 0), (186, 115, 18), + (173, 117, 13), (183, 104, 19), (183, 118, 32), (164, 155, 43), + (142, 155, 66), (97, 138, 69), (47, 88, 61), (48, 79, 51), + (35, 74, 49), (39, 72, 52), (42, 77, 57), (67, 86, 90), + (90, 95, 101), (142, 133, 104), (168, 142, 94), (187, 136, 104), + (201, 135, 106), (207, 138, 123), (209, 140, 121), (217, 151, 122), + (217, 151, 127), (222, 150, 126), (219, 152, 134), (222, 167, 136), + (227, 170, 144), (220, 174, 146), (220, 183, 156), (219, 176, 157), + (192, 169, 155), (138, 168, 128), (104, 149, 108), (65, 119, 86), + (38, 87, 71), (29, 70, 58), (25, 59, 54), (25, 69, 56), + (29, 66, 56), (43, 88, 64), (73, 117, 88), (118, 135, 93), + (153, 142, 78), (193, 146, 72), (198, 145, 61), (199, 162, 70), + (196, 157, 53), (219, 150, 47), (222, 163, 48), (217, 193, 59), + (222, 201, 62), (222, 189, 82), (207, 180, 93), (211, 185, 98), + (205, 179, 100), (190, 161, 97), (169, 154, 85), (117, 158, 94), + (82, 131, 102), (75, 121, 93), (78, 119, 94), (88, 121, 90), + (131, 102, 87), (162, 105, 38), (160, 101, 33), (163, 104, 28), + (166, 88, 30), (176, 78, 3), (169, 71, 3), (166, 43, 1), + (159, 15, 8), (154, 8, 8), (165, 6, 3), (160, 3, 0), + (149, 1, 0), (148, 9, 3), (50, 11, 10), (48, 29, 12), + (46, 24, 27), (48, 39, 33), (82, 70, 32), (155, 103, 30), + (172, 119, 46), (184, 130, 54), (210, 156, 69), (227, 161, 91), + (220, 169, 110), (224, 155, 107), (210, 131, 104), (184, 106, 94), + (170, 101, 86), (166, 91, 81), (156, 96, 85), (88, 111, 82), + (76, 123, 90), (62, 119, 86), (54, 116, 91), (66, 123, 102), + (86, 142, 116), (126, 158, 123), (163, 165, 118), (209, 168, 119), + (222, 178, 144), (225, 200, 163), (226, 212, 162), (221, 201, 167), + (225, 209, 170), (215, 213, 188), (234, 206, 190), (224, 210, 171), + (227, 201, 174), (223, 203, 178), (225, 181, 170), (218, 163, 147), + (196, 142, 130), (181, 132, 97), (180, 111, 63), (198, 93, 35), + (200, 101, 3), (213, 103, 26), (208, 94, 4), (209, 84, 8), + (210, 67, 1), (195, 66, 1), (194, 74, 2), (181, 70, 0), + (188, 65, 1), (189, 53, 4), (184, 50, 1), (179, 53, 3), + (170, 41, 4), (174, 13, 6), (176, 13, 3), (178, 48, 5), + (166, 64, 52), (197, 90, 56), (188, 99, 80), (209, 104, 96), + (222, 122, 92), (206, 131, 112), (206, 151, 120), (199, 161, 131), + (173, 180, 138), (136, 179, 145), (98, 156, 130), (83, 147, 117), + (70, 134, 107), (85, 132, 106), (110, 144, 103), (162, 140, 88), + (178, 118, 84), (192, 122, 93), (204, 122, 113), (203, 126, 119), + (196, 137, 118), (191, 131, 113), (182, 130, 107), (161, 153, 120), + (104, 145, 109), (78, 128, 103), (53, 112, 87), (35, 102, 80), + (40, 96, 71), (52, 103, 75), (97, 137, 79), (138, 159, 67), + (187, 173, 64), (192, 177, 59), (210, 190, 61), (219, 183, 91), + (224, 196, 104), (221, 205, 139), (225, 202, 155), (209, 201, 152), + (156, 176, 144), (115, 120, 128), (69, 87, 96), (27, 58, 48) +), + +// 64 matisse.flowers.ppm +( + (13, 10, 17), (66, 30, 14), (140, 53, 34), (165, 44, 33), + (205, 94, 45), (177, 121, 75), (182, 159, 89), (185, 175, 117), + (209, 186, 130), (203, 189, 140), (208, 192, 141), (214, 198, 142), + (220, 201, 150), (221, 204, 151), (222, 202, 151), (220, 198, 141), + (216, 197, 135), (220, 203, 142), (216, 203, 156), (224, 207, 168), + (227, 206, 168), (227, 212, 168), (230, 217, 173), (232, 217, 181), + (235, 218, 193), (241, 213, 200), (235, 218, 199), (233, 218, 198), + (231, 217, 185), (231, 219, 176), (228, 213, 170), (221, 208, 170), + (211, 204, 178), (206, 203, 188), (209, 205, 191), (214, 205, 197), + (211, 207, 198), (200, 201, 195), (199, 199, 187), (198, 197, 178), + (203, 198, 167), (206, 197, 164), (213, 202, 163), (216, 202, 164), + (218, 196, 160), (224, 191, 153), (225, 189, 141), (215, 194, 130), + (217, 191, 115), (220, 197, 104), (221, 188, 104), (217, 163, 87), + (215, 161, 51), (211, 172, 50), (213, 174, 59), (206, 166, 88), + (214, 164, 87), (208, 153, 87), (197, 121, 93), (209, 82, 39), + (193, 21, 8), (168, 38, 20), (170, 75, 61), (151, 127, 95), + (154, 165, 148), (180, 188, 174), (184, 187, 172), (181, 187, 175), + (178, 184, 177), (157, 178, 184), (152, 175, 182), (133, 172, 173), + (130, 171, 159), (139, 171, 165), (156, 177, 183), (175, 187, 185), + (180, 189, 190), (182, 189, 183), (189, 190, 174), (190, 192, 168), + (202, 194, 160), (206, 197, 153), (212, 201, 158), (218, 202, 169), + (225, 209, 179), (226, 216, 183), (237, 222, 193), (236, 222, 200), + (235, 223, 207), (235, 221, 210), (236, 222, 213), (233, 223, 214), + (234, 219, 215), (234, 221, 214), (233, 220, 212), (234, 221, 214), + (237, 222, 217), (239, 226, 216), (239, 233, 216), (239, 230, 221), + (239, 229, 219), (237, 228, 214), (233, 222, 211), (231, 221, 208), + (230, 223, 204), (232, 216, 201), (222, 215, 187), (207, 205, 185), + (199, 200, 185), (195, 197, 184), (195, 196, 182), (194, 195, 178), + (186, 190, 176), (180, 184, 177), (158, 174, 178), (143, 172, 156), + (116, 159, 149), (72, 103, 96), (55, 76, 65), (21, 42, 44), + (41, 38, 37), (70, 59, 35), (149, 106, 97), (175, 131, 93), + (213, 180, 99), (219, 188, 113), (221, 195, 117), (227, 204, 124), + (226, 206, 143), (233, 198, 151), (229, 211, 163), (230, 215, 178), + (233, 216, 200), (220, 218, 206), (211, 211, 204), (195, 198, 199), + (185, 197, 189), (187, 189, 187), (188, 182, 188), (181, 177, 182), + (175, 178, 176), (161, 175, 162), (163, 141, 151), (176, 112, 118), + (141, 99, 109), (82, 80, 53), (53, 51, 40), (36, 40, 51), + (60, 73, 63), (78, 111, 97), (131, 161, 125), (154, 178, 154), + (156, 181, 179), (157, 182, 187), (164, 192, 197), (180, 188, 197), + (192, 194, 200), (200, 200, 198), (209, 208, 199), (215, 214, 202), + (213, 218, 201), (212, 215, 205), (205, 207, 204), (198, 198, 204), + (192, 196, 199), (180, 193, 193), (176, 186, 192), (174, 184, 189), + (158, 181, 187), (151, 175, 178), (135, 169, 158), (116, 156, 147), + (57, 83, 86), (56, 31, 32), (70, 28, 19), (121, 56, 46), + (155, 75, 65), (178, 106, 114), (193, 133, 101), (182, 171, 116), + (165, 167, 140), (188, 139, 142), (184, 123, 127), (186, 114, 117), + (197, 146, 111), (208, 168, 141), (221, 184, 171), (208, 198, 181), + (213, 206, 191), (223, 209, 195), (232, 216, 201), (232, 216, 207), + (231, 217, 208), (232, 220, 213), (226, 220, 215), (219, 217, 209), + (217, 218, 209), (216, 209, 208), (202, 202, 202), (192, 197, 195), + (193, 195, 186), (192, 193, 185), (193, 195, 182), (194, 198, 191), + (205, 206, 200), (217, 210, 195), (231, 215, 202), (231, 218, 204), + (235, 220, 205), (236, 220, 204), (234, 221, 205), (232, 221, 205), + (231, 217, 207), (231, 214, 204), (225, 207, 196), (214, 200, 192), + (205, 191, 187), (204, 169, 169), (206, 173, 167), (200, 193, 175), + (195, 196, 180), (194, 198, 186), (198, 200, 196), (215, 201, 202), + (229, 214, 207), (231, 217, 208), (233, 219, 209), (234, 223, 211), + (238, 227, 211), (240, 229, 207), (240, 227, 208), (239, 226, 209), + (237, 224, 208), (236, 220, 205), (235, 215, 204), (227, 211, 197), + (214, 208, 193), (197, 197, 184), (188, 189, 172), (169, 180, 160), + (149, 169, 137), (115, 136, 85), (73, 66, 39), (51, 31, 30), + (35, 32, 12), (33, 28, 14), (38, 41, 33), (63, 55, 40), + (77, 100, 78), (129, 155, 131), (123, 162, 151), (129, 165, 159), + (135, 167, 158), (138, 150, 139), (124, 121, 135), (56, 54, 65) +), + +// 65 matisse.lecon-musique.ppm +( + (17, 24, 13), (25, 50, 37), (51, 60, 57), (56, 70, 71), + (50, 108, 84), (60, 120, 101), (78, 109, 104), (91, 110, 128), + (119, 123, 103), (131, 141, 108), (139, 147, 107), (140, 144, 102), + (129, 130, 88), (129, 120, 90), (142, 119, 69), (162, 122, 56), + (171, 127, 64), (179, 127, 69), (148, 107, 66), (133, 103, 70), + (107, 101, 68), (92, 116, 55), (83, 102, 62), (78, 127, 54), + (69, 132, 63), (77, 137, 76), (85, 144, 72), (89, 154, 81), + (103, 161, 72), (98, 163, 76), (101, 156, 80), (98, 164, 114), + (107, 177, 79), (106, 162, 118), (120, 164, 114), (128, 150, 134), + (129, 160, 141), (138, 163, 154), (140, 170, 157), (142, 170, 160), + (129, 167, 170), (152, 180, 168), (160, 179, 158), (173, 190, 157), + (172, 193, 172), (173, 201, 181), (183, 205, 191), (180, 198, 192), + (187, 202, 204), (191, 202, 196), (206, 209, 188), (211, 213, 196), + (209, 214, 190), (211, 208, 189), (200, 201, 185), (197, 199, 182), + (204, 198, 162), (196, 190, 159), (190, 192, 136), (179, 190, 122), + (181, 178, 114), (184, 163, 122), (175, 156, 120), (172, 156, 120), + (171, 156, 126), (147, 146, 127), (132, 151, 135), (141, 158, 139), + (153, 154, 141), (154, 149, 131), (148, 158, 114), (150, 150, 113), + (136, 142, 113), (128, 122, 96), (122, 119, 98), (114, 121, 95), + (113, 117, 90), (106, 107, 82), (112, 94, 85), (130, 95, 87), + (150, 92, 81), (167, 91, 92), (180, 78, 72), (181, 74, 75), + (185, 69, 75), (182, 67, 62), (194, 85, 50), (196, 122, 30), + (221, 159, 7), (226, 161, 6), (220, 163, 6), (234, 187, 37), + (190, 132, 59), (207, 156, 59), (186, 128, 40), (187, 130, 19), + (188, 129, 36), (186, 115, 28), (162, 108, 32), (154, 110, 45), + (115, 91, 48), (98, 100, 65), (93, 97, 62), (90, 93, 64), + (70, 81, 63), (71, 74, 57), (75, 78, 50), (96, 74, 40), + (107, 80, 43), (150, 81, 55), (178, 92, 50), (189, 88, 80), + (186, 105, 102), (175, 138, 121), (195, 151, 124), (205, 153, 135), + (187, 179, 141), (191, 210, 162), (209, 223, 182), (228, 234, 208), + (228, 225, 208), (219, 221, 207), (210, 212, 197), (206, 206, 195), + (188, 198, 189), (188, 194, 178), (183, 187, 160), (183, 191, 155), + (186, 186, 144), (185, 176, 141), (191, 175, 136), (191, 163, 124), + (168, 170, 111), (155, 184, 107), (145, 177, 97), (120, 168, 75), + (113, 149, 78), (117, 161, 80), (121, 171, 82), (134, 178, 96), + (152, 190, 111), (145, 194, 131), (150, 180, 133), (164, 179, 132), + (167, 177, 128), (178, 176, 139), (169, 166, 132), (162, 157, 129), + (156, 146, 119), (154, 146, 118), (154, 131, 117), (150, 109, 103), + (171, 93, 90), (185, 102, 92), (197, 102, 96), (193, 104, 95), + (183, 84, 82), (173, 71, 64), (173, 65, 63), (160, 58, 43), + (157, 48, 38), (120, 4, 5), (38, 30, 9), (32, 26, 12), + (31, 25, 14), (47, 48, 28), (63, 52, 26), (94, 63, 20), + (99, 66, 22), (115, 88, 28), (121, 98, 33), (158, 111, 48), + (176, 129, 61), (185, 121, 30), (192, 148, 29), (173, 124, 34), + (192, 107, 2), (192, 98, 3), (185, 91, 2), (161, 89, 9), + (158, 89, 22), (154, 96, 32), (122, 86, 46), (113, 85, 37), + (107, 94, 41), (88, 83, 60), (75, 80, 50), (68, 80, 54), + (65, 78, 58), (63, 71, 53), (59, 66, 40), (58, 51, 40), + (60, 68, 37), (49, 55, 37), (63, 65, 37), (62, 64, 42), + (66, 73, 52), (70, 80, 58), (80, 90, 74), (80, 95, 84), + (85, 93, 71), (94, 101, 70), (98, 98, 67), (96, 100, 77), + (103, 111, 82), (104, 115, 95), (111, 112, 91), (104, 109, 87), + (93, 113, 83), (76, 110, 84), (67, 93, 94), (69, 85, 89), + (75, 90, 74), (78, 81, 64), (72, 75, 57), (70, 73, 56), + (68, 71, 50), (92, 72, 33), (108, 59, 21), (138, 77, 13), + (161, 80, 5), (160, 65, 0), (154, 54, 0), (138, 34, 2), + (55, 42, 5), (20, 14, 6), (14, 9, 4), (24, 25, 12), + (33, 39, 30), (45, 45, 35), (45, 48, 40), (51, 62, 49), + (60, 74, 55), (63, 77, 63), (59, 103, 64), (75, 128, 70), + (89, 149, 79), (96, 157, 105), (101, 175, 137), (123, 187, 147), + (124, 194, 146), (137, 189, 144), (110, 177, 136), (115, 181, 127), + (112, 176, 129), (119, 162, 149), (91, 170, 136), (84, 152, 119), + (67, 152, 116), (52, 140, 116), (49, 141, 121), (46, 134, 117), + (28, 119, 107), (42, 88, 69), (47, 75, 61), (33, 50, 45) +), + +// 66 modigliani.nude-caryatid.ppm +( + (31, 24, 17), (57, 47, 38), (89, 77, 61), (119, 88, 86), + (151, 108, 104), (173, 128, 129), (184, 141, 152), (196, 148, 160), + (197, 156, 158), (201, 164, 169), (199, 171, 174), (200, 176, 179), + (203, 178, 181), (203, 179, 182), (203, 178, 185), (201, 178, 183), + (202, 177, 186), (198, 178, 184), (195, 179, 178), (203, 173, 173), + (202, 169, 169), (204, 167, 163), (199, 155, 155), (200, 158, 151), + (203, 157, 147), (199, 157, 148), (196, 152, 139), (202, 144, 123), + (200, 142, 123), (190, 130, 119), (175, 111, 102), (175, 92, 77), + (168, 91, 81), (158, 87, 83), (139, 73, 72), (133, 71, 62), + (114, 57, 55), (86, 51, 50), (50, 34, 32), (40, 32, 30), + (33, 31, 33), (33, 31, 34), (40, 35, 34), (57, 53, 43), + (82, 70, 66), (108, 84, 89), (130, 107, 112), (170, 134, 135), + (184, 142, 145), (191, 151, 145), (189, 151, 150), (181, 147, 146), + (172, 155, 132), (169, 153, 130), (168, 152, 129), (168, 151, 129), + (167, 149, 127), (149, 128, 113), (142, 120, 97), (140, 108, 87), + (127, 105, 84), (127, 85, 80), (118, 77, 78), (115, 76, 80), + (112, 80, 74), (96, 77, 60), (72, 57, 48), (44, 38, 36), + (38, 29, 34), (35, 29, 31), (37, 31, 27), (41, 33, 31), + (48, 40, 38), (86, 56, 51), (116, 79, 74), (125, 95, 94), + (153, 110, 106), (176, 122, 127), (185, 135, 135), (194, 143, 142), + (195, 145, 143), (190, 145, 134), (179, 129, 122), (164, 119, 119), + (156, 111, 108), (140, 106, 101), (128, 103, 98), (124, 106, 103), + (125, 97, 95), (145, 92, 89), (156, 93, 87), (157, 92, 91), + (164, 100, 96), (165, 109, 111), (182, 123, 125), (181, 124, 126), + (180, 134, 130), (169, 149, 128), (169, 151, 129), (171, 155, 130), + (193, 151, 139), (201, 154, 150), (204, 156, 152), (212, 163, 163), + (210, 166, 162), (216, 175, 169), (225, 188, 179), (218, 185, 188), + (217, 192, 196), (224, 195, 196), (224, 195, 200), (225, 205, 209), + (229, 209, 212), (226, 208, 211), (218, 203, 212), (217, 194, 200), + (215, 196, 199), (214, 191, 194), (218, 185, 183), (215, 183, 181), + (214, 175, 173), (206, 167, 164), (197, 159, 160), (193, 154, 153), + (177, 150, 148), (170, 154, 132), (168, 149, 127), (160, 139, 111), + (152, 126, 103), (152, 128, 104), (161, 142, 118), (168, 150, 129), + (174, 156, 134), (190, 157, 148), (196, 159, 161), (196, 164, 172), + (196, 174, 181), (198, 176, 183), (202, 180, 182), (206, 180, 180), + (210, 178, 180), (214, 187, 183), (209, 188, 189), (208, 184, 193), + (211, 189, 191), (215, 194, 193), (212, 196, 197), (207, 191, 199), + (194, 189, 194), (177, 176, 180), (173, 159, 165), (173, 149, 155), + (170, 149, 154), (167, 136, 146), (161, 125, 128), (146, 109, 113), + (132, 98, 92), (128, 80, 81), (133, 77, 80), (148, 92, 92), + (156, 102, 99), (165, 117, 113), (174, 131, 128), (187, 143, 140), + (181, 142, 139), (168, 122, 122), (144, 108, 104), (121, 92, 94), + (107, 83, 81), (74, 63, 54), (45, 43, 41), (41, 32, 31), + (37, 28, 26), (33, 25, 25), (35, 25, 24), (38, 28, 27), + (58, 40, 24), (76, 54, 40), (109, 68, 56), (104, 65, 44), + (67, 53, 40), (42, 34, 32), (36, 27, 28), (32, 23, 27), + (29, 20, 23), (30, 20, 21), (31, 21, 20), (29, 20, 19), + (21, 15, 15), (15, 11, 12), (15, 10, 11), (18, 7, 9), + (18, 12, 12), (21, 12, 14), (21, 12, 15), (21, 15, 17), + (25, 20, 21), (29, 23, 24), (30, 24, 27), (31, 24, 27), + (34, 25, 26), (40, 35, 33), (51, 49, 46), (68, 72, 61), + (105, 99, 94), (123, 109, 116), (144, 118, 116), (157, 149, 136), + (166, 150, 125), (154, 134, 102), (151, 127, 103), (147, 123, 99), + (143, 118, 96), (153, 104, 100), (160, 107, 104), (166, 115, 103), + (181, 121, 112), (187, 119, 112), (177, 123, 111), (155, 112, 108), + (142, 119, 97), (138, 122, 97), (126, 106, 85), (118, 99, 81), + (103, 80, 60), (80, 60, 48), (53, 45, 37), (42, 34, 32), + (41, 33, 31), (43, 38, 35), (66, 57, 53), (90, 71, 73), + (116, 80, 81), (135, 101, 104), (152, 117, 118), (168, 139, 142), + (164, 153, 155), (153, 157, 168), (147, 158, 172), (170, 152, 159), + (187, 158, 166), (186, 163, 166), (188, 164, 163), (192, 168, 167), + (201, 167, 164), (204, 168, 168), (202, 166, 167), (198, 163, 166), + (190, 161, 162), (185, 154, 157), (187, 149, 152), (182, 147, 147), + (166, 135, 138), (139, 114, 121), (104, 92, 88), (69, 62, 55) +), + +// 67 braque.instruments.ppm +( + (13, 9, 4), (22, 18, 10), (35, 31, 20), (48, 42, 14), + (56, 45, 7), (68, 57, 11), (83, 66, 15), (101, 82, 18), + (117, 89, 15), (116, 87, 19), (103, 83, 16), (88, 94, 25), + (72, 92, 33), (64, 83, 25), (58, 79, 20), (57, 68, 18), + (54, 66, 15), (62, 69, 15), (65, 73, 13), (70, 68, 11), + (78, 62, 12), (87, 61, 11), (103, 68, 11), (111, 70, 20), + (128, 81, 12), (132, 87, 23), (139, 85, 22), (134, 107, 24), + (138, 115, 30), (146, 118, 44), (157, 130, 56), (165, 139, 63), + (161, 145, 82), (170, 164, 114), (186, 177, 126), (195, 185, 128), + (210, 200, 137), (220, 213, 139), (234, 213, 133), (240, 213, 133), + (239, 220, 145), (249, 227, 147), (249, 227, 153), (250, 231, 160), + (244, 227, 162), (247, 232, 165), (249, 242, 188), (245, 242, 171), + (255, 252, 190), (251, 241, 168), (247, 241, 181), (241, 231, 170), + (237, 229, 166), (222, 217, 161), (212, 205, 159), (208, 202, 146), + (205, 192, 123), (196, 174, 99), (178, 150, 78), (168, 140, 66), + (150, 126, 52), (131, 117, 43), (127, 95, 33), (120, 96, 34), + (106, 95, 41), (95, 90, 45), (93, 87, 50), (93, 91, 54), + (97, 86, 62), (118, 109, 80), (146, 132, 93), (169, 161, 125), + (189, 183, 135), (207, 197, 145), (213, 206, 148), (221, 206, 139), + (223, 203, 137), (223, 202, 137), (225, 204, 134), (226, 207, 130), + (234, 207, 127), (222, 203, 126), (216, 188, 114), (210, 179, 98), + (223, 172, 46), (217, 171, 46), (211, 166, 46), (208, 159, 29), + (202, 145, 22), (199, 153, 33), (196, 161, 62), (203, 179, 91), + (211, 192, 115), (213, 197, 127), (220, 204, 130), (221, 208, 129), + (221, 201, 130), (212, 196, 124), (200, 179, 113), (194, 174, 96), + (175, 154, 83), (166, 146, 72), (167, 147, 76), (180, 156, 90), + (203, 177, 110), (211, 192, 115), (213, 198, 116), (218, 199, 122), + (209, 191, 107), (193, 167, 77), (206, 159, 42), (194, 146, 32), + (193, 141, 20), (186, 135, 10), (179, 141, 16), (179, 143, 8), + (153, 120, 7), (147, 110, 20), (128, 110, 25), (118, 103, 37), + (115, 107, 38), (110, 122, 46), (117, 120, 64), (132, 129, 74), + (140, 133, 89), (145, 133, 85), (135, 128, 80), (136, 112, 67), + (139, 116, 53), (138, 118, 31), (136, 109, 27), (133, 101, 14), + (135, 92, 4), (130, 80, 2), (123, 74, 6), (111, 73, 1), + (93, 67, 4), (80, 63, 8), (79, 61, 14), (82, 70, 22), + (89, 93, 19), (106, 100, 28), (119, 103, 39), (139, 125, 42), + (159, 138, 59), (176, 148, 84), (188, 162, 110), (207, 184, 130), + (215, 196, 131), (219, 193, 137), (208, 187, 126), (201, 174, 109), + (177, 158, 83), (179, 154, 61), (173, 137, 39), (177, 139, 26), + (177, 145, 20), (150, 115, 11), (139, 108, 7), (130, 101, 9), + (114, 76, 5), (103, 67, 8), (100, 55, 5), (82, 59, 8), + (82, 58, 17), (71, 64, 22), (66, 74, 18), (60, 73, 22), + (60, 73, 28), (68, 85, 27), (79, 88, 33), (87, 97, 37), + (90, 107, 37), (96, 97, 58), (120, 113, 63), (137, 121, 57), + (159, 131, 57), (171, 144, 64), (165, 147, 63), (161, 136, 48), + (162, 125, 34), (154, 122, 42), (145, 113, 29), (127, 102, 11), + (110, 93, 3), (87, 87, 1), (83, 59, 0), (79, 56, 5), + (81, 53, 6), (71, 45, 6), (61, 36, 2), (60, 34, 1), + (54, 31, 5), (51, 24, 3), (46, 19, 0), (39, 15, 4), + (34, 16, 2), (33, 15, 4), (36, 13, 5), (39, 16, 3), + (37, 29, 3), (38, 27, 8), (38, 27, 8), (44, 20, 9), + (56, 28, 6), (57, 26, 2), (61, 25, 2), (65, 29, 4), + (58, 30, 9), (65, 38, 10), (66, 45, 13), (73, 47, 10), + (70, 54, 8), (70, 55, 6), (56, 59, 6), (48, 61, 14), + (48, 55, 7), (43, 55, 5), (48, 55, 14), (45, 68, 8), + (48, 85, 20), (56, 86, 24), (60, 81, 22), (57, 81, 25), + (55, 82, 40), (71, 74, 51), (89, 75, 46), (90, 82, 53), + (102, 82, 64), (120, 106, 81), (130, 123, 78), (142, 137, 81), + (163, 153, 92), (178, 167, 112), (186, 175, 120), (180, 168, 120), + (164, 154, 93), (147, 144, 74), (134, 132, 71), (130, 115, 66), + (120, 108, 60), (109, 98, 44), (110, 87, 29), (128, 87, 22), + (122, 82, 10), (110, 77, 10), (100, 65, 5), (91, 55, 2), + (81, 54, 3), (76, 54, 7), (64, 50, 9), (44, 52, 13), + (35, 42, 8), (35, 41, 8), (29, 26, 9), (24, 12, 1) +), + +// 68 calcoast09.ppm +( + (32, 32, 44), (52, 56, 66), (68, 71, 89), (76, 94, 103), + (82, 116, 122), (83, 114, 143), (90, 123, 154), (94, 127, 158), + (96, 130, 161), (99, 134, 164), (99, 135, 167), (101, 136, 168), + (103, 138, 170), (103, 139, 171), (103, 139, 173), (103, 139, 174), + (103, 139, 175), (104, 140, 174), (106, 142, 176), (108, 143, 175), + (108, 143, 176), (109, 144, 176), (108, 143, 174), (106, 141, 172), + (103, 139, 173), (102, 138, 172), (100, 136, 170), (98, 134, 170), + (98, 133, 168), (97, 131, 166), (95, 129, 164), (95, 128, 159), + (95, 128, 156), (94, 126, 153), (92, 127, 145), (82, 118, 140), + (76, 115, 122), (69, 100, 107), (70, 89, 94), (61, 84, 91), + (64, 76, 88), (71, 75, 78), (70, 72, 68), (65, 73, 73), + (66, 65, 73), (56, 62, 74), (55, 59, 71), (54, 59, 69), + (50, 55, 64), (41, 45, 58), (42, 41, 53), (44, 44, 53), + (46, 44, 58), (48, 50, 55), (58, 56, 56), (57, 64, 65), + (72, 68, 63), (81, 77, 64), (96, 82, 62), (103, 93, 73), + (100, 92, 78), (92, 89, 71), (88, 88, 71), (89, 84, 73), + (87, 87, 77), (94, 94, 84), (99, 101, 89), (99, 107, 99), + (96, 110, 119), (85, 113, 143), (85, 115, 149), (91, 124, 155), + (96, 129, 160), (100, 135, 165), (106, 139, 170), (108, 143, 172), + (119, 146, 156), (127, 149, 160), (148, 165, 157), (165, 188, 190), + (179, 191, 172), (184, 189, 154), (190, 194, 149), (174, 155, 104), + (147, 131, 96), (144, 138, 108), (137, 135, 107), (138, 130, 112), + (145, 142, 115), (132, 137, 131), (114, 128, 136), (101, 130, 142), + (102, 130, 157), (96, 129, 162), (96, 130, 165), (98, 131, 166), + (99, 133, 168), (99, 134, 169), (100, 134, 169), (100, 136, 169), + (100, 134, 169), (100, 134, 169), (99, 134, 166), (96, 129, 164), + (94, 127, 160), (92, 124, 157), (90, 123, 154), (84, 114, 147), + (81, 109, 139), (75, 101, 129), (62, 91, 119), (59, 89, 105), + (55, 88, 99), (55, 87, 98), (57, 82, 112), (58, 81, 115), + (63, 87, 120), (67, 93, 126), (74, 100, 133), (77, 106, 138), + (81, 110, 143), (80, 110, 144), (78, 107, 141), (75, 101, 134), + (68, 94, 127), (62, 88, 121), (64, 90, 120), (73, 98, 128), + (75, 104, 136), (79, 110, 140), (81, 111, 144), (82, 112, 146), + (82, 111, 142), (77, 105, 135), (79, 108, 117), (81, 98, 115), + (87, 96, 103), (91, 95, 97), (94, 91, 91), (101, 102, 94), + (117, 116, 100), (125, 128, 107), (118, 134, 131), (122, 145, 148), + (130, 166, 167), (140, 176, 186), (156, 193, 200), (163, 204, 212), + (167, 213, 212), (169, 207, 215), (168, 207, 211), (157, 199, 205), + (137, 175, 189), (130, 166, 174), (118, 152, 164), (118, 153, 157), + (118, 158, 160), (123, 164, 166), (136, 177, 177), (146, 191, 197), + (162, 197, 198), (166, 201, 203), (161, 200, 203), (153, 189, 200), + (137, 175, 185), (121, 163, 167), (108, 147, 151), (106, 141, 153), + (98, 131, 161), (96, 131, 161), (100, 136, 155), (111, 132, 145), + (112, 134, 144), (105, 134, 138), (101, 134, 138), (105, 130, 141), + (109, 117, 128), (110, 115, 107), (104, 107, 95), (113, 111, 88), + (119, 112, 92), (126, 124, 103), (121, 116, 103), (119, 117, 90), + (117, 112, 85), (112, 102, 82), (95, 95, 81), (86, 86, 80), + (80, 84, 83), (81, 92, 101), (85, 112, 122), (94, 127, 132), + (106, 140, 143), (116, 162, 160), (142, 183, 185), (184, 201, 205), + (189, 224, 229), (214, 248, 247), (224, 251, 250), (201, 232, 240), + (187, 218, 222), (170, 194, 203), (138, 175, 176), (115, 153, 162), + (101, 137, 151), (83, 126, 132), (67, 106, 111), (70, 87, 93), + (73, 80, 82), (73, 76, 78), (71, 81, 80), (71, 78, 81), + (66, 75, 88), (61, 81, 97), (70, 91, 117), (73, 98, 127), + (77, 106, 138), (82, 110, 143), (83, 115, 148), (85, 118, 151), + (90, 123, 156), (90, 124, 157), (92, 125, 158), (93, 126, 159), + (93, 126, 159), (94, 127, 160), (94, 127, 162), (94, 127, 162), + (94, 128, 163), (95, 128, 163), (95, 129, 164), (95, 128, 163), + (95, 128, 161), (93, 126, 159), (93, 126, 157), (94, 124, 153), + (91, 122, 140), (81, 116, 124), (78, 105, 114), (81, 91, 96), + (84, 84, 80), (77, 78, 71), (64, 62, 54), (51, 43, 35), + (37, 29, 35), (26, 23, 30), (0, 0, 0), (5, 2, 12), + (22, 27, 46), (35, 32, 48), (43, 40, 50), (42, 49, 58), + (29, 56, 73), (35, 62, 80), (38, 47, 63), (29, 33, 53) +), + +// 69 dodge102.ppm +( + (47, 42, 46), (88, 93, 90), (136, 152, 150), (140, 218, 225), + (130, 242, 251), (123, 245, 243), (122, 188, 198), (99, 137, 153), + (74, 113, 109), (74, 89, 82), (58, 73, 61), (49, 64, 54), + (58, 41, 32), (64, 30, 24), (63, 28, 23), (65, 27, 22), + (76, 30, 21), (75, 34, 17), (74, 32, 14), (79, 31, 14), + (80, 32, 15), (85, 31, 18), (82, 34, 23), (89, 42, 25), + (85, 45, 27), (78, 49, 29), (77, 40, 29), (77, 36, 27), + (89, 39, 35), (112, 56, 39), (116, 69, 43), (118, 89, 51), + (124, 92, 37), (160, 122, 46), (171, 135, 56), (168, 156, 97), + (153, 159, 102), (144, 150, 88), (137, 115, 85), (118, 108, 89), + (108, 95, 75), (95, 87, 63), (95, 78, 55), (88, 65, 56), + (92, 57, 49), (94, 57, 48), (94, 53, 47), (98, 51, 43), + (105, 67, 50), (109, 74, 60), (116, 91, 81), (140, 119, 89), + (179, 161, 111), (235, 221, 170), (245, 246, 140), (237, 221, 102), + (227, 193, 91), (215, 181, 106), (197, 157, 88), (184, 153, 62), + (161, 124, 46), (149, 99, 41), (143, 84, 37), (130, 77, 42), + (117, 73, 48), (118, 67, 53), (124, 81, 60), (139, 107, 90), + (156, 161, 147), (192, 207, 161), (221, 235, 186), (216, 244, 206), + (178, 223, 200), (179, 187, 163), (154, 134, 116), (146, 106, 79), + (129, 105, 52), (114, 103, 49), (119, 122, 74), (135, 141, 112), + (147, 164, 149), (165, 213, 168), (199, 243, 222), (187, 251, 248), + (190, 248, 233), (169, 215, 199), (158, 176, 150), (136, 139, 120), + (119, 121, 104), (121, 120, 93), (146, 152, 109), (180, 159, 99), + (181, 191, 105), (181, 205, 157), (175, 231, 216), (168, 243, 243), + (138, 241, 247), (127, 247, 247), (138, 247, 240), (141, 188, 174), + (112, 136, 129), (91, 103, 81), (69, 86, 67), (69, 59, 41), + (62, 59, 21), (59, 36, 17), (61, 25, 14), (61, 24, 16), + (55, 25, 15), (44, 26, 23), (47, 31, 23), (54, 33, 22), + (60, 34, 30), (53, 42, 49), (51, 60, 66), (46, 72, 60), + (53, 84, 86), (54, 100, 125), (84, 149, 155), (92, 243, 249), + (108, 244, 249), (130, 219, 231), (125, 155, 166), (71, 105, 120), + (47, 89, 118), (26, 50, 68), (24, 25, 32), (13, 12, 21), + (12, 9, 8), (5, 4, 4), (5, 2, 2), (4, 0, 1), + (5, 1, 0), (12, 4, 2), (16, 7, 4), (21, 7, 1), + (22, 5, 2), (18, 5, 5), (16, 6, 6), (9, 5, 4), + (5, 2, 1), (1, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (1, 0, 0), (3, 0, 1), (6, 0, 3), + (16, 5, 5), (23, 9, 4), (22, 15, 9), (18, 14, 14), + (20, 20, 26), (26, 26, 23), (43, 36, 29), (52, 42, 42), + (59, 67, 62), (75, 80, 80), (77, 116, 99), (97, 141, 153), + (121, 219, 225), (121, 246, 252), (136, 238, 245), (143, 176, 174), + (121, 125, 121), (107, 98, 94), (76, 93, 72), (77, 86, 51), + (83, 57, 49), (78, 51, 44), (70, 40, 41), (67, 31, 31), + (63, 28, 24), (62, 27, 20), (58, 29, 10), (55, 31, 12), + (49, 28, 13), (42, 23, 7), (37, 19, 7), (38, 17, 6), + (43, 13, 5), (47, 14, 5), (59, 15, 6), (61, 17, 6), + (63, 21, 5), (67, 23, 8), (69, 27, 6), (66, 28, 6), + (66, 30, 13), (70, 34, 18), (70, 40, 28), (78, 42, 35), + (88, 53, 39), (93, 69, 56), (113, 83, 83), (138, 119, 116), + (196, 181, 138), (222, 227, 216), (247, 245, 223), (250, 249, 228), + (247, 251, 242), (230, 247, 235), (199, 236, 231), (199, 236, 228), + (193, 231, 227), (165, 173, 178), (153, 134, 140), (128, 119, 110), + (112, 95, 87), (108, 78, 57), (99, 79, 48), (94, 71, 37), + (71, 52, 28), (65, 47, 26), (69, 31, 26), (61, 26, 22), + (56, 24, 19), (56, 21, 15), (55, 21, 13), (47, 16, 11), + (45, 11, 3), (41, 10, 4), (39, 10, 6), (37, 11, 5), + (33, 14, 3), (30, 9, 2), (30, 5, 0), (28, 9, 3), + (27, 11, 2), (27, 11, 3), (26, 14, 7), (24, 12, 5), + (22, 15, 5), (27, 12, 4), (31, 16, 6), (36, 17, 7), + (41, 21, 11), (48, 20, 12), (57, 18, 12), (61, 22, 11), + (65, 23, 13), (68, 23, 14), (68, 22, 9), (63, 19, 7), + (57, 17, 7), (46, 17, 7), (37, 18, 5), (34, 17, 6), + (30, 18, 14), (30, 26, 11), (25, 32, 17), (37, 31, 31) +), + +// 70 ernst.anti-pope.ppm +( + (60, 41, 44), (63, 44, 53), (61, 45, 54), (62, 43, 55), + (59, 42, 56), (61, 39, 55), (61, 43, 57), (65, 44, 53), + (67, 46, 53), (74, 44, 54), (76, 44, 57), (80, 48, 63), + (87, 49, 64), (89, 43, 57), (93, 46, 53), (96, 44, 53), + (106, 49, 53), (104, 56, 56), (108, 68, 64), (111, 72, 67), + (119, 70, 68), (129, 76, 71), (133, 79, 68), (133, 75, 74), + (139, 65, 65), (134, 69, 76), (143, 77, 76), (170, 77, 76), + (148, 92, 81), (136, 92, 73), (135, 90, 87), (149, 96, 75), + (174, 114, 73), (203, 130, 81), (202, 137, 86), (201, 164, 136), + (201, 164, 138), (176, 147, 135), (203, 131, 101), (167, 145, 117), + (186, 121, 108), (174, 107, 89), (146, 117, 90), (133, 112, 98), + (118, 112, 123), (100, 95, 100), (125, 102, 98), (113, 100, 93), + (102, 84, 81), (100, 74, 86), (99, 77, 97), (98, 63, 76), + (94, 53, 70), (86, 52, 65), (81, 49, 63), (75, 52, 61), + (71, 52, 64), (70, 49, 64), (70, 50, 62), (69, 52, 63), + (67, 50, 61), (64, 50, 63), (66, 51, 59), (63, 51, 62), + (63, 54, 61), (62, 50, 61), (62, 48, 61), (62, 48, 61), + (57, 45, 59), (57, 43, 56), (57, 46, 56), (55, 45, 56), + (53, 43, 56), (53, 43, 57), (54, 40, 53), (53, 41, 55), + (55, 43, 57), (57, 42, 59), (57, 47, 59), (59, 49, 60), + (53, 48, 68), (58, 50, 66), (51, 49, 70), (49, 49, 64), + (52, 51, 70), (54, 51, 69), (57, 53, 67), (61, 52, 73), + (65, 53, 75), (64, 52, 70), (62, 51, 67), (61, 50, 68), + (60, 48, 70), (58, 49, 70), (58, 49, 67), (60, 48, 62), + (61, 50, 64), (61, 50, 63), (62, 50, 62), (63, 48, 61), + (65, 47, 61), (67, 45, 59), (65, 46, 58), (64, 46, 58), + (63, 47, 58), (63, 45, 57), (59, 45, 58), (58, 44, 57), + (61, 43, 57), (61, 44, 57), (61, 43, 59), (62, 42, 60), + (64, 44, 60), (66, 45, 61), (67, 47, 62), (66, 48, 67), + (66, 50, 69), (72, 53, 68), (74, 56, 70), (78, 56, 71), + (73, 68, 75), (80, 55, 76), (85, 58, 78), (79, 60, 84), + (86, 65, 82), (96, 68, 76), (98, 72, 79), (108, 85, 78), + (123, 88, 70), (113, 83, 78), (122, 85, 81), (132, 104, 92), + (127, 111, 90), (136, 93, 101), (142, 83, 87), (137, 82, 75), + (121, 80, 77), (110, 67, 85), (102, 67, 77), (94, 66, 72), + (83, 68, 66), (80, 71, 76), (81, 73, 85), (87, 84, 89), + (85, 69, 84), (90, 84, 96), (82, 84, 88), (80, 90, 95), + (85, 84, 110), (93, 72, 86), (82, 72, 81), (77, 70, 82), + (74, 63, 77), (72, 56, 74), (71, 55, 68), (67, 51, 65), + (65, 51, 67), (64, 50, 65), (67, 50, 66), (72, 51, 68), + (74, 50, 66), (80, 53, 63), (86, 55, 68), (89, 63, 68), + (91, 66, 68), (97, 65, 65), (103, 66, 58), (99, 64, 64), + (102, 61, 71), (111, 58, 72), (104, 63, 63), (118, 53, 59), + (127, 52, 59), (141, 47, 52), (161, 39, 53), (164, 37, 51), + (143, 41, 51), (136, 46, 61), (118, 47, 50), (111, 47, 59), + (109, 45, 59), (106, 46, 61), (107, 42, 63), (109, 41, 58), + (106, 42, 53), (95, 44, 59), (88, 45, 57), (78, 43, 61), + (70, 47, 63), (67, 46, 61), (66, 45, 62), (64, 46, 62), + (62, 45, 60), (62, 46, 58), (60, 45, 58), (58, 45, 59), + (58, 47, 58), (62, 48, 62), (64, 50, 63), (66, 52, 65), + (69, 55, 68), (71, 63, 68), (68, 65, 76), (66, 66, 76), + (62, 61, 78), (62, 61, 79), (65, 55, 80), (66, 54, 76), + (65, 53, 77), (60, 52, 80), (57, 54, 73), (58, 58, 70), + (57, 59, 74), (62, 61, 80), (59, 67, 86), (63, 68, 86), + (63, 68, 88), (65, 70, 90), (67, 65, 93), (62, 70, 95), + (58, 68, 99), (62, 75, 92), (59, 77, 97), (61, 76, 109), + (61, 77, 100), (54, 70, 105), (56, 70, 105), (53, 67, 102), + (52, 65, 99), (55, 65, 102), (54, 68, 103), (61, 73, 92), + (64, 68, 94), (68, 76, 95), (74, 79, 89), (70, 77, 83), + (66, 72, 87), (68, 62, 92), (70, 56, 77), (72, 55, 76), + (68, 56, 75), (72, 53, 72), (74, 54, 66), (75, 56, 64), + (77, 53, 61), (81, 50, 58), (87, 54, 52), (96, 51, 58), + (92, 44, 61), (85, 45, 62), (75, 45, 58), (71, 41, 54), + (70, 41, 56), (70, 41, 56), (69, 41, 55), (66, 41, 53) +), + +// 71 ernst.ubu-imperator.ppm +( + (36, 57, 12), (87, 102, 130), (126, 148, 170), (137, 166, 178), + (146, 174, 185), (160, 179, 186), (163, 183, 190), (161, 180, 186), + (154, 172, 181), (147, 165, 174), (138, 144, 155), (144, 103, 23), + (127, 77, 3), (93, 20, 6), (78, 10, 6), (65, 4, 2), + (53, 0, 8), (30, 4, 0), (9, 3, 2), (1, 1, 0), + (0, 0, 1), (3, 1, 3), (5, 0, 9), (21, 15, 4), + (32, 17, 0), (39, 3, 2), (48, 5, 0), (54, 4, 0), + (56, 3, 3), (65, 3, 0), (66, 2, 2), (70, 3, 3), + (76, 7, 1), (80, 4, 1), (79, 3, 0), (80, 4, 0), + (81, 9, 0), (81, 15, 0), (87, 26, 1), (103, 68, 8), + (108, 151, 11), (93, 159, 31), (123, 149, 161), (139, 163, 175), + (149, 171, 181), (158, 176, 184), (162, 177, 186), (166, 178, 187), + (164, 175, 185), (161, 173, 181), (162, 170, 173), (172, 123, 74), + (178, 113, 3), (187, 117, 1), (190, 122, 0), (184, 122, 2), + (165, 123, 8), (108, 143, 36), (117, 147, 164), (129, 161, 176), + (129, 166, 182), (103, 148, 174), (92, 105, 135), (72, 69, 15), + (76, 24, 3), (72, 17, 3), (73, 16, 1), (75, 15, 2), + (77, 14, 3), (78, 11, 4), (78, 9, 3), (77, 9, 1), + (74, 9, 1), (72, 10, 2), (71, 10, 4), (66, 9, 4), + (66, 6, 1), (64, 6, 2), (66, 10, 1), (68, 12, 2), + (69, 8, 1), (68, 6, 1), (69, 6, 0), (71, 7, 0), + (71, 8, 1), (73, 10, 2), (75, 12, 1), (75, 14, 1), + (81, 13, 2), (84, 15, 1), (90, 17, 2), (99, 23, 2), + (139, 79, 0), (151, 87, 6), (134, 63, 9), (102, 21, 4), + (93, 15, 5), (92, 12, 6), (101, 10, 2), (125, 27, 3), + (163, 66, 2), (179, 76, 2), (190, 94, 5), (206, 116, 4), + (211, 121, 1), (213, 130, 2), (214, 136, 1), (209, 137, 1), + (198, 131, 2), (181, 112, 1), (167, 100, 0), (150, 90, 1), + (126, 87, 7), (58, 84, 7), (34, 64, 2), (62, 90, 10), + (131, 87, 4), (157, 83, 1), (166, 87, 2), (168, 88, 2), + (169, 88, 1), (175, 87, 1), (180, 90, 4), (177, 98, 4), + (181, 102, 1), (177, 105, 1), (179, 109, 3), (188, 112, 1), + (195, 107, 1), (197, 109, 0), (200, 116, 2), (192, 121, 4), + (191, 121, 2), (179, 113, 3), (173, 105, 2), (158, 106, 9), + (107, 121, 142), (114, 139, 162), (109, 136, 162), (88, 101, 138), + (92, 44, 33), (86, 16, 5), (84, 10, 2), (82, 9, 3), + (84, 7, 1), (89, 11, 0), (91, 14, 1), (99, 17, 1), + (110, 20, 0), (151, 57, 4), (165, 68, 2), (170, 70, 6), + (170, 69, 2), (168, 73, 2), (171, 78, 0), (173, 88, 0), + (175, 95, 2), (182, 105, 0), (189, 114, 0), (197, 123, 2), + (206, 127, 2), (209, 130, 2), (212, 129, 3), (208, 124, 1), + (206, 122, 1), (198, 124, 4), (191, 119, 2), (186, 104, 5), + (177, 89, 8), (169, 74, 5), (164, 73, 2), (157, 57, 1), + (124, 25, 6), (102, 16, 2), (95, 16, 3), (91, 14, 2), + (87, 16, 2), (88, 15, 4), (95, 22, 2), (131, 52, 2), + (159, 67, 1), (162, 76, 0), (162, 80, 2), (168, 88, 6), + (173, 96, 6), (175, 96, 3), (172, 97, 2), (173, 98, 3), + (174, 102, 2), (167, 102, 4), (162, 113, 19), (145, 151, 153), + (162, 171, 176), (163, 172, 179), (169, 178, 183), (168, 177, 186), + (168, 184, 193), (169, 185, 190), (176, 186, 188), (182, 191, 183), + (180, 189, 188), (173, 190, 196), (177, 191, 200), (169, 191, 198), + (159, 190, 201), (148, 176, 187), (138, 166, 178), (133, 158, 172), + (109, 126, 146), (74, 88, 37), (58, 27, 5), (71, 19, 2), + (78, 19, 3), (81, 15, 5), (92, 33, 34), (87, 99, 124), + (102, 126, 155), (94, 105, 113), (130, 95, 4), (146, 99, 3), + (152, 96, 1), (159, 92, 2), (166, 103, 2), (177, 113, 0), + (175, 117, 2), (171, 121, 16), (152, 133, 70), (146, 163, 173), + (150, 168, 177), (154, 172, 181), (153, 176, 184), (151, 173, 186), + (154, 171, 185), (149, 169, 184), (145, 169, 177), (138, 154, 157), + (172, 124, 23), (195, 124, 6), (197, 126, 7), (200, 127, 7), + (212, 130, 11), (175, 176, 172), (175, 183, 184), (173, 182, 181), + (160, 170, 179), (139, 161, 174), (125, 138, 160), (91, 98, 105), + (43, 58, 6), (29, 18, 5), (15, 12, 4), (3, 6, 4), + (1, 3, 4), (4, 3, 2), (11, 11, 1), (26, 25, 3) +), + +// 72 fighting-forms.ppm +( + (2, 3, 0), (11, 15, 2), (22, 23, 8), (40, 36, 23), + (82, 53, 40), (133, 63, 36), (149, 96, 18), (169, 100, 12), + (182, 122, 14), (214, 140, 47), (235, 178, 73), (230, 176, 63), + (220, 159, 44), (174, 151, 29), (141, 139, 43), (129, 99, 40), + (56, 61, 33), (35, 36, 18), (25, 24, 6), (17, 18, 3), + (18, 17, 0), (24, 19, 0), (27, 25, 3), (35, 29, 12), + (100, 42, 16), (140, 45, 14), (144, 52, 14), (120, 55, 39), + (75, 59, 56), (51, 40, 38), (34, 28, 15), (24, 19, 5), + (13, 13, 3), (12, 13, 1), (7, 8, 3), (11, 13, 2), + (9, 11, 0), (12, 11, 2), (13, 15, 2), (22, 23, 7), + (30, 31, 12), (40, 40, 28), (52, 63, 69), (63, 96, 65), + (66, 103, 73), (100, 114, 124), (105, 155, 133), (138, 146, 105), + (152, 125, 65), (159, 122, 55), (158, 94, 30), (156, 60, 7), + (149, 46, 14), (135, 43, 40), (124, 57, 81), (97, 58, 132), + (80, 70, 149), (66, 83, 139), (85, 94, 140), (97, 116, 153), + (96, 119, 151), (96, 102, 126), (97, 87, 79), (137, 77, 67), + (164, 55, 24), (174, 60, 16), (175, 42, 4), (175, 37, 7), + (164, 40, 12), (142, 47, 14), (111, 47, 30), (65, 46, 47), + (37, 34, 22), (32, 34, 12), (31, 32, 16), (43, 33, 25), + (88, 42, 37), (140, 30, 9), (164, 24, 1), (169, 28, 2), + (174, 34, 2), (168, 38, 1), (160, 41, 4), (131, 44, 7), + (71, 53, 21), (34, 30, 10), (27, 22, 5), (18, 15, 1), + (13, 16, 1), (18, 19, 3), (30, 27, 11), (37, 33, 32), + (46, 32, 70), (59, 38, 117), (66, 58, 127), (67, 60, 133), + (63, 63, 123), (53, 51, 71), (56, 50, 67), (55, 47, 64), + (45, 46, 37), (45, 40, 29), (48, 43, 39), (61, 50, 62), + (75, 90, 70), (81, 95, 120), (89, 100, 136), (99, 97, 124), + (130, 93, 79), (158, 58, 28), (174, 63, 9), (184, 51, 4), + (186, 46, 8), (190, 37, 18), (187, 40, 21), (180, 48, 10), + (174, 50, 3), (166, 69, 2), (181, 83, 21), (205, 97, 2), + (203, 115, 5), (212, 138, 3), (218, 141, 4), (237, 144, 0), + (233, 139, 5), (225, 115, 4), (207, 98, 4), (204, 58, 27), + (199, 52, 18), (199, 49, 16), (193, 39, 9), (194, 35, 6), + (189, 36, 5), (186, 35, 2), (186, 33, 6), (182, 37, 5), + (185, 39, 2), (186, 31, 2), (185, 30, 3), (186, 31, 3), + (187, 30, 3), (186, 30, 2), (183, 32, 2), (179, 27, 3), + (180, 31, 3), (184, 31, 5), (184, 29, 6), (181, 30, 3), + (181, 28, 0), (181, 30, 2), (179, 29, 2), (174, 29, 0), + (176, 33, 3), (178, 30, 3), (175, 25, 1), (174, 24, 1), + (173, 25, 0), (166, 24, 1), (153, 26, 7), (116, 30, 5), + (43, 25, 4), (28, 18, 2), (26, 15, 1), (27, 15, 1), + (32, 23, 8), (43, 28, 14), (111, 34, 2), (144, 39, 4), + (160, 30, 2), (163, 35, 4), (155, 41, 12), (129, 53, 66), + (132, 71, 99), (99, 109, 132), (95, 141, 145), (107, 135, 143), + (101, 125, 156), (100, 117, 143), (87, 111, 128), (66, 114, 73), + (72, 108, 48), (97, 111, 29), (108, 120, 58), (138, 150, 119), + (183, 165, 155), (195, 175, 164), (163, 166, 182), (125, 170, 197), + (131, 154, 188), (120, 117, 172), (86, 106, 175), (68, 81, 143), + (67, 61, 123), (85, 56, 66), (112, 37, 48), (154, 39, 15), + (180, 48, 24), (187, 60, 69), (188, 118, 123), (193, 146, 160), + (206, 170, 188), (162, 157, 190), (144, 136, 147), (139, 102, 158), + (173, 54, 109), (167, 45, 49), (177, 43, 13), (170, 41, 14), + (153, 40, 9), (126, 36, 5), (55, 29, 11), (29, 17, 2), + (21, 11, 1), (18, 10, 0), (25, 16, 1), (28, 19, 8), + (36, 28, 10), (91, 44, 9), (143, 38, 7), (146, 47, 6), + (142, 52, 5), (130, 73, 10), (78, 62, 22), (40, 37, 23), + (44, 26, 16), (90, 27, 4), (136, 30, 7), (158, 30, 2), + (169, 33, 1), (175, 32, 7), (166, 37, 17), (149, 51, 36), + (129, 48, 74), (99, 54, 126), (76, 51, 129), (73, 58, 137), + (84, 74, 148), (102, 79, 152), (119, 80, 142), (174, 57, 99), + (178, 50, 50), (175, 49, 49), (186, 58, 48), (186, 57, 99), + (176, 59, 115), (124, 107, 116), (116, 143, 147), (128, 161, 139), + (190, 169, 127), (235, 175, 114), (233, 175, 81), (148, 146, 56), + (151, 99, 30), (120, 86, 12), (120, 78, 22), (56, 50, 9) +), + +// 73 fog25.ppm +( + (11, 14, 2), (30, 28, 10), (35, 35, 14), (52, 43, 23), + (52, 61, 22), (61, 63, 29), (67, 62, 30), (83, 70, 39), + (113, 96, 63), (149, 134, 131), (163, 157, 162), (175, 169, 173), + (178, 172, 176), (173, 165, 170), (160, 149, 152), (162, 119, 78), + (159, 108, 65), (135, 95, 47), (112, 83, 32), (88, 81, 23), + (75, 72, 18), (72, 59, 18), (73, 63, 24), (70, 48, 22), + (72, 57, 30), (66, 52, 20), (64, 60, 21), (66, 71, 23), + (72, 62, 27), (66, 73, 21), (75, 66, 26), (80, 64, 23), + (103, 73, 33), (130, 88, 40), (163, 99, 47), (172, 100, 47), + (174, 106, 51), (185, 120, 60), (194, 128, 73), (206, 141, 84), + (201, 145, 94), (179, 165, 164), (191, 180, 184), (205, 196, 192), + (214, 212, 217), (231, 230, 236), (238, 242, 245), (239, 242, 247), + (233, 236, 241), (227, 226, 231), (213, 208, 214), (197, 192, 198), + (178, 172, 177), (150, 144, 146), (130, 103, 68), (86, 76, 53), + (74, 61, 44), (68, 58, 40), (61, 53, 28), (58, 51, 19), + (60, 53, 11), (62, 45, 5), (45, 43, 6), (34, 39, 4), + (31, 41, 3), (36, 36, 9), (32, 35, 9), (30, 36, 6), + (17, 16, 10), (21, 18, 2), (31, 13, 5), (28, 20, 7), + (28, 24, 4), (33, 24, 6), (35, 41, 17), (45, 42, 12), + (51, 36, 17), (53, 37, 22), (62, 38, 16), (78, 39, 12), + (81, 46, 17), (83, 52, 12), (89, 65, 13), (103, 76, 18), + (119, 80, 26), (137, 85, 29), (160, 92, 41), (162, 103, 54), + (171, 109, 59), (184, 120, 59), (196, 124, 60), (194, 131, 73), + (199, 146, 97), (181, 170, 172), (196, 186, 191), (203, 198, 202), + (215, 216, 218), (230, 229, 235), (231, 231, 239), (231, 230, 238), + (225, 225, 229), (211, 208, 207), (195, 189, 193), (173, 168, 171), + (145, 140, 142), (117, 103, 54), (98, 77, 33), (86, 61, 34), + (78, 63, 30), (76, 63, 31), (75, 64, 34), (70, 58, 42), + (76, 55, 36), (72, 58, 30), (67, 57, 17), (63, 55, 9), + (53, 62, 2), (50, 42, 4), (47, 40, 7), (46, 40, 6), + (51, 39, 8), (52, 39, 10), (55, 41, 12), (58, 45, 19), + (57, 48, 20), (63, 47, 18), (70, 48, 15), (71, 48, 16), + (87, 53, 19), (100, 72, 29), (110, 90, 39), (134, 119, 63), + (148, 138, 137), (167, 164, 163), (182, 177, 177), (186, 179, 187), + (184, 177, 185), (178, 171, 178), (168, 155, 158), (187, 143, 107), + (192, 130, 79), (179, 119, 63), (165, 111, 56), (159, 109, 55), + (160, 111, 61), (160, 114, 72), (153, 141, 142), (167, 159, 164), + (172, 167, 171), (171, 166, 170), (157, 151, 153), (151, 135, 129), + (143, 105, 64), (124, 86, 40), (112, 73, 31), (88, 62, 31), + (91, 64, 24), (90, 64, 19), (89, 63, 18), (92, 69, 20), + (102, 78, 19), (112, 78, 29), (123, 83, 37), (142, 97, 52), + (143, 118, 69), (155, 146, 149), (178, 172, 174), (194, 190, 190), + (203, 199, 202), (217, 216, 222), (232, 235, 239), (241, 245, 248), + (245, 249, 252), (247, 251, 254), (249, 253, 255), (251, 253, 255), + (253, 254, 255), (253, 254, 255), (253, 254, 255), (251, 255, 255), + (249, 254, 255), (249, 253, 254), (249, 253, 254), (247, 253, 255), + (245, 250, 253), (244, 249, 253), (244, 249, 252), (240, 245, 248), + (231, 232, 237), (219, 216, 218), (203, 196, 202), (189, 183, 187), + (169, 160, 164), (180, 133, 98), (169, 113, 66), (163, 109, 56), + (167, 105, 58), (167, 114, 65), (162, 115, 75), (155, 144, 148), + (173, 164, 171), (184, 177, 185), (187, 182, 189), (188, 182, 187), + (179, 173, 174), (166, 156, 155), (198, 138, 89), (181, 123, 67), + (163, 104, 55), (152, 95, 50), (133, 91, 37), (124, 81, 28), + (117, 81, 28), (108, 77, 27), (111, 79, 32), (118, 83, 39), + (133, 92, 51), (146, 97, 56), (153, 103, 61), (152, 104, 57), + (148, 104, 57), (142, 101, 48), (134, 95, 43), (123, 84, 31), + (109, 70, 28), (99, 66, 22), (95, 64, 28), (97, 65, 36), + (102, 78, 52), (120, 88, 58), (143, 110, 81), (152, 144, 147), + (174, 165, 170), (193, 182, 188), (205, 195, 203), (220, 217, 224), + (232, 235, 242), (243, 246, 251), (245, 250, 253), (248, 253, 254), + (249, 253, 254), (253, 255, 254), (255, 255, 255), (255, 255, 255), + (254, 255, 255), (253, 254, 255), (253, 254, 255), (250, 251, 253), + (244, 248, 250), (234, 236, 243), (222, 219, 229), (207, 197, 205), + (188, 181, 189), (170, 160, 167), (142, 133, 134), (76, 67, 44) +), + +// 74 geyser27.ppm +( + (0, 0, 0), (26, 5, 5), (77, 17, 6), (98, 45, 29), + (124, 78, 66), (114, 129, 146), (115, 168, 193), (132, 179, 210), + (152, 186, 220), (153, 176, 202), (142, 171, 181), (157, 169, 176), + (165, 162, 158), (154, 131, 103), (149, 104, 73), (152, 98, 60), + (140, 85, 46), (138, 67, 23), (163, 57, 6), (173, 55, 8), + (179, 56, 3), (190, 61, 8), (208, 86, 7), (210, 110, 25), + (221, 127, 29), (222, 150, 44), (226, 161, 53), (222, 159, 52), + (222, 152, 60), (213, 148, 66), (193, 134, 70), (164, 146, 113), + (138, 141, 159), (133, 144, 165), (154, 139, 122), (148, 108, 84), + (158, 115, 69), (189, 121, 57), (198, 124, 48), (212, 136, 45), + (224, 146, 39), (223, 143, 35), (222, 137, 31), (222, 136, 24), + (221, 137, 18), (205, 101, 19), (198, 76, 4), (176, 60, 14), + (148, 86, 43), (154, 110, 61), (141, 115, 89), (125, 168, 156), + (126, 173, 199), (109, 156, 212), (105, 144, 195), (96, 120, 161), + (71, 74, 121), (37, 58, 125), (26, 49, 119), (16, 42, 117), + (17, 41, 115), (18, 38, 106), (35, 42, 95), (53, 36, 45), + (59, 35, 35), (84, 25, 14), (98, 35, 15), (116, 48, 18), + (121, 56, 23), (135, 72, 28), (142, 82, 36), (163, 103, 51), + (178, 108, 56), (196, 123, 61), (214, 145, 68), (202, 165, 99), + (182, 166, 149), (177, 174, 165), (175, 176, 165), (157, 168, 171), + (135, 153, 167), (120, 125, 129), (126, 87, 69), (125, 82, 64), + (126, 81, 63), (127, 75, 46), (137, 83, 37), (142, 82, 36), + (142, 80, 35), (134, 70, 20), (116, 51, 9), (107, 38, 11), + (97, 29, 7), (86, 25, 13), (87, 26, 8), (93, 28, 8), + (103, 31, 6), (110, 40, 6), (111, 43, 7), (141, 28, 8), + (143, 31, 7), (145, 34, 10), (148, 36, 6), (145, 39, 3), + (128, 54, 22), (115, 51, 25), (99, 50, 25), (99, 47, 28), + (102, 44, 27), (95, 42, 26), (53, 35, 43), (23, 38, 100), + (14, 34, 103), (18, 28, 89), (4, 0, 2), (1, 0, 0), + (24, 3, 2), (75, 15, 6), (85, 15, 2), (98, 23, 4), + (101, 24, 2), (105, 32, 2), (106, 34, 2), (104, 37, 12), + (100, 33, 14), (91, 30, 11), (88, 29, 11), (93, 38, 18), + (96, 39, 24), (98, 47, 30), (69, 63, 76), (36, 54, 121), + (49, 63, 118), (100, 68, 69), (114, 71, 55), (131, 86, 57), + (159, 109, 61), (186, 112, 45), (200, 123, 46), (217, 143, 50), + (221, 149, 55), (221, 147, 50), (211, 139, 54), (188, 119, 49), + (175, 103, 38), (152, 85, 32), (165, 61, 23), (160, 43, 7), + (163, 41, 6), (153, 31, 3), (156, 35, 7), (162, 41, 7), + (164, 43, 5), (170, 53, 9), (182, 67, 12), (195, 110, 40), + (213, 134, 48), (224, 152, 58), (223, 161, 67), (222, 154, 64), + (195, 134, 61), (181, 119, 60), (156, 111, 61), (145, 104, 74), + (126, 81, 65), (91, 91, 112), (114, 123, 157), (118, 163, 183), + (127, 182, 196), (128, 186, 211), (132, 187, 192), (154, 193, 164), + (167, 204, 164), (170, 202, 163), (180, 203, 188), (163, 198, 225), + (139, 193, 222), (136, 192, 219), (119, 177, 225), (115, 173, 225), + (112, 166, 225), (109, 154, 202), (113, 118, 144), (119, 77, 72), + (112, 67, 52), (102, 53, 32), (102, 53, 33), (111, 67, 54), + (90, 85, 91), (44, 63, 127), (32, 52, 121), (26, 46, 119), + (18, 38, 109), (16, 31, 95), (2, 4, 21), (0, 0, 0), + (0, 0, 0), (6, 1, 0), (33, 11, 21), (46, 37, 52), + (55, 66, 120), (98, 107, 144), (133, 149, 176), (137, 158, 190), + (121, 132, 164), (76, 86, 128), (40, 58, 125), (30, 50, 118), + (27, 47, 121), (39, 50, 109), (107, 61, 46), (104, 57, 36), + (110, 60, 40), (130, 82, 55), (153, 108, 60), (155, 114, 66), + (186, 132, 68), (216, 177, 98), (221, 182, 114), (220, 213, 126), + (223, 205, 147), (194, 197, 178), (174, 198, 177), (183, 184, 159), + (192, 145, 102), (178, 111, 64), (170, 81, 28), (173, 58, 7), + (173, 52, 7), (173, 50, 5), (167, 48, 2), (160, 47, 3), + (158, 48, 2), (163, 51, 6), (174, 58, 8), (189, 97, 22), + (209, 124, 41), (219, 144, 52), (219, 148, 62), (200, 138, 62), + (187, 134, 72), (171, 156, 133), (167, 172, 160), (138, 150, 173), + (126, 139, 157), (142, 106, 81), (117, 71, 55), (108, 50, 28), + (98, 42, 18), (89, 28, 10), (81, 23, 6), (78, 14, 2), + (78, 14, 1), (75, 7, 1), (9, 0, 1), (0, 0, 0) +), + +// 75 gris.josette.ppm +( + (36, 41, 40), (71, 77, 82), (90, 114, 119), (120, 152, 164), + (158, 192, 200), (171, 198, 207), (176, 199, 207), (178, 198, 207), + (176, 199, 208), (179, 200, 207), (181, 202, 207), (184, 204, 213), + (186, 209, 219), (184, 209, 220), (183, 211, 217), (181, 207, 209), + (179, 205, 210), (187, 207, 213), (188, 211, 216), (188, 211, 217), + (188, 211, 217), (190, 209, 221), (194, 213, 219), (250, 249, 229), + (255, 250, 227), (255, 247, 228), (227, 228, 218), (193, 205, 212), + (188, 204, 204), (180, 195, 198), (162, 178, 167), (117, 146, 147), + (90, 124, 134), (81, 117, 123), (76, 105, 109), (71, 102, 97), + (63, 89, 80), (40, 59, 60), (33, 47, 50), (29, 43, 46), + (26, 36, 38), (18, 27, 26), (14, 23, 22), (19, 28, 27), + (30, 36, 35), (29, 36, 39), (32, 41, 46), (32, 46, 49), + (42, 48, 47), (42, 53, 46), (73, 82, 57), (72, 84, 72), + (73, 91, 84), (76, 95, 96), (79, 98, 94), (82, 102, 99), + (84, 104, 100), (93, 106, 100), (90, 111, 114), (88, 115, 124), + (94, 122, 133), (139, 153, 152), (175, 190, 183), (177, 193, 190), + (157, 174, 157), (94, 123, 129), (82, 108, 109), (66, 93, 89), + (37, 52, 58), (26, 38, 39), (11, 18, 22), (8, 11, 18), + (7, 9, 16), (9, 14, 18), (13, 20, 23), (26, 36, 38), + (36, 50, 55), (61, 80, 82), (70, 96, 93), (76, 100, 101), + (76, 103, 111), (79, 110, 113), (82, 110, 120), (85, 112, 125), + (86, 115, 129), (87, 118, 133), (90, 124, 143), (139, 166, 175), + (171, 187, 203), (180, 195, 202), (183, 198, 201), (180, 198, 199), + (174, 194, 195), (157, 160, 165), (97, 119, 125), (86, 106, 106), + (69, 83, 82), (37, 52, 53), (28, 39, 36), (16, 25, 24), + (10, 18, 21), (10, 16, 22), (12, 20, 23), (25, 39, 42), + (40, 59, 65), (69, 97, 94), (90, 117, 122), (125, 150, 154), + (173, 193, 185), (185, 200, 195), (184, 200, 200), (174, 196, 201), + (145, 179, 183), (91, 133, 141), (86, 120, 132), (86, 116, 127), + (86, 116, 127), (90, 116, 127), (99, 128, 135), (160, 176, 163), + (193, 195, 186), (190, 205, 197), (208, 214, 203), (255, 250, 223), + (254, 252, 232), (253, 252, 234), (253, 250, 231), (246, 245, 225), + (191, 210, 215), (186, 204, 213), (182, 203, 208), (178, 201, 209), + (174, 201, 209), (165, 197, 207), (142, 175, 185), (87, 123, 144), + (85, 119, 138), (87, 120, 141), (108, 137, 143), (145, 181, 181), + (175, 196, 201), (184, 197, 205), (189, 207, 207), (192, 206, 207), + (192, 209, 208), (214, 225, 211), (249, 253, 231), (253, 253, 243), + (253, 253, 244), (253, 252, 243), (247, 249, 225), (192, 209, 203), + (163, 178, 172), (118, 136, 143), (90, 119, 126), (85, 113, 120), + (84, 112, 115), (86, 110, 111), (88, 112, 116), (88, 117, 123), + (92, 122, 132), (118, 148, 148), (161, 181, 176), (176, 195, 200), + (178, 197, 204), (178, 198, 205), (172, 200, 204), (169, 192, 200), + (125, 156, 166), (91, 123, 135), (77, 112, 116), (68, 97, 97), + (53, 71, 81), (32, 49, 59), (30, 46, 57), (40, 60, 67), + (65, 88, 80), (72, 92, 91), (74, 95, 98), (75, 100, 97), + (77, 102, 99), (79, 104, 101), (78, 103, 100), (78, 101, 95), + (78, 101, 95), (78, 102, 95), (80, 103, 98), (81, 102, 101), + (81, 101, 102), (82, 102, 103), (80, 104, 105), (76, 106, 107), + (77, 106, 108), (79, 109, 108), (80, 110, 112), (79, 111, 114), + (81, 111, 114), (82, 113, 115), (85, 115, 116), (85, 114, 118), + (85, 113, 123), (85, 115, 127), (84, 116, 124), (83, 117, 127), + (86, 119, 125), (97, 126, 133), (149, 174, 171), (173, 194, 197), + (177, 197, 199), (179, 200, 200), (173, 193, 201), (144, 173, 179), + (91, 124, 141), (84, 118, 130), (76, 112, 121), (66, 106, 112), + (71, 104, 106), (73, 104, 103), (72, 101, 97), (68, 91, 83), + (46, 61, 68), (39, 50, 52), (36, 46, 39), (34, 38, 28), + (13, 19, 19), (9, 18, 17), (9, 20, 23), (24, 34, 37), + (34, 43, 42), (42, 52, 54), (70, 81, 71), (73, 88, 81), + (74, 96, 87), (72, 95, 86), (70, 90, 82), (70, 84, 79), + (44, 62, 67), (29, 48, 54), (30, 48, 52), (32, 51, 58), + (48, 63, 70), (69, 91, 89), (86, 108, 111), (95, 124, 130), + (181, 190, 150), (224, 207, 189), (250, 246, 219), (255, 251, 224), + (252, 250, 229), (238, 243, 231), (189, 212, 214), (181, 203, 201), + (174, 193, 194), (129, 156, 154), (92, 121, 120), (69, 90, 80) +), + +// 76 gris.landscape-ceret.ppm +( + (16, 15, 9), (38, 38, 25), (74, 64, 42), (102, 59, 39), + (124, 79, 40), (136, 91, 44), (160, 94, 56), (173, 80, 72), + (182, 80, 70), (210, 77, 71), (209, 82, 67), (202, 48, 38), + (227, 88, 54), (211, 102, 54), (226, 127, 50), (234, 143, 56), + (238, 156, 65), (228, 167, 71), (189, 166, 79), (133, 176, 107), + (119, 153, 122), (111, 145, 124), (96, 138, 126), (103, 124, 100), + (99, 100, 94), (78, 96, 107), (69, 100, 132), (64, 121, 173), + (98, 165, 196), (107, 165, 182), (122, 172, 179), (171, 201, 211), + (189, 209, 209), (201, 210, 207), (210, 219, 205), (196, 208, 204), + (163, 189, 199), (132, 166, 174), (118, 138, 153), (134, 115, 126), + (168, 130, 107), (180, 120, 108), (181, 101, 112), (209, 90, 97), + (215, 92, 95), (220, 95, 96), (217, 98, 100), (226, 98, 95), + (228, 105, 92), (232, 105, 88), (229, 97, 83), (224, 83, 73), + (227, 88, 85), (219, 100, 76), (227, 105, 83), (229, 106, 90), + (224, 107, 98), (226, 116, 103), (226, 121, 114), (215, 152, 155), + (218, 168, 168), (217, 172, 167), (222, 177, 172), (239, 183, 170), + (239, 185, 167), (226, 202, 144), (252, 231, 99), (252, 223, 89), + (248, 218, 82), (249, 200, 79), (228, 191, 83), (180, 160, 91), + (136, 184, 126), (112, 162, 130), (113, 156, 132), (111, 156, 135), + (124, 161, 154), (128, 163, 167), (126, 154, 174), (120, 141, 162), + (98, 123, 138), (101, 123, 131), (100, 132, 109), (100, 120, 96), + (96, 110, 85), (88, 94, 70), (112, 87, 42), (120, 85, 44), + (128, 86, 56), (139, 86, 54), (159, 115, 62), (177, 122, 52), + (198, 127, 62), (221, 146, 50), (221, 160, 47), (214, 166, 37), + (234, 179, 32), (248, 194, 35), (253, 197, 34), (252, 198, 35), + (249, 196, 31), (249, 195, 43), (249, 165, 48), (242, 150, 38), + (241, 151, 32), (242, 149, 36), (241, 150, 35), (237, 142, 33), + (225, 139, 28), (229, 140, 32), (230, 133, 43), (220, 126, 44), + (223, 122, 32), (221, 127, 29), (214, 135, 33), (207, 133, 39), + (210, 144, 43), (206, 140, 60), (193, 141, 67), (164, 143, 82), + (129, 131, 69), (109, 115, 58), (90, 116, 69), (85, 107, 68), + (76, 79, 81), (89, 93, 72), (78, 85, 68), (66, 71, 62), + (56, 62, 58), (48, 51, 51), (36, 35, 24), (25, 15, 16), + (10, 13, 9), (8, 7, 5), (4, 2, 3), (14, 13, 11), + (16, 14, 15), (19, 18, 15), (20, 18, 19), (28, 35, 24), + (33, 34, 32), (29, 38, 31), (45, 56, 40), (52, 57, 47), + (58, 54, 43), (57, 59, 46), (60, 53, 49), (62, 60, 58), + (69, 68, 63), (70, 80, 60), (83, 81, 70), (97, 87, 81), + (112, 94, 86), (116, 104, 83), (129, 111, 73), (130, 124, 55), + (125, 120, 57), (134, 112, 46), (163, 121, 48), (198, 142, 59), + (205, 153, 76), (218, 163, 137), (212, 164, 160), (208, 155, 162), + (199, 126, 129), (194, 113, 123), (189, 121, 124), (202, 126, 104), + (196, 116, 69), (198, 112, 35), (199, 108, 31), (207, 127, 39), + (211, 131, 40), (228, 140, 40), (244, 160, 44), (248, 194, 44), + (253, 199, 40), (253, 200, 35), (253, 201, 37), (254, 204, 41), + (251, 205, 41), (252, 206, 42), (254, 211, 39), (254, 206, 44), + (253, 202, 44), (249, 204, 53), (246, 196, 59), (241, 192, 54), + (236, 172, 64), (195, 164, 84), (132, 187, 124), (127, 189, 119), + (115, 171, 106), (111, 161, 95), (103, 126, 95), (97, 115, 89), + (94, 112, 86), (90, 108, 78), (106, 107, 67), (115, 94, 66), + (104, 87, 59), (100, 75, 56), (92, 69, 49), (85, 77, 61), + (93, 85, 62), (98, 89, 50), (96, 71, 46), (93, 74, 46), + (87, 73, 43), (79, 82, 63), (69, 89, 69), (69, 95, 62), + (52, 86, 60), (60, 84, 63), (64, 86, 47), (65, 71, 57), + (69, 70, 50), (76, 69, 49), (74, 80, 52), (72, 95, 61), + (78, 105, 71), (95, 123, 75), (108, 138, 71), (119, 138, 81), + (152, 142, 139), (201, 151, 162), (215, 173, 175), (218, 200, 175), + (227, 228, 211), (254, 251, 249), (252, 252, 250), (250, 252, 252), + (228, 234, 230), (219, 220, 216), (237, 189, 172), (253, 228, 97), + (251, 218, 72), (254, 213, 63), (251, 211, 67), (249, 214, 62), + (251, 212, 56), (252, 213, 52), (253, 210, 46), (254, 201, 44), + (246, 191, 47), (244, 164, 74), (222, 170, 100), (231, 157, 139), + (214, 165, 166), (213, 156, 162), (198, 135, 148), (178, 118, 131), + (161, 106, 115), (123, 76, 72), (75, 68, 56), (42, 42, 38) +), + +// 77 kandinsky.comp-9.ppm +( + (81, 31, 21), (121, 26, 10), (159, 21, 3), (194, 57, 2), + (216, 102, 0), (215, 111, 0), (215, 122, 1), (220, 132, 2), + (227, 148, 3), (233, 167, 22), (251, 191, 41), (252, 194, 60), + (253, 200, 72), (225, 192, 103), (216, 204, 135), (224, 205, 153), + (232, 201, 156), (251, 210, 92), (254, 207, 68), (254, 191, 42), + (248, 182, 7), (231, 146, 2), (225, 127, 2), (221, 107, 0), + (197, 62, 6), (169, 26, 4), (157, 35, 12), (154, 76, 92), + (162, 80, 100), (173, 137, 99), (141, 186, 121), (146, 183, 127), + (179, 183, 142), (192, 170, 137), (240, 177, 82), (254, 198, 69), + (254, 207, 68), (254, 203, 65), (252, 194, 62), (251, 190, 56), + (249, 181, 57), (243, 169, 37), (221, 129, 5), (210, 110, 0), + (195, 60, 4), (167, 19, 1), (129, 20, 3), (96, 28, 20), + (84, 30, 23), (88, 33, 27), (97, 29, 42), (84, 35, 46), + (92, 136, 115), (90, 161, 127), (125, 186, 117), (143, 187, 118), + (203, 172, 77), (200, 138, 40), (196, 115, 9), (170, 51, 13), + (123, 29, 7), (106, 35, 13), (92, 32, 18), (92, 29, 17), + (119, 28, 5), (125, 30, 7), (182, 57, 14), (210, 109, 3), + (218, 123, 10), (237, 165, 27), (235, 187, 61), (215, 194, 103), + (173, 197, 132), (146, 197, 126), (138, 195, 127), (134, 194, 124), + (137, 192, 130), (149, 193, 134), (178, 188, 138), (200, 205, 141), + (212, 205, 172), (216, 213, 187), (212, 217, 186), (180, 205, 174), + (157, 195, 166), (112, 187, 178), (103, 185, 183), (95, 177, 181), + (68, 160, 185), (69, 166, 201), (91, 173, 167), (112, 172, 141), + (129, 190, 123), (131, 188, 123), (128, 186, 116), (121, 182, 107), + (91, 149, 116), (102, 34, 47), (107, 34, 15), (123, 28, 10), + (170, 49, 11), (214, 97, 1), (217, 111, 0), (222, 124, 3), + (227, 141, 2), (234, 157, 22), (240, 176, 44), (249, 194, 54), + (250, 194, 60), (252, 202, 64), (254, 200, 63), (253, 196, 67), + (246, 192, 66), (219, 182, 92), (162, 192, 118), (141, 188, 124), + (133, 187, 123), (136, 186, 121), (137, 189, 128), (132, 187, 132), + (108, 176, 182), (98, 183, 188), (96, 185, 193), (81, 171, 198), + (67, 175, 209), (68, 174, 204), (81, 180, 196), (94, 181, 171), + (130, 192, 129), (136, 186, 120), (134, 118, 91), (127, 53, 73), + (94, 31, 50), (85, 26, 44), (81, 25, 40), (81, 25, 36), + (74, 29, 33), (73, 29, 30), (29, 41, 29), (28, 38, 27), + (11, 17, 13), (5, 16, 11), (10, 12, 8), (12, 12, 10), + (26, 18, 7), (71, 26, 33), (85, 30, 43), (96, 81, 53), + (86, 157, 121), (127, 184, 120), (145, 173, 143), (163, 176, 159), + (197, 184, 169), (215, 198, 190), (209, 202, 182), (179, 201, 158), + (155, 200, 143), (139, 195, 127), (134, 184, 113), (148, 113, 77), + (158, 36, 13), (165, 15, 3), (174, 4, 5), (178, 5, 1), + (181, 14, 1), (162, 18, 3), (131, 19, 0), (119, 22, 5), + (122, 28, 14), (144, 95, 64), (161, 147, 76), (136, 184, 115), + (138, 187, 118), (151, 186, 112), (213, 190, 86), (235, 190, 72), + (252, 203, 78), (239, 213, 117), (231, 214, 169), (234, 218, 179), + (228, 220, 181), (210, 214, 170), (160, 205, 149), (148, 202, 142), + (147, 200, 138), (161, 198, 139), (181, 200, 134), (198, 195, 118), + (234, 187, 70), (241, 174, 51), (230, 129, 18), (227, 125, 3), + (224, 121, 3), (228, 119, 2), (222, 123, 4), (224, 125, 4), + (223, 130, 1), (229, 145, 1), (232, 166, 29), (219, 181, 69), + (183, 183, 110), (153, 193, 124), (153, 201, 135), (158, 203, 146), + (188, 210, 164), (206, 218, 197), (202, 219, 203), (200, 214, 201), + (149, 193, 172), (112, 192, 183), (125, 194, 172), (144, 192, 132), + (166, 192, 126), (213, 152, 98), (213, 131, 14), (218, 121, 7), + (221, 113, 5), (220, 111, 2), (223, 117, 2), (223, 117, 4), + (222, 118, 1), (218, 119, 1), (218, 122, 0), (217, 125, 1), + (217, 134, 9), (231, 160, 32), (241, 171, 85), (206, 186, 135), + (230, 211, 173), (227, 216, 188), (227, 210, 192), (230, 220, 195), + (226, 221, 194), (225, 219, 188), (221, 218, 192), (223, 227, 196), + (219, 222, 207), (207, 221, 204), (216, 223, 196), (215, 218, 189), + (220, 218, 173), (204, 191, 145), (201, 135, 144), (218, 142, 83), + (196, 127, 22), (202, 87, 2), (163, 21, 0), (124, 19, 1), + (101, 32, 6), (84, 47, 14), (111, 120, 67), (85, 155, 123), + (89, 165, 129), (83, 157, 124), (70, 122, 117), (78, 32, 40) +), + +// 78 kandinsky.yellow-red-blue.ppm +( + (8, 1, 9), (18, 7, 12), (41, 2, 17), (56, 14, 26), + (97, 18, 40), (101, 48, 45), (110, 76, 36), (142, 112, 37), + (125, 122, 42), (118, 90, 40), (110, 72, 34), (104, 17, 29), + (111, 23, 27), (141, 41, 42), (168, 88, 88), (178, 116, 101), + (156, 118, 128), (138, 130, 114), (139, 126, 99), (132, 121, 90), + (129, 120, 101), (129, 118, 116), (110, 100, 123), (92, 69, 125), + (85, 65, 116), (98, 71, 105), (130, 98, 74), (137, 130, 54), + (140, 128, 55), (145, 118, 45), (149, 123, 38), (144, 128, 50), + (158, 141, 56), (172, 151, 55), (159, 145, 47), (171, 154, 58), + (184, 153, 66), (185, 154, 70), (183, 155, 68), (177, 163, 70), + (174, 160, 66), (168, 157, 71), (172, 159, 65), (168, 156, 68), + (163, 155, 67), (160, 147, 69), (164, 151, 85), (164, 153, 89), + (162, 153, 91), (156, 155, 98), (155, 142, 108), (158, 149, 97), + (152, 149, 96), (151, 147, 113), (143, 137, 124), (139, 128, 135), + (128, 118, 135), (119, 126, 142), (115, 128, 147), (116, 128, 154), + (117, 109, 167), (105, 110, 165), (103, 139, 206), (116, 143, 241), + (118, 132, 242), (128, 138, 243), (135, 150, 243), (148, 161, 244), + (140, 151, 239), (141, 160, 242), (145, 155, 240), (158, 145, 230), + (161, 146, 223), (144, 152, 223), (158, 136, 227), (170, 135, 216), + (169, 146, 220), (188, 165, 214), (210, 179, 238), (219, 192, 244), + (233, 209, 245), (236, 211, 243), (218, 190, 245), (191, 170, 246), + (178, 158, 247), (157, 144, 237), (147, 128, 230), (143, 125, 227), + (103, 124, 233), (100, 115, 200), (102, 87, 192), (75, 74, 148), + (27, 54, 120), (30, 45, 100), (30, 39, 66), (28, 37, 51), + (33, 31, 33), (32, 33, 37), (39, 45, 51), (40, 67, 94), + (59, 52, 113), (71, 66, 120), (78, 66, 158), (88, 66, 180), + (107, 75, 215), (120, 89, 216), (125, 84, 226), (132, 101, 228), + (141, 107, 236), (144, 113, 236), (139, 108, 233), (125, 104, 207), + (110, 95, 198), (133, 110, 177), (155, 133, 166), (168, 154, 171), + (163, 149, 162), (145, 134, 166), (129, 132, 161), (109, 121, 132), + (96, 114, 122), (86, 98, 124), (67, 76, 117), (56, 63, 104), + (60, 58, 69), (66, 35, 69), (95, 25, 56), (113, 29, 62), + (144, 42, 79), (157, 65, 100), (129, 75, 130), (98, 81, 181), + (97, 85, 199), (96, 61, 204), (94, 59, 202), (89, 57, 197), + (85, 53, 196), (92, 63, 190), (94, 61, 197), (90, 59, 188), + (74, 45, 173), (70, 43, 176), (69, 40, 160), (63, 36, 144), + (31, 33, 99), (20, 19, 67), (19, 16, 48), (17, 14, 39), + (19, 20, 27), (13, 9, 7), (5, 2, 9), (5, 0, 7), + (4, 0, 6), (1, 1, 3), (1, 0, 2), (3, 2, 2), + (3, 4, 4), (3, 2, 6), (3, 1, 10), (8, 6, 14), + (22, 19, 32), (34, 29, 31), (34, 30, 30), (42, 29, 38), + (44, 26, 48), (52, 37, 48), (60, 56, 66), (66, 66, 74), + (67, 75, 95), (128, 118, 104), (155, 142, 109), (168, 155, 126), + (178, 163, 154), (177, 167, 165), (183, 170, 173), (193, 175, 195), + (201, 183, 220), (214, 186, 227), (215, 178, 232), (219, 180, 240), + (208, 180, 244), (198, 175, 242), (178, 171, 231), (177, 160, 220), + (182, 156, 210), (184, 156, 207), (186, 155, 207), (181, 158, 187), + (180, 159, 185), (151, 141, 201), (143, 130, 204), (154, 126, 218), + (147, 120, 232), (148, 115, 236), (158, 120, 237), (158, 137, 235), + (156, 139, 240), (149, 152, 246), (148, 157, 250), (150, 160, 250), + (163, 158, 254), (182, 174, 250), (181, 177, 239), (175, 177, 235), + (176, 167, 212), (163, 149, 196), (147, 149, 183), (136, 140, 187), + (120, 119, 174), (126, 123, 191), (145, 138, 187), (139, 147, 196), + (149, 129, 196), (157, 132, 188), (164, 93, 177), (183, 94, 182), + (185, 110, 174), (183, 133, 144), (158, 138, 149), (166, 141, 158), + (159, 147, 145), (158, 150, 130), (160, 155, 125), (161, 156, 101), + (168, 157, 80), (175, 160, 75), (187, 159, 70), (192, 162, 64), + (228, 195, 48), (198, 165, 66), (200, 174, 84), (202, 169, 86), + (220, 171, 90), (216, 186, 60), (211, 181, 92), (211, 177, 96), + (221, 172, 100), (207, 178, 98), (219, 186, 97), (228, 203, 101), + (225, 197, 113), (223, 192, 148), (213, 188, 149), (209, 179, 151), + (194, 163, 141), (182, 166, 137), (162, 152, 107), (161, 150, 87), + (159, 145, 65), (158, 130, 56), (138, 129, 75), (125, 95, 54), + (104, 70, 31), (56, 19, 44), (27, 9, 40), (13, 2, 11) +), + +// 79 klee.insula-dulcamara.ppm +( + (23, 10, 4), (63, 38, 27), (144, 110, 85), (148, 131, 73), + (144, 136, 86), (163, 131, 90), (176, 146, 96), (192, 163, 102), + (193, 157, 114), (193, 161, 130), (193, 168, 147), (181, 169, 156), + (168, 169, 150), (146, 160, 158), (130, 147, 155), (120, 159, 162), + (121, 161, 146), (112, 150, 152), (87, 121, 142), (92, 116, 138), + (119, 138, 142), (131, 142, 131), (154, 158, 110), (156, 154, 101), + (171, 151, 99), (170, 147, 84), (166, 131, 76), (152, 128, 75), + (149, 122, 63), (109, 83, 48), (26, 8, 7), (24, 6, 4), + (19, 7, 6), (17, 3, 2), (9, 2, 2), (4, 11, 6), + (26, 20, 6), (87, 117, 85), (117, 151, 117), (145, 138, 113), + (143, 132, 87), (129, 107, 66), (28, 10, 7), (22, 7, 8), + (30, 15, 12), (92, 111, 109), (84, 117, 137), (84, 111, 146), + (110, 139, 153), (126, 157, 141), (153, 160, 132), (151, 165, 120), + (164, 171, 122), (171, 167, 111), (170, 169, 104), (177, 149, 104), + (186, 143, 93), (176, 148, 77), (160, 151, 65), (175, 150, 75), + (169, 141, 61), (163, 108, 61), (132, 86, 35), (32, 9, 1), + (34, 20, 5), (128, 109, 56), (159, 114, 78), (177, 117, 83), + (186, 129, 83), (184, 131, 89), (193, 134, 99), (187, 149, 91), + (192, 143, 100), (199, 154, 108), (201, 156, 119), (201, 169, 121), + (202, 174, 128), (201, 178, 133), (213, 183, 133), (206, 179, 137), + (210, 179, 137), (219, 180, 138), (219, 182, 133), (216, 185, 134), + (216, 185, 137), (221, 184, 144), (221, 193, 147), (221, 192, 158), + (219, 187, 159), (221, 190, 165), (221, 196, 167), (220, 197, 172), + (220, 200, 165), (206, 196, 165), (196, 191, 167), (195, 184, 166), + (192, 178, 167), (166, 178, 173), (160, 179, 167), (158, 168, 161), + (149, 165, 164), (148, 164, 167), (144, 170, 170), (142, 165, 178), + (121, 153, 171), (113, 138, 160), (94, 119, 147), (89, 110, 140), + (52, 49, 54), (23, 10, 7), (14, 5, 0), (6, 1, 0), + (9, 2, 1), (19, 8, 7), (26, 8, 6), (54, 34, 14), + (150, 122, 40), (147, 148, 57), (143, 149, 61), (155, 145, 69), + (176, 143, 69), (194, 151, 66), (199, 146, 64), (197, 145, 60), + (181, 145, 67), (178, 139, 72), (186, 142, 76), (183, 147, 72), + (185, 154, 80), (190, 156, 84), (191, 168, 99), (175, 179, 104), + (181, 168, 120), (195, 169, 133), (183, 174, 137), (197, 165, 130), + (206, 166, 126), (211, 176, 133), (209, 188, 136), (215, 181, 133), + (202, 184, 122), (205, 197, 119), (195, 192, 115), (203, 190, 107), + (210, 172, 110), (212, 189, 110), (207, 192, 106), (191, 190, 101), + (182, 186, 92), (174, 183, 78), (168, 179, 79), (158, 175, 75), + (157, 166, 69), (145, 164, 64), (129, 163, 91), (94, 146, 106), + (67, 58, 29), (24, 11, 6), (26, 9, 6), (95, 79, 42), + (121, 129, 96), (146, 161, 92), (166, 185, 88), (172, 177, 82), + (185, 184, 76), (184, 187, 85), (179, 177, 86), (189, 175, 97), + (203, 177, 100), (199, 168, 110), (211, 164, 112), (208, 162, 123), + (202, 166, 121), (210, 164, 134), (207, 167, 147), (207, 169, 135), + (207, 169, 130), (214, 174, 125), (210, 173, 122), (205, 172, 125), + (202, 178, 124), (187, 178, 120), (184, 182, 117), (203, 187, 95), + (209, 186, 94), (217, 193, 101), (213, 175, 93), (208, 171, 87), + (208, 165, 80), (205, 158, 79), (193, 160, 79), (192, 162, 80), + (203, 180, 85), (199, 187, 82), (217, 198, 90), (220, 201, 98), + (226, 204, 105), (221, 190, 103), (222, 200, 120), (222, 191, 127), + (234, 200, 134), (222, 186, 122), (221, 186, 133), (219, 186, 135), + (215, 185, 130), (206, 189, 130), (204, 185, 139), (206, 183, 146), + (200, 174, 144), (202, 177, 146), (193, 182, 150), (187, 184, 154), + (181, 174, 153), (194, 184, 149), (210, 178, 152), (209, 181, 157), + (216, 188, 146), (214, 191, 146), (216, 196, 147), (223, 197, 151), + (226, 198, 154), (223, 207, 156), (215, 203, 166), (221, 204, 164), + (222, 195, 177), (237, 204, 177), (223, 200, 171), (230, 221, 187), + (226, 219, 191), (217, 208, 195), (255, 250, 232), (210, 201, 181), + (217, 209, 167), (230, 208, 161), (227, 208, 158), (224, 207, 153), + (226, 202, 156), (227, 196, 161), (223, 191, 165), (224, 190, 159), + (219, 196, 162), (215, 198, 163), (212, 192, 167), (211, 191, 160), + (206, 196, 161), (206, 195, 165), (207, 186, 165), (200, 190, 166), + (199, 194, 160), (198, 197, 143), (179, 200, 141), (171, 171, 130), + (155, 147, 120), (147, 135, 111), (134, 114, 74), (34, 16, 7) +), + +// 80 nile.ppm +( + (6, 39, 66), (27, 62, 99), (97, 68, 75), (156, 67, 38), + (216, 117, 3), (235, 142, 3), (254, 172, 3), (250, 212, 163), + (252, 231, 218), (238, 226, 247), (239, 229, 249), (237, 221, 250), + (220, 207, 244), (203, 200, 243), (198, 194, 235), (198, 173, 212), + (205, 162, 167), (203, 138, 42), (233, 145, 2), (242, 148, 1), + (250, 157, 6), (215, 175, 140), (203, 175, 195), (190, 164, 195), + (190, 148, 137), (216, 135, 22), (215, 125, 10), (171, 102, 23), + (129, 100, 47), (121, 95, 144), (128, 142, 174), (173, 161, 221), + (183, 170, 228), (186, 173, 229), (188, 175, 237), (188, 180, 239), + (191, 178, 242), (191, 176, 241), (195, 171, 230), (193, 166, 240), + (196, 167, 231), (195, 168, 229), (185, 164, 220), (177, 160, 210), + (137, 139, 141), (134, 82, 60), (141, 38, 18), (116, 24, 1), + (112, 16, 1), (115, 28, 6), (120, 61, 52), (103, 73, 159), + (64, 36, 166), (29, 40, 175), (24, 42, 167), (8, 47, 170), + (2, 38, 172), (7, 34, 178), (9, 48, 185), (19, 54, 186), + (23, 67, 194), (40, 59, 185), (52, 61, 183), (65, 68, 191), + (68, 70, 191), (77, 86, 199), (84, 89, 201), (105, 106, 203), + (114, 114, 223), (178, 149, 221), (193, 157, 211), (211, 172, 164), + (248, 158, 11), (254, 165, 3), (252, 172, 8), (234, 191, 176), + (219, 196, 207), (212, 193, 216), (207, 192, 219), (205, 177, 227), + (203, 179, 227), (197, 183, 238), (196, 189, 244), (194, 184, 244), + (200, 187, 245), (205, 199, 251), (213, 215, 251), (217, 214, 254), + (236, 233, 250), (247, 232, 253), (251, 238, 253), (251, 242, 251), + (252, 243, 251), (251, 240, 252), (243, 231, 251), (233, 219, 231), + (235, 212, 214), (213, 182, 218), (204, 164, 169), (161, 110, 98), + (115, 59, 43), (119, 40, 3), (124, 31, 5), (132, 39, 8), + (174, 73, 7), (223, 128, 5), (243, 157, 10), (232, 179, 167), + (224, 196, 210), (239, 205, 211), (241, 221, 218), (234, 223, 238), + (236, 225, 248), (230, 217, 247), (229, 206, 234), (219, 205, 219), + (214, 196, 210), (215, 184, 163), (246, 158, 7), (249, 165, 3), + (245, 160, 4), (241, 146, 3), (233, 137, 2), (220, 122, 7), + (161, 88, 51), (153, 127, 130), (172, 145, 194), (191, 160, 214), + (192, 164, 225), (192, 162, 230), (185, 159, 232), (177, 156, 226), + (144, 147, 223), (98, 131, 220), (81, 124, 214), (64, 115, 203), + (61, 117, 181), (62, 111, 175), (69, 106, 162), (66, 106, 148), + (49, 100, 154), (25, 87, 150), (30, 80, 145), (13, 66, 130), + (17, 70, 121), (32, 80, 103), (68, 82, 99), (88, 34, 11), + (105, 17, 6), (106, 19, 3), (119, 56, 31), (114, 76, 83), + (118, 101, 167), (161, 150, 217), (176, 172, 233), (179, 177, 233), + (176, 183, 242), (171, 177, 238), (168, 181, 241), (177, 185, 242), + (178, 188, 241), (178, 190, 247), (189, 196, 252), (194, 208, 250), + (203, 203, 243), (197, 198, 244), (196, 195, 243), (192, 196, 244), + (196, 193, 238), (192, 187, 239), (183, 191, 240), (182, 190, 244), + (188, 191, 224), (185, 179, 224), (185, 171, 210), (171, 144, 177), + (175, 129, 92), (225, 138, 1), (234, 140, 1), (240, 146, 4), + (245, 151, 6), (219, 168, 138), (193, 157, 206), (173, 157, 219), + (108, 123, 203), (83, 122, 207), (70, 127, 189), (64, 116, 180), + (61, 113, 168), (56, 97, 158), (30, 89, 142), (35, 90, 128), + (30, 89, 125), (22, 77, 120), (18, 68, 110), (20, 55, 88), + (93, 8, 6), (100, 9, 3), (118, 14, 1), (136, 41, 6), + (217, 113, 3), (227, 137, 1), (223, 132, 3), (165, 99, 20), + (144, 55, 30), (127, 32, 6), (116, 26, 6), (112, 46, 44), + (111, 71, 98), (92, 93, 152), (107, 110, 176), (102, 115, 200), + (110, 118, 213), (146, 142, 222), (173, 163, 224), (182, 175, 229), + (184, 179, 233), (184, 177, 236), (182, 172, 239), (178, 170, 239), + (174, 173, 237), (170, 160, 225), (108, 120, 218), (98, 125, 210), + (84, 119, 218), (81, 121, 217), (71, 123, 218), (72, 115, 212), + (79, 114, 208), (87, 116, 206), (87, 106, 203), (85, 100, 202), + (74, 92, 198), (57, 90, 209), (55, 95, 206), (61, 88, 195), + (61, 79, 186), (51, 83, 194), (33, 80, 195), (32, 87, 198), + (32, 90, 201), (51, 104, 211), (58, 102, 206), (61, 106, 181), + (62, 110, 178), (72, 115, 165), (73, 110, 160), (75, 95, 155), + (75, 96, 145), (68, 91, 149), (39, 96, 148), (31, 81, 143), + (29, 82, 137), (23, 79, 121), (25, 64, 120), (17, 60, 100) +), + +// 81 picasso.jfille-chevre.ppm +( + (24, 0, 0), (84, 2, 2), (184, 46, 0), (195, 61, 5), + (198, 61, 2), (203, 76, 3), (207, 80, 3), (211, 85, 3), + (209, 84, 2), (208, 79, 3), (204, 73, 0), (203, 61, 1), + (201, 59, 4), (199, 62, 3), (202, 76, 3), (205, 77, 7), + (207, 85, 7), (203, 93, 14), (194, 90, 28), (203, 102, 46), + (204, 100, 40), (183, 97, 38), (185, 96, 28), (151, 102, 51), + (196, 102, 41), (206, 119, 51), (225, 142, 78), (222, 148, 77), + (228, 148, 76), (220, 140, 77), (199, 136, 70), (208, 114, 43), + (209, 108, 37), (199, 124, 31), (206, 127, 29), (207, 130, 30), + (205, 135, 30), (208, 137, 32), (214, 146, 36), (218, 154, 55), + (222, 162, 83), (225, 184, 99), (228, 197, 128), (232, 202, 150), + (227, 202, 163), (237, 208, 172), (239, 211, 172), (241, 214, 173), + (246, 218, 175), (248, 219, 178), (249, 220, 178), (247, 223, 185), + (252, 226, 180), (252, 224, 187), (250, 226, 191), (249, 225, 189), + (247, 224, 191), (249, 226, 195), (248, 225, 192), (247, 227, 192), + (247, 224, 193), (245, 222, 193), (244, 220, 186), (243, 221, 184), + (245, 220, 182), (245, 216, 184), (244, 215, 183), (242, 216, 180), + (239, 215, 179), (238, 213, 175), (237, 214, 172), (238, 211, 162), + (236, 206, 152), (236, 204, 140), (232, 199, 128), (229, 179, 113), + (229, 167, 97), (225, 163, 93), (223, 155, 82), (210, 147, 85), + (196, 126, 70), (208, 104, 48), (215, 101, 49), (211, 111, 32), + (205, 125, 18), (214, 133, 14), (214, 142, 15), (215, 153, 44), + (219, 168, 76), (228, 184, 90), (231, 188, 99), (233, 194, 118), + (241, 203, 124), (235, 202, 135), (236, 201, 133), (237, 186, 120), + (237, 176, 107), (231, 171, 102), (231, 168, 94), (227, 167, 101), + (225, 168, 119), (212, 164, 105), (232, 178, 119), (244, 194, 131), + (241, 206, 140), (238, 208, 150), (238, 210, 161), (233, 208, 170), + (233, 211, 169), (237, 215, 173), (241, 217, 177), (243, 217, 181), + (246, 218, 179), (247, 221, 173), (251, 223, 174), (247, 220, 172), + (247, 220, 169), (243, 216, 161), (245, 209, 144), (242, 201, 137), + (241, 201, 116), (232, 187, 99), (227, 160, 80), (225, 145, 73), + (217, 122, 51), (213, 122, 33), (204, 129, 21), (200, 127, 20), + (197, 121, 11), (196, 117, 7), (193, 109, 0), (195, 120, 8), + (197, 132, 18), (209, 137, 27), (218, 145, 31), (220, 163, 56), + (230, 186, 95), (232, 193, 105), (233, 200, 129), (237, 207, 141), + (245, 211, 150), (242, 215, 158), (242, 213, 164), (236, 212, 171), + (235, 211, 172), (234, 212, 176), (236, 214, 177), (238, 213, 183), + (238, 214, 179), (227, 207, 181), (240, 215, 182), (242, 219, 182), + (241, 221, 182), (243, 221, 183), (244, 220, 183), (242, 218, 183), + (240, 216, 190), (242, 218, 191), (246, 219, 195), (245, 224, 198), + (243, 226, 199), (246, 228, 205), (246, 226, 202), (250, 230, 205), + (250, 229, 206), (248, 231, 205), (250, 228, 197), (248, 230, 194), + (248, 228, 196), (246, 227, 195), (244, 224, 196), (239, 223, 197), + (236, 214, 193), (237, 218, 188), (240, 217, 186), (239, 215, 181), + (241, 212, 173), (238, 211, 166), (237, 212, 155), (233, 206, 145), + (235, 201, 134), (220, 179, 120), (212, 170, 121), (206, 175, 108), + (211, 162, 117), (210, 156, 93), (223, 154, 89), (224, 158, 81), + (228, 163, 81), (234, 167, 90), (237, 176, 104), (240, 193, 127), + (237, 204, 141), (237, 206, 152), (237, 208, 159), (238, 212, 165), + (241, 218, 170), (240, 215, 171), (244, 216, 170), (246, 215, 160), + (242, 213, 169), (245, 210, 160), (249, 215, 154), (247, 212, 146), + (251, 213, 137), (245, 211, 137), (239, 207, 146), (235, 203, 151), + (224, 201, 154), (236, 202, 151), (237, 203, 154), (233, 206, 158), + (239, 210, 166), (238, 211, 169), (240, 211, 167), (242, 212, 168), + (239, 212, 164), (241, 211, 157), (236, 208, 150), (236, 205, 142), + (235, 202, 139), (231, 192, 122), (227, 189, 102), (226, 168, 88), + (224, 159, 72), (211, 144, 40), (201, 136, 33), (204, 132, 21), + (205, 133, 16), (208, 132, 14), (205, 131, 10), (204, 130, 9), + (202, 120, 8), (204, 124, 2), (195, 119, 6), (193, 117, 12), + (205, 109, 27), (213, 98, 30), (203, 89, 27), (207, 92, 29), + (212, 95, 23), (203, 90, 24), (201, 89, 25), (203, 90, 23), + (202, 90, 20), (204, 92, 16), (203, 85, 11), (189, 82, 5), + (196, 80, 15), (193, 78, 12), (189, 68, 5), (194, 78, 4), + (183, 70, 2), (182, 65, 9), (147, 49, 11), (42, 1, 3) +), + +// 82 pollock.lavender-mist.ppm +( + (3, 5, 2), (37, 33, 23), (65, 68, 36), (96, 95, 63), + (128, 112, 83), (152, 127, 86), (168, 141, 100), (181, 155, 104), + (183, 157, 111), (179, 157, 119), (175, 157, 121), (175, 159, 122), + (172, 157, 121), (168, 154, 114), (161, 149, 111), (154, 140, 106), + (150, 139, 107), (149, 135, 103), (144, 132, 102), (140, 130, 104), + (137, 128, 103), (140, 124, 102), (136, 126, 102), (133, 124, 97), + (135, 123, 94), (137, 123, 96), (140, 123, 94), (142, 126, 98), + (146, 125, 99), (150, 136, 101), (157, 145, 102), (164, 146, 107), + (172, 150, 121), (172, 156, 126), (180, 156, 123), (196, 164, 119), + (207, 171, 120), (208, 174, 128), (212, 181, 136), (210, 187, 137), + (209, 181, 131), (206, 168, 129), (203, 169, 127), (196, 171, 121), + (184, 166, 122), (177, 156, 117), (164, 146, 105), (156, 131, 93), + (136, 121, 89), (121, 112, 82), (105, 104, 75), (102, 102, 77), + (94, 90, 74), (71, 76, 62), (73, 77, 57), (94, 90, 65), + (108, 96, 66), (111, 98, 71), (110, 99, 81), (115, 111, 86), + (121, 114, 95), (123, 114, 94), (129, 117, 94), (130, 120, 90), + (130, 121, 90), (130, 119, 86), (130, 117, 81), (125, 103, 68), + (107, 88, 56), (96, 84, 53), (74, 62, 40), (55, 48, 36), + (41, 31, 29), (40, 34, 24), (37, 38, 25), (42, 39, 28), + (56, 49, 28), (59, 57, 36), (69, 73, 51), (94, 80, 63), + (99, 95, 79), (106, 99, 80), (118, 111, 85), (126, 113, 92), + (133, 123, 95), (132, 128, 95), (137, 132, 95), (140, 133, 103), + (141, 132, 104), (142, 135, 106), (144, 135, 109), (148, 139, 112), + (148, 142, 113), (151, 146, 118), (151, 144, 121), (156, 145, 124), + (152, 151, 130), (147, 156, 130), (150, 159, 134), (158, 157, 132), + (162, 158, 136), (164, 160, 137), (173, 165, 143), (179, 171, 154), + (189, 179, 155), (194, 187, 161), (192, 186, 164), (188, 186, 158), + (188, 180, 149), (185, 177, 146), (179, 167, 139), (170, 164, 132), + (167, 157, 129), (162, 155, 126), (155, 149, 120), (158, 142, 119), + (156, 142, 115), (157, 147, 114), (159, 148, 115), (164, 152, 115), + (167, 153, 123), (169, 155, 129), (173, 160, 131), (176, 163, 130), + (185, 172, 135), (191, 181, 142), (197, 185, 149), (198, 188, 159), + (202, 187, 160), (207, 190, 156), (212, 196, 152), (212, 194, 155), + (207, 193, 164), (209, 196, 165), (213, 197, 165), (218, 194, 160), + (215, 189, 152), (207, 185, 152), (200, 179, 150), (197, 177, 145), + (188, 170, 137), (174, 160, 131), (169, 157, 127), (166, 162, 119), + (155, 153, 116), (147, 145, 108), (145, 138, 114), (139, 134, 114), + (138, 132, 115), (129, 133, 113), (129, 128, 109), (127, 130, 102), + (119, 118, 93), (119, 112, 87), (114, 101, 77), (114, 102, 72), + (117, 106, 74), (117, 111, 77), (123, 116, 87), (120, 115, 91), + (126, 121, 92), (134, 128, 92), (145, 128, 90), (149, 138, 97), + (154, 140, 104), (162, 138, 103), (163, 137, 102), (167, 143, 108), + (167, 144, 111), (172, 149, 118), (175, 157, 121), (177, 163, 122), + (180, 166, 119), (186, 167, 128), (191, 174, 130), (200, 173, 131), + (201, 173, 132), (192, 176, 136), (188, 174, 141), (189, 177, 143), + (191, 172, 136), (185, 166, 128), (181, 161, 126), (187, 157, 122), + (194, 149, 113), (182, 140, 94), (166, 118, 76), (131, 100, 61), + (101, 81, 56), (74, 70, 52), (71, 56, 38), (66, 55, 35), + (58, 49, 32), (69, 63, 49), (77, 73, 56), (94, 84, 71), + (98, 97, 80), (103, 103, 88), (101, 117, 98), (109, 143, 125), + (138, 142, 122), (138, 142, 121), (145, 143, 123), (155, 152, 128), + (161, 158, 133), (172, 159, 137), (184, 169, 143), (197, 178, 149), + (201, 187, 146), (206, 188, 152), (215, 189, 147), (213, 188, 135), + (222, 181, 123), (213, 181, 124), (203, 163, 112), (192, 153, 110), + (185, 145, 99), (177, 142, 106), (168, 142, 105), (162, 142, 105), + (154, 139, 106), (151, 135, 109), (149, 136, 110), (150, 137, 114), + (151, 143, 120), (158, 146, 122), (167, 155, 130), (181, 168, 134), + (194, 182, 143), (208, 186, 143), (210, 200, 145), (224, 198, 145), + (225, 196, 150), (229, 205, 161), (243, 223, 174), (245, 222, 183), + (232, 211, 177), (225, 208, 171), (224, 219, 189), (224, 217, 200), + (222, 205, 186), (207, 203, 169), (203, 196, 156), (196, 186, 157), + (189, 178, 149), (175, 164, 133), (163, 157, 129), (151, 151, 120), + (141, 141, 112), (132, 129, 104), (121, 128, 106), (100, 110, 94), + (84, 88, 75), (73, 69, 60), (50, 56, 42), (18, 19, 13) +), + +// 83 yngpaint.ppm +( + (20, 15, 10), (52, 47, 45), (20, 105, 104), (63, 130, 123), + (91, 144, 114), (104, 140, 123), (126, 141, 130), (137, 151, 131), + (160, 157, 128), (170, 165, 126), (182, 173, 128), (188, 186, 129), + (190, 192, 144), (200, 204, 157), (204, 205, 163), (211, 209, 166), + (212, 213, 167), (216, 218, 171), (219, 220, 174), (221, 223, 173), + (222, 224, 176), (222, 224, 177), (224, 224, 174), (222, 222, 171), + (221, 221, 167), (220, 220, 164), (219, 220, 160), (217, 219, 154), + (215, 218, 153), (212, 211, 148), (202, 203, 153), (194, 194, 152), + (185, 182, 141), (171, 167, 129), (165, 167, 121), (166, 153, 113), + (162, 134, 98), (158, 140, 102), (171, 158, 105), (172, 163, 116), + (165, 163, 117), (175, 171, 107), (179, 169, 111), (187, 166, 130), + (192, 187, 131), (197, 193, 140), (202, 201, 155), (205, 207, 158), + (210, 214, 155), (211, 223, 162), (220, 222, 163), (226, 224, 166), + (225, 222, 171), (224, 224, 172), (224, 224, 174), (224, 226, 176), + (225, 226, 182), (225, 231, 185), (225, 227, 177), (227, 227, 175), + (228, 227, 180), (229, 231, 184), (228, 234, 188), (226, 232, 188), + (228, 234, 190), (229, 231, 192), (228, 233, 191), (227, 232, 192), + (229, 234, 194), (228, 233, 196), (229, 233, 200), (231, 235, 202), + (233, 242, 214), (244, 247, 219), (236, 241, 210), (238, 235, 204), + (234, 238, 201), (229, 236, 201), (229, 234, 202), (231, 236, 199), + (234, 234, 196), (233, 231, 191), (233, 231, 190), (229, 230, 188), + (229, 229, 188), (220, 224, 189), (218, 222, 189), (219, 223, 190), + (220, 224, 188), (220, 224, 187), (222, 230, 183), (224, 225, 181), + (220, 226, 180), (220, 226, 178), (219, 226, 178), (217, 226, 174), + (218, 226, 172), (220, 222, 172), (221, 221, 171), (223, 221, 169), + (224, 221, 168), (224, 219, 169), (222, 218, 170), (217, 219, 169), + (216, 219, 165), (216, 216, 162), (213, 213, 161), (205, 208, 157), + (201, 199, 146), (184, 184, 129), (165, 164, 109), (152, 146, 97), + (143, 145, 89), (137, 143, 95), (145, 149, 111), (126, 130, 101), + (107, 137, 86), (89, 115, 101), (116, 115, 83), (117, 115, 97), + (122, 131, 115), (115, 122, 105), (108, 124, 125), (133, 143, 104), + (139, 144, 116), (142, 154, 120), (166, 172, 118), (182, 187, 121), + (195, 198, 119), (206, 208, 146), (212, 210, 145), (212, 219, 154), + (214, 218, 157), (215, 217, 157), (216, 217, 157), (216, 217, 159), + (215, 213, 159), (212, 212, 162), (205, 206, 162), (203, 199, 162), + (200, 200, 157), (184, 185, 144), (173, 166, 139), (141, 155, 133), + (114, 148, 132), (99, 147, 140), (90, 142, 146), (110, 149, 142), + (125, 157, 145), (129, 146, 147), (164, 165, 137), (183, 186, 140), + (200, 202, 161), (203, 203, 170), (204, 210, 173), (205, 208, 177), + (211, 210, 180), (212, 215, 184), (212, 214, 190), (217, 217, 189), + (219, 218, 187), (217, 221, 189), (221, 220, 190), (221, 221, 195), + (219, 222, 191), (221, 225, 192), (218, 221, 195), (218, 222, 198), + (218, 222, 197), (215, 226, 194), (218, 224, 190), (218, 223, 183), + (218, 224, 180), (218, 224, 177), (217, 224, 180), (216, 221, 181), + (216, 220, 183), (213, 218, 183), (213, 216, 185), (213, 216, 184), + (214, 213, 183), (213, 210, 180), (209, 213, 175), (213, 215, 168), + (216, 215, 168), (216, 216, 166), (215, 212, 165), (214, 212, 163), + (214, 214, 160), (217, 217, 163), (217, 217, 167), (216, 218, 170), + (218, 220, 173), (221, 220, 174), (222, 221, 175), (221, 222, 179), + (217, 224, 180), (217, 221, 187), (214, 220, 186), (216, 219, 188), + (216, 219, 188), (218, 218, 190), (220, 218, 192), (214, 218, 190), + (216, 219, 188), (215, 218, 187), (217, 216, 185), (216, 215, 184), + (216, 215, 184), (217, 214, 184), (216, 216, 184), (217, 217, 183), + (220, 221, 182), (219, 219, 184), (220, 220, 184), (217, 222, 183), + (217, 223, 179), (215, 221, 176), (213, 219, 175), (215, 221, 173), + (215, 222, 171), (213, 222, 169), (215, 222, 173), (216, 222, 173), + (219, 221, 174), (216, 222, 174), (215, 221, 175), (215, 222, 178), + (215, 220, 180), (219, 219, 181), (217, 216, 183), (215, 214, 183), + (211, 214, 181), (206, 213, 173), (201, 207, 161), (202, 205, 148), + (187, 186, 124), (181, 172, 107), (166, 158, 86), (166, 138, 81), + (162, 142, 87), (150, 140, 75), (136, 133, 68), (132, 123, 66), + (122, 117, 45), (119, 92, 9), (133, 113, 56), (102, 96, 52), + (99, 55, 50), (116, 108, 66), (74, 61, 7), (75, 50, 24), + (55, 41, 51), (46, 43, 20), (84, 9, 8), (32, 3, 5) +), + +// 84 cl-gold-orange-green from classlady1.ugr +((0, 64, 0), (44, 64, 0), (66, 64, 0), (88, 64, 0), + (111, 73, 0), (135, 82, 0), (138, 91, 0), (142, 100, 0), + (157, 137, 0), (163, 153, 0), (170, 170, 0), (184, 184, 3), + (199, 199, 6), (213, 213, 9), (228, 228, 12), (235, 235, 13), + (243, 243, 15), (233, 211, 14), (211, 167, 11), (190, 124, 8), + (168, 80, 5), (146, 36, 2), (137, 18, 1), (128, 0, 0), + (172, 88, 44), (193, 131, 66), (215, 175, 88), (235, 215, 108), + (255, 255, 128), (244, 244, 117), (233, 233, 106), (211, 211, 84), + (190, 190, 62), (128, 128, 0), (138, 138, 0), (148, 148, 0), + (157, 157, 0), (167, 167, 0), (172, 172, 0), (177, 177, 0), + (153, 164, 0), (121, 143, 0), (90, 123, 0), (58, 102, 0), + (26, 81, 0), (13, 72, 0), (0, 64, 0), (44, 97, 24), + (88, 130, 47), (175, 195, 95), (215, 225, 116), (255, 255, 138), + (233, 222, 114), (211, 189, 91), (200, 173, 79), (190, 157, 67), + (146, 91, 19), (134, 80, 9), (123, 70, 0), (118, 76, 0), + (114, 83, 0), (111, 86, 0), (109, 89, 0), (104, 95, 0), + (100, 100, 0), (129, 129, 0), (143, 143, 0), (157, 157, 0), + (170, 170, 0), (183, 183, 0), (183, 183, 0), (183, 183, 0), + (183, 183, 0), (183, 183, 0), (183, 183, 0), (173, 162, 0), + (164, 142, 0), (159, 132, 0), (155, 122, 0), (145, 101, 0), + (136, 81, 0), (150, 97, 24), (171, 129, 47), (193, 162, 71), + (204, 178, 83), (215, 195, 95), (237, 228, 119), (255, 255, 138), + (211, 211, 91), (189, 189, 67), (168, 168, 43), (157, 157, 31), + (146, 146, 19), (128, 128, 0), (150, 150, 22), (172, 172, 44), + (193, 193, 66), (255, 255, 128), (255, 244, 128), (255, 233, 128), + (255, 228, 128), (255, 223, 129), (255, 212, 129), (255, 201, 129), + (255, 203, 108), (255, 213, 85), (255, 224, 63), (255, 229, 52), + (255, 235, 41), (255, 246, 18), (255, 255, 0), (233, 211, 0), + (211, 167, 0), (168, 80, 0), (157, 58, 0), (146, 36, 0), + (128, 0, 0), (106, 11, 0), (84, 22, 0), (62, 33, 0), + (18, 55, 0), (31, 76, 11), (44, 97, 22), (66, 113, 33), + (88, 130, 44), (131, 162, 66), (175, 195, 88), (255, 255, 128), + (233, 222, 106), (190, 157, 62), (179, 140, 51), (168, 124, 40), + (146, 91, 18), (128, 64, 0), (128, 64, 0), (128, 64, 0), + (128, 64, 0), (128, 64, 0), (128, 64, 0), (139, 76, 14), + (150, 89, 28), (172, 114, 56), (193, 139, 85), (215, 164, 113), + (237, 189, 141), (228, 190, 136), (214, 180, 122), (201, 171, 108), + (174, 152, 79), (147, 133, 51), (120, 114, 23), (98, 98, 0), + (152, 152, 38), (165, 165, 47), (179, 179, 57), (206, 206, 76), + (233, 233, 95), (255, 255, 111), (255, 255, 111), (255, 255, 111), + (255, 255, 111), (255, 255, 111), (244, 238, 101), (233, 222, 92), + (211, 189, 73), (190, 157, 54), (168, 124, 35), (146, 91, 16), + (144, 91, 0), (152, 105, 0), (161, 119, 0), (177, 146, 0), + (193, 173, 0), (210, 201, 0), (223, 223, 0), (207, 185, 0), + (190, 146, 0), (174, 108, 0), (158, 70, 0), (141, 31, 0), + (128, 0, 0), (144, 38, 0), (161, 77, 0), (177, 115, 0), + (210, 192, 0), (216, 207, 0), (223, 223, 0), (207, 207, 0), + (190, 190, 0), (174, 174, 0), (158, 158, 0), (128, 128, 0), + (150, 150, 0), (172, 172, 0), (193, 193, 0), (215, 215, 0), + (237, 237, 0), (255, 255, 0), (244, 244, 0), (234, 234, 0), + (223, 223, 0), (212, 212, 0), (202, 202, 0), (193, 193, 0), + (176, 168, 0), (159, 143, 0), (142, 118, 0), (125, 93, 0), + (108, 68, 0), (94, 47, 0), (122, 83, 22), (149, 118, 44), + (177, 154, 66), (205, 190, 88), (232, 226, 110), (255, 255, 128), + (242, 242, 113), (230, 228, 98), (217, 215, 83), (204, 201, 68), + (191, 188, 52), (181, 177, 40), (181, 177, 40), (181, 177, 40), + (181, 177, 40), (181, 177, 40), (181, 177, 40), (150, 158, 33), + (119, 138, 26), (88, 119, 19), (57, 99, 12), (25, 80, 6), + (0, 64, 0), (38, 91, 0), (77, 119, 0), (115, 146, 0), + (153, 173, 0), (192, 201, 0), (223, 223, 0), (207, 196, 0), + (190, 168, 0), (174, 141, 0), (158, 114, 0), (141, 86, 0), + (128, 64, 0), (128, 64, 0), (128, 64, 0), (128, 64, 0), + (128, 64, 0), (128, 64, 0), (128, 64, 0), (144, 91, 0), + (160, 118, 0), (176, 145, 0), (192, 172, 0), (221, 221, 0) + ), + +// 85 cl-gold-rose +((0, 0, 0), (252, 192, 0), (250, 190, 2), (248, 188, 4), + (248, 186, 4), (248, 184, 4), (248, 184, 4), (248, 184, 4), + (244, 180, 4), (244, 178, 6), (244, 176, 8), (242, 174, 8), + (240, 172, 8), (240, 170, 8), (240, 168, 8), (238, 168, 10), + (236, 168, 12), (236, 164, 12), (234, 162, 12), (232, 160, 12), + (232, 158, 14), (232, 156, 16), (232, 156, 16), (232, 156, 16), + (228, 152, 16), (228, 150, 16), (228, 148, 16), (226, 148, 18), + (224, 148, 20), (224, 146, 20), (224, 144, 20), (224, 144, 20), + (220, 140, 20), (220, 140, 24), (218, 138, 24), (216, 136, 24), + (216, 134, 24), (216, 132, 24), (216, 132, 24), (216, 132, 24), + (212, 128, 28), (212, 126, 28), (212, 124, 28), (210, 122, 28), + (208, 120, 28), (208, 120, 30), (208, 120, 32), (208, 116, 32), + (204, 116, 32), (204, 112, 32), (202, 110, 34), (200, 108, 36), + (200, 106, 36), (200, 104, 36), (200, 104, 36), (200, 104, 36), + (196, 100, 36), (196, 98, 38), (196, 96, 40), (194, 96, 40), + (192, 96, 40), (192, 94, 40), (192, 92, 40), (192, 92, 44), + (192, 88, 44), (188, 88, 44), (188, 86, 44), (188, 84, 44), + (186, 82, 46), (184, 80, 48), (184, 80, 48), (184, 80, 48), + (180, 76, 48), (180, 74, 50), (180, 72, 52), (178, 70, 52), + (176, 68, 52), (176, 68, 52), (176, 68, 52), (176, 64, 52), + (176, 64, 52), (172, 60, 56), (172, 58, 56), (172, 56, 56), + (170, 56, 56), (168, 56, 56), (168, 52, 56), (168, 52, 60), + (164, 48, 60), (164, 46, 60), (164, 44, 60), (164, 44, 60), + (164, 44, 60), (160, 44, 64), (160, 40, 64), (160, 40, 64), + (160, 36, 64), (156, 36, 64), (156, 34, 66), (156, 32, 68), + (154, 30, 68), (152, 28, 68), (152, 28, 68), (152, 28, 68), + (148, 24, 72), (148, 22, 72), (148, 20, 72), (148, 18, 72), + (148, 16, 72), (144, 16, 72), (144, 16, 72), (144, 12, 76), + (144, 12, 76), (140, 8, 76), (140, 8, 76), (140, 8, 76), + (140, 4, 76), (136, 4, 80), (136, 0, 80), (136, 0, 80), + (136, 0, 80), (134, 0, 80), (132, 0, 80), (132, 0, 80), + (132, 0, 80), (132, 0, 80), (128, 0, 80), (128, 0, 76), + (128, 0, 76), (124, 0, 76), (124, 0, 76), (124, 0, 76), + (124, 0, 76), (124, 0, 72), (120, 0, 72), (120, 0, 72), + (120, 0, 72), (118, 0, 72), (116, 0, 72), (116, 0, 70), + (116, 0, 68), (116, 0, 68), (112, 0, 68), (112, 0, 68), + (112, 0, 68), (108, 0, 68), (108, 0, 66), (108, 0, 64), + (108, 0, 64), (108, 0, 64), (104, 0, 64), (104, 0, 64), + (104, 0, 60), (102, 0, 60), (100, 0, 60), (100, 0, 60), + (100, 0, 60), (100, 0, 60), (96, 0, 60), (96, 0, 60), + (96, 0, 56), (92, 0, 56), (92, 0, 56), (92, 0, 56), + (92, 0, 56), (92, 0, 56), (88, 0, 52), (88, 0, 52), + (88, 0, 52), (86, 0, 52), (84, 0, 52), (84, 0, 52), + (84, 0, 52), (84, 0, 48), (80, 0, 48), (80, 0, 48), + (80, 0, 48), (80, 0, 48), (76, 0, 48), (76, 0, 48), + (76, 0, 44), (76, 0, 44), (72, 0, 44), (72, 0, 44), + (72, 0, 44), (70, 0, 42), (68, 0, 40), (68, 0, 40), + (68, 0, 40), (68, 0, 40), (64, 0, 40), (64, 0, 40), + (64, 0, 40), (64, 0, 36), (60, 0, 36), (60, 0, 36), + (60, 0, 36), (60, 0, 36), (56, 0, 36), (56, 0, 32), + (56, 0, 32), (56, 0, 32), (52, 0, 32), (52, 0, 32), + (52, 0, 32), (52, 0, 32), (48, 0, 28), (48, 0, 28), + (48, 0, 28), (48, 0, 28), (44, 0, 28), (44, 0, 28), + (44, 0, 28), (44, 0, 24), (40, 0, 24), (40, 0, 24), + (40, 0, 24), (40, 0, 24), (36, 0, 24), (36, 0, 20), + (36, 0, 20), (36, 0, 20), (32, 0, 20), (32, 0, 20), + (32, 0, 20), (32, 0, 20), (28, 0, 16), (28, 0, 16), + (28, 0, 16), (28, 0, 16), (24, 0, 16), (24, 0, 16), + (24, 0, 12), (24, 0, 12), (20, 0, 12), (20, 0, 12), + (20, 0, 12), (20, 0, 12), (16, 0, 12), (16, 0, 8), + (16, 0, 8), (16, 0, 8), (12, 0, 8), (12, 0, 8), + (12, 0, 8), (12, 0, 8), (8, 0, 4), (8, 0, 4), + (8, 0, 4), (8, 0, 4), (4, 0, 4), (4, 0, 4), + (4, 0, 0), (4, 0, 0), (0, 0, 0), (0, 0, 0) + ), + +// 86 cl-lavender-purple-blues-black +((103, 105, 102), (75, 29, 127), (55, 26, 99), (35, 23, 71), + (25, 20, 52), (15, 18, 33), (12, 18, 31), (10, 18, 29), + (29, 41, 31), (41, 54, 44), (54, 67, 57), (81, 71, 66), + (109, 75, 76), (106, 93, 87), (104, 112, 99), (99, 103, 90), + (94, 94, 82), (84, 83, 91), (70, 70, 120), (56, 57, 149), + (54, 55, 146), (53, 53, 143), (52, 52, 142), (52, 52, 142), + (52, 41, 133), (69, 31, 129), (87, 22, 126), (89, 22, 127), + (91, 22, 128), (87, 21, 126), (84, 21, 125), (83, 18, 122), + (80, 18, 119), (76, 44, 81), (54, 44, 61), (32, 44, 42), + (30, 43, 33), (28, 43, 24), (30, 44, 30), (33, 46, 37), + (71, 66, 70), (84, 81, 81), (98, 97, 92), (111, 72, 120), + (125, 47, 148), (127, 44, 147), (129, 42, 147), (125, 39, 146), + (123, 40, 146), (58, 49, 142), (51, 47, 140), (45, 46, 138), + (45, 45, 137), (45, 44, 137), (44, 43, 136), (44, 43, 136), + (47, 46, 139), (47, 46, 139), (48, 47, 140), (51, 44, 136), + (54, 41, 133), (54, 39, 131), (55, 38, 130), (62, 27, 119), + (75, 19, 118), (93, 24, 131), (90, 23, 128), (87, 22, 126), + (81, 21, 122), (75, 21, 119), (45, 29, 78), (38, 25, 69), + (33, 25, 62), (26, 23, 48), (20, 22, 34), (17, 20, 33), + (15, 18, 33), (15, 18, 32), (15, 19, 31), (11, 18, 26), + (8, 17, 22), (4, 11, 17), (3, 11, 18), (3, 12, 19), + (5, 14, 20), (7, 16, 21), (7, 17, 19), (8, 18, 20), + (9, 18, 23), (9, 17, 24), (10, 17, 25), (11, 18, 25), + (12, 19, 25), (10, 19, 26), (10, 19, 28), (9, 18, 27), + (9, 18, 25), (9, 18, 23), (10, 19, 25), (11, 20, 27), + (13, 21, 28), (16, 23, 29), (22, 32, 31), (35, 48, 38), + (58, 66, 51), (64, 71, 59), (71, 77, 67), (72, 78, 66), + (73, 79, 65), (70, 91, 60), (62, 81, 61), (61, 76, 53), + (68, 74, 60), (65, 66, 68), (56, 65, 61), (48, 64, 54), + (33, 51, 39), (29, 43, 30), (23, 36, 29), (22, 30, 33), + (21, 34, 25), (22, 36, 29), (23, 38, 33), (25, 36, 37), + (28, 35, 41), (33, 23, 58), (33, 25, 64), (46, 39, 55), + (56, 57, 49), (49, 72, 52), (50, 73, 50), (51, 74, 48), + (56, 76, 51), (56, 80, 54), (53, 77, 53), (55, 68, 59), + (74, 71, 80), (64, 63, 107), (54, 55, 135), (55, 54, 140), + (57, 54, 145), (59, 60, 150), (81, 62, 152), (90, 65, 156), + (96, 66, 156), (86, 57, 149), (77, 52, 144), (68, 47, 140), + (85, 22, 126), (80, 18, 119), (79, 19, 119), (59, 37, 86), + (50, 60, 49), (47, 59, 47), (44, 58, 45), (36, 47, 43), + (35, 50, 43), (42, 60, 44), (45, 64, 42), (56, 71, 50), + (71, 78, 60), (80, 80, 90), (76, 63, 114), (73, 46, 139), + (80, 54, 145), (80, 57, 148), (58, 63, 154), (57, 62, 153), + (70, 60, 149), (76, 61, 149), (83, 63, 150), (100, 105, 99), + (126, 102, 98), (144, 100, 97), (145, 114, 94), (143, 105, 102), + (139, 103, 103), (130, 43, 147), (128, 43, 147), (114, 52, 135), + (79, 70, 91), (69, 65, 82), (65, 55, 80), (50, 34, 79), + (29, 22, 73), (41, 25, 96), (54, 28, 119), (55, 38, 132), + (50, 45, 135), (46, 37, 130), (55, 32, 123), (57, 45, 81), + (46, 42, 69), (41, 42, 46), (21, 34, 25), (18, 29, 23), + (13, 23, 22), (14, 21, 27), (9, 19, 21), (11, 16, 22), + (11, 16, 22), (9, 18, 23), (8, 17, 26), (10, 19, 26), + (12, 19, 27), (15, 20, 26), (17, 25, 28), (25, 36, 32), + (36, 47, 39), (51, 69, 47), (62, 82, 57), (73, 80, 73), + (74, 78, 77), (87, 87, 85), (81, 77, 91), (86, 34, 134), + (86, 49, 144), (82, 57, 148), (85, 65, 152), (84, 65, 154), + (77, 56, 147), (56, 49, 142), (54, 45, 138), (51, 40, 134), + (76, 22, 120), (86, 21, 123), (92, 23, 129), (98, 27, 133), + (99, 49, 144), (107, 73, 157), (86, 74, 160), (85, 76, 159), + (77, 71, 157), (65, 65, 153), (55, 59, 150), (57, 57, 147), + (77, 56, 147), (82, 62, 151), (92, 55, 148), (116, 48, 147), + (123, 45, 147), (110, 65, 150), (117, 83, 160), (100, 92, 167), + (105, 104, 174), (106, 111, 179), (100, 104, 177), (97, 90, 167), + (85, 86, 166), (75, 75, 161), (65, 74, 151), (83, 91, 93), + (83, 94, 80), (75, 85, 77), (65, 90, 61), (74, 89, 66) + ), + +// 87 cl-yellow_mixed-brown-gold +((193, 128, 100), (245, 177, 128), (248, 183, 128), (251, 189, 128), + (253, 209, 137), (255, 230, 146), (255, 232, 144), (255, 235, 142), + (252, 255, 170), (251, 255, 185), (251, 255, 200), (253, 255, 225), + (255, 255, 250), (255, 255, 252), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 223), (255, 255, 196), (255, 255, 170), + (251, 253, 162), (248, 252, 155), (247, 251, 148), (247, 251, 141), + (255, 243, 89), (255, 217, 74), (255, 192, 60), (240, 167, 85), + (225, 142, 110), (223, 143, 114), (221, 144, 118), (225, 160, 130), + (232, 166, 134), (241, 177, 131), (240, 176, 137), (240, 175, 143), + (231, 168, 140), (223, 161, 138), (214, 154, 134), (206, 147, 131), + (139, 112, 129), (130, 104, 123), (122, 97, 118), (118, 99, 119), + (115, 102, 120), (113, 103, 121), (111, 104, 122), (95, 96, 126), + (90, 93, 126), (73, 87, 124), (41, 62, 97), (9, 38, 70), + (21, 26, 42), (34, 14, 15), (46, 21, 20), (58, 29, 25), + (132, 66, 44), (144, 78, 54), (157, 90, 64), (176, 104, 75), + (195, 119, 87), (192, 120, 92), (189, 121, 98), (153, 118, 125), + (136, 109, 126), (98, 94, 127), (85, 90, 126), (72, 86, 125), + (41, 70, 112), (10, 54, 99), (12, 34, 57), (63, 29, 27), + (140, 79, 61), (160, 94, 73), (180, 110, 85), (192, 120, 94), + (204, 130, 103), (210, 134, 108), (216, 139, 113), (223, 145, 109), + (241, 156, 102), (249, 177, 95), (242, 160, 87), (236, 144, 79), + (225, 137, 84), (215, 130, 89), (213, 128, 89), (225, 142, 112), + (211, 138, 119), (189, 132, 121), (167, 126, 124), (160, 121, 125), + (153, 117, 127), (156, 120, 124), (176, 109, 83), (206, 117, 61), + (220, 161, 33), (255, 222, 65), (255, 235, 100), (255, 248, 136), + (255, 251, 139), (255, 255, 143), (251, 248, 143), (255, 230, 140), + (215, 153, 130), (182, 135, 129), (150, 117, 128), (139, 112, 125), + (128, 107, 122), (107, 101, 129), (94, 95, 126), (87, 90, 125), + (83, 89, 125), (71, 85, 124), (44, 68, 106), (17, 51, 89), + (17, 26, 35), (16, 7, 8), (13, 2, 8), (26, 7, 1), + (78, 47, 27), (104, 59, 35), (131, 71, 43), (144, 76, 47), + (157, 82, 51), (164, 89, 47), (171, 90, 45), (175, 99, 65), + (205, 119, 72), (200, 132, 109), (180, 126, 116), (161, 120, 124), + (144, 108, 120), (138, 88, 77), (123, 61, 46), (77, 39, 36), + (32, 11, 10), (37, 10, 8), (43, 9, 7), (49, 20, 20), + (56, 31, 34), (120, 71, 56), (128, 79, 65), (167, 130, 124), + (211, 149, 124), (254, 238, 142), (253, 246, 161), (253, 255, 180), + (255, 255, 232), (255, 254, 242), (251, 250, 245), (244, 247, 220), + (255, 236, 141), (251, 227, 125), (247, 219, 110), (241, 158, 104), + (214, 124, 72), (182, 99, 47), (172, 85, 32), (162, 74, 11), + (172, 81, 0), (98, 28, 0), (93, 30, 6), (88, 33, 12), + (73, 29, 18), (45, 35, 36), (38, 68, 104), (74, 86, 124), + (76, 89, 124), (77, 89, 124), (79, 89, 125), (79, 89, 124), + (76, 89, 124), (76, 89, 124), (79, 87, 124), (80, 88, 124), + (80, 88, 124), (79, 89, 125), (82, 90, 126), (84, 90, 124), + (85, 89, 126), (100, 97, 124), (111, 80, 60), (115, 104, 118), + (135, 116, 135), (143, 119, 136), (151, 123, 137), (179, 135, 132), + (222, 162, 136), (246, 185, 131), (250, 233, 103), (255, 239, 104), + (255, 255, 125), (255, 255, 144), (254, 255, 157), (255, 255, 169), + (255, 253, 162), (255, 255, 157), (255, 255, 142), (255, 255, 128), + (255, 255, 109), (255, 254, 108), (254, 251, 122), (254, 255, 133), + (255, 252, 140), (255, 253, 143), (255, 255, 152), (252, 255, 154), + (250, 254, 143), (255, 255, 129), (255, 250, 120), (254, 245, 118), + (255, 241, 100), (255, 240, 90), (243, 198, 53), (228, 201, 52), + (201, 131, 105), (165, 123, 125), (138, 113, 132), (131, 113, 129), + (127, 108, 127), (132, 109, 125), (134, 110, 126), (134, 110, 124), + (122, 103, 125), (118, 104, 127), (115, 101, 126), (113, 102, 119), + (109, 99, 126), (102, 103, 124), (109, 101, 124), (115, 103, 127), + (120, 104, 130), (128, 109, 128), (136, 115, 122), (151, 117, 131), + (165, 122, 129), (191, 132, 126), (201, 139, 128), (224, 145, 115), + (213, 139, 110), (201, 124, 96), (169, 105, 80), (160, 84, 52), + (133, 60, 27), (91, 40, 21), (91, 43, 29), (98, 71, 52), + (87, 90, 123), (89, 94, 126), (96, 106, 133), (115, 105, 130), + (135, 112, 130), (155, 122, 131), (240, 176, 138), (202, 146, 133) + ), + +// 88 cl-dark_reds-white-grays +((127, 40, 23), (48, 7, 15), (26, 4, 13), (5, 2, 11), + (2, 1, 11), (0, 0, 12), (0, 2, 12), (0, 5, 13), + (9, 8, 16), (42, 13, 14), (76, 19, 12), (87, 19, 7), + (98, 19, 2), (78, 18, 8), (58, 17, 15), (46, 15, 14), + (35, 14, 13), (52, 38, 35), (75, 29, 21), (99, 21, 8), + (99, 20, 5), (100, 19, 2), (99, 19, 1), (98, 20, 0), + (98, 21, 1), (99, 19, 0), (101, 18, 0), (101, 18, 0), + (101, 18, 0), (101, 18, 0), (101, 18, 0), (101, 18, 0), + (100, 19, 2), (100, 21, 4), (102, 23, 7), (105, 26, 11), + (100, 34, 29), (95, 43, 47), (89, 48, 50), (83, 53, 53), + (75, 66, 71), (74, 66, 72), (73, 66, 73), (71, 62, 70), + (69, 59, 68), (64, 58, 67), (59, 58, 66), (52, 50, 61), + (50, 50, 62), (46, 45, 53), (49, 48, 55), (52, 51, 57), + (62, 51, 55), (72, 52, 53), (79, 49, 49), (87, 47, 45), + (103, 25, 12), (101, 30, 27), (100, 35, 43), (82, 38, 47), + (65, 42, 52), (56, 43, 51), (47, 44, 51), (40, 41, 46), + (52, 45, 39), (96, 19, 9), (98, 20, 6), (100, 21, 4), + (100, 21, 4), (100, 21, 4), (91, 24, 7), (71, 28, 22), + (34, 34, 42), (45, 45, 52), (57, 56, 62), (68, 63, 67), + (79, 70, 73), (84, 72, 75), (90, 74, 77), (106, 81, 76), + (117, 83, 82), (151, 85, 69), (171, 83, 60), (191, 82, 51), + (186, 77, 47), (182, 73, 44), (176, 84, 59), (155, 74, 53), + (138, 61, 45), (134, 41, 22), (130, 22, 0), (121, 23, 2), + (112, 24, 4), (104, 21, 3), (103, 17, 2), (102, 19, 5), + (108, 23, 3), (110, 24, 9), (136, 42, 23), (162, 60, 37), + (172, 72, 46), (182, 84, 55), (213, 116, 74), (243, 243, 243), + (255, 255, 255), (255, 255, 251), (255, 255, 248), (253, 252, 241), + (252, 250, 235), (225, 119, 79), (178, 88, 79), (147, 73, 70), + (110, 72, 69), (90, 65, 68), (85, 58, 60), (80, 51, 53), + (84, 35, 28), (102, 24, 12), (102, 20, 8), (99, 22, 6), + (52, 8, 7), (30, 4, 6), (8, 0, 6), (6, 0, 6), + (5, 0, 7), (6, 0, 6), (27, 1, 10), (58, 13, 10), + (96, 26, 14), (129, 62, 45), (122, 64, 51), (116, 66, 57), + (106, 71, 67), (110, 80, 80), (104, 85, 89), (90, 83, 91), + (100, 79, 86), (104, 79, 82), (108, 80, 79), (109, 81, 79), + (111, 83, 79), (137, 63, 64), (149, 61, 49), (148, 59, 45), + (154, 51, 36), (113, 25, 11), (110, 23, 11), (108, 21, 11), + (106, 27, 12), (120, 46, 37), (110, 56, 56), (101, 63, 74), + (83, 53, 53), (88, 48, 46), (94, 43, 40), (95, 28, 12), + (103, 26, 10), (101, 22, 7), (97, 21, 7), (71, 27, 28), + (58, 46, 46), (58, 52, 56), (60, 52, 55), (63, 53, 54), + (65, 54, 58), (75, 55, 54), (90, 56, 54), (110, 46, 44), + (105, 28, 12), (103, 25, 10), (102, 23, 8), (101, 22, 7), + (103, 24, 9), (104, 26, 14), (91, 57, 55), (88, 73, 68), + (80, 68, 72), (77, 65, 69), (77, 54, 60), (78, 38, 49), + (94, 25, 18), (100, 21, 6), (100, 21, 4), (101, 18, 0), + (101, 18, 0), (101, 18, 0), (101, 18, 0), (101, 18, 0), + (101, 18, 0), (101, 18, 0), (101, 18, 0), (101, 18, 0), + (101, 18, 0), (99, 20, 3), (100, 21, 6), (100, 21, 6), + (101, 24, 8), (105, 28, 12), (116, 39, 29), (109, 64, 59), + (111, 77, 78), (124, 94, 92), (168, 97, 77), (173, 96, 76), + (179, 93, 68), (169, 81, 61), (154, 68, 53), (131, 64, 56), + (107, 73, 71), (91, 71, 70), (81, 64, 72), (76, 56, 57), + (77, 57, 56), (75, 54, 53), (76, 47, 43), (94, 30, 18), + (100, 23, 7), (100, 23, 5), (100, 21, 6), (101, 22, 7), + (102, 22, 11), (106, 27, 12), (128, 51, 33), (147, 59, 39), + (149, 66, 48), (136, 79, 68), (114, 82, 83), (95, 80, 87), + (76, 74, 79), (61, 65, 76), (64, 62, 73), (65, 63, 68), + (59, 58, 64), (53, 58, 64), (53, 57, 68), (55, 52, 71), + (65, 56, 77), (71, 68, 75), (83, 70, 77), (103, 83, 84), + (124, 105, 101), (160, 131, 127), (252, 253, 248), (255, 255, 255), + (255, 255, 255), (255, 254, 249), (255, 250, 247), (226, 120, 81), + (184, 90, 64), (154, 63, 44), (143, 56, 39), (119, 42, 26), + (106, 28, 15), (98, 33, 31), (84, 68, 69), (90, 56, 54) + ), + +// 89 cl-gold-dark_reds-browns-blues +((239, 141, 112), (255, 189, 150), (255, 204, 147), (255, 219, 145), + (255, 235, 160), (255, 252, 175), (254, 253, 179), (254, 254, 184), + (255, 226, 146), (255, 216, 141), (255, 206, 137), (255, 201, 135), + (255, 197, 134), (252, 181, 131), (250, 166, 129), (248, 163, 123), + (247, 160, 117), (160, 97, 106), (130, 70, 80), (100, 44, 55), + (75, 36, 44), (51, 28, 34), (48, 25, 38), (45, 22, 42), + (25, 20, 40), (23, 23, 50), (21, 27, 61), (23, 28, 68), + (26, 30, 75), (28, 31, 77), (30, 32, 80), (29, 32, 83), + (28, 32, 79), (28, 32, 69), (25, 29, 65), (23, 27, 62), + (23, 26, 59), (23, 26, 57), (23, 27, 58), (23, 28, 60), + (33, 36, 81), (54, 46, 83), (75, 56, 86), (118, 75, 97), + (161, 95, 109), (163, 95, 108), (166, 96, 107), (172, 100, 112), + (174, 92, 96), (135, 52, 60), (108, 39, 49), (82, 26, 39), + (79, 27, 37), (76, 29, 35), (75, 25, 32), (74, 21, 29), + (52, 30, 43), (38, 30, 52), (25, 30, 62), (25, 29, 63), + (26, 29, 64), (24, 28, 63), (23, 27, 62), (18, 26, 65), + (18, 26, 63), (24, 26, 49), (32, 31, 48), (40, 37, 48), + (47, 36, 46), (55, 35, 44), (59, 33, 44), (64, 36, 51), + (73, 34, 63), (88, 48, 72), (104, 63, 81), (132, 67, 77), + (161, 71, 73), (165, 72, 69), (170, 73, 66), (162, 60, 56), + (118, 47, 55), (38, 37, 79), (32, 34, 81), (26, 32, 84), + (25, 30, 79), (25, 29, 74), (24, 29, 67), (21, 27, 59), + (15, 20, 49), (18, 24, 45), (22, 28, 42), (27, 29, 43), + (33, 31, 44), (52, 28, 42), (79, 21, 36), (86, 21, 19), + (115, 20, 18), (191, 83, 80), (219, 100, 98), (248, 118, 116), + (235, 108, 120), (222, 98, 124), (156, 84, 106), (111, 57, 71), + (76, 36, 63), (99, 45, 61), (123, 54, 59), (150, 62, 64), + (178, 70, 70), (208, 101, 95), (250, 114, 102), (254, 124, 111), + (253, 123, 109), (177, 93, 93), (149, 76, 80), (122, 59, 67), + (83, 38, 45), (79, 31, 43), (72, 33, 60), (67, 44, 60), + (55, 40, 61), (46, 39, 68), (38, 38, 76), (38, 38, 80), + (38, 39, 85), (36, 38, 89), (33, 36, 91), (32, 35, 86), + (33, 37, 85), (31, 36, 78), (33, 34, 75), (35, 33, 72), + (32, 29, 56), (28, 23, 45), (39, 20, 40), (41, 13, 27), + (24, 20, 34), (22, 22, 39), (20, 25, 44), (19, 24, 46), + (19, 23, 48), (19, 23, 48), (22, 28, 52), (19, 27, 63), + (21, 26, 68), (29, 32, 67), (31, 31, 63), (33, 30, 59), + (50, 42, 55), (62, 34, 57), (65, 38, 55), (57, 33, 47), + (48, 22, 35), (46, 18, 30), (45, 15, 25), (40, 12, 26), + (39, 16, 24), (28, 12, 22), (19, 21, 36), (19, 21, 42), + (18, 20, 45), (25, 24, 40), (32, 22, 38), (39, 21, 37), + (55, 24, 30), (71, 25, 36), (71, 29, 41), (74, 34, 43), + (53, 49, 64), (50, 45, 58), (47, 41, 53), (31, 31, 55), + (26, 28, 51), (31, 33, 46), (39, 33, 47), (47, 26, 41), + (47, 24, 34), (41, 20, 27), (35, 19, 29), (24, 21, 32), + (18, 19, 39), (15, 22, 41), (17, 22, 42), (18, 23, 42), + (20, 27, 46), (24, 28, 48), (28, 29, 50), (48, 34, 51), + (67, 33, 66), (82, 39, 69), (117, 47, 58), (136, 62, 77), + (184, 105, 111), (246, 145, 115), (255, 164, 120), (254, 194, 132), + (255, 198, 134), (255, 183, 128), (242, 153, 123), (176, 111, 119), + (152, 91, 106), (106, 66, 101), (83, 52, 67), (73, 45, 57), + (76, 47, 65), (96, 60, 86), (115, 68, 100), (150, 88, 111), + (177, 100, 106), (200, 110, 99), (254, 119, 115), (246, 146, 114), + (250, 158, 119), (248, 150, 113), (242, 148, 112), (185, 109, 113), + (135, 82, 102), (97, 66, 74), (75, 51, 64), (59, 48, 64), + (38, 38, 76), (36, 38, 89), (30, 35, 90), (26, 34, 96), + (24, 32, 94), (25, 34, 89), (29, 34, 89), (24, 31, 86), + (27, 34, 78), (27, 31, 68), (30, 31, 62), (25, 22, 49), + (22, 18, 35), (22, 10, 20), (14, 4, 12), (25, 4, 13), + (27, 10, 18), (39, 13, 22), (50, 19, 27), (46, 13, 32), + (57, 19, 44), (55, 28, 45), (49, 25, 47), (38, 25, 42), + (28, 25, 42), (32, 20, 40), (35, 14, 23), (36, 13, 21), + (29, 9, 20), (23, 10, 20), (35, 9, 20), (40, 13, 20), + (62, 12, 13), (97, 17, 20), (143, 50, 43), (187, 99, 95) + ), + +// 90 cl-golds-browns +((128, 84, 13), (140, 92, 16), (148, 99, 18), (157, 107, 20), + (169, 121, 29), (182, 136, 38), (190, 144, 34), (199, 153, 31), + (194, 144, 31), (185, 128, 26), (177, 112, 22), (179, 109, 19), + (182, 107, 16), (182, 109, 18), (183, 112, 20), (180, 113, 20), + (177, 114, 21), (194, 146, 38), (189, 132, 31), (184, 118, 24), + (178, 114, 23), (172, 110, 23), (172, 109, 19), (172, 109, 16), + (171, 109, 8), (164, 104, 12), (157, 99, 17), (150, 97, 14), + (144, 96, 12), (145, 98, 12), (146, 100, 12), (158, 112, 16), + (165, 121, 14), (167, 111, 18), (156, 100, 18), (146, 89, 18), + (132, 82, 17), (118, 76, 16), (110, 72, 15), (103, 68, 14), + (90, 59, 15), (100, 63, 12), (110, 68, 10), (114, 73, 13), + (119, 78, 16), (120, 79, 17), (121, 80, 18), (124, 79, 20), + (126, 80, 18), (136, 82, 22), (132, 86, 27), (129, 90, 33), + (123, 84, 31), (117, 79, 30), (110, 74, 27), (103, 70, 25), + (84, 55, 13), (82, 53, 8), (80, 52, 4), (79, 50, 6), + (78, 49, 9), (81, 50, 10), (84, 52, 11), (88, 57, 13), + (95, 59, 11), (113, 73, 14), (115, 74, 13), (117, 76, 12), + (117, 75, 13), (117, 75, 15), (117, 77, 16), (110, 73, 20), + (117, 73, 28), (123, 78, 26), (129, 83, 24), (140, 90, 21), + (151, 98, 18), (160, 100, 18), (169, 103, 19), (175, 110, 20), + (178, 108, 22), (184, 114, 18), (190, 129, 23), (197, 144, 28), + (198, 148, 31), (200, 153, 35), (199, 153, 41), (180, 179, 161), + (135, 98, 45), (127, 87, 34), (120, 77, 24), (115, 73, 22), + (110, 70, 21), (100, 66, 18), (98, 64, 18), (107, 70, 17), + (117, 77, 16), (140, 91, 14), (146, 98, 17), (152, 106, 20), + (155, 109, 19), (159, 113, 19), (155, 105, 18), (152, 99, 19), + (139, 95, 30), (132, 88, 24), (126, 82, 19), (121, 76, 17), + (116, 71, 16), (97, 56, 12), (91, 54, 12), (89, 54, 16), + (91, 58, 15), (108, 66, 16), (106, 66, 15), (104, 67, 14), + (103, 68, 14), (94, 64, 14), (89, 58, 14), (81, 53, 13), + (71, 47, 11), (70, 46, 13), (70, 45, 15), (72, 48, 14), + (74, 52, 13), (81, 57, 21), (84, 56, 19), (79, 53, 16), + (71, 49, 12), (69, 47, 10), (70, 47, 8), (72, 47, 6), + (80, 51, 7), (86, 55, 8), (106, 65, 9), (123, 74, 15), + (142, 89, 23), (140, 89, 27), (139, 90, 31), (134, 91, 38), + (130, 92, 45), (112, 83, 43), (113, 81, 34), (102, 72, 22), + (103, 70, 19), (110, 66, 19), (111, 69, 18), (113, 72, 18), + (118, 76, 16), (123, 77, 17), (126, 81, 16), (129, 84, 17), + (135, 93, 21), (137, 91, 20), (140, 90, 19), (136, 88, 16), + (128, 80, 16), (122, 76, 14), (114, 72, 14), (106, 69, 16), + (100, 66, 18), (95, 60, 20), (97, 60, 21), (100, 61, 22), + (109, 62, 20), (103, 66, 13), (94, 60, 12), (85, 53, 15), + (77, 47, 9), (76, 46, 7), (75, 46, 6), (73, 44, 10), + (71, 42, 8), (67, 43, 9), (68, 44, 8), (68, 44, 6), + (71, 43, 6), (69, 42, 0), (62, 39, 5), (65, 40, 9), + (61, 42, 25), (67, 44, 12), (67, 44, 10), (65, 42, 8), + (68, 44, 10), (70, 45, 10), (72, 46, 11), (80, 51, 9), + (92, 55, 11), (102, 65, 12), (114, 74, 13), (122, 81, 15), + (131, 83, 17), (134, 83, 18), (133, 86, 16), (132, 85, 15), + (133, 79, 15), (129, 79, 16), (126, 81, 16), (126, 81, 16), + (123, 77, 17), (126, 76, 15), (124, 75, 16), (119, 74, 15), + (118, 71, 15), (118, 69, 10), (116, 74, 14), (114, 74, 15), + (114, 74, 13), (113, 75, 12), (110, 69, 3), (103, 66, 11), + (94, 58, 8), (87, 54, 11), (81, 52, 10), (76, 48, 8), + (69, 45, 9), (68, 44, 8), (72, 44, 7), (73, 43, 5), + (73, 45, 6), (77, 45, 6), (76, 47, 7), (81, 52, 8), + (87, 52, 10), (86, 55, 11), (92, 62, 12), (106, 69, 14), + (117, 75, 15), (127, 82, 15), (141, 92, 15), (160, 91, 0), + (163, 102, 9), (172, 108, 18), (163, 111, 27), (146, 100, 40), + (139, 93, 44), (106, 82, 48), (100, 75, 34), (103, 76, 31), + (120, 84, 26), (124, 82, 22), (129, 84, 17), (134, 87, 17), + (135, 87, 15), (135, 87, 15), (133, 88, 7), (132, 86, 8), + (126, 76, 13), (125, 71, 7), (121, 67, 0), (127, 73, 9), + (144, 92, 16), (166, 104, 19), (203, 159, 38), (180, 131, 28) + ), + +// 91 cl-purples-browns-blues-tans +((61, 49, 73), (49, 40, 83), (54, 44, 81), (59, 48, 80), + (54, 43, 72), (49, 39, 64), (49, 36, 62), (50, 34, 61), + (45, 30, 51), (55, 40, 62), (65, 50, 73), (73, 51, 83), + (81, 53, 94), (78, 58, 96), (75, 64, 98), (81, 64, 94), + (87, 64, 90), (67, 51, 77), (75, 48, 73), (84, 46, 69), + (93, 58, 67), (103, 70, 65), (107, 73, 67), (111, 76, 70), + (124, 82, 86), (122, 88, 94), (121, 94, 103), (130, 95, 101), + (139, 97, 99), (147, 101, 103), (155, 105, 108), (172, 112, 111), + (187, 112, 107), (203, 130, 124), (205, 128, 109), (207, 127, 94), + (213, 134, 106), (220, 142, 119), (209, 137, 124), (198, 133, 129), + (154, 86, 101), (121, 72, 97), (88, 58, 94), (66, 42, 67), + (45, 27, 41), (33, 20, 33), (22, 14, 25), (8, 6, 11), + (1, 0, 0), (0, 0, 0), (8, 6, 11), (16, 13, 22), + (38, 28, 46), (60, 44, 71), (67, 51, 86), (75, 58, 102), + (109, 81, 132), (107, 76, 121), (106, 71, 111), (101, 69, 108), + (97, 67, 105), (98, 70, 104), (99, 74, 103), (109, 84, 90), + (118, 84, 85), (139, 93, 96), (145, 94, 95), (152, 96, 95), + (153, 96, 94), (155, 97, 93), (161, 91, 83), (161, 102, 88), + (159, 103, 104), (153, 108, 126), (147, 113, 148), (145, 102, 145), + (144, 91, 143), (150, 91, 126), (156, 92, 109), (152, 100, 102), + (157, 103, 101), (147, 98, 94), (137, 90, 86), (127, 82, 79), + (121, 78, 74), (115, 74, 70), (112, 61, 40), (85, 49, 49), + (64, 44, 79), (73, 50, 91), (82, 56, 104), (85, 61, 103), + (89, 67, 103), (117, 88, 106), (137, 99, 110), (138, 89, 145), + (152, 108, 159), (158, 108, 171), (169, 115, 179), (181, 122, 188), + (188, 128, 196), (195, 134, 204), (197, 138, 202), (196, 136, 198), + (186, 141, 161), (154, 104, 126), (122, 68, 92), (112, 61, 81), + (102, 54, 70), (67, 41, 68), (49, 33, 60), (36, 21, 42), + (33, 24, 41), (50, 31, 53), (62, 37, 60), (75, 43, 67), + (90, 68, 70), (107, 56, 75), (109, 59, 88), (121, 79, 80), + (151, 86, 66), (167, 93, 58), (183, 100, 50), (175, 99, 60), + (168, 99, 70), (172, 110, 99), (182, 117, 141), (191, 134, 166), + (211, 152, 172), (200, 132, 153), (204, 137, 149), (208, 142, 146), + (219, 158, 166), (232, 165, 174), (244, 199, 204), (246, 198, 212), + (255, 255, 255), (249, 254, 222), (243, 253, 190), (246, 240, 173), + (250, 227, 157), (222, 220, 231), (248, 190, 228), (209, 144, 210), + (178, 118, 178), (148, 105, 114), (142, 100, 109), (136, 96, 104), + (132, 95, 102), (137, 99, 110), (151, 100, 105), (155, 105, 108), + (195, 135, 137), (200, 138, 140), (206, 142, 143), (204, 150, 150), + (207, 142, 138), (199, 139, 139), (178, 129, 135), (158, 110, 108), + (134, 102, 107), (136, 89, 97), (137, 89, 91), (139, 90, 85), + (138, 88, 77), (137, 89, 75), (133, 89, 78), (124, 82, 84), + (121, 80, 78), (118, 80, 79), (116, 80, 80), (112, 77, 73), + (110, 79, 76), (105, 78, 85), (94, 73, 104), (97, 70, 105), + (103, 67, 93), (107, 82, 88), (109, 76, 67), (107, 74, 65), + (97, 71, 72), (91, 69, 72), (96, 73, 83), (93, 70, 98), + (126, 96, 106), (144, 105, 113), (162, 115, 121), (191, 138, 156), + (219, 143, 153), (242, 167, 161), (242, 214, 131), (241, 189, 103), + (209, 145, 136), (187, 113, 112), (149, 94, 91), (111, 75, 75), + (77, 55, 57), (59, 46, 40), (54, 35, 39), (36, 23, 40), + (26, 19, 27), (17, 15, 18), (11, 8, 17), (13, 10, 19), + (22, 11, 25), (50, 24, 35), (57, 31, 42), (65, 39, 64), + (74, 46, 69), (67, 41, 68), (63, 40, 69), (67, 48, 67), + (73, 52, 69), (78, 53, 74), (79, 53, 78), (93, 67, 70), + (92, 66, 65), (106, 55, 72), (93, 65, 80), (83, 60, 86), + (73, 52, 71), (55, 38, 56), (46, 33, 42), (48, 27, 44), + (53, 27, 40), (49, 26, 44), (42, 24, 38), (39, 24, 45), + (40, 32, 47), (38, 24, 41), (37, 22, 43), (33, 18, 39), + (24, 14, 25), (23, 14, 15), (23, 13, 22), (21, 18, 27), + (31, 20, 34), (47, 31, 58), (53, 37, 64), (63, 45, 83), + (72, 56, 105), (75, 58, 110), (85, 60, 118), (87, 65, 114), + (78, 59, 105), (72, 49, 93), (75, 47, 87), (64, 48, 74), + (56, 38, 54), (36, 22, 37), (26, 18, 33), (3, 16, 33), + (19, 16, 27), (26, 18, 33), (46, 28, 50), (63, 39, 71) + ), + +// 92 cl-oranges-browns-whites +((255, 147, 57), (255, 123, 61), (254, 126, 61), (254, 129, 62), + (254, 135, 61), (255, 142, 61), (255, 155, 59), (255, 169, 58), + (253, 185, 60), (254, 183, 57), (255, 182, 55), (255, 172, 53), + (255, 163, 52), (254, 161, 55), (253, 159, 59), (253, 160, 58), + (253, 162, 57), (255, 182, 54), (255, 205, 59), (255, 229, 64), + (255, 241, 89), (255, 254, 115), (255, 246, 108), (255, 238, 101), + (254, 185, 58), (254, 163, 56), (255, 141, 55), (255, 129, 57), + (255, 118, 59), (255, 115, 59), (255, 112, 59), (255, 106, 63), + (255, 109, 62), (254, 120, 67), (254, 122, 64), (255, 125, 61), + (254, 122, 58), (253, 120, 55), (254, 124, 56), (255, 128, 57), + (254, 131, 61), (254, 142, 60), (255, 154, 59), (255, 142, 57), + (255, 131, 55), (255, 129, 55), (255, 127, 55), (253, 127, 53), + (250, 152, 43), (255, 190, 54), (255, 214, 75), (255, 239, 97), + (255, 245, 103), (255, 251, 109), (253, 251, 88), (252, 252, 68), + (255, 208, 61), (255, 192, 57), (255, 177, 53), (253, 154, 51), + (251, 132, 50), (250, 123, 53), (250, 115, 57), (244, 103, 57), + (229, 93, 55), (202, 81, 60), (184, 76, 61), (166, 72, 62), + (170, 74, 59), (175, 76, 57), (196, 79, 59), (213, 86, 54), + (241, 103, 56), (245, 105, 58), (249, 107, 61), (242, 101, 60), + (236, 96, 60), (228, 94, 59), (220, 93, 58), (207, 86, 55), + (193, 74, 50), (177, 75, 52), (188, 77, 55), (199, 80, 58), + (209, 86, 57), (219, 92, 57), (235, 103, 54), (252, 119, 52), + (248, 202, 65), (249, 228, 131), (251, 254, 197), (253, 253, 208), + (255, 253, 219), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 246), (255, 255, 232), (255, 255, 218), + (255, 255, 215), (255, 255, 212), (255, 255, 209), (255, 251, 164), + (254, 190, 66), (254, 159, 61), (255, 128, 57), (253, 123, 53), + (252, 119, 50), (255, 114, 42), (254, 115, 50), (254, 108, 57), + (254, 106, 58), (254, 108, 61), (251, 110, 63), (248, 113, 65), + (250, 116, 65), (251, 115, 67), (244, 105, 66), (234, 94, 58), + (212, 87, 57), (192, 79, 56), (173, 71, 56), (163, 70, 57), + (153, 69, 59), (149, 64, 61), (159, 71, 59), (168, 72, 48), + (189, 81, 55), (212, 82, 56), (216, 83, 56), (220, 85, 56), + (222, 92, 56), (234, 94, 59), (242, 96, 57), (239, 102, 58), + (211, 86, 54), (196, 75, 49), (182, 65, 45), (175, 61, 42), + (169, 58, 39), (154, 57, 48), (143, 58, 51), (137, 60, 52), + (137, 65, 51), (166, 75, 57), (175, 82, 58), (185, 90, 60), + (187, 178, 61), (241, 255, 144), (255, 255, 167), (255, 255, 152), + (253, 196, 67), (254, 183, 62), (255, 171, 58), (254, 137, 58), + (248, 114, 61), (238, 100, 64), (219, 92, 60), (203, 82, 51), + (191, 71, 46), (174, 53, 26), (172, 52, 28), (170, 51, 31), + (168, 56, 36), (168, 59, 38), (154, 57, 40), (154, 57, 38), + (132, 44, 32), (129, 49, 36), (126, 54, 40), (136, 65, 43), + (144, 62, 48), (158, 67, 48), (167, 66, 48), (180, 81, 50), + (209, 86, 55), (227, 93, 55), (245, 104, 58), (253, 105, 59), + (255, 109, 58), (255, 115, 56), (252, 116, 54), (253, 117, 55), + (255, 117, 58), (255, 115, 58), (255, 114, 58), (254, 108, 57), + (255, 104, 57), (246, 104, 58), (240, 103, 51), (253, 102, 49), + (247, 111, 51), (247, 112, 44), (248, 123, 39), (255, 156, 47), + (253, 174, 56), (255, 188, 58), (254, 207, 59), (254, 232, 61), + (255, 254, 61), (255, 236, 65), (255, 227, 64), (255, 212, 64), + (255, 191, 61), (255, 182, 54), (240, 171, 34), (221, 168, 36), + (238, 124, 28), (255, 118, 40), (247, 108, 53), (242, 104, 55), + (230, 94, 56), (218, 87, 59), (194, 80, 56), (166, 70, 45), + (137, 63, 50), (127, 63, 61), (117, 67, 60), (106, 52, 66), + (117, 64, 56), (120, 64, 51), (121, 71, 46), (120, 63, 52), + (112, 60, 49), (106, 60, 47), (97, 44, 36), (112, 58, 48), + (117, 62, 42), (129, 62, 53), (155, 62, 45), (174, 57, 39), + (192, 61, 33), (204, 70, 41), (214, 74, 39), (220, 83, 47), + (214, 83, 55), (207, 71, 47), (207, 72, 43), (184, 67, 47), + (178, 60, 46), (156, 69, 52), (143, 69, 60), (132, 69, 64), + (127, 74, 70), (139, 82, 115), (191, 103, 89), (210, 86, 58), + (216, 89, 54), (228, 92, 54), (242, 87, 41), (247, 95, 46), + (253, 92, 48), (237, 86, 59), (223, 89, 60), (195, 78, 58) + ), + +// 93 cl-blues-greens-whites +((255, 255, 255), (190, 208, 248), (163, 186, 237), (136, 164, 227), + (132, 159, 220), (128, 154, 213), (126, 151, 213), (124, 149, 213), + (112, 145, 212), (109, 136, 196), (106, 127, 180), (97, 113, 156), + (89, 100, 132), (94, 98, 108), (100, 96, 85), (99, 102, 82), + (99, 108, 79), (89, 89, 53), (85, 86, 29), (82, 83, 5), + (76, 79, 8), (70, 76, 12), (60, 72, 8), (50, 69, 5), + (44, 59, 0), (41, 59, 5), (38, 60, 11), (51, 67, 35), + (64, 75, 59), (68, 73, 68), (72, 71, 77), (70, 68, 71), + (69, 72, 53), (64, 71, 37), (59, 66, 49), (55, 61, 61), + (38, 48, 67), (21, 35, 74), (28, 41, 79), (35, 47, 85), + (72, 77, 106), (65, 70, 87), (58, 63, 69), (52, 63, 45), + (47, 64, 22), (45, 63, 13), (43, 63, 4), (41, 62, 5), + (43, 61, 13), (73, 82, 55), (82, 86, 63), (91, 90, 72), + (93, 93, 79), (96, 96, 86), (98, 99, 78), (101, 102, 71), + (85, 83, 62), (76, 74, 70), (68, 66, 79), (75, 75, 67), + (82, 85, 56), (81, 86, 51), (81, 88, 46), (78, 77, 31), + (80, 88, 51), (91, 91, 99), (89, 95, 121), (87, 100, 144), + (91, 106, 151), (96, 113, 159), (121, 137, 188), (160, 169, 208), + (232, 239, 249), (243, 247, 252), (255, 255, 255), (232, 243, 255), + (210, 231, 255), (200, 212, 242), (190, 194, 229), (161, 175, 212), + (159, 164, 196), (143, 157, 196), (149, 163, 200), (155, 169, 204), + (151, 162, 199), (147, 156, 195), (139, 153, 192), (117, 135, 175), + (91, 91, 103), (81, 85, 65), (71, 80, 27), (69, 79, 21), + (67, 79, 15), (55, 73, 21), (70, 81, 39), (85, 95, 61), + (109, 109, 85), (101, 111, 147), (100, 116, 164), (100, 122, 182), + (98, 120, 178), (97, 118, 175), (89, 110, 167), (87, 106, 149), + (58, 72, 111), (43, 59, 98), (28, 46, 86), (28, 44, 84), + (29, 43, 82), (27, 45, 85), (36, 53, 99), (47, 64, 110), + (48, 64, 115), (27, 45, 85), (27, 45, 85), (27, 45, 85), + (41, 58, 104), (55, 71, 122), (66, 88, 148), (85, 107, 167), + (124, 149, 213), (134, 159, 221), (144, 170, 229), (149, 175, 234), + (154, 180, 239), (160, 186, 245), (155, 184, 242), (140, 174, 235), + (141, 170, 228), (163, 173, 198), (169, 177, 203), (176, 182, 208), + (174, 179, 211), (157, 170, 212), (139, 151, 189), (106, 122, 173), + (105, 105, 95), (96, 96, 101), (87, 88, 108), (82, 87, 120), + (78, 86, 132), (75, 91, 142), (70, 97, 166), (76, 103, 174), + (80, 110, 182), (92, 125, 202), (95, 129, 203), (99, 133, 204), + (104, 129, 196), (104, 129, 196), (106, 130, 192), (107, 132, 189), + (99, 118, 158), (95, 114, 155), (91, 110, 153), (87, 95, 108), + (104, 103, 98), (119, 118, 90), (116, 124, 83), (126, 128, 106), + (123, 118, 114), (80, 93, 135), (77, 91, 138), (74, 90, 141), + (64, 81, 127), (51, 67, 118), (41, 57, 108), (35, 52, 98), + (53, 52, 66), (54, 53, 64), (56, 55, 63), (65, 63, 76), + (79, 78, 83), (90, 85, 81), (82, 77, 83), (77, 75, 97), + (74, 83, 122), (77, 94, 138), (80, 96, 147), (78, 98, 159), + (64, 89, 153), (65, 86, 143), (63, 79, 130), (58, 67, 110), + (25, 37, 59), (28, 40, 61), (31, 44, 63), (50, 59, 76), + (75, 83, 106), (87, 101, 136), (102, 116, 155), (116, 130, 169), + (118, 135, 179), (132, 149, 193), (150, 168, 208), (151, 168, 212), + (145, 167, 216), (132, 153, 206), (126, 147, 200), (116, 132, 183), + (117, 134, 180), (115, 132, 178), (107, 128, 185), (100, 120, 181), + (96, 116, 177), (80, 106, 180), (81, 105, 175), (80, 105, 172), + (76, 103, 174), (80, 104, 174), (80, 106, 180), (83, 116, 187), + (103, 125, 185), (112, 134, 194), (117, 142, 198), (128, 147, 190), + (132, 150, 190), (129, 151, 200), (131, 151, 204), (124, 146, 206), + (109, 137, 210), (112, 138, 199), (108, 134, 193), (107, 129, 189), + (101, 123, 183), (95, 116, 173), (85, 106, 169), (77, 102, 166), + (75, 102, 171), (65, 92, 161), (63, 88, 152), (67, 89, 149), + (60, 81, 138), (54, 71, 115), (50, 67, 113), (57, 74, 120), + (73, 91, 131), (71, 93, 153), (81, 103, 163), (108, 124, 175), + (119, 135, 186), (140, 157, 203), (160, 172, 210), (181, 186, 215), + (188, 199, 229), (189, 205, 241), (183, 200, 244), (169, 192, 236), + (173, 190, 234), (172, 186, 223), (184, 195, 225), (189, 196, 214), + (188, 199, 229), (206, 212, 234), (220, 227, 243), (227, 231, 243) + ), + +// 94 cl-tans-yellows-browns +((168, 139, 109), (159, 147, 135), (162, 151, 141), (166, 156, 147), + (170, 164, 158), (174, 173, 169), (178, 177, 176), (182, 182, 184), + (199, 198, 196), (211, 208, 207), (223, 219, 218), (235, 234, 228), + (247, 249, 238), (238, 236, 229), (229, 224, 221), (221, 216, 213), + (214, 209, 206), (196, 185, 183), (196, 187, 180), (197, 189, 178), + (202, 193, 185), (207, 198, 193), (216, 203, 190), (225, 208, 188), + (229, 210, 180), (238, 210, 165), (247, 211, 151), (247, 211, 139), + (247, 212, 128), (236, 205, 130), (226, 198, 133), (230, 191, 136), + (224, 198, 141), (205, 191, 165), (221, 205, 180), (238, 220, 196), + (243, 230, 201), (249, 240, 207), (245, 238, 206), (242, 237, 205), + (229, 215, 202), (215, 202, 187), (202, 189, 173), (193, 184, 166), + (184, 179, 160), (181, 176, 165), (179, 174, 170), (178, 173, 169), + (177, 173, 170), (179, 164, 157), (181, 165, 151), (183, 166, 146), + (180, 164, 149), (177, 163, 152), (175, 163, 153), (173, 164, 155), + (184, 179, 176), (192, 187, 183), (200, 195, 191), (216, 206, 194), + (233, 218, 197), (237, 222, 197), (241, 226, 197), (251, 235, 183), + (253, 236, 182), (250, 250, 138), (251, 251, 135), (253, 253, 133), + (253, 253, 132), (253, 253, 131), (252, 252, 130), (252, 252, 120), + (252, 230, 129), (242, 211, 128), (233, 192, 128), (222, 178, 124), + (212, 165, 121), (224, 170, 120), (237, 176, 119), (247, 195, 112), + (247, 213, 123), (227, 217, 164), (213, 200, 163), (199, 184, 163), + (198, 180, 163), (198, 176, 163), (183, 169, 158), (168, 161, 155), + (160, 150, 149), (161, 155, 152), (163, 160, 155), (165, 161, 156), + (168, 163, 157), (173, 171, 172), (187, 183, 182), (199, 198, 196), + (213, 209, 206), (244, 226, 204), (246, 221, 177), (248, 217, 150), + (249, 213, 148), (250, 209, 147), (241, 179, 128), (202, 160, 118), + (184, 163, 136), (180, 156, 134), (176, 150, 133), (175, 150, 129), + (174, 150, 126), (170, 153, 135), (163, 151, 139), (151, 146, 140), + (149, 140, 131), (125, 112, 103), (120, 111, 86), (116, 111, 69), + (111, 97, 84), (109, 102, 96), (122, 114, 103), (150, 144, 128), + (193, 178, 159), (224, 198, 157), (255, 218, 155), (253, 216, 146), + (251, 215, 137), (251, 225, 141), (255, 247, 130), (253, 253, 139), + (253, 251, 148), (244, 223, 180), (238, 220, 180), (232, 218, 181), + (227, 210, 184), (226, 204, 180), (203, 197, 183), (196, 184, 172), + (194, 167, 156), (189, 170, 164), (185, 174, 172), (185, 176, 174), + (186, 178, 176), (181, 177, 178), (186, 182, 179), (190, 180, 171), + (187, 177, 168), (181, 171, 161), (180, 168, 159), (179, 166, 158), + (176, 161, 154), (179, 159, 148), (177, 161, 145), (177, 156, 137), + (169, 151, 131), (171, 159, 129), (173, 168, 128), (173, 164, 107), + (175, 153, 103), (182, 144, 107), (185, 149, 113), (183, 154, 124), + (182, 164, 140), (192, 183, 176), (194, 187, 181), (197, 192, 186), + (206, 192, 189), (208, 195, 187), (223, 204, 174), (217, 192, 135), + (177, 148, 106), (151, 128, 101), (125, 109, 96), (118, 104, 93), + (123, 111, 99), (125, 122, 113), (146, 137, 132), (172, 147, 125), + (198, 151, 107), (208, 163, 124), (235, 189, 114), (249, 203, 105), + (251, 217, 110), (249, 231, 107), (252, 241, 113), (250, 215, 115), + (255, 230, 156), (253, 230, 166), (252, 231, 176), (250, 229, 174), + (247, 219, 156), (251, 222, 142), (253, 242, 126), (248, 247, 129), + (255, 228, 147), (239, 233, 171), (229, 222, 176), (213, 194, 177), + (204, 186, 172), (189, 181, 168), (181, 166, 163), (173, 162, 160), + (174, 164, 155), (174, 161, 153), (174, 162, 150), (168, 156, 142), + (159, 145, 142), (158, 145, 139), (151, 147, 144), (161, 147, 147), + (168, 158, 156), (181, 172, 167), (187, 178, 171), (193, 184, 169), + (198, 185, 168), (206, 190, 174), (202, 195, 176), (201, 191, 181), + (198, 188, 179), (199, 187, 173), (197, 184, 176), (196, 185, 181), + (193, 182, 178), (188, 183, 179), (189, 184, 180), (193, 184, 179), + (192, 187, 183), (193, 190, 183), (196, 192, 189), (198, 193, 190), + (197, 196, 192), (199, 199, 199), (200, 199, 197), (204, 199, 195), + (209, 200, 193), (226, 209, 189), (229, 215, 178), (233, 214, 184), + (230, 208, 195), (217, 208, 203), (210, 205, 201), (204, 200, 199), + (211, 210, 205), (220, 217, 208), (225, 224, 222), (225, 224, 222), + (225, 220, 217), (217, 217, 207), (208, 203, 199), (201, 192, 187), + (187, 183, 180), (182, 172, 170), (171, 167, 164), (169, 159, 157), + (170, 159, 155), (169, 154, 149), (166, 152, 139), (165, 148, 130) + ), + +// 95 cl-golds-browns2 +((166, 81, 24), (131, 73, 25), (126, 72, 30), (121, 71, 36), + (122, 73, 41), (123, 76, 46), (122, 81, 47), (122, 87, 49), + (155, 86, 44), (155, 87, 40), (156, 89, 37), (148, 82, 29), + (140, 75, 21), (136, 72, 14), (133, 69, 7), (130, 66, 8), + (128, 63, 9), (125, 64, 19), (129, 70, 26), (134, 77, 34), + (153, 84, 36), (173, 92, 39), (183, 93, 37), (194, 95, 36), + (208, 109, 42), (222, 114, 45), (236, 119, 49), (233, 122, 60), + (230, 126, 71), (226, 124, 70), (223, 122, 70), (214, 130, 93), + (201, 127, 92), (177, 121, 96), (155, 108, 91), (133, 96, 87), + (137, 95, 78), (142, 95, 69), (137, 93, 64), (133, 92, 60), + (156, 86, 35), (156, 82, 34), (156, 79, 33), (158, 78, 28), + (161, 78, 24), (160, 79, 24), (159, 80, 24), (149, 77, 27), + (147, 77, 17), (162, 78, 18), (176, 88, 19), (191, 98, 20), + (211, 105, 31), (231, 113, 43), (233, 117, 47), (235, 122, 52), + (255, 137, 57), (255, 148, 73), (255, 159, 90), (255, 206, 120), + (255, 254, 151), (255, 254, 168), (255, 255, 185), (255, 254, 207), + (254, 255, 195), (255, 248, 143), (255, 204, 108), (255, 161, 73), + (255, 160, 73), (255, 159, 74), (253, 154, 71), (255, 145, 70), + (226, 115, 43), (195, 103, 40), (165, 92, 37), (147, 83, 35), + (130, 75, 34), (126, 72, 33), (122, 70, 33), (108, 67, 35), + (103, 68, 46), (107, 72, 53), (109, 72, 51), (111, 73, 50), + (114, 72, 43), (117, 71, 37), (118, 72, 38), (122, 77, 48), + (116, 82, 70), (120, 82, 67), (124, 83, 65), (127, 81, 56), + (130, 80, 47), (144, 83, 39), (159, 87, 37), (164, 87, 31), + (172, 87, 32), (190, 88, 22), (209, 95, 29), (228, 103, 36), + (233, 108, 38), (238, 114, 40), (254, 127, 46), (251, 132, 52), + (253, 129, 57), (251, 123, 63), (250, 118, 69), (249, 121, 60), + (248, 124, 52), (255, 116, 47), (254, 113, 44), (255, 115, 43), + (254, 120, 49), (255, 138, 54), (255, 136, 55), (255, 135, 57), + (253, 134, 66), (254, 130, 68), (253, 137, 80), (255, 137, 87), + (241, 134, 78), (235, 124, 73), (229, 114, 69), (221, 116, 68), + (214, 118, 68), (194, 113, 60), (161, 107, 60), (153, 101, 64), + (149, 102, 60), (153, 90, 47), (147, 86, 45), (142, 83, 43), + (127, 77, 42), (116, 70, 34), (111, 65, 32), (103, 64, 33), + (109, 63, 27), (109, 62, 23), (110, 61, 20), (109, 60, 19), + (108, 59, 18), (99, 54, 12), (85, 49, 15), (99, 60, 29), + (103, 64, 23), (111, 82, 42), (119, 86, 47), (128, 90, 53), + (147, 96, 49), (178, 102, 53), (192, 121, 75), (209, 128, 83), + (182, 104, 56), (179, 102, 53), (176, 100, 51), (172, 98, 49), + (178, 107, 55), (195, 124, 78), (211, 133, 97), (215, 139, 107), + (254, 160, 99), (254, 187, 98), (254, 178, 92), (255, 169, 86), + (255, 163, 79), (248, 158, 62), (248, 136, 64), (231, 128, 59), + (200, 106, 44), (192, 103, 43), (185, 100, 43), (165, 93, 53), + (161, 90, 46), (157, 90, 47), (156, 90, 42), (160, 94, 44), + (164, 97, 42), (177, 97, 44), (179, 97, 49), (184, 97, 52), + (173, 96, 52), (168, 96, 46), (162, 90, 40), (153, 92, 37), + (147, 87, 50), (151, 92, 52), (156, 97, 55), (169, 100, 67), + (186, 106, 81), (199, 114, 93), (195, 129, 95), (198, 130, 93), + (203, 129, 92), (222, 121, 65), (219, 117, 53), (213, 110, 44), + (204, 108, 48), (200, 111, 51), (202, 109, 48), (182, 99, 33), + (173, 89, 25), (167, 88, 21), (164, 84, 23), (156, 79, 25), + (148, 78, 27), (145, 78, 23), (145, 78, 26), (141, 77, 29), + (135, 79, 32), (139, 81, 35), (133, 78, 39), (125, 73, 36), + (114, 68, 32), (107, 67, 31), (104, 63, 31), (104, 63, 31), + (106, 66, 31), (115, 65, 28), (115, 66, 25), (112, 62, 25), + (114, 64, 27), (118, 72, 20), (123, 73, 22), (126, 72, 28), + (124, 73, 30), (128, 75, 35), (131, 77, 41), (133, 79, 43), + (129, 82, 38), (127, 80, 36), (122, 70, 33), (114, 64, 29), + (118, 69, 28), (125, 74, 21), (127, 74, 20), (137, 71, 19), + (144, 79, 23), (159, 88, 36), (189, 103, 52), (217, 128, 60), + (254, 154, 92), (255, 178, 112), (254, 218, 132), (255, 210, 125), + (255, 192, 95), (255, 154, 88), (234, 135, 70), (208, 115, 54), + (189, 108, 43), (178, 97, 34), (159, 92, 37), (146, 90, 41), + (132, 93, 54), (126, 94, 56), (127, 86, 64), (133, 87, 61) + ), + +// 96 cl-pastels +((236, 206, 176), (231, 206, 174), (229, 206, 173), (227, 206, 172), + (224, 205, 171), (222, 205, 170), (221, 205, 169), (220, 205, 169), + (215, 205, 167), (212, 205, 166), (210, 205, 165), (207, 204, 164), + (205, 204, 163), (203, 204, 162), (201, 204, 161), (199, 204, 160), + (198, 204, 160), (193, 203, 158), (195, 202, 160), (197, 201, 163), + (199, 200, 165), (201, 200, 168), (202, 199, 169), (203, 199, 170), + (207, 198, 175), (209, 197, 177), (211, 196, 180), (213, 195, 182), + (215, 195, 184), (216, 194, 185), (217, 194, 187), (219, 193, 189), + (221, 192, 192), (225, 191, 196), (227, 190, 199), (230, 189, 202), + (226, 191, 205), (223, 193, 208), (221, 194, 209), (220, 195, 211), + (212, 199, 216), (209, 201, 219), (206, 203, 222), (202, 205, 225), + (198, 207, 228), (196, 208, 229), (195, 209, 231), (192, 211, 234), + (188, 213, 237), (181, 217, 243), (177, 219, 245), (174, 221, 248), + (170, 223, 251), (166, 226, 255), (168, 225, 253), (170, 225, 251), + (177, 223, 242), (181, 222, 237), (185, 221, 233), (189, 219, 229), + (193, 218, 225), (195, 217, 222), (197, 217, 220), (200, 216, 216), + (204, 215, 212), (212, 213, 203), (216, 212, 199), (220, 211, 195), + (221, 210, 192), (223, 210, 190), (227, 208, 186), (231, 207, 182), + (236, 206, 176), (236, 205, 177), (236, 204, 179), (235, 203, 180), + (235, 202, 182), (235, 201, 182), (235, 201, 183), (234, 200, 185), + (234, 199, 186), (233, 197, 189), (233, 196, 190), (233, 195, 192), + (232, 195, 192), (232, 195, 193), (232, 194, 194), (232, 193, 196), + (231, 191, 199), (230, 190, 200), (230, 189, 202), (229, 189, 201), + (228, 190, 200), (226, 190, 197), (224, 191, 195), (222, 192, 192), + (220, 193, 190), (216, 194, 185), (214, 195, 182), (212, 196, 180), + (211, 196, 179), (210, 197, 178), (208, 197, 176), (206, 198, 173), + (202, 200, 168), (200, 200, 166), (198, 201, 164), (197, 201, 162), + (196, 202, 161), (193, 203, 158), (195, 203, 160), (197, 202, 163), + (199, 201, 165), (203, 199, 170), (204, 199, 171), (205, 199, 172), + (207, 198, 175), (209, 197, 177), (211, 196, 180), (213, 196, 182), + (217, 194, 187), (219, 193, 189), (221, 193, 192), (222, 192, 193), + (223, 192, 194), (225, 191, 196), (227, 190, 199), (230, 189, 202), + (226, 191, 205), (220, 195, 211), (218, 196, 212), (216, 197, 214), + (212, 199, 216), (209, 201, 219), (206, 203, 222), (202, 205, 225), + (195, 209, 231), (191, 211, 234), (188, 213, 237), (186, 214, 238), + (184, 215, 240), (181, 217, 243), (178, 219, 245), (174, 221, 248), + (170, 223, 251), (166, 226, 255), (166, 225, 252), (167, 225, 250), + (169, 223, 244), (170, 222, 239), (172, 221, 234), (173, 220, 228), + (176, 217, 218), (177, 216, 215), (178, 216, 213), (179, 215, 207), + (181, 213, 202), (182, 212, 197), (184, 211, 191), (185, 210, 186), + (187, 208, 181), (190, 206, 170), (190, 205, 167), (191, 205, 165), + (193, 203, 158), (195, 203, 159), (198, 203, 160), (200, 203, 161), + (205, 203, 163), (206, 203, 163), (207, 204, 164), (209, 204, 165), + (212, 204, 166), (214, 204, 167), (217, 204, 168), (219, 204, 169), + (221, 205, 170), (224, 205, 171), (226, 205, 172), (228, 205, 173), + (231, 205, 174), (233, 205, 175), (236, 206, 176), (232, 207, 180), + (225, 209, 189), (223, 209, 191), (221, 210, 193), (217, 211, 198), + (213, 213, 202), (209, 214, 206), (205, 215, 211), (202, 216, 215), + (198, 217, 219), (194, 218, 224), (190, 219, 228), (186, 220, 232), + (182, 221, 236), (179, 222, 241), (175, 224, 245), (171, 225, 249), + (167, 226, 254), (166, 226, 255), (167, 225, 250), (169, 223, 244), + (170, 222, 239), (172, 221, 234), (173, 220, 228), (175, 218, 223), + (176, 217, 218), (178, 216, 213), (179, 215, 207), (181, 213, 202), + (182, 212, 197), (184, 211, 191), (185, 210, 186), (187, 208, 181), + (188, 207, 175), (190, 206, 170), (191, 205, 165), (193, 203, 158), + (195, 202, 160), (197, 202, 163), (199, 201, 165), (201, 200, 168), + (203, 199, 170), (205, 198, 172), (207, 198, 175), (209, 197, 177), + (211, 196, 180), (213, 195, 182), (215, 195, 184), (217, 194, 187), + (219, 193, 189), (221, 192, 192), (223, 192, 194), (225, 191, 196), + (227, 190, 199), (230, 189, 202), (230, 190, 201), (230, 191, 199), + (231, 192, 198), (231, 192, 196), (231, 193, 195), (232, 194, 193), + (232, 195, 192), (232, 196, 191), (233, 197, 189), (233, 198, 188), + (233, 199, 186), (234, 200, 185), (234, 201, 184), (234, 202, 182), + (235, 203, 181), (235, 204, 179), (235, 205, 178), (236, 206, 176) + ), + + +// 97 multi_color_1 from ron1.ugr (classylady & ron) +((255, 0, 0), (173, 0, 55), (118, 0, 91), (64, 0, 128), + (50, 55, 155), (36, 110, 183), (29, 137, 196), (23, 164, 210), + (0, 255, 255), (0, 255, 200), (0, 255, 145), (0, 255, 72), + (0, 255, 0), (55, 255, 27), (110, 255, 55), (137, 255, 68), + (164, 255, 82), (255, 255, 128), (255, 227, 155), (255, 200, 183), + (255, 173, 210), (255, 146, 237), (255, 137, 246), (255, 128, 255), + (145, 128, 228), (72, 128, 210), (0, 128, 192), (27, 100, 151), + (55, 73, 110), (68, 59, 89), (82, 46, 68), (110, 18, 27), + (128, 0, 0), (183, 55, 55), (210, 82, 82), (237, 110, 110), + (218, 132, 119), (200, 155, 128), (172, 169, 128), (145, 183, 128), + (0, 255, 128), (55, 227, 114), (110, 200, 100), (164, 173, 86), + (219, 146, 73), (237, 137, 68), (255, 128, 64), (200, 155, 50), + (145, 183, 36), (36, 237, 9), (18, 225, 18), (0, 214, 28), + (0, 173, 55), (0, 132, 82), (0, 98, 105), (0, 64, 128), + (55, 92, 183), (82, 105, 210), (110, 119, 237), (119, 109, 225), + (128, 100, 214), (128, 86, 193), (128, 73, 173), (128, 46, 132), + (128, 18, 91), (155, 0, 78), (182, 0, 91), (210, 0, 105), + (232, 0, 116), (255, 0, 128), (255, 28, 100), (255, 55, 73), + (255, 110, 18), (227, 119, 9), (200, 128, 0), (145, 128, 0), + (91, 128, 0), (63, 128, 0), (36, 128, 0), (0, 128, 0), + (0, 128, 14), (0, 128, 41), (0, 114, 73), (0, 100, 105), + (0, 86, 125), (0, 73, 146), (0, 46, 187), (0, 18, 228), + (0, 0, 235), (0, 0, 214), (0, 0, 194), (0, 0, 183), + (0, 0, 173), (0, 0, 160), (28, 0, 153), (55, 0, 146), + (82, 0, 139), (128, 0, 155), (128, 0, 182), (128, 0, 210), + (128, 0, 223), (128, 0, 237), (128, 0, 255), (128, 28, 200), + (128, 82, 91), (128, 105, 45), (128, 128, 0), (128, 128, 7), + (128, 128, 14), (128, 128, 28), (128, 128, 41), (128, 128, 64), + (155, 128, 105), (210, 128, 187), (223, 128, 207), (237, 128, 228), + (255, 128, 255), (228, 155, 200), (200, 183, 145), (173, 210, 91), + (128, 255, 0), (155, 255, 0), (183, 255, 0), (196, 255, 0), + (210, 255, 0), (255, 255, 0), (200, 228, 28), (145, 200, 55), + (91, 173, 82), (0, 128, 128), (27, 114, 114), (55, 100, 100), + (110, 73, 73), (164, 46, 46), (255, 0, 0), (255, 28, 14), + (255, 82, 41), (255, 105, 52), (255, 128, 64), (227, 141, 64), + (200, 155, 64), (145, 183, 64), (91, 210, 64), (36, 237, 64), + (0, 255, 64), (55, 200, 146), (68, 186, 166), (82, 173, 187), + (128, 128, 255), (155, 100, 228), (183, 73, 200), (210, 46, 173), + (255, 0, 128), (255, 14, 135), (255, 28, 142), (255, 55, 156), + (255, 82, 169), (255, 110, 183), (255, 128, 192), (200, 128, 178), + (145, 128, 164), (0, 128, 128), (14, 141, 141), (28, 155, 155), + (55, 183, 183), (82, 210, 210), (110, 237, 237), (128, 255, 255), + (128, 200, 200), (128, 186, 186), (128, 173, 173), (128, 146, 146), + (128, 128, 128), (100, 155, 100), (73, 183, 73), (46, 210, 46), + (0, 255, 0), (47, 245, 11), (95, 234, 21), (142, 224, 32), + (189, 214, 43), (220, 207, 50), (214, 175, 85), (209, 142, 120), + (198, 77, 191), (196, 66, 202), (194, 56, 214), (206, 91, 198), + (218, 125, 183), (230, 160, 167), (250, 217, 141), (238, 200, 113), + (227, 183, 84), (215, 167, 56), (204, 150, 28), (196, 139, 9), + (186, 159, 35), (176, 179, 61), (166, 199, 87), (156, 219, 113), + (150, 232, 130), (129, 214, 108), (107, 195, 86), (86, 177, 64), + (51, 147, 28), (87, 138, 72), (123, 129, 116), (159, 119, 159), + (195, 110, 203), (219, 104, 232), (210, 88, 224), (202, 72, 217), + (193, 56, 209), (185, 40, 201), (179, 30, 196), (171, 75, 206), + (163, 119, 216), (155, 164, 226), (141, 238, 243), (130, 233, 221), + (120, 229, 199), (109, 224, 177), (98, 220, 155), (91, 217, 141), + (120, 194, 122), (150, 171, 104), (179, 149, 85), (209, 126, 66), + (228, 111, 54), (223, 126, 59), (219, 141, 63), (214, 156, 68), + (207, 181, 75), (194, 184, 77), (180, 188, 80), (167, 191, 82), + (154, 195, 84), (145, 197, 86), (133, 196, 102), (121, 196, 118), + (108, 195, 134), (96, 195, 150), (88, 194, 160), (90, 184, 165), + (92, 174, 171), (94, 164, 176), (98, 148, 185), (100, 131, 192), + (102, 113, 198), (104, 96, 205), (107, 78, 212), (108, 67, 216), + (120, 72, 211), (132, 76, 206), (143, 81, 201), (163, 89, 193) + ), + +// 98 oranges +((255, 0, 0), (253, 10, 2), (251, 15, 3), (250, 20, 4), + (249, 25, 5), (248, 30, 6), (247, 32, 6), (247, 35, 7), + (244, 45, 8), (243, 50, 9), (242, 55, 10), (241, 60, 11), + (240, 65, 12), (238, 70, 13), (237, 75, 14), (236, 77, 14), + (236, 80, 14), (234, 90, 16), (232, 95, 17), (231, 100, 18), + (230, 105, 19), (229, 110, 20), (228, 112, 20), (228, 115, 21), + (225, 125, 22), (224, 130, 23), (223, 135, 24), (222, 140, 25), + (221, 145, 26), (220, 147, 26), (219, 150, 27), (218, 155, 28), + (217, 160, 28), (216, 157, 30), (216, 155, 31), (216, 154, 32), + (215, 152, 32), (215, 151, 33), (215, 150, 33), (215, 150, 34), + (214, 146, 36), (213, 145, 37), (213, 144, 38), (213, 142, 38), + (213, 140, 39), (212, 139, 39), (212, 139, 40), (212, 138, 41), + (212, 136, 42), (211, 133, 44), (210, 131, 44), (210, 130, 45), + (210, 128, 46), (210, 127, 47), (209, 126, 47), (209, 126, 48), + (209, 122, 49), (208, 121, 50), (208, 120, 51), (207, 118, 52), + (207, 116, 53), (207, 115, 53), (207, 115, 54), (206, 114, 55), + (206, 112, 55), (209, 113, 52), (210, 113, 50), (212, 114, 48), + (213, 114, 47), (214, 114, 46), (215, 115, 45), (217, 115, 43), + (220, 116, 40), (221, 116, 38), (223, 117, 36), (224, 117, 34), + (226, 118, 33), (226, 118, 32), (227, 119, 31), (229, 119, 29), + (230, 120, 28), (234, 121, 24), (235, 121, 22), (237, 122, 21), + (237, 122, 20), (238, 122, 19), (240, 123, 17), (241, 123, 15), + (244, 124, 12), (245, 124, 10), (247, 125, 9), (248, 125, 8), + (249, 126, 7), (250, 126, 5), (252, 127, 3), (253, 127, 2), + (255, 128, 0), (250, 126, 0), (247, 124, 0), (245, 123, 0), + (244, 122, 0), (243, 122, 0), (240, 120, 0), (238, 119, 0), + (233, 117, 0), (230, 115, 0), (228, 114, 0), (226, 113, 0), + (225, 113, 0), (223, 112, 0), (220, 110, 0), (218, 109, 0), + (216, 108, 0), (211, 106, 0), (209, 105, 0), (208, 104, 0), + (206, 103, 0), (203, 102, 0), (201, 100, 0), (198, 99, 0), + (193, 97, 0), (190, 95, 0), (188, 94, 0), (187, 93, 0), + (186, 93, 0), (183, 92, 0), (181, 90, 0), (178, 89, 0), + (176, 88, 0), (181, 95, 8), (182, 96, 10), (183, 98, 12), + (186, 101, 16), (188, 104, 21), (191, 108, 25), (193, 111, 29), + (198, 118, 37), (200, 121, 41), (203, 124, 45), (204, 125, 47), + (206, 127, 50), (208, 131, 54), (211, 134, 58), (213, 137, 62), + (216, 140, 66), (220, 147, 74), (221, 148, 76), (223, 150, 78), + (225, 154, 82), (228, 157, 87), (230, 160, 91), (233, 163, 95), + (238, 170, 103), (239, 171, 105), (240, 173, 107), (243, 177, 111), + (245, 180, 116), (248, 183, 120), (250, 186, 124), (253, 190, 128), + (255, 193, 132), (255, 186, 128), (255, 184, 127), (255, 182, 127), + (255, 178, 125), (255, 174, 123), (255, 171, 121), (255, 167, 119), + (255, 160, 116), (255, 158, 115), (255, 156, 114), (255, 152, 112), + (255, 148, 110), (255, 145, 108), (255, 141, 107), (255, 137, 105), + (255, 134, 103), (255, 130, 101), (255, 126, 99), (255, 122, 98), + (255, 119, 96), (255, 115, 94), (255, 111, 92), (255, 107, 90), + (255, 100, 87), (255, 98, 86), (255, 96, 85), (255, 93, 83), + (255, 89, 81), (255, 85, 79), (255, 81, 78), (255, 78, 76), + (255, 74, 74), (254, 77, 75), (252, 79, 76), (251, 82, 76), + (250, 84, 77), (248, 87, 78), (247, 90, 79), (245, 92, 79), + (244, 95, 80), (243, 97, 81), (241, 100, 81), (240, 103, 82), + (238, 105, 83), (237, 108, 84), (236, 110, 84), (234, 113, 85), + (233, 116, 86), (232, 118, 86), (230, 121, 87), (229, 123, 88), + (228, 126, 89), (226, 128, 89), (225, 131, 90), (223, 134, 91), + (222, 136, 91), (221, 139, 92), (219, 141, 93), (218, 144, 94), + (216, 147, 94), (215, 149, 95), (214, 152, 96), (212, 154, 96), + (211, 157, 97), (211, 158, 99), (212, 159, 100), (212, 160, 102), + (213, 161, 104), (213, 162, 105), (214, 163, 107), (214, 164, 108), + (214, 165, 110), (215, 166, 112), (215, 167, 113), (216, 168, 115), + (216, 169, 116), (217, 170, 118), (217, 171, 120), (218, 172, 121), + (218, 173, 123), (218, 174, 125), (219, 175, 126), (219, 176, 128), + (220, 177, 130), (220, 178, 131), (221, 179, 133), (221, 180, 134), + (221, 181, 136), (222, 182, 138), (222, 183, 139), (223, 184, 141), + (223, 185, 142), (224, 186, 144), (224, 187, 146), (225, 189, 149) + ), + +// 99 multi_color_2 +((255, 0, 0), (211, 22, 22), (189, 33, 33), (167, 44, 44), + (145, 55, 55), (124, 66, 66), (113, 71, 71), (102, 77, 77), + (58, 99, 99), (29, 113, 113), (0, 128, 128), (0, 139, 139), + (0, 150, 150), (0, 161, 161), (0, 172, 172), (0, 177, 177), + (0, 183, 183), (0, 204, 204), (0, 215, 215), (0, 226, 226), + (0, 237, 237), (0, 248, 248), (0, 251, 251), (0, 255, 255), + (44, 240, 255), (66, 232, 255), (88, 224, 255), (109, 216, 255), + (131, 209, 255), (142, 205, 255), (153, 201, 255), (175, 194, 255), + (197, 186, 255), (255, 166, 255), (233, 162, 255), (211, 159, 255), + (189, 156, 255), (167, 153, 255), (156, 151, 255), (145, 150, 255), + (102, 143, 255), (80, 140, 255), (58, 137, 255), (36, 133, 255), + (14, 130, 255), (7, 129, 255), (0, 128, 255), (11, 128, 255), + (22, 128, 255), (44, 128, 255), (55, 128, 255), (66, 128, 255), + (77, 128, 255), (88, 128, 255), (93, 128, 255), (99, 128, 255), + (121, 128, 255), (119, 133, 244), (117, 139, 233), (106, 150, 211), + (95, 161, 189), (89, 166, 178), (84, 172, 167), (73, 183, 145), + (62, 193, 124), (40, 215, 80), (29, 226, 58), (18, 237, 36), + (9, 246, 18), (0, 255, 0), (22, 233, 0), (44, 211, 0), + (88, 167, 0), (109, 145, 0), (131, 124, 0), (153, 102, 0), + (175, 80, 0), (186, 69, 0), (197, 58, 0), (219, 36, 0), + (241, 14, 0), (233, 11, 0), (211, 22, 0), (189, 33, 0), + (178, 38, 0), (167, 44, 0), (145, 55, 0), (124, 66, 0), + (80, 88, 0), (58, 99, 0), (36, 110, 0), (25, 115, 0), + (14, 121, 0), (0, 128, 0), (10, 117, 0), (20, 106, 0), + (30, 95, 0), (50, 73, 0), (60, 62, 0), (70, 51, 0), + (75, 45, 0), (80, 40, 0), (90, 29, 0), (101, 18, 0), + (129, 0, 0), (140, 0, 0), (152, 0, 0), (158, 0, 0), + (164, 0, 0), (175, 0, 0), (187, 0, 0), (199, 0, 0), + (210, 0, 0), (234, 0, 0), (240, 0, 0), (246, 0, 0), + (253, 0, 0), (242, 22, 11), (232, 44, 22), (221, 66, 33), + (199, 110, 55), (188, 131, 66), (178, 153, 77), (172, 164, 82), + (167, 175, 88), (156, 197, 99), (146, 219, 110), (135, 241, 121), + (128, 255, 128), (128, 233, 150), (128, 227, 155), (128, 222, 161), + (128, 211, 172), (128, 200, 183), (128, 190, 193), (128, 179, 204), + (128, 157, 226), (128, 142, 240), (128, 128, 255), (122, 128, 244), + (117, 128, 233), (106, 128, 211), (95, 128, 189), (84, 128, 167), + (73, 128, 145), (51, 128, 102), (45, 128, 91), (40, 128, 80), + (29, 128, 58), (18, 128, 36), (7, 128, 14), (0, 128, 0), + (44, 132, 26), (55, 132, 32), (66, 133, 38), (88, 135, 51), + (110, 137, 64), (131, 139, 77), (153, 141, 90), (175, 142, 102), + (197, 144, 115), (255, 149, 149), (255, 147, 147), (255, 146, 146), + (255, 144, 144), (255, 141, 141), (255, 139, 139), (255, 136, 136), + (255, 131, 131), (255, 129, 129), (255, 128, 128), (255, 126, 126), + (255, 123, 123), (255, 121, 121), (255, 119, 119), (255, 119, 131), + (255, 118, 142), (255, 118, 154), (255, 117, 166), (255, 117, 177), + (255, 116, 189), (255, 116, 201), (255, 115, 212), (255, 115, 224), + (255, 114, 248), (255, 113, 251), (255, 113, 255), (255, 107, 237), + (255, 101, 219), (255, 95, 201), (255, 90, 183), (255, 84, 165), + (255, 78, 147), (255, 72, 129), (255, 66, 111), (255, 60, 93), + (255, 55, 75), (255, 45, 45), (250, 41, 58), (246, 37, 72), + (241, 33, 85), (237, 30, 99), (232, 26, 112), (228, 22, 126), + (223, 18, 139), (219, 14, 153), (214, 10, 166), (209, 6, 180), + (205, 2, 193), (202, 0, 202), (204, 0, 185), (206, 0, 167), + (207, 0, 150), (209, 0, 133), (211, 0, 115), (213, 0, 98), + (215, 0, 80), (216, 0, 63), (218, 0, 46), (220, 0, 28), + (222, 0, 11), (223, 0, 0), (217, 12, 6), (212, 24, 12), + (206, 36, 19), (200, 47, 25), (195, 59, 31), (189, 71, 37), + (183, 83, 43), (178, 95, 50), (172, 107, 56), (166, 119, 62), + (157, 138, 72), (157, 126, 66), (158, 114, 60), (158, 102, 53), + (159, 91, 47), (160, 79, 41), (160, 67, 35), (161, 55, 29), + (161, 43, 22), (162, 31, 16), (163, 19, 10), (163, 8, 4), + (164, 0, 0), (160, 0, 0), (156, 0, 0), (152, 0, 0), + (148, 0, 0), (144, 0, 0), (140, 0, 0), (136, 0, 0), + (132, 0, 0), (128, 0, 0), (124, 0, 0), (117, 0, 0) + ), + +// 100 rw-yellow-orange +((255, 128, 0), (255, 134, 0), (255, 137, 0), (255, 140, 0), + (255, 143, 0), (255, 146, 0), (255, 147, 0), (255, 149, 0), + (255, 155, 0), (255, 158, 0), (255, 161, 0), (255, 164, 0), + (255, 167, 0), (255, 170, 0), (255, 173, 0), (255, 174, 0), + (255, 176, 0), (255, 182, 0), (255, 185, 0), (255, 188, 0), + (255, 190, 0), (255, 193, 0), (255, 194, 0), (255, 196, 0), + (255, 202, 0), (255, 205, 0), (255, 208, 0), (255, 211, 0), + (255, 214, 0), (255, 215, 0), (255, 217, 0), (255, 220, 0), + (255, 223, 0), (255, 229, 0), (255, 232, 0), (255, 235, 0), + (255, 238, 0), (255, 241, 0), (255, 242, 0), (255, 244, 0), + (255, 250, 0), (255, 251, 1), (255, 252, 2), (255, 249, 3), + (255, 246, 4), (255, 244, 5), (255, 243, 6), (255, 240, 8), + (255, 237, 9), (255, 231, 12), (255, 228, 13), (255, 225, 15), + (255, 222, 16), (255, 219, 18), (255, 217, 19), (255, 216, 20), + (255, 210, 22), (255, 207, 24), (255, 204, 26), (255, 201, 27), + (255, 198, 28), (255, 196, 29), (255, 195, 30), (255, 192, 32), + (255, 190, 33), (255, 184, 36), (255, 181, 37), (255, 178, 39), + (255, 176, 39), (255, 175, 40), (255, 172, 42), (255, 169, 44), + (255, 163, 46), (255, 160, 48), (255, 157, 50), (255, 154, 51), + (255, 151, 52), (255, 149, 53), (255, 148, 54), (255, 145, 56), + (255, 142, 57), (255, 136, 60), (255, 133, 61), (255, 130, 63), + (255, 129, 63), (255, 128, 64), (255, 131, 66), (255, 134, 67), + (255, 140, 70), (255, 143, 71), (255, 146, 73), (255, 147, 73), + (255, 149, 74), (255, 152, 76), (255, 155, 78), (255, 158, 79), + (255, 161, 80), (255, 167, 84), (255, 170, 85), (255, 173, 86), + (255, 174, 87), (255, 176, 88), (255, 179, 90), (255, 182, 91), + (255, 188, 94), (255, 190, 95), (255, 193, 97), (255, 194, 97), + (255, 196, 98), (255, 199, 100), (255, 202, 102), (255, 205, 103), + (255, 208, 104), (255, 214, 108), (255, 215, 108), (255, 217, 109), + (255, 220, 110), (255, 223, 112), (255, 226, 114), (255, 229, 115), + (255, 235, 118), (255, 238, 119), (255, 241, 121), (255, 242, 121), + (255, 244, 122), (255, 247, 124), (255, 250, 126), (255, 253, 127), + (255, 255, 128), (255, 251, 126), (255, 250, 125), (255, 249, 125), + (255, 247, 124), (255, 245, 123), (255, 243, 122), (255, 241, 121), + (255, 237, 119), (255, 235, 117), (255, 233, 116), (255, 232, 115), + (255, 231, 115), (255, 229, 114), (255, 227, 113), (255, 225, 112), + (255, 223, 111), (255, 219, 109), (255, 218, 108), (255, 217, 108), + (255, 215, 107), (255, 213, 106), (255, 211, 105), (255, 209, 104), + (255, 205, 102), (255, 204, 101), (255, 203, 101), (255, 201, 100), + (255, 199, 98), (255, 197, 97), (255, 195, 96), (255, 193, 95), + (255, 190, 94), (255, 186, 92), (255, 185, 91), (255, 184, 91), + (255, 182, 90), (255, 180, 89), (255, 178, 88), (255, 176, 87), + (255, 172, 85), (255, 170, 84), (255, 169, 83), (254, 170, 81), + (253, 171, 79), (252, 171, 77), (250, 172, 75), (249, 173, 73), + (248, 174, 71), (247, 175, 69), (246, 176, 67), (245, 177, 65), + (244, 177, 64), (242, 178, 62), (241, 179, 60), (240, 180, 58), + (238, 182, 54), (237, 182, 53), (237, 183, 52), (235, 184, 50), + (234, 184, 48), (233, 185, 46), (232, 186, 44), (231, 187, 42), + (230, 188, 40), (229, 189, 38), (227, 190, 36), (226, 190, 34), + (225, 191, 32), (224, 192, 30), (223, 193, 29), (222, 194, 27), + (221, 195, 25), (219, 196, 23), (218, 197, 21), (217, 197, 19), + (216, 198, 17), (215, 199, 15), (214, 200, 13), (213, 201, 11), + (211, 202, 9), (210, 203, 7), (209, 203, 5), (208, 204, 3), + (207, 205, 1), (206, 206, 0), (206, 203, 0), (206, 199, 0), + (206, 196, 0), (206, 193, 0), (205, 189, 0), (205, 186, 0), + (205, 183, 0), (205, 179, 0), (205, 176, 0), (205, 173, 0), + (204, 169, 0), (204, 166, 0), (204, 163, 0), (204, 159, 0), + (204, 156, 0), (203, 153, 0), (203, 149, 0), (203, 146, 0), + (203, 143, 0), (203, 139, 0), (202, 136, 0), (202, 133, 0), + (202, 129, 0), (202, 126, 0), (202, 123, 0), (202, 119, 0), + (201, 116, 0), (201, 113, 0), (201, 109, 0), (201, 106, 0), + (201, 103, 0), (200, 100, 0), (200, 96, 0), (200, 93, 0), + (200, 90, 0), (200, 86, 0), (199, 83, 0), (199, 80, 0), + (199, 76, 0), (199, 73, 0), (199, 70, 0), (198, 64, 0) + ), + +// 101 rw-multi-color-2 +((128, 64, 64), (153, 52, 52), (165, 45, 45), (178, 39, 39), + (190, 32, 32), (202, 26, 26), (208, 23, 23), (215, 20, 20), + (240, 8, 8), (247, 10, 4), (255, 12, 0), (255, 25, 0), + (255, 38, 0), (255, 50, 0), (255, 62, 0), (255, 68, 0), + (255, 75, 0), (255, 100, 0), (255, 114, 0), (255, 128, 0), + (242, 122, 0), (230, 116, 0), (224, 112, 0), (218, 109, 0), + (193, 97, 0), (180, 90, 0), (168, 84, 0), (155, 78, 0), + (143, 72, 0), (135, 68, 0), (128, 64, 0), (116, 70, 0), + (103, 76, 0), (78, 89, 0), (65, 95, 0), (53, 102, 0), + (40, 108, 0), (28, 114, 0), (22, 117, 0), (16, 120, 0), + (0, 128, 12), (0, 128, 25), (0, 128, 38), (0, 128, 50), + (0, 128, 62), (0, 128, 68), (0, 128, 75), (0, 128, 88), + (0, 128, 100), (0, 128, 125), (0, 134, 132), (0, 140, 140), + (0, 152, 152), (0, 165, 165), (0, 171, 171), (0, 178, 178), + (0, 202, 202), (0, 214, 214), (0, 227, 227), (0, 241, 241), + (0, 255, 255), (6, 255, 249), (12, 255, 243), (25, 255, 230), + (38, 255, 218), (62, 255, 193), (75, 255, 180), (88, 255, 168), + (94, 255, 162), (100, 255, 156), (112, 255, 143), (128, 255, 128), + (103, 255, 153), (90, 255, 165), (78, 255, 178), (65, 255, 190), + (53, 255, 202), (46, 255, 208), (40, 255, 215), (28, 255, 227), + (16, 255, 240), (0, 243, 255), (0, 230, 255), (0, 218, 255), + (0, 211, 255), (0, 205, 255), (0, 193, 255), (0, 181, 255), + (0, 156, 255), (0, 143, 255), (0, 131, 255), (0, 129, 255), + (0, 128, 255), (12, 128, 255), (25, 128, 255), (38, 128, 255), + (50, 128, 255), (75, 128, 255), (87, 128, 255), (100, 128, 255), + (106, 128, 255), (112, 128, 255), (128, 128, 255), (128, 116, 236), + (128, 90, 199), (128, 78, 180), (128, 66, 162), (128, 59, 152), + (128, 53, 143), (128, 40, 124), (128, 28, 106), (128, 16, 87), + (128, 0, 64), (153, 25, 89), (159, 31, 95), (165, 38, 102), + (178, 50, 114), (190, 62, 126), (202, 75, 139), (215, 88, 152), + (240, 112, 176), (247, 114, 181), (255, 116, 186), (255, 109, 183), + (255, 103, 180), (255, 90, 173), (255, 78, 167), (255, 66, 161), + (255, 53, 154), (255, 28, 142), (255, 22, 139), (255, 16, 136), + (255, 3, 130), (255, 0, 128), (243, 0, 140), (230, 0, 153), + (205, 0, 178), (193, 0, 190), (181, 0, 202), (174, 0, 208), + (168, 0, 215), (156, 0, 227), (143, 0, 240), (128, 0, 255), + (116, 12, 236), (90, 38, 199), (84, 44, 189), (78, 50, 180), + (66, 62, 162), (53, 75, 143), (40, 88, 124), (28, 100, 106), + (0, 128, 64), (12, 128, 64), (25, 128, 64), (50, 128, 64), + (75, 128, 64), (100, 128, 64), (125, 128, 64), (149, 128, 64), + (174, 128, 64), (224, 128, 64), (239, 128, 64), (255, 128, 64), + (243, 116, 58), (230, 103, 52), (218, 90, 45), (205, 78, 39), + (181, 53, 26), (174, 46, 23), (168, 40, 20), (156, 28, 14), + (143, 16, 8), (131, 3, 2), (128, 0, 0), (140, 25, 25), + (153, 50, 50), (165, 75, 75), (178, 100, 100), (190, 125, 125), + (202, 149, 149), (215, 174, 174), (227, 199, 199), (240, 224, 224), + (250, 250, 250), (247, 247, 247), (245, 245, 245), (241, 241, 241), + (236, 236, 236), (231, 231, 231), (226, 226, 226), (222, 222, 222), + (217, 217, 217), (212, 212, 212), (206, 206, 206), (186, 186, 211), + (166, 166, 216), (146, 146, 220), (126, 126, 225), (105, 105, 230), + (85, 85, 235), (65, 65, 239), (45, 45, 244), (25, 25, 249), + (0, 0, 255), (12, 6, 230), (25, 12, 205), (38, 19, 180), + (50, 25, 155), (62, 31, 130), (75, 38, 106), (88, 44, 81), + (100, 50, 56), (112, 56, 31), (125, 62, 6), (128, 64, 0), + (116, 70, 12), (103, 76, 25), (90, 83, 38), (78, 89, 50), + (66, 95, 62), (53, 102, 75), (40, 108, 88), (28, 114, 100), + (16, 120, 112), (0, 128, 128), (0, 128, 134), (0, 128, 140), + (0, 128, 147), (0, 128, 153), (0, 128, 159), (0, 128, 166), + (0, 128, 172), (0, 128, 178), (0, 128, 184), (0, 128, 192), + (25, 140, 173), (50, 153, 154), (75, 165, 136), (100, 178, 117), + (125, 190, 98), (149, 202, 80), (174, 215, 61), (199, 227, 42), + (224, 240, 23), (255, 255, 0), (255, 243, 12), (255, 230, 25), + (255, 218, 38), (255, 205, 50), (255, 193, 62), (255, 181, 75), + (255, 168, 88), (255, 156, 100), (255, 143, 112), (255, 128, 128) + ), + +// 102 rw-blue-with-red +((0, 0, 255), (0, 0, 243), (0, 0, 237), (0, 0, 231), + (0, 0, 225), (0, 0, 219), (0, 0, 216), (0, 0, 213), + (0, 0, 202), (0, 0, 196), (0, 0, 190), (0, 0, 184), + (0, 0, 178), (0, 0, 172), (0, 0, 166), (0, 0, 163), + (0, 0, 160), (16, 0, 172), (24, 0, 178), (32, 0, 184), + (40, 0, 190), (48, 0, 196), (52, 0, 199), (56, 0, 202), + (72, 0, 213), (80, 0, 219), (88, 0, 225), (96, 0, 231), + (104, 0, 237), (108, 0, 240), (112, 0, 243), (120, 0, 249), + (128, 0, 255), (128, 16, 255), (128, 24, 255), (128, 32, 255), + (128, 40, 255), (128, 48, 255), (128, 52, 255), (128, 56, 255), + (128, 72, 255), (128, 80, 255), (128, 88, 255), (128, 96, 255), + (128, 104, 255), (128, 108, 255), (128, 112, 255), (128, 120, 255), + (128, 128, 255), (112, 128, 247), (104, 128, 243), (96, 128, 239), + (88, 128, 235), (80, 128, 231), (76, 128, 229), (72, 128, 227), + (56, 128, 220), (48, 128, 216), (40, 128, 212), (32, 128, 208), + (24, 128, 204), (20, 128, 202), (16, 128, 200), (8, 128, 196), + (0, 128, 192), (0, 128, 200), (0, 128, 204), (0, 128, 208), + (0, 128, 210), (0, 128, 212), (0, 128, 216), (0, 128, 220), + (0, 128, 227), (0, 128, 231), (0, 128, 235), (0, 128, 239), + (0, 128, 243), (0, 128, 245), (0, 128, 247), (0, 128, 251), + (0, 128, 255), (16, 128, 247), (24, 128, 243), (32, 128, 239), + (36, 128, 237), (40, 128, 235), (48, 128, 231), (56, 128, 227), + (72, 128, 220), (80, 128, 216), (88, 128, 212), (92, 128, 210), + (96, 128, 208), (104, 128, 204), (112, 128, 200), (120, 128, 196), + (128, 128, 192), (144, 128, 192), (152, 128, 192), (160, 128, 192), + (164, 128, 192), (168, 128, 192), (176, 128, 192), (184, 128, 192), + (199, 128, 192), (207, 128, 192), (215, 128, 192), (219, 128, 192), + (223, 128, 192), (231, 128, 192), (239, 128, 192), (247, 128, 192), + (255, 128, 192), (255, 128, 200), (255, 128, 202), (255, 128, 204), + (255, 128, 208), (255, 128, 212), (255, 128, 216), (255, 128, 220), + (255, 128, 227), (255, 128, 231), (255, 128, 235), (255, 128, 237), + (255, 128, 239), (255, 128, 243), (255, 128, 247), (255, 128, 251), + (255, 128, 255), (255, 112, 255), (255, 108, 255), (255, 104, 255), + (255, 96, 255), (255, 88, 255), (255, 80, 255), (255, 72, 255), + (255, 56, 255), (255, 48, 255), (255, 40, 255), (255, 36, 255), + (255, 32, 255), (255, 24, 255), (255, 16, 255), (255, 8, 255), + (255, 0, 255), (255, 0, 239), (255, 0, 235), (255, 0, 231), + (255, 0, 223), (255, 0, 215), (255, 0, 207), (255, 0, 199), + (255, 0, 184), (255, 0, 180), (255, 0, 176), (255, 0, 168), + (255, 0, 160), (255, 0, 152), (255, 0, 144), (255, 0, 136), + (255, 0, 128), (223, 16, 144), (215, 20, 148), (207, 24, 152), + (191, 32, 160), (175, 40, 168), (159, 48, 176), (143, 56, 184), + (112, 72, 199), (104, 76, 203), (96, 80, 207), (80, 88, 215), + (64, 96, 223), (48, 104, 231), (32, 112, 239), (16, 120, 247), + (0, 128, 255), (0, 128, 251), (0, 128, 247), (0, 128, 243), + (0, 128, 239), (0, 128, 235), (0, 128, 231), (0, 128, 227), + (0, 128, 220), (0, 128, 218), (0, 128, 216), (0, 128, 212), + (0, 128, 208), (0, 128, 204), (0, 128, 200), (0, 128, 196), + (0, 128, 192), (8, 128, 196), (16, 128, 200), (24, 128, 204), + (32, 128, 208), (40, 128, 212), (48, 128, 216), (56, 128, 220), + (64, 128, 224), (72, 128, 227), (80, 128, 231), (88, 128, 235), + (96, 128, 239), (104, 128, 243), (112, 128, 247), (120, 128, 251), + (128, 128, 255), (120, 120, 255), (112, 112, 255), (104, 104, 255), + (96, 96, 255), (88, 88, 255), (80, 80, 255), (72, 72, 255), + (64, 64, 255), (56, 56, 255), (48, 48, 255), (40, 40, 255), + (32, 32, 255), (24, 24, 255), (16, 16, 255), (8, 8, 255), + (0, 0, 255), (0, 0, 249), (0, 0, 243), (0, 0, 237), + (0, 0, 231), (0, 0, 225), (0, 0, 219), (0, 0, 213), + (0, 0, 208), (0, 0, 202), (0, 0, 196), (0, 0, 190), + (0, 0, 184), (0, 0, 178), (0, 0, 172), (0, 0, 166), + (0, 0, 160), (8, 0, 166), (16, 0, 172), (24, 0, 178), + (32, 0, 184), (40, 0, 190), (48, 0, 196), (56, 0, 202), + (64, 0, 208), (72, 0, 213), (80, 0, 219), (88, 0, 225), + (96, 0, 231), (104, 0, 237), (112, 0, 243), (128, 0, 255) + ), + +// 103 rw-blue-with-red-2 +((0, 128, 255), (18, 119, 237), (27, 114, 228), (36, 110, 219), + (45, 105, 210), (54, 101, 201), (58, 98, 196), (63, 96, 192), + (81, 88, 174), (90, 83, 165), (99, 78, 156), (108, 74, 147), + (117, 70, 138), (125, 65, 129), (134, 60, 121), (138, 58, 116), + (143, 56, 112), (161, 47, 94), (170, 42, 85), (179, 38, 76), + (188, 33, 67), (197, 29, 58), (201, 26, 53), (206, 24, 49), + (224, 16, 31), (233, 11, 22), (242, 6, 13), (246, 5, 11), + (251, 4, 9), (248, 6, 13), (246, 9, 18), (242, 14, 27), + (237, 18, 36), (228, 27, 54), (223, 31, 63), (219, 36, 72), + (214, 40, 81), (210, 45, 90), (208, 47, 94), (206, 50, 99), + (197, 58, 117), (192, 63, 125), (188, 68, 134), (183, 72, 143), + (179, 76, 152), (177, 78, 156), (175, 81, 161), (170, 86, 170), + (166, 90, 179), (157, 99, 197), (152, 103, 206), (148, 108, 215), + (143, 112, 224), (139, 117, 233), (136, 119, 237), (134, 122, 242), + (132, 128, 251), (136, 128, 246), (141, 128, 242), (145, 128, 237), + (150, 128, 233), (152, 128, 230), (155, 128, 228), (159, 128, 224), + (164, 128, 219), (173, 128, 210), (177, 128, 205), (182, 128, 201), + (184, 128, 199), (186, 128, 197), (191, 128, 192), (195, 128, 188), + (204, 128, 179), (208, 128, 174), (213, 128, 170), (217, 128, 165), + (222, 128, 161), (224, 128, 159), (226, 128, 157), (231, 128, 152), + (235, 128, 148), (244, 128, 139), (248, 128, 134), (253, 128, 130), + (254, 128, 129), (255, 128, 128), (255, 128, 132), (255, 128, 137), + (255, 128, 146), (255, 128, 150), (255, 128, 155), (255, 128, 157), + (255, 128, 159), (255, 128, 164), (255, 128, 168), (255, 128, 173), + (255, 128, 177), (255, 128, 186), (255, 128, 190), (255, 128, 195), + (255, 128, 197), (255, 128, 199), (255, 128, 204), (255, 128, 208), + (255, 128, 217), (255, 128, 221), (255, 128, 226), (255, 128, 228), + (255, 128, 231), (255, 128, 235), (255, 128, 240), (255, 128, 244), + (255, 128, 249), (246, 124, 255), (241, 121, 255), (237, 119, 255), + (228, 114, 255), (219, 110, 255), (210, 106, 255), (201, 101, 255), + (183, 92, 255), (174, 87, 255), (165, 83, 255), (160, 80, 255), + (156, 78, 255), (147, 74, 255), (138, 70, 255), (129, 65, 255), + (121, 60, 255), (103, 52, 255), (98, 49, 255), (94, 47, 255), + (85, 42, 255), (76, 38, 255), (67, 34, 255), (58, 29, 255), + (40, 20, 255), (31, 15, 255), (22, 11, 255), (17, 8, 255), + (13, 6, 255), (4, 2, 255), (0, 0, 255), (9, 0, 251), + (18, 0, 246), (36, 0, 237), (40, 0, 235), (45, 0, 233), + (54, 0, 228), (63, 0, 224), (72, 0, 219), (81, 0, 215), + (99, 0, 206), (103, 0, 203), (108, 0, 201), (117, 0, 197), + (126, 0, 192), (134, 0, 188), (143, 0, 184), (152, 0, 179), + (161, 0, 175), (179, 0, 166), (183, 0, 163), (188, 0, 161), + (197, 0, 157), (206, 0, 152), (215, 0, 148), (224, 0, 143), + (242, 0, 134), (248, 0, 131), (255, 0, 128), (246, 4, 132), + (237, 9, 137), (228, 14, 141), (219, 18, 146), (210, 22, 150), + (201, 27, 155), (192, 32, 159), (183, 36, 164), (174, 40, 168), + (165, 45, 173), (156, 50, 177), (147, 54, 182), (138, 58, 186), + (121, 68, 195), (116, 70, 197), (112, 72, 199), (103, 76, 204), + (94, 81, 208), (85, 86, 213), (76, 90, 217), (67, 94, 222), + (58, 99, 226), (49, 104, 231), (40, 108, 235), (31, 112, 240), + (22, 117, 244), (13, 122, 249), (4, 126, 253), (0, 128, 255), + (9, 129, 251), (18, 130, 248), (27, 131, 244), (36, 132, 241), + (45, 133, 237), (54, 134, 234), (63, 135, 230), (72, 136, 227), + (81, 137, 223), (90, 138, 220), (99, 139, 216), (108, 140, 213), + (117, 141, 209), (126, 142, 206), (134, 143, 202), (143, 144, 199), + (152, 144, 195), (161, 145, 192), (170, 146, 188), (179, 147, 185), + (188, 148, 181), (197, 149, 178), (206, 150, 174), (215, 151, 171), + (224, 152, 167), (233, 153, 164), (242, 154, 160), (255, 155, 155), + (252, 155, 159), (248, 155, 162), (245, 155, 166), (242, 155, 169), + (238, 155, 173), (235, 155, 176), (231, 156, 180), (228, 156, 183), + (225, 156, 187), (221, 156, 190), (218, 156, 194), (214, 156, 197), + (211, 156, 201), (208, 157, 204), (204, 157, 208), (201, 157, 211), + (198, 157, 215), (194, 157, 218), (191, 157, 222), (188, 157, 225), + (184, 158, 229), (181, 158, 232), (177, 158, 236), (174, 158, 239), + (171, 158, 243), (167, 158, 246), (164, 158, 250), (159, 159, 255) + ), + +// 104 rw-blues-3 +((0, 0, 255), (9, 9, 255), (13, 13, 255), (18, 18, 255), + (22, 22, 255), (27, 27, 255), (29, 29, 255), (32, 32, 255), + (40, 40, 255), (45, 45, 255), (50, 50, 255), (54, 54, 255), + (58, 58, 255), (63, 63, 255), (68, 68, 255), (70, 70, 255), + (72, 72, 255), (81, 81, 255), (85, 85, 255), (90, 90, 255), + (94, 94, 255), (99, 99, 255), (101, 101, 255), (104, 104, 255), + (112, 112, 255), (117, 117, 255), (122, 122, 255), (123, 123, 253), + (124, 124, 252), (121, 121, 250), (119, 119, 248), (114, 114, 245), + (110, 110, 242), (101, 101, 235), (96, 96, 231), (92, 92, 228), + (87, 87, 225), (83, 83, 222), (80, 80, 220), (78, 78, 218), + (70, 70, 212), (65, 65, 208), (60, 60, 205), (56, 56, 201), + (52, 52, 198), (49, 49, 196), (47, 47, 195), (42, 42, 192), + (38, 38, 188), (29, 29, 182), (24, 24, 178), (20, 20, 175), + (15, 15, 171), (11, 11, 168), (8, 8, 166), (6, 6, 165), + (0, 9, 163), (0, 18, 166), (0, 27, 170), (0, 36, 173), + (0, 45, 177), (0, 49, 178), (0, 54, 180), (0, 63, 183), + (0, 72, 187), (0, 90, 193), (0, 99, 196), (0, 108, 200), + (0, 112, 201), (0, 117, 203), (0, 126, 207), (0, 134, 210), + (0, 152, 217), (0, 161, 220), (0, 170, 223), (0, 179, 226), + (0, 188, 230), (0, 192, 231), (0, 197, 233), (0, 206, 237), + (0, 215, 240), (0, 233, 247), (0, 242, 250), (0, 251, 254), + (0, 253, 254), (0, 255, 255), (0, 248, 251), (0, 242, 246), + (0, 228, 237), (0, 221, 232), (0, 215, 228), (0, 211, 226), + (0, 208, 224), (0, 201, 219), (0, 195, 215), (0, 188, 210), + (0, 181, 206), (0, 168, 197), (0, 161, 192), (0, 154, 188), + (0, 151, 186), (0, 148, 184), (0, 141, 179), (0, 134, 175), + (0, 121, 166), (0, 114, 161), (0, 107, 157), (0, 104, 154), + (0, 101, 152), (0, 94, 148), (0, 87, 143), (0, 80, 139), + (0, 74, 134), (0, 66, 130), (0, 67, 131), (0, 68, 132), + (0, 71, 135), (0, 73, 137), (0, 75, 139), (0, 78, 142), + (0, 82, 146), (0, 84, 148), (0, 86, 150), (0, 87, 151), + (0, 89, 153), (0, 91, 155), (0, 93, 157), (0, 96, 160), + (0, 98, 162), (0, 102, 166), (0, 103, 167), (0, 104, 168), + (0, 107, 171), (0, 109, 173), (0, 111, 175), (0, 114, 178), + (0, 118, 182), (0, 120, 184), (0, 122, 186), (0, 123, 187), + (0, 125, 189), (0, 127, 191), (0, 128, 192), (0, 128, 194), + (0, 128, 196), (0, 128, 201), (0, 128, 202), (0, 128, 203), + (0, 128, 205), (0, 128, 208), (0, 128, 210), (0, 128, 212), + (0, 128, 216), (0, 128, 217), (0, 128, 219), (0, 128, 221), + (0, 128, 223), (0, 128, 225), (0, 128, 227), (0, 128, 230), + (0, 128, 232), (0, 128, 236), (0, 128, 237), (0, 128, 239), + (0, 128, 241), (0, 128, 243), (0, 128, 245), (0, 128, 247), + (0, 128, 252), (0, 128, 253), (0, 128, 255), (4, 132, 255), + (9, 137, 255), (14, 141, 255), (18, 146, 255), (22, 150, 255), + (27, 155, 255), (32, 159, 255), (36, 164, 255), (40, 168, 255), + (45, 173, 255), (50, 177, 255), (54, 182, 255), (58, 186, 255), + (68, 195, 255), (70, 197, 255), (72, 199, 255), (76, 204, 255), + (81, 208, 255), (86, 213, 255), (90, 217, 255), (94, 222, 255), + (99, 226, 255), (104, 231, 255), (108, 235, 255), (112, 240, 255), + (117, 244, 255), (122, 249, 255), (126, 253, 255), (128, 255, 255), + (128, 246, 255), (128, 237, 255), (128, 228, 255), (128, 219, 255), + (128, 210, 255), (128, 201, 255), (128, 192, 255), (128, 183, 255), + (128, 174, 255), (128, 165, 255), (128, 156, 255), (128, 147, 255), + (128, 138, 255), (128, 129, 255), (128, 121, 255), (128, 112, 255), + (128, 103, 255), (128, 94, 255), (128, 85, 255), (128, 76, 255), + (128, 67, 255), (128, 58, 255), (128, 49, 255), (128, 40, 255), + (128, 31, 255), (128, 22, 255), (128, 13, 255), (128, 0, 255), + (128, 4, 253), (128, 9, 251), (128, 14, 248), (128, 18, 246), + (128, 22, 244), (128, 27, 242), (128, 32, 239), (128, 36, 237), + (128, 40, 235), (128, 45, 233), (128, 50, 231), (128, 54, 228), + (128, 58, 226), (128, 63, 224), (128, 68, 222), (128, 72, 220), + (128, 76, 217), (128, 81, 215), (128, 86, 213), (128, 90, 211), + (128, 94, 208), (128, 99, 206), (128, 104, 204), (128, 108, 202), + (128, 112, 200), (128, 117, 197), (128, 122, 195), (128, 128, 192) + ), + +// 105 rw-reds-pinks-blues +((255, 0, 0), (255, 0, 55), (255, 0, 91), (255, 0, 128), + (255, 27, 142), (255, 55, 156), (255, 68, 162), (255, 82, 169), + (255, 128, 192), (255, 128, 178), (255, 128, 164), (255, 128, 146), + (255, 128, 128), (255, 128, 142), (255, 128, 156), (255, 128, 162), + (255, 128, 169), (255, 128, 192), (200, 155, 151), (145, 183, 110), + (90, 210, 68), (36, 237, 27), (18, 246, 13), (0, 255, 0), + (110, 200, 110), (182, 164, 182), (255, 128, 255), (254, 134, 229), + (253, 140, 203), (252, 143, 189), (252, 146, 176), (251, 152, 150), + (250, 156, 133), (252, 89, 76), (253, 55, 47), (254, 22, 19), + (254, 25, 37), (255, 28, 55), (255, 41, 82), (255, 55, 110), + (255, 128, 255), (255, 128, 227), (255, 128, 200), (255, 128, 173), + (255, 128, 146), (255, 128, 137), (255, 128, 128), (255, 100, 128), + (255, 73, 128), (255, 18, 128), (255, 23, 121), (255, 28, 114), + (255, 55, 100), (255, 82, 87), (255, 105, 75), (255, 128, 64), + (255, 73, 92), (255, 45, 105), (255, 18, 119), (227, 9, 137), + (200, 0, 155), (172, 0, 169), (145, 0, 183), (91, 0, 210), + (36, 0, 237), (55, 28, 228), (109, 55, 200), (164, 82, 173), + (209, 105, 150), (255, 128, 128), (255, 100, 128), (255, 73, 128), + (255, 18, 128), (255, 9, 114), (255, 0, 100), (255, 0, 73), + (255, 0, 46), (255, 0, 32), (255, 0, 18), (255, 0, 0), + (255, 28, 14), (255, 82, 41), (255, 105, 59), (255, 128, 78), + (255, 128, 85), (255, 128, 92), (255, 128, 105), (255, 128, 119), + (255, 128, 155), (255, 128, 182), (255, 128, 210), (255, 128, 223), + (255, 128, 237), (255, 128, 255), (255, 155, 228), (255, 183, 200), + (255, 210, 173), (255, 200, 100), (255, 145, 73), (255, 91, 46), + (255, 63, 32), (255, 36, 18), (255, 0, 0), (255, 28, 55), + (255, 82, 164), (255, 105, 209), (255, 128, 255), (255, 128, 241), + (255, 128, 228), (255, 128, 200), (255, 128, 173), (255, 128, 128), + (255, 100, 128), (255, 46, 128), (255, 32, 128), (255, 18, 128), + (255, 0, 128), (255, 28, 114), (255, 55, 100), (255, 82, 87), + (255, 128, 64), (255, 128, 105), (255, 128, 146), (255, 128, 166), + (255, 128, 187), (255, 128, 255), (200, 155, 255), (145, 183, 255), + (91, 210, 255), (0, 255, 255), (27, 241, 241), (55, 228, 228), + (110, 200, 200), (164, 173, 173), (255, 128, 128), (255, 128, 155), + (255, 128, 210), (255, 128, 232), (255, 128, 255), (255, 114, 241), + (255, 100, 228), (255, 73, 200), (255, 46, 173), (255, 18, 146), + (255, 0, 128), (255, 55, 156), (255, 68, 162), (255, 82, 169), + (255, 128, 192), (255, 128, 178), (255, 128, 164), (255, 128, 151), + (255, 128, 128), (255, 128, 121), (255, 128, 114), (255, 128, 100), + (255, 128, 87), (255, 128, 73), (255, 128, 64), (215, 116, 104), + (174, 104, 145), (67, 71, 252), (87, 77, 232), (107, 83, 212), + (148, 95, 171), (188, 108, 131), (229, 120, 90), (255, 128, 64), + (255, 128, 146), (255, 128, 166), (255, 128, 187), (255, 128, 228), + (255, 128, 255), (255, 100, 228), (255, 73, 200), (255, 46, 173), + (255, 0, 128), (255, 28, 128), (255, 55, 128), (255, 82, 128), + (255, 110, 128), (255, 128, 128), (255, 128, 155), (255, 128, 183), + (255, 128, 237), (255, 128, 246), (255, 128, 255), (255, 128, 241), + (255, 128, 228), (255, 128, 214), (255, 128, 192), (234, 155, 181), + (212, 182, 170), (191, 209, 159), (169, 236, 148), (155, 254, 141), + (176, 199, 111), (198, 145, 80), (219, 90, 50), (241, 36, 20), + (255, 0, 0), (255, 0, 28), (255, 0, 55), (255, 0, 82), + (255, 0, 128), (255, 28, 128), (255, 55, 128), (255, 82, 128), + (255, 110, 128), (255, 128, 128), (255, 128, 155), (255, 128, 183), + (255, 128, 210), (255, 128, 237), (255, 128, 255), (255, 100, 228), + (255, 73, 200), (255, 46, 173), (255, 0, 128), (255, 28, 100), + (255, 55, 73), (255, 82, 46), (255, 110, 18), (255, 128, 0), + (228, 114, 0), (200, 100, 0), (173, 87, 0), (146, 73, 0), + (128, 64, 0), (155, 78, 28), (183, 92, 55), (210, 105, 82), + (255, 128, 128), (255, 100, 128), (255, 73, 128), (255, 46, 128), + (255, 18, 128), (255, 0, 128), (255, 28, 142), (255, 55, 156), + (255, 82, 169), (255, 110, 183), (255, 128, 192), (255, 128, 178), + (255, 128, 164), (255, 128, 151), (255, 128, 128), (255, 100, 100), + (255, 73, 73), (255, 46, 46), (255, 18, 18), (255, 0, 0), + (255, 28, 55), (255, 55, 110), (255, 82, 164), (255, 128, 255) + ), + +// 106 rw-browns-greens-reds-bule +((128, 255, 0), (73, 200, 28), (36, 164, 46), (0, 128, 64), + (55, 141, 91), (110, 155, 119), (137, 162, 132), (164, 169, 146), + (255, 191, 191), (255, 153, 153), (255, 115, 115), (255, 65, 65), + (255, 15, 15), (255, 39, 39), (255, 64, 64), (255, 76, 76), + (255, 88, 88), (255, 128, 128), (200, 128, 114), (145, 128, 100), + (90, 128, 86), (36, 128, 73), (18, 128, 68), (0, 128, 64), + (110, 128, 119), (182, 128, 155), (255, 128, 192), (255, 101, 178), + (255, 75, 165), (255, 61, 158), (255, 48, 152), (255, 21, 139), + (255, 4, 130), (200, 2, 102), (173, 1, 87), (146, 1, 73), + (123, 28, 68), (100, 55, 64), (86, 82, 64), (73, 110, 64), + (0, 255, 64), (32, 200, 66), (64, 145, 68), (96, 90, 70), + (128, 36, 73), (138, 18, 73), (149, 0, 74), (147, 21, 59), + (146, 42, 45), (143, 84, 16), (154, 94, 37), (166, 104, 59), + (190, 110, 112), (215, 117, 166), (235, 122, 210), (255, 128, 255), + (208, 117, 147), (184, 112, 92), (161, 107, 38), (152, 99, 22), + (143, 91, 6), (141, 85, 7), (140, 79, 9), (136, 67, 13), + (133, 55, 16), (128, 56, 21), (125, 64, 23), (123, 73, 26), + (120, 80, 28), (118, 87, 31), (141, 110, 53), (163, 132, 75), + (208, 177, 120), (219, 164, 112), (230, 151, 105), (237, 109, 76), + (244, 68, 48), (247, 47, 33), (250, 27, 19), (255, 0, 0), + (255, 28, 0), (255, 82, 0), (246, 91, 0), (237, 100, 0), + (227, 86, 0), (218, 73, 0), (200, 46, 0), (182, 18, 0), + (188, 5, 5), (206, 10, 10), (225, 15, 15), (234, 17, 17), + (243, 20, 20), (255, 23, 23), (249, 48, 29), (243, 73, 35), + (238, 98, 40), (230, 148, 65), (232, 156, 80), (234, 165, 95), + (235, 169, 102), (236, 173, 110), (237, 179, 120), (220, 159, 99), + (185, 120, 56), (170, 104, 38), (156, 88, 20), (157, 80, 26), + (158, 72, 33), (160, 55, 46), (162, 39, 59), (165, 12, 81), + (183, 41, 104), (218, 98, 151), (226, 112, 163), (235, 126, 175), + (247, 145, 190), (239, 127, 186), (231, 108, 183), (223, 90, 179), + (210, 60, 173), (194, 60, 180), (179, 60, 188), (171, 60, 192), + (164, 60, 196), (139, 61, 209), (157, 70, 175), (174, 80, 140), + (192, 89, 106), (221, 105, 49), (212, 99, 67), (203, 93, 86), + (186, 81, 123), (168, 68, 161), (139, 48, 222), (157, 48, 205), + (192, 48, 171), (206, 48, 157), (221, 49, 143), (224, 52, 148), + (227, 56, 153), (233, 63, 163), (238, 70, 173), (244, 77, 183), + (248, 82, 189), (251, 102, 135), (252, 107, 121), (253, 112, 108), + (255, 128, 64), (255, 142, 85), (255, 156, 107), (255, 170, 128), + (255, 193, 164), (248, 179, 146), (242, 165, 129), (230, 138, 94), + (217, 110, 58), (204, 82, 23), (196, 64, 0), (203, 82, 15), + (211, 101, 29), (230, 149, 68), (232, 146, 74), (235, 144, 81), + (241, 140, 94), (246, 135, 107), (251, 131, 120), (255, 128, 128), + (145, 183, 183), (118, 196, 196), (91, 210, 210), (36, 237, 237), + (0, 255, 255), (55, 255, 228), (110, 255, 200), (164, 255, 173), + (255, 255, 128), (228, 255, 146), (201, 255, 165), (174, 254, 183), + (148, 254, 201), (130, 253, 213), (151, 227, 222), (172, 200, 230), + (214, 147, 247), (221, 138, 250), (228, 130, 253), (207, 157, 232), + (185, 183, 212), (164, 210, 191), (129, 254, 157), (156, 240, 151), + (183, 226, 145), (210, 211, 139), (236, 197, 133), (254, 188, 129), + (250, 202, 129), (246, 216, 129), (242, 231, 129), (238, 245, 129), + (235, 254, 129), (212, 254, 133), (189, 254, 137), (167, 254, 141), + (129, 254, 148), (129, 254, 167), (129, 254, 185), (129, 254, 204), + (129, 254, 223), (129, 254, 235), (155, 244, 213), (182, 235, 190), + (208, 225, 168), (235, 215, 146), (252, 209, 131), (227, 218, 132), + (201, 226, 134), (176, 235, 135), (134, 249, 137), (145, 243, 126), + (157, 237, 115), (168, 231, 103), (180, 225, 92), (187, 221, 85), + (165, 212, 114), (143, 202, 144), (121, 193, 173), (98, 183, 203), + (84, 177, 222), (93, 166, 229), (103, 156, 236), (112, 145, 243), + (128, 128, 255), (121, 149, 211), (114, 170, 168), (107, 191, 124), + (100, 212, 81), (96, 226, 52), (119, 217, 54), (143, 208, 57), + (166, 199, 59), (190, 190, 61), (205, 184, 63), (213, 182, 75), + (222, 179, 88), (230, 177, 100), (244, 173, 121), (192, 191, 109), + (139, 208, 97), (87, 226, 84), (34, 243, 72), (0, 255, 64), + (0, 255, 105), (0, 255, 146), (0, 255, 187), (0, 255, 255) + ), + +// 107 rw-browns-pinks-reds-blues +((128, 0, 0), (147, 0, 0), (156, 0, 0), (166, 0, 0), + (175, 0, 0), (185, 0, 0), (189, 0, 0), (194, 0, 0), + (212, 23, 23), (218, 46, 46), (224, 69, 69), (230, 92, 92), + (236, 116, 116), (242, 139, 139), (248, 162, 162), (251, 176, 176), + (255, 191, 191), (255, 148, 148), (255, 127, 127), (255, 106, 106), + (255, 84, 84), (255, 63, 63), (255, 52, 52), (255, 42, 42), + (255, 29, 29), (255, 42, 42), (255, 56, 56), (255, 69, 69), + (255, 83, 83), (255, 90, 90), (255, 97, 97), (255, 111, 111), + (255, 124, 124), (255, 128, 143), (255, 128, 158), (255, 128, 174), + (255, 128, 189), (255, 128, 205), (255, 128, 212), (255, 128, 220), + (255, 128, 255), (255, 128, 247), (255, 128, 240), (255, 128, 232), + (255, 128, 224), (255, 128, 220), (255, 128, 217), (255, 128, 209), + (255, 128, 202), (255, 113, 184), (255, 98, 176), (255, 83, 169), + (255, 68, 161), (255, 53, 154), (255, 45, 150), (255, 38, 147), + (255, 4, 130), (239, 3, 122), (224, 3, 114), (208, 2, 106), + (193, 2, 98), (185, 2, 94), (178, 2, 90), (163, 2, 82), + (147, 1, 74), (128, 0, 64), (143, 18, 81), (159, 37, 98), + (166, 46, 106), (174, 55, 114), (190, 73, 131), (205, 91, 148), + (236, 128, 182), (239, 130, 184), (242, 133, 187), (229, 114, 171), + (216, 96, 156), (210, 87, 148), (204, 78, 141), (191, 60, 125), + (178, 41, 109), (149, 0, 74), (148, 12, 66), (147, 24, 58), + (147, 30, 53), (147, 36, 49), (146, 47, 41), (145, 59, 33), + (143, 83, 16), (142, 87, 11), (141, 92, 7), (140, 89, 8), + (140, 87, 9), (138, 81, 10), (137, 75, 11), (136, 70, 13), + (135, 64, 14), (132, 52, 17), (133, 54, 16), (134, 57, 15), + (134, 60, 14), (135, 64, 14), (137, 70, 12), (139, 76, 10), + (142, 89, 7), (144, 96, 5), (146, 103, 3), (145, 99, 4), + (144, 96, 5), (142, 89, 7), (141, 83, 8), (139, 76, 10), + (137, 69, 12), (133, 56, 16), (132, 51, 17), (131, 47, 18), + (129, 52, 20), (128, 57, 21), (126, 62, 23), (125, 66, 24), + (122, 76, 27), (120, 81, 29), (118, 87, 31), (124, 93, 37), + (131, 100, 43), (143, 112, 56), (156, 125, 68), (169, 138, 81), + (182, 151, 93), (207, 176, 118), (213, 182, 124), (220, 189, 131), + (223, 192, 134), (227, 169, 118), (231, 146, 102), (235, 122, 85), + (242, 76, 53), (246, 52, 36), (250, 29, 20), (252, 14, 10), + (255, 0, 0), (255, 21, 21), (255, 43, 43), (255, 64, 64), + (255, 85, 85), (255, 128, 128), (255, 138, 138), (255, 149, 149), + (255, 176, 176), (245, 155, 155), (234, 133, 133), (224, 112, 112), + (204, 69, 69), (198, 58, 58), (193, 48, 48), (183, 27, 27), + (170, 0, 0), (180, 3, 3), (191, 6, 6), (201, 8, 8), + (211, 11, 11), (232, 17, 17), (237, 18, 18), (242, 19, 19), + (252, 22, 22), (255, 23, 23), (252, 37, 26), (248, 51, 30), + (242, 79, 36), (240, 86, 37), (239, 93, 39), (235, 107, 43), + (232, 121, 46), (228, 139, 50), (229, 144, 58), (230, 149, 67), + (231, 154, 75), (232, 158, 84), (233, 163, 92), (235, 168, 101), + (236, 173, 109), (237, 179, 120), (227, 168, 108), (217, 157, 96), + (198, 135, 72), (193, 129, 65), (188, 124, 59), (178, 113, 47), + (168, 102, 35), (156, 88, 20), (157, 79, 27), (158, 70, 35), + (159, 60, 42), (160, 51, 50), (161, 42, 57), (163, 33, 64), + (164, 24, 72), (165, 14, 79), (165, 12, 81), (175, 28, 94), + (185, 44, 107), (195, 60, 121), (205, 76, 134), (215, 93, 147), + (225, 109, 160), (235, 125, 173), (247, 145, 190), (243, 135, 188), + (238, 124, 186), (234, 114, 184), (229, 104, 182), (225, 94, 180), + (220, 83, 178), (216, 73, 176), (210, 60, 173), (201, 60, 177), + (193, 60, 182), (184, 60, 186), (176, 60, 190), (167, 60, 195), + (158, 60, 199), (150, 60, 204), (139, 61, 209), (149, 66, 190), + (159, 72, 170), (169, 77, 151), (179, 82, 132), (189, 88, 112), + (199, 93, 93), (209, 98, 73), (218, 104, 54), (221, 105, 49), + (211, 98, 70), (201, 91, 91), (191, 84, 112), (181, 77, 133), + (171, 70, 154), (161, 64, 175), (151, 57, 196), (139, 48, 222), + (149, 48, 212), (159, 48, 203), (169, 48, 193), (179, 48, 184), + (189, 48, 174), (199, 48, 165), (209, 48, 155), (221, 49, 143), + (224, 53, 149), (228, 57, 154), (231, 61, 160), (234, 65, 165), + (237, 69, 171), (241, 73, 176), (244, 77, 182), (248, 82, 189) + ), + +// 108 rw-reds-greens-blues-pinks-yellows-browns +((255, 0, 0), (215, 40, 10), (195, 60, 15), (175, 80, 20), + (155, 100, 25), (135, 120, 30), (125, 129, 32), (116, 139, 35), + (76, 179, 45), (56, 199, 50), (36, 219, 55), (18, 232, 64), + (0, 245, 74), (0, 235, 84), (0, 225, 94), (0, 220, 99), + (0, 215, 104), (0, 195, 124), (0, 185, 134), (0, 176, 144), + (0, 166, 154), (0, 156, 164), (0, 151, 169), (0, 146, 174), + (0, 128, 192), (20, 128, 197), (40, 128, 202), (60, 128, 207), + (80, 128, 212), (90, 128, 214), (100, 128, 217), (120, 128, 222), + (139, 128, 226), (179, 128, 236), (199, 128, 241), (219, 128, 246), + (237, 128, 250), (255, 128, 255), (245, 128, 255), (235, 128, 255), + (195, 128, 255), (175, 128, 255), (155, 128, 255), (135, 128, 255), + (116, 128, 255), (106, 128, 255), (96, 128, 255), (76, 128, 255), + (56, 128, 255), (16, 128, 255), (8, 133, 245), (0, 138, 235), + (0, 148, 215), (0, 158, 195), (0, 163, 185), (0, 168, 175), + (0, 188, 135), (0, 197, 115), (0, 207, 96), (0, 217, 76), + (0, 227, 56), (0, 232, 46), (0, 237, 36), (0, 247, 16), + (0, 255, 0), (40, 255, 20), (60, 255, 30), (80, 255, 40), + (90, 255, 45), (100, 255, 50), (120, 255, 60), (139, 255, 70), + (179, 255, 90), (199, 255, 100), (219, 255, 110), (237, 250, 119), + (255, 245, 128), (255, 240, 128), (255, 235, 128), (255, 225, 128), + (255, 215, 128), (255, 195, 128), (255, 185, 128), (255, 176, 128), + (255, 171, 128), (255, 166, 128), (255, 156, 128), (255, 146, 128), + (255, 128, 128), (235, 128, 123), (215, 128, 118), (205, 128, 115), + (195, 128, 113), (175, 128, 108), (155, 128, 103), (135, 128, 98), + (116, 128, 93), (76, 128, 83), (56, 128, 78), (36, 128, 73), + (26, 128, 70), (16, 128, 68), (0, 128, 64), (10, 123, 59), + (30, 113, 49), (40, 108, 44), (50, 103, 39), (55, 100, 36), + (60, 98, 34), (70, 93, 29), (80, 88, 24), (90, 83, 19), + (100, 78, 14), (120, 68, 4), (124, 66, 2), (128, 64, 0), + (128, 69, 15), (128, 74, 30), (128, 79, 45), (128, 84, 60), + (128, 94, 90), (128, 99, 105), (128, 104, 120), (128, 106, 127), + (128, 109, 135), (128, 114, 150), (128, 119, 165), (128, 124, 185), + (128, 128, 192), (148, 108, 162), (153, 103, 154), (158, 98, 147), + (168, 88, 132), (178, 78, 117), (188, 68, 102), (197, 58, 87), + (217, 38, 57), (227, 28, 42), (237, 18, 27), (246, 9, 13), + (255, 0, 0), (255, 10, 0), (255, 20, 0), (255, 30, 0), + (255, 40, 0), (255, 60, 0), (255, 65, 0), (255, 70, 0), + (255, 80, 0), (255, 90, 0), (255, 100, 0), (255, 110, 0), + (255, 128, 0), (250, 128, 10), (245, 128, 20), (235, 128, 40), + (225, 128, 60), (215, 128, 80), (205, 128, 100), (195, 128, 120), + (186, 128, 139), (166, 128, 179), (161, 128, 189), (156, 128, 199), + (146, 128, 219), (136, 128, 239), (128, 128, 255), (137, 137, 246), + (154, 155, 228), (158, 159, 223), (163, 164, 218), (171, 173, 209), + (180, 182, 200), (189, 191, 191), (197, 200, 182), (206, 210, 173), + (215, 219, 164), (223, 228, 154), (232, 237, 145), (239, 244, 138), + (240, 235, 127), (242, 226, 116), (243, 217, 106), (244, 208, 95), + (246, 190, 73), (247, 185, 68), (248, 181, 63), (249, 172, 52), + (250, 162, 41), (252, 153, 30), (253, 144, 19), (254, 135, 9), + (255, 128, 0), (235, 138, 5), (215, 148, 10), (195, 158, 15), + (175, 168, 20), (155, 178, 25), (135, 188, 30), (116, 197, 35), + (96, 207, 40), (76, 217, 45), (56, 227, 50), (36, 237, 55), + (0, 255, 64), (20, 255, 69), (40, 255, 74), (60, 255, 79), + (80, 255, 84), (100, 255, 89), (120, 255, 94), (139, 255, 99), + (159, 255, 104), (179, 255, 109), (199, 255, 114), (219, 255, 119), + (239, 255, 124), (255, 255, 128), (255, 245, 123), (255, 235, 118), + (255, 225, 113), (255, 215, 108), (255, 205, 103), (255, 195, 98), + (255, 186, 93), (255, 176, 88), (255, 166, 83), (255, 156, 78), + (255, 146, 73), (255, 136, 68), (255, 128, 64), (255, 128, 74), + (255, 128, 84), (255, 128, 94), (255, 128, 104), (255, 128, 114), + (255, 128, 124), (255, 128, 134), (255, 128, 144), (255, 128, 154), + (255, 128, 164), (255, 128, 174), (255, 128, 184), (255, 128, 192), + (255, 118, 187), (255, 108, 182), (255, 98, 177), (255, 88, 172), + (255, 78, 167), (255, 68, 162), (255, 58, 157), (255, 48, 152), + (255, 38, 147), (255, 28, 142), (255, 18, 137), (255, 0, 128) + ), + +// 109 rw-greens-light-to-dark +((0, 255, 0), (0, 237, 18), (0, 228, 27), (0, 219, 36), + (0, 210, 45), (0, 201, 54), (0, 196, 58), (0, 192, 63), + (0, 175, 81), (0, 166, 90), (0, 157, 99), (0, 148, 108), + (0, 139, 117), (4, 138, 118), (9, 137, 119), (13, 141, 114), + (18, 146, 110), (36, 164, 92), (45, 173, 83), (54, 182, 74), + (63, 190, 65), (72, 199, 56), (76, 203, 51), (81, 208, 47), + (99, 226, 29), (108, 235, 20), (117, 244, 11), (118, 245, 7), + (119, 246, 4), (114, 241, 6), (110, 237, 9), (101, 228, 14), + (92, 219, 18), (74, 201, 27), (65, 192, 31), (56, 184, 36), + (47, 175, 40), (38, 166, 45), (33, 161, 47), (29, 157, 50), + (11, 139, 58), (10, 138, 63), (9, 137, 68), (18, 146, 73), + (27, 155, 78), (31, 159, 80), (36, 164, 82), (45, 173, 86), + (54, 182, 91), (72, 199, 100), (81, 208, 104), (90, 217, 109), + (99, 226, 113), (108, 235, 118), (112, 239, 120), (117, 244, 122), + (119, 248, 119), (110, 241, 110), (101, 234, 101), (92, 227, 92), + (83, 221, 83), (78, 217, 78), (74, 214, 74), (65, 207, 65), + (56, 200, 56), (38, 186, 38), (29, 179, 29), (20, 172, 20), + (15, 168, 15), (11, 165, 11), (2, 159, 2), (0, 157, 0), + (19, 167, 5), (29, 172, 7), (39, 178, 10), (48, 183, 12), + (58, 188, 14), (62, 190, 15), (67, 193, 17), (77, 198, 19), + (87, 203, 22), (106, 213, 26), (115, 218, 28), (125, 224, 31), + (131, 227, 32), (137, 230, 34), (137, 227, 37), (138, 224, 40), + (138, 218, 45), (138, 215, 48), (139, 213, 51), (139, 211, 52), + (140, 210, 54), (140, 207, 56), (141, 204, 59), (141, 201, 62), + (141, 198, 65), (142, 193, 71), (139, 192, 71), (136, 192, 71), + (132, 193, 70), (129, 194, 69), (122, 197, 66), (115, 199, 64), + (101, 204, 59), (94, 206, 56), (87, 209, 54), (83, 210, 52), + (80, 212, 51), (73, 214, 49), (66, 217, 46), (59, 219, 44), + (52, 222, 41), (45, 223, 44), (46, 221, 47), (47, 220, 50), + (49, 218, 56), (51, 216, 62), (53, 213, 69), (55, 211, 75), + (59, 206, 87), (61, 204, 93), (63, 202, 99), (64, 200, 102), + (65, 199, 105), (67, 197, 111), (69, 195, 118), (71, 193, 124), + (71, 192, 125), (80, 197, 113), (82, 198, 110), (85, 199, 107), + (89, 201, 101), (94, 204, 94), (98, 206, 88), (103, 208, 82), + (112, 213, 70), (116, 215, 64), (121, 218, 58), (123, 219, 55), + (126, 220, 52), (130, 222, 45), (136, 225, 38), (130, 227, 36), + (124, 229, 35), (112, 232, 31), (108, 233, 30), (105, 234, 30), + (99, 236, 28), (93, 237, 26), (87, 239, 24), (81, 241, 23), + (69, 244, 19), (66, 245, 18), (63, 246, 18), (56, 248, 16), + (49, 250, 14), (52, 245, 23), (55, 239, 32), (58, 234, 41), + (61, 228, 50), (66, 218, 68), (67, 215, 72), (69, 212, 77), + (72, 207, 86), (75, 201, 95), (78, 196, 104), (81, 190, 113), + (86, 180, 131), (88, 176, 136), (90, 173, 142), (84, 170, 137), + (77, 167, 131), (71, 164, 126), (65, 160, 120), (58, 157, 115), + (52, 154, 109), (46, 151, 104), (39, 148, 98), (33, 145, 93), + (27, 141, 87), (20, 138, 82), (14, 135, 76), (8, 132, 71), + (0, 136, 68), (0, 140, 70), (0, 144, 72), (0, 152, 76), + (0, 161, 80), (0, 169, 84), (0, 177, 88), (0, 185, 93), + (0, 193, 97), (0, 201, 101), (0, 210, 105), (0, 218, 109), + (0, 226, 113), (0, 234, 117), (0, 242, 121), (0, 244, 122), + (8, 245, 126), (15, 246, 130), (23, 247, 135), (30, 247, 139), + (38, 248, 143), (46, 249, 147), (53, 250, 152), (61, 250, 156), + (68, 251, 160), (76, 252, 164), (84, 253, 168), (91, 253, 173), + (99, 254, 177), (108, 255, 182), (108, 249, 177), (108, 243, 172), + (108, 237, 167), (108, 231, 162), (108, 225, 157), (108, 219, 152), + (108, 213, 147), (108, 207, 142), (108, 201, 137), (108, 195, 132), + (108, 188, 127), (108, 182, 122), (108, 176, 117), (109, 169, 111), + (114, 174, 106), (119, 178, 102), (123, 183, 97), (128, 187, 92), + (133, 192, 88), (138, 196, 83), (142, 201, 79), (147, 206, 74), + (152, 210, 69), (157, 215, 65), (162, 219, 60), (166, 224, 55), + (171, 228, 51), (177, 234, 45), (165, 235, 42), (152, 237, 39), + (140, 238, 36), (127, 240, 32), (115, 241, 29), (102, 243, 26), + (90, 244, 23), (77, 246, 20), (65, 247, 17), (53, 249, 13), + (40, 250, 10), (28, 252, 7), (15, 253, 4), (0, 255, 0) + ), + +// 110 rw-blues-reds-purples +((0, 128, 255), (32, 144, 255), (53, 154, 255), (74, 165, 255), + (89, 172, 255), (105, 180, 255), (113, 184, 255), (121, 188, 255), + (147, 201, 255), (157, 206, 255), (167, 211, 255), (180, 217, 255), + (193, 224, 255), (151, 203, 241), (110, 183, 228), (89, 172, 221), + (69, 162, 214), (0, 128, 192), (39, 148, 205), (79, 168, 219), + (119, 187, 232), (159, 207, 246), (172, 213, 250), (185, 220, 255), + (165, 210, 255), (151, 203, 255), (138, 197, 255), (129, 192, 255), + (121, 188, 255), (116, 185, 255), (112, 183, 255), (104, 179, 255), + (98, 176, 255), (83, 169, 255), (76, 165, 255), (69, 161, 255), + (63, 158, 255), (58, 156, 255), (55, 154, 255), (52, 153, 255), + (36, 146, 255), (28, 142, 255), (21, 138, 255), (13, 134, 255), + (5, 131, 255), (2, 129, 255), (0, 128, 255), (0, 123, 245), + (0, 118, 236), (0, 108, 216), (0, 104, 209), (0, 101, 202), + (0, 97, 194), (0, 93, 187), (0, 90, 180), (0, 87, 174), + (24, 116, 209), (35, 130, 226), (47, 145, 244), (57, 154, 247), + (68, 163, 251), (75, 167, 249), (82, 172, 247), (95, 180, 243), + (108, 189, 239), (97, 180, 225), (77, 166, 214), (58, 153, 204), + (42, 142, 195), (26, 131, 187), (30, 142, 189), (35, 152, 190), + (43, 173, 193), (50, 179, 196), (58, 186, 199), (69, 191, 204), + (81, 197, 209), (87, 199, 212), (93, 202, 215), (101, 206, 218), + (87, 194, 205), (60, 169, 180), (62, 167, 177), (64, 165, 175), + (77, 173, 183), (90, 181, 191), (117, 198, 207), (143, 214, 223), + (134, 210, 219), (107, 195, 205), (81, 180, 191), (68, 172, 184), + (55, 165, 177), (38, 155, 168), (69, 164, 180), (100, 173, 192), + (131, 182, 204), (159, 179, 214), (135, 160, 203), (112, 142, 193), + (100, 132, 188), (89, 123, 183), (74, 111, 176), (85, 120, 181), + (106, 138, 192), (115, 145, 196), (124, 153, 201), (118, 147, 196), + (112, 142, 192), (99, 131, 183), (87, 119, 174), (66, 101, 159), + (97, 127, 176), (159, 178, 209), (174, 190, 217), (190, 203, 225), + (210, 220, 236), (177, 200, 214), (144, 180, 192), (111, 159, 170), + (57, 126, 134), (82, 145, 152), (107, 165, 171), (119, 174, 180), + (132, 184, 189), (173, 216, 220), (150, 200, 205), (126, 184, 189), + (103, 168, 174), (64, 142, 149), (81, 152, 159), (98, 163, 169), + (133, 184, 189), (167, 205, 208), (224, 240, 241), (185, 208, 209), + (107, 144, 146), (75, 117, 120), (43, 91, 94), (52, 102, 105), + (62, 114, 117), (81, 136, 139), (100, 159, 162), (119, 181, 184), + (131, 196, 199), (114, 156, 215), (110, 146, 219), (106, 136, 223), + (92, 103, 237), (103, 113, 238), (113, 123, 239), (124, 133, 240), + (142, 150, 242), (129, 137, 235), (116, 125, 229), (90, 100, 216), + (64, 75, 203), (38, 49, 190), (21, 33, 181), (51, 56, 189), + (82, 79, 196), (162, 140, 217), (159, 136, 216), (156, 133, 215), + (151, 127, 213), (145, 120, 211), (140, 113, 208), (136, 109, 207), + (113, 85, 186), (107, 78, 180), (101, 72, 175), (90, 60, 165), + (82, 52, 158), (111, 85, 175), (140, 119, 193), (168, 152, 210), + (216, 207, 239), (213, 200, 233), (210, 193, 227), (206, 186, 220), + (203, 179, 214), (201, 174, 210), (186, 154, 197), (171, 134, 183), + (142, 95, 157), (137, 88, 152), (132, 82, 148), (146, 105, 123), + (161, 128, 98), (175, 152, 73), (199, 190, 31), (171, 175, 59), + (142, 161, 88), (114, 146, 116), (86, 132, 144), (67, 122, 163), + (87, 137, 174), (107, 152, 186), (127, 167, 197), (147, 182, 209), + (160, 192, 216), (180, 151, 170), (201, 110, 123), (221, 68, 77), + (255, 0, 0), (233, 6, 49), (211, 12, 98), (189, 18, 146), + (167, 24, 195), (153, 28, 227), (169, 63, 232), (185, 98, 236), + (201, 134, 241), (217, 169, 245), (227, 192, 248), (211, 156, 243), + (195, 121, 239), (179, 85, 234), (152, 26, 227), (155, 39, 210), + (158, 53, 192), (160, 66, 175), (163, 79, 157), (165, 88, 146), + (178, 111, 161), (190, 135, 177), (203, 158, 192), (216, 182, 208), + (224, 197, 218), (212, 204, 226), (200, 211, 233), (188, 218, 241), + (168, 230, 253), (133, 212, 241), (98, 193, 229), (62, 175, 218), + (27, 157, 206), (4, 145, 198), (11, 149, 188), (18, 154, 178), + (25, 158, 168), (32, 162, 158), (37, 165, 152), (31, 171, 141), + (25, 177, 130), (19, 183, 119), (9, 193, 101), (10, 173, 120), + (10, 153, 139), (11, 134, 158), (12, 114, 177), (13, 101, 189), + (65, 107, 190), (117, 113, 190), (169, 118, 191), (255, 128, 192) + ), + +// 111 rw-multi-5 +((0, 255, 128), (0, 200, 128), (0, 164, 128), (0, 128, 128), + (27, 155, 155), (55, 183, 183), (68, 196, 196), (82, 210, 210), + (128, 255, 255), (100, 214, 227), (73, 173, 200), (36, 118, 164), + (0, 64, 128), (55, 78, 142), (110, 92, 156), (137, 98, 162), + (164, 105, 169), (255, 128, 192), (227, 128, 192), (200, 128, 192), + (173, 128, 192), (146, 128, 192), (137, 128, 192), (128, 128, 192), + (183, 128, 219), (219, 128, 237), (255, 128, 255), (255, 100, 227), + (255, 73, 200), (255, 59, 186), (255, 46, 173), (255, 18, 146), + (255, 0, 128), (200, 28, 100), (173, 41, 86), (146, 55, 73), + (137, 80, 61), (128, 105, 50), (128, 125, 43), (128, 146, 36), + (128, 255, 0), (100, 227, 14), (73, 200, 28), (45, 173, 41), + (18, 146, 55), (9, 137, 59), (0, 128, 64), (0, 100, 105), + (0, 73, 146), (0, 18, 228), (14, 16, 214), (28, 14, 200), + (55, 27, 145), (82, 41, 91), (105, 52, 45), (128, 64, 0), + (128, 92, 110), (128, 105, 164), (128, 119, 219), (141, 137, 237), + (155, 155, 255), (169, 169, 255), (183, 183, 255), (210, 210, 255), + (237, 237, 255), (251, 238, 210), (247, 220, 165), (243, 203, 121), + (239, 188, 84), (236, 174, 47), (222, 174, 51), (208, 174, 55), + (179, 174, 62), (165, 178, 79), (151, 183, 96), (131, 190, 127), + (112, 198, 159), (102, 202, 174), (93, 206, 190), (80, 211, 211), + (105, 186, 206), (156, 136, 197), (175, 130, 179), (194, 124, 162), + (192, 138, 148), (190, 153, 134), (186, 183, 106), (183, 213, 78), + (186, 234, 76), (192, 235, 92), (198, 237, 108), (201, 238, 116), + (204, 239, 124), (208, 240, 134), (163, 216, 133), (119, 192, 131), + (74, 168, 130), (55, 130, 130), (109, 131, 131), (164, 133, 133), + (191, 134, 134), (219, 135, 135), (255, 136, 136), (226, 152, 133), + (169, 183, 126), (145, 196, 123), (122, 209, 120), (122, 206, 129), + (122, 203, 139), (122, 197, 157), (122, 190, 176), (122, 180, 207), + (138, 178, 191), (170, 174, 160), (178, 173, 152), (186, 172, 144), + (196, 171, 134), (172, 172, 158), (147, 174, 183), (123, 175, 207), + (82, 177, 248), (89, 189, 215), (97, 201, 183), (101, 207, 167), + (105, 213, 151), (117, 233, 97), (117, 229, 112), (117, 225, 127), + (117, 221, 142), (116, 214, 167), (131, 205, 156), (146, 196, 145), + (176, 177, 123), (206, 159, 101), (255, 128, 64), (245, 135, 73), + (226, 150, 92), (218, 156, 100), (210, 162, 108), (212, 154, 121), + (214, 147, 134), (217, 131, 159), (221, 116, 185), (225, 101, 210), + (227, 91, 227), (209, 65, 209), (204, 58, 204), (199, 52, 199), + (184, 31, 184), (198, 69, 198), (212, 107, 212), (225, 146, 225), + (248, 209, 248), (234, 205, 223), (221, 201, 199), (194, 193, 150), + (167, 185, 101), (140, 176, 52), (122, 171, 20), (105, 159, 47), + (89, 147, 75), (45, 114, 147), (42, 120, 134), (40, 126, 121), + (36, 137, 95), (31, 149, 70), (26, 160, 44), (23, 168, 27), + (23, 110, 88), (23, 95, 103), (23, 81, 119), (23, 52, 149), + (22, 33, 169), (53, 62, 137), (84, 91, 106), (115, 121, 74), + (166, 169, 22), (166, 137, 42), (167, 105, 62), (168, 74, 82), + (169, 42, 102), (170, 21, 115), (138, 53, 127), (106, 85, 138), + (43, 148, 161), (32, 158, 165), (22, 169, 169), (31, 156, 160), + (40, 142, 151), (49, 129, 143), (64, 107, 128), (78, 109, 114), + (92, 110, 100), (105, 112, 87), (119, 113, 73), (128, 114, 64), + (111, 120, 71), (94, 126, 79), (76, 133, 86), (59, 139, 93), + (48, 143, 98), (67, 122, 108), (86, 102, 118), (105, 81, 128), + (137, 47, 145), (110, 72, 153), (83, 97, 160), (56, 122, 168), + (29, 148, 176), (11, 164, 181), (45, 129, 183), (79, 94, 184), + (113, 60, 186), (148, 25, 188), (170, 2, 189), (173, 42, 149), + (177, 83, 108), (180, 123, 68), (186, 190, 1), (186, 188, 2), + (186, 186, 4), (185, 184, 5), (185, 181, 6), (184, 180, 7), + (199, 195, 51), (214, 211, 96), (228, 226, 140), (243, 242, 184), + (253, 252, 213), (244, 252, 222), (236, 252, 230), (227, 252, 239), + (213, 253, 253), (213, 253, 244), (213, 253, 235), (213, 253, 226), + (213, 253, 217), (213, 254, 211), (213, 245, 220), (212, 236, 229), + (212, 226, 239), (212, 217, 248), (211, 211, 254), (220, 213, 245), + (230, 215, 235), (239, 217, 226), (255, 220, 210), (255, 198, 204), + (255, 176, 197), (255, 154, 191), (255, 131, 184), (255, 117, 180), + (226, 129, 196), (197, 141, 211), (167, 152, 227), (119, 172, 253) + ), + +// 112 rw-blues-black-purple +((128, 255, 255), (103, 205, 218), (90, 180, 199), (78, 155, 180), + (65, 130, 161), (53, 106, 143), (46, 93, 133), (40, 81, 124), + (16, 31, 87), (8, 18, 78), (0, 6, 70), (0, 12, 76), + (0, 19, 83), (0, 25, 89), (0, 31, 95), (0, 34, 98), + (0, 38, 102), (0, 50, 114), (0, 57, 121), (0, 64, 128), + (4, 72, 140), (8, 81, 153), (10, 85, 159), (13, 89, 165), + (21, 106, 190), (25, 114, 202), (29, 122, 215), (33, 130, 227), + (38, 139, 240), (40, 144, 247), (43, 149, 255), (39, 134, 255), + (35, 120, 255), (26, 91, 255), (22, 76, 255), (18, 62, 255), + (13, 47, 255), (9, 33, 255), (7, 25, 255), (5, 18, 255), + (12, 12, 255), (25, 25, 255), (38, 38, 255), (50, 50, 255), + (62, 62, 255), (68, 68, 255), (75, 75, 255), (88, 88, 255), + (100, 100, 255), (125, 125, 255), (120, 126, 255), (116, 128, 255), + (103, 128, 255), (90, 128, 255), (84, 128, 255), (78, 128, 255), + (53, 128, 255), (40, 128, 255), (28, 128, 255), (14, 128, 255), + (0, 128, 255), (6, 122, 255), (12, 116, 255), (25, 103, 255), + (38, 90, 255), (62, 66, 255), (75, 53, 255), (88, 40, 255), + (94, 34, 255), (100, 28, 255), (112, 16, 255), (128, 0, 255), + (128, 50, 255), (128, 75, 255), (128, 100, 255), (128, 124, 255), + (128, 149, 255), (128, 161, 255), (128, 174, 255), (128, 199, 255), + (128, 224, 255), (116, 255, 255), (103, 255, 255), (90, 255, 255), + (84, 255, 255), (78, 255, 255), (66, 255, 255), (53, 255, 255), + (28, 255, 255), (15, 255, 255), (3, 255, 255), (1, 255, 255), + (0, 255, 255), (0, 245, 245), (0, 235, 235), (0, 225, 225), + (0, 214, 214), (0, 194, 194), (0, 184, 184), (0, 174, 174), + (0, 169, 169), (0, 164, 164), (0, 151, 151), (0, 157, 157), + (0, 170, 170), (0, 176, 176), (0, 182, 182), (0, 185, 185), + (0, 188, 188), (0, 195, 195), (0, 201, 201), (0, 207, 207), + (0, 215, 215), (0, 195, 195), (0, 190, 190), (0, 185, 185), + (0, 175, 175), (0, 165, 165), (0, 155, 155), (0, 145, 145), + (0, 125, 125), (4, 117, 126), (8, 110, 127), (12, 108, 134), + (16, 107, 141), (24, 104, 155), (32, 101, 168), (41, 98, 182), + (49, 95, 196), (65, 90, 224), (69, 88, 231), (73, 87, 238), + (81, 84, 252), (83, 83, 255), (75, 75, 246), (67, 67, 237), + (51, 51, 219), (42, 42, 210), (34, 34, 202), (30, 30, 197), + (26, 26, 193), (18, 18, 184), (10, 10, 175), (0, 0, 164), + (19, 19, 173), (56, 56, 191), (65, 65, 195), (75, 75, 200), + (93, 93, 208), (112, 112, 217), (131, 131, 226), (149, 149, 235), + (191, 191, 255), (181, 181, 254), (172, 172, 253), (154, 154, 251), + (135, 135, 248), (116, 116, 246), (98, 98, 244), (79, 79, 242), + (60, 60, 239), (23, 23, 235), (11, 11, 233), (0, 0, 232), + (0, 0, 234), (0, 0, 236), (0, 0, 239), (0, 0, 241), + (0, 0, 245), (0, 0, 246), (0, 0, 248), (0, 0, 250), + (0, 0, 252), (0, 0, 254), (0, 0, 255), (0, 0, 246), + (0, 0, 236), (0, 0, 227), (0, 0, 218), (0, 0, 209), + (0, 0, 199), (0, 0, 190), (0, 0, 181), (0, 0, 172), + (0, 6, 157), (0, 9, 155), (0, 12, 154), (0, 19, 151), + (0, 25, 148), (0, 31, 144), (0, 38, 141), (0, 44, 138), + (0, 50, 135), (0, 56, 132), (0, 64, 128), (0, 70, 134), + (0, 76, 140), (0, 83, 147), (0, 89, 153), (0, 95, 159), + (0, 102, 166), (0, 108, 172), (0, 114, 178), (0, 120, 184), + (0, 128, 192), (0, 140, 198), (0, 153, 204), (0, 165, 210), + (0, 178, 217), (0, 190, 223), (0, 202, 229), (0, 215, 235), + (0, 227, 241), (0, 240, 247), (0, 252, 254), (0, 255, 255), + (12, 243, 249), (25, 230, 243), (38, 218, 237), (50, 205, 230), + (62, 193, 224), (75, 181, 218), (88, 168, 212), (100, 156, 206), + (112, 143, 200), (128, 128, 192), (128, 140, 198), (128, 153, 204), + (128, 165, 210), (128, 178, 217), (128, 190, 223), (128, 202, 229), + (128, 215, 235), (128, 227, 241), (128, 240, 247), (128, 255, 255), + (128, 230, 255), (128, 205, 255), (128, 180, 255), (128, 155, 255), + (128, 130, 255), (128, 106, 255), (128, 81, 255), (128, 56, 255), + (128, 31, 255), (128, 0, 255), (122, 0, 243), (116, 0, 230), + (109, 0, 218), (103, 0, 205), (97, 0, 193), (90, 0, 181), + (84, 0, 168), (78, 0, 156), (72, 0, 143), (64, 0, 128) + ), + +// 113 rw-multi-colors-6 +((255, 128, 64), (255, 156, 108), (255, 175, 137), (255, 194, 166), + (227, 166, 144), (200, 138, 122), (186, 124, 111), (173, 110, 100), + (128, 64, 64), (144, 84, 84), (161, 104, 104), (183, 130, 130), + (205, 156, 156), (161, 177, 136), (117, 199, 116), (95, 209, 106), + (73, 220, 97), (0, 255, 64), (37, 255, 92), (75, 255, 120), + (112, 255, 148), (150, 255, 176), (162, 255, 185), (174, 255, 194), + (154, 173, 111), (141, 118, 55), (128, 64, 0), (155, 88, 21), + (183, 113, 43), (196, 125, 53), (210, 137, 64), (237, 161, 86), + (255, 177, 100), (145, 101, 167), (90, 63, 200), (36, 25, 233), + (36, 30, 244), (36, 36, 255), (54, 54, 255), (72, 72, 255), + (168, 168, 255), (186, 159, 255), (205, 151, 255), (224, 142, 255), + (243, 134, 255), (249, 131, 255), (255, 128, 255), (246, 100, 246), + (238, 73, 238), (221, 18, 221), (213, 9, 213), (205, 0, 205), + (195, 0, 195), (185, 0, 185), (176, 0, 176), (168, 0, 168), + (96, 55, 178), (60, 82, 183), (24, 110, 189), (23, 127, 197), + (23, 145, 206), (34, 153, 212), (46, 162, 219), (70, 179, 233), + (93, 196, 246), (85, 183, 230), (61, 158, 205), (38, 134, 180), + (19, 114, 159), (0, 94, 138), (33, 122, 163), (67, 149, 188), + (133, 204, 239), (127, 203, 219), (122, 202, 200), (88, 181, 145), + (55, 161, 91), (38, 151, 63), (22, 141, 36), (0, 128, 0), + (3, 155, 3), (8, 210, 8), (24, 232, 24), (40, 255, 40), + (53, 255, 53), (67, 255, 67), (94, 255, 94), (120, 255, 120), + (108, 226, 108), (78, 197, 78), (49, 169, 49), (34, 154, 34), + (19, 140, 19), (0, 121, 0), (55, 123, 14), (110, 124, 28), + (164, 126, 41), (255, 119, 52), (255, 110, 39), (255, 102, 27), + (255, 97, 20), (255, 93, 14), (255, 87, 6), (255, 109, 38), + (255, 152, 102), (255, 170, 128), (255, 188, 155), (248, 174, 138), + (241, 161, 122), (228, 134, 88), (214, 107, 55), (191, 63, 0), + (205, 97, 43), (232, 164, 130), (239, 180, 152), (246, 197, 174), + (255, 219, 202), (234, 183, 159), (213, 147, 115), (192, 111, 72), + (157, 51, 0), (163, 72, 11), (170, 93, 23), (173, 103, 29), + (177, 114, 35), (188, 148, 54), (194, 156, 68), (200, 164, 82), + (206, 172, 95), (216, 186, 118), (218, 191, 127), (221, 196, 137), + (227, 205, 155), (232, 215, 174), (241, 231, 205), (244, 209, 202), + (250, 165, 197), (252, 146, 194), (255, 128, 192), (255, 122, 189), + (255, 116, 186), (255, 103, 180), (255, 91, 173), (255, 78, 167), + (255, 70, 163), (255, 46, 151), (255, 40, 148), (255, 35, 145), + (255, 15, 135), (244, 12, 128), (233, 9, 121), (222, 5, 114), + (204, 0, 102), (199, 0, 99), (194, 0, 97), (184, 0, 92), + (174, 0, 87), (164, 0, 82), (157, 0, 79), (150, 0, 76), + (143, 0, 72), (125, 0, 63), (139, 27, 70), (153, 55, 77), + (181, 110, 91), (209, 164, 105), (237, 219, 119), (255, 255, 128), + (145, 210, 138), (118, 199, 140), (91, 188, 143), (36, 166, 148), + (0, 151, 151), (0, 146, 173), (0, 141, 196), (0, 136, 218), + (0, 128, 255), (42, 143, 200), (84, 157, 145), (126, 172, 91), + (168, 186, 36), (196, 196, 0), (189, 189, 0), (182, 182, 0), + (168, 168, 0), (166, 166, 0), (164, 164, 0), (155, 155, 0), + (146, 146, 0), (136, 136, 0), (121, 121, 0), (145, 133, 54), + (169, 145, 108), (193, 157, 162), (216, 169, 217), (232, 177, 252), + (223, 150, 251), (215, 122, 250), (206, 94, 249), (198, 67, 248), + (192, 49, 247), (170, 40, 221), (149, 30, 194), (127, 21, 168), + (91, 5, 124), (122, 44, 152), (153, 84, 179), (184, 123, 206), + (215, 162, 234), (235, 188, 252), (185, 183, 215), (134, 178, 179), + (84, 173, 142), (33, 167, 106), (0, 164, 82), (34, 184, 109), + (67, 203, 135), (101, 223, 162), (157, 255, 206), (123, 250, 186), + (90, 244, 167), (56, 239, 147), (22, 234, 128), (0, 230, 115), + (10, 235, 123), (20, 241, 130), (30, 246, 138), (40, 251, 146), + (47, 255, 151), (37, 225, 131), (27, 196, 111), (17, 166, 91), + (0, 117, 58), (41, 147, 94), (83, 176, 129), (124, 206, 165), + (166, 236, 201), (193, 255, 224), (179, 200, 190), (165, 145, 155), + (151, 91, 121), (137, 36, 86), (128, 0, 64), (150, 8, 100), + (173, 15, 136), (195, 23, 172), (232, 36, 232), (229, 39, 210), + (227, 41, 188), (224, 44, 166), (222, 46, 144), (220, 48, 130), + (227, 88, 154), (234, 127, 178), (241, 167, 202), (252, 233, 242) + ), + +// 114 rw-multi-reds-oranges +((255, 0, 0), (255, 55, 55), (255, 91, 91), (255, 128, 128), + (251, 147, 132), (247, 167, 136), (245, 177, 138), (243, 187, 140), + (237, 219, 146), (232, 185, 124), (228, 152, 103), (222, 107, 74), + (216, 63, 46), (219, 77, 61), (222, 92, 77), (223, 99, 85), + (225, 106, 93), (230, 130, 119), (218, 118, 107), (206, 107, 96), + (194, 95, 84), (182, 84, 73), (178, 80, 69), (174, 77, 66), + (181, 111, 59), (186, 133, 54), (191, 156, 49), (200, 124, 48), + (209, 92, 48), (214, 75, 48), (219, 59, 48), (228, 27, 47), + (234, 6, 46), (229, 11, 106), (226, 13, 136), (224, 16, 166), + (221, 18, 166), (219, 21, 166), (217, 23, 156), (215, 25, 147), + (206, 34, 95), (206, 52, 105), (206, 70, 116), (206, 88, 127), + (206, 106, 138), (206, 112, 141), (207, 118, 145), (213, 137, 160), + (220, 155, 175), (233, 193, 205), (233, 177, 203), (233, 162, 202), + (229, 119, 189), (226, 76, 176), (223, 40, 165), (220, 5, 155), + (221, 23, 163), (221, 32, 167), (222, 41, 171), (226, 41, 155), + (230, 41, 140), (233, 37, 123), (237, 34, 107), (244, 28, 73), + (250, 21, 39), (252, 43, 20), (249, 68, 23), (246, 94, 26), + (243, 115, 28), (241, 136, 31), (236, 124, 36), (232, 111, 40), + (222, 86, 50), (218, 90, 53), (215, 95, 57), (210, 112, 61), + (206, 130, 66), (204, 138, 68), (202, 147, 70), (199, 158, 73), + (193, 148, 79), (182, 128, 90), (186, 126, 86), (190, 125, 82), + (198, 132, 73), (207, 139, 65), (225, 154, 47), (242, 168, 30), + (248, 168, 24), (242, 159, 29), (237, 151, 35), (234, 146, 37), + (232, 142, 40), (228, 136, 44), (222, 141, 50), (217, 146, 55), + (211, 151, 61), (198, 161, 74), (194, 163, 78), (190, 165, 82), + (188, 166, 84), (186, 168, 86), (183, 169, 89), (190, 145, 94), + (203, 97, 104), (208, 77, 108), (214, 58, 113), (212, 60, 118), + (210, 62, 123), (205, 67, 133), (201, 71, 143), (194, 78, 159), + (202, 70, 153), (217, 55, 142), (221, 51, 139), (225, 48, 136), + (230, 43, 132), (234, 39, 121), (238, 34, 110), (242, 30, 98), + (249, 23, 80), (234, 37, 88), (220, 52, 96), (213, 59, 100), + (206, 66, 104), (182, 90, 118), (192, 112, 137), (202, 135, 155), + (212, 157, 174), (228, 194, 205), (223, 176, 191), (219, 159, 177), + (210, 123, 149), (201, 88, 121), (186, 29, 75), (196, 44, 89), + (215, 74, 116), (223, 86, 127), (231, 99, 138), (224, 91, 130), + (218, 84, 123), (205, 68, 109), (192, 53, 94), (179, 37, 80), + (171, 27, 70), (139, 22, 57), (131, 20, 53), (123, 19, 50), + (96, 15, 39), (130, 39, 85), (164, 64, 132), (198, 88, 178), + (255, 128, 255), (251, 118, 238), (248, 108, 222), (241, 88, 189), + (234, 69, 156), (228, 49, 124), (223, 36, 102), (221, 62, 90), + (220, 87, 77), (216, 155, 44), (212, 152, 43), (208, 150, 42), + (201, 144, 40), (193, 139, 38), (186, 134, 35), (181, 130, 34), + (190, 110, 25), (192, 105, 22), (195, 100, 20), (200, 90, 15), + (203, 84, 12), (198, 78, 17), (193, 71, 22), (188, 65, 27), + (179, 54, 36), (194, 87, 41), (210, 120, 45), (225, 153, 50), + (241, 185, 54), (251, 207, 57), (244, 196, 64), (236, 186, 72), + (222, 164, 86), (219, 160, 88), (217, 157, 91), (213, 160, 95), + (209, 162, 100), (205, 165, 104), (198, 169, 111), (168, 184, 141), + (137, 200, 171), (107, 215, 201), (77, 231, 231), (57, 241, 251), + (95, 196, 227), (134, 151, 203), (172, 106, 179), (211, 61, 155), + (236, 32, 139), (230, 38, 133), (224, 44, 127), (218, 50, 122), + (208, 60, 112), (207, 61, 131), (207, 61, 150), (206, 62, 169), + (205, 63, 188), (204, 64, 201), (215, 53, 174), (225, 43, 146), + (236, 32, 119), (247, 21, 92), (254, 14, 74), (250, 43, 65), + (246, 72, 56), (242, 101, 48), (235, 149, 33), (228, 131, 40), + (220, 114, 48), (213, 96, 55), (206, 79, 62), (201, 67, 67), + (208, 94, 60), (216, 122, 52), (223, 149, 45), (230, 176, 38), + (235, 194, 33), (239, 185, 29), (242, 176, 26), (246, 167, 22), + (252, 152, 16), (236, 146, 32), (219, 140, 48), (203, 133, 64), + (187, 127, 80), (176, 123, 91), (186, 139, 111), (195, 156, 131), + (205, 172, 152), (215, 188, 172), (221, 199, 185), (222, 179, 176), + (223, 160, 167), (224, 140, 158), (225, 108, 143), (230, 103, 139), + (235, 99, 136), (240, 94, 132), (245, 89, 128), (248, 86, 126), + (250, 122, 154), (251, 159, 181), (253, 195, 209), (255, 255, 255) + ), + +// 115 rw-yellows-browns-goldish +((255, 255, 128), (246, 246, 113), (241, 241, 105), (236, 237, 97), + (231, 232, 89), (227, 228, 82), (224, 226, 78), (222, 224, 74), + (213, 215, 58), (208, 210, 50), (203, 206, 43), (198, 201, 35), + (194, 197, 27), (192, 196, 24), (191, 195, 21), (192, 196, 22), + (194, 198, 24), (201, 205, 31), (204, 208, 34), (207, 211, 37), + (210, 214, 40), (213, 217, 43), (214, 218, 44), (216, 220, 46), + (223, 227, 53), (226, 230, 56), (229, 233, 59), (230, 233, 60), + (231, 233, 62), (230, 231, 62), (229, 230, 62), (228, 226, 61), + (226, 222, 60), (222, 215, 59), (220, 211, 58), (219, 208, 57), + (217, 204, 56), (215, 200, 56), (214, 198, 55), (214, 197, 55), + (210, 189, 54), (207, 185, 53), (205, 182, 53), (202, 179, 53), + (200, 177, 54), (199, 175, 54), (198, 174, 55), (195, 172, 55), + (193, 169, 56), (188, 164, 57), (185, 161, 57), (183, 158, 58), + (180, 155, 58), (178, 153, 59), (176, 151, 59), (175, 150, 59), + (172, 154, 58), (173, 161, 56), (174, 169, 55), (174, 176, 53), + (175, 184, 51), (175, 187, 50), (176, 191, 49), (176, 199, 48), + (177, 206, 46), (179, 221, 42), (179, 228, 40), (180, 236, 39), + (180, 239, 38), (181, 243, 37), (181, 250, 35), (182, 252, 35), + (176, 231, 39), (173, 221, 41), (170, 211, 43), (167, 200, 45), + (165, 190, 48), (163, 185, 49), (162, 180, 50), (159, 169, 52), + (156, 159, 54), (150, 138, 58), (147, 128, 60), (145, 118, 62), + (143, 111, 63), (141, 105, 65), (148, 109, 63), (155, 114, 60), + (168, 122, 56), (175, 126, 53), (182, 131, 51), (185, 133, 50), + (189, 135, 49), (196, 139, 46), (202, 144, 44), (209, 148, 42), + (216, 152, 39), (230, 161, 35), (234, 166, 37), (238, 171, 39), + (238, 173, 43), (238, 176, 47), (238, 181, 54), (237, 187, 62), + (237, 197, 76), (236, 202, 83), (236, 207, 91), (236, 209, 94), + (236, 212, 98), (236, 217, 106), (235, 222, 113), (235, 228, 121), + (235, 233, 128), (230, 235, 133), (227, 232, 131), (225, 230, 130), + (221, 226, 126), (217, 221, 122), (212, 217, 119), (208, 212, 115), + (199, 204, 108), (194, 199, 104), (190, 195, 100), (188, 192, 98), + (186, 190, 97), (182, 186, 93), (177, 181, 89), (173, 177, 86), + (172, 176, 85), (183, 181, 92), (186, 182, 93), (189, 184, 95), + (194, 187, 98), (200, 190, 102), (205, 192, 105), (211, 195, 108), + (222, 201, 115), (227, 203, 118), (233, 206, 121), (236, 207, 123), + (239, 209, 125), (244, 212, 128), (251, 215, 132), (250, 211, 127), + (249, 208, 122), (247, 201, 112), (247, 199, 109), (247, 197, 107), + (246, 193, 102), (245, 190, 97), (244, 186, 92), (243, 183, 87), + (242, 176, 77), (241, 174, 74), (241, 172, 72), (240, 168, 67), + (239, 164, 61), (237, 162, 60), (235, 159, 60), (233, 157, 59), + (231, 155, 58), (227, 150, 56), (226, 149, 56), (225, 148, 56), + (223, 145, 55), (221, 143, 54), (219, 141, 53), (217, 138, 53), + (213, 134, 51), (212, 132, 50), (211, 131, 50), (210, 137, 50), + (208, 143, 50), (207, 148, 50), (206, 154, 50), (204, 160, 50), + (203, 166, 50), (202, 171, 50), (200, 177, 50), (199, 183, 50), + (198, 189, 50), (196, 194, 50), (195, 200, 50), (194, 206, 50), + (195, 216, 46), (197, 217, 45), (199, 218, 44), (202, 221, 41), + (206, 224, 38), (209, 227, 35), (212, 229, 33), (216, 232, 30), + (219, 235, 27), (222, 238, 24), (226, 240, 22), (229, 243, 19), + (232, 246, 16), (236, 249, 13), (239, 251, 11), (240, 252, 10), + (237, 248, 9), (233, 245, 9), (230, 241, 8), (226, 238, 8), + (223, 234, 7), (220, 231, 7), (216, 227, 6), (213, 224, 6), + (210, 220, 5), (206, 217, 4), (203, 213, 4), (200, 210, 3), + (196, 206, 3), (192, 202, 2), (192, 196, 5), (192, 191, 8), + (192, 185, 12), (192, 179, 15), (192, 174, 18), (192, 168, 21), + (193, 162, 25), (193, 156, 28), (193, 151, 31), (193, 145, 34), + (193, 139, 38), (193, 134, 41), (193, 128, 44), (194, 121, 48), + (196, 121, 46), (199, 121, 43), (201, 121, 41), (204, 121, 38), + (206, 121, 36), (208, 121, 34), (211, 121, 31), (213, 121, 29), + (216, 121, 26), (218, 121, 24), (220, 121, 22), (223, 121, 19), + (225, 121, 17), (228, 121, 14), (224, 127, 15), (220, 133, 17), + (217, 140, 18), (213, 146, 19), (209, 152, 21), (205, 158, 22), + (201, 164, 23), (198, 170, 25), (194, 177, 26), (190, 183, 27), + (186, 189, 29), (182, 195, 30), (179, 201, 31), (174, 209, 33) + ), + +// 116 rw-multi-blues-with-gray +((0, 0, 160), (17, 17, 169), (26, 26, 173), (35, 35, 178), + (43, 43, 182), (52, 52, 187), (56, 56, 189), (61, 61, 191), + (78, 78, 200), (86, 86, 204), (95, 95, 209), (104, 104, 213), + (113, 113, 218), (121, 121, 222), (130, 130, 227), (134, 134, 229), + (139, 139, 231), (156, 156, 240), (164, 164, 244), (173, 173, 249), + (174, 177, 250), (176, 182, 252), (172, 181, 250), (168, 180, 249), + (150, 174, 243), (141, 171, 240), (133, 169, 237), (124, 166, 234), + (116, 164, 231), (111, 162, 229), (107, 161, 228), (98, 158, 225), + (90, 156, 223), (72, 150, 217), (63, 147, 214), (55, 145, 211), + (46, 142, 208), (38, 140, 205), (33, 138, 203), (29, 137, 202), + (12, 132, 196), (10, 131, 194), (8, 130, 193), (16, 132, 194), + (24, 134, 195), (28, 135, 195), (32, 136, 196), (39, 137, 197), + (47, 139, 198), (63, 143, 200), (71, 145, 201), (79, 147, 202), + (86, 148, 203), (94, 150, 204), (98, 151, 204), (102, 152, 205), + (118, 156, 207), (126, 158, 208), (134, 160, 209), (142, 162, 210), + (150, 164, 211), (154, 165, 211), (158, 166, 212), (165, 167, 213), + (168, 168, 213), (165, 170, 216), (164, 170, 217), (163, 171, 218), + (162, 171, 218), (161, 172, 219), (160, 173, 221), (159, 174, 222), + (156, 175, 224), (155, 176, 225), (154, 177, 227), (152, 178, 228), + (151, 179, 229), (150, 179, 230), (150, 179, 231), (148, 180, 232), + (147, 181, 233), (144, 183, 236), (143, 183, 237), (142, 184, 238), + (141, 184, 239), (140, 185, 240), (134, 180, 237), (129, 176, 233), + (118, 166, 226), (112, 161, 222), (107, 157, 219), (104, 155, 217), + (101, 153, 216), (95, 148, 212), (90, 143, 209), (84, 139, 205), + (79, 134, 202), (67, 125, 195), (61, 120, 191), (56, 115, 188), + (53, 113, 186), (51, 111, 184), (45, 106, 181), (40, 101, 178), + (28, 92, 171), (25, 91, 168), (23, 90, 166), (24, 92, 166), + (25, 95, 167), (28, 99, 167), (30, 104, 168), (32, 108, 168), + (34, 113, 169), (39, 122, 170), (40, 124, 170), (41, 126, 170), + (43, 131, 171), (45, 135, 171), (47, 139, 172), (50, 144, 172), + (54, 153, 173), (56, 157, 173), (58, 162, 174), (59, 164, 174), + (61, 166, 175), (63, 171, 175), (65, 175, 176), (43, 171, 171), + (68, 181, 177), (74, 174, 181), (75, 172, 182), (77, 170, 183), + (80, 166, 185), (83, 163, 187), (86, 159, 189), (89, 155, 190), + (95, 148, 194), (98, 144, 196), (101, 141, 198), (102, 139, 199), + (104, 137, 200), (107, 133, 202), (110, 130, 204), (113, 126, 206), + (116, 122, 208), (122, 115, 212), (123, 113, 213), (125, 112, 214), + (128, 108, 215), (132, 103, 218), (129, 102, 220), (126, 101, 221), + (120, 99, 224), (118, 98, 225), (117, 98, 226), (114, 97, 228), + (111, 96, 229), (108, 95, 231), (105, 94, 232), (102, 93, 234), + (100, 93, 236), (94, 91, 239), (92, 90, 239), (91, 90, 240), + (88, 89, 242), (85, 88, 244), (82, 87, 245), (79, 86, 247), + (73, 84, 250), (71, 83, 251), (69, 83, 252), (69, 84, 247), + (69, 85, 241), (68, 86, 236), (68, 88, 230), (68, 89, 225), + (67, 90, 219), (67, 91, 214), (66, 92, 208), (66, 93, 203), + (66, 94, 197), (65, 95, 192), (65, 96, 186), (64, 98, 181), + (64, 100, 170), (63, 100, 167), (63, 101, 164), (63, 102, 159), + (63, 103, 153), (62, 104, 148), (62, 106, 142), (61, 107, 137), + (61, 107, 135), (67, 112, 139), (72, 116, 143), (78, 121, 147), + (84, 126, 152), (90, 131, 156), (95, 135, 160), (101, 140, 164), + (107, 145, 168), (112, 150, 172), (118, 154, 176), (124, 159, 180), + (130, 164, 184), (135, 169, 189), (141, 173, 193), (147, 178, 197), + (152, 183, 201), (158, 187, 205), (164, 192, 209), (170, 197, 213), + (175, 202, 218), (183, 208, 223), (176, 207, 220), (169, 206, 218), + (162, 204, 215), (155, 203, 212), (148, 202, 210), (141, 201, 207), + (134, 199, 205), (128, 198, 202), (121, 197, 199), (114, 196, 197), + (107, 195, 194), (100, 193, 192), (93, 192, 189), (86, 191, 186), + (79, 190, 184), (72, 188, 181), (65, 187, 178), (58, 186, 176), + (51, 185, 173), (44, 184, 170), (35, 182, 167), (33, 173, 171), + (32, 165, 175), (30, 156, 179), (28, 148, 184), (27, 139, 188), + (25, 131, 192), (24, 122, 196), (22, 114, 200), (20, 105, 204), + (19, 97, 208), (17, 88, 212), (15, 80, 216), (14, 71, 221), + (12, 63, 225), (10, 54, 229), (9, 46, 233), (7, 37, 237), + (5, 28, 241), (4, 20, 245), (2, 11, 250), (0, 0, 255) + ), + +// 117 rw-greens-multi +((0, 128, 64), (0, 152, 64), (0, 164, 64), (0, 176, 64), + (0, 187, 64), (0, 199, 64), (0, 205, 64), (0, 211, 64), + (0, 235, 64), (6, 239, 61), (12, 243, 58), (24, 231, 52), + (36, 219, 46), (48, 207, 40), (60, 195, 34), (66, 189, 31), + (72, 184, 28), (96, 160, 16), (108, 148, 10), (120, 136, 4), + (118, 138, 8), (116, 140, 12), (110, 146, 18), (104, 152, 24), + (80, 176, 48), (68, 187, 60), (56, 199, 72), (44, 211, 84), + (32, 223, 96), (26, 229, 102), (20, 235, 108), (8, 247, 120), + (0, 255, 128), (21, 255, 138), (31, 255, 143), (42, 255, 149), + (52, 255, 154), (62, 255, 159), (67, 255, 161), (73, 255, 164), + (94, 255, 174), (100, 252, 173), (106, 250, 172), (102, 244, 161), + (98, 239, 150), (95, 236, 144), (93, 234, 139), (88, 229, 128), + (84, 224, 117), (75, 213, 95), (70, 207, 84), (66, 202, 73), + (67, 199, 70), (68, 197, 68), (70, 196, 69), (73, 195, 71), + (82, 192, 75), (87, 190, 77), (92, 188, 80), (96, 186, 82), + (101, 184, 85), (103, 183, 86), (106, 182, 87), (75, 213, 96), + (114, 179, 91), (132, 193, 102), (140, 200, 107), (149, 207, 112), + (153, 210, 114), (158, 214, 117), (167, 221, 122), (176, 228, 128), + (193, 241, 138), (198, 244, 136), (204, 247, 135), (200, 241, 122), + (196, 236, 110), (194, 233, 104), (192, 230, 98), (188, 224, 85), + (184, 218, 73), (176, 206, 48), (172, 200, 35), (168, 195, 23), + (166, 193, 19), (165, 191, 15), (164, 197, 16), (164, 202, 18), + (162, 214, 21), (161, 219, 22), (160, 225, 23), (160, 227, 24), + (160, 230, 25), (159, 236, 26), (158, 242, 28), (157, 247, 29), + (157, 251, 30), (151, 244, 25), (148, 240, 22), (145, 237, 20), + (143, 235, 18), (142, 234, 17), (138, 230, 15), (135, 227, 12), + (129, 220, 7), (125, 215, 5), (122, 210, 3), (121, 208, 3), + (120, 206, 3), (118, 203, 3), (115, 199, 3), (113, 195, 3), + (111, 192, 3), (107, 184, 3), (106, 182, 3), (105, 180, 3), + (102, 176, 3), (101, 174, 2), (98, 169, 2), (95, 164, 2), + (89, 154, 2), (86, 149, 2), (83, 144, 2), (81, 141, 2), + (80, 139, 2), (77, 134, 2), (74, 128, 2), (71, 123, 2), + (69, 120, 1), (87, 139, 12), (91, 143, 14), (96, 148, 17), + (105, 158, 22), (114, 167, 28), (122, 176, 33), (131, 186, 38), + (149, 204, 49), (150, 213, 57), (152, 222, 65), (145, 223, 69), + (139, 224, 73), (127, 226, 80), (114, 228, 87), (102, 230, 95), + (89, 232, 102), (64, 236, 116), (58, 237, 120), (52, 238, 124), + (39, 240, 131), (31, 241, 136), (32, 240, 130), (34, 238, 125), + (36, 236, 114), (37, 235, 111), (38, 234, 108), (39, 233, 103), + (40, 232, 97), (42, 230, 92), (43, 229, 86), (45, 230, 100), + (45, 227, 77), (74, 222, 76), (81, 220, 76), (88, 219, 76), + (102, 217, 75), (116, 214, 75), (130, 212, 74), (145, 209, 74), + (173, 204, 73), (185, 202, 72), (197, 200, 72), (179, 193, 77), + (160, 186, 82), (142, 180, 88), (123, 173, 93), (105, 166, 98), + (86, 160, 104), (68, 153, 109), (49, 146, 114), (31, 139, 119), + (12, 132, 124), (0, 128, 128), (12, 140, 128), (24, 152, 128), + (48, 176, 128), (54, 182, 128), (60, 188, 128), (72, 199, 128), + (84, 211, 128), (96, 223, 128), (108, 235, 128), (128, 255, 128), + (128, 243, 122), (128, 231, 116), (128, 219, 110), (128, 207, 104), + (128, 195, 98), (128, 184, 92), (128, 172, 86), (128, 160, 80), + (128, 148, 74), (128, 136, 68), (128, 128, 64), (137, 137, 77), + (147, 147, 90), (156, 156, 103), (166, 166, 116), (175, 175, 129), + (184, 184, 142), (194, 194, 155), (203, 203, 168), (212, 212, 181), + (222, 222, 194), (228, 228, 203), (207, 224, 184), (185, 220, 165), + (164, 215, 146), (142, 211, 127), (121, 207, 108), (100, 203, 89), + (78, 198, 70), (57, 194, 51), (36, 190, 32), (0, 183, 0), + (0, 190, 0), (0, 196, 0), (0, 203, 0), (0, 209, 0), + (0, 216, 0), (0, 222, 0), (0, 229, 0), (0, 236, 0), + (0, 242, 0), (0, 249, 0), (0, 253, 0), (0, 241, 12), + (0, 230, 24), (0, 218, 36), (0, 206, 48), (0, 194, 60), + (0, 183, 72), (0, 171, 84), (0, 159, 96), (0, 148, 108), + (0, 136, 120), (0, 128, 128), (16, 140, 132), (32, 152, 136), + (47, 164, 139), (63, 176, 143), (79, 188, 147), (94, 199, 150), + (110, 211, 154), (126, 223, 158), (142, 235, 162), (168, 255, 168) + ), + +// 118 rw-browns-orange-yellow-with-blues +((128, 64, 64), (140, 76, 76), (146, 81, 81), (153, 87, 87), + (159, 93, 93), (165, 99, 99), (168, 102, 102), (172, 105, 105), + (187, 119, 119), (194, 120, 113), (201, 121, 107), (208, 122, 101), + (216, 123, 96), (223, 124, 90), (230, 125, 84), (233, 125, 81), + (237, 126, 78), (255, 128, 64), (255, 131, 69), (255, 135, 75), + (255, 138, 80), (255, 142, 86), (255, 144, 89), (255, 146, 92), + (255, 153, 103), (255, 156, 108), (255, 160, 114), (254, 156, 109), + (254, 153, 105), (253, 148, 98), (252, 144, 92), (251, 136, 80), + (250, 127, 68), (247, 109, 43), (245, 100, 30), (244, 92, 18), + (239, 84, 9), (234, 76, 0), (230, 75, 0), (226, 74, 0), + (210, 68, 0), (202, 65, 0), (194, 63, 0), (186, 60, 0), + (178, 58, 0), (174, 56, 0), (170, 55, 0), (166, 54, 0), + (163, 61, 3), (157, 74, 9), (154, 80, 12), (151, 87, 15), + (148, 93, 18), (145, 100, 21), (143, 103, 22), (142, 106, 24), + (144, 121, 29), (149, 125, 30), (155, 130, 31), (160, 134, 32), + (166, 139, 33), (169, 141, 33), (172, 144, 34), (177, 148, 35), + (183, 153, 36), (191, 160, 38), (195, 166, 50), (200, 172, 62), + (202, 175, 68), (205, 178, 74), (210, 184, 86), (214, 191, 98), + (223, 203, 122), (229, 210, 137), (235, 218, 152), (236, 219, 144), + (238, 220, 137), (239, 220, 133), (240, 221, 129), (241, 222, 122), + (243, 223, 114), (246, 225, 99), (247, 226, 91), (249, 227, 84), + (249, 227, 82), (250, 228, 80), (245, 222, 72), (239, 217, 64), + (228, 205, 48), (223, 199, 40), (218, 194, 33), (215, 191, 29), + (212, 188, 25), (207, 182, 17), (199, 174, 5), (205, 156, 5), + (211, 137, 4), (223, 101, 3), (228, 82, 2), (234, 64, 2), + (237, 55, 2), (240, 46, 2), (246, 27, 1), (252, 9, 1), + (240, 0, 0), (225, 0, 0), (211, 0, 0), (204, 0, 0), + (197, 0, 0), (182, 0, 0), (168, 0, 0), (153, 0, 0), + (139, 0, 0), (132, 20, 20), (139, 30, 30), (146, 41, 41), + (161, 61, 61), (175, 81, 81), (190, 102, 102), (204, 122, 122), + (233, 163, 163), (244, 178, 178), (255, 193, 193), (251, 193, 188), + (248, 193, 183), (240, 194, 173), (233, 194, 164), (226, 195, 154), + (219, 196, 144), (204, 197, 124), (200, 197, 119), (197, 197, 115), + (186, 198, 100), (189, 200, 107), (192, 203, 113), (195, 205, 120), + (201, 210, 133), (204, 212, 139), (207, 215, 146), (208, 216, 149), + (210, 217, 152), (213, 220, 159), (214, 221, 162), (218, 209, 172), + (223, 197, 182), (231, 172, 201), (233, 166, 206), (236, 160, 211), + (240, 148, 221), (244, 136, 231), (249, 124, 240), (255, 106, 255), + (237, 121, 242), (232, 124, 238), (227, 128, 235), (218, 135, 229), + (209, 142, 222), (200, 150, 216), (191, 157, 209), (182, 164, 203), + (172, 171, 196), (169, 157, 186), (170, 148, 182), (171, 139, 179), + (172, 121, 172), (173, 103, 166), (175, 85, 159), (176, 67, 152), + (179, 31, 138), (180, 17, 133), (181, 4, 128), (182, 20, 122), + (184, 35, 115), (185, 51, 109), (186, 67, 102), (188, 83, 96), + (189, 98, 89), (191, 114, 83), (192, 130, 77), (193, 145, 70), + (194, 153, 67), (198, 159, 78), (202, 166, 90), (205, 172, 101), + (213, 185, 124), (215, 188, 130), (217, 191, 136), (221, 197, 147), + (224, 204, 159), (230, 213, 176), (224, 208, 167), (219, 203, 157), + (213, 198, 148), (208, 193, 138), (202, 188, 129), (196, 183, 119), + (191, 178, 110), (185, 173, 100), (180, 168, 91), (177, 166, 86), + (184, 157, 77), (190, 147, 68), (197, 138, 59), (204, 129, 50), + (210, 120, 41), (217, 110, 32), (224, 101, 23), (230, 92, 13), + (240, 78, 0), (242, 85, 10), (243, 92, 19), (245, 99, 29), + (246, 106, 38), (248, 113, 48), (249, 120, 58), (251, 127, 67), + (253, 135, 77), (254, 142, 86), (255, 145, 91), (255, 151, 100), + (255, 157, 110), (255, 164, 119), (254, 170, 129), (254, 176, 138), + (254, 182, 148), (254, 189, 157), (254, 195, 167), (253, 204, 181), + (240, 189, 169), (227, 174, 156), (213, 160, 144), (200, 145, 132), + (187, 130, 119), (174, 115, 107), (161, 101, 95), (148, 86, 82), + (134, 71, 70), (128, 64, 64), (135, 71, 71), (141, 78, 78), + (148, 84, 84), (155, 91, 91), (161, 98, 98), (168, 104, 104), + (175, 111, 111), (181, 118, 118), (191, 128, 128), (195, 135, 135), + (198, 143, 143), (202, 150, 150), (206, 158, 158), (209, 165, 165), + (213, 173, 173), (217, 180, 180), (221, 188, 188), (226, 199, 199) + ), + +// 119 rw-reds-blues-greens-pinks +((255, 0, 0), (211, 22, 22), (189, 33, 33), (167, 44, 44), + (145, 55, 55), (124, 66, 66), (113, 71, 71), (102, 77, 77), + (58, 99, 99), (29, 113, 113), (0, 128, 128), (0, 139, 139), + (0, 150, 150), (0, 161, 161), (0, 172, 172), (0, 177, 177), + (0, 183, 183), (0, 204, 204), (0, 215, 215), (0, 226, 226), + (0, 237, 237), (0, 248, 248), (0, 251, 251), (0, 255, 255), + (44, 240, 255), (66, 232, 255), (88, 224, 255), (109, 216, 255), + (131, 209, 255), (142, 205, 255), (153, 201, 255), (175, 194, 255), + (197, 186, 255), (255, 166, 255), (233, 162, 255), (211, 159, 255), + (189, 156, 255), (167, 153, 255), (156, 151, 255), (145, 150, 255), + (102, 143, 255), (80, 140, 255), (58, 137, 255), (36, 133, 255), + (14, 130, 255), (7, 129, 255), (0, 128, 255), (11, 128, 255), + (22, 128, 255), (44, 128, 255), (55, 128, 255), (66, 128, 255), + (77, 128, 255), (88, 128, 255), (93, 128, 255), (99, 128, 255), + (121, 128, 255), (119, 133, 244), (117, 139, 233), (106, 150, 211), + (95, 161, 189), (89, 166, 178), (84, 172, 167), (73, 183, 145), + (62, 193, 124), (40, 215, 80), (29, 226, 58), (18, 237, 36), + (9, 246, 18), (0, 255, 0), (22, 233, 0), (44, 211, 0), + (88, 167, 0), (109, 145, 0), (131, 124, 0), (153, 102, 0), + (175, 80, 0), (186, 69, 0), (197, 58, 0), (219, 36, 0), + (241, 14, 0), (233, 11, 0), (211, 22, 0), (189, 33, 0), + (178, 38, 0), (167, 44, 0), (145, 55, 0), (124, 66, 0), + (80, 88, 0), (58, 99, 0), (36, 110, 0), (25, 115, 0), + (14, 121, 0), (0, 128, 0), (10, 117, 0), (20, 106, 0), + (30, 95, 0), (50, 73, 0), (60, 62, 0), (70, 51, 0), + (75, 45, 0), (80, 40, 0), (90, 29, 0), (101, 18, 0), + (129, 0, 0), (140, 0, 0), (152, 0, 0), (158, 0, 0), + (164, 0, 0), (175, 0, 0), (187, 0, 0), (199, 0, 0), + (210, 0, 0), (234, 0, 0), (240, 0, 0), (246, 0, 0), + (253, 0, 0), (242, 22, 11), (232, 44, 22), (221, 66, 33), + (199, 110, 55), (188, 131, 66), (178, 153, 77), (172, 164, 82), + (167, 175, 88), (156, 197, 99), (146, 219, 110), (135, 241, 121), + (128, 255, 128), (128, 233, 150), (128, 227, 155), (128, 222, 161), + (128, 211, 172), (128, 200, 183), (128, 190, 193), (128, 179, 204), + (128, 157, 226), (128, 142, 240), (128, 128, 255), (122, 128, 244), + (117, 128, 233), (106, 128, 211), (95, 128, 189), (84, 128, 167), + (73, 128, 145), (51, 128, 102), (45, 128, 91), (40, 128, 80), + (29, 128, 58), (18, 128, 36), (7, 128, 14), (0, 128, 0), + (44, 132, 26), (55, 132, 32), (66, 133, 38), (88, 135, 51), + (110, 137, 64), (131, 139, 77), (153, 141, 90), (175, 142, 102), + (197, 144, 115), (255, 149, 149), (255, 147, 147), (255, 146, 146), + (255, 144, 144), (255, 141, 141), (255, 139, 139), (255, 136, 136), + (255, 131, 131), (255, 129, 129), (255, 128, 128), (255, 126, 126), + (255, 123, 123), (255, 121, 121), (255, 119, 119), (255, 119, 131), + (255, 118, 142), (255, 118, 154), (255, 117, 166), (255, 117, 177), + (255, 116, 189), (255, 116, 201), (255, 115, 212), (255, 115, 224), + (255, 114, 248), (255, 113, 251), (255, 113, 255), (255, 107, 237), + (255, 101, 219), (255, 95, 201), (255, 90, 183), (255, 84, 165), + (255, 78, 147), (255, 72, 129), (255, 66, 111), (255, 60, 93), + (255, 55, 75), (255, 45, 45), (250, 41, 58), (246, 37, 72), + (241, 33, 85), (237, 30, 99), (232, 26, 112), (228, 22, 126), + (223, 18, 139), (219, 14, 153), (214, 10, 166), (209, 6, 180), + (205, 2, 193), (202, 0, 202), (204, 0, 185), (206, 0, 167), + (207, 0, 150), (209, 0, 133), (211, 0, 115), (213, 0, 98), + (215, 0, 80), (216, 0, 63), (218, 0, 46), (220, 0, 28), + (222, 0, 11), (223, 0, 0), (217, 12, 6), (212, 24, 12), + (206, 36, 19), (200, 47, 25), (195, 59, 31), (189, 71, 37), + (183, 83, 43), (178, 95, 50), (172, 107, 56), (166, 119, 62), + (157, 138, 72), (157, 126, 66), (158, 114, 60), (158, 102, 53), + (159, 91, 47), (160, 79, 41), (160, 67, 35), (161, 55, 29), + (161, 43, 22), (162, 31, 16), (163, 19, 10), (163, 8, 4), + (164, 0, 0), (160, 0, 0), (156, 0, 0), (152, 0, 0), + (148, 0, 0), (144, 0, 0), (140, 0, 0), (136, 0, 0), + (132, 0, 0), (128, 0, 0), (124, 0, 0), (117, 0, 0) + ), + +// 120 rw-reds-browns-golds-tans +((255, 0, 0), (253, 10, 2), (251, 15, 3), (250, 20, 4), + (249, 25, 5), (248, 30, 6), (247, 32, 6), (247, 35, 7), + (244, 45, 8), (243, 50, 9), (242, 55, 10), (241, 60, 11), + (240, 65, 12), (238, 70, 13), (237, 75, 14), (236, 77, 14), + (236, 80, 14), (234, 90, 16), (232, 95, 17), (231, 100, 18), + (230, 105, 19), (229, 110, 20), (228, 112, 20), (228, 115, 21), + (225, 125, 22), (224, 130, 23), (223, 135, 24), (222, 140, 25), + (221, 145, 26), (220, 147, 26), (219, 150, 27), (218, 155, 28), + (217, 160, 28), (216, 157, 30), (216, 155, 31), (216, 154, 32), + (215, 152, 32), (215, 151, 33), (215, 150, 33), (215, 150, 34), + (214, 146, 36), (213, 145, 37), (213, 144, 38), (213, 142, 38), + (213, 140, 39), (212, 139, 39), (212, 139, 40), (212, 138, 41), + (212, 136, 42), (211, 133, 44), (210, 131, 44), (210, 130, 45), + (210, 128, 46), (210, 127, 47), (209, 126, 47), (209, 126, 48), + (209, 122, 49), (208, 121, 50), (208, 120, 51), (207, 118, 52), + (207, 116, 53), (207, 115, 53), (207, 115, 54), (206, 114, 55), + (206, 112, 55), (209, 113, 52), (210, 113, 50), (212, 114, 48), + (213, 114, 47), (214, 114, 46), (215, 115, 45), (217, 115, 43), + (220, 116, 40), (221, 116, 38), (223, 117, 36), (224, 117, 34), + (226, 118, 33), (226, 118, 32), (227, 119, 31), (229, 119, 29), + (230, 120, 28), (234, 121, 24), (235, 121, 22), (237, 122, 21), + (237, 122, 20), (238, 122, 19), (240, 123, 17), (241, 123, 15), + (244, 124, 12), (245, 124, 10), (247, 125, 9), (248, 125, 8), + (249, 126, 7), (250, 126, 5), (252, 127, 3), (253, 127, 2), + (255, 128, 0), (250, 126, 0), (247, 124, 0), (245, 123, 0), + (244, 122, 0), (243, 122, 0), (240, 120, 0), (238, 119, 0), + (233, 117, 0), (230, 115, 0), (228, 114, 0), (226, 113, 0), + (225, 113, 0), (223, 112, 0), (220, 110, 0), (218, 109, 0), + (216, 108, 0), (211, 106, 0), (209, 105, 0), (208, 104, 0), + (206, 103, 0), (203, 102, 0), (201, 100, 0), (198, 99, 0), + (193, 97, 0), (190, 95, 0), (188, 94, 0), (187, 93, 0), + (186, 93, 0), (183, 92, 0), (181, 90, 0), (178, 89, 0), + (176, 88, 0), (181, 95, 8), (182, 96, 10), (183, 98, 12), + (186, 101, 16), (188, 104, 21), (191, 108, 25), (193, 111, 29), + (198, 118, 37), (200, 121, 41), (203, 124, 45), (204, 125, 47), + (206, 127, 50), (208, 131, 54), (211, 134, 58), (213, 137, 62), + (216, 140, 66), (220, 147, 74), (221, 148, 76), (223, 150, 78), + (225, 154, 82), (228, 157, 87), (230, 160, 91), (233, 163, 95), + (238, 170, 103), (239, 171, 105), (240, 173, 107), (243, 177, 111), + (245, 180, 116), (248, 183, 120), (250, 186, 124), (253, 190, 128), + (255, 193, 132), (255, 186, 128), (255, 184, 127), (255, 182, 127), + (255, 178, 125), (255, 174, 123), (255, 171, 121), (255, 167, 119), + (255, 160, 116), (255, 158, 115), (255, 156, 114), (255, 152, 112), + (255, 148, 110), (255, 145, 108), (255, 141, 107), (255, 137, 105), + (255, 134, 103), (255, 130, 101), (255, 126, 99), (255, 122, 98), + (255, 119, 96), (255, 115, 94), (255, 111, 92), (255, 107, 90), + (255, 100, 87), (255, 98, 86), (255, 96, 85), (255, 93, 83), + (255, 89, 81), (255, 85, 79), (255, 81, 78), (255, 78, 76), + (255, 74, 74), (254, 77, 75), (252, 79, 76), (251, 82, 76), + (250, 84, 77), (248, 87, 78), (247, 90, 79), (245, 92, 79), + (244, 95, 80), (243, 97, 81), (241, 100, 81), (240, 103, 82), + (238, 105, 83), (237, 108, 84), (236, 110, 84), (234, 113, 85), + (233, 116, 86), (232, 118, 86), (230, 121, 87), (229, 123, 88), + (228, 126, 89), (226, 128, 89), (225, 131, 90), (223, 134, 91), + (222, 136, 91), (221, 139, 92), (219, 141, 93), (218, 144, 94), + (216, 147, 94), (215, 149, 95), (214, 152, 96), (212, 154, 96), + (211, 157, 97), (211, 158, 99), (212, 159, 100), (212, 160, 102), + (213, 161, 104), (213, 162, 105), (214, 163, 107), (214, 164, 108), + (214, 165, 110), (215, 166, 112), (215, 167, 113), (216, 168, 115), + (216, 169, 116), (217, 170, 118), (217, 171, 120), (218, 172, 121), + (218, 173, 123), (218, 174, 125), (219, 175, 126), (219, 176, 128), + (220, 177, 130), (220, 178, 131), (221, 179, 133), (221, 180, 134), + (221, 181, 136), (222, 182, 138), (222, 183, 139), (223, 184, 141), + (223, 185, 142), (224, 186, 144), (224, 187, 146), (225, 189, 149) + ), + +// 121 dg009 +((19, 11, 23), (39, 24, 47), (54, 26, 47), (70, 29, 47), + (81, 27, 44), (92, 25, 42), (101, 12, 38), (110, 0, 35), + (113, 28, 49), (93, 28, 45), (74, 28, 41), (72, 33, 50), + (71, 38, 59), (77, 58, 94), (83, 79, 130), (90, 93, 139), + (98, 107, 148), (115, 102, 171), (98, 92, 141), (81, 82, 112), + (78, 79, 108), (75, 76, 104), (74, 75, 103), (73, 74, 102), + (97, 56, 96), (89, 41, 71), (82, 27, 46), (62, 28, 50), + (42, 30, 54), (39, 27, 49), (37, 25, 45), (34, 26, 41), + (29, 25, 40), (25, 27, 40), (23, 27, 40), (21, 27, 41), + (17, 34, 47), (13, 41, 53), (19, 54, 61), (26, 67, 69), + (43, 70, 79), (44, 60, 76), (45, 51, 73), (44, 41, 59), + (43, 32, 46), (51, 29, 43), (60, 26, 40), (53, 25, 40), + (41, 17, 49), (37, 29, 50), (37, 31, 53), (38, 34, 57), + (37, 32, 55), (36, 31, 54), (36, 28, 50), (37, 25, 47), + (37, 26, 43), (37, 25, 42), (38, 25, 42), (37, 25, 41), + (37, 26, 40), (36, 25, 39), (36, 25, 39), (31, 25, 39), + (29, 20, 37), (26, 31, 50), (27, 39, 57), (29, 48, 65), + (34, 47, 70), (40, 47, 75), (49, 48, 90), (49, 62, 94), + (66, 67, 97), (69, 70, 99), (72, 73, 101), (70, 72, 98), + (69, 71, 96), (69, 71, 96), (69, 71, 96), (68, 69, 97), + (65, 63, 103), (67, 74, 116), (70, 78, 122), (74, 82, 129), + (79, 89, 136), (84, 96, 144), (85, 111, 134), (82, 110, 114), + (73, 74, 102), (61, 74, 90), (50, 75, 79), (50, 72, 67), + (51, 69, 55), (38, 41, 58), (44, 41, 70), (50, 49, 81), + (61, 59, 98), (46, 93, 99), (54, 91, 105), (62, 90, 112), + (67, 96, 111), (72, 102, 110), (81, 111, 121), (116, 124, 161), + (112, 123, 169), (95, 100, 145), (78, 77, 121), (73, 77, 120), + (69, 78, 119), (73, 103, 111), (88, 110, 134), (116, 126, 161), + (110, 139, 171), (112, 128, 187), (115, 127, 177), (119, 126, 168), + (123, 111, 161), (145, 98, 152), (139, 92, 146), (98, 72, 135), + (74, 75, 103), (68, 68, 101), (63, 61, 100), (57, 55, 93), + (51, 49, 86), (39, 38, 70), (27, 24, 55), (21, 26, 48), + (16, 22, 48), (21, 27, 43), (22, 30, 44), (23, 33, 45), + (25, 35, 47), (24, 34, 46), (25, 31, 45), (28, 27, 45), + (35, 27, 42), (36, 26, 42), (37, 26, 42), (37, 26, 42), + (37, 26, 42), (37, 26, 42), (37, 26, 42), (37, 26, 42), + (37, 26, 42), (36, 28, 41), (36, 29, 42), (36, 30, 44), + (27, 44, 54), (23, 52, 60), (25, 56, 61), (26, 55, 61), + (34, 40, 62), (25, 41, 62), (17, 42, 62), (10, 39, 53), + (15, 23, 46), (0, 0, 25), (0, 0, 25), (0, 0, 25), + (15, 21, 33), (28, 27, 43), (30, 28, 44), (33, 29, 46), + (32, 30, 51), (26, 31, 50), (19, 34, 53), (20, 33, 42), + (22, 28, 42), (23, 25, 41), (24, 23, 41), (26, 21, 43), + (30, 21, 42), (32, 25, 43), (35, 27, 42), (37, 26, 42), + (38, 25, 42), (43, 20, 38), (50, 18, 31), (76, 1, 32), + (80, 15, 37), (87, 24, 41), (84, 31, 51), (99, 30, 49), + (181, 60, 93), (177, 63, 92), (174, 66, 92), (157, 78, 109), + (197, 102, 142), (201, 125, 155), (126, 137, 159), (119, 124, 154), + (88, 82, 128), (76, 77, 105), (76, 77, 105), (74, 75, 103), + (73, 74, 102), (70, 71, 99), (68, 69, 97), (61, 63, 101), + (60, 62, 100), (63, 61, 100), (68, 69, 97), (68, 70, 95), + (70, 71, 99), (72, 73, 101), (74, 75, 103), (71, 72, 100), + (71, 72, 100), (69, 73, 98), (66, 67, 95), (86, 41, 70), + (118, 33, 56), (140, 30, 39), (149, 38, 55), (132, 28, 65), + (135, 43, 68), (152, 70, 93), (147, 71, 101), (134, 73, 80), + (109, 54, 75), (79, 80, 108), (107, 120, 152), (135, 139, 187), + (141, 140, 197), (214, 220, 255), (202, 214, 255), (136, 147, 203), + (114, 125, 171), (84, 107, 141), (77, 78, 106), (67, 71, 96), + (46, 55, 86), (33, 47, 76), (41, 61, 70), (42, 69, 78), + (49, 68, 82), (63, 64, 92), (66, 67, 97), (63, 63, 97), + (56, 55, 89), (49, 43, 79), (38, 38, 62), (39, 37, 59), + (38, 36, 60), (37, 39, 62), (40, 50, 75), (53, 58, 87), + (58, 58, 94), (61, 49, 97), (53, 40, 83), (42, 43, 74), + (36, 40, 65), (36, 35, 69), (51, 53, 91), (40, 37, 90) + ), + +// 122 dg016 +((25, 30, 34), (51, 61, 70), (46, 53, 62), (42, 45, 54), + (34, 44, 43), (27, 43, 32), (27, 42, 30), (28, 42, 29), + (22, 39, 23), (20, 33, 21), (18, 28, 19), (18, 24, 18), + (18, 20, 17), (17, 19, 16), (16, 18, 15), (16, 18, 15), + (16, 18, 15), (16, 21, 17), (14, 23, 18), (13, 26, 19), + (19, 34, 24), (26, 42, 29), (24, 44, 31), (23, 47, 34), + (11, 46, 42), (11, 53, 40), (12, 60, 38), (6, 61, 44), + (0, 62, 51), (7, 65, 53), (15, 69, 55), (25, 64, 63), + (34, 47, 64), (40, 43, 60), (40, 43, 59), (41, 44, 59), + (41, 44, 59), (42, 45, 60), (41, 44, 59), (41, 44, 59), + (33, 53, 62), (26, 64, 59), (20, 75, 56), (15, 88, 61), + (10, 101, 66), (10, 105, 69), (10, 110, 72), (18, 107, 79), + (13, 90, 58), (38, 59, 62), (39, 51, 58), (40, 44, 55), + (35, 39, 46), (30, 34, 37), (28, 34, 37), (26, 34, 37), + (21, 36, 55), (18, 50, 64), (15, 65, 74), (12, 89, 93), + (10, 114, 113), (9, 121, 98), (9, 129, 83), (13, 104, 71), + (11, 82, 52), (0, 37, 14), (5, 24, 10), (11, 12, 7), + (9, 13, 7), (7, 14, 7), (0, 14, 4), (0, 17, 5), + (19, 22, 27), (22, 28, 37), (26, 34, 47), (33, 38, 53), + (40, 43, 60), (41, 51, 63), (43, 60, 67), (53, 75, 62), + (48, 95, 85), (70, 103, 92), (61, 87, 77), (52, 72, 63), + (47, 65, 55), (42, 58, 47), (36, 54, 38), (33, 45, 31), + (34, 39, 35), (38, 42, 48), (43, 46, 61), (45, 48, 63), + (47, 50, 65), (53, 60, 86), (61, 74, 108), (69, 77, 114), + (69, 76, 105), (35, 44, 75), (20, 37, 65), (5, 31, 56), + (6, 32, 51), (7, 33, 46), (7, 36, 42), (10, 40, 38), + (9, 28, 35), (4, 16, 32), (0, 4, 29), (0, 5, 23), + (0, 6, 18), (2, 18, 18), (6, 23, 17), (11, 21, 13), + (17, 23, 9), (18, 20, 17), (17, 20, 17), (16, 21, 17), + (16, 21, 24), (14, 32, 34), (13, 42, 48), (13, 44, 39), + (15, 59, 32), (16, 66, 35), (18, 74, 39), (15, 76, 43), + (12, 79, 48), (10, 74, 50), (11, 71, 45), (16, 65, 36), + (28, 59, 43), (40, 43, 58), (40, 43, 58), (40, 43, 58), + (41, 44, 59), (41, 44, 59), (40, 43, 58), (40, 43, 58), + (38, 41, 56), (25, 43, 55), (12, 45, 54), (11, 44, 56), + (10, 43, 58), (12, 42, 52), (17, 45, 49), (32, 45, 51), + (39, 42, 57), (41, 44, 59), (41, 44, 59), (42, 45, 60), + (42, 45, 60), (42, 45, 60), (43, 46, 61), (46, 47, 65), + (41, 42, 62), (41, 42, 61), (41, 42, 60), (41, 44, 59), + (42, 45, 60), (42, 45, 60), (42, 45, 60), (44, 47, 62), + (46, 53, 63), (44, 62, 100), (47, 63, 105), (50, 64, 111), + (44, 64, 115), (28, 67, 98), (31, 51, 75), (24, 50, 77), + (14, 47, 56), (22, 44, 58), (30, 41, 61), (38, 41, 58), + (39, 42, 57), (40, 43, 58), (43, 44, 64), (34, 46, 68), + (14, 56, 68), (9, 71, 96), (10, 95, 132), (12, 105, 146), + (9, 117, 179), (15, 156, 173), (51, 198, 146), (56, 166, 129), + (10, 85, 54), (11, 73, 47), (13, 62, 40), (20, 37, 29), + (12, 27, 24), (16, 25, 24), (22, 31, 26), (21, 29, 32), + (28, 33, 36), (26, 37, 41), (23, 34, 40), (20, 28, 47), + (19, 28, 45), (22, 21, 27), (30, 16, 13), (18, 20, 17), + (17, 21, 20), (18, 22, 25), (23, 26, 31), (30, 35, 39), + (37, 36, 44), (41, 43, 55), (40, 43, 58), (40, 43, 58), + (40, 43, 58), (39, 42, 57), (39, 42, 57), (40, 43, 58), + (40, 43, 58), (40, 43, 58), (40, 43, 58), (39, 42, 57), + (38, 41, 56), (35, 41, 53), (31, 36, 40), (21, 42, 37), + (11, 52, 48), (10, 54, 67), (19, 61, 77), (16, 74, 98), + (11, 83, 107), (25, 78, 112), (28, 84, 101), (27, 66, 83), + (26, 53, 70), (42, 48, 62), (42, 45, 60), (43, 46, 61), + (45, 58, 75), (52, 67, 100), (55, 70, 109), (53, 73, 124), + (73, 81, 127), (55, 77, 134), (44, 137, 142), (85, 139, 116), + (94, 118, 104), (87, 97, 96), (67, 76, 85), (53, 66, 85), + (41, 58, 74), (43, 46, 61), (36, 42, 54), (31, 42, 38), + (20, 37, 31), (22, 26, 27), (21, 22, 26), (22, 26, 27), + (26, 33, 26), (30, 39, 36), (45, 63, 51), (40, 53, 46) + ), + +// 123 dg031 +((4, 9, 8), (10, 19, 18), (12, 19, 20), (14, 19, 22), + (14, 21, 22), (14, 23, 22), (15, 22, 23), (16, 21, 24), + (11, 22, 28), (10, 18, 37), (10, 15, 47), (16, 30, 55), + (23, 46, 64), (41, 76, 90), (59, 107, 117), (73, 121, 135), + (88, 135, 153), (117, 169, 190), (121, 167, 191), (126, 166, 192), + (148, 159, 162), (170, 153, 133), (183, 162, 123), (196, 171, 114), + (172, 150, 90), (134, 118, 84), (97, 87, 78), (76, 77, 72), + (55, 67, 67), (71, 65, 65), (87, 63, 63), (124, 92, 54), + (176, 145, 78), (193, 223, 249), (196, 228, 250), (200, 233, 252), + (190, 225, 244), (181, 218, 237), (178, 216, 237), (176, 214, 237), + (83, 152, 167), (56, 109, 120), (29, 66, 74), (27, 59, 66), + (25, 52, 59), (27, 56, 62), (29, 60, 65), (29, 59, 70), + (33, 85, 98), (61, 124, 139), (70, 116, 127), (79, 108, 116), + (99, 100, 84), (120, 92, 53), (132, 102, 62), (145, 112, 71), + (190, 164, 103), (206, 168, 106), (222, 172, 109), (197, 151, 94), + (172, 131, 79), (145, 110, 65), (118, 90, 51), (95, 61, 33), + (67, 31, 33), (36, 22, 37), (31, 32, 43), (26, 43, 50), + (26, 45, 50), (27, 48, 51), (27, 50, 58), (22, 40, 54), + (14, 29, 34), (14, 29, 33), (15, 29, 32), (16, 28, 31), + (17, 28, 30), (17, 29, 30), (18, 30, 30), (43, 33, 21), + (59, 43, 27), (114, 84, 50), (133, 84, 44), (152, 84, 39), + (155, 99, 54), (159, 115, 70), (173, 124, 58), (178, 118, 58), + (177, 143, 79), (179, 148, 83), (182, 153, 87), (185, 155, 86), + (188, 158, 86), (193, 150, 81), (203, 147, 70), (171, 106, 42), + (152, 81, 37), (78, 52, 29), (47, 38, 27), (16, 24, 26), + (14, 21, 22), (12, 18, 18), (13, 17, 18), (10, 16, 16), + (13, 13, 13), (12, 14, 14), (11, 15, 16), (11, 16, 18), + (12, 17, 20), (15, 25, 26), (16, 31, 34), (24, 41, 51), + (26, 55, 59), (30, 61, 82), (26, 64, 85), (23, 68, 89), + (29, 85, 100), (32, 66, 76), (30, 59, 67), (29, 60, 65), + (17, 44, 51), (16, 35, 40), (16, 27, 29), (16, 25, 30), + (17, 24, 32), (16, 29, 35), (17, 36, 42), (27, 51, 55), + (27, 58, 63), (39, 100, 118), (62, 99, 125), (85, 98, 132), + (84, 95, 125), (119, 89, 53), (92, 65, 38), (27, 48, 41), + (14, 22, 24), (11, 15, 15), (9, 8, 6), (4, 5, 3), + (0, 2, 1), (10, 14, 15), (18, 23, 26), (28, 27, 43), + (23, 52, 60), (60, 116, 129), (70, 127, 143), (80, 138, 158), + (82, 143, 162), (62, 129, 146), (55, 105, 114), (46, 105, 119), + (34, 72, 81), (43, 84, 94), (53, 97, 108), (104, 133, 137), + (128, 127, 133), (147, 159, 181), (171, 214, 230), (179, 214, 234), + (137, 183, 206), (88, 145, 164), (70, 126, 146), (53, 108, 129), + (25, 74, 107), (26, 55, 63), (19, 44, 49), (14, 28, 31), + (5, 4, 9), (2, 2, 5), (0, 0, 2), (0, 0, 0), + (1, 1, 1), (8, 0, 0), (11, 0, 0), (23, 10, 0), + (13, 13, 13), (13, 17, 16), (15, 14, 20), (16, 15, 20), + (31, 17, 8), (38, 25, 8), (47, 25, 4), (33, 15, 5), + (17, 23, 23), (16, 25, 25), (15, 27, 27), (16, 31, 34), + (24, 44, 43), (37, 46, 43), (40, 45, 49), (27, 46, 50), + (26, 46, 47), (22, 46, 48), (19, 37, 39), (14, 25, 27), + (15, 19, 20), (25, 13, 15), (46, 18, 17), (70, 26, 39), + (85, 34, 39), (97, 39, 35), (108, 48, 58), (86, 33, 61), + (48, 51, 56), (28, 52, 54), (25, 52, 59), (21, 56, 62), + (25, 58, 67), (26, 78, 92), (58, 120, 135), (89, 152, 170), + (94, 157, 172), (120, 177, 194), (89, 155, 171), (54, 121, 138), + (34, 82, 96), (27, 52, 56), (24, 35, 39), (13, 18, 21), + (8, 7, 5), (1, 1, 1), (0, 0, 0), (0, 0, 2), + (8, 10, 9), (10, 8, 9), (12, 7, 13), (11, 9, 10), + (3, 4, 6), (1, 1, 1), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (10, 0, 0), (11, 10, 8), + (14, 18, 19), (16, 27, 31), (33, 32, 40), (48, 36, 58), + (103, 55, 53), (122, 60, 49), (134, 68, 36), (100, 58, 34), + (69, 47, 24), (56, 37, 20), (39, 25, 14), (28, 18, 8), + (14, 15, 17), (14, 18, 19), (16, 20, 21), (33, 16, 24), + (55, 32, 16), (93, 50, 15), (160, 83, 31), (145, 68, 24) + ), + +// 124 dg085 +((82, 50, 8), (166, 101, 17), (136, 82, 19), (107, 64, 22), + (92, 56, 24), (77, 49, 27), (68, 46, 29), (60, 44, 31), + (59, 43, 30), (58, 42, 29), (58, 42, 29), (57, 41, 29), + (57, 40, 30), (60, 40, 29), (63, 41, 28), (68, 39, 21), + (74, 38, 14), (79, 45, 17), (74, 43, 18), (69, 41, 20), + (65, 40, 23), (62, 40, 26), (60, 40, 26), (59, 41, 27), + (59, 43, 30), (59, 43, 30), (59, 43, 30), (58, 42, 29), + (58, 42, 29), (57, 41, 27), (57, 41, 26), (57, 41, 25), + (57, 30, 11), (49, 28, 9), (52, 34, 18), (56, 40, 27), + (56, 40, 27), (56, 40, 27), (56, 39, 26), (57, 39, 25), + (40, 21, 4), (47, 19, 2), (55, 17, 0), (55, 23, 4), + (56, 29, 8), (58, 31, 9), (61, 33, 11), (72, 38, 13), + (85, 52, 19), (114, 66, 30), (127, 76, 35), (140, 86, 40), + (167, 93, 37), (194, 101, 34), (202, 106, 26), (211, 112, 18), + (182, 98, 26), (167, 96, 32), (153, 94, 38), (146, 85, 31), + (140, 77, 24), (140, 76, 28), (140, 76, 32), (140, 86, 40), + (147, 84, 43), (153, 92, 45), (133, 77, 35), (113, 63, 26), + (110, 61, 26), (108, 59, 26), (88, 56, 31), (63, 47, 34), + (60, 44, 31), (60, 43, 32), (60, 43, 33), (72, 50, 34), + (85, 57, 35), (92, 61, 33), (100, 66, 31), (118, 79, 40), + (157, 95, 56), (228, 151, 83), (241, 173, 84), (255, 195, 85), + (255, 205, 111), (255, 215, 137), (232, 205, 90), (230, 188, 80), + (228, 155, 86), (237, 151, 73), (246, 148, 61), (238, 147, 55), + (230, 146, 50), (210, 138, 66), (204, 126, 60), (192, 107, 42), + (168, 106, 65), (129, 85, 46), (132, 82, 38), (135, 79, 30), + (130, 76, 33), (126, 74, 37), (110, 73, 29), (131, 70, 25), + (146, 82, 21), (162, 84, 27), (178, 87, 34), (173, 90, 24), + (169, 93, 15), (151, 72, 13), (114, 63, 16), (104, 62, 20), + (103, 59, 20), (130, 59, 7), (134, 60, 8), (139, 62, 10), + (153, 88, 20), (165, 115, 30), (186, 116, 21), (207, 119, 19), + (183, 113, 41), (158, 100, 50), (133, 88, 59), (125, 84, 55), + (117, 80, 51), (112, 78, 51), (127, 90, 61), (166, 113, 69), + (198, 149, 90), (207, 172, 144), (186, 148, 117), (165, 125, 90), + (141, 91, 58), (116, 78, 42), (107, 64, 30), (83, 52, 31), + (59, 43, 30), (63, 41, 24), (67, 39, 18), (69, 40, 17), + (72, 42, 16), (77, 44, 0), (72, 40, 0), (67, 36, 15), + (61, 25, 11), (65, 39, 16), (65, 39, 17), (66, 39, 18), + (58, 40, 26), (57, 41, 26), (56, 40, 27), (57, 41, 28), + (58, 41, 33), (58, 41, 32), (59, 42, 32), (59, 42, 32), + (60, 43, 33), (62, 44, 32), (64, 46, 34), (85, 53, 30), + (91, 57, 30), (82, 44, 21), (80, 43, 19), (79, 43, 17), + (75, 29, 14), (72, 33, 0), (103, 37, 0), (121, 40, 0), + (134, 68, 0), (126, 64, 0), (118, 61, 0), (101, 44, 0), + (83, 40, 0), (66, 27, 0), (59, 10, 0), (57, 11, 0), + (60, 20, 0), (77, 41, 9), (94, 55, 16), (130, 69, 6), + (146, 71, 3), (147, 64, 0), (151, 72, 3), (162, 83, 4), + (134, 85, 44), (130, 83, 49), (126, 82, 55), (113, 88, 81), + (103, 87, 72), (110, 84, 67), (100, 73, 62), (97, 64, 45), + (103, 68, 36), (104, 60, 31), (90, 56, 31), (71, 50, 31), + (62, 46, 33), (60, 41, 35), (60, 40, 33), (59, 42, 32), + (60, 43, 33), (58, 44, 33), (56, 44, 32), (57, 48, 31), + (56, 48, 25), (57, 43, 30), (55, 41, 30), (53, 40, 32), + (54, 41, 32), (57, 43, 32), (57, 43, 34), (56, 41, 36), + (54, 44, 34), (60, 46, 35), (63, 46, 36), (64, 43, 40), + (85, 60, 53), (84, 63, 44), (98, 61, 35), (112, 67, 34), + (121, 77, 40), (128, 92, 60), (145, 105, 70), (150, 104, 68), + (149, 112, 85), (150, 117, 82), (164, 115, 82), (167, 123, 76), + (174, 114, 62), (177, 108, 51), (167, 100, 45), (187, 103, 31), + (201, 105, 19), (199, 102, 8), (172, 98, 9), (133, 74, 6), + (122, 66, 5), (108, 54, 10), (85, 46, 7), (77, 37, 11), + (65, 32, 13), (67, 31, 9), (78, 40, 1), (94, 42, 0), + (106, 53, 11), (117, 59, 9), (91, 55, 21), (91, 58, 27), + (75, 48, 19), (63, 44, 29), (60, 44, 31), (61, 42, 27), + (82, 48, 23), (103, 56, 28), (130, 66, 18), (160, 79, 23) + ), + +// 125 dg086 +((108, 104, 99), (218, 209, 200), (224, 212, 207), (230, 216, 215), + (226, 212, 211), (222, 208, 208), (218, 205, 205), (215, 203, 203), + (208, 190, 186), (209, 179, 181), (211, 168, 177), (213, 178, 184), + (215, 189, 192), (215, 195, 196), (215, 201, 200), (216, 204, 201), + (217, 208, 203), (225, 211, 210), (227, 210, 211), (230, 210, 212), + (228, 211, 212), (227, 213, 212), (227, 213, 211), (227, 213, 210), + (223, 219, 208), (224, 211, 207), (226, 204, 207), (224, 199, 202), + (223, 194, 198), (220, 193, 197), (218, 193, 196), (218, 191, 182), + (211, 184, 175), (205, 162, 171), (201, 156, 165), (198, 151, 159), + (189, 122, 134), (180, 93, 109), (171, 83, 101), (163, 74, 94), + (149, 66, 86), (138, 62, 81), (127, 58, 76), (134, 61, 80), + (142, 65, 85), (141, 65, 85), (141, 66, 86), (122, 103, 96), + (122, 114, 103), (133, 123, 111), (132, 121, 115), (131, 119, 119), + (132, 124, 118), (133, 129, 117), (139, 134, 122), (145, 139, 127), + (175, 166, 167), (193, 171, 174), (211, 176, 182), (216, 183, 189), + (222, 191, 196), (223, 194, 198), (224, 198, 201), (224, 204, 205), + (229, 215, 215), (244, 229, 226), (249, 236, 229), (255, 243, 232), + (255, 245, 241), (255, 247, 250), (250, 242, 240), (243, 240, 235), + (237, 223, 222), (238, 229, 227), (240, 236, 233), (241, 230, 228), + (243, 225, 223), (241, 223, 223), (240, 221, 223), (242, 224, 214), + (246, 219, 208), (227, 208, 204), (211, 199, 195), (196, 191, 187), + (192, 185, 180), (189, 180, 173), (179, 171, 160), (159, 151, 138), + (129, 123, 123), (138, 124, 127), (147, 126, 131), (154, 132, 132), + (162, 139, 133), (171, 154, 144), (183, 176, 168), (205, 180, 173), + (216, 189, 180), (217, 197, 190), (216, 198, 195), (216, 200, 201), + (216, 200, 203), (216, 201, 206), (217, 203, 203), (217, 203, 200), + (214, 187, 178), (205, 170, 168), (196, 154, 158), (192, 136, 146), + (189, 118, 134), (173, 82, 100), (168, 71, 90), (170, 74, 88), + (176, 87, 105), (197, 129, 144), (192, 136, 146), (188, 143, 148), + (185, 154, 149), (181, 154, 147), (174, 150, 140), (163, 155, 144), + (146, 138, 127), (151, 135, 127), (157, 132, 128), (163, 129, 128), + (169, 127, 129), (170, 123, 131), (159, 125, 115), (141, 120, 103), + (144, 112, 97), (125, 61, 78), (105, 66, 70), (86, 72, 63), + (87, 88, 80), (105, 93, 93), (113, 108, 102), (125, 117, 104), + (161, 149, 149), (185, 166, 162), (210, 183, 176), (215, 188, 181), + (220, 193, 186), (224, 195, 199), (227, 211, 211), (241, 219, 208), + (238, 214, 204), (226, 199, 190), (222, 196, 188), (218, 193, 186), + (213, 186, 177), (209, 182, 173), (208, 181, 174), (198, 170, 159), + (183, 156, 149), (178, 151, 144), (174, 147, 140), (163, 139, 135), + (164, 134, 132), (163, 136, 129), (165, 143, 119), (166, 158, 147), + (194, 167, 160), (206, 179, 172), (210, 183, 181), (214, 188, 191), + (214, 192, 194), (215, 193, 195), (217, 197, 198), (223, 203, 204), + (228, 210, 210), (228, 212, 211), (228, 214, 213), (228, 214, 213), + (226, 208, 208), (220, 206, 205), (216, 209, 199), (211, 196, 193), + (212, 185, 176), (200, 173, 166), (184, 159, 154), (174, 147, 140), + (167, 138, 134), (176, 141, 122), (172, 160, 138), (185, 171, 158), + (190, 188, 167), (189, 184, 173), (189, 181, 179), (203, 176, 169), + (198, 171, 164), (186, 166, 155), (178, 151, 144), (172, 144, 140), + (162, 134, 130), (163, 135, 131), (174, 143, 140), (198, 153, 160), + (212, 166, 176), (230, 185, 182), (233, 206, 197), (237, 210, 201), + (240, 213, 202), (236, 209, 198), (219, 199, 200), (204, 199, 195), + (198, 198, 190), (197, 187, 178), (183, 174, 165), (184, 157, 150), + (174, 147, 140), (177, 150, 143), (185, 158, 151), (188, 161, 154), + (196, 167, 161), (205, 168, 175), (219, 174, 179), (215, 191, 181), + (203, 201, 188), (200, 199, 181), (172, 163, 156), (155, 133, 135), + (130, 109, 106), (103, 77, 80), (87, 70, 62), (51, 44, 34), + (44, 35, 26), (82, 62, 63), (88, 92, 78), (107, 98, 93), + (118, 104, 95), (121, 111, 101), (122, 112, 111), (115, 103, 103), + (115, 97, 97), (148, 67, 86), (152, 67, 88), (155, 67, 89), + (160, 65, 85), (172, 81, 99), (185, 106, 125), (197, 141, 152), + (201, 154, 164), (199, 156, 163), (196, 149, 155), (185, 132, 140), + (179, 95, 111), (168, 76, 99), (165, 70, 90), (161, 77, 90), + (168, 86, 100), (176, 128, 116), (151, 126, 122), (144, 131, 125), + (135, 121, 118), (136, 128, 117), (140, 136, 124), (142, 132, 120) + ), + +// 126 dg089 +((57, 57, 57), (116, 116, 116), (111, 113, 116), (106, 111, 117), + (99, 106, 120), (93, 101, 124), (88, 98, 119), (83, 96, 115), + (78, 92, 105), (65, 96, 122), (52, 100, 140), (72, 103, 128), + (92, 106, 117), (103, 113, 122), (114, 121, 127), (118, 124, 127), + (123, 127, 128), (130, 133, 140), (133, 133, 134), (137, 134, 129), + (135, 135, 122), (134, 137, 116), (136, 135, 121), (138, 133, 127), + (133, 137, 138), (166, 161, 160), (200, 186, 183), (200, 190, 191), + (200, 195, 199), (204, 195, 202), (208, 195, 205), (212, 197, 200), + (214, 195, 180), (187, 187, 159), (163, 157, 141), (139, 128, 124), + (127, 123, 122), (115, 119, 120), (110, 115, 119), (105, 112, 118), + (95, 102, 118), (90, 97, 112), (85, 93, 106), (84, 88, 97), + (83, 84, 88), (91, 77, 80), (100, 71, 73), (125, 58, 67), + (137, 47, 46), (149, 44, 38), (145, 43, 41), (141, 43, 44), + (114, 59, 59), (87, 76, 74), (85, 83, 87), (84, 91, 101), + (99, 110, 116), (102, 108, 113), (105, 106, 111), (116, 106, 100), + (128, 107, 90), (130, 95, 79), (133, 84, 69), (141, 74, 45), + (135, 52, 46), (129, 40, 36), (91, 44, 40), (53, 48, 45), + (47, 49, 52), (41, 50, 59), (48, 51, 70), (51, 57, 69), + (69, 81, 93), (89, 85, 80), (110, 89, 68), (129, 97, 78), + (149, 106, 89), (163, 112, 98), (178, 118, 107), (195, 171, 145), + (198, 182, 169), (138, 137, 135), (128, 128, 126), (118, 120, 117), + (112, 114, 114), (107, 108, 112), (89, 99, 109), (77, 91, 104), + (59, 72, 80), (39, 58, 83), (20, 45, 86), (19, 38, 65), + (19, 31, 45), (16, 17, 37), (28, 28, 28), (30, 26, 27), + (31, 27, 28), (43, 33, 23), (36, 35, 40), (29, 37, 58), + (33, 43, 56), (38, 49, 55), (38, 50, 66), (38, 54, 79), + (57, 62, 66), (79, 62, 53), (101, 63, 40), (115, 52, 38), + (130, 41, 37), (132, 39, 34), (129, 39, 38), (122, 47, 54), + (90, 46, 59), (62, 71, 80), (70, 79, 88), (78, 88, 97), + (84, 92, 105), (93, 103, 113), (97, 111, 114), (97, 110, 119), + (88, 97, 112), (78, 90, 106), (68, 84, 100), (63, 86, 99), + (58, 88, 99), (45, 68, 100), (53, 79, 96), (70, 86, 99), + (89, 93, 102), (117, 118, 113), (122, 120, 115), (128, 123, 117), + (129, 126, 121), (127, 127, 125), (126, 127, 122), (118, 119, 123), + (102, 112, 121), (112, 119, 127), (122, 127, 133), (132, 132, 135), + (142, 138, 137), (193, 176, 166), (211, 185, 186), (210, 194, 194), + (211, 195, 195), (209, 183, 168), (198, 180, 168), (188, 178, 169), + (140, 141, 136), (136, 135, 131), (133, 130, 125), (128, 129, 123), + (120, 116, 113), (118, 116, 111), (117, 117, 109), (108, 119, 77), + (106, 121, 64), (95, 122, 71), (94, 120, 55), (74, 113, 60), + (81, 92, 98), (97, 98, 103), (98, 103, 101), (99, 109, 100), + (121, 116, 110), (126, 128, 125), (136, 141, 135), (150, 156, 156), + (209, 188, 185), (208, 191, 191), (207, 195, 197), (211, 199, 199), + (213, 201, 201), (214, 204, 205), (208, 200, 211), (196, 185, 199), + (177, 166, 180), (134, 138, 141), (123, 123, 123), (106, 109, 114), + (88, 94, 106), (75, 82, 101), (67, 82, 101), (60, 76, 99), + (67, 79, 93), (70, 84, 97), (73, 89, 102), (94, 91, 98), + (123, 98, 78), (147, 77, 65), (156, 69, 60), (140, 72, 73), + (117, 104, 87), (103, 101, 102), (105, 106, 111), (108, 112, 113), + (116, 111, 115), (108, 107, 113), (103, 106, 111), (89, 98, 107), + (82, 92, 104), (82, 88, 100), (84, 73, 81), (83, 75, 62), + (86, 93, 62), (122, 70, 59), (146, 56, 55), (150, 57, 40), + (155, 61, 62), (145, 75, 73), (156, 131, 127), (191, 165, 178), + (205, 173, 184), (189, 163, 176), (140, 139, 134), (128, 134, 134), + (123, 123, 121), (107, 111, 114), (95, 98, 115), (91, 98, 116), + (87, 93, 109), (84, 91, 107), (85, 92, 108), (86, 98, 112), + (88, 94, 108), (94, 99, 105), (96, 99, 106), (97, 100, 107), + (92, 98, 114), (89, 97, 116), (87, 96, 113), (88, 93, 112), + (89, 97, 110), (97, 102, 106), (111, 112, 114), (123, 123, 121), + (135, 134, 139), (189, 164, 170), (204, 188, 175), (205, 195, 194), + (194, 194, 204), (177, 174, 191), (134, 138, 141), (128, 133, 136), + (117, 129, 127), (110, 119, 118), (106, 115, 120), (108, 113, 117), + (115, 113, 116), (119, 116, 107), (118, 120, 109), (121, 122, 117), + (128, 131, 124), (138, 135, 128), (214, 176, 155), (168, 154, 153) + ), + +// 127 Apophysis-040426-1crabgrass from pat phillips patrx.deviantart.com +((237, 132, 109), (148, 73, 76), (112, 55, 75), (76, 38, 74), + (47, 23, 78), (19, 9, 82), (15, 6, 84), (12, 4, 87), + (0, 5, 84), (0, 37, 71), (0, 70, 58), (0, 98, 41), + (0, 127, 24), (0, 121, 15), (0, 115, 6), (13, 64, 3), + (27, 14, 0), (71, 35, 4), (61, 30, 24), (52, 26, 44), + (26, 71, 29), (0, 116, 14), (0, 119, 9), (0, 123, 5), + (0, 126, 8), (0, 121, 11), (0, 117, 14), (0, 109, 25), + (0, 101, 36), (0, 90, 51), (0, 80, 66), (0, 60, 91), + (34, 17, 86), (98, 50, 55), (119, 60, 47), (140, 70, 39), + (70, 98, 33), (0, 126, 28), (0, 126, 28), (0, 127, 28), + (0, 97, 72), (43, 69, 100), (86, 42, 129), (99, 50, 125), + (113, 58, 122), (123, 63, 127), (133, 68, 132), (149, 74, 132), + (155, 73, 128), (175, 87, 110), (169, 84, 124), (164, 81, 139), + (157, 78, 144), (151, 76, 149), (141, 70, 145), (132, 65, 141), + (87, 42, 79), (73, 36, 71), (60, 30, 63), (63, 31, 47), + (67, 33, 32), (82, 40, 41), (97, 48, 51), (127, 64, 76), + (167, 82, 70), (219, 108, 83), (223, 110, 94), (228, 112, 106), + (228, 112, 106), (228, 113, 107), (236, 117, 105), (253, 111, 105), + (220, 109, 143), (224, 111, 169), (229, 114, 195), (199, 100, 174), + (170, 86, 153), (146, 82, 134), (123, 78, 116), (63, 105, 58), + (0, 121, 47), (73, 115, 43), (123, 100, 45), (173, 85, 47), + (187, 92, 43), (201, 100, 39), (228, 123, 80), (241, 119, 82), + (253, 126, 74), (243, 121, 78), (234, 116, 83), (220, 109, 83), + (206, 102, 84), (179, 91, 79), (136, 68, 87), (100, 48, 82), + (47, 74, 76), (0, 118, 49), (0, 110, 41), (0, 103, 34), + (0, 97, 40), (0, 92, 46), (0, 66, 89), (0, 62, 89), + (46, 53, 62), (78, 54, 89), (110, 55, 117), (129, 64, 130), + (149, 73, 143), (186, 92, 167), (219, 108, 189), (231, 113, 196), + (237, 119, 200), (245, 126, 211), (238, 121, 203), (231, 116, 196), + (211, 105, 183), (201, 99, 142), (205, 84, 138), (185, 91, 151), + (176, 88, 157), (163, 81, 150), (150, 75, 143), (136, 67, 135), + (122, 60, 128), (100, 52, 132), (51, 25, 108), (50, 24, 98), + (45, 20, 59), (19, 8, 42), (17, 8, 48), (16, 8, 54), + (3, 0, 81), (0, 15, 88), (0, 33, 90), (0, 20, 90), + (4, 2, 51), (2, 1, 25), (0, 0, 0), (11, 5, 11), + (23, 11, 23), (34, 17, 22), (20, 9, 32), (0, 32, 70), + (0, 65, 54), (0, 127, 27), (0, 127, 30), (0, 127, 33), + (0, 111, 67), (106, 96, 119), (141, 70, 137), (155, 76, 147), + (183, 91, 164), (184, 91, 163), (186, 92, 163), (164, 81, 152), + (145, 72, 143), (114, 55, 115), (90, 42, 85), (80, 43, 84), + (83, 41, 80), (102, 52, 60), (119, 60, 66), (136, 68, 73), + (177, 88, 80), (185, 92, 108), (182, 90, 122), (180, 90, 158), + (168, 84, 180), (183, 92, 191), (199, 100, 202), (227, 113, 194), + (238, 118, 200), (244, 122, 204), (228, 195, 183), (255, 139, 149), + (255, 139, 104), (255, 141, 92), (253, 126, 86), (253, 126, 69), + (246, 122, 53), (245, 128, 46), (209, 104, 29), (157, 77, 24), + (118, 59, 28), (109, 54, 33), (100, 49, 39), (71, 34, 26), + (90, 44, 35), (99, 48, 58), (130, 63, 76), (154, 76, 94), + (193, 97, 82), (200, 100, 84), (201, 100, 83), (196, 97, 83), + (191, 100, 82), (154, 75, 99), (128, 64, 109), (155, 77, 104), + (163, 81, 141), (160, 79, 161), (165, 82, 165), (159, 78, 161), + (149, 77, 167), (143, 72, 159), (107, 53, 152), (74, 36, 117), + (35, 16, 99), (9, 5, 88), (0, 7, 85), (0, 31, 91), + (0, 47, 91), (0, 51, 91), (0, 70, 92), (0, 82, 84), + (0, 92, 79), (0, 91, 82), (0, 71, 82), (50, 22, 44), + (60, 30, 28), (83, 36, 39), (146, 73, 33), (197, 99, 60), + (216, 96, 90), (210, 105, 98), (209, 104, 101), (199, 100, 138), + (206, 106, 141), (222, 109, 190), (226, 114, 206), (228, 107, 226), + (220, 110, 207), (185, 91, 168), (157, 76, 154), (128, 65, 130), + (107, 53, 100), (102, 51, 90), (103, 51, 83), (122, 60, 101), + (124, 61, 109), (136, 69, 82), (164, 87, 43), (190, 94, 45), + (208, 104, 56), (217, 114, 84), (241, 123, 110), (252, 126, 143), + (253, 126, 152), (243, 121, 202), (252, 126, 210), (251, 125, 208), + (240, 118, 205), (219, 109, 191), (172, 85, 128), (192, 96, 161) + ), + +// 128 Apophysis-040426-12bs1fl +((238, 242, 215), (16, 91, 44), (59, 115, 27), (103, 140, 11), + (123, 162, 22), (144, 184, 33), (148, 191, 39), (152, 199, 45), + (181, 204, 45), (175, 191, 78), (169, 179, 112), (177, 179, 158), + (186, 179, 204), (203, 205, 208), (220, 231, 212), (222, 234, 217), + (224, 238, 222), (244, 237, 233), (239, 240, 228), (235, 243, 223), + (225, 238, 222), (215, 233, 221), (211, 228, 217), (208, 224, 213), + (186, 196, 187), (179, 201, 152), (173, 207, 117), (160, 137, 72), + (148, 67, 27), (133, 68, 23), (119, 69, 19), (96, 46, 1), + (73, 35, 36), (61, 108, 136), (82, 142, 155), (104, 177, 175), + (137, 178, 169), (171, 180, 163), (193, 181, 149), (216, 183, 135), + (244, 208, 136), (247, 225, 127), (250, 243, 119), (250, 244, 120), + (250, 245, 122), (244, 235, 127), (239, 226, 133), (239, 218, 173), + (226, 229, 203), (232, 237, 215), (216, 226, 176), (200, 215, 138), + (168, 204, 161), (137, 193, 185), (142, 187, 188), (148, 181, 192), + (168, 173, 196), (167, 170, 194), (166, 167, 193), (156, 92, 153), + (147, 18, 114), (129, 42, 100), (111, 67, 86), (111, 90, 42), + (101, 103, 34), (95, 101, 109), (102, 126, 139), (110, 151, 169), + (128, 165, 179), (146, 180, 189), (177, 205, 207), (209, 204, 218), + (223, 210, 159), (218, 190, 131), (214, 171, 104), (165, 123, 106), + (116, 75, 108), (101, 64, 104), (86, 54, 100), (54, 42, 86), + (23, 21, 64), (12, 34, 72), (19, 51, 80), (27, 69, 89), + (38, 68, 97), (50, 67, 105), (74, 55, 99), (72, 50, 93), + (120, 139, 109), (155, 161, 116), (191, 184, 123), (195, 175, 120), + (200, 166, 117), (198, 165, 119), (182, 147, 130), (169, 136, 124), + (164, 121, 129), (107, 147, 166), (86, 130, 152), (66, 113, 139), + (57, 111, 128), (49, 110, 118), (56, 102, 131), (80, 121, 146), + (140, 137, 173), (185, 149, 155), (230, 162, 138), (232, 166, 130), + (234, 170, 122), (245, 168, 120), (252, 126, 119), (251, 135, 133), + (251, 170, 128), (236, 216, 167), (232, 224, 173), (228, 233, 180), + (207, 219, 204), (190, 215, 212), (173, 203, 205), (144, 179, 190), + (106, 147, 166), (79, 124, 148), (52, 101, 130), (35, 106, 127), + (19, 112, 125), (12, 107, 119), (7, 105, 117), (18, 104, 119), + (40, 85, 118), (61, 80, 116), (79, 89, 120), (98, 99, 125), + (165, 113, 124), (195, 153, 135), (222, 192, 144), (229, 230, 169), + (252, 242, 206), (239, 227, 171), (227, 213, 137), (236, 222, 135), + (246, 232, 134), (252, 238, 194), (252, 243, 208), (250, 250, 213), + (244, 247, 223), (248, 249, 231), (241, 246, 228), (235, 244, 225), + (232, 242, 224), (222, 237, 224), (205, 229, 213), (194, 217, 215), + (163, 173, 195), (154, 159, 187), (145, 146, 179), (142, 128, 117), + (145, 119, 76), (121, 108, 83), (142, 98, 71), (159, 112, 60), + (163, 116, 64), (192, 195, 129), (200, 205, 163), (208, 215, 197), + (215, 226, 200), (232, 236, 215), (241, 241, 216), (244, 249, 206), + (215, 209, 145), (196, 201, 121), (178, 194, 98), (138, 171, 38), + (147, 147, 35), (162, 134, 13), (127, 79, 28), (98, 99, 31), + (49, 49, 14), (41, 49, 17), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (11, 12, 11), (34, 52, 47), + (89, 128, 153), (108, 147, 167), (128, 167, 181), (157, 190, 197), + (165, 195, 201), (177, 194, 205), (166, 196, 202), (162, 191, 199), + (166, 169, 147), (146, 139, 91), (149, 142, 62), (128, 129, 60), + (102, 103, 64), (48, 45, 84), (12, 24, 41), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (2, 2, 58), (10, 29, 71), + (32, 52, 94), (43, 47, 100), (67, 58, 114), (84, 57, 102), + (75, 60, 84), (49, 60, 77), (71, 87, 39), (106, 97, 32), + (84, 55, 45), (72, 75, 46), (39, 64, 69), (24, 72, 44), + (2, 79, 52), (22, 72, 45), (30, 51, 51), (27, 36, 33), + (29, 36, 49), (18, 17, 59), (13, 12, 59), (5, 3, 55), + (6, 14, 67), (38, 32, 74), (62, 57, 111), (63, 97, 116), + (107, 110, 151), (144, 128, 142), (143, 141, 125), (155, 153, 117), + (159, 172, 108), (200, 220, 61), (228, 234, 77), (240, 246, 96), + (215, 226, 106), (211, 186, 128), (205, 155, 102), (190, 90, 69), + (199, 62, 45), (171, 127, 74), (182, 157, 112), (201, 199, 129), + (215, 227, 138), (238, 244, 120), (247, 242, 113), (249, 248, 113), + (251, 249, 111), (248, 245, 113), (252, 240, 126), (242, 229, 192), + (243, 227, 215), (242, 245, 220), (244, 243, 217), (228, 230, 177) + ), + +// 129 Apophysis-040426-1cometnuc +((205, 7, 18), (205, 7, 18), (201, 9, 19), (198, 11, 21), + (198, 12, 21), (198, 13, 22), (196, 13, 22), (194, 13, 23), + (202, 9, 19), (203, 8, 18), (205, 7, 18), (205, 7, 18), + (205, 7, 18), (176, 21, 27), (148, 36, 36), (126, 47, 38), + (105, 58, 41), (111, 166, 35), (90, 156, 35), (70, 146, 36), + (93, 99, 37), (116, 52, 38), (150, 36, 33), (185, 21, 29), + (202, 9, 19), (203, 8, 18), (205, 7, 18), (203, 9, 19), + (202, 11, 20), (198, 13, 22), (194, 16, 24), (127, 46, 39), + (76, 72, 42), (123, 172, 119), (138, 180, 151), (154, 188, 184), + (112, 167, 152), (71, 146, 121), (88, 154, 77), (105, 163, 34), + (153, 187, 38), (177, 199, 45), (201, 212, 52), (205, 213, 53), + (209, 215, 55), (203, 212, 52), (198, 210, 50), (190, 206, 47), + (168, 195, 42), (111, 166, 35), (78, 150, 35), (46, 134, 36), + (30, 126, 37), (15, 118, 38), (14, 110, 37), (14, 103, 37), + (21, 100, 38), (30, 95, 38), (39, 90, 39), (85, 67, 38), + (132, 44, 37), (163, 28, 30), (194, 13, 23), (198, 11, 21), + (202, 9, 19), (198, 11, 21), (175, 99, 30), (153, 187, 39), + (175, 198, 44), (198, 210, 50), (245, 233, 91), (253, 237, 128), + (213, 217, 178), (183, 202, 181), (154, 188, 185), (94, 158, 152), + (34, 128, 119), (27, 124, 78), (21, 121, 37), (8, 106, 38), + (2, 109, 37), (9, 115, 37), (15, 118, 36), (21, 121, 35), + (24, 109, 36), (27, 97, 37), (39, 90, 41), (70, 75, 41), + (181, 19, 28), (191, 14, 23), (202, 9, 19), (202, 9, 19), + (202, 9, 19), (202, 11, 20), (198, 13, 22), (153, 33, 34), + (93, 63, 40), (27, 97, 39), (17, 101, 38), (8, 106, 38), + (5, 107, 38), (2, 109, 39), (2, 109, 39), (8, 106, 38), + (21, 100, 38), (30, 115, 36), (40, 131, 34), (49, 135, 35), + (58, 140, 36), (76, 149, 35), (127, 175, 35), (133, 178, 120), + (182, 202, 185), (245, 234, 150), (249, 235, 133), (253, 237, 116), + (249, 235, 98), (242, 232, 84), (225, 223, 67), (209, 215, 55), + (158, 190, 39), (134, 178, 36), (111, 166, 34), (96, 159, 35), + (82, 152, 36), (52, 137, 35), (33, 128, 37), (21, 121, 37), + (15, 118, 36), (21, 121, 35), (33, 127, 34), (46, 134, 34), + (70, 146, 34), (111, 166, 35), (138, 180, 36), (153, 187, 38), + (116, 169, 35), (90, 156, 36), (64, 143, 37), (61, 141, 35), + (58, 140, 34), (76, 149, 33), (116, 169, 35), (158, 190, 39), + (206, 214, 102), (219, 221, 176), (225, 223, 173), (231, 226, 170), + (253, 238, 119), (230, 226, 71), (172, 197, 43), (198, 13, 22), + (202, 11, 20), (202, 11, 20), (202, 11, 20), (198, 13, 22), + (158, 40, 44), (105, 58, 39), (70, 75, 39), (33, 93, 38), + (33, 93, 38), (58, 81, 42), (75, 72, 42), (93, 63, 42), + (127, 46, 39), (198, 13, 22), (202, 9, 19), (205, 7, 18), + (205, 7, 18), (205, 7, 18), (205, 7, 18), (198, 13, 22), + (153, 33, 35), (110, 55, 39), (99, 60, 42), (58, 81, 40), + (52, 137, 35), (64, 143, 35), (94, 158, 33), (127, 175, 36), + (158, 190, 40), (194, 208, 49), (219, 220, 62), (242, 232, 84), + (225, 223, 66), (215, 218, 60), (205, 214, 54), (181, 201, 44), + (138, 180, 38), (94, 158, 33), (52, 137, 35), (40, 131, 34), + (33, 128, 35), (21, 121, 37), (21, 121, 37), (28, 125, 129), + (47, 134, 141), (47, 134, 120), (46, 134, 38), (27, 125, 36), + (21, 121, 37), (9, 115, 37), (2, 112, 36), (2, 112, 36), + (2, 109, 37), (8, 106, 38), (21, 100, 40), (33, 93, 40), + (70, 75, 41), (110, 55, 41), (121, 49, 39), (148, 36, 37), + (116, 52, 41), (99, 60, 39), (70, 75, 41), (45, 87, 38), + (51, 84, 41), (87, 66, 41), (148, 36, 36), (198, 13, 22), + (202, 9, 19), (202, 9, 19), (202, 9, 19), (202, 9, 19), + (202, 9, 19), (205, 7, 18), (205, 7, 18), (205, 7, 18), + (205, 7, 18), (205, 7, 18), (205, 7, 18), (205, 7, 18), + (202, 9, 19), (198, 13, 22), (177, 28, 34), (190, 206, 47), + (240, 231, 79), (247, 234, 93), (253, 237, 112), (253, 238, 123), + (249, 236, 142), (249, 236, 144), (250, 236, 141), (247, 234, 147), + (248, 235, 148), (244, 233, 154), (222, 222, 174), (202, 212, 182), + (164, 193, 185), (205, 10, 123), (198, 13, 22), (202, 9, 19), + (205, 7, 18), (205, 7, 18), (205, 7, 18), (205, 7, 18) + ), + +// 130 Apophysis-040426-1passionscross +((52, 125, 24), (172, 93, 164), (141, 59, 144), (110, 25, 125), + (87, 22, 110), (64, 20, 95), (54, 28, 89), (45, 37, 84), + (59, 91, 123), (103, 78, 135), (148, 66, 148), (162, 82, 157), + (177, 99, 166), (181, 104, 169), (185, 109, 172), (185, 109, 172), + (185, 109, 172), (163, 82, 158), (147, 65, 148), (132, 48, 139), + (121, 36, 132), (110, 25, 125), (104, 19, 121), (99, 13, 118), + (87, 2, 110), (81, 5, 106), (76, 8, 103), (73, 11, 101), + (70, 14, 99), (73, 11, 101), (76, 8, 103), (93, 8, 114), + (116, 31, 128), (163, 82, 158), (170, 90, 162), (177, 99, 167), + (181, 104, 169), (185, 109, 172), (187, 111, 173), (190, 114, 174), + (209, 139, 187), (210, 141, 189), (212, 144, 191), (208, 139, 188), + (205, 134, 185), (201, 129, 182), (198, 125, 179), (190, 114, 174), + (185, 109, 172), (163, 82, 158), (147, 65, 148), (132, 48, 138), + (112, 28, 126), (93, 8, 114), (93, 8, 114), (93, 8, 114), + (82, 2, 106), (85, 2, 104), (88, 2, 103), (130, 48, 68), + (173, 94, 34), (189, 114, 43), (206, 135, 52), (253, 144, 57), + (219, 154, 62), (190, 114, 174), (194, 119, 177), (198, 125, 180), + (200, 127, 181), (202, 130, 182), (216, 149, 191), (242, 190, 76), + (248, 237, 83), (247, 218, 81), (247, 200, 79), (218, 157, 126), + (190, 114, 174), (181, 103, 169), (172, 93, 164), (158, 77, 154), + (148, 66, 148), (132, 48, 138), (118, 107, 71), (105, 166, 5), + (102, 164, 3), (99, 162, 2), (76, 144, 10), (33, 109, 35), + (45, 37, 84), (60, 22, 93), (76, 8, 103), (81, 5, 106), + (87, 2, 110), (93, 8, 114), (105, 19, 121), (116, 31, 128), + (127, 43, 135), (148, 66, 148), (164, 85, 158), (181, 104, 169), + (187, 112, 173), (194, 120, 177), (202, 130, 182), (212, 144, 190), + (205, 134, 185), (197, 124, 179), (190, 114, 174), (185, 109, 171), + (181, 104, 169), (181, 104, 169), (185, 109, 172), (185, 109, 172), + (185, 109, 172), (194, 120, 177), (196, 122, 178), (198, 125, 179), + (202, 130, 182), (205, 134, 185), (212, 144, 190), (219, 153, 194), + (231, 171, 201), (240, 188, 190), (249, 206, 180), (225, 217, 160), + (202, 228, 141), (202, 228, 141), (247, 200, 177), (253, 221, 180), + (253, 231, 85), (247, 237, 83), (245, 237, 82), (243, 238, 81), + (240, 239, 80), (219, 235, 69), (185, 219, 50), (163, 206, 38), + (99, 162, 2), (63, 133, 20), (27, 104, 39), (27, 79, 56), + (27, 55, 73), (51, 31, 88), (51, 31, 88), (51, 31, 88), + (39, 43, 80), (2, 83, 54), (2, 83, 54), (2, 83, 54), + (9, 88, 50), (9, 88, 50), (15, 93, 47), (21, 99, 43), + (9, 88, 50), (5, 85, 52), (2, 83, 54), (2, 77, 58), + (33, 49, 77), (58, 26, 92), (70, 14, 99), (99, 13, 118), + (116, 31, 128), (132, 48, 138), (121, 36, 131), (110, 25, 125), + (76, 8, 103), (64, 20, 96), (39, 43, 80), (14, 66, 65), + (40, 115, 32), (61, 132, 19), (82, 149, 7), (94, 158, 0), + (105, 166, 5), (105, 166, 5), (105, 166, 5), (116, 175, 12), + (163, 206, 38), (111, 170, 8), (105, 166, 5), (52, 125, 24), + (21, 99, 43), (33, 49, 77), (51, 31, 88), (58, 26, 92), + (39, 43, 80), (30, 51, 74), (21, 60, 69), (2, 83, 54), + (9, 88, 50), (21, 99, 43), (33, 109, 35), (64, 135, 17), + (88, 153, 3), (105, 166, 5), (122, 178, 15), (186, 220, 51), + (212, 232, 65), (230, 238, 75), (222, 236, 71), (209, 231, 63), + (190, 221, 53), (144, 194, 100), (168, 209, 118), (212, 144, 190), + (216, 149, 191), (222, 158, 195), (222, 158, 196), (216, 149, 191), + (212, 144, 190), (205, 134, 185), (185, 109, 172), (158, 77, 154), + (143, 60, 145), (121, 37, 131), (99, 13, 118), (70, 14, 99), + (58, 26, 92), (39, 43, 80), (21, 60, 69), (28, 88, 4), + (123, 91, 23), (94, 64, 96), (110, 25, 125), (105, 19, 121), + (93, 8, 114), (87, 2, 110), (87, 2, 110), (82, 2, 106), + (82, 2, 106), (82, 2, 106), (76, 8, 103), (70, 14, 99), + (58, 26, 92), (39, 43, 80), (14, 66, 65), (33, 109, 35), + (70, 139, 14), (88, 153, 3), (105, 166, 5), (182, 105, 39), + (158, 77, 154), (172, 93, 164), (177, 99, 167), (185, 109, 172), + (185, 109, 172), (190, 114, 174), (154, 200, 108), (194, 224, 55), + (222, 236, 71), (240, 239, 80), (243, 238, 81), (233, 238, 76), + (209, 231, 63), (163, 206, 38), (111, 170, 8), (8, 71, 62) + ), + +// 131 Apophysis-040426-1butterflyflower +((27, 19, 66), (27, 19, 66), (27, 19, 66), (27, 19, 66), + (27, 19, 66), (27, 19, 66), (27, 19, 66), (27, 19, 66), + (27, 19, 66), (27, 19, 66), (27, 19, 66), (27, 19, 66), + (27, 19, 66), (27, 19, 66), (27, 19, 66), (27, 19, 66), + (27, 19, 66), (53, 40, 50), (53, 40, 50), (53, 40, 50), + (53, 40, 50), (53, 40, 50), (53, 40, 49), (54, 41, 49), + (94, 83, 21), (77, 70, 31), (61, 58, 42), (44, 38, 54), + (27, 19, 66), (27, 19, 66), (27, 19, 66), (27, 19, 66), + (27, 19, 66), (27, 19, 66), (27, 19, 66), (27, 19, 66), + (27, 19, 66), (27, 19, 66), (27, 19, 66), (27, 19, 66), + (53, 40, 50), (76, 64, 33), (100, 89, 16), (109, 100, 10), + (118, 112, 4), (128, 117, 8), (138, 122, 13), (132, 117, 35), + (108, 105, 48), (113, 119, 63), (115, 111, 56), (118, 104, 50), + (108, 96, 33), (98, 88, 17), (96, 85, 18), (94, 83, 20), + (94, 83, 20), (95, 85, 19), (97, 87, 18), (103, 91, 15), + (109, 95, 13), (120, 103, 10), (131, 111, 8), (139, 138, 13), + (161, 164, 43), (208, 201, 81), (205, 197, 78), (203, 193, 75), + (202, 195, 73), (201, 197, 71), (179, 168, 67), (120, 117, 36), + (99, 88, 17), (96, 85, 19), (94, 83, 21), (94, 83, 21), + (94, 83, 21), (94, 83, 21), (94, 83, 21), (94, 83, 21), + (94, 83, 21), (94, 83, 21), (94, 83, 21), (94, 83, 21), + (94, 83, 21), (94, 83, 21), (94, 83, 21), (94, 83, 21), + (84, 74, 28), (60, 52, 42), (36, 31, 57), (31, 25, 61), + (27, 19, 66), (27, 19, 66), (27, 19, 66), (27, 19, 66), + (27, 19, 66), (27, 19, 66), (27, 19, 66), (27, 19, 66), + (27, 19, 66), (27, 19, 66), (27, 19, 66), (27, 19, 66), + (33, 22, 64), (57, 46, 49), (81, 71, 35), (87, 77, 28), + (94, 83, 21), (94, 83, 21), (94, 83, 21), (94, 83, 21), + (94, 83, 21), (53, 40, 50), (40, 29, 58), (28, 19, 66), + (27, 19, 66), (27, 19, 66), (27, 19, 66), (27, 19, 66), + (27, 19, 66), (27, 19, 66), (27, 19, 66), (27, 19, 66), + (27, 19, 66), (27, 19, 66), (27, 19, 66), (27, 19, 66), + (33, 37, 57), (80, 68, 30), (87, 75, 25), (94, 83, 21), + (101, 91, 14), (105, 93, 13), (104, 93, 13), (95, 100, 17), + (63, 68, 39), (46, 47, 48), (29, 27, 58), (28, 23, 62), + (27, 19, 66), (27, 19, 66), (53, 40, 50), (60, 48, 46), + (92, 76, 22), (94, 83, 21), (94, 83, 21), (94, 83, 21), + (94, 83, 21), (94, 83, 21), (94, 83, 21), (94, 83, 21), + (94, 83, 21), (73, 61, 35), (53, 40, 50), (53, 40, 50), + (53, 40, 50), (83, 68, 45), (92, 99, 41), (113, 91, 42), + (130, 119, 22), (175, 167, 46), (184, 180, 53), (193, 193, 61), + (182, 173, 52), (173, 156, 46), (157, 148, 29), (126, 120, 4), + (111, 100, 6), (110, 97, 7), (110, 95, 8), (114, 101, 5), + (127, 114, 2), (131, 115, 7), (131, 113, 9), (122, 121, 12), + (121, 144, 8), (132, 139, 8), (126, 127, 55), (116, 118, 109), + (102, 109, 77), (85, 76, 55), (54, 41, 50), (53, 40, 50), + (84, 63, 33), (89, 73, 27), (94, 83, 21), (94, 83, 20), + (104, 66, 13), (67, 47, 42), (53, 40, 50), (28, 19, 66), + (27, 19, 66), (27, 19, 66), (27, 19, 66), (27, 19, 66), + (29, 19, 66), (53, 40, 50), (67, 52, 43), (94, 83, 21), + (94, 83, 21), (94, 83, 21), (94, 83, 21), (94, 83, 21), + (94, 83, 21), (94, 83, 21), (94, 83, 21), (94, 83, 21), + (94, 83, 21), (77, 67, 37), (53, 40, 50), (27, 19, 66), + (27, 19, 66), (27, 19, 66), (27, 19, 66), (27, 19, 66), + (27, 19, 66), (27, 19, 66), (53, 40, 50), (64, 62, 57), + (96, 82, 52), (102, 94, 44), (91, 85, 48), (59, 47, 47), + (53, 40, 50), (53, 40, 50), (53, 40, 50), (27, 19, 66), + (27, 19, 66), (27, 19, 66), (27, 19, 66), (27, 19, 66), + (27, 19, 66), (27, 19, 66), (27, 19, 66), (27, 19, 66), + (27, 19, 66), (27, 19, 66), (27, 19, 66), (27, 19, 66), + (27, 19, 66), (27, 19, 66), (27, 19, 66), (27, 19, 66), + (27, 19, 66), (27, 19, 66), (27, 19, 66), (27, 19, 66), + (27, 19, 66), (27, 19, 66), (27, 19, 66), (27, 19, 66), + (27, 19, 66), (27, 19, 66), (27, 19, 66), (27, 19, 66) + ), + +// 132 Apophysis-040426-1Watcher +((65, 7, 0), (22, 10, 22), (19, 19, 29), (16, 28, 36), + (16, 42, 52), (16, 57, 68), (13, 64, 65), (10, 72, 63), + (46, 87, 61), (76, 73, 46), (106, 60, 31), (124, 56, 22), + (143, 52, 14), (179, 42, 12), (216, 32, 11), (230, 38, 15), + (245, 44, 20), (244, 64, 29), (228, 95, 29), (213, 127, 29), + (168, 156, 30), (123, 185, 32), (111, 139, 25), (100, 94, 19), + (198, 80, 46), (202, 55, 45), (206, 31, 45), (164, 42, 31), + (122, 53, 18), (111, 53, 21), (100, 53, 25), (88, 58, 29), + (58, 58, 39), (28, 75, 66), (21, 87, 72), (15, 99, 79), + (12, 106, 86), (10, 113, 93), (12, 122, 85), (15, 131, 78), + (28, 98, 40), (52, 79, 38), (76, 60, 36), (96, 56, 25), + (117, 52, 15), (130, 50, 14), (144, 48, 13), (201, 66, 14), + (242, 77, 53), (219, 75, 50), (176, 67, 37), (133, 59, 25), + (128, 43, 28), (123, 27, 32), (125, 41, 27), (128, 55, 22), + (117, 62, 31), (103, 63, 47), (89, 64, 63), (55, 57, 71), + (22, 51, 79), (19, 30, 76), (16, 9, 74), (58, 4, 64), + (64, 3, 59), (46, 28, 22), (43, 40, 32), (40, 53, 42), + (37, 57, 47), (34, 62, 52), (34, 84, 72), (33, 107, 83), + (40, 106, 85), (49, 101, 84), (59, 97, 83), (61, 90, 69), + (64, 84, 56), (73, 80, 52), (82, 77, 48), (89, 78, 66), + (100, 72, 69), (71, 80, 35), (97, 71, 32), (123, 62, 29), + (120, 58, 24), (117, 55, 20), (117, 48, 18), (133, 32, 5), + (154, 11, 4), (185, 5, 26), (216, 0, 49), (225, 2, 48), + (235, 5, 48), (247, 5, 41), (253, 3, 54), (253, 1, 55), + (251, 5, 55), (237, 7, 44), (195, 26, 27), (154, 46, 11), + (149, 47, 19), (144, 49, 27), (133, 60, 29), (127, 59, 24), + (122, 40, 4), (122, 29, 4), (122, 19, 4), (122, 17, 6), + (122, 15, 8), (128, 11, 9), (133, 3, 23), (116, 9, 37), + (106, 6, 14), (94, 9, 0), (88, 13, 4), (83, 17, 8), + (65, 15, 11), (41, 16, 8), (34, 7, 13), (28, 13, 23), + (47, 30, 26), (59, 29, 13), (71, 28, 0), (88, 23, 0), + (106, 19, 1), (117, 16, 4), (148, 33, 2), (177, 29, 9), + (212, 37, 0), (237, 10, 1), (224, 8, 7), (212, 6, 13), + (205, 24, 19), (177, 33, 8), (172, 38, 0), (190, 25, 20), + (213, 26, 56), (205, 40, 102), (198, 54, 149), (220, 98, 162), + (243, 142, 176), (168, 183, 198), (99, 176, 174), (77, 158, 114), + (116, 166, 94), (133, 29, 37), (140, 26, 32), (148, 23, 27), + (201, 26, 13), (216, 19, 15), (216, 13, 14), (209, 16, 10), + (177, 37, 1), (177, 35, 3), (177, 34, 6), (201, 23, 9), + (219, 13, 20), (233, 7, 32), (247, 6, 39), (253, 0, 64), + (254, 3, 98), (247, 20, 53), (237, 17, 52), (228, 15, 51), + (184, 34, 47), (138, 57, 28), (128, 29, 21), (172, 8, 28), + (225, 14, 32), (231, 10, 38), (237, 7, 44), (240, 2, 36), + (233, 13, 27), (205, 4, 7), (163, 18, 13), (123, 9, 7), + (106, 14, 1), (112, 3, 11), (139, 3, 23), (185, 1, 37), + (222, 4, 55), (233, 10, 38), (225, 22, 21), (247, 43, 15), + (247, 22, 5), (249, 16, 3), (252, 10, 2), (249, 15, 41), + (240, 34, 52), (248, 53, 52), (249, 72, 52), (249, 78, 54), + (245, 109, 57), (243, 196, 144), (243, 248, 241), (254, 228, 202), + (231, 197, 140), (216, 166, 59), (252, 110, 51), (252, 100, 51), + (250, 76, 35), (250, 67, 52), (248, 66, 53), (248, 63, 54), + (253, 50, 48), (252, 40, 51), (250, 37, 51), (253, 25, 51), + (253, 16, 47), (247, 9, 39), (231, 2, 54), (190, 10, 49), + (149, 6, 28), (144, 20, 37), (117, 51, 44), (83, 81, 54), + (99, 71, 44), (22, 45, 43), (71, 69, 46), (77, 68, 43), + (94, 69, 38), (100, 39, 37), (83, 31, 16), (71, 32, 3), + (83, 34, 4), (112, 57, 26), (117, 65, 34), (148, 138, 42), + (163, 182, 105), (254, 210, 127), (242, 247, 130), (253, 248, 95), + (249, 215, 71), (250, 118, 51), (253, 104, 46), (233, 103, 49), + (213, 102, 52), (146, 98, 87), (106, 71, 85), (89, 82, 55), + (70, 89, 62), (58, 96, 70), (52, 91, 64), (41, 71, 89), + (10, 87, 105), (21, 80, 98), (67, 70, 129), (89, 80, 78), + (89, 70, 70), (83, 58, 52), (64, 43, 53), (53, 49, 48), + (52, 37, 27), (64, 19, 11), (65, 7, 13), (77, 0, 17) + ), + +// 133 Apophysis-040426-1knotted +((151, 44, 78), (136, 52, 74), (136, 52, 73), (136, 53, 73), + (136, 53, 73), (136, 53, 73), (136, 53, 73), (136, 53, 73), + (136, 53, 73), (136, 53, 73), (136, 54, 73), (136, 53, 73), + (136, 53, 73), (136, 52, 72), (136, 51, 71), (136, 51, 71), + (136, 51, 71), (136, 52, 74), (128, 52, 101), (121, 52, 129), + (136, 47, 111), (151, 42, 94), (151, 43, 87), (151, 45, 81), + (136, 49, 71), (130, 53, 41), (125, 57, 12), (130, 55, 42), + (136, 54, 73), (136, 54, 73), (136, 54, 73), (136, 51, 71), + (136, 48, 72), (136, 17, 78), (143, 32, 79), (151, 47, 80), + (165, 44, 86), (179, 41, 93), (196, 79, 65), (213, 117, 38), + (253, 252, 89), (182, 215, 51), (111, 179, 14), (97, 142, 18), + (83, 105, 22), (57, 94, 23), (31, 84, 25), (12, 31, 35), + (10, 76, 10), (33, 106, 0), (41, 99, 14), (49, 92, 28), + (76, 80, 37), (103, 68, 47), (111, 64, 56), (119, 61, 65), + (136, 56, 72), (136, 55, 72), (136, 54, 73), (136, 53, 73), + (136, 53, 73), (136, 53, 73), (136, 53, 73), (136, 53, 73), + (136, 53, 73), (136, 52, 70), (136, 53, 71), (136, 54, 73), + (136, 55, 72), (136, 57, 72), (136, 58, 72), (125, 62, 74), + (85, 83, 50), (61, 113, 91), (37, 143, 133), (64, 111, 97), + (91, 80, 62), (97, 77, 60), (103, 74, 59), (119, 64, 64), + (136, 57, 72), (151, 50, 83), (151, 47, 82), (151, 45, 81), + (158, 44, 85), (166, 43, 90), (166, 40, 91), (179, 36, 97), + (179, 36, 97), (179, 31, 95), (179, 27, 93), (180, 28, 96), + (181, 29, 100), (196, 27, 102), (233, 3, 125), (254, 2, 128), + (254, 0, 131), (227, 9, 121), (203, 22, 109), (179, 36, 97), + (172, 39, 93), (166, 43, 90), (151, 44, 78), (151, 46, 77), + (136, 50, 71), (136, 50, 71), (136, 51, 71), (136, 52, 72), + (136, 53, 73), (136, 53, 70), (119, 60, 66), (91, 71, 79), + (85, 57, 86), (136, 58, 75), (136, 57, 73), (136, 57, 72), + (136, 57, 72), (136, 57, 72), (136, 58, 72), (119, 66, 64), + (85, 82, 40), (76, 80, 37), (67, 79, 35), (58, 86, 29), + (49, 94, 24), (49, 95, 31), (85, 76, 46), (119, 62, 65), + (136, 58, 72), (136, 53, 73), (136, 52, 72), (136, 51, 71), + (136, 49, 71), (136, 49, 71), (136, 49, 71), (151, 50, 72), + (151, 45, 78), (143, 48, 76), (136, 51, 74), (136, 51, 74), + (136, 52, 74), (136, 52, 74), (136, 53, 73), (136, 53, 73), + (136, 54, 73), (136, 54, 73), (136, 54, 73), (136, 54, 73), + (136, 53, 73), (136, 52, 74), (136, 52, 74), (136, 52, 74), + (136, 52, 74), (136, 52, 74), (136, 52, 74), (136, 52, 74), + (136, 53, 73), (136, 53, 73), (136, 53, 73), (136, 53, 73), + (136, 54, 73), (136, 57, 75), (136, 57, 73), (136, 57, 72), + (119, 61, 62), (105, 44, 24), (49, 48, 8), (37, 60, 4), + (70, 75, 37), (86, 69, 44), (103, 63, 52), (136, 52, 70), + (151, 43, 78), (166, 31, 83), (166, 33, 87), (166, 33, 87), + (179, 33, 91), (179, 30, 92), (136, 53, 73), (136, 53, 73), + (136, 53, 73), (136, 53, 73), (136, 53, 73), (136, 53, 73), + (136, 52, 70), (136, 52, 70), (136, 52, 70), (136, 53, 70), + (136, 53, 73), (136, 53, 73), (136, 53, 73), (136, 52, 74), + (136, 52, 74), (136, 52, 74), (136, 52, 74), (136, 52, 74), + (136, 52, 74), (136, 51, 71), (136, 51, 71), (136, 51, 71), + (136, 50, 71), (136, 50, 71), (136, 50, 71), (136, 49, 71), + (136, 50, 71), (136, 51, 71), (136, 53, 70), (136, 57, 72), + (119, 66, 67), (103, 74, 59), (85, 83, 47), (49, 100, 33), + (40, 142, 9), (0, 126, 8), (0, 113, 40), (14, 104, 40), + (31, 108, 17), (37, 106, 27), (67, 88, 36), (85, 72, 47), + (103, 70, 53), (119, 63, 65), (136, 56, 72), (136, 58, 75), + (136, 58, 75), (136, 58, 72), (119, 66, 67), (119, 63, 68), + (136, 58, 72), (136, 58, 75), (136, 57, 75), (136, 54, 73), + (136, 52, 74), (151, 48, 80), (151, 46, 81), (151, 43, 78), + (151, 40, 79), (166, 39, 84), (166, 42, 87), (166, 36, 89), + (166, 33, 87), (167, 36, 93), (179, 36, 93), (179, 36, 93), + (179, 30, 92), (179, 26, 93), (179, 23, 91), (208, 22, 85), + (243, 0, 0), (235, 52, 33), (156, 45, 68), (151, 46, 77), + (151, 45, 78), (151, 44, 78), (151, 43, 78), (151, 44, 78) + ), + +// 134 Apophysis-040426-1artdeco +((158, 142, 17), (249, 60, 97), (251, 61, 132), (253, 62, 168), + (253, 62, 168), (253, 62, 168), (253, 62, 168), (253, 62, 168), + (253, 62, 168), (253, 62, 168), (253, 62, 168), (248, 59, 129), + (244, 57, 90), (248, 59, 129), (253, 62, 168), (253, 62, 168), + (253, 62, 168), (253, 213, 226), (253, 213, 226), (253, 213, 226), + (253, 191, 148), (253, 170, 70), (253, 135, 52), (253, 100, 35), + (253, 73, 39), (253, 67, 103), (253, 62, 168), (253, 62, 168), + (253, 62, 168), (253, 62, 168), (253, 62, 168), (253, 213, 226), + (253, 213, 226), (253, 215, 229), (253, 214, 227), (253, 213, 226), + (253, 213, 226), (253, 213, 226), (253, 211, 225), (253, 210, 224), + (253, 62, 168), (253, 62, 168), (253, 62, 168), (253, 62, 168), + (253, 62, 168), (253, 62, 168), (253, 62, 168), (253, 62, 168), + (253, 62, 168), (253, 62, 109), (240, 119, 85), (228, 177, 61), + (220, 173, 55), (212, 170, 49), (212, 170, 49), (212, 170, 49), + (253, 173, 73), (253, 117, 120), (253, 62, 168), (253, 62, 168), + (253, 62, 168), (253, 62, 168), (253, 62, 168), (253, 62, 168), + (185, 28, 121), (70, 27, 86), (84, 20, 91), (99, 13, 97), + (133, 16, 107), (168, 19, 117), (205, 38, 124), (253, 62, 168), + (253, 62, 168), (253, 62, 168), (253, 62, 168), (248, 59, 128), + (244, 57, 88), (228, 49, 71), (213, 42, 54), (168, 76, 20), + (99, 113, 12), (202, 185, 67), (227, 207, 110), (253, 229, 153), + (253, 239, 178), (253, 249, 204), (253, 248, 200), (253, 223, 139), + (153, 140, 14), (142, 135, 8), (132, 130, 3), (147, 137, 11), + (163, 145, 19), (209, 168, 47), (253, 137, 46), (247, 59, 93), + (219, 45, 125), (127, 0, 106), (90, 18, 84), (53, 36, 62), + (47, 39, 65), (41, 42, 69), (46, 40, 77), (58, 33, 82), + (168, 19, 117), (210, 40, 142), (253, 62, 168), (253, 62, 168), + (253, 62, 168), (253, 62, 168), (253, 62, 168), (253, 62, 168), + (253, 62, 168), (253, 62, 168), (253, 62, 168), (253, 62, 168), + (253, 62, 168), (253, 62, 168), (253, 62, 168), (253, 62, 168), + (253, 62, 168), (253, 62, 168), (253, 62, 168), (253, 62, 168), + (253, 62, 168), (253, 62, 168), (253, 62, 168), (253, 62, 168), + (253, 62, 168), (240, 55, 84), (246, 58, 60), (253, 62, 37), + (253, 62, 37), (253, 70, 39), (236, 79, 43), (117, 119, 18), + (87, 107, 18), (54, 108, 24), (21, 110, 30), (30, 104, 35), + (39, 98, 40), (51, 89, 35), (58, 88, 49), (158, 25, 103), + (190, 30, 121), (198, 35, 4), (203, 37, 2), (209, 40, 1), + (222, 47, 9), (242, 56, 23), (253, 82, 36), (253, 143, 49), + (253, 193, 94), (247, 206, 93), (242, 220, 92), (253, 184, 85), + (228, 177, 61), (219, 173, 54), (253, 90, 36), (222, 47, 65), + (194, 32, 123), (88, 19, 92), (64, 30, 80), (41, 42, 69), + (9, 58, 62), (33, 80, 43), (87, 107, 18), (138, 196, 50), + (253, 243, 182), (253, 248, 204), (253, 253, 226), (253, 253, 233), + (253, 217, 230), (253, 223, 236), (253, 243, 247), (253, 249, 244), + (253, 253, 236), (253, 251, 213), (253, 237, 170), (253, 205, 112), + (228, 177, 61), (209, 168, 48), (105, 116, 10), (76, 101, 24), + (10, 58, 89), (13, 56, 86), (16, 55, 84), (34, 45, 73), + (83, 21, 42), (123, 1, 42), (139, 5, 35), (144, 7, 0), + (139, 5, 2), (123, 1, 15), (123, 1, 42), (89, 18, 37), + (47, 67, 21), (51, 89, 35), (58, 92, 32), (106, 63, 3), + (168, 20, 18), (186, 29, 11), (186, 29, 11), (177, 24, 16), + (164, 17, 23), (154, 12, 28), (154, 12, 28), (173, 22, 22), + (182, 26, 13), (202, 37, 2), (219, 45, 62), (230, 51, 125), + (253, 62, 168), (253, 62, 168), (253, 62, 168), (253, 62, 168), + (253, 62, 168), (253, 62, 168), (253, 62, 168), (253, 62, 168), + (253, 62, 168), (253, 62, 168), (253, 62, 168), (253, 62, 168), + (253, 62, 168), (253, 62, 168), (253, 62, 168), (253, 62, 168), + (237, 54, 125), (233, 52, 76), (249, 60, 31), (194, 33, 6), + (106, 111, 11), (64, 95, 29), (41, 64, 24), (34, 58, 28), + (53, 36, 62), (111, 7, 100), (181, 26, 119), (228, 27, 144), + (253, 62, 168), (253, 62, 168), (253, 62, 168), (253, 62, 168), + (253, 62, 168), (253, 62, 168), (253, 62, 168), (253, 62, 168), + (219, 20, 139), (185, 5, 119), (138, 4, 108), (94, 15, 55), + (71, 27, 50), (53, 73, 17), (82, 104, 21), (105, 116, 10) + ), + +// 135 Apophysis-040426-1expl_orange2a +((158, 205, 44), (158, 132, 20), (158, 126, 18), (158, 120, 16), + (158, 120, 16), (158, 120, 16), (158, 120, 16), (158, 120, 16), + (158, 126, 18), (158, 124, 17), (158, 123, 17), (158, 123, 17), + (158, 123, 17), (158, 124, 17), (158, 126, 18), (158, 126, 18), + (158, 126, 18), (158, 126, 18), (158, 126, 18), (158, 126, 18), + (158, 129, 19), (158, 132, 20), (158, 133, 20), (158, 135, 21), + (158, 140, 22), (158, 140, 22), (158, 140, 22), (158, 136, 21), + (158, 132, 20), (158, 132, 20), (158, 132, 20), (158, 129, 19), + (158, 123, 17), (158, 117, 15), (158, 109, 12), (158, 102, 10), + (158, 93, 7), (158, 84, 4), (158, 68, 4), (158, 53, 4), + (158, 15, 17), (158, 10, 23), (158, 5, 29), (194, 30, 35), + (231, 55, 42), (233, 72, 32), (235, 90, 23), (185, 117, 21), + (158, 111, 13), (158, 96, 8), (158, 99, 9), (158, 102, 10), + (158, 106, 11), (158, 111, 13), (158, 114, 14), (158, 117, 15), + (158, 120, 16), (158, 121, 16), (158, 123, 17), (158, 123, 17), + (158, 123, 17), (158, 121, 16), (158, 120, 16), (158, 120, 16), + (158, 114, 14), (158, 102, 10), (158, 97, 8), (158, 93, 7), + (158, 91, 6), (158, 90, 6), (158, 93, 7), (158, 93, 7), + (158, 102, 10), (158, 106, 11), (158, 111, 13), (158, 114, 14), + (158, 117, 15), (158, 118, 15), (158, 120, 16), (158, 123, 17), + (158, 129, 19), (158, 140, 22), (158, 157, 28), (158, 174, 34), + (128, 173, 60), (99, 172, 86), (76, 160, 139), (52, 146, 88), + (158, 143, 33), (158, 124, 22), (158, 105, 11), (158, 96, 8), + (158, 87, 5), (158, 62, 2), (158, 39, 35), (158, 29, 41), + (204, 17, 39), (158, 12, 1), (158, 16, 8), (158, 21, 15), + (158, 37, 9), (158, 53, 4), (158, 84, 4), (158, 93, 7), + (158, 108, 12), (158, 111, 13), (158, 114, 14), (158, 112, 13), + (158, 111, 13), (158, 105, 11), (158, 90, 6), (158, 71, 0), + (158, 39, 35), (111, 30, 124), (84, 58, 107), (58, 87, 91), + (156, 139, 62), (158, 143, 32), (158, 138, 22), (158, 138, 22), + (158, 143, 23), (158, 141, 22), (158, 140, 22), (158, 140, 22), + (158, 140, 22), (158, 138, 22), (158, 132, 20), (158, 138, 22), + (158, 138, 22), (158, 132, 20), (158, 132, 20), (158, 132, 20), + (158, 135, 21), (158, 138, 22), (158, 143, 23), (158, 148, 25), + (158, 192, 35), (179, 179, 62), (200, 166, 89), (220, 181, 99), + (240, 197, 109), (243, 217, 214), (253, 219, 230), (247, 65, 134), + (158, 114, 44), (158, 123, 40), (158, 126, 29), (158, 129, 19), + (158, 126, 18), (158, 120, 16), (158, 117, 15), (158, 117, 15), + (158, 117, 15), (158, 115, 14), (158, 114, 14), (158, 114, 14), + (158, 114, 14), (158, 114, 14), (158, 111, 13), (158, 108, 12), + (158, 105, 11), (158, 105, 11), (158, 106, 11), (158, 108, 12), + (158, 114, 14), (158, 117, 15), (158, 123, 17), (158, 126, 18), + (158, 120, 16), (158, 117, 15), (158, 114, 14), (158, 105, 11), + (158, 96, 8), (158, 93, 7), (158, 93, 7), (158, 96, 8), + (158, 96, 8), (158, 99, 9), (158, 105, 11), (158, 114, 14), + (158, 123, 17), (158, 129, 19), (158, 135, 21), (158, 140, 22), + (158, 145, 33), (108, 147, 55), (58, 149, 77), (46, 149, 63), + (33, 135, 58), (37, 62, 35), (8, 29, 64), (33, 7, 86), + (45, 32, 56), (141, 55, 26), (158, 66, 2), (158, 87, 5), + (158, 87, 5), (158, 90, 2), (158, 90, 6), (158, 93, 7), + (158, 96, 8), (158, 102, 10), (158, 105, 11), (158, 108, 12), + (158, 108, 12), (158, 108, 12), (158, 108, 12), (158, 111, 13), + (158, 114, 14), (158, 114, 14), (158, 114, 14), (158, 117, 15), + (158, 120, 16), (158, 123, 17), (158, 126, 18), (158, 132, 20), + (158, 132, 20), (158, 132, 20), (158, 132, 20), (158, 135, 21), + (158, 140, 22), (158, 146, 24), (158, 161, 29), (158, 180, 32), + (158, 195, 33), (158, 191, 34), (158, 174, 34), (158, 156, 27), + (158, 146, 24), (158, 143, 23), (158, 138, 22), (158, 135, 21), + (158, 132, 20), (158, 132, 20), (158, 132, 20), (158, 135, 21), + (158, 135, 21), (158, 135, 21), (158, 132, 20), (158, 132, 20), + (158, 126, 18), (158, 126, 18), (158, 126, 18), (158, 126, 18), + (158, 129, 19), (158, 132, 20), (158, 138, 22), (158, 143, 23), + (158, 146, 24), (158, 148, 25), (158, 148, 25), (158, 148, 25), + (158, 167, 29), (158, 176, 34), (158, 201, 34), (158, 201, 42) + ), + +// 136 Apophysis-040426-1heartFlowers +((98, 160, 76), (207, 247, 44), (212, 249, 50), (218, 251, 56), + (222, 250, 68), (227, 250, 81), (224, 250, 75), (221, 250, 69), + (218, 206, 45), (227, 177, 36), (236, 148, 28), (245, 119, 22), + (255, 90, 17), (240, 89, 8), (226, 89, 0), (221, 87, 0), + (217, 86, 0), (226, 79, 0), (216, 75, 0), (207, 72, 0), + (178, 53, 5), (150, 35, 10), (135, 26, 10), (120, 17, 11), + (84, 27, 3), (82, 46, 20), (81, 65, 37), (82, 61, 21), + (84, 58, 5), (83, 55, 2), (83, 52, 0), (111, 25, 0), + (127, 31, 26), (184, 45, 0), (195, 58, 0), (207, 72, 0), + (193, 124, 13), (179, 176, 27), (159, 186, 26), (140, 197, 25), + (213, 251, 46), (214, 251, 47), (215, 251, 48), (185, 219, 72), + (156, 188, 96), (152, 179, 122), (148, 170, 149), (197, 184, 199), + (245, 206, 215), (245, 221, 202), (221, 233, 157), (198, 246, 113), + (179, 236, 91), (160, 227, 70), (157, 226, 69), (154, 226, 69), + (131, 193, 32), (115, 186, 18), (100, 180, 5), (92, 129, 3), + (84, 79, 2), (116, 73, 8), (149, 67, 14), (166, 68, 0), + (202, 70, 0), (203, 50, 0), (188, 27, 0), (173, 4, 0), + (173, 4, 0), (173, 4, 0), (139, 17, 12), (84, 60, 3), + (36, 127, 3), (38, 137, 6), (40, 148, 10), (44, 117, 5), + (49, 86, 0), (50, 86, 0), (51, 87, 0), (63, 77, 0), + (58, 87, 20), (81, 79, 0), (117, 69, 2), (153, 60, 5), + (159, 64, 2), (166, 68, 0), (164, 65, 0), (135, 60, 15), + (54, 58, 73), (29, 58, 88), (4, 59, 103), (4, 74, 86), + (4, 90, 69), (6, 97, 24), (34, 136, 2), (26, 158, 2), + (25, 168, 21), (70, 136, 119), (105, 138, 129), (141, 140, 140), + (141, 140, 140), (141, 140, 140), (69, 131, 138), (68, 148, 136), + (46, 169, 58), (47, 154, 51), (49, 140, 45), (52, 118, 37), + (56, 97, 30), (81, 65, 37), (97, 55, 42), (119, 29, 24), + (152, 14, 12), (174, 0, 0), (174, 0, 0), (174, 0, 0), + (174, 0, 0), (174, 0, 0), (173, 4, 0), (149, 18, 10), + (81, 65, 37), (77, 70, 46), (73, 75, 56), (69, 86, 59), + (66, 97, 63), (45, 124, 123), (67, 142, 157), (68, 155, 128), + (142, 181, 95), (101, 176, 23), (79, 135, 24), (57, 95, 26), + (81, 65, 37), (107, 72, 12), (153, 65, 12), (173, 74, 0), + (173, 74, 0), (171, 71, 3), (170, 68, 6), (146, 64, 15), + (123, 60, 24), (81, 65, 37), (80, 45, 48), (86, 27, 69), + (101, 11, 88), (229, 0, 74), (242, 8, 70), (255, 17, 66), + (255, 17, 65), (249, 0, 32), (252, 0, 16), (226, 0, 28), + (181, 6, 4), (183, 10, 7), (186, 14, 10), (189, 41, 0), + (185, 67, 0), (173, 74, 0), (152, 98, 73), (151, 140, 116), + (141, 140, 140), (218, 196, 202), (230, 207, 202), (243, 218, 203), + (240, 216, 201), (190, 180, 197), (142, 156, 164), (177, 121, 126), + (164, 41, 34), (147, 57, 31), (131, 73, 29), (106, 178, 24), + (93, 184, 36), (82, 184, 33), (49, 148, 12), (8, 101, 29), + (24, 90, 47), (51, 66, 68), (64, 60, 66), (98, 48, 86), + (104, 27, 113), (96, 51, 127), (71, 105, 135), (69, 131, 147), + (119, 114, 98), (99, 94, 80), (79, 74, 62), (73, 75, 54), + (63, 80, 26), (56, 87, 12), (63, 80, 26), (81, 65, 37), + (122, 35, 26), (159, 39, 33), (164, 41, 34), (164, 41, 34), + (173, 4, 0), (174, 0, 0), (174, 0, 0), (174, 0, 0), + (174, 0, 0), (174, 0, 0), (201, 0, 30), (241, 0, 18), + (255, 35, 17), (255, 45, 14), (249, 65, 0), (244, 55, 0), + (255, 36, 10), (246, 48, 0), (230, 51, 0), (168, 42, 35), + (97, 55, 42), (76, 74, 70), (74, 108, 89), (57, 128, 129), + (67, 133, 165), (67, 141, 165), (66, 134, 166), (71, 110, 135), + (104, 27, 113), (96, 19, 82), (82, 28, 47), (84, 3, 29), + (112, 28, 23), (112, 28, 23), (127, 31, 26), (142, 35, 29), + (164, 41, 34), (168, 42, 35), (169, 42, 35), (169, 42, 35), + (173, 4, 0), (174, 0, 0), (174, 0, 0), (207, 0, 27), + (238, 0, 33), (255, 19, 16), (255, 25, 14), (226, 56, 47), + (199, 85, 82), (203, 130, 128), (220, 128, 128), (229, 68, 89), + (217, 55, 81), (203, 0, 35), (170, 0, 39), (156, 28, 35), + (98, 22, 86), (102, 34, 117), (70, 67, 139), (29, 75, 98), + (4, 94, 75), (64, 95, 55), (63, 100, 59), (59, 100, 86) + ), + +// 137 Apophysis-040426-1H-bird1g +((153, 203, 48), (58, 87, 65), (84, 118, 78), (110, 150, 91), + (139, 125, 63), (168, 100, 36), (176, 98, 28), (185, 97, 20), + (168, 76, 2), (168, 43, 6), (168, 10, 11), (168, 19, 14), + (168, 28, 18), (158, 53, 20), (148, 78, 22), (148, 84, 32), + (148, 91, 42), (185, 122, 53), (193, 129, 53), (201, 136, 54), + (208, 130, 48), (216, 125, 43), (208, 127, 45), (201, 130, 47), + (185, 122, 53), (124, 133, 51), (64, 144, 49), (48, 127, 37), + (33, 110, 26), (33, 101, 28), (33, 92, 30), (33, 64, 24), + (14, 80, 3), (58, 87, 5), (58, 87, 35), (58, 87, 65), + (48, 98, 71), (39, 110, 78), (48, 97, 73), (58, 85, 68), + (105, 55, 95), (129, 39, 109), (153, 23, 123), (142, 20, 126), + (132, 18, 130), (121, 18, 112), (110, 18, 95), (64, 27, 114), + (58, 124, 128), (14, 98, 92), (11, 91, 78), (9, 85, 65), + (9, 103, 32), (9, 121, 0), (24, 134, 0), (39, 147, 0), + (110, 182, 27), (118, 137, 31), (127, 93, 35), (104, 83, 56), + (82, 73, 77), (60, 84, 87), (39, 95, 97), (14, 118, 101), + (39, 140, 74), (132, 191, 25), (152, 202, 38), (172, 213, 51), + (194, 181, 59), (216, 149, 67), (201, 124, 70), (168, 42, 54), + (172, 56, 141), (152, 52, 141), (132, 48, 142), (132, 57, 142), + (132, 67, 143), (132, 82, 141), (132, 98, 140), (110, 81, 134), + (105, 61, 86), (148, 52, 50), (166, 27, 96), (185, 2, 143), + (200, 7, 145), (216, 13, 147), (216, 16, 90), (216, 17, 84), + (201, 18, 19), (201, 26, 12), (201, 34, 5), (201, 63, 10), + (201, 93, 16), (216, 100, 46), (201, 111, 30), (168, 94, 24), + (148, 60, 5), (105, 53, 22), (69, 66, 44), (33, 80, 67), + (36, 86, 78), (39, 93, 89), (64, 127, 80), (87, 156, 61), + (110, 165, 71), (147, 143, 67), (185, 122, 64), (185, 128, 66), + (185, 134, 68), (127, 145, 101), (110, 150, 91), (87, 134, 84), + (64, 138, 65), (39, 140, 33), (39, 139, 27), (39, 139, 21), + (14, 132, 23), (14, 127, 21), (39, 134, 24), (39, 128, 23), + (82, 82, 6), (48, 102, 20), (14, 122, 35), (14, 123, 34), + (14, 125, 33), (9, 119, 28), (9, 101, 41), (9, 97, 53), + (33, 85, 39), (105, 69, 15), (126, 73, 18), (148, 78, 22), + (168, 82, 20), (148, 78, 27), (127, 60, 22), (105, 53, 17), + (105, 26, 31), (107, 15, 32), (110, 5, 33), (107, 6, 38), + (105, 7, 44), (64, 8, 70), (64, 8, 71), (39, 8, 67), + (39, 3, 63), (39, 14, 69), (24, 11, 72), (9, 9, 75), + (33, 2, 73), (39, 4, 66), (39, 8, 62), (33, 2, 72), + (39, 14, 83), (39, 17, 86), (39, 20, 89), (33, 32, 76), + (39, 63, 74), (39, 95, 92), (39, 95, 100), (39, 96, 85), + (64, 85, 74), (168, 100, 46), (176, 114, 50), (185, 128, 55), + (185, 167, 32), (172, 213, 49), (172, 204, 71), (172, 172, 112), + (105, 178, 161), (118, 171, 126), (132, 165, 91), (110, 181, 39), + (110, 181, 39), (87, 170, 32), (64, 147, 50), (64, 144, 55), + (64, 138, 65), (127, 110, 36), (168, 94, 29), (148, 78, 22), + (105, 72, 29), (87, 53, 27), (87, 48, 30), (39, 4, 50), + (39, 17, 48), (39, 20, 38), (39, 24, 29), (39, 15, 1), + (39, 20, 47), (39, 4, 50), (39, 14, 65), (9, 32, 86), + (9, 44, 82), (14, 50, 44), (9, 121, 4), (9, 121, 0), + (14, 125, 32), (39, 129, 48), (64, 141, 60), (110, 158, 81), + (132, 161, 95), (153, 171, 99), (172, 167, 111), (172, 130, 145), + (172, 62, 124), (148, 45, 90), (132, 34, 68), (87, 14, 75), + (64, 20, 69), (39, 38, 65), (39, 53, 64), (64, 51, 117), + (110, 99, 124), (87, 125, 93), (110, 154, 80), (153, 202, 51), + (132, 193, 32), (110, 181, 16), (64, 158, 0), (39, 143, 18), + (39, 139, 21), (39, 142, 28), (39, 140, 33), (39, 140, 33), + (39, 142, 28), (39, 137, 22), (58, 108, 35), (105, 99, 25), + (105, 93, 13), (105, 68, 6), (127, 43, 15), (127, 42, 9), + (148, 43, 4), (127, 43, 8), (105, 68, 6), (105, 56, 12), + (105, 49, 26), (105, 23, 40), (110, 5, 29), (127, 7, 35), + (132, 24, 24), (148, 28, 10), (148, 24, 14), (148, 18, 26), + (153, 11, 88), (185, 7, 145), (185, 11, 148), (201, 24, 157), + (172, 38, 142), (172, 62, 146), (172, 68, 163), (172, 62, 139), + (172, 68, 127), (185, 143, 89), (172, 196, 84), (172, 208, 68) + ), + +// 138 Apophysis-040426-1Emergence2 +((210, 159, 116), (175, 151, 139), (159, 133, 120), (144, 115, 101), + (124, 105, 104), (104, 96, 107), (98, 94, 108), (93, 92, 110), + (99, 84, 107), (101, 70, 105), (103, 57, 104), (122, 65, 117), + (141, 73, 130), (124, 93, 132), (107, 113, 135), (94, 106, 132), + (81, 100, 130), (87, 98, 116), (91, 96, 89), (95, 94, 63), + (60, 57, 32), (26, 21, 2), (26, 21, 2), (26, 21, 2), + (21, 20, 2), (21, 19, 1), (22, 19, 0), (24, 20, 2), + (27, 21, 5), (65, 20, 24), (104, 20, 43), (158, 28, 36), + (197, 21, 34), (199, 26, 32), (142, 25, 33), (86, 24, 35), + (54, 22, 19), (23, 20, 3), (24, 21, 4), (25, 22, 5), + (118, 69, 62), (127, 72, 76), (136, 75, 91), (112, 78, 106), + (89, 81, 122), (46, 73, 138), (4, 65, 154), (47, 112, 142), + (74, 140, 152), (5, 154, 254), (42, 148, 205), (79, 142, 157), + (100, 136, 109), (121, 131, 62), (129, 127, 39), (137, 123, 16), + (179, 171, 2), (200, 186, 5), (222, 202, 9), (221, 200, 9), + (220, 199, 10), (220, 179, 25), (220, 160, 40), (207, 156, 13), + (164, 128, 31), (129, 83, 70), (121, 83, 84), (114, 83, 99), + (108, 100, 86), (102, 118, 73), (115, 122, 44), (136, 115, 48), + (190, 44, 45), (152, 46, 75), (114, 49, 105), (109, 36, 156), + (104, 24, 207), (131, 55, 169), (158, 87, 131), (190, 148, 74), + (207, 156, 15), (208, 155, 13), (206, 179, 13), (204, 203, 14), + (161, 224, 8), (118, 246, 3), (94, 231, 17), (25, 228, 59), + (112, 127, 8), (106, 105, 4), (101, 83, 1), (83, 75, 1), + (66, 67, 1), (26, 21, 2), (26, 21, 2), (26, 21, 2), + (27, 22, 3), (122, 52, 62), (141, 45, 68), (160, 38, 75), + (182, 27, 61), (204, 17, 48), (212, 15, 42), (188, 7, 48), + (79, 23, 32), (52, 22, 17), (26, 21, 2), (26, 21, 2), + (26, 21, 2), (26, 21, 2), (26, 21, 2), (82, 58, 12), + (131, 86, 19), (227, 118, 13), (235, 102, 14), (244, 87, 16), + (246, 84, 19), (254, 85, 20), (247, 84, 17), (246, 85, 17), + (192, 156, 36), (192, 161, 64), (193, 167, 93), (202, 165, 108), + (212, 163, 123), (190, 179, 113), (151, 128, 87), (123, 101, 88), + (99, 85, 82), (123, 76, 92), (123, 82, 96), (124, 88, 100), + (144, 90, 113), (170, 68, 89), (176, 26, 74), (212, 25, 80), + (212, 5, 21), (228, 28, 20), (245, 52, 19), (245, 52, 18), + (245, 53, 17), (233, 36, 20), (225, 26, 21), (208, 22, 45), + (162, 35, 44), (139, 38, 72), (142, 54, 61), (145, 70, 51), + (131, 81, 20), (123, 99, 13), (111, 102, 33), (107, 101, 65), + (104, 90, 81), (110, 96, 85), (117, 103, 90), (179, 174, 118), + (118, 164, 117), (164, 35, 40), (138, 69, 114), (125, 102, 130), + (105, 122, 140), (79, 129, 128), (61, 134, 128), (44, 140, 129), + (56, 143, 124), (78, 140, 125), (101, 140, 75), (136, 117, 22), + (191, 164, 11), (202, 200, 10), (214, 237, 9), (219, 241, 8), + (220, 239, 10), (214, 237, 11), (204, 208, 10), (185, 173, 3), + (154, 139, 14), (98, 169, 67), (0, 161, 93), (15, 233, 175), + (6, 227, 194), (25, 231, 231), (28, 249, 216), (19, 250, 196), + (141, 154, 136), (152, 148, 102), (164, 142, 69), (179, 136, 57), + (188, 118, 30), (172, 97, 29), (104, 79, 15), (26, 21, 2), + (26, 21, 2), (26, 21, 2), (26, 21, 2), (92, 79, 37), + (124, 96, 49), (145, 146, 80), (192, 187, 93), (242, 211, 68), + (230, 222, 61), (206, 188, 52), (172, 139, 36), (141, 143, 78), + (99, 156, 62), (117, 165, 63), (137, 172, 54), (205, 205, 11), + (216, 237, 12), (219, 237, 11), (222, 239, 10), (247, 232, 9), + (249, 231, 11), (248, 227, 12), (241, 226, 11), (229, 224, 2), + (219, 200, 10), (204, 182, 21), (175, 123, 47), (145, 121, 49), + (98, 112, 95), (93, 127, 111), (80, 121, 123), (71, 125, 89), + (59, 113, 89), (30, 29, 8), (26, 21, 2), (26, 21, 2), + (67, 19, 17), (114, 25, 55), (182, 43, 40), (231, 61, 12), + (245, 84, 16), (246, 85, 15), (244, 91, 11), (228, 119, 14), + (228, 119, 14), (227, 122, 17), (225, 123, 15), (210, 153, 12), + (206, 155, 12), (191, 120, 32), (198, 112, 55), (168, 88, 51), + (148, 69, 52), (128, 27, 95), (178, 24, 110), (220, 25, 81), + (225, 67, 32), (227, 120, 14), (208, 156, 11), (221, 203, 9), + (221, 239, 13), (231, 233, 61), (212, 187, 97), (216, 179, 111) + ), + +// 139 Apophysis-040426-1Egg +((116, 47, 60), (111, 50, 25), (113, 48, 42), (116, 47, 60), + (116, 47, 60), (116, 47, 60), (116, 47, 60), (116, 47, 60), + (116, 47, 60), (116, 47, 60), (116, 47, 60), (116, 47, 60), + (116, 47, 60), (90, 79, 100), (64, 111, 141), (73, 119, 146), + (82, 127, 152), (121, 162, 177), (126, 167, 180), (132, 172, 184), + (170, 191, 198), (209, 211, 213), (176, 194, 201), (143, 178, 189), + (110, 161, 173), (93, 152, 163), (76, 144, 154), (96, 95, 107), + (116, 47, 60), (116, 47, 60), (116, 47, 60), (148, 31, 4), + (133, 39, 7), (116, 47, 60), (116, 47, 60), (116, 47, 60), + (104, 92, 110), (93, 137, 160), (101, 144, 165), (110, 152, 170), + (132, 171, 184), (135, 173, 185), (138, 175, 187), (138, 175, 187), + (138, 175, 187), (138, 175, 187), (138, 175, 187), (138, 168, 185), + (132, 172, 184), (127, 166, 180), (110, 151, 170), (93, 137, 160), + (63, 110, 141), (33, 83, 122), (27, 56, 104), (21, 29, 86), + (52, 0, 65), (58, 5, 61), (64, 11, 57), (55, 8, 63), + (46, 5, 69), (36, 14, 75), (27, 23, 82), (15, 35, 90), + (14, 65, 110), (51, 100, 133), (78, 123, 150), (105, 147, 167), + (105, 147, 167), (105, 147, 167), (93, 137, 160), (70, 116, 145), + (116, 47, 60), (116, 47, 60), (116, 47, 60), (116, 47, 60), + (116, 47, 60), (116, 47, 60), (116, 47, 60), (116, 47, 60), + (116, 47, 60), (116, 47, 60), (102, 41, 51), (88, 36, 42), + (82, 30, 45), (76, 24, 49), (64, 11, 57), (64, 11, 57), + (40, 11, 74), (21, 32, 88), (2, 53, 102), (11, 62, 108), + (21, 71, 114), (21, 71, 114), (21, 71, 114), (27, 77, 118), + (21, 71, 114), (9, 41, 94), (27, 23, 81), (46, 5, 69), + (55, 8, 63), (64, 11, 57), (70, 18, 53), (82, 30, 45), + (116, 47, 60), (116, 47, 60), (116, 47, 60), (116, 47, 60), + (116, 47, 60), (116, 47, 60), (116, 47, 60), (116, 47, 60), + (116, 47, 60), (116, 47, 60), (116, 47, 60), (116, 47, 60), + (116, 47, 60), (116, 47, 60), (116, 47, 60), (116, 47, 60), + (116, 47, 60), (116, 47, 60), (116, 47, 60), (116, 47, 60), + (116, 47, 60), (94, 42, 38), (88, 36, 42), (88, 36, 42), + (82, 30, 45), (70, 18, 53), (73, 21, 51), (76, 24, 49), + (40, 85, 78), (64, 111, 141), (93, 137, 160), (116, 157, 174), + (132, 172, 184), (135, 173, 185), (138, 175, 187), (138, 169, 185), + (138, 164, 183), (138, 150, 176), (116, 47, 60), (172, 19, 26), + (190, 10, 43), (219, 2, 74), (236, 10, 104), (253, 19, 135), + (238, 12, 147), (138, 82, 128), (76, 122, 149), (70, 116, 145), + (21, 117, 121), (27, 100, 121), (33, 83, 122), (33, 83, 122), + (39, 88, 126), (58, 105, 137), (70, 116, 145), (76, 122, 149), + (70, 116, 145), (39, 126, 132), (39, 126, 132), (39, 126, 132), + (70, 141, 151), (99, 142, 163), (105, 147, 167), (105, 159, 170), + (70, 141, 151), (54, 133, 141), (39, 126, 132), (14, 113, 116), + (2, 107, 108), (27, 77, 118), (27, 92, 87), (70, 70, 56), + (116, 47, 60), (116, 47, 60), (116, 47, 60), (88, 36, 42), + (82, 30, 45), (70, 18, 53), (33, 17, 78), (9, 41, 94), + (33, 88, 83), (57, 76, 65), (82, 64, 47), (94, 42, 38), + (94, 42, 38), (94, 42, 38), (94, 42, 38), (94, 42, 38), + (88, 36, 42), (82, 30, 45), (76, 24, 49), (70, 18, 53), + (64, 11, 57), (64, 11, 57), (58, 5, 61), (58, 5, 61), + (64, 11, 57), (70, 18, 53), (82, 30, 45), (88, 36, 42), + (94, 42, 38), (116, 47, 60), (116, 47, 60), (116, 47, 60), + (116, 47, 60), (116, 47, 60), (116, 47, 60), (116, 47, 60), + (138, 110, 149), (116, 157, 174), (127, 166, 180), (127, 170, 182), + (127, 166, 180), (105, 159, 170), (76, 144, 154), (45, 94, 130), + (52, 79, 70), (116, 47, 60), (116, 47, 60), (116, 47, 60), + (116, 47, 60), (116, 47, 60), (116, 47, 60), (116, 47, 60), + (116, 47, 60), (116, 47, 60), (116, 47, 60), (116, 47, 60), + (116, 47, 60), (116, 47, 60), (116, 47, 60), (116, 47, 60), + (116, 47, 60), (116, 47, 60), (116, 47, 60), (116, 47, 60), + (116, 47, 60), (94, 42, 38), (88, 36, 42), (52, 79, 70), + (39, 88, 126), (58, 105, 137), (76, 122, 149), (82, 127, 152), + (76, 122, 149), (64, 111, 141), (51, 100, 133), (71, 70, 81), + (116, 47, 60), (116, 47, 60), (116, 47, 60), (116, 47, 60) + ), + +// 140 Apophysis-040426-1PenEgg +((128, 35, 86), (128, 35, 86), (128, 35, 86), (128, 35, 86), + (128, 35, 86), (128, 35, 86), (128, 35, 86), (128, 35, 86), + (128, 35, 86), (126, 37, 83), (124, 40, 81), (125, 93, 82), + (127, 147, 83), (158, 173, 99), (189, 199, 115), (172, 187, 131), + (155, 176, 147), (127, 128, 167), (127, 100, 129), (127, 73, 91), + (127, 54, 88), (128, 35, 86), (128, 35, 86), (128, 35, 86), + (128, 35, 86), (128, 35, 86), (128, 35, 86), (127, 36, 67), + (127, 37, 48), (149, 36, 30), (172, 36, 12), (206, 22, 1), + (222, 0, 0), (182, 34, 9), (153, 25, 15), (124, 16, 22), + (116, 22, 37), (109, 29, 52), (109, 28, 52), (110, 27, 53), + (128, 35, 86), (128, 35, 86), (128, 35, 86), (128, 35, 86), + (128, 35, 86), (128, 35, 86), (128, 35, 86), (128, 35, 86), + (190, 30, 60), (254, 105, 60), (248, 140, 69), (242, 175, 79), + (180, 175, 105), (118, 175, 132), (100, 159, 143), (82, 144, 155), + (127, 36, 87), (127, 35, 86), (128, 35, 86), (128, 35, 86), + (128, 35, 86), (128, 35, 86), (128, 35, 86), (128, 35, 86), + (128, 35, 86), (128, 35, 86), (128, 35, 86), (128, 35, 86), + (128, 35, 86), (128, 35, 86), (128, 35, 86), (128, 35, 86), + (127, 43, 77), (115, 68, 60), (104, 93, 44), (94, 118, 35), + (85, 143, 27), (71, 112, 32), (58, 81, 38), (18, 111, 118), + (24, 115, 122), (6, 99, 85), (8, 51, 70), (10, 3, 55), + (10, 4, 57), (10, 6, 59), (16, 10, 63), (40, 22, 72), + (124, 34, 79), (126, 34, 82), (128, 35, 86), (131, 34, 89), + (134, 33, 93), (210, 0, 114), (245, 67, 187), (229, 0, 127), + (127, 1, 122), (128, 35, 86), (128, 35, 86), (128, 35, 86), + (128, 35, 86), (128, 35, 86), (128, 35, 86), (128, 35, 86), + (128, 35, 86), (128, 35, 86), (128, 35, 86), (128, 35, 86), + (128, 35, 86), (108, 45, 74), (65, 33, 69), (34, 21, 72), + (22, 13, 66), (31, 17, 69), (45, 23, 70), (59, 29, 72), + (81, 38, 68), (92, 40, 64), (114, 46, 49), (127, 59, 20), + (127, 61, 19), (119, 45, 42), (112, 29, 65), (120, 32, 75), + (128, 35, 86), (128, 35, 86), (128, 35, 86), (128, 35, 86), + (124, 37, 86), (55, 12, 71), (55, 10, 56), (56, 9, 42), + (35, 1, 23), (32, 1, 23), (53, 3, 6), (77, 17, 22), + (106, 27, 56), (117, 31, 71), (128, 35, 86), (128, 35, 86), + (128, 35, 86), (128, 35, 86), (128, 35, 86), (128, 35, 86), + (127, 66, 118), (26, 120, 132), (25, 118, 127), (25, 116, 123), + (9, 97, 83), (54, 74, 72), (75, 54, 64), (123, 40, 81), + (128, 35, 86), (128, 35, 86), (128, 35, 86), (128, 35, 86), + (128, 35, 86), (128, 35, 86), (128, 35, 86), (128, 35, 86), + (128, 31, 83), (127, 15, 19), (133, 29, 17), (140, 44, 15), + (160, 44, 2), (165, 43, 18), (130, 46, 57), (128, 35, 86), + (128, 35, 86), (128, 35, 86), (128, 35, 86), (128, 35, 86), + (128, 35, 86), (127, 36, 85), (94, 41, 63), (90, 60, 41), + (46, 90, 8), (54, 74, 20), (70, 35, 45), (83, 20, 29), + (89, 62, 32), (94, 97, 32), (91, 145, 20), (99, 154, 26), + (101, 64, 62), (105, 54, 58), (109, 45, 55), (115, 94, 68), + (129, 120, 50), (165, 151, 75), (127, 139, 60), (251, 228, 131), + (241, 180, 78), (227, 215, 74), (212, 212, 81), (210, 214, 82), + (144, 172, 74), (127, 149, 77), (127, 126, 96), (77, 141, 153), + (87, 146, 157), (102, 155, 160), (159, 183, 189), (197, 198, 158), + (234, 222, 199), (217, 213, 147), (252, 230, 133), (240, 179, 79), + (250, 147, 72), (253, 136, 70), (253, 103, 58), (251, 83, 49), + (245, 38, 34), (176, 36, 12), (89, 45, 20), (70, 66, 0), + (29, 62, 27), (13, 39, 32), (16, 4, 47), (18, 0, 66), + (27, 0, 67), (66, 17, 75), (102, 32, 83), (128, 35, 86), + (128, 35, 86), (128, 35, 86), (123, 32, 78), (69, 22, 73), + (47, 24, 72), (33, 18, 69), (44, 24, 51), (83, 20, 31), + (94, 22, 42), (127, 28, 8), (133, 48, 27), (141, 47, 21), + (179, 37, 11), (199, 51, 29), (170, 42, 20), (127, 5, 36), + (127, 4, 41), (127, 3, 57), (128, 35, 86), (128, 35, 86), + (128, 35, 86), (128, 35, 86), (128, 35, 86), (128, 35, 86), + (128, 35, 86), (128, 35, 86), (128, 35, 86), (128, 35, 86), + (128, 35, 86), (128, 35, 86), (128, 35, 86), (128, 35, 86) + ), + +// 141 Apophysis-040426-1kaosGothic +((153, 26, 22), (233, 221, 164), (171, 190, 134), (110, 160, 104), + (82, 82, 68), (55, 4, 33), (30, 4, 33), (6, 4, 33), + (37, 123, 67), (37, 123, 67), (37, 123, 67), (26, 109, 53), + (16, 96, 40), (31, 88, 32), (47, 80, 25), (47, 80, 25), + (47, 80, 25), (47, 80, 25), (47, 80, 25), (47, 80, 25), + (47, 80, 25), (47, 80, 25), (47, 80, 25), (47, 80, 25), + (94, 56, 1), (70, 68, 13), (47, 80, 25), (47, 80, 25), + (47, 80, 25), (70, 68, 13), (94, 56, 1), (139, 34, 19), + (143, 32, 21), (139, 34, 19), (139, 34, 19), (139, 34, 19), + (116, 45, 10), (94, 56, 1), (103, 52, 3), (112, 48, 5), + (139, 34, 19), (139, 34, 19), (139, 34, 19), (133, 37, 16), + (127, 40, 13), (110, 48, 7), (94, 56, 1), (94, 56, 1), + (94, 56, 1), (94, 56, 1), (94, 56, 1), (94, 56, 1), + (94, 56, 1), (94, 56, 1), (94, 56, 1), (94, 56, 1), + (94, 56, 1), (94, 56, 1), (94, 56, 1), (94, 56, 1), + (94, 56, 1), (116, 45, 10), (139, 34, 19), (139, 34, 19), + (143, 32, 21), (177, 15, 38), (194, 8, 46), (212, 1, 55), + (212, 1, 55), (212, 1, 55), (228, 8, 63), (228, 8, 63), + (249, 19, 73), (230, 10, 64), (212, 1, 55), (175, 17, 37), + (139, 34, 19), (116, 45, 10), (94, 56, 1), (94, 56, 1), + (139, 34, 19), (139, 34, 19), (133, 37, 16), (127, 40, 13), + (110, 48, 7), (94, 56, 1), (94, 56, 1), (139, 34, 19), + (139, 34, 19), (116, 45, 10), (94, 56, 1), (73, 67, 11), + (52, 78, 22), (47, 80, 25), (47, 80, 25), (47, 80, 25), + (47, 80, 25), (37, 123, 67), (87, 148, 92), (138, 173, 117), + (157, 183, 126), (177, 193, 136), (233, 221, 164), (240, 225, 168), + (138, 173, 117), (96, 152, 96), (55, 132, 76), (55, 132, 76), + (55, 132, 76), (93, 78, 57), (139, 34, 19), (181, 13, 40), + (212, 1, 55), (251, 20, 74), (251, 20, 74), (251, 20, 74), + (253, 21, 75), (219, 214, 157), (240, 225, 168), (252, 230, 174), + (240, 225, 168), (246, 123, 121), (253, 21, 75), (251, 20, 74), + (249, 19, 73), (235, 12, 66), (212, 1, 55), (181, 13, 40), + (177, 15, 38), (139, 34, 19), (116, 45, 10), (94, 56, 1), + (94, 56, 1), (47, 80, 25), (47, 80, 25), (47, 80, 25), + (16, 96, 40), (11, 101, 46), (6, 107, 52), (6, 107, 52), + (6, 107, 52), (16, 96, 40), (47, 80, 25), (94, 56, 1), + (94, 56, 1), (94, 56, 1), (94, 56, 1), (94, 56, 1), + (94, 56, 1), (94, 56, 1), (94, 56, 1), (94, 56, 1), + (47, 80, 25), (47, 80, 25), (47, 80, 25), (47, 80, 25), + (47, 80, 25), (65, 71, 16), (94, 56, 1), (139, 34, 19), + (177, 15, 38), (181, 13, 40), (179, 14, 39), (177, 15, 38), + (143, 32, 21), (139, 34, 19), (139, 34, 19), (94, 56, 1), + (139, 34, 19), (158, 24, 28), (177, 15, 38), (181, 13, 40), + (181, 13, 40), (181, 13, 40), (177, 15, 38), (143, 32, 21), + (139, 34, 19), (94, 56, 1), (94, 56, 1), (47, 80, 25), + (47, 80, 25), (47, 80, 25), (94, 56, 1), (112, 48, 5), + (139, 34, 19), (139, 34, 19), (139, 34, 19), (127, 40, 13), + (94, 56, 1), (94, 56, 1), (139, 34, 19), (143, 32, 21), + (177, 15, 38), (181, 13, 40), (212, 1, 55), (212, 1, 55), + (201, 3, 50), (177, 15, 38), (139, 34, 19), (94, 56, 1), + (65, 71, 16), (47, 80, 25), (47, 80, 25), (16, 96, 40), + (14, 112, 56), (6, 107, 52), (16, 96, 40), (47, 80, 25), + (94, 56, 1), (94, 56, 1), (139, 34, 19), (181, 13, 40), + (212, 1, 55), (212, 1, 55), (212, 1, 55), (190, 8, 44), + (181, 13, 40), (181, 13, 40), (177, 15, 38), (143, 32, 21), + (139, 34, 19), (94, 56, 1), (47, 80, 25), (47, 80, 25), + (47, 80, 25), (16, 96, 40), (2, 102, 47), (16, 96, 40), + (16, 96, 40), (47, 80, 25), (94, 56, 1), (139, 34, 19), + (139, 34, 19), (99, 54, 0), (94, 56, 1), (94, 56, 1), + (47, 80, 25), (47, 80, 25), (47, 80, 25), (94, 56, 1), + (139, 34, 19), (143, 32, 21), (168, 20, 33), (177, 15, 38), + (181, 13, 40), (212, 1, 55), (228, 8, 63), (249, 19, 73), + (253, 21, 75), (253, 21, 75), (253, 21, 75), (249, 19, 73), + (235, 12, 66), (219, 4, 58), (181, 13, 40), (139, 34, 19) + ), + +// 142 Apophysis-040426-1KQNova +((82, 83, 39), (198, 92, 96), (200, 91, 77), (203, 90, 58), + (148, 82, 31), (94, 74, 5), (85, 70, 16), (76, 67, 28), + (2, 44, 42), (14, 46, 54), (26, 49, 67), (57, 36, 53), + (88, 24, 40), (91, 35, 43), (95, 47, 47), (86, 48, 44), + (77, 50, 41), (125, 179, 21), (145, 182, 33), (165, 186, 45), + (179, 184, 51), (193, 182, 58), (189, 173, 55), (186, 164, 53), + (167, 153, 48), (185, 138, 36), (204, 124, 25), (229, 87, 23), + (255, 50, 21), (237, 30, 18), (220, 11, 16), (178, 5, 11), + (167, 23, 14), (194, 31, 0), (222, 55, 13), (250, 79, 27), + (244, 99, 50), (238, 120, 74), (239, 117, 73), (241, 114, 73), + (168, 45, 12), (163, 34, 16), (158, 23, 20), (160, 13, 10), + (163, 4, 1), (165, 10, 2), (167, 17, 3), (197, 27, 2), + (216, 13, 9), (153, 18, 24), (151, 28, 55), (149, 39, 86), + (188, 19, 93), (228, 0, 100), (230, 4, 90), (232, 8, 81), + (235, 44, 16), (242, 45, 27), (249, 46, 39), (249, 63, 45), + (249, 80, 51), (251, 92, 91), (254, 104, 131), (236, 121, 124), + (245, 109, 97), (246, 155, 48), (233, 154, 64), (221, 153, 80), + (235, 157, 149), (249, 161, 219), (230, 207, 213), (218, 203, 180), + (222, 220, 199), (222, 224, 215), (223, 228, 231), (236, 238, 225), + (250, 249, 219), (248, 247, 217), (247, 246, 216), (253, 234, 178), + (251, 207, 162), (253, 131, 188), (247, 148, 126), (241, 166, 65), + (242, 178, 63), (244, 191, 61), (251, 238, 82), (252, 253, 115), + (149, 191, 189), (100, 165, 165), (52, 140, 141), (48, 136, 132), + (45, 132, 124), (98, 175, 69), (100, 176, 16), (74, 164, 4), + (52, 138, 13), (32, 100, 51), (48, 107, 64), (64, 114, 77), + (93, 113, 68), (123, 113, 60), (129, 117, 59), (92, 97, 57), + (122, 51, 65), (149, 76, 69), (177, 102, 73), (168, 119, 55), + (160, 136, 38), (153, 87, 0), (128, 83, 0), (138, 62, 0), + (134, 47, 28), (111, 57, 47), (107, 81, 34), (104, 106, 22), + (139, 159, 44), (204, 131, 78), (230, 84, 84), (247, 19, 116), + (229, 11, 150), (188, 34, 117), (147, 57, 85), (117, 72, 97), + (87, 88, 109), (76, 90, 99), (69, 94, 90), (58, 43, 76), + (21, 46, 66), (14, 94, 117), (20, 110, 124), (27, 126, 131), + (26, 135, 132), (74, 109, 89), (52, 95, 76), (86, 65, 74), + (127, 16, 35), (123, 18, 31), (120, 20, 28), (117, 14, 23), + (115, 8, 18), (76, 2, 29), (33, 1, 50), (7, 19, 67), + (26, 59, 90), (152, 72, 157), (171, 72, 162), (190, 72, 168), + (185, 45, 150), (177, 29, 123), (164, 38, 119), (126, 34, 99), + (86, 16, 86), (80, 19, 91), (75, 23, 97), (122, 66, 139), + (154, 77, 159), (133, 112, 145), (141, 163, 176), (168, 199, 193), + (212, 225, 182), (252, 210, 162), (240, 226, 155), (229, 243, 148), + (225, 239, 68), (232, 193, 64), (230, 178, 56), (225, 184, 58), + (209, 195, 73), (195, 206, 112), (181, 218, 151), (226, 237, 177), + (225, 234, 189), (245, 247, 210), (252, 244, 242), (252, 194, 232), + (250, 181, 226), (238, 188, 223), (231, 186, 215), (219, 174, 197), + (171, 161, 169), (126, 141, 122), (132, 137, 43), (105, 108, 21), + (168, 124, 25), (173, 129, 28), (179, 134, 31), (205, 101, 16), + (231, 139, 38), (248, 149, 48), (244, 186, 60), (236, 196, 65), + (246, 219, 80), (247, 246, 78), (236, 205, 65), (248, 171, 53), + (248, 115, 70), (253, 18, 93), (232, 7, 113), (216, 5, 120), + (213, 13, 148), (219, 15, 146), (223, 85, 180), (253, 132, 186), + (253, 145, 207), (243, 165, 205), (204, 158, 195), (145, 173, 174), + (111, 162, 166), (116, 155, 111), (142, 155, 49), (122, 175, 35), + (100, 153, 35), (63, 160, 27), (15, 103, 25), (3, 71, 24), + (3, 58, 39), (26, 84, 25), (51, 88, 19), (41, 68, 1), + (52, 37, 4), (64, 27, 1), (86, 7, 10), (100, 27, 54), + (138, 61, 81), (131, 132, 56), (159, 179, 80), (146, 161, 60), + (98, 112, 51), (39, 79, 68), (9, 54, 47), (2, 45, 36), + (9, 54, 31), (22, 41, 21), (22, 26, 25), (28, 0, 27), + (86, 7, 13), (86, 8, 8), (105, 1, 12), (122, 36, 35), + (132, 54, 52), (112, 20, 67), (92, 2, 53), (93, 9, 25), + (105, 16, 2), (116, 53, 12), (79, 68, 12), (87, 76, 31), + (47, 117, 29), (68, 157, 7), (92, 165, 0), (86, 137, 0), + (47, 109, 34), (30, 87, 44), (76, 59, 65), (152, 140, 40) + ), + +// 143 Apophysis-040426-1kaosframe +((249, 250, 185), (158, 204, 168), (114, 141, 121), (70, 79, 74), + (62, 67, 71), (55, 56, 68), (62, 67, 69), (70, 79, 70), + (93, 167, 144), (104, 174, 148), (116, 182, 152), (155, 203, 158), + (194, 224, 164), (210, 224, 139), (227, 225, 115), (213, 215, 102), + (200, 206, 89), (227, 0, 99), (205, 6, 98), (184, 12, 98), + (205, 118, 106), (227, 225, 115), (232, 229, 121), (237, 233, 127), + (251, 245, 160), (251, 245, 160), (251, 245, 160), (239, 235, 137), + (227, 225, 115), (213, 217, 102), (200, 209, 90), (166, 17, 95), + (166, 17, 95), (177, 35, 4), (177, 35, 4), (177, 35, 4), + (146, 48, 24), (116, 61, 45), (104, 65, 52), (93, 70, 60), + (55, 51, 70), (50, 71, 83), (45, 91, 96), (69, 130, 120), + (93, 169, 144), (93, 168, 146), (93, 167, 148), (116, 180, 156), + (158, 204, 177), (209, 232, 189), (225, 240, 188), (242, 248, 188), + (248, 249, 181), (254, 251, 175), (254, 251, 175), (254, 251, 175), + (253, 250, 174), (247, 249, 175), (242, 248, 176), (225, 240, 174), + (209, 232, 172), (201, 228, 168), (194, 224, 164), (177, 214, 156), + (138, 192, 152), (93, 164, 147), (104, 112, 96), (116, 61, 45), + (116, 61, 45), (116, 61, 45), (116, 61, 45), (93, 70, 56), + (45, 89, 50), (62, 66, 63), (79, 43, 76), (102, 36, 81), + (125, 30, 87), (135, 24, 92), (146, 19, 98), (200, 7, 105), + (237, 1, 97), (233, 9, 43), (221, 15, 31), (209, 21, 20), + (209, 21, 20), (209, 21, 20), (209, 21, 20), (222, 15, 32), + (253, 0, 71), (231, 10, 45), (209, 21, 20), (183, 32, 18), + (158, 43, 17), (200, 206, 89), (227, 225, 115), (237, 233, 127), + (237, 233, 127), (215, 213, 86), (176, 202, 113), (138, 192, 141), + (148, 198, 154), (158, 204, 168), (194, 224, 176), (209, 232, 178), + (233, 244, 178), (243, 247, 176), (253, 250, 174), (253, 251, 175), + (254, 252, 176), (253, 251, 181), (242, 248, 188), (222, 238, 190), + (222, 238, 190), (242, 248, 188), (245, 249, 186), (249, 250, 185), + (253, 251, 181), (253, 251, 181), (253, 251, 181), (253, 251, 181), + (222, 238, 190), (208, 231, 188), (194, 224, 186), (185, 219, 179), + (177, 214, 172), (138, 192, 162), (116, 180, 156), (116, 180, 151), + (116, 180, 156), (158, 205, 173), (176, 214, 174), (194, 224, 176), + (209, 232, 183), (209, 232, 189), (209, 232, 178), (194, 224, 176), + (116, 180, 156), (80, 134, 105), (45, 89, 54), (51, 98, 35), + (58, 108, 16), (70, 79, 9), (93, 70, 56), (93, 70, 56), + (93, 70, 60), (93, 70, 56), (93, 70, 58), (93, 70, 60), + (70, 79, 70), (93, 164, 147), (116, 180, 156), (158, 204, 168), + (222, 238, 190), (227, 241, 190), (233, 244, 190), (242, 248, 188), + (249, 250, 185), (253, 251, 181), (253, 252, 181), (253, 252, 181), + (253, 251, 181), (242, 248, 182), (237, 246, 180), (233, 244, 178), + (222, 238, 178), (222, 238, 178), (222, 238, 178), (233, 244, 178), + (242, 248, 176), (245, 249, 174), (249, 250, 173), (254, 248, 168), + (249, 249, 166), (251, 247, 160), (254, 251, 163), (254, 251, 169), + (254, 248, 168), (251, 245, 160), (254, 248, 156), (245, 242, 139), + (245, 240, 138), (237, 233, 116), (215, 216, 103), (245, 3, 100), + (253, 0, 71), (243, 4, 57), (233, 9, 43), (209, 21, 26), + (242, 200, 73), (237, 233, 121), (245, 240, 138), (245, 240, 150), + (222, 238, 178), (222, 238, 190), (222, 238, 190), (222, 238, 190), + (222, 238, 190), (233, 244, 190), (242, 248, 188), (249, 250, 185), + (253, 251, 181), (253, 251, 181), (254, 251, 175), (254, 248, 168), + (251, 245, 153), (245, 240, 121), (227, 225, 115), (215, 216, 97), + (184, 194, 75), (138, 52, 31), (177, 35, 4), (194, 28, 8), + (194, 28, 8), (209, 21, 20), (209, 21, 20), (222, 15, 32), + (233, 9, 43), (242, 4, 60), (254, 2, 79), (254, 3, 85), + (253, 0, 71), (222, 15, 32), (209, 21, 20), (194, 28, 13), + (158, 43, 17), (116, 61, 41), (116, 61, 45), (116, 61, 45), + (146, 23, 92), (166, 17, 95), (200, 7, 99), (237, 1, 97), + (251, 3, 90), (254, 3, 85), (254, 2, 79), (251, 3, 90), + (251, 3, 96), (237, 1, 97), (184, 12, 98), (166, 17, 95), + (103, 36, 82), (79, 43, 76), (103, 36, 86), (146, 23, 96), + (184, 12, 103), (227, 0, 105), (245, 3, 94), (254, 2, 79), + (254, 3, 91), (237, 1, 97), (184, 12, 98), (125, 30, 87), + (79, 43, 80), (79, 43, 80), (103, 36, 82), (146, 23, 92) + ), + +// 144 Apophysis-040426-147KaosRing +((82, 81, 4), (82, 76, 6), (82, 52, 23), (82, 29, 41), + (82, 30, 41), (82, 32, 42), (82, 48, 47), (82, 65, 53), + (82, 94, 63), (82, 97, 64), (82, 100, 65), (82, 87, 60), + (82, 74, 56), (82, 54, 49), (82, 35, 43), (82, 32, 42), + (82, 29, 41), (82, 29, 41), (82, 27, 40), (82, 26, 40), + (82, 26, 39), (82, 26, 39), (82, 26, 39), (82, 26, 40), + (82, 26, 40), (82, 29, 41), (82, 32, 43), (82, 61, 61), + (82, 90, 79), (82, 87, 70), (82, 85, 61), (82, 41, 45), + (82, 29, 41), (82, 20, 38), (82, 13, 36), (82, 7, 34), + (82, 6, 31), (82, 5, 29), (82, 4, 31), (82, 4, 33), + (82, 10, 35), (82, 11, 35), (82, 12, 35), (82, 14, 30), + (82, 17, 26), (82, 18, 25), (82, 20, 25), (82, 24, 25), + (82, 39, 15), (82, 82, 4), (82, 82, 4), (82, 82, 4), + (82, 74, 7), (82, 66, 10), (82, 49, 26), (82, 32, 42), + (82, 29, 41), (82, 27, 40), (82, 26, 40), (82, 24, 39), + (82, 23, 39), (82, 23, 39), (82, 23, 39), (82, 23, 39), + (82, 23, 39), (82, 21, 38), (82, 22, 38), (82, 23, 39), + (82, 23, 39), (82, 23, 39), (82, 20, 38), (82, 20, 38), + (82, 20, 38), (82, 18, 37), (82, 16, 37), (82, 14, 36), + (82, 13, 36), (82, 13, 36), (82, 13, 36), (82, 10, 35), + (82, 10, 35), (82, 14, 26), (82, 21, 23), (82, 29, 21), + (82, 50, 14), (82, 71, 8), (82, 81, 4), (82, 84, 3), + (82, 85, 3), (82, 85, 3), (82, 85, 3), (82, 85, 3), + (82, 85, 3), (82, 85, 3), (82, 80, 5), (73, 76, 44), + (82, 35, 43), (82, 32, 42), (82, 29, 41), (82, 26, 40), + (82, 26, 40), (82, 26, 40), (82, 29, 41), (82, 32, 42), + (82, 85, 60), (82, 94, 63), (82, 104, 66), (82, 105, 67), + (82, 107, 68), (82, 100, 64), (82, 80, 57), (117, 69, 51), + (82, 35, 43), (82, 23, 39), (82, 21, 38), (82, 20, 38), + (82, 16, 37), (82, 11, 34), (82, 11, 27), (82, 14, 26), + (82, 8, 28), (82, 9, 31), (82, 10, 35), (82, 11, 35), + (82, 13, 36), (82, 13, 36), (82, 13, 36), (82, 13, 36), + (82, 13, 36), (82, 13, 36), (82, 14, 37), (82, 15, 38), + (82, 16, 37), (82, 20, 38), (82, 24, 40), (82, 29, 41), + (82, 78, 5), (82, 73, 7), (82, 68, 9), (82, 50, 25), + (82, 32, 42), (82, 29, 41), (82, 26, 40), (82, 23, 39), + (82, 20, 38), (82, 13, 36), (82, 11, 35), (82, 10, 35), + (82, 7, 34), (82, 4, 33), (82, 1, 32), (82, 0, 31), + (82, 0, 31), (82, 0, 31), (82, 0, 31), (82, 0, 31), + (82, 0, 31), (82, 1, 32), (82, 1, 32), (82, 5, 29), + (82, 8, 28), (82, 20, 25), (72, 24, 12), (63, 29, 0), + (82, 72, 7), (82, 81, 4), (82, 84, 3), (82, 85, 3), + (82, 82, 4), (82, 75, 6), (82, 68, 8), (82, 25, 25), + (82, 17, 26), (82, 11, 27), (82, 5, 29), (82, 5, 29), + (82, 5, 29), (82, 5, 29), (82, 5, 32), (82, 10, 35), + (82, 16, 37), (82, 23, 39), (82, 32, 42), (82, 71, 55), + (82, 119, 71), (82, 122, 71), (82, 125, 72), (82, 147, 80), + (82, 163, 83), (82, 173, 88), (82, 180, 94), (82, 173, 89), + (82, 165, 86), (82, 146, 80), (82, 109, 68), (82, 97, 60), + (82, 70, 55), (82, 32, 42), (82, 29, 41), (82, 29, 41), + (82, 32, 42), (82, 58, 52), (82, 93, 62), (82, 124, 72), + (82, 141, 79), (82, 157, 78), (82, 129, 74), (82, 109, 68), + (94, 87, 21), (82, 83, 4), (82, 85, 3), (82, 85, 3), + (82, 85, 3), (82, 84, 3), (82, 81, 4), (82, 66, 9), + (82, 32, 42), (82, 29, 41), (82, 26, 40), (82, 23, 39), + (82, 20, 38), (82, 16, 37), (82, 10, 35), (82, 4, 33), + (82, 3, 30), (82, 3, 30), (82, 3, 29), (82, 5, 29), + (82, 8, 28), (82, 8, 28), (82, 8, 28), (82, 11, 27), + (82, 14, 26), (82, 14, 26), (82, 11, 27), (82, 8, 28), + (82, 8, 28), (82, 10, 35), (82, 13, 36), (82, 16, 37), + (82, 20, 38), (82, 23, 39), (82, 26, 40), (82, 27, 39), + (82, 41, 20), (82, 71, 8), (82, 78, 5), (82, 78, 5), + (82, 66, 10), (82, 35, 42), (82, 35, 43), (82, 83, 59), + (82, 109, 68), (82, 141, 79), (175, 154, 107), (175, 119, 79) + ), + +// 145 Apophysis-040426-147Fighting_Fish +((172, 212, 200), (212, 226, 92), (212, 211, 72), (212, 197, 53), + (178, 197, 53), (144, 198, 54), (98, 175, 34), (53, 152, 15), + (59, 114, 45), (118, 154, 90), (177, 195, 136), (174, 203, 168), + (172, 212, 200), (172, 212, 200), (172, 212, 200), (172, 212, 200), + (172, 212, 200), (172, 212, 200), (172, 212, 200), (172, 212, 200), + (192, 220, 152), (212, 228, 104), (212, 222, 88), (212, 216, 73), + (212, 197, 53), (212, 210, 69), (212, 224, 86), (192, 218, 143), + (172, 212, 200), (172, 212, 200), (172, 212, 200), (172, 212, 200), + (172, 212, 200), (172, 212, 200), (112, 182, 107), (53, 152, 15), + (53, 152, 14), (53, 152, 13), (53, 152, 13), (53, 152, 13), + (47, 149, 16), (50, 130, 32), (53, 111, 48), (53, 111, 39), + (53, 111, 30), (50, 130, 24), (47, 149, 18), (53, 152, 15), + (212, 190, 49), (212, 190, 49), (212, 190, 49), (212, 190, 49), + (212, 191, 49), (212, 193, 50), (212, 195, 51), (212, 197, 53), + (212, 214, 60), (212, 220, 69), (212, 227, 78), (212, 224, 74), + (212, 221, 71), (212, 220, 68), (212, 219, 65), (212, 211, 58), + (212, 212, 60), (212, 227, 95), (192, 219, 147), (172, 212, 200), + (172, 212, 200), (172, 212, 200), (172, 212, 200), (172, 212, 200), + (172, 212, 200), (172, 212, 200), (172, 212, 200), (172, 212, 200), + (172, 212, 200), (172, 212, 200), (172, 212, 200), (172, 212, 200), + (172, 212, 200), (172, 212, 200), (172, 212, 200), (172, 212, 200), + (172, 212, 200), (172, 212, 200), (172, 212, 200), (172, 212, 200), + (182, 199, 139), (147, 175, 107), (112, 151, 75), (85, 132, 63), + (59, 114, 51), (71, 122, 52), (144, 173, 93), (172, 212, 200), + (172, 212, 200), (172, 212, 200), (172, 212, 200), (172, 212, 200), + (158, 192, 158), (144, 173, 117), (53, 111, 73), (47, 105, 51), + (47, 105, 45), (47, 127, 31), (47, 149, 18), (47, 149, 16), + (47, 149, 15), (47, 149, 15), (47, 149, 16), (47, 149, 17), + (53, 111, 30), (53, 111, 79), (108, 148, 97), (164, 186, 116), + (172, 212, 200), (172, 212, 200), (172, 212, 200), (172, 212, 200), + (172, 212, 200), (192, 217, 142), (212, 223, 84), (212, 216, 73), + (212, 209, 63), (212, 199, 55), (212, 193, 50), (212, 193, 50), + (212, 193, 49), (212, 190, 49), (212, 191, 49), (212, 193, 50), + (212, 193, 52), (212, 205, 60), (186, 201, 116), (172, 212, 200), + (172, 212, 200), (172, 212, 200), (172, 212, 200), (206, 226, 173), + (240, 240, 147), (233, 243, 101), (212, 231, 92), (212, 229, 85), + (212, 225, 91), (212, 229, 93), (212, 230, 99), (212, 232, 106), + (228, 231, 152), (172, 212, 200), (172, 212, 200), (172, 212, 200), + (202, 212, 150), (207, 216, 128), (212, 221, 106), (212, 203, 61), + (212, 190, 49), (106, 146, 59), (59, 114, 45), (53, 111, 48), + (59, 114, 51), (172, 212, 200), (172, 212, 200), (172, 212, 200), + (172, 212, 200), (172, 212, 200), (172, 212, 200), (172, 212, 200), + (172, 212, 200), (172, 212, 200), (172, 212, 200), (172, 212, 200), + (172, 212, 200), (172, 212, 200), (172, 212, 200), (172, 212, 200), + (172, 212, 200), (172, 212, 200), (245, 249, 158), (252, 249, 166), + (253, 251, 155), (244, 243, 149), (212, 226, 93), (212, 195, 52), + (94, 138, 65), (73, 124, 60), (53, 111, 55), (53, 111, 48), + (53, 111, 48), (53, 111, 48), (53, 111, 48), (53, 111, 48), + (53, 111, 48), (53, 111, 48), (65, 119, 49), (159, 182, 101), + (172, 212, 200), (172, 212, 200), (172, 212, 200), (172, 212, 200), + (172, 212, 200), (53, 111, 96), (53, 111, 73), (53, 111, 55), + (53, 111, 55), (53, 111, 55), (47, 105, 69), (53, 111, 101), + (172, 212, 200), (172, 212, 200), (172, 212, 200), (172, 212, 200), + (172, 212, 200), (172, 212, 200), (172, 212, 200), (172, 212, 200), + (172, 212, 200), (172, 212, 200), (172, 212, 200), (172, 212, 200), + (172, 212, 200), (172, 212, 200), (172, 212, 200), (243, 248, 163), + (253, 251, 173), (253, 252, 167), (250, 251, 154), (242, 248, 162), + (172, 212, 200), (172, 212, 200), (172, 212, 200), (194, 207, 115), + (123, 158, 63), (71, 122, 23), (47, 105, 20), (53, 111, 8), + (53, 111, 3), (47, 149, 0), (53, 152, 1), (53, 152, 4), + (47, 149, 8), (47, 149, 15), (53, 152, 14), (53, 152, 12), + (53, 152, 4), (53, 152, 12), (53, 152, 12), (53, 152, 13), + (53, 152, 15), (212, 190, 49), (212, 201, 59), (212, 226, 93), + (219, 225, 147), (172, 212, 200), (172, 212, 200), (172, 212, 200) + ), + +// 146 Apophysis-040426-147ReachingMoon +((39, 17, 100), (46, 43, 45), (61, 44, 41), (76, 45, 37), + (67, 47, 38), (58, 49, 40), (45, 43, 44), (33, 37, 49), + (8, 2, 80), (11, 1, 81), (14, 0, 83), (14, 0, 83), + (14, 0, 83), (14, 0, 83), (14, 0, 83), (14, 0, 83), + (14, 0, 83), (14, 0, 83), (14, 0, 83), (14, 0, 83), + (11, 1, 81), (8, 2, 80), (11, 11, 72), (15, 21, 64), + (82, 67, 23), (143, 109, 40), (205, 152, 57), (215, 166, 76), + (225, 181, 95), (231, 187, 102), (237, 193, 109), (237, 193, 109), + (245, 191, 94), (247, 200, 106), (250, 205, 113), (253, 210, 120), + (247, 207, 120), (242, 205, 120), (247, 209, 120), (253, 213, 120), + (253, 248, 246), (223, 229, 201), (194, 211, 157), (178, 168, 93), + (163, 125, 29), (150, 119, 26), (138, 113, 24), (111, 84, 6), + (88, 76, 12), (105, 82, 8), (131, 101, 17), (158, 120, 26), + (174, 136, 39), (190, 153, 53), (204, 163, 68), (219, 173, 83), + (181, 137, 43), (137, 108, 27), (94, 79, 11), (66, 48, 55), + (39, 17, 99), (39, 17, 99), (39, 17, 99), (39, 17, 100), + (39, 17, 100), (39, 17, 99), (26, 8, 91), (14, 0, 83), + (11, 1, 81), (8, 2, 80), (2, 9, 75), (9, 18, 66), + (33, 37, 49), (39, 40, 47), (46, 43, 45), (52, 49, 38), + (58, 55, 32), (55, 50, 37), (52, 46, 42), (46, 43, 45), + (33, 37, 49), (15, 21, 64), (12, 19, 65), (9, 18, 66), + (9, 18, 66), (9, 18, 66), (15, 21, 64), (15, 21, 64), + (40, 40, 47), (33, 33, 53), (27, 27, 59), (21, 24, 61), + (15, 21, 64), (15, 21, 64), (9, 18, 66), (9, 18, 66), + (9, 18, 66), (2, 5, 78), (5, 3, 79), (8, 2, 80), + (8, 2, 80), (8, 2, 80), (2, 5, 78), (9, 18, 66), + (27, 27, 59), (18, 22, 62), (9, 18, 66), (9, 18, 66), + (9, 18, 66), (9, 18, 66), (2, 5, 78), (2, 5, 78), + (2, 9, 75), (27, 27, 58), (36, 35, 51), (46, 43, 45), + (58, 55, 33), (70, 61, 28), (88, 67, 22), (94, 79, 10), + (111, 93, 3), (122, 101, 11), (133, 110, 20), (143, 118, 28), + (153, 126, 36), (123, 175, 109), (172, 150, 159), (117, 182, 180), + (106, 180, 155), (89, 43, 58), (64, 30, 78), (39, 17, 99), + (39, 17, 100), (39, 17, 100), (39, 17, 100), (39, 17, 99), + (14, 0, 83), (26, 8, 91), (39, 17, 99), (39, 17, 99), + (39, 17, 99), (39, 17, 100), (39, 17, 100), (39, 17, 100), + (39, 17, 100), (14, 0, 83), (14, 0, 83), (14, 0, 83), + (8, 2, 80), (15, 21, 64), (33, 37, 49), (52, 40, 45), + (111, 87, 5), (134, 103, 15), (158, 120, 26), (177, 144, 55), + (205, 161, 70), (154, 189, 122), (99, 175, 144), (53, 153, 143), + (16, 135, 116), (27, 27, 58), (30, 32, 53), (33, 37, 49), + (33, 37, 49), (52, 46, 42), (70, 61, 28), (82, 64, 24), + (105, 91, 1), (105, 91, 1), (105, 91, 1), (88, 76, 12), + (88, 67, 22), (58, 49, 40), (40, 40, 47), (33, 30, 56), + (27, 27, 58), (9, 18, 66), (9, 18, 66), (9, 18, 66), + (2, 5, 77), (2, 5, 78), (8, 2, 80), (8, 2, 80), + (14, 0, 83), (14, 0, 83), (14, 0, 83), (14, 0, 83), + (14, 0, 83), (15, 21, 64), (33, 37, 49), (52, 46, 42), + (70, 61, 27), (111, 87, 5), (143, 107, 13), (163, 122, 27), + (194, 104, 19), (222, 100, 22), (242, 119, 35), (249, 151, 58), + (248, 156, 66), (253, 165, 74), (249, 151, 61), (247, 143, 55), + (206, 123, 35), (163, 125, 28), (116, 90, 3), (88, 76, 12), + (70, 61, 28), (65, 18, 22), (15, 21, 64), (8, 2, 80), + (8, 2, 80), (8, 2, 80), (8, 2, 80), (2, 5, 78), + (2, 5, 78), (8, 2, 80), (8, 2, 80), (8, 2, 80), + (8, 2, 80), (8, 2, 80), (8, 2, 80), (8, 2, 80), + (14, 0, 83), (14, 0, 84), (39, 17, 99), (39, 17, 99), + (33, 14, 97), (14, 0, 83), (14, 0, 83), (14, 0, 83), + (14, 0, 83), (14, 0, 83), (8, 2, 80), (8, 2, 80), + (14, 0, 83), (14, 0, 83), (8, 2, 80), (14, 0, 83), + (14, 0, 84), (33, 14, 97), (39, 17, 99), (39, 17, 99), + (39, 17, 99), (39, 17, 99), (33, 0, 70), (27, 27, 59), + (40, 40, 47), (58, 49, 40), (70, 61, 27), (88, 67, 22), + (111, 87, 5), (153, 118, 25), (209, 106, 23), (247, 41, 24) + ), + +// 147 Apophysis-040426-163KaosScepter +((230, 130, 36), (217, 93, 41), (196, 96, 29), (175, 100, 17), + (162, 94, 34), (150, 88, 51), (127, 77, 47), (105, 67, 44), + (105, 67, 44), (105, 67, 43), (105, 68, 42), (138, 84, 30), + (172, 100, 18), (188, 108, 23), (205, 117, 28), (217, 123, 31), + (229, 129, 35), (230, 130, 36), (240, 120, 38), (251, 110, 41), + (250, 109, 36), (250, 108, 32), (251, 109, 35), (253, 111, 39), + (246, 136, 39), (242, 134, 47), (239, 133, 55), (237, 117, 118), + (235, 102, 181), (235, 102, 182), (235, 102, 183), (211, 91, 180), + (139, 82, 99), (57, 46, 44), (32, 33, 33), (7, 21, 22), + (4, 16, 20), (1, 12, 18), (2, 12, 17), (3, 12, 17), + (10, 7, 16), (24, 20, 10), (39, 34, 4), (48, 24, 14), + (57, 14, 24), (58, 13, 23), (59, 13, 23), (53, 11, 12), + (42, 7, 14), (57, 14, 24), (58, 29, 31), (59, 44, 39), + (98, 63, 69), (137, 83, 99), (157, 92, 117), (177, 102, 135), + (234, 129, 188), (235, 131, 122), (236, 133, 56), (226, 113, 49), + (217, 93, 42), (201, 86, 41), (186, 80, 40), (172, 100, 18), + (148, 88, 52), (105, 67, 44), (105, 67, 44), (105, 67, 44), + (105, 67, 44), (105, 67, 44), (105, 67, 44), (105, 67, 44), + (105, 67, 46), (104, 52, 40), (103, 38, 34), (125, 62, 42), + (147, 87, 50), (148, 87, 50), (150, 88, 51), (187, 107, 54), + (178, 103, 136), (235, 132, 205), (242, 135, 208), (249, 139, 212), + (242, 135, 208), (235, 132, 205), (235, 132, 205), (249, 139, 212), + (255, 112, 204), (233, 102, 192), (212, 92, 181), (195, 83, 154), + (179, 75, 128), (142, 54, 96), (93, 61, 62), (51, 90, 37), + (55, 110, 26), (54, 152, 15), (112, 127, 17), (170, 102, 19), + (187, 109, 23), (205, 117, 28), (217, 93, 42), (186, 78, 42), + (148, 88, 51), (126, 77, 47), (105, 67, 44), (127, 77, 48), + (150, 87, 52), (172, 100, 18), (173, 101, 19), (205, 115, 27), + (205, 117, 28), (216, 123, 56), (183, 141, 97), (150, 159, 138), + (230, 225, 187), (238, 241, 196), (252, 252, 202), (252, 251, 203), + (247, 138, 203), (194, 96, 164), (141, 55, 126), (119, 44, 92), + (97, 33, 59), (53, 40, 68), (58, 44, 41), (59, 44, 39), + (46, 37, 22), (61, 44, 37), (83, 55, 40), (105, 67, 44), + (133, 80, 10), (169, 101, 18), (174, 98, 20), (150, 88, 51), + (105, 38, 30), (98, 34, 18), (92, 30, 7), (75, 37, 23), + (59, 44, 39), (53, 68, 45), (52, 91, 36), (105, 67, 44), + (150, 88, 51), (229, 129, 33), (229, 129, 34), (230, 130, 36), + (230, 130, 36), (246, 138, 40), (230, 130, 36), (230, 130, 36), + (211, 90, 157), (212, 105, 173), (213, 120, 190), (235, 132, 205), + (235, 132, 205), (211, 122, 190), (177, 102, 135), (187, 107, 54), + (205, 117, 28), (230, 130, 36), (230, 130, 36), (230, 130, 36), + (247, 137, 42), (247, 138, 47), (250, 138, 52), (251, 139, 53), + (251, 139, 53), (252, 140, 51), (254, 141, 49), (247, 137, 42), + (230, 130, 34), (205, 117, 28), (172, 100, 18), (136, 53, 3), + (136, 53, 1), (88, 57, 0), (53, 36, 18), (53, 36, 20), + (58, 15, 25), (50, 11, 56), (50, 11, 56), (12, 19, 35), + (0, 14, 21), (0, 14, 19), (0, 14, 17), (1, 12, 16), + (3, 12, 17), (12, 18, 30), (37, 28, 59), (39, 28, 62), + (52, 39, 67), (52, 45, 52), (59, 44, 39), (45, 38, 22), + (40, 35, 5), (40, 34, 8), (46, 37, 22), (59, 44, 39), + (95, 61, 62), (144, 86, 137), (211, 120, 190), (235, 132, 205), + (249, 139, 212), (250, 140, 213), (249, 139, 212), (249, 139, 212), + (249, 139, 212), (251, 139, 213), (253, 142, 211), (253, 142, 211), + (255, 141, 211), (253, 142, 211), (251, 138, 204), (249, 110, 193), + (235, 102, 181), (236, 133, 56), (239, 133, 55), (247, 137, 42), + (230, 130, 36), (205, 117, 28), (172, 100, 18), (134, 80, 6), + (89, 58, 3), (59, 44, 39), (51, 41, 68), (101, 63, 104), + (180, 77, 160), (212, 92, 181), (213, 120, 190), (235, 132, 205), + (255, 112, 207), (255, 111, 206), (255, 112, 204), (250, 109, 203), + (236, 103, 196), (211, 91, 180), (179, 76, 131), (137, 83, 99), + (95, 61, 62), (53, 68, 45), (45, 38, 22), (39, 35, 6), + (9, 9, 17), (11, 8, 17), (50, 9, 3), (91, 29, 6), + (89, 58, 1), (88, 58, 0), (87, 58, 0), (52, 37, 18), + (48, 36, 20), (39, 34, 5), (39, 35, 6), (58, 70, 6) + ), + +// 148 Apophysis-040426-163KSphere +((182, 186, 140), (128, 187, 78), (90, 167, 83), (53, 148, 89), + (56, 121, 89), (59, 95, 89), (71, 96, 89), (83, 97, 90), + (149, 95, 87), (124, 83, 77), (100, 71, 67), (91, 69, 55), + (83, 68, 44), (83, 66, 28), (83, 65, 13), (91, 63, 11), + (100, 61, 9), (83, 59, 11), (55, 42, 21), (28, 25, 32), + (28, 23, 24), (28, 22, 17), (28, 28, 9), (28, 34, 1), + (10, 37, 0), (19, 35, 3), (28, 34, 7), (28, 39, 23), + (28, 44, 39), (28, 44, 39), (28, 44, 39), (34, 53, 25), + (10, 61, 30), (10, 66, 38), (10, 60, 27), (10, 55, 16), + (10, 52, 15), (10, 49, 14), (22, 52, 19), (34, 56, 24), + (34, 122, 29), (43, 126, 21), (53, 131, 13), (68, 115, 9), + (83, 100, 6), (91, 94, 19), (100, 89, 33), (128, 78, 62), + (149, 101, 101), (164, 206, 162), (173, 201, 159), (182, 197, 156), + (190, 181, 123), (198, 166, 90), (198, 166, 90), (198, 166, 90), + (198, 160, 89), (149, 141, 81), (100, 122, 74), (76, 110, 71), + (53, 98, 69), (56, 91, 68), (59, 85, 67), (83, 97, 90), + (83, 103, 92), (100, 106, 56), (103, 85, 44), (106, 64, 32), + (94, 66, 41), (83, 68, 50), (83, 68, 44), (77, 83, 29), + (128, 117, 25), (148, 149, 30), (168, 181, 35), (168, 177, 36), + (168, 173, 38), (168, 166, 42), (168, 159, 47), (149, 138, 34), + (128, 111, 28), (123, 72, 6), (114, 65, 18), (106, 58, 30), + (106, 61, 31), (106, 64, 32), (128, 87, 47), (149, 85, 66), + (168, 114, 69), (168, 128, 60), (168, 143, 51), (183, 147, 42), + (198, 152, 33), (182, 120, 17), (182, 111, 32), (198, 104, 25), + (198, 113, 34), (225, 142, 37), (211, 148, 56), (198, 155, 76), + (190, 148, 71), (182, 141, 66), (168, 126, 62), (164, 108, 34), + (123, 69, 3), (103, 79, 2), (83, 89, 2), (91, 111, 1), + (100, 134, 1), (77, 139, 3), (77, 108, 21), (77, 105, 61), + (83, 97, 84), (83, 91, 77), (71, 91, 78), (59, 91, 80), + (59, 85, 73), (83, 74, 69), (59, 56, 26), (59, 56, 26), + (59, 34, 1), (71, 46, 6), (83, 59, 11), (71, 57, 18), + (59, 56, 26), (53, 71, 29), (53, 76, 31), (53, 71, 23), + (53, 71, 29), (34, 104, 69), (34, 101, 77), (34, 99, 86), + (34, 94, 84), (28, 86, 57), (10, 82, 61), (10, 82, 61), + (34, 67, 40), (58, 58, 30), (83, 49, 20), (94, 53, 28), + (106, 58, 36), (128, 72, 60), (149, 101, 95), (149, 107, 109), + (106, 124, 160), (53, 129, 115), (43, 118, 109), (34, 108, 104), + (10, 96, 87), (10, 93, 49), (10, 98, 46), (34, 81, 38), + (59, 80, 59), (59, 82, 63), (59, 85, 67), (53, 93, 55), + (34, 73, 54), (34, 64, 34), (59, 65, 13), (83, 71, 5), + (106, 106, 9), (128, 191, 52), (138, 194, 45), (149, 197, 38), + (164, 196, 81), (168, 210, 77), (225, 201, 71), (225, 163, 77), + (225, 190, 107), (225, 204, 133), (225, 219, 160), (225, 239, 218), + (213, 197, 219), (213, 222, 185), (182, 212, 116), (213, 203, 85), + (213, 199, 83), (213, 168, 85), (225, 145, 54), (168, 131, 58), + (164, 120, 53), (182, 105, 30), (164, 96, 21), (123, 82, 21), + (123, 78, 0), (114, 86, 7), (106, 94, 15), (128, 99, 34), + (149, 104, 54), (164, 126, 60), (144, 128, 66), (168, 111, 117), + (168, 98, 95), (149, 79, 64), (144, 98, 34), (123, 75, 14), + (100, 55, 7), (77, 49, 12), (53, 53, 5), (53, 59, 13), + (28, 70, 33), (34, 73, 54), (34, 89, 77), (59, 101, 89), + (83, 127, 120), (100, 156, 148), (144, 198, 192), (198, 181, 208), + (168, 187, 185), (149, 165, 138), (100, 177, 78), (77, 110, 69), + (83, 74, 52), (106, 67, 45), (128, 72, 54), (182, 28, 67), + (168, 25, 128), (164, 70, 112), (164, 77, 120), (106, 103, 100), + (83, 118, 130), (59, 73, 123), (34, 67, 97), (10, 77, 53), + (10, 34, 40), (10, 16, 36), (10, 16, 36), (28, 28, 15), + (34, 25, 8), (34, 37, 0), (53, 40, 8), (59, 34, 1), + (59, 44, 10), (53, 53, 5), (28, 47, 1), (34, 66, 16), + (28, 70, 33), (28, 75, 41), (28, 103, 38), (34, 104, 69), + (34, 94, 84), (34, 89, 96), (34, 94, 79), (34, 89, 72), + (53, 88, 53), (53, 101, 31), (77, 83, 29), (106, 70, 28), + (106, 76, 31), (128, 99, 34), (128, 111, 28), (149, 127, 40), + (149, 104, 54), (144, 139, 75), (144, 154, 99), (213, 227, 144) + ), + +// 149 Apophysis-040426-163KInterseed +((5, 5, 5), (2, 2, 2), (1, 1, 1), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (1, 1, 1), (1, 1, 1), (2, 2, 2), (2, 2, 2), + (3, 3, 3), (4, 4, 4), (6, 6, 6), (6, 6, 6), + (7, 7, 7), (8, 8, 8), (7, 7, 7), (6, 6, 6), + (4, 4, 4), (2, 2, 2), (2, 2, 2), (2, 2, 2), + (2, 2, 2), (2, 2, 2), (2, 2, 2), (2, 2, 2), + (2, 2, 2), (2, 2, 2), (2, 2, 2), (2, 2, 2), + (2, 2, 2), (4, 4, 4), (5, 5, 5), (7, 7, 7), + (7, 7, 7), (8, 8, 8), (8, 8, 8), (8, 8, 8), + (6, 6, 6), (4, 4, 4), (3, 3, 3), (2, 2, 2), + (2, 2, 2), (2, 2, 2), (2, 2, 2), (1, 1, 1), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (1, 1, 1), + (2, 2, 2), (4, 4, 4), (5, 5, 5), (7, 7, 7), + (37, 5, 16), (108, 49, 53), (180, 93, 91), (217, 168, 84), + (255, 244, 78), (255, 249, 76), (255, 255, 75), (255, 255, 83), + (255, 255, 91), (226, 225, 89), (143, 240, 64), (61, 255, 39), + (121, 215, 60), (181, 176, 82), (244, 227, 95), (163, 145, 83), + (67, 53, 23), (37, 30, 15), (7, 7, 7), (4, 4, 4), + (2, 2, 2), (1, 1, 1), (1, 1, 1), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (1, 1, 1), + (4, 4, 4), (6, 6, 6), (9, 9, 9), (10, 10, 10), + (11, 11, 11), (48, 48, 31), (116, 102, 59), (115, 185, 136), + (255, 255, 180), (213, 204, 67), (119, 188, 42), (25, 172, 17), + (24, 141, 44), (24, 110, 71), (39, 47, 42), (11, 11, 11), + (4, 4, 4), (2, 2, 2), (1, 1, 1), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (1, 1, 1), (2, 2, 2), (6, 6, 6), + (11, 11, 11), (163, 7, 156), (172, 79, 147), (181, 151, 138), + (151, 166, 162), (183, 255, 255), (255, 242, 252), (255, 255, 187), + (246, 239, 81), (183, 154, 60), (120, 70, 39), (86, 57, 25), + (52, 44, 12), (10, 10, 10), (6, 6, 6), (3, 3, 3), + (1, 1, 1), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (2, 2, 2), (3, 3, 3), (5, 5, 5), + (6, 16, 0), (9, 68, 5), (12, 121, 10), (21, 172, 17), + (55, 252, 32), (28, 180, 24), (20, 149, 13), (22, 77, 33), + (3, 20, 9), (3, 3, 3), (2, 2, 2), (2, 2, 2), + (1, 1, 1), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (1, 1, 1), + (2, 2, 2), (5, 5, 5), (8, 8, 8), (9, 9, 9), + (17, 10, 35), (41, 76, 70), (66, 114, 81), (18, 135, 104), + (1, 75, 58), (18, 9, 30), (9, 9, 9), (7, 7, 7), + (4, 4, 4), (2, 2, 2), (1, 1, 1), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (1, 1, 1), (2, 2, 2) + ), + +// 150 Apophysis-040426-163XmasFlwers +((220, 253, 46), (254, 142, 34), (253, 97, 17), (252, 53, 0), + (253, 37, 8), (255, 21, 17), (253, 10, 34), (252, 0, 52), + (240, 0, 54), (243, 0, 44), (246, 0, 34), (209, 0, 21), + (172, 0, 9), (113, 18, 23), (55, 36, 38), (66, 41, 44), + (77, 46, 51), (31, 79, 79), (43, 89, 54), (55, 100, 30), + (52, 93, 15), (49, 86, 0), (51, 88, 1), (54, 90, 3), + (78, 64, 38), (109, 62, 27), (140, 61, 17), (180, 49, 8), + (221, 38, 0), (238, 22, 7), (255, 6, 14), (255, 0, 11), + (240, 0, 22), (172, 0, 9), (125, 21, 4), (79, 43, 0), + (79, 62, 2), (79, 81, 5), (79, 78, 9), (80, 76, 13), + (78, 31, 51), (79, 15, 42), (81, 0, 34), (81, 25, 17), + (82, 51, 1), (65, 59, 4), (49, 67, 7), (40, 70, 5), + (0, 88, 19), (68, 160, 16), (52, 165, 31), (37, 171, 47), + (51, 159, 103), (65, 148, 159), (65, 149, 148), (65, 151, 138), + (70, 82, 70), (63, 89, 48), (56, 97, 27), (59, 88, 20), + (63, 80, 13), (72, 66, 11), (81, 52, 10), (80, 13, 15), + (75, 0, 16), (172, 0, 9), (195, 21, 46), (218, 42, 83), + (221, 53, 90), (225, 65, 97), (237, 76, 104), (255, 17, 79), + (239, 0, 57), (211, 0, 69), (183, 0, 82), (148, 15, 73), + (114, 31, 64), (95, 38, 57), (77, 46, 51), (70, 76, 55), + (69, 81, 61), (78, 64, 38), (79, 66, 23), (81, 69, 9), + (95, 67, 11), (110, 66, 13), (171, 66, 0), (171, 66, 0), + (172, 0, 9), (172, 0, 9), (172, 0, 9), (175, 0, 12), + (178, 0, 15), (172, 0, 9), (146, 54, 11), (78, 64, 38), + (78, 67, 37), (56, 97, 27), (40, 129, 13), (24, 161, 0), + (27, 151, 0), (31, 142, 0), (47, 110, 11), (56, 94, 22), + (78, 64, 38), (78, 64, 38), (78, 64, 38), (78, 64, 38), + (78, 64, 38), (78, 64, 38), (65, 79, 43), (56, 96, 29), + (56, 94, 22), (63, 79, 0), (72, 69, 5), (81, 59, 10), + (82, 38, 0), (171, 0, 5), (171, 0, 5), (81, 0, 26), + (81, 0, 34), (115, 29, 17), (149, 58, 0), (167, 50, 0), + (186, 43, 0), (207, 0, 34), (228, 0, 47), (224, 26, 0), + (220, 28, 0), (171, 66, 0), (138, 62, 15), (106, 59, 30), + (75, 72, 60), (45, 56, 81), (0, 55, 78), (2, 77, 79), + (2, 61, 108), (50, 44, 103), (98, 28, 99), (94, 44, 115), + (90, 60, 132), (132, 147, 184), (188, 185, 194), (206, 255, 98), + (224, 243, 95), (228, 255, 58), (221, 250, 58), (214, 246, 58), + (210, 247, 46), (203, 241, 43), (185, 228, 42), (149, 200, 36), + (68, 159, 19), (61, 130, 26), (55, 101, 34), (55, 99, 31), + (55, 99, 31), (68, 104, 76), (87, 150, 95), (91, 160, 72), + (111, 167, 86), (210, 216, 151), (221, 221, 161), (233, 226, 172), + (210, 235, 195), (243, 228, 185), (245, 224, 204), (240, 208, 218), + (177, 176, 198), (167, 169, 195), (157, 163, 192), (122, 141, 179), + (64, 141, 168), (64, 135, 161), (29, 121, 118), (16, 117, 112), + (3, 94, 110), (4, 76, 90), (38, 82, 103), (60, 57, 78), + (68, 79, 55), (83, 78, 41), (140, 61, 18), (171, 66, 0), + (231, 72, 0), (243, 75, 8), (255, 79, 16), (255, 106, 122), + (195, 140, 141), (208, 214, 149), (202, 193, 199), (168, 174, 182), + (104, 121, 129), (73, 75, 73), (75, 74, 66), (75, 69, 59), + (69, 80, 59), (101, 162, 91), (164, 193, 101), (183, 226, 41), + (172, 218, 40), (148, 170, 35), (186, 90, 2), (178, 60, 4), + (166, 24, 41), (103, 0, 97), (66, 69, 142), (64, 134, 163), + (64, 143, 167), (64, 135, 163), (67, 115, 134), (73, 81, 84), + (83, 54, 82), (91, 41, 91), (86, 49, 86), (82, 101, 117), + (67, 135, 132), (67, 137, 138), (68, 125, 116), (72, 86, 85), + (106, 63, 53), (164, 61, 0), (213, 64, 0), (246, 33, 0), + (255, 21, 17), (255, 22, 15), (241, 47, 0), (226, 52, 0), + (209, 64, 0), (171, 66, 0), (112, 59, 25), (88, 50, 46), + (55, 61, 66), (43, 64, 54), (2, 81, 48), (0, 120, 0), + (22, 168, 11), (23, 169, 14), (52, 142, 0), (80, 81, 0), + (147, 60, 0), (171, 66, 0), (184, 80, 0), (155, 163, 25), + (143, 199, 35), (132, 176, 97), (133, 176, 100), (79, 141, 138), + (84, 138, 144), (73, 138, 141), (67, 124, 139), (66, 73, 142), + (99, 25, 100), (139, 17, 57), (194, 0, 36), (172, 0, 9) + ), + +// 151 Apophysis-040426-163Shield +((127, 116, 1), (127, 116, 2), (132, 118, 5), (138, 121, 8), + (161, 119, 15), (184, 118, 22), (211, 95, 22), (239, 72, 22), + (240, 67, 21), (236, 68, 20), (233, 69, 19), (185, 95, 12), + (138, 121, 5), (132, 118, 3), (127, 116, 1), (121, 116, 0), + (116, 116, 0), (116, 116, 0), (116, 110, 3), (116, 105, 6), + (116, 105, 6), (116, 105, 6), (116, 110, 3), (116, 116, 0), + (116, 116, 0), (121, 110, 1), (127, 104, 3), (116, 104, 5), + (105, 105, 8), (99, 105, 9), (93, 105, 10), (93, 93, 17), + (82, 93, 20), (82, 82, 29), (87, 81, 26), (93, 81, 23), + (110, 92, 13), (127, 104, 3), (127, 107, 1), (127, 110, 0), + (138, 115, 3), (138, 115, 3), (138, 115, 3), (138, 115, 3), + (138, 115, 3), (132, 115, 2), (127, 116, 1), (127, 116, 1), + (127, 116, 1), (127, 116, 1), (121, 116, 0), (116, 116, 0), + (116, 116, 0), (116, 116, 0), (116, 116, 0), (116, 116, 0), + (116, 116, 0), (116, 118, 1), (116, 121, 2), (121, 118, 1), + (127, 116, 1), (127, 116, 1), (127, 116, 1), (127, 116, 1), + (127, 116, 1), (127, 116, 1), (127, 113, 0), (127, 110, 0), + (121, 107, 3), (116, 105, 6), (105, 93, 2), (82, 70, 31), + (21, 51, 56), (11, 57, 54), (2, 64, 52), (30, 61, 47), + (58, 58, 43), (72, 65, 36), (87, 72, 29), (93, 81, 69), + (82, 93, 65), (105, 93, 135), (63, 69, 101), (21, 46, 68), + (11, 48, 81), (2, 51, 95), (2, 51, 95), (93, 87, 143), + (250, 61, 178), (251, 70, 184), (253, 79, 190), (245, 81, 189), + (237, 83, 188), (216, 44, 161), (247, 70, 24), (247, 76, 26), + (219, 120, 28), (148, 132, 15), (148, 129, 13), (148, 126, 11), + (148, 126, 11), (148, 126, 11), (148, 126, 11), (148, 126, 11), + (148, 126, 11), (137, 123, 7), (127, 121, 4), (127, 121, 4), + (127, 121, 4), (127, 121, 4), (127, 121, 4), (127, 121, 4), + (127, 121, 6), (138, 132, 11), (138, 132, 12), (138, 132, 13), + (138, 132, 13), (127, 127, 10), (127, 127, 8), (127, 121, 6), + (116, 121, 2), (116, 118, 1), (116, 116, 0), (116, 116, 0), + (116, 116, 0), (105, 116, 1), (105, 116, 1), (116, 116, 0), + (116, 116, 0), (105, 116, 1), (105, 116, 1), (105, 116, 1), + (105, 116, 1), (105, 116, 1), (105, 116, 1), (105, 116, 1), + (127, 116, 1), (132, 115, 2), (138, 115, 3), (138, 115, 3), + (138, 115, 4), (138, 121, 6), (138, 127, 10), (148, 132, 13), + (148, 132, 13), (138, 132, 11), (138, 129, 10), (138, 127, 10), + (127, 127, 8), (127, 121, 4), (127, 121, 3), (127, 121, 3), + (138, 121, 5), (138, 121, 6), (138, 121, 8), (138, 127, 10), + (127, 132, 10), (127, 132, 10), (127, 127, 8), (127, 121, 6), + (138, 121, 5), (127, 127, 8), (127, 127, 9), (127, 127, 10), + (138, 127, 11), (148, 126, 11), (148, 126, 11), (148, 126, 11), + (148, 132, 15), (143, 132, 14), (138, 132, 13), (138, 127, 11), + (138, 127, 10), (138, 127, 10), (138, 121, 6), (138, 115, 4), + (138, 115, 3), (138, 115, 3), (127, 116, 1), (127, 116, 1), + (116, 116, 0), (116, 116, 0), (116, 116, 0), (116, 116, 0), + (116, 116, 0), (116, 116, 0), (116, 116, 0), (116, 116, 0), + (116, 116, 0), (116, 116, 0), (116, 116, 0), (105, 116, 1), + (105, 116, 1), (105, 105, 8), (105, 105, 8), (105, 105, 8), + (105, 110, 5), (105, 116, 1), (116, 116, 0), (127, 116, 1), + (127, 116, 1), (138, 115, 3), (138, 115, 3), (138, 115, 3), + (138, 115, 3), (138, 115, 4), (138, 121, 8), (148, 126, 11), + (148, 126, 11), (148, 126, 11), (148, 126, 11), (138, 121, 6), + (127, 116, 2), (127, 116, 1), (127, 116, 1), (127, 110, 0), + (116, 99, 9), (116, 93, 12), (93, 81, 23), (91, 17, 52), + (70, 17, 62), (93, 5, 109), (97, 1, 46), (151, 22, 21), + (170, 37, 10), (127, 104, 3), (138, 115, 3), (198, 45, 0), + (205, 49, 4), (196, 50, 1), (138, 115, 3), (138, 115, 3), + (127, 116, 1), (127, 116, 1), (127, 116, 1), (127, 116, 1), + (127, 116, 1), (127, 116, 1), (127, 116, 1), (127, 116, 1), + (138, 115, 3), (138, 115, 3), (138, 115, 3), (138, 115, 3), + (138, 115, 3), (138, 115, 4), (138, 121, 6), (148, 126, 11), + (148, 126, 11), (148, 126, 11), (148, 126, 11), (138, 121, 6), + (138, 115, 3), (127, 116, 2), (127, 116, 1), (127, 116, 1) + ), + +// 152 Apophysis-040426-163AlienFlwers +((136, 172, 220), (179, 252, 29), (201, 242, 31), (223, 233, 34), + (197, 227, 50), (172, 221, 67), (159, 215, 70), (147, 210, 74), + (42, 161, 55), (22, 139, 43), (3, 117, 31), (1, 186, 84), + (0, 255, 137), (34, 213, 126), (68, 172, 116), (95, 145, 120), + (123, 119, 124), (166, 111, 82), (180, 96, 65), (194, 81, 49), + (179, 52, 46), (164, 24, 44), (166, 39, 36), (168, 55, 28), + (224, 50, 14), (205, 28, 47), (186, 7, 81), (134, 34, 113), + (82, 61, 146), (68, 65, 158), (55, 70, 171), (33, 71, 194), + (29, 73, 201), (1, 106, 190), (0, 98, 191), (0, 91, 192), + (26, 92, 207), (53, 94, 222), (57, 131, 222), (62, 169, 223), + (127, 202, 227), (107, 190, 226), (87, 178, 226), (79, 116, 236), + (71, 55, 247), (57, 55, 239), (43, 56, 232), (26, 65, 203), + (23, 60, 197), (6, 52, 230), (12, 54, 215), (18, 56, 200), + (29, 72, 201), (41, 88, 203), (45, 110, 208), (50, 133, 214), + (164, 177, 151), (186, 187, 122), (208, 198, 93), (191, 218, 84), + (174, 238, 75), (168, 233, 73), (163, 229, 72), (135, 207, 72), + (149, 217, 72), (147, 206, 190), (73, 227, 222), (0, 249, 255), + (0, 252, 255), (0, 255, 255), (61, 232, 227), (118, 197, 196), + (255, 238, 115), (243, 238, 102), (231, 239, 90), (206, 192, 86), + (182, 146, 82), (176, 178, 67), (170, 210, 52), (153, 230, 32), + (129, 214, 47), (68, 182, 17), (46, 144, 10), (24, 107, 3), + (42, 96, 21), (60, 86, 39), (165, 103, 13), (224, 150, 39), + (255, 234, 0), (255, 244, 0), (255, 255, 0), (255, 255, 0), + (255, 255, 0), (255, 255, 0), (255, 255, 0), (237, 253, 0), + (211, 255, 4), (214, 253, 110), (197, 239, 180), (181, 225, 251), + (164, 204, 245), (148, 183, 240), (63, 132, 233), (47, 73, 226), + (9, 32, 198), (15, 22, 205), (22, 13, 213), (16, 12, 211), + (10, 11, 209), (12, 9, 205), (40, 7, 165), (58, 11, 148), + (95, 13, 117), (135, 75, 95), (192, 92, 109), (249, 110, 123), + (221, 163, 53), (255, 174, 7), (230, 236, 30), (227, 244, 90), + (160, 161, 127), (114, 124, 147), (69, 88, 168), (70, 82, 163), + (71, 76, 159), (56, 74, 172), (36, 74, 194), (34, 75, 196), + (35, 73, 197), (29, 78, 204), (30, 77, 203), (32, 76, 202), + (43, 91, 198), (19, 117, 191), (35, 160, 208), (76, 247, 147), + (141, 214, 77), (155, 222, 84), (170, 230, 91), (160, 210, 107), + (150, 191, 124), (63, 141, 188), (50, 96, 198), (62, 56, 153), + (62, 20, 146), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (55, 82, 77), (111, 109, 132), + (149, 27, 87), (185, 34, 96), (222, 42, 105), (217, 26, 179), + (118, 30, 222), (35, 35, 220), (19, 51, 197), (18, 49, 197), + (28, 28, 179), (69, 10, 136), (34, 5, 68), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (125, 51, 28), (241, 91, 123), + (235, 98, 138), (157, 174, 159), (156, 193, 210), (103, 186, 236), + (85, 134, 203), (60, 99, 192), (34, 79, 201), (22, 69, 205), + (28, 69, 198), (42, 71, 184), (56, 74, 171), (74, 65, 151), + (80, 55, 142), (85, 62, 140), (105, 50, 115), (91, 65, 131), + (67, 72, 161), (32, 44, 215), (34, 11, 249), (0, 0, 255), + (0, 0, 255), (0, 0, 255), (0, 0, 255), (0, 29, 206), + (16, 50, 200), (22, 57, 196), (33, 66, 189), (31, 99, 119), + (60, 85, 39), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (1, 120, 97), (5, 107, 153), (4, 123, 177), (30, 102, 164), + (16, 101, 149), (3, 135, 104), (8, 141, 64), (42, 95, 16), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (59, 2, 147), + (34, 6, 168), (10, 32, 197), (12, 38, 198), (9, 32, 198), + (0, 14, 204), (1, 12, 201), (7, 29, 198), (15, 43, 197), + (25, 60, 196), (17, 81, 185), (26, 97, 132), (31, 125, 72), + (51, 140, 81), (40, 114, 101), (105, 103, 143), (145, 132, 115), + (160, 152, 102), (210, 191, 102), (251, 200, 129), (255, 255, 134), + (253, 240, 216), (255, 245, 223), (228, 247, 224), (184, 230, 234), + (227, 230, 213), (213, 201, 129), (161, 130, 98), (49, 89, 25), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (50, 89, 78), (89, 97, 148), (158, 226, 255) + ), + +// 153 Apophysis-040426-163AlienFlwers4 +((193, 142, 29), (114, 18, 230), (113, 49, 217), (113, 80, 204), + (155, 86, 164), (198, 92, 125), (195, 87, 120), (192, 83, 116), + (196, 142, 48), (219, 159, 59), (243, 177, 70), (225, 204, 122), + (208, 232, 174), (165, 243, 160), (123, 254, 147), (126, 228, 136), + (129, 203, 126), (71, 214, 153), (60, 218, 178), (49, 223, 203), + (86, 239, 197), (124, 255, 192), (136, 244, 193), (149, 234, 195), + (161, 255, 59), (139, 221, 82), (118, 188, 105), (127, 161, 117), + (137, 134, 130), (175, 141, 155), (214, 148, 180), (241, 139, 182), + (255, 141, 148), (255, 131, 88), (226, 140, 53), (197, 149, 19), + (154, 162, 23), (111, 175, 28), (97, 144, 36), (83, 113, 44), + (28, 116, 15), (24, 161, 33), (20, 206, 51), (46, 188, 43), + (72, 170, 36), (94, 177, 26), (116, 184, 17), (184, 149, 2), + (199, 126, 1), (196, 136, 24), (158, 153, 50), (120, 170, 77), + (99, 159, 86), (78, 148, 96), (80, 130, 98), (83, 113, 100), + (168, 36, 79), (206, 26, 89), (244, 17, 100), (239, 50, 86), + (234, 84, 73), (204, 99, 63), (175, 115, 53), (150, 91, 40), + (130, 140, 78), (81, 175, 82), (83, 178, 51), (85, 181, 20), + (92, 179, 17), (99, 178, 15), (128, 195, 13), (155, 195, 67), + (232, 202, 205), (224, 183, 220), (216, 165, 235), (230, 151, 236), + (245, 138, 237), (248, 139, 234), (251, 141, 231), (242, 144, 209), + (220, 133, 211), (210, 54, 133), (214, 64, 137), (218, 74, 141), + (222, 90, 153), (226, 106, 165), (222, 149, 205), (204, 152, 231), + (208, 187, 179), (200, 157, 122), (193, 127, 66), (172, 134, 66), + (152, 141, 66), (129, 132, 103), (128, 100, 141), (147, 88, 208), + (199, 92, 222), (201, 81, 218), (146, 43, 157), (92, 5, 97), + (46, 2, 48), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (34, 61, 43), (68, 122, 86), (87, 113, 95), + (106, 104, 105), (115, 43, 108), (158, 18, 126), (213, 34, 167), + (255, 32, 196), (205, 118, 210), (204, 120, 218), (203, 122, 226), + (186, 152, 217), (179, 165, 193), (198, 194, 180), (152, 191, 179), + (123, 182, 135), (114, 139, 162), (106, 96, 190), (89, 85, 212), + (73, 75, 234), (77, 27, 250), (90, 39, 238), (152, 62, 249), + (201, 126, 255), (192, 125, 255), (161, 122, 253), (131, 119, 252), + (134, 71, 229), (136, 56, 240), (141, 76, 234), (174, 108, 223), + (228, 128, 208), (226, 109, 178), (225, 91, 148), (220, 55, 135), + (216, 20, 123), (224, 0, 113), (252, 17, 101), (243, 11, 93), + (222, 0, 87), (149, 28, 73), (74, 14, 36), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (13, 71, 121), (46, 83, 136), (79, 96, 151), (119, 108, 209), + (199, 128, 226), (214, 130, 252), (216, 133, 240), (194, 152, 224), + (191, 152, 191), (136, 74, 40), (159, 75, 34), (182, 76, 28), + (243, 95, 4), (231, 108, 2), (236, 134, 57), (234, 141, 100), + (149, 121, 235), (118, 99, 227), (88, 78, 219), (49, 6, 251), + (31, 32, 235), (7, 57, 234), (78, 154, 208), (62, 194, 207), + (81, 166, 154), (45, 142, 156), (7, 205, 160), (20, 152, 183), + (45, 131, 225), (3, 23, 194), (20, 3, 160), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 54, 146), + (15, 82, 169), (40, 144, 169), (48, 193, 133), (94, 176, 130), + (91, 179, 93), (117, 182, 97), (205, 149, 49), (246, 149, 67), + (211, 183, 125), (242, 193, 159), (226, 156, 164), (233, 115, 172), + (224, 121, 195), (208, 118, 202), (203, 73, 167), (209, 75, 144), + (202, 47, 136), (212, 36, 127), (200, 50, 139), (184, 32, 152), + (153, 8, 170), (99, 23, 163), (54, 13, 215), (47, 23, 239), + (77, 26, 182), (101, 59, 152), (107, 49, 118), (54, 88, 121), + (55, 92, 88), (76, 121, 103), (121, 94, 169), (139, 75, 203), + (172, 33, 212), (175, 22, 221), (175, 34, 247), (193, 87, 231), + (193, 122, 255), (218, 149, 253), (222, 151, 253), (225, 154, 251), + (232, 150, 250), (233, 159, 247), (229, 166, 249), (240, 171, 252), + (244, 227, 199), (237, 245, 152), (243, 236, 115), (250, 206, 91), + (253, 194, 39), (253, 169, 69), (242, 212, 114), (225, 238, 149), + (237, 245, 152), (235, 246, 152), (221, 253, 170), (213, 235, 208), + (224, 222, 223), (233, 205, 244), (236, 209, 202), (227, 243, 154), + (223, 246, 140), (181, 231, 50), (181, 212, 34), (189, 203, 15) + ), + +// 154 Apophysis-040426-163butterflyflwer1 +((158, 139, 238), (158, 139, 238), (158, 139, 238), (158, 139, 238), + (158, 139, 238), (158, 140, 238), (158, 141, 238), (158, 142, 238), + (161, 145, 241), (162, 148, 242), (163, 152, 243), (161, 149, 241), + (159, 146, 239), (159, 145, 239), (160, 144, 240), (159, 143, 239), + (159, 143, 239), (159, 142, 239), (159, 141, 239), (159, 141, 239), + (159, 141, 239), (159, 141, 239), (158, 140, 238), (158, 140, 238), + (158, 140, 238), (158, 139, 238), (158, 139, 238), (158, 139, 238), + (158, 139, 238), (160, 120, 240), (163, 101, 243), (157, 82, 237), + (157, 45, 237), (181, 86, 250), (170, 114, 245), (160, 142, 240), + (159, 141, 239), (158, 140, 238), (158, 139, 238), (158, 139, 238), + (158, 139, 238), (158, 139, 238), (158, 139, 238), (158, 139, 238), + (158, 139, 238), (158, 139, 238), (158, 139, 238), (158, 139, 238), + (158, 139, 238), (158, 139, 238), (158, 139, 238), (158, 139, 238), + (158, 139, 238), (158, 139, 238), (158, 139, 238), (158, 140, 238), + (81, 140, 161), (58, 146, 102), (36, 152, 43), (49, 172, 29), + (63, 193, 16), (63, 198, 15), (64, 204, 15), (112, 244, 32), + (157, 180, 237), (159, 147, 239), (158, 144, 238), (158, 141, 238), + (158, 140, 238), (158, 140, 238), (158, 139, 238), (158, 139, 238), + (158, 139, 238), (158, 139, 238), (158, 139, 238), (158, 139, 238), + (158, 139, 238), (158, 139, 238), (158, 140, 238), (159, 142, 239), + (161, 145, 241), (171, 161, 251), (178, 178, 248), (185, 195, 246), + (189, 209, 241), (194, 223, 237), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (206, 216, 225), (191, 188, 240), (165, 157, 245), + (158, 139, 238), (158, 6, 238), (158, 32, 238), (158, 58, 238), + (158, 98, 238), (158, 139, 238), (158, 139, 238), (158, 139, 238), + (158, 139, 238), (158, 139, 238), (158, 139, 238), (158, 139, 238), + (158, 139, 238), (158, 139, 238), (158, 139, 238), (158, 139, 238), + (158, 139, 238), (158, 139, 238), (158, 139, 238), (158, 139, 238), + (158, 140, 238), (158, 141, 238), (159, 142, 239), (160, 145, 240), + (168, 155, 248), (176, 171, 247), (185, 188, 246), (191, 195, 239), + (198, 203, 233), (221, 234, 210), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (191, 225, 240), (180, 210, 245), (170, 196, 250), + (161, 166, 241), (158, 151, 238), (159, 151, 239), (161, 158, 241), + (162, 178, 242), (166, 194, 246), (171, 210, 251), (176, 207, 250), + (182, 205, 249), (182, 200, 249), (175, 202, 255), (166, 187, 246), + (162, 166, 242), (159, 147, 239), (158, 145, 238), (158, 143, 238), + (158, 141, 238), (158, 140, 238), (158, 139, 238), (158, 139, 238), + (158, 139, 238), (158, 139, 238), (158, 139, 238), (158, 139, 238), + (158, 139, 238), (158, 139, 238), (158, 139, 238), (158, 139, 238), + (158, 139, 238), (158, 139, 238), (158, 139, 238), (158, 139, 238), + (158, 139, 238), (158, 139, 238), (158, 139, 238), (158, 139, 238), + (158, 141, 238), (158, 142, 238), (159, 144, 239), (159, 148, 239), + (161, 158, 241), (158, 187, 238), (158, 207, 238), (158, 219, 238), + (175, 205, 255), (180, 199, 251), (181, 181, 250), (166, 159, 246), + (160, 144, 240), (158, 122, 238), (121, 71, 201), (86, 32, 166), + (35, 28, 115), (36, 47, 116), (37, 67, 117), (106, 84, 186), + (158, 139, 238), (158, 139, 238), (158, 139, 238), (158, 139, 238), + (158, 139, 238), (158, 139, 238), (158, 139, 238), (158, 139, 238), + (158, 139, 238), (158, 139, 238), (158, 139, 238), (158, 139, 238), + (158, 139, 238), (158, 139, 238), (103, 92, 183), (54, 87, 134), + (32, 49, 112), (37, 41, 117), (97, 71, 177), (158, 139, 238), + (158, 139, 238), (158, 139, 238), (158, 139, 238), (158, 139, 238), + (158, 139, 238), (158, 139, 238), (158, 140, 238), (159, 142, 239), + (160, 145, 240), (160, 147, 240), (163, 153, 243), (165, 169, 245), + (174, 197, 254), (180, 208, 251), (186, 237, 245), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (199, 223, 232), (188, 191, 243), + (177, 168, 254), (171, 159, 251), (167, 152, 247), (167, 153, 247), + (171, 172, 251), (179, 191, 252), (180, 198, 251), (183, 195, 248), + (177, 185, 254), (170, 162, 250), (165, 153, 245), (162, 145, 242), + (159, 142, 239), (158, 140, 238), (158, 139, 238), (158, 139, 238), + (158, 139, 238), (158, 139, 238), (158, 139, 238), (158, 139, 238), + (158, 139, 238), (158, 139, 238), (158, 139, 238), (158, 139, 238), + (158, 139, 238), (158, 139, 238), (158, 139, 238), (158, 139, 238) + ), + +// 155 Apophysis-040426-163ButterflySherbert +((219, 120, 43), (252, 198, 141), (252, 180, 107), (253, 162, 74), + (252, 151, 59), (252, 140, 45), (235, 135, 43), (219, 130, 42), + (185, 113, 35), (112, 79, 26), (40, 46, 17), (20, 23, 8), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (84, 47, 19), (168, 95, 39), + (186, 101, 43), (205, 107, 47), (207, 109, 51), (209, 112, 56), + (205, 110, 45), (210, 113, 46), (216, 116, 47), (217, 119, 55), + (219, 123, 63), (215, 120, 62), (212, 117, 61), (198, 119, 39), + (168, 104, 32), (71, 24, 4), (35, 12, 2), (0, 0, 0), + (32, 72, 17), (65, 144, 35), (109, 157, 48), (154, 170, 62), + (225, 130, 69), (239, 133, 61), (253, 137, 54), (252, 137, 49), + (252, 137, 44), (251, 133, 43), (250, 130, 43), (230, 123, 47), + (201, 115, 41), (94, 88, 6), (47, 44, 3), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (29, 8, 7), (58, 17, 15), (115, 55, 34), + (172, 94, 53), (178, 102, 60), (185, 110, 68), (190, 121, 85), + (181, 117, 89), (100, 176, 154), (114, 182, 143), (128, 189, 133), + (141, 194, 137), (154, 199, 141), (117, 183, 128), (94, 173, 113), + (106, 159, 50), (127, 156, 33), (148, 153, 16), (173, 142, 21), + (198, 132, 26), (194, 123, 31), (190, 115, 36), (172, 119, 27), + (112, 138, 15), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (52, 28, 22), (105, 57, 44), (168, 95, 39), (177, 102, 39), + (94, 70, 23), (47, 35, 11), (0, 0, 0), (29, 10, 8), + (58, 20, 16), (138, 107, 16), (185, 116, 33), (209, 128, 39), + (212, 129, 40), (225, 120, 56), (222, 123, 61), (219, 127, 66), + (212, 136, 89), (228, 196, 106), (238, 210, 136), (252, 212, 156), + (253, 211, 156), (246, 190, 136), (240, 170, 117), (238, 156, 95), + (237, 142, 74), (237, 133, 63), (249, 136, 48), (252, 131, 49), + (242, 126, 51), (222, 116, 52), (222, 119, 48), (222, 122, 45), + (219, 120, 45), (219, 117, 46), (216, 113, 48), (216, 113, 48), + (205, 107, 47), (171, 93, 53), (138, 80, 60), (85, 58, 41), + (33, 37, 22), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (40, 9, 92), (96, 51, 81), (153, 94, 70), + (205, 110, 55), (206, 153, 44), (225, 184, 57), (245, 204, 127), + (253, 233, 208), (253, 237, 218), (253, 241, 228), (249, 249, 226), + (216, 234, 217), (173, 212, 184), (117, 181, 177), (53, 123, 138), + (27, 34, 75), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (9, 52, 12), (94, 146, 30), + (173, 163, 108), (196, 158, 109), (219, 154, 111), (253, 193, 124), + (253, 204, 143), (253, 208, 157), (243, 199, 169), (225, 187, 172), + (177, 160, 175), (77, 125, 150), (64, 46, 67), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (106, 1, 39), (134, 43, 45), (163, 86, 51), (205, 107, 50), + (219, 114, 47), (230, 123, 47), (230, 126, 47), (237, 123, 48), + (237, 127, 55), (237, 133, 62), (240, 137, 67), (253, 147, 61), + (252, 149, 58), (253, 150, 63), (253, 156, 71), (253, 162, 77), + (242, 193, 104), (249, 202, 125), (244, 206, 129), (253, 199, 137), + (245, 209, 138), (253, 249, 142), (233, 218, 154), (253, 213, 169), + (253, 209, 155), (253, 193, 122), (243, 157, 91), (237, 139, 70), + (233, 130, 62), (222, 125, 63), (219, 120, 59), (219, 123, 63), + (222, 128, 68), (222, 143, 93), (228, 152, 102), (247, 193, 148), + (253, 220, 177), (253, 231, 205), (248, 242, 224), (245, 240, 221), + (238, 221, 190), (216, 227, 184), (206, 219, 169), (206, 218, 161), + (209, 206, 129), (209, 213, 144), (173, 191, 181), (213, 173, 208), + (205, 196, 207), (198, 225, 220), (225, 234, 223), (235, 235, 238), + (240, 240, 241), (247, 248, 243), (251, 232, 221), (252, 221, 175), + (251, 198, 122), (248, 165, 96), (252, 152, 62), (253, 138, 46), + (252, 143, 53), (237, 142, 72), (216, 149, 109), (240, 121, 189), + (213, 144, 199), (186, 119, 171), (190, 115, 169), (143, 113, 115), + (163, 102, 76), (181, 98, 43), (205, 114, 43), (230, 132, 45) + ), + +// 156 Apophysis-040426-163BFlyGate4 +((19, 21, 16), (0, 0, 0), (39, 1, 22), (78, 2, 45), + (128, 27, 95), (179, 53, 146), (170, 92, 170), (162, 131, 195), + (150, 152, 150), (106, 108, 127), (63, 65, 104), (46, 49, 83), + (30, 33, 63), (16, 23, 46), (3, 14, 29), (1, 7, 14), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (12, 14, 16), (8, 23, 27), (5, 33, 38), (16, 33, 49), + (27, 33, 60), (31, 33, 64), (36, 33, 68), (61, 33, 29), + (57, 33, 24), (64, 33, 31), (65, 23, 32), (67, 14, 34), + (36, 10, 74), (6, 7, 115), (24, 4, 95), (42, 2, 75), + (31, 18, 63), (19, 25, 44), (7, 33, 25), (10, 33, 21), + (14, 33, 18), (14, 33, 17), (15, 33, 17), (13, 11, 16), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (8, 8, 8), (17, 16, 16), (32, 33, 24), + (48, 50, 33), (66, 68, 33), (84, 86, 33), (140, 138, 75), + (244, 183, 97), (177, 129, 6), (169, 106, 21), (161, 84, 36), + (130, 58, 51), (99, 33, 66), (45, 14, 78), (30, 2, 63), + (1, 2, 16), (0, 1, 8), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (23, 14, 9), (50, 48, 33), (25, 81, 32), (0, 115, 32), + (30, 102, 30), (61, 90, 28), (65, 67, 16), (47, 33, 14), + (45, 33, 12), (59, 52, 14), (73, 71, 16), (101, 58, 14), + (130, 46, 13), (160, 87, 31), (160, 90, 28), (113, 111, 2), + (95, 93, 16), (86, 41, 53), (93, 37, 60), (100, 33, 67), + (100, 33, 67), (101, 33, 68), (105, 33, 72), (106, 33, 73), + (97, 239, 129), (103, 204, 189), (110, 169, 250), (91, 122, 242), + (73, 75, 235), (44, 46, 234), (148, 106, 181), (221, 121, 188), + (239, 164, 206), (232, 230, 246), (230, 230, 231), (228, 230, 217), + (247, 216, 214), (235, 185, 167), (159, 117, 126), (108, 36, 75), + (34, 36, 33), (29, 33, 20), (24, 31, 7), (34, 38, 11), + (44, 46, 16), (60, 75, 27), (84, 82, 16), (103, 101, 2), + (152, 94, 0), (163, 99, 21), (161, 92, 27), (160, 86, 33), + (88, 86, 41), (86, 33, 53), (78, 33, 45), (70, 33, 37), + (54, 33, 21), (38, 33, 38), (22, 33, 55), (27, 33, 64), + (32, 34, 74), (4, 76, 116), (26, 125, 128), (58, 60, 152), + (96, 98, 173), (205, 131, 237), (214, 126, 246), (223, 122, 255), + (223, 208, 255), (248, 250, 207), (28, 30, 16), (45, 47, 16), + (95, 93, 2), (98, 96, 2), (101, 99, 2), (95, 93, 2), + (81, 79, 16), (68, 69, 16), (47, 52, 14), (38, 33, 5), + (26, 28, 2), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (31, 14, 1), (63, 33, 30), + (98, 33, 65), (104, 33, 71), (110, 33, 77), (119, 43, 152), + (132, 106, 165), (111, 90, 143), (88, 90, 105), (69, 71, 62), + (85, 33, 53), (77, 33, 44), (55, 33, 22), (40, 33, 8), + (24, 14, 8), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (38, 14, 5), (77, 33, 44), + (111, 33, 79), (140, 106, 173), (177, 153, 209), (169, 241, 202), + (170, 237, 242), (144, 201, 216), (124, 153, 157), (116, 119, 149), + (123, 125, 137), (116, 118, 121), (73, 119, 106), (73, 119, 106), + (71, 73, 121), (30, 90, 63), (20, 90, 53), (39, 77, 51), + (45, 43, 33), (30, 29, 33), (26, 24, 33), (21, 14, 54), + (21, 14, 54), (9, 11, 33), (2, 4, 16), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (32, 14, 0), (41, 33, 8), + (51, 53, 2), (73, 75, 16), (77, 75, 16), (76, 74, 16), + (72, 70, 16), (70, 33, 37), (43, 33, 76), (44, 33, 77), + (46, 33, 79), (87, 17, 54), (87, 14, 54), (80, 1, 47), + (66, 14, 33), (53, 14, 20), (37, 14, 4), (32, 18, 0), + (32, 33, 0), (31, 33, 2), (24, 33, 7), (17, 33, 15), + (13, 33, 19), (1, 33, 31), (6, 33, 39), (8, 33, 41), + (4, 6, 62), (14, 16, 152), (32, 30, 162), (50, 33, 83), + (98, 33, 65), (105, 33, 72), (106, 33, 73), (100, 33, 67), + (92, 33, 59), (79, 33, 46), (65, 33, 32), (46, 33, 13) + ), + +// 157 Apophysis-040426-163BFlyGate4Inv +((209, 222, 242), (255, 255, 255), (241, 248, 253), (227, 241, 251), + (186, 245, 215), (146, 250, 179), (111, 226, 144), (76, 202, 109), + (70, 68, 105), (111, 109, 119), (152, 150, 134), (178, 186, 153), + (205, 222, 172), (223, 230, 197), (241, 239, 222), (246, 240, 224), + (252, 241, 226), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (254, 238, 239), (254, 222, 224), (245, 222, 214), + (237, 222, 204), (232, 222, 199), (228, 222, 195), (219, 222, 187), + (194, 222, 226), (197, 222, 230), (193, 222, 226), (189, 222, 222), + (202, 231, 202), (215, 241, 182), (232, 244, 161), (249, 248, 140), + (217, 241, 184), (225, 231, 192), (234, 222, 201), (237, 222, 219), + (241, 222, 237), (241, 222, 237), (241, 222, 237), (240, 222, 238), + (242, 244, 239), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (254, 255, 254), (253, 255, 253), (238, 240, 246), + (224, 226, 239), (215, 215, 230), (207, 205, 222), (171, 169, 222), + (115, 117, 180), (78, 147, 214), (81, 146, 222), (85, 146, 230), + (89, 158, 224), (94, 171, 219), (156, 222, 189), (210, 241, 177), + (241, 241, 208), (248, 248, 231), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (222, 220, 239), (230, 191, 222), (238, 163, 205), + (246, 151, 214), (255, 140, 223), (194, 165, 227), (190, 188, 239), + (212, 222, 245), (204, 210, 248), (197, 199, 252), (189, 191, 245), + (182, 184, 239), (125, 209, 242), (95, 168, 224), (95, 165, 227), + (142, 144, 253), (185, 183, 206), (171, 202, 198), (158, 222, 191), + (156, 222, 189), (155, 222, 188), (154, 222, 187), (150, 222, 183), + (133, 128, 166), (149, 87, 120), (165, 46, 75), (155, 66, 40), + (145, 86, 5), (182, 180, 20), (211, 209, 21), (107, 149, 74), + (34, 134, 67), (0, 41, 32), (11, 33, 20), (23, 25, 9), + (27, 25, 38), (8, 39, 41), (20, 70, 88), (96, 138, 129), + (177, 222, 209), (207, 222, 225), (237, 222, 241), (234, 223, 244), + (231, 224, 248), (211, 209, 239), (195, 180, 228), (171, 173, 239), + (152, 154, 253), (91, 152, 236), (91, 154, 235), (92, 156, 234), + (95, 169, 222), (167, 169, 214), (169, 222, 202), (177, 222, 210), + (198, 222, 231), (210, 221, 226), (222, 220, 222), (227, 221, 211), + (233, 222, 200), (223, 221, 181), (251, 179, 139), (229, 130, 127), + (197, 195, 103), (103, 136, 71), (76, 130, 44), (50, 124, 18), + (32, 133, 0), (32, 47, 0), (7, 5, 48), (227, 225, 239), + (182, 180, 239), (171, 171, 246), (160, 162, 253), (154, 156, 253), + (160, 162, 253), (174, 176, 239), (187, 186, 239), (208, 203, 241), + (217, 222, 250), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (224, 241, 254), + (166, 222, 199), (161, 222, 194), (157, 222, 190), (145, 222, 178), + (136, 212, 103), (123, 149, 90), (144, 165, 112), (167, 165, 150), + (186, 184, 193), (170, 222, 202), (178, 222, 211), (200, 222, 233), + (215, 222, 247), (231, 241, 247), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (217, 241, 250), + (178, 222, 211), (144, 222, 176), (115, 149, 82), (78, 102, 46), + (86, 14, 53), (85, 18, 13), (111, 54, 39), (131, 102, 98), + (139, 136, 106), (132, 130, 118), (139, 137, 134), (182, 136, 149), + (182, 136, 149), (184, 182, 134), (225, 165, 192), (235, 165, 202), + (216, 178, 204), (210, 212, 222), (225, 226, 222), (229, 231, 222), + (234, 241, 201), (234, 241, 201), (246, 244, 222), (253, 251, 239), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (223, 241, 255), + (214, 222, 247), (204, 202, 253), (182, 180, 239), (178, 180, 239), + (179, 181, 239), (183, 185, 239), (185, 222, 218), (212, 222, 179), + (211, 222, 178), (209, 222, 176), (168, 238, 201), (168, 241, 201), + (175, 254, 208), (189, 241, 222), (202, 241, 235), (218, 241, 251), + (223, 237, 255), (223, 222, 255), (224, 222, 253), (231, 222, 248), + (238, 222, 240), (242, 222, 236), (254, 222, 224), (249, 222, 216), + (247, 222, 214), (251, 249, 193), (241, 239, 103), (223, 225, 93), + (205, 222, 172), (157, 222, 190), (150, 222, 183), (149, 222, 182), + (155, 222, 188), (163, 222, 196), (176, 222, 209), (190, 222, 223) + ), + +// 158 Apophysis-040426-163CeltCross +((173, 167, 70), (250, 143, 64), (238, 123, 60), (227, 103, 57), + (181, 57, 33), (136, 11, 9), (68, 5, 4), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (29, 35, 0), (58, 71, 0), (111, 99, 38), + (165, 127, 76), (198, 119, 69), (231, 112, 62), (250, 120, 51), + (241, 130, 66), (195, 159, 64), (162, 142, 58), (130, 125, 53), + (96, 106, 54), (62, 88, 56), (31, 44, 28), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (41, 12, 30), (83, 24, 61), + (128, 33, 54), (174, 42, 47), (181, 43, 43), (218, 104, 59), + (210, 180, 62), (193, 189, 48), (177, 199, 34), (100, 156, 39), + (24, 113, 45), (12, 56, 22), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (45, 123, 36), (134, 171, 11), + (198, 208, 55), (184, 195, 50), (171, 182, 45), (142, 159, 26), + (114, 137, 7), (54, 80, 6), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (21, 96, 1), + (117, 175, 89), (159, 163, 84), (201, 151, 80), (213, 137, 77), + (226, 123, 75), (196, 80, 67), (168, 46, 54), (96, 51, 67), + (27, 23, 69), (84, 49, 8), (120, 86, 33), (156, 123, 58), + (218, 104, 59), (233, 117, 63), (247, 140, 65), (251, 141, 60), + (252, 146, 62), (252, 149, 62), (253, 153, 63), (251, 156, 57), + (245, 185, 65), (213, 214, 57), (219, 225, 64), (223, 228, 59), + (232, 229, 67), (231, 228, 47), (222, 225, 45), (214, 222, 44), + (225, 210, 50), (245, 185, 65), (245, 182, 64), (245, 186, 65), + (211, 212, 57), (219, 193, 59), (228, 174, 61), (225, 135, 90), + (204, 117, 81), (197, 134, 116), (136, 143, 73), (69, 152, 22), + (31, 95, 3), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (12, 130, 18), (87, 171, 36), (131, 175, 82), + (232, 177, 60), (239, 181, 63), (247, 185, 66), (252, 170, 72), + (250, 180, 91), (230, 207, 98), (236, 195, 122), (212, 180, 102), + (116, 136, 139), (65, 78, 66), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (96, 31, 1), (163, 19, 35), (197, 7, 21), + (197, 7, 21), (142, 0, 1), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (39, 87, 1), (58, 121, 25), (118, 131, 65) + ), + +// 159 Apophysis-040426-163Egg4d +((168, 128, 78), (252, 247, 220), (252, 244, 215), (252, 242, 211), + (251, 238, 205), (251, 235, 200), (250, 235, 200), (250, 235, 201), + (227, 239, 216), (229, 239, 216), (232, 240, 216), (241, 236, 206), + (251, 232, 196), (241, 220, 182), (232, 209, 168), (231, 200, 157), + (230, 191, 147), (201, 153, 106), (196, 142, 94), (192, 131, 83), + (172, 145, 99), (153, 160, 116), (146, 176, 142), (139, 193, 168), + (151, 202, 188), (179, 216, 201), (207, 230, 215), (227, 222, 193), + (247, 214, 172), (247, 207, 163), (247, 200, 155), (228, 185, 139), + (193, 168, 123), (153, 160, 116), (153, 160, 116), (153, 160, 116), + (153, 160, 116), (153, 160, 116), (153, 160, 116), (153, 160, 116), + (153, 160, 116), (155, 141, 94), (158, 122, 72), (160, 107, 58), + (163, 92, 45), (178, 50, 39), (194, 9, 34), (181, 8, 38), + (109, 1, 37), (138, 79, 33), (155, 100, 52), (172, 121, 71), + (190, 151, 103), (208, 181, 135), (216, 189, 145), (225, 197, 155), + (248, 231, 195), (240, 235, 206), (233, 240, 217), (226, 235, 210), + (220, 231, 203), (223, 219, 185), (227, 207, 167), (212, 188, 143), + (185, 156, 110), (111, 71, 24), (75, 39, 30), (40, 8, 36), + (49, 15, 26), (58, 23, 17), (70, 35, 6), (81, 47, 3), + (143, 76, 29), (170, 89, 42), (198, 103, 55), (220, 134, 86), + (243, 165, 117), (247, 173, 125), (252, 182, 134), (247, 201, 153), + (250, 209, 167), (237, 216, 177), (242, 218, 178), (247, 221, 180), + (249, 225, 186), (252, 229, 192), (250, 231, 194), (252, 236, 200), + (247, 249, 226), (241, 245, 230), (235, 242, 234), (228, 239, 228), + (222, 237, 222), (218, 236, 225), (206, 227, 218), (192, 219, 215), + (153, 196, 197), (133, 181, 187), (150, 193, 195), (168, 206, 203), + (180, 213, 209), (193, 221, 216), (202, 227, 216), (202, 227, 216), + (149, 197, 193), (131, 180, 184), (113, 163, 175), (133, 161, 145), + (153, 160, 116), (153, 160, 116), (190, 164, 118), (218, 153, 106), + (239, 148, 98), (212, 141, 91), (201, 149, 100), (190, 158, 110), + (191, 164, 118), (216, 171, 125), (235, 176, 128), (250, 172, 125), + (222, 115, 69), (237, 57, 40), (252, 0, 12), (244, 1, 17), + (236, 2, 22), (222, 2, 25), (211, 1, 30), (185, 5, 30), + (141, 72, 26), (133, 80, 35), (127, 82, 35), (121, 84, 35), + (121, 95, 49), (97, 115, 71), (63, 72, 25), (62, 50, 4), + (121, 71, 22), (107, 110, 66), (93, 149, 111), (70, 148, 117), + (47, 147, 123), (75, 111, 67), (38, 40, 29), (2, 8, 35), + (13, 8, 37), (139, 107, 59), (162, 130, 82), (185, 153, 106), + (208, 176, 130), (224, 197, 154), (235, 216, 177), (247, 232, 196), + (240, 246, 226), (241, 245, 223), (242, 245, 221), (252, 239, 206), + (252, 230, 192), (242, 217, 177), (232, 201, 158), (216, 194, 151), + (205, 182, 137), (153, 160, 116), (123, 162, 125), (94, 164, 135), + (71, 153, 156), (58, 147, 149), (76, 138, 155), (87, 153, 163), + (100, 167, 171), (94, 164, 168), (89, 161, 165), (84, 166, 160), + (107, 162, 126), (153, 160, 116), (185, 164, 118), (205, 182, 137), + (222, 199, 158), (230, 210, 171), (242, 222, 182), (251, 227, 188), + (250, 239, 207), (252, 242, 208), (252, 242, 212), (252, 245, 215), + (252, 242, 213), (252, 242, 212), (252, 242, 211), (252, 240, 208), + (250, 236, 203), (252, 234, 199), (252, 224, 185), (248, 216, 175), + (242, 210, 168), (227, 195, 151), (212, 185, 140), (201, 175, 128), + (198, 170, 125), (190, 164, 118), (190, 156, 108), (201, 133, 83), + (216, 129, 80), (218, 153, 106), (225, 176, 128), (245, 197, 153), + (252, 212, 168), (242, 217, 178), (245, 224, 186), (247, 224, 185), + (250, 218, 176), (250, 211, 167), (251, 187, 138), (242, 179, 130), + (248, 171, 121), (250, 180, 133), (232, 191, 145), (218, 195, 153), + (208, 188, 144), (201, 180, 135), (164, 175, 133), (153, 160, 116), + (153, 160, 116), (172, 138, 91), (185, 125, 75), (181, 116, 71), + (185, 118, 71), (201, 127, 79), (190, 127, 80), (185, 129, 80), + (177, 135, 88), (177, 143, 96), (166, 120, 95), (156, 97, 84), + (143, 107, 59), (116, 84, 37), (105, 66, 19), (116, 66, 20), + (121, 90, 40), (143, 103, 55), (177, 118, 70), (198, 143, 95), + (205, 174, 128), (225, 181, 133), (232, 188, 142), (215, 191, 147), + (205, 184, 141), (144, 184, 151), (89, 165, 138), (46, 149, 136), + (16, 82, 39), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (30, 32, 23), (88, 54, 6), (143, 103, 55), (153, 160, 116) + ), + +// 160 Apophysis-040426-163FlowerFerns +((147, 231, 75), (140, 223, 68), (143, 229, 57), (147, 236, 46), + (150, 244, 40), (154, 253, 35), (155, 252, 39), (156, 251, 44), + (140, 250, 57), (137, 244, 41), (135, 238, 25), (128, 208, 20), + (121, 179, 16), (91, 137, 42), (62, 95, 68), (39, 81, 70), + (17, 68, 73), (1, 76, 119), (6, 68, 142), (12, 61, 166), + (25, 79, 137), (39, 97, 109), (48, 98, 104), (58, 100, 99), + (105, 74, 88), (163, 74, 82), (221, 75, 77), (211, 127, 84), + (202, 179, 92), (199, 189, 95), (196, 200, 99), (149, 232, 77), + (137, 220, 66), (103, 210, 27), (115, 203, 34), (128, 196, 42), + (129, 200, 46), (131, 205, 51), (126, 222, 63), (122, 240, 75), + (120, 202, 49), (91, 152, 57), (62, 103, 65), (57, 93, 69), + (52, 83, 73), (40, 74, 89), (29, 66, 105), (22, 76, 106), + (10, 98, 92), (60, 152, 35), (81, 144, 19), (102, 137, 4), + (108, 101, 21), (114, 66, 38), (127, 53, 39), (140, 41, 40), + (83, 103, 11), (75, 110, 6), (67, 117, 1), (59, 119, 4), + (51, 121, 8), (50, 117, 6), (50, 114, 4), (68, 111, 3), + (53, 86, 16), (55, 76, 40), (63, 50, 22), (71, 24, 4), + (48, 21, 5), (25, 18, 6), (53, 2, 19), (83, 4, 3), + (97, 18, 35), (66, 24, 49), (36, 31, 63), (33, 57, 57), + (30, 84, 51), (32, 103, 47), (35, 122, 43), (63, 168, 50), + (101, 205, 65), (54, 154, 57), (40, 127, 76), (26, 101, 95), + (13, 121, 101), (1, 142, 108), (0, 77, 117), (8, 77, 105), + (8, 62, 95), (11, 47, 90), (14, 32, 86), (8, 34, 79), + (3, 37, 73), (20, 27, 65), (34, 26, 66), (21, 47, 74), + (14, 76, 103), (63, 80, 201), (99, 70, 207), (135, 60, 213), + (128, 56, 220), (122, 52, 228), (126, 16, 221), (73, 39, 210), + (4, 33, 140), (12, 55, 119), (20, 77, 98), (30, 79, 90), + (40, 81, 82), (72, 113, 63), (93, 159, 44), (123, 182, 37), + (146, 206, 51), (111, 190, 18), (106, 197, 13), (102, 205, 9), + (93, 209, 9), (97, 190, 4), (95, 186, 4), (110, 181, 13), + (101, 176, 31), (103, 165, 20), (106, 154, 9), (99, 147, 6), + (92, 141, 3), (80, 138, 16), (113, 142, 18), (107, 173, 19), + (112, 168, 32), (85, 95, 218), (103, 90, 228), (121, 85, 238), + (132, 87, 242), (146, 90, 249), (181, 75, 247), (176, 93, 218), + (143, 203, 152), (139, 222, 119), (136, 241, 87), (159, 227, 102), + (183, 214, 118), (200, 220, 164), (143, 180, 177), (120, 165, 191), + (80, 168, 161), (106, 154, 119), (102, 169, 79), (98, 184, 40), + (133, 201, 47), (148, 220, 65), (175, 177, 102), (190, 174, 114), + (102, 152, 9), (94, 140, 7), (87, 129, 6), (73, 120, 8), + (53, 118, 36), (51, 70, 63), (37, 54, 38), (13, 63, 9), + (7, 46, 37), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (2, 29, 46), (13, 54, 36), (21, 52, 55), (37, 72, 64), + (37, 112, 47), (42, 133, 35), (47, 154, 23), (65, 147, 24), + (118, 181, 47), (126, 201, 48), (140, 197, 43), (137, 220, 65), + (118, 240, 86), (129, 222, 133), (98, 157, 133), (35, 106, 98), + (1, 82, 76), (2, 48, 59), (13, 32, 58), (0, 20, 64), + (22, 10, 54), (25, 11, 48), (28, 12, 43), (25, 0, 26), + (27, 10, 26), (53, 23, 49), (78, 29, 29), (117, 30, 27), + (124, 3, 19), (124, 9, 5), (118, 15, 3), (76, 3, 8), + (25, 2, 17), (22, 0, 25), (5, 6, 31), (4, 4, 31), + (10, 4, 49), (28, 16, 91), (10, 7, 105), (15, 7, 119), + (4, 39, 173), (27, 26, 166), (29, 13, 152), (19, 11, 108), + (15, 23, 76), (12, 12, 44), (5, 5, 43), (16, 16, 53), + (34, 37, 77), (38, 82, 87), (63, 129, 121), (82, 120, 102), + (172, 106, 100), (212, 83, 100), (120, 45, 109), (37, 29, 102), + (35, 26, 92), (31, 64, 71), (65, 93, 72), (123, 107, 74), + (126, 183, 47), (135, 218, 64), (132, 240, 86), (135, 242, 88), + (141, 235, 83), (144, 227, 72), (149, 221, 52), (139, 223, 33), + (131, 244, 58), (135, 252, 96), (128, 226, 130), (135, 183, 172), + (112, 124, 245), (132, 136, 251), (97, 239, 249), (201, 249, 235), + (228, 229, 181), (216, 148, 205), (134, 161, 196), (83, 111, 243), + (46, 75, 185), (38, 23, 154), (56, 3, 75), (90, 0, 54), + (135, 23, 79), (125, 64, 69), (139, 106, 94), (167, 191, 68), + (140, 223, 67), (145, 231, 76), (150, 234, 79), (149, 233, 77) + ), + +// 161 Apophysis-040426-163FlowerFernsInv +((106, 22, 178), (110, 27, 181), (106, 32, 190), (102, 38, 200), + (104, 26, 203), (106, 14, 207), (103, 8, 213), (101, 2, 220), + (111, 3, 191), (112, 4, 205), (113, 6, 219), (119, 18, 225), + (125, 30, 231), (148, 84, 228), (171, 139, 225), (182, 149, 206), + (193, 160, 187), (252, 184, 174), (246, 191, 137), (241, 198, 101), + (222, 180, 115), (203, 162, 130), (209, 160, 138), (216, 158, 146), + (180, 145, 161), (126, 159, 174), (72, 173, 187), (45, 156, 149), + (18, 140, 111), (35, 108, 137), (53, 76, 163), (59, 55, 156), + (106, 23, 178), (149, 16, 223), (148, 32, 232), (148, 49, 242), + (140, 51, 224), (132, 54, 207), (128, 52, 205), (124, 50, 204), + (129, 34, 187), (149, 78, 196), (170, 123, 205), (176, 137, 189), + (183, 151, 173), (193, 161, 177), (203, 172, 182), (226, 189, 150), + (233, 179, 149), (225, 133, 194), (196, 128, 214), (167, 123, 234), + (152, 119, 237), (137, 116, 241), (139, 152, 229), (141, 189, 217), + (146, 190, 238), (157, 167, 245), (169, 145, 252), (180, 139, 248), + (191, 133, 244), (197, 133, 245), (204, 134, 247), (205, 141, 251), + (187, 144, 252), (206, 174, 244), (193, 195, 228), (181, 216, 213), + (182, 223, 232), (184, 231, 251), (230, 237, 249), (202, 253, 236), + (157, 243, 246), (176, 249, 213), (196, 255, 181), (203, 218, 190), + (210, 182, 200), (217, 176, 202), (225, 171, 204), (220, 133, 212), + (192, 87, 205), (164, 72, 216), (176, 113, 198), (189, 155, 181), + (209, 154, 170), (229, 154, 160), (254, 113, 147), (255, 178, 138), + (244, 187, 160), (240, 198, 166), (236, 210, 173), (238, 216, 171), + (241, 223, 169), (252, 218, 182), (235, 228, 190), (221, 229, 189), + (234, 208, 181), (234, 173, 103), (184, 176, 64), (135, 179, 25), + (127, 187, 33), (120, 195, 42), (133, 203, 27), (129, 239, 34), + (226, 215, 96), (238, 203, 120), (250, 192, 144), (242, 185, 150), + (235, 178, 157), (215, 174, 173), (183, 142, 192), (162, 96, 211), + (132, 73, 218), (123, 66, 220), (133, 65, 228), (144, 65, 237), + (153, 50, 246), (162, 46, 246), (158, 65, 251), (160, 69, 251), + (131, 75, 228), (141, 79, 236), (152, 83, 245), (150, 92, 245), + (149, 101, 246), (163, 114, 252), (175, 117, 239), (142, 113, 237), + (148, 82, 236), (141, 129, 139), (155, 144, 88), (170, 160, 37), + (134, 170, 17), (123, 168, 13), (109, 165, 6), (74, 180, 8), + (98, 97, 35), (111, 58, 94), (125, 19, 153), (122, 16, 160), + (119, 14, 168), (72, 41, 137), (55, 35, 91), (112, 75, 78), + (135, 90, 64), (191, 116, 135), (170, 108, 135), (149, 101, 136), + (157, 71, 215), (122, 54, 208), (107, 35, 190), (80, 78, 153), + (76, 78, 161), (114, 90, 203), (153, 103, 246), (168, 126, 249), + (182, 135, 247), (202, 137, 219), (204, 185, 192), (218, 201, 217), + (242, 192, 246), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (253, 226, 209), (242, 201, 219), (234, 203, 200), + (210, 179, 195), (214, 161, 201), (218, 143, 208), (208, 101, 232), + (190, 108, 231), (137, 74, 208), (129, 54, 207), (115, 58, 212), + (118, 35, 190), (137, 15, 169), (126, 33, 122), (157, 98, 122), + (220, 149, 157), (254, 173, 179), (253, 207, 196), (242, 223, 197), + (246, 248, 167), (239, 246, 184), (233, 245, 201), (227, 243, 212), + (230, 255, 229), (228, 245, 229), (202, 232, 206), (177, 226, 226), + (138, 225, 228), (131, 252, 236), (131, 246, 250), (137, 240, 252), + (179, 252, 247), (230, 253, 238), (233, 255, 230), (250, 249, 224), + (251, 251, 224), (245, 251, 206), (227, 239, 164), (245, 248, 150), + (240, 248, 136), (251, 216, 82), (228, 229, 89), (226, 242, 103), + (236, 244, 147), (240, 232, 179), (243, 243, 211), (250, 250, 212), + (239, 239, 202), (221, 218, 178), (217, 173, 168), (192, 126, 134), + (173, 135, 153), (83, 149, 155), (43, 172, 155), (135, 210, 146), + (218, 226, 153), (220, 229, 163), (224, 191, 184), (190, 162, 183), + (132, 148, 181), (129, 72, 208), (120, 37, 191), (123, 15, 169), + (120, 13, 167), (114, 20, 172), (111, 28, 183), (106, 34, 203), + (116, 32, 222), (124, 11, 197), (120, 3, 159), (127, 29, 125), + (120, 72, 83), (143, 131, 10), (123, 119, 4), (158, 16, 6), + (54, 6, 20), (27, 26, 74), (39, 107, 50), (121, 94, 59), + (172, 144, 12), (209, 180, 70), (217, 232, 101), (199, 252, 180), + (165, 255, 201), (120, 232, 176), (130, 191, 186), (116, 149, 161), + (88, 64, 187), (115, 32, 188), (110, 24, 179), (105, 21, 176) + ), + +// 162 Apophysis-040426-163FlwrFernsInv +((132, 26, 36), (154, 62, 23), (148, 90, 33), (142, 119, 43), + (162, 130, 49), (183, 141, 55), (192, 144, 53), (202, 148, 52), + (229, 140, 36), (240, 122, 45), (251, 105, 54), (227, 97, 53), + (203, 89, 53), (123, 84, 77), (44, 80, 102), (23, 87, 107), + (2, 95, 113), (4, 2, 51), (36, 13, 45), (69, 25, 40), + (96, 25, 39), (124, 26, 39), (119, 23, 38), (115, 21, 37), + (97, 7, 45), (93, 6, 46), (90, 5, 47), (107, 13, 41), + (124, 22, 36), (133, 26, 30), (142, 31, 24), (177, 43, 6), + (240, 60, 45), (253, 91, 70), (252, 91, 66), (252, 91, 63), + (244, 82, 50), (236, 73, 38), (225, 85, 44), (215, 97, 51), + (172, 117, 63), (184, 108, 58), (196, 99, 54), (215, 53, 76), + (235, 8, 98), (239, 5, 101), (244, 2, 104), (248, 1, 106), + (240, 14, 114), (159, 11, 99), (138, 38, 58), (117, 65, 18), + (79, 104, 11), (42, 143, 5), (36, 136, 13), (31, 130, 22), + (134, 130, 56), (149, 156, 52), (165, 183, 49), (144, 145, 63), + (123, 108, 77), (75, 106, 102), (28, 104, 127), (20, 107, 126), + (51, 127, 141), (110, 175, 177), (128, 188, 187), (146, 201, 198), + (154, 203, 200), (163, 205, 203), (176, 212, 210), (210, 227, 219), + (252, 232, 146), (252, 210, 105), (252, 188, 65), (228, 193, 78), + (205, 198, 92), (192, 206, 106), (180, 215, 121), (203, 226, 144), + (243, 243, 155), (228, 235, 217), (224, 235, 224), (220, 235, 232), + (214, 209, 215), (208, 184, 198), (177, 150, 143), (183, 123, 97), + (66, 135, 150), (90, 150, 160), (115, 166, 170), (115, 172, 175), + (115, 179, 181), (127, 187, 187), (137, 180, 186), (154, 203, 200), + (162, 208, 206), (176, 180, 165), (165, 144, 123), (154, 108, 82), + (127, 99, 72), (101, 90, 62), (83, 62, 35), (100, 23, 39), + (129, 56, 67), (164, 88, 87), (199, 121, 108), (224, 172, 140), + (250, 224, 173), (253, 247, 233), (245, 242, 237), (242, 227, 170), + (252, 245, 128), (233, 196, 63), (224, 174, 51), (216, 153, 39), + (238, 85, 90), (236, 16, 116), (245, 13, 115), (253, 8, 112), + (252, 9, 115), (251, 10, 115), (250, 11, 115), (243, 13, 114), + (236, 16, 114), (224, 19, 112), (191, 19, 105), (145, 27, 88), + (105, 4, 44), (84, 4, 57), (78, 10, 61), (72, 16, 65), + (76, 14, 61), (76, 21, 40), (86, 8, 48), (121, 14, 44), + (159, 69, 6), (181, 108, 38), (204, 147, 70), (200, 153, 64), + (197, 159, 58), (195, 171, 61), (157, 160, 53), (246, 49, 56), + (236, 7, 98), (252, 2, 110), (252, 1, 110), (252, 0, 111), + (253, 3, 111), (250, 11, 115), (251, 12, 116), (240, 16, 115), + (224, 16, 110), (212, 20, 107), (200, 25, 104), (166, 141, 180), + (172, 211, 208), (210, 231, 226), (223, 198, 201), (189, 150, 109), + (189, 126, 82), (236, 123, 57), (244, 109, 63), (253, 95, 70), + (254, 89, 70), (253, 71, 70), (225, 21, 110), (212, 19, 108), + (182, 26, 99), (184, 23, 100), (186, 20, 102), (200, 10, 108), + (201, 11, 111), (190, 17, 106), (186, 20, 102), (142, 8, 93), + (146, 14, 28), (167, 15, 14), (153, 23, 23), (147, 35, 23), + (163, 42, 13), (177, 26, 7), (197, 40, 7), (227, 52, 33), + (254, 94, 68), (253, 94, 69), (253, 95, 70), (250, 86, 77), + (221, 21, 109), (185, 22, 103), (129, 23, 85), (83, 37, 66), + (62, 14, 64), (31, 39, 26), (10, 47, 3), (22, 53, 55), + (24, 70, 94), (17, 97, 120), (33, 111, 131), (77, 147, 155), + (111, 164, 172), (128, 169, 175), (113, 97, 110), (111, 52, 48), + (109, 23, 50), (139, 6, 33), (177, 22, 100), (209, 15, 112), + (231, 23, 109), (251, 88, 79), (222, 138, 68), (251, 179, 61), + (234, 185, 56), (204, 166, 55), (201, 164, 60), (182, 175, 61), + (178, 207, 53), (174, 196, 88), (206, 228, 127), (196, 224, 137), + (181, 218, 141), (151, 195, 106), (160, 111, 97), (129, 55, 82), + (59, 65, 97), (41, 57, 93), (42, 41, 81), (80, 30, 65), + (121, 28, 83), (185, 22, 103), (203, 21, 106), (239, 5, 102), + (250, 14, 115), (235, 17, 112), (220, 20, 109), (186, 71, 78), + (149, 116, 65), (120, 174, 98), (81, 156, 162), (78, 159, 162), + (52, 132, 139), (55, 105, 130), (104, 94, 41), (159, 82, 2), + (205, 92, 14), (232, 77, 33), (237, 62, 41), (246, 69, 51), + (251, 85, 59), (252, 88, 63), (252, 73, 68), (235, 8, 98), + (239, 5, 102), (204, 14, 110), (160, 30, 92), (132, 27, 84) + ), + +// 163 Apophysis-040426-163FloralCascade2 +((129, 89, 30), (193, 158, 128), (186, 174, 134), (180, 190, 140), + (135, 164, 147), (91, 138, 154), (95, 154, 163), (100, 171, 173), + (172, 201, 197), (202, 222, 213), (233, 244, 230), (237, 219, 206), + (241, 195, 182), (213, 170, 123), (186, 145, 65), (170, 124, 45), + (155, 104, 25), (89, 60, 28), (97, 34, 36), (106, 9, 44), + (105, 9, 44), (104, 10, 44), (101, 9, 45), (99, 9, 47), + (62, 2, 56), (123, 8, 80), (185, 15, 104), (203, 17, 107), + (222, 19, 111), (227, 18, 111), (232, 17, 111), (235, 6, 99), + (205, 9, 31), (150, 49, 19), (192, 87, 27), (234, 126, 35), + (241, 150, 50), (248, 174, 65), (250, 153, 66), (252, 133, 67), + (246, 66, 51), (238, 62, 42), (230, 59, 33), (218, 93, 52), + (207, 128, 71), (208, 142, 63), (209, 157, 55), (240, 198, 62), + (220, 202, 56), (178, 121, 32), (184, 61, 18), (190, 1, 5), + (197, 19, 12), (205, 38, 19), (218, 45, 28), (232, 52, 37), + (167, 64, 67), (144, 44, 55), (121, 24, 44), (96, 39, 63), + (71, 55, 82), (55, 66, 87), (40, 77, 93), (21, 80, 110), + (27, 103, 126), (47, 131, 142), (81, 150, 158), (116, 169, 175), + (127, 179, 181), (139, 189, 188), (209, 212, 193), (240, 241, 207), + (173, 199, 174), (122, 168, 161), (71, 137, 149), (43, 108, 130), + (16, 79, 112), (9, 70, 105), (2, 62, 99), (10, 47, 89), + (30, 56, 9), (39, 146, 8), (56, 112, 29), (73, 79, 51), + (74, 64, 61), (75, 50, 71), (114, 23, 82), (185, 17, 102), + (224, 12, 115), (230, 14, 114), (237, 17, 113), (237, 17, 114), + (237, 17, 115), (244, 15, 116), (244, 12, 114), (243, 3, 104), + (244, 2, 104), (253, 7, 114), (252, 8, 114), (251, 10, 115), + (251, 5, 113), (251, 1, 111), (244, 2, 104), (243, 3, 104), + (232, 39, 66), (232, 50, 51), (233, 62, 36), (242, 69, 48), + (252, 76, 61), (233, 129, 56), (206, 144, 71), (176, 156, 61), + (170, 157, 53), (64, 158, 10), (55, 151, 11), (47, 144, 13), + (71, 72, 38), (53, 55, 42), (52, 26, 73), (40, 42, 81), + (47, 67, 102), (70, 56, 98), (94, 46, 94), (134, 50, 99), + (175, 54, 105), (194, 20, 105), (164, 2, 13), (141, 2, 31), + (125, 22, 41), (100, 114, 127), (98, 124, 138), (97, 134, 150), + (92, 150, 161), (70, 149, 156), (92, 169, 117), (101, 159, 98), + (145, 138, 128), (139, 154, 153), (134, 171, 179), (162, 176, 179), + (190, 182, 180), (224, 194, 158), (203, 155, 132), (188, 95, 88), + (199, 21, 105), (213, 13, 112), (220, 16, 111), (227, 20, 110), + (213, 78, 72), (221, 148, 80), (231, 204, 125), (250, 249, 143), + (204, 227, 123), (190, 210, 102), (176, 193, 81), (102, 149, 55), + (39, 83, 94), (20, 96, 120), (15, 108, 125), (7, 85, 108), + (8, 84, 108), (67, 76, 81), (77, 75, 87), (88, 75, 93), + (125, 89, 103), (128, 115, 109), (153, 105, 91), (117, 107, 56), + (156, 63, 29), (149, 49, 23), (143, 36, 18), (133, 29, 28), + (110, 10, 44), (93, 23, 59), (97, 67, 57), (100, 143, 61), + (160, 164, 44), (173, 183, 71), (230, 237, 108), (252, 252, 118), + (232, 241, 116), (233, 172, 117), (227, 128, 71), (251, 96, 78), + (253, 92, 64), (252, 103, 67), (252, 115, 71), (226, 152, 53), + (251, 176, 57), (233, 208, 63), (223, 217, 69), (182, 202, 91), + (162, 196, 47), (153, 175, 40), (129, 150, 29), (91, 151, 29), + (102, 105, 34), (100, 70, 46), (123, 80, 61), (144, 103, 107), + (158, 110, 74), (176, 117, 49), (201, 117, 70), (247, 100, 80), + (252, 86, 74), (253, 87, 63), (254, 85, 64), (253, 81, 71), + (252, 71, 60), (235, 17, 112), (231, 17, 113), (216, 22, 109), + (190, 17, 106), (109, 21, 81), (54, 23, 64), (44, 48, 86), + (25, 73, 109), (21, 75, 101), (26, 56, 94), (6, 45, 88), + (23, 40, 84), (51, 23, 71), (82, 10, 58), (102, 6, 52), + (80, 3, 57), (54, 9, 64), (44, 5, 52), (16, 19, 72), + (18, 28, 77), (38, 26, 74), (39, 30, 33), (19, 34, 15), + (51, 32, 34), (61, 28, 37), (64, 65, 8), (105, 101, 12), + (123, 137, 52), (175, 171, 48), (184, 150, 52), (177, 127, 42), + (158, 74, 64), (149, 91, 67), (180, 132, 70), (198, 166, 93), + (251, 205, 156), (243, 235, 189), (253, 250, 209), (245, 248, 227), + (249, 246, 239), (248, 248, 214), (214, 176, 199), (209, 91, 125), + (224, 19, 112), (235, 17, 112), (248, 65, 57), (234, 70, 35) + ), + +// 164 Apophysis-040426-163FlowerBurst +((0, 0, 0), (119, 9, 24), (184, 5, 15), (250, 1, 7), + (194, 14, 7), (138, 27, 8), (110, 28, 8), (82, 30, 9), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (88, 15, 3), + (177, 31, 6), (177, 33, 5), (177, 35, 5), (132, 41, 20), + (87, 48, 35), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (58, 63, 41), + (122, 130, 105), (213, 176, 208), (232, 189, 164), (252, 202, 120), + (242, 209, 93), (233, 217, 67), (234, 214, 65), (235, 211, 63), + (232, 219, 108), (232, 210, 167), (232, 202, 227), (242, 205, 231), + (252, 208, 235), (252, 177, 216), (253, 147, 197), (209, 93, 184), + (158, 28, 143), (172, 40, 68), (96, 66, 65), (21, 93, 63), + (10, 46, 31), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (57, 5, 13), (114, 11, 27), (196, 59, 6), + (219, 117, 29), (222, 180, 50), (167, 166, 63), (112, 153, 76), + (72, 144, 50), (33, 135, 25), (28, 122, 31), (18, 120, 34), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (49, 13, 52), (99, 26, 105), + (126, 24, 123), (153, 23, 142), (202, 11, 148), (233, 69, 169), + (231, 123, 187), (138, 99, 129), (45, 75, 71), (22, 37, 35), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (27, 22, 1), (55, 45, 3), (82, 54, 2), + (110, 64, 1), (215, 151, 41), (253, 196, 67), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (58, 40, 6), (116, 56, 0), (212, 98, 19), (254, 110, 38), + (188, 89, 11), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (2, 92, 7), (2, 126, 38), (33, 135, 25), (40, 140, 21), + (88, 152, 31), (127, 150, 32), (151, 162, 41), (163, 166, 39), + (166, 181, 35), (143, 198, 66), (127, 188, 45), (103, 170, 39), + (83, 167, 34), (117, 185, 17), (201, 217, 56), (205, 218, 78), + (208, 188, 52), (185, 162, 41), (128, 133, 68), (52, 103, 14), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (76, 50, 71), + (143, 2, 111), (153, 26, 142), (231, 126, 156), (233, 130, 170), + (185, 63, 163), (93, 34, 103), (27, 88, 61), (0, 0, 0) + ), + +// 165 Apophysis-040426-163MaltesePurple +((154, 94, 148), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (208, 44, 246), (222, 49, 238), (222, 60, 216), + (223, 71, 194), (154, 94, 148), (154, 94, 148), (154, 94, 148), + (155, 93, 149), (157, 93, 150), (175, 87, 162), (193, 81, 174), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (198, 41, 254), + (231, 52, 232), (247, 63, 210), (245, 59, 217), (243, 56, 224), + (231, 52, 232), (219, 48, 240), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (196, 40, 254), (198, 41, 254), + (211, 45, 245), (225, 50, 236), (235, 67, 202), (229, 69, 198), + (241, 65, 206), (231, 57, 222), (222, 49, 238), (208, 44, 246), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (184, 84, 168), (170, 88, 159), (157, 93, 150), + (145, 97, 142), (148, 96, 144), (157, 93, 150), (199, 79, 178), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (210, 45, 246), + (211, 75, 186), (160, 92, 152), (157, 93, 150), (208, 76, 184), + (204, 43, 250), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (195, 40, 255), + (195, 40, 255), (195, 40, 255), (195, 40, 255), (178, 86, 164) + ), + +// 166 Apophysis-040426-163Mycelialg +((236, 164, 209), (49, 2, 28), (24, 1, 14), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 56, 119), (77, 47, 106), (155, 39, 94), (170, 41, 68), + (185, 43, 42), (132, 30, 28), (79, 18, 14), (54, 9, 32), + (30, 0, 50), (0, 0, 85), (5, 14, 66), (11, 29, 47), + (5, 14, 23), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (5, 18, 15), + (11, 36, 30), (51, 69, 55), (92, 103, 80), (142, 179, 137), + (197, 211, 212), (255, 198, 255), (255, 179, 255), (255, 160, 255), + (254, 167, 233), (254, 175, 212), (250, 176, 212), (246, 178, 212), + (238, 187, 212), (230, 191, 212), (223, 196, 212), (228, 193, 212), + (233, 190, 212), (244, 199, 214), (255, 208, 216), (255, 219, 181), + (205, 208, 211), (181, 214, 255), (142, 160, 183), (103, 106, 111), + (92, 91, 114), (82, 76, 117), (40, 8, 135), (35, 9, 136), + (120, 63, 179), (167, 98, 199), (215, 134, 220), (184, 119, 196), + (153, 105, 173), (143, 100, 166), (134, 96, 159), (136, 99, 163), + (167, 107, 200), (222, 147, 212), (232, 154, 212), (242, 162, 212), + (248, 166, 212), (254, 170, 212), (248, 166, 212), (231, 146, 240), + (212, 132, 228), (214, 139, 220), (216, 146, 212), (215, 142, 212), + (214, 139, 212), (166, 132, 146), (86, 127, 90), (0, 103, 80), + (0, 44, 49), (0, 0, 0), (5, 10, 0), (11, 21, 0), + (27, 21, 0), (43, 22, 0), (112, 120, 62), (168, 177, 103), + (252, 171, 212), (232, 154, 212), (213, 138, 212), (183, 125, 183), + (154, 113, 155), (95, 82, 123), (49, 62, 81), (0, 55, 36), + (4, 39, 45), (96, 81, 126), (113, 94, 151), (130, 107, 176), + (173, 127, 255), (194, 124, 249), (200, 91, 255), (209, 91, 243), + (69, 40, 145), (34, 20, 142), (0, 0, 140), (0, 1, 112), + (0, 2, 85), (0, 6, 86), (6, 12, 96), (28, 26, 104), + (62, 46, 129), (89, 61, 145), (92, 70, 138), (95, 79, 132), + (60, 72, 82), (44, 57, 80), (0, 41, 38), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (31, 4, 48), (65, 37, 81), (94, 46, 89), + (118, 91, 145), (255, 62, 130), (253, 55, 112), (252, 49, 95), + (251, 21, 0), (197, 47, 0), (138, 19, 12), (88, 31, 14), + (19, 12, 0), (9, 6, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (16, 20, 50), + (12, 16, 94), (63, 45, 128), (112, 74, 143), (145, 102, 165), + (222, 150, 212), (227, 153, 212), (233, 157, 212), (242, 163, 212), + (232, 155, 212), (222, 146, 212), (205, 140, 201), (181, 105, 105), + (80, 81, 93), (21, 41, 73), (6, 20, 63), (0, 10, 78), + (10, 8, 88), (48, 59, 86), (122, 91, 105), (175, 129, 163), + (212, 140, 212), (218, 145, 212), (225, 149, 212), (224, 154, 212), + (231, 157, 211), (255, 124, 118), (255, 103, 110), (255, 104, 119), + (255, 91, 153), (227, 150, 212), (245, 135, 242), (255, 151, 255), + (255, 159, 255), (217, 182, 255), (225, 165, 233), (203, 136, 212), + (130, 98, 161), (76, 71, 111), (20, 46, 60), (31, 27, 10), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (29, 3, 56), + (39, 31, 114), (74, 53, 140), (107, 72, 159), (108, 70, 160), + (111, 74, 160), (144, 100, 167), (210, 138, 212), (221, 149, 212), + (245, 169, 212), (255, 198, 212), (255, 227, 213), (255, 255, 255), + (255, 235, 255), (255, 198, 255), (238, 187, 212), (242, 181, 212) + ), + +// 167 Apophysis-040426-163MyceliaInv +((19, 91, 46), (206, 253, 227), (230, 254, 241), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 199, 136), (177, 207, 148), (100, 216, 161), (85, 214, 187), + (70, 212, 213), (123, 224, 227), (176, 237, 241), (200, 246, 223), + (225, 255, 205), (255, 255, 170), (249, 240, 189), (244, 226, 208), + (249, 240, 231), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (249, 237, 240), + (244, 219, 225), (203, 185, 200), (163, 152, 175), (113, 76, 118), + (58, 44, 43), (0, 57, 0), (0, 76, 0), (0, 95, 0), + (0, 87, 21), (1, 80, 43), (5, 78, 43), (9, 77, 43), + (17, 68, 43), (24, 63, 43), (32, 59, 43), (27, 62, 43), + (22, 65, 43), (11, 56, 41), (0, 47, 39), (0, 36, 74), + (50, 47, 44), (74, 41, 0), (113, 95, 72), (152, 149, 144), + (162, 164, 141), (173, 179, 138), (215, 247, 120), (220, 246, 119), + (135, 192, 76), (87, 156, 55), (40, 121, 35), (71, 135, 58), + (102, 150, 82), (111, 154, 89), (121, 159, 96), (119, 156, 92), + (88, 148, 55), (33, 108, 43), (23, 100, 43), (13, 93, 43), + (7, 89, 43), (1, 85, 43), (7, 89, 43), (24, 109, 15), + (43, 123, 27), (41, 116, 35), (39, 109, 43), (40, 112, 43), + (41, 116, 43), (89, 123, 109), (169, 128, 165), (255, 152, 175), + (255, 211, 206), (255, 255, 255), (249, 244, 255), (244, 234, 255), + (228, 233, 255), (212, 233, 255), (143, 135, 193), (87, 78, 152), + (3, 84, 43), (22, 100, 43), (42, 117, 43), (71, 129, 71), + (101, 142, 100), (160, 173, 132), (206, 193, 174), (255, 200, 219), + (251, 216, 210), (159, 174, 129), (142, 161, 104), (125, 148, 79), + (82, 128, 0), (61, 131, 6), (55, 164, 0), (46, 164, 12), + (186, 215, 110), (220, 235, 112), (255, 255, 115), (255, 254, 142), + (255, 253, 170), (255, 249, 169), (249, 243, 159), (227, 229, 151), + (193, 209, 126), (166, 194, 110), (163, 185, 116), (160, 176, 123), + (195, 183, 173), (211, 198, 175), (255, 214, 217), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (224, 251, 207), (190, 218, 174), (161, 209, 166), + (137, 164, 110), (0, 193, 125), (1, 199, 142), (3, 206, 160), + (4, 234, 255), (58, 208, 255), (117, 236, 243), (167, 224, 241), + (236, 243, 255), (245, 249, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (239, 235, 205), + (243, 239, 161), (192, 210, 127), (143, 181, 112), (110, 153, 90), + (33, 105, 43), (27, 101, 43), (22, 98, 43), (13, 92, 43), + (23, 100, 43), (33, 109, 43), (50, 115, 54), (74, 150, 150), + (175, 174, 162), (234, 214, 182), (249, 235, 192), (255, 245, 177), + (245, 247, 167), (207, 196, 169), (133, 164, 150), (80, 126, 92), + (43, 115, 43), (37, 110, 43), (30, 106, 43), (31, 101, 43), + (24, 98, 44), (0, 131, 137), (0, 152, 145), (0, 151, 136), + (0, 164, 102), (28, 105, 43), (10, 120, 13), (0, 104, 0), + (0, 96, 0), (38, 73, 0), (30, 90, 22), (52, 119, 43), + (125, 157, 94), (179, 184, 144), (235, 209, 195), (224, 228, 245), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (226, 252, 199), + (216, 224, 141), (181, 202, 115), (148, 183, 96), (147, 185, 95), + (144, 181, 95), (111, 155, 88), (45, 117, 43), (34, 106, 43), + (10, 86, 43), (0, 57, 43), (0, 28, 42), (0, 0, 0), + (0, 20, 0), (0, 57, 0), (17, 68, 43), (13, 74, 43) + ), + +// 168 Apophysis-040426-163MrryGRnd +((6, 64, 23), (6, 64, 23), (6, 64, 23), (6, 64, 23), + (6, 64, 23), (6, 64, 23), (6, 64, 23), (6, 64, 23), + (12, 55, 12), (14, 54, 13), (16, 54, 15), (59, 78, 24), + (102, 103, 33), (132, 100, 30), (162, 98, 27), (154, 87, 22), + (146, 77, 18), (76, 50, 25), (41, 57, 24), (6, 64, 23), + (6, 64, 23), (6, 64, 23), (6, 64, 23), (6, 64, 23), + (6, 64, 23), (6, 64, 23), (6, 64, 23), (6, 64, 23), + (6, 64, 23), (6, 64, 23), (6, 64, 23), (6, 64, 23), + (6, 64, 23), (6, 64, 23), (6, 64, 23), (6, 64, 23), + (6, 64, 23), (6, 64, 23), (6, 64, 23), (6, 64, 23), + (6, 64, 23), (6, 64, 23), (6, 64, 23), (11, 59, 19), + (16, 54, 15), (16, 54, 15), (16, 54, 15), (25, 42, 10), + (48, 24, 0), (79, 14, 8), (59, 22, 11), (40, 31, 14), + (25, 21, 17), (11, 11, 21), (34, 13, 30), (57, 15, 39), + (146, 31, 98), (174, 15, 85), (203, 0, 72), (214, 21, 39), + (226, 42, 6), (207, 82, 35), (189, 123, 65), (198, 175, 81), + (209, 206, 135), (222, 206, 180), (196, 198, 189), (170, 190, 199), + (175, 188, 151), (181, 186, 104), (164, 120, 111), (99, 85, 84), + (57, 47, 58), (95, 44, 75), (134, 42, 93), (160, 69, 84), + (187, 96, 75), (210, 82, 119), (233, 68, 163), (215, 3, 124), + (162, 40, 91), (44, 34, 7), (30, 44, 9), (16, 55, 11), + (16, 54, 13), (16, 54, 15), (42, 46, 31), (66, 42, 40), + (109, 125, 112), (135, 134, 120), (162, 143, 129), (140, 134, 115), + (118, 126, 102), (103, 109, 83), (58, 90, 103), (20, 89, 68), + (2, 93, 50), (10, 50, 52), (72, 79, 51), (135, 109, 50), + (164, 126, 44), (194, 143, 38), (214, 163, 45), (213, 177, 63), + (122, 154, 31), (72, 137, 29), (22, 121, 28), (11, 118, 35), + (1, 115, 43), (0, 115, 42), (13, 111, 36), (18, 95, 25), + (5, 66, 24), (80, 142, 7), (97, 143, 12), (115, 144, 18), + (124, 154, 24), (153, 88, 22), (198, 51, 70), (6, 64, 23), + (6, 64, 23), (6, 64, 23), (6, 64, 23), (6, 64, 23), + (6, 64, 23), (6, 64, 23), (6, 64, 23), (6, 64, 23), + (6, 64, 23), (16, 54, 15), (19, 49, 14), (23, 44, 13), + (93, 47, 23), (131, 58, 17), (152, 29, 21), (142, 29, 15), + (94, 36, 24), (81, 18, 20), (68, 0, 17), (69, 2, 10), + (70, 5, 3), (66, 17, 0), (41, 36, 6), (16, 54, 15), + (6, 64, 23), (28, 52, 52), (21, 40, 58), (14, 28, 65), + (28, 50, 61), (73, 58, 37), (128, 111, 33), (201, 155, 43), + (186, 214, 93), (164, 195, 90), (142, 177, 87), (150, 143, 91), + (183, 143, 47), (196, 138, 41), (175, 119, 32), (168, 104, 30), + (192, 65, 50), (149, 61, 86), (150, 72, 80), (151, 84, 75), + (137, 100, 84), (147, 116, 85), (144, 113, 82), (121, 112, 81), + (25, 59, 22), (20, 56, 18), (16, 54, 15), (16, 54, 15), + (16, 54, 15), (6, 64, 23), (6, 64, 23), (6, 64, 23), + (6, 64, 23), (6, 64, 23), (6, 64, 23), (6, 64, 23), + (6, 64, 23), (6, 64, 23), (6, 64, 23), (6, 64, 23), + (6, 64, 23), (6, 64, 23), (6, 64, 23), (6, 64, 23), + (6, 64, 23), (6, 64, 23), (16, 54, 15), (86, 48, 12), + (121, 31, 30), (165, 0, 6), (215, 3, 0), (194, 0, 24), + (158, 20, 20), (106, 31, 8), (53, 25, 4), (17, 47, 9), + (13, 54, 14), (6, 64, 23), (6, 64, 23), (6, 64, 23), + (6, 64, 23), (6, 64, 23), (6, 64, 23), (6, 64, 23), + (6, 64, 23), (6, 64, 23), (6, 64, 23), (6, 64, 23), + (6, 64, 23), (6, 64, 23), (6, 64, 23), (6, 64, 23), + (6, 64, 23), (6, 64, 23), (6, 64, 23), (6, 64, 23), + (6, 64, 23), (6, 64, 23), (6, 64, 23), (6, 64, 23), + (6, 64, 23), (6, 64, 23), (6, 64, 23), (16, 54, 15), + (16, 54, 15), (16, 54, 15), (6, 64, 23), (6, 64, 23), + (6, 64, 23), (6, 64, 23), (6, 64, 23), (6, 64, 23), + (6, 64, 23), (6, 64, 23), (6, 64, 23), (6, 64, 23), + (6, 64, 23), (6, 64, 23), (6, 64, 23), (6, 64, 23), + (6, 64, 23), (6, 64, 23), (6, 64, 23), (6, 64, 23), + (6, 64, 23), (2, 65, 22), (6, 64, 23), (6, 64, 23), + (6, 64, 23), (6, 64, 23), (6, 64, 23), (6, 64, 23) + ), + +// 169 Apophysis-040426-163SprngFlwrs +((177, 132, 82), (186, 78, 167), (160, 77, 143), (135, 76, 119), + (134, 81, 112), (134, 86, 105), (136, 88, 104), (139, 90, 103), + (147, 95, 105), (139, 89, 104), (132, 84, 104), (125, 81, 101), + (118, 78, 98), (105, 75, 89), (93, 72, 81), (89, 70, 80), + (86, 68, 80), (76, 60, 81), (73, 57, 82), (70, 54, 83), + (58, 47, 80), (46, 40, 78), (49, 39, 82), (52, 39, 86), + (83, 48, 99), (86, 58, 91), (90, 69, 83), (107, 75, 91), + (124, 81, 100), (129, 84, 101), (135, 87, 103), (152, 98, 105), + (188, 120, 111), (248, 140, 160), (242, 145, 138), (237, 151, 117), + (212, 145, 99), (187, 140, 81), (183, 137, 81), (179, 134, 81), + (196, 146, 81), (187, 140, 80), (178, 134, 80), (171, 128, 81), + (164, 123, 82), (155, 118, 80), (147, 113, 78), (139, 107, 79), + (126, 96, 81), (120, 92, 81), (119, 91, 81), (119, 91, 82), + (114, 87, 81), (109, 84, 80), (108, 83, 81), (108, 82, 82), + (108, 82, 82), (113, 81, 88), (118, 80, 95), (128, 84, 99), + (138, 89, 103), (143, 92, 104), (149, 96, 105), (171, 91, 135), + (187, 96, 145), (238, 97, 194), (235, 75, 208), (232, 54, 223), + (223, 43, 238), (214, 32, 254), (219, 37, 252), (226, 66, 231), + (255, 104, 201), (233, 112, 168), (212, 121, 135), (190, 111, 125), + (168, 102, 115), (160, 100, 110), (153, 99, 105), (150, 97, 105), + (150, 97, 105), (175, 97, 130), (195, 107, 135), (215, 118, 141), + (224, 119, 149), (233, 120, 157), (254, 129, 170), (254, 111, 192), + (222, 112, 226), (218, 121, 217), (214, 130, 209), (205, 115, 178), + (196, 100, 147), (183, 98, 137), (158, 98, 112), (155, 101, 105), + (151, 98, 104), (146, 94, 105), (136, 94, 93), (126, 95, 82), + (126, 95, 82), (126, 96, 82), (128, 97, 81), (131, 99, 82), + (148, 95, 105), (147, 95, 105), (147, 95, 105), (144, 93, 105), + (142, 91, 105), (135, 88, 102), (126, 84, 98), (122, 84, 94), + (122, 81, 99), (117, 77, 99), (115, 76, 98), (113, 75, 98), + (109, 73, 96), (98, 59, 104), (90, 55, 102), (62, 29, 108), + (55, 20, 113), (74, 38, 109), (94, 56, 105), (105, 64, 105), + (116, 72, 105), (148, 48, 167), (198, 48, 165), (211, 48, 179), + (241, 48, 212), (253, 74, 244), (241, 90, 234), (229, 107, 225), + (191, 135, 225), (200, 148, 199), (200, 150, 195), (218, 147, 182), + (225, 150, 105), (209, 139, 105), (193, 128, 105), (190, 127, 103), + (187, 127, 101), (160, 120, 81), (145, 112, 78), (128, 99, 78), + (122, 94, 80), (120, 93, 79), (122, 93, 80), (124, 94, 82), + (125, 87, 92), (124, 78, 105), (125, 48, 144), (182, 51, 198), + (220, 19, 236), (216, 33, 236), (213, 48, 237), (173, 116, 242), + (149, 147, 252), (127, 139, 227), (143, 151, 252), (160, 139, 251), + (190, 130, 233), (221, 74, 207), (200, 66, 196), (179, 59, 186), + (158, 48, 178), (116, 48, 134), (122, 77, 104), (122, 87, 90), + (127, 97, 81), (129, 98, 81), (132, 100, 82), (140, 106, 82), + (147, 112, 79), (143, 109, 81), (123, 96, 78), (95, 83, 67), + (79, 64, 79), (40, 48, 56), (3, 48, 19), (0, 48, 16), + (31, 48, 47), (69, 55, 79), (81, 63, 82), (92, 72, 81), + (104, 80, 81), (106, 81, 81), (108, 82, 82), (108, 84, 79), + (106, 81, 81), (106, 73, 93), (109, 57, 118), (121, 48, 139), + (179, 53, 193), (216, 48, 240), (255, 66, 252), (255, 60, 252), + (244, 48, 241), (224, 32, 248), (221, 48, 246), (240, 92, 233), + (204, 107, 250), (205, 126, 223), (218, 135, 198), (181, 81, 158), + (139, 69, 132), (115, 73, 103), (111, 81, 88), (100, 77, 81), + (97, 75, 81), (101, 80, 78), (105, 83, 78), (107, 84, 79), + (111, 86, 81), (118, 92, 78), (126, 97, 80), (136, 104, 80), + (152, 114, 81), (176, 104, 122), (220, 117, 148), (240, 112, 176), + (248, 104, 210), (229, 116, 212), (229, 125, 201), (243, 116, 174), + (232, 119, 159), (198, 112, 132), (182, 110, 119), (157, 102, 104), + (146, 95, 103), (126, 95, 82), (119, 91, 82), (114, 87, 82), + (112, 86, 82), (117, 89, 81), (120, 86, 90), (120, 91, 83), + (124, 94, 82), (130, 98, 82), (148, 112, 80), (170, 116, 98), + (188, 127, 102), (190, 127, 103), (191, 110, 129), (186, 109, 125), + (161, 101, 110), (152, 98, 105), (149, 96, 105), (142, 91, 104), + (128, 85, 99), (123, 90, 86), (125, 95, 82), (126, 95, 82), + (127, 98, 80), (132, 102, 78), (149, 115, 79), (200, 148, 81) + ), + +// 170 Apophysis-040426-163SprngFlwersInv +((147, 173, 173), (147, 173, 173), (142, 174, 166), (137, 175, 160), + (127, 170, 156), (117, 166, 152), (111, 162, 151), (106, 159, 150), + (68, 159, 110), (42, 158, 85), (17, 158, 61), (20, 179, 46), + (23, 201, 32), (29, 209, 17), (36, 218, 3), (32, 203, 13), + (29, 189, 24), (0, 151, 54), (21, 142, 87), (43, 134, 120), + (65, 143, 130), (87, 153, 140), (94, 154, 145), (102, 156, 150), + (105, 158, 150), (92, 158, 137), (80, 158, 125), (60, 147, 119), + (40, 137, 114), (31, 136, 106), (22, 135, 98), (1, 126, 85), + (1, 144, 63), (33, 143, 29), (37, 134, 37), (41, 125, 46), + (56, 141, 82), (72, 157, 118), (84, 157, 130), (97, 157, 143), + (104, 157, 151), (106, 159, 150), (109, 161, 150), (119, 160, 161), + (129, 160, 173), (129, 159, 173), (129, 159, 173), (127, 158, 174), + (124, 156, 173), (107, 160, 150), (107, 160, 150), (108, 160, 150), + (114, 163, 151), (120, 167, 153), (124, 169, 155), (129, 171, 157), + (133, 174, 156), (135, 176, 156), (138, 178, 156), (142, 180, 157), + (146, 182, 159), (151, 189, 155), (157, 196, 151), (165, 200, 153), + (193, 226, 147), (200, 235, 142), (180, 217, 146), (161, 199, 150), + (150, 191, 150), (139, 183, 150), (107, 207, 88), (57, 207, 90), + (14, 207, 43), (8, 194, 27), (2, 181, 11), (33, 150, 20), + (64, 120, 30), (59, 113, 43), (55, 107, 56), (55, 105, 60), + (37, 108, 73), (30, 105, 150), (46, 116, 150), (62, 127, 150), + (65, 127, 152), (68, 128, 154), (95, 135, 174), (110, 143, 177), + (133, 161, 175), (134, 161, 175), (135, 162, 176), (133, 161, 174), + (131, 161, 173), (130, 168, 163), (131, 177, 150), (130, 207, 111), + (73, 204, 57), (35, 236, 19), (58, 187, 16), (82, 139, 13), + (94, 123, 8), (106, 108, 3), (128, 116, 28), (112, 104, 3), + (65, 125, 22), (49, 153, 35), (34, 181, 48), (55, 188, 58), + (76, 196, 69), (97, 207, 77), (139, 207, 121), (133, 178, 151), + (133, 168, 165), (128, 158, 174), (125, 156, 173), (123, 155, 173), + (115, 149, 173), (108, 143, 176), (112, 146, 174), (132, 159, 177), + (176, 191, 176), (214, 199, 206), (252, 207, 236), (253, 207, 237), + (255, 207, 239), (224, 207, 208), (186, 200, 176), (174, 192, 173), + (163, 183, 174), (151, 175, 174), (149, 174, 173), (147, 173, 173), + (147, 171, 176), (149, 174, 174), (149, 182, 162), (146, 198, 137), + (76, 202, 62), (38, 195, 32), (0, 189, 3), (0, 192, 3), + (0, 195, 3), (11, 207, 14), (31, 223, 7), (34, 207, 9), + (15, 163, 22), (50, 129, 32), (43, 124, 44), (37, 120, 57), + (74, 174, 97), (116, 186, 123), (140, 182, 152), (144, 174, 167), + (158, 180, 174), (156, 177, 175), (154, 175, 177), (150, 172, 177), + (148, 171, 176), (144, 169, 174), (137, 163, 177), (129, 158, 175), + (119, 151, 175), (79, 151, 133), (57, 144, 120), (35, 138, 107), + (15, 143, 79), (7, 151, 45), (26, 139, 43), (26, 130, 54), + (23, 136, 96), (40, 139, 109), (57, 143, 123), (73, 145, 136), + (98, 153, 151), (109, 160, 152), (129, 160, 173), (136, 164, 173), + (141, 168, 173), (143, 169, 173), (138, 166, 174), (135, 169, 165), + (135, 164, 172), (131, 161, 173), (125, 157, 173), (107, 143, 175), + (67, 128, 153), (66, 128, 152), (65, 128, 152), (64, 145, 126), + (69, 146, 130), (94, 154, 145), (103, 157, 150), (106, 159, 150), + (113, 164, 151), (127, 170, 156), (132, 165, 169), (130, 160, 173), + (129, 160, 173), (128, 157, 175), (123, 153, 177), (106, 140, 176), + (55, 107, 174), (78, 123, 173), (46, 140, 21), (69, 177, 88), + (93, 186, 100), (120, 179, 136), (121, 170, 150), (121, 169, 150), + (116, 165, 152), (113, 164, 150), (108, 160, 150), (109, 161, 150), + (123, 171, 151), (127, 174, 150), (137, 177, 157), (152, 176, 174), + (162, 183, 174), (169, 187, 175), (178, 195, 173), (179, 195, 174), + (180, 199, 171), (185, 201, 172), (196, 208, 173), (209, 215, 177), + (203, 216, 169), (192, 222, 150), (172, 207, 156), (170, 204, 152), + (165, 186, 172), (147, 180, 162), (131, 174, 155), (120, 168, 152), + (103, 157, 150), (67, 135, 144), (29, 120, 127), (7, 115, 95), + (8, 112, 115), (18, 104, 138), (39, 110, 150), (68, 115, 174), + (76, 121, 174), (72, 119, 173), (59, 109, 174), (68, 115, 174), + (77, 121, 175), (83, 126, 174), (91, 132, 173), (108, 142, 177), + (116, 148, 176), (129, 159, 174), (133, 162, 174), (135, 163, 174), + (135, 163, 174), (136, 164, 173), (143, 168, 176), (146, 171, 175) + ), + +// 171 Apophysis-040426-163DemMask +((1, 1, 1), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (5, 7, 4), (63, 74, 49), (121, 142, 95), (166, 145, 116), + (212, 149, 138), (136, 104, 99), (60, 60, 60), (32, 32, 31), + (4, 5, 2), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (6, 5, 3), (12, 11, 7), (49, 38, 23), (87, 65, 40), + (205, 183, 66), (223, 208, 71), (242, 234, 76), (247, 243, 88), + (252, 253, 101), (250, 250, 99), (249, 248, 97), (250, 237, 76), + (242, 223, 70), (250, 170, 94), (232, 201, 107), (214, 233, 120), + (222, 227, 140), (230, 222, 161), (225, 235, 199), (250, 218, 181), + (253, 252, 131), (242, 242, 103), (231, 233, 75), (183, 186, 71), + (135, 139, 68), (104, 104, 48), (73, 69, 29), (10, 10, 5), + (1, 1, 0), (7, 7, 4), (97, 18, 30), (188, 29, 56), + (215, 36, 49), (242, 43, 42), (255, 86, 25), (252, 91, 40), + (176, 173, 54), (178, 173, 94), (181, 173, 134), (181, 159, 143), + (181, 146, 152), (135, 118, 118), (34, 97, 129), (2, 29, 17), + (0, 1, 1), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (3, 1, 2), (193, 25, 48), (217, 31, 52), (242, 38, 56), + (242, 10, 103), (242, 2, 137), (242, 4, 145), (242, 59, 150), + (206, 169, 76), (211, 195, 68), (216, 221, 60), (176, 204, 56), + (136, 187, 52), (89, 89, 48), (33, 33, 18), (3, 3, 2), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (1, 1, 1), (4, 4, 2), (8, 7, 3), (45, 46, 46), + (162, 72, 80), (238, 45, 63), (224, 57, 87), (184, 81, 103), + (143, 83, 94), (51, 38, 26), (4, 3, 2), (14, 0, 5), + (81, 6, 54), (114, 66, 99), (153, 93, 115), (82, 63, 80), + (2, 2, 1), (1, 1, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (1, 1, 0), (6, 6, 4), (48, 50, 70), (15, 91, 118), + (22, 59, 95), (10, 10, 9), (1, 1, 1), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (3, 1, 1), (23, 7, 2), (114, 72, 54), + (188, 149, 74), (228, 194, 116), (235, 225, 137), (225, 190, 172), + (216, 129, 152), (252, 98, 152), (238, 57, 168), (233, 1, 149), + (216, 12, 92), (181, 26, 103), (0, 0, 0), (28, 51, 43) + ), + +// 172 Apophysis-040426-163ResurectTree +((103, 134, 255), (95, 126, 248), (89, 120, 242), (83, 114, 236), + (72, 103, 225), (62, 93, 215), (53, 84, 206), (45, 76, 198), + (6, 24, 146), (20, 44, 166), (34, 65, 187), (49, 80, 202), + (65, 96, 218), (91, 122, 229), (118, 149, 240), (127, 158, 231), + (136, 167, 222), (161, 192, 197), (164, 195, 193), (168, 199, 190), + (174, 205, 183), (181, 212, 177), (185, 216, 172), (190, 221, 168), + (206, 237, 152), (228, 233, 130), (250, 230, 108), (248, 223, 101), + (247, 216, 94), (246, 215, 93), (246, 215, 93), (244, 213, 91), + (244, 213, 91), (215, 184, 62), (225, 194, 72), (236, 205, 83), + (239, 221, 99), (242, 238, 116), (236, 243, 121), (231, 249, 127), + (207, 238, 151), (215, 246, 143), (223, 254, 135), (221, 252, 136), + (220, 251, 138), (217, 248, 140), (215, 246, 143), (214, 245, 144), + (199, 230, 159), (188, 219, 170), (184, 215, 174), (180, 211, 178), + (170, 201, 187), (161, 192, 197), (152, 183, 205), (144, 175, 214), + (118, 149, 240), (112, 143, 245), (107, 138, 251), (102, 133, 251), + (98, 129, 251), (101, 132, 252), (105, 136, 253), (114, 145, 244), + (125, 156, 233), (150, 181, 208), (164, 195, 194), (178, 209, 180), + (184, 215, 173), (191, 222, 167), (193, 224, 165), (189, 220, 169), + (178, 209, 180), (167, 198, 190), (157, 188, 201), (152, 183, 205), + (148, 179, 210), (152, 183, 206), (156, 187, 202), (169, 200, 189), + (184, 215, 174), (198, 229, 160), (203, 234, 155), (208, 239, 150), + (204, 235, 153), (201, 232, 157), (199, 230, 159), (198, 229, 160), + (185, 216, 173), (181, 212, 177), (177, 208, 181), (173, 204, 184), + (170, 201, 188), (164, 195, 194), (153, 184, 205), (139, 170, 219), + (128, 159, 230), (109, 140, 249), (92, 123, 239), (76, 107, 229), + (71, 102, 224), (67, 98, 220), (64, 95, 217), (51, 82, 204), + (44, 75, 197), (56, 87, 209), (69, 100, 222), (79, 110, 232), + (89, 120, 242), (118, 149, 240), (140, 171, 218), (164, 195, 194), + (183, 214, 175), (205, 236, 153), (225, 235, 132), (246, 234, 112), + (166, 135, 13), (161, 130, 8), (151, 120, 1), (144, 113, 8), + (85, 54, 67), (60, 60, 128), (36, 67, 189), (41, 72, 194), + (46, 77, 199), (61, 92, 214), (65, 96, 218), (68, 99, 221), + (71, 102, 224), (75, 106, 228), (77, 108, 230), (79, 110, 232), + (80, 111, 233), (86, 117, 239), (87, 118, 240), (90, 121, 243), + (93, 124, 246), (88, 119, 241), (83, 114, 236), (81, 112, 234), + (80, 111, 233), (74, 105, 227), (69, 100, 222), (65, 96, 218), + (54, 85, 207), (51, 82, 204), (55, 86, 208), (60, 91, 213), + (67, 98, 220), (75, 106, 228), (83, 114, 236), (91, 122, 244), + (90, 121, 243), (87, 118, 240), (85, 116, 238), (81, 112, 234), + (80, 111, 233), (79, 110, 232), (80, 111, 233), (85, 116, 238), + (92, 123, 245), (106, 137, 252), (107, 138, 250), (109, 140, 249), + (111, 142, 247), (113, 144, 245), (114, 145, 244), (115, 146, 243), + (118, 149, 240), (119, 150, 239), (120, 151, 238), (125, 156, 233), + (124, 155, 234), (120, 151, 238), (118, 149, 240), (118, 149, 240), + (118, 149, 240), (118, 149, 240), (122, 153, 236), (126, 157, 232), + (128, 159, 230), (138, 169, 220), (151, 182, 207), (158, 189, 200), + (175, 206, 183), (177, 208, 180), (180, 211, 178), (184, 215, 174), + (186, 217, 172), (189, 220, 169), (191, 222, 167), (196, 227, 162), + (199, 230, 159), (205, 236, 153), (219, 250, 139), (231, 249, 127), + (242, 238, 116), (249, 231, 109), (255, 225, 103), (251, 220, 98), + (251, 220, 98), (250, 230, 108), (234, 246, 124), (233, 247, 125), + (230, 250, 128), (206, 237, 152), (194, 225, 164), (180, 211, 178), + (164, 195, 194), (146, 177, 212), (127, 158, 231), (118, 149, 240), + (111, 142, 247), (108, 139, 250), (103, 134, 255), (101, 132, 254), + (103, 134, 255), (105, 136, 253), (106, 137, 252), (107, 138, 251), + (105, 136, 253), (102, 133, 255), (102, 133, 255), (102, 133, 255), + (101, 132, 254), (101, 132, 254), (101, 132, 254), (104, 135, 254), + (107, 138, 251), (110, 141, 248), (114, 145, 244), (117, 148, 241), + (117, 148, 241), (118, 149, 240), (118, 149, 240), (118, 149, 240), + (118, 149, 240), (123, 154, 235), (126, 157, 232), (135, 166, 223), + (142, 173, 216), (145, 176, 213), (150, 181, 208), (143, 174, 215), + (135, 166, 223), (129, 160, 229), (127, 158, 231), (126, 157, 232), + (126, 157, 232), (126, 157, 232), (131, 162, 227), (145, 176, 213), + (160, 191, 198), (168, 199, 190), (208, 239, 150), (186, 217, 172) + ), + +// 173 Apophysis-040426-163GldBlue +((152, 121, 0), (160, 129, 7), (166, 135, 13), (172, 141, 19), + (182, 151, 29), (193, 162, 40), (201, 170, 48), (210, 179, 57), + (249, 231, 109), (235, 210, 88), (221, 190, 68), (205, 174, 52), + (190, 159, 37), (163, 132, 26), (137, 106, 15), (128, 97, 24), + (119, 88, 33), (94, 63, 58), (90, 59, 61), (87, 56, 65), + (80, 49, 71), (74, 43, 78), (69, 38, 82), (65, 34, 87), + (49, 18, 103), (27, 21, 125), (5, 25, 147), (6, 32, 154), + (8, 39, 161), (8, 39, 161), (9, 40, 162), (11, 42, 164), + (11, 42, 164), (40, 71, 193), (29, 60, 182), (19, 50, 172), + (16, 33, 155), (13, 17, 139), (18, 11, 133), (24, 6, 128), + (48, 17, 104), (40, 9, 112), (32, 1, 120), (33, 2, 118), + (35, 4, 117), (37, 6, 114), (40, 9, 112), (41, 10, 111), + (56, 25, 96), (67, 36, 85), (71, 40, 81), (75, 44, 77), + (84, 53, 67), (94, 63, 58), (102, 71, 49), (111, 80, 41), + (137, 106, 15), (142, 111, 9), (148, 117, 4), (152, 121, 4), + (157, 126, 4), (153, 122, 3), (150, 119, 2), (141, 110, 11), + (130, 99, 22), (105, 74, 47), (91, 60, 61), (77, 46, 75), + (70, 39, 81), (64, 33, 88), (62, 31, 90), (66, 35, 86), + (77, 46, 75), (87, 56, 64), (98, 67, 54), (102, 71, 49), + (107, 76, 45), (103, 72, 49), (99, 68, 53), (86, 55, 66), + (71, 40, 81), (57, 26, 95), (52, 21, 100), (47, 16, 105), + (50, 19, 101), (54, 23, 98), (56, 25, 96), (57, 26, 95), + (70, 39, 82), (74, 43, 78), (78, 47, 74), (81, 50, 70), + (85, 54, 67), (91, 60, 61), (102, 71, 50), (116, 85, 36), + (127, 96, 25), (146, 115, 6), (162, 131, 16), (179, 148, 26), + (183, 152, 30), (188, 157, 35), (191, 160, 38), (204, 173, 51), + (211, 180, 58), (198, 167, 45), (186, 155, 33), (176, 145, 23), + (166, 135, 13), (137, 106, 15), (115, 84, 37), (91, 60, 61), + (72, 41, 80), (50, 19, 102), (29, 20, 122), (9, 21, 143), + (89, 120, 242), (94, 125, 247), (104, 135, 254), (111, 142, 247), + (170, 201, 188), (194, 194, 127), (219, 188, 66), (214, 183, 61), + (209, 178, 56), (194, 163, 41), (190, 159, 37), (187, 156, 34), + (184, 153, 31), (180, 149, 27), (178, 147, 25), (176, 145, 23), + (175, 144, 22), (169, 138, 16), (168, 137, 15), (165, 134, 12), + (162, 131, 9), (167, 136, 14), (172, 141, 19), (173, 142, 20), + (175, 144, 22), (181, 150, 28), (186, 155, 33), (190, 159, 37), + (201, 170, 48), (204, 173, 51), (199, 168, 46), (195, 164, 42), + (188, 157, 35), (180, 149, 27), (172, 141, 19), (164, 133, 11), + (165, 134, 12), (167, 136, 14), (170, 139, 17), (174, 143, 21), + (175, 144, 22), (176, 145, 23), (175, 144, 22), (170, 139, 17), + (163, 132, 10), (149, 118, 3), (147, 116, 4), (146, 115, 6), + (144, 113, 8), (142, 111, 10), (141, 110, 11), (140, 109, 12), + (137, 106, 15), (136, 105, 16), (135, 104, 17), (130, 99, 22), + (131, 100, 21), (135, 104, 17), (137, 106, 15), (137, 106, 15), + (137, 106, 15), (137, 106, 15), (133, 102, 19), (129, 98, 23), + (127, 96, 25), (117, 86, 35), (104, 73, 48), (97, 66, 55), + (80, 49, 72), (77, 46, 74), (75, 44, 77), (71, 40, 81), + (69, 38, 83), (66, 35, 86), (64, 33, 88), (59, 28, 93), + (56, 25, 96), (50, 19, 102), (36, 5, 116), (24, 6, 128), + (13, 17, 139), (6, 24, 146), (0, 30, 152), (4, 35, 157), + (4, 35, 157), (5, 25, 147), (21, 9, 131), (22, 8, 130), + (25, 5, 127), (49, 18, 103), (61, 30, 91), (75, 44, 77), + (91, 60, 61), (109, 78, 43), (128, 97, 24), (137, 106, 15), + (144, 113, 8), (147, 116, 5), (152, 121, 0), (154, 123, 1), + (152, 121, 0), (150, 119, 2), (149, 118, 3), (148, 117, 4), + (150, 119, 2), (153, 122, 0), (153, 122, 0), (153, 122, 0), + (154, 123, 1), (154, 123, 1), (154, 123, 1), (151, 120, 1), + (148, 117, 4), (145, 114, 7), (141, 110, 11), (138, 107, 14), + (138, 107, 14), (137, 106, 15), (137, 106, 15), (137, 106, 15), + (137, 106, 15), (132, 101, 20), (129, 98, 23), (120, 89, 32), + (113, 82, 39), (110, 79, 42), (105, 74, 47), (112, 81, 40), + (120, 89, 32), (126, 95, 26), (128, 97, 24), (129, 98, 23), + (129, 98, 23), (129, 98, 23), (124, 93, 28), (110, 79, 42), + (95, 64, 57), (87, 56, 65), (47, 16, 105), (69, 38, 83) + ), + +// 174 Apophysis-040426-163WrldBndr +((232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (55, 12, 9), (54, 11, 9), (54, 11, 10), + (76, 33, 21), (98, 55, 33), (165, 122, 100), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (98, 55, 33), (98, 55, 33), (98, 55, 33), (165, 122, 100), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (98, 55, 33), + (98, 55, 33), (73, 73, 73), (48, 91, 113), (61, 104, 126), + (94, 137, 159), (183, 226, 248), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (98, 55, 33), + (98, 55, 33), (95, 52, 30), (89, 46, 24), (89, 46, 24), + (89, 46, 24), (92, 49, 27), (95, 52, 30), (98, 55, 33), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167), + (232, 189, 167), (232, 189, 167), (232, 189, 167), (232, 189, 167) + ), + +// 175 Apophysis-040426-163GrnPrpl +((85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (77, 19, 74), (69, 11, 66), (61, 3, 58), + (37, 20, 34), (5, 52, 2), (5, 52, 2), (5, 52, 2), + (29, 28, 26), (53, 4, 50), (57, 3, 54), (61, 3, 58), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (133, 75, 130), (133, 75, 130), (133, 75, 130), (109, 51, 106), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (42, 100, 45), + (26, 84, 29), (26, 84, 29), (26, 84, 29), (34, 92, 37), + (42, 100, 45), (42, 100, 45), (42, 100, 45), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (101, 43, 98), (121, 63, 118), (141, 83, 138), + (157, 99, 154), (173, 115, 170), (189, 131, 186), (221, 163, 218), + (146, 204, 149), (122, 180, 125), (98, 156, 101), (90, 148, 93), + (42, 100, 45), (26, 84, 29), (10, 68, 13), (5, 52, 2), + (21, 36, 18), (53, 4, 50), (61, 3, 58), (77, 19, 74), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (77, 19, 74), (61, 3, 58), + (29, 28, 26), (21, 36, 18), (21, 36, 18), (29, 28, 26), + (61, 3, 58), (69, 11, 66), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82), + (85, 27, 82), (85, 27, 82), (85, 27, 82), (85, 27, 82) + ), + +// 176 Apophysis-040426-163SphPart2 +((81, 83, 26), (72, 80, 20), (67, 78, 17), (63, 77, 14), + (61, 76, 13), (60, 76, 12), (60, 76, 12), (60, 76, 12), + (57, 75, 10), (57, 75, 10), (57, 75, 10), (57, 75, 10), + (57, 75, 10), (55, 74, 9), (54, 74, 8), (54, 74, 8), + (54, 74, 8), (54, 74, 8), (58, 75, 11), (63, 77, 14), + (69, 79, 18), (75, 81, 22), (76, 81, 23), (78, 82, 24), + (84, 84, 28), (85, 84, 29), (87, 85, 30), (87, 85, 30), + (87, 85, 30), (85, 84, 29), (84, 84, 28), (78, 82, 24), + (72, 80, 20), (75, 81, 22), (78, 82, 24), (81, 83, 26), + (82, 83, 27), (84, 84, 28), (84, 84, 28), (84, 84, 28), + (84, 84, 28), (81, 83, 26), (78, 82, 24), (75, 81, 22), + (72, 80, 20), (70, 79, 19), (69, 79, 18), (66, 78, 16), + (66, 78, 16), (72, 80, 20), (73, 80, 21), (75, 81, 22), + (76, 81, 23), (78, 82, 24), (78, 82, 24), (78, 82, 24), + (75, 81, 22), (73, 80, 21), (72, 80, 20), (72, 80, 20), + (72, 80, 20), (72, 80, 20), (72, 80, 20), (72, 80, 20), + (72, 80, 20), (72, 80, 20), (72, 80, 20), (72, 80, 20), + (72, 80, 20), (72, 80, 20), (72, 80, 20), (72, 80, 20), + (75, 81, 22), (78, 82, 24), (81, 83, 26), (78, 82, 24), + (75, 81, 22), (75, 81, 22), (75, 81, 22), (78, 82, 24), + (81, 83, 26), (81, 83, 26), (82, 83, 27), (84, 84, 28), + (84, 84, 28), (84, 84, 28), (84, 84, 28), (81, 83, 26), + (81, 83, 26), (82, 83, 27), (84, 84, 28), (87, 85, 30), + (90, 86, 32), (108, 92, 44), (144, 104, 68), (186, 118, 96), + (190, 163, 186), (73, 202, 247), (119, 186, 224), (166, 171, 202), + (175, 168, 196), (184, 165, 190), (208, 157, 174), (253, 142, 144), + (237, 135, 130), (181, 116, 93), (126, 98, 56), (114, 94, 48), + (102, 90, 40), (87, 85, 30), (81, 83, 26), (75, 81, 22), + (72, 80, 20), (72, 80, 20), (72, 80, 20), (72, 80, 20), + (72, 80, 20), (69, 79, 18), (66, 78, 16), (63, 77, 14), + (60, 76, 12), (63, 77, 14), (66, 78, 16), (67, 78, 17), + (69, 79, 18), (69, 79, 18), (69, 79, 18), (72, 80, 20), + (72, 80, 20), (72, 80, 20), (72, 80, 20), (72, 80, 20), + (72, 80, 20), (72, 80, 20), (72, 80, 20), (75, 81, 22), + (81, 83, 26), (87, 85, 30), (93, 87, 34), (106, 91, 43), + (120, 96, 52), (141, 103, 66), (186, 118, 96), (208, 157, 174), + (199, 160, 180), (250, 143, 146), (251, 142, 145), (253, 142, 144), + (241, 146, 152), (193, 162, 184), (172, 169, 198), (163, 172, 204), + (181, 166, 192), (190, 163, 186), (199, 160, 180), (225, 131, 122), + (159, 109, 78), (120, 96, 52), (96, 88, 36), (87, 85, 30), + (87, 85, 30), (99, 89, 38), (109, 92, 45), (120, 96, 52), + (37, 214, 223), (34, 215, 221), (31, 216, 219), (28, 217, 217), + (34, 215, 221), (43, 212, 227), (52, 209, 233), (147, 105, 70), + (129, 99, 58), (174, 114, 88), (219, 129, 118), (240, 136, 132), + (246, 138, 136), (199, 160, 180), (190, 163, 186), (187, 164, 188), + (193, 162, 184), (180, 116, 92), (132, 100, 60), (111, 93, 46), + (93, 87, 34), (100, 89, 39), (108, 92, 44), (135, 101, 62), + (180, 116, 92), (234, 134, 128), (234, 134, 128), (171, 113, 86), + (132, 100, 60), (108, 92, 44), (90, 86, 32), (81, 83, 26), + (72, 80, 20), (66, 78, 16), (60, 76, 12), (60, 76, 12), + (60, 76, 12), (60, 76, 12), (60, 76, 12), (63, 77, 14), + (63, 77, 14), (63, 77, 14), (63, 77, 14), (63, 77, 14), + (66, 78, 16), (69, 79, 18), (72, 80, 20), (72, 80, 20), + (69, 79, 18), (66, 78, 16), (63, 77, 14), (66, 78, 16), + (69, 79, 18), (69, 79, 18), (69, 79, 18), (72, 80, 20), + (72, 80, 20), (72, 80, 20), (72, 80, 20), (72, 80, 20), + (69, 79, 18), (66, 78, 16), (63, 77, 14), (63, 77, 14), + (63, 77, 14), (63, 77, 14), (63, 77, 14), (66, 78, 16), + (69, 79, 18), (69, 79, 18), (69, 79, 18), (69, 79, 18), + (72, 80, 20), (72, 80, 20), (75, 81, 22), (78, 82, 24), + (81, 83, 26), (84, 84, 28), (84, 84, 28), (84, 84, 28), + (81, 83, 26), (78, 82, 24), (75, 81, 22), (72, 80, 20), + (72, 80, 20), (75, 81, 22), (81, 83, 26), (87, 85, 30), + (105, 91, 42), (123, 97, 54), (216, 128, 116), (150, 106, 72) + ), + +// 177 Apophysis-040426-163StAmF +((0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (66, 36, 8), + (133, 72, 16), (115, 96, 84), (98, 121, 152), (100, 132, 158), + (103, 144, 165), (114, 178, 190), (118, 186, 199), (122, 194, 209), + (117, 189, 201), (113, 185, 194), (99, 171, 174), (86, 158, 155), + (121, 133, 30), (125, 125, 20), (130, 118, 10), (130, 108, 21), + (130, 99, 33), (132, 104, 32), (134, 110, 32), (140, 111, 37), + (146, 120, 151), (129, 168, 196), (138, 184, 209), (148, 201, 223), + (119, 170, 187), (90, 139, 151), (107, 127, 93), (124, 116, 36), + (141, 88, 34), (137, 94, 99), (134, 100, 164), (131, 108, 169), + (129, 116, 174), (131, 107, 168), (133, 99, 162), (123, 92, 152), + (138, 75, 36), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (141, 61, 31), (141, 72, 40), + (109, 113, 158), (105, 128, 161), (102, 144, 164), (94, 148, 159), + (87, 152, 154), (89, 157, 158), (91, 163, 163), (89, 166, 163), + (94, 170, 169), (106, 166, 177), (105, 160, 174), (105, 155, 171), + (108, 151, 172), (112, 147, 174), (108, 146, 170), (104, 145, 166), + (88, 140, 150), (48, 113, 75), (9, 87, 0), (4, 43, 0), + (0, 0, 0), (0, 0, 0), (140, 70, 28), (136, 85, 39), + (106, 108, 153), (96, 128, 153), (92, 127, 149), (89, 126, 146), + (130, 102, 39), (135, 81, 31), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (135, 61, 21), (169, 105, 142), (182, 114, 153), (195, 124, 164), + (150, 111, 180), (150, 119, 159), (156, 133, 157), (139, 147, 51), + (134, 78, 22), (67, 39, 11), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (119, 123, 34), (101, 130, 90), (84, 138, 146), + (91, 146, 155), (92, 146, 156), (97, 127, 154), (105, 111, 154), + (139, 66, 26), (69, 33, 13), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (144, 60, 35), (144, 61, 36), + (138, 79, 39), (117, 90, 148), (125, 108, 167), (149, 110, 179), + (166, 122, 196), (170, 121, 192), (184, 143, 190), (185, 158, 183), + (186, 196, 157), (181, 193, 152), (177, 191, 147), (115, 157, 181), + (113, 129, 168), (97, 105, 145), (55, 34, 38), (0, 0, 0), + (0, 0, 0), (85, 103, 20), (116, 115, 19), (127, 125, 30), + (172, 172, 156), (153, 163, 210), (169, 194, 254), (176, 224, 252), + (159, 195, 251), (165, 195, 254), (180, 179, 246), (205, 153, 213), + (187, 152, 196), (180, 156, 177), (181, 173, 169), (181, 183, 163), + (199, 185, 155), (203, 192, 153), (217, 179, 180), (216, 202, 182), + (215, 211, 183), (214, 225, 222), (225, 234, 237), (218, 206, 253), + (213, 203, 253), (216, 162, 222), (182, 138, 191), (140, 115, 180), + (130, 119, 176), (103, 129, 160), (125, 135, 179), (151, 157, 206), + (174, 184, 230), (188, 215, 246), (209, 229, 241), (238, 223, 225), + (241, 182, 244), (253, 177, 254), (228, 157, 243), (211, 150, 223), + (155, 162, 211), (119, 165, 187), (95, 156, 163), (87, 142, 150), + (115, 133, 36), (125, 113, 30), (125, 115, 39), (106, 114, 156), + (122, 103, 162), (122, 91, 151), (141, 69, 39), (144, 60, 35), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (67, 38, 38), (112, 90, 147), (138, 105, 153) + ), + +// 178 Apophysis-040426-163StCosOwl +((90, 143, 129), (43, 93, 69), (45, 69, 77), (48, 45, 86), + (53, 49, 107), (58, 53, 128), (51, 42, 151), (44, 32, 175), + (25, 20, 87), (23, 10, 57), (22, 0, 28), (14, 2, 19), + (6, 5, 11), (21, 12, 8), (37, 20, 5), (45, 19, 2), + (53, 19, 0), (75, 30, 8), (70, 49, 37), (65, 68, 66), + (73, 72, 105), (81, 76, 145), (94, 87, 181), (108, 98, 217), + (184, 172, 255), (214, 200, 255), (244, 228, 255), (241, 225, 255), + (238, 222, 255), (234, 218, 255), (231, 215, 255), (211, 196, 255), + (177, 165, 255), (105, 91, 255), (94, 84, 202), (84, 78, 150), + (98, 91, 175), (113, 105, 201), (130, 120, 223), (147, 135, 246), + (185, 172, 255), (209, 194, 255), (233, 217, 255), (243, 226, 255), + (253, 236, 255), (254, 238, 255), (255, 241, 255), (255, 249, 255), + (255, 254, 255), (255, 255, 255), (255, 253, 255), (255, 251, 255), + (255, 245, 255), (255, 240, 255), (251, 235, 255), (247, 230, 255), + (184, 171, 255), (141, 131, 214), (98, 91, 174), (132, 116, 155), + (167, 141, 137), (191, 158, 144), (215, 176, 152), (245, 196, 162), + (236, 234, 233), (201, 187, 255), (163, 152, 238), (125, 117, 222), + (98, 92, 175), (72, 67, 128), (40, 37, 79), (23, 26, 31), + (4, 4, 7), (24, 10, 7), (45, 17, 7), (76, 34, 12), + (107, 52, 18), (103, 59, 35), (100, 66, 53), (76, 67, 63), + (61, 74, 75), (68, 64, 122), (60, 56, 108), (53, 49, 94), + (44, 41, 78), (35, 33, 63), (25, 23, 45), (15, 14, 26), + (21, 6, 0), (33, 9, 4), (46, 13, 9), (30, 6, 21), + (15, 0, 33), (8, 3, 79), (3, 3, 80), (6, 0, 80), + (12, 6, 80), (37, 26, 28), (66, 31, 34), (95, 37, 41), + (100, 50, 51), (106, 64, 61), (92, 70, 67), (112, 95, 91), + (71, 67, 127), (73, 68, 130), (75, 70, 133), (79, 73, 140), + (83, 77, 147), (197, 24, 173), (208, 30, 187), (153, 138, 255), + (173, 161, 255), (182, 169, 255), (183, 170, 255), (184, 172, 255), + (185, 172, 255), (189, 176, 255), (211, 197, 255), (229, 213, 255), + (225, 215, 255), (194, 185, 252), (164, 156, 250), (129, 122, 209), + (95, 88, 168), (71, 67, 127), (42, 38, 90), (26, 25, 47), + (3, 1, 21), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 1), (4, 0, 19), (9, 0, 38), (19, 0, 57), + (29, 0, 76), (41, 0, 72), (37, 0, 93), (42, 0, 91), + (72, 0, 135), (130, 121, 231), (156, 145, 243), (182, 170, 255), + (220, 205, 255), (236, 219, 255), (237, 221, 255), (223, 220, 231), + (132, 129, 161), (101, 98, 142), (71, 67, 124), (34, 31, 60), + (16, 15, 29), (0, 0, 1), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (3, 2, 1), (29, 21, 17), (54, 39, 32), (59, 49, 48), + (33, 31, 59), (32, 30, 57), (31, 29, 55), (20, 19, 36), + (5, 5, 10), (0, 0, 0), (0, 0, 0), (2, 2, 2), + (3, 11, 8), (7, 23, 27), (25, 71, 51), (47, 98, 19), + (75, 112, 17), (107, 121, 15), (136, 86, 63), (152, 111, 90), + (115, 80, 54), (104, 78, 62), (94, 77, 70), (59, 54, 52), + (27, 27, 27), (1, 9, 3), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (1, 1, 7), (19, 18, 34), (48, 45, 86), + (80, 75, 143), (130, 121, 231), (169, 160, 255), (206, 192, 255), + (236, 220, 255), (255, 238, 255), (255, 247, 255), (255, 254, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 250, 248), (255, 255, 219), + (255, 237, 138), (218, 158, 119), (210, 164, 97), (138, 126, 84), + (118, 106, 65), (126, 98, 39), (76, 77, 31), (74, 54, 47), + (44, 41, 67), (29, 27, 52), (41, 38, 73), (69, 64, 78), + (130, 106, 83), (170, 141, 122), (219, 161, 134), (233, 186, 151), + (255, 253, 214), (220, 255, 255), (237, 234, 255), (222, 222, 231), + (140, 245, 157), (108, 172, 113), (127, 127, 79), (139, 117, 113), + (103, 102, 113), (84, 84, 129), (89, 83, 159), (130, 121, 231), + (161, 150, 255), (189, 176, 255), (208, 194, 255), (242, 226, 255), + (251, 234, 255), (255, 239, 255), (255, 240, 255), (255, 241, 255), + (255, 246, 255), (255, 250, 255), (255, 251, 255), (255, 251, 255), + (255, 243, 255), (245, 228, 255), (222, 207, 255), (183, 171, 255) + ), + +// 179 Apophysis-040426-163StGenie +((64, 50, 36), (23, 82, 142), (13, 68, 124), (3, 55, 107), + (32, 45, 59), (61, 36, 12), (71, 39, 7), (81, 42, 3), + (89, 44, 0), (105, 52, 0), (121, 60, 0), (150, 75, 0), + (179, 90, 0), (201, 101, 1), (224, 113, 2), (230, 116, 3), + (236, 120, 4), (254, 139, 25), (254, 143, 32), (254, 147, 39), + (254, 141, 28), (254, 135, 17), (253, 134, 16), (253, 134, 15), + (245, 136, 28), (233, 142, 52), (221, 149, 77), (228, 161, 95), + (235, 174, 114), (243, 175, 108), (251, 176, 102), (249, 165, 81), + (242, 149, 56), (252, 138, 23), (251, 135, 18), (250, 132, 14), + (252, 129, 7), (254, 127, 0), (252, 126, 0), (251, 125, 0), + (226, 115, 3), (221, 112, 2), (217, 110, 2), (195, 99, 3), + (173, 89, 4), (161, 83, 5), (150, 78, 7), (136, 69, 3), + (135, 68, 0), (149, 77, 5), (173, 88, 2), (198, 99, 0), + (208, 104, 0), (219, 110, 0), (223, 112, 0), (228, 115, 1), + (250, 126, 1), (251, 127, 1), (253, 128, 2), (245, 126, 6), + (237, 124, 10), (231, 120, 8), (225, 116, 7), (204, 107, 10), + (169, 85, 1), (119, 60, 0), (100, 51, 0), (82, 42, 1), + (78, 45, 12), (75, 49, 23), (30, 40, 50), (19, 52, 84), + (49, 111, 173), (63, 89, 115), (78, 68, 58), (133, 82, 32), + (189, 97, 6), (200, 102, 5), (211, 107, 4), (217, 111, 5), + (210, 106, 2), (145, 75, 4), (114, 58, 2), (83, 42, 0), + (75, 43, 10), (68, 45, 21), (19, 39, 59), (5, 48, 92), + (3, 68, 133), (10, 53, 95), (17, 38, 58), (30, 38, 46), + (43, 39, 35), (82, 42, 2), (103, 52, 0), (128, 68, 8), + (146, 85, 24), (211, 173, 135), (206, 169, 132), (201, 166, 130), + (167, 149, 130), (134, 132, 131), (144, 90, 35), (133, 72, 12), + (137, 70, 4), (136, 69, 3), (135, 69, 3), (133, 68, 3), + (132, 67, 3), (128, 66, 3), (121, 61, 2), (118, 59, 0), + (124, 63, 2), (141, 72, 4), (147, 76, 5), (153, 80, 7), + (187, 110, 34), (203, 158, 114), (204, 171, 138), (222, 188, 155), + (251, 202, 153), (249, 188, 127), (247, 175, 102), (231, 155, 79), + (216, 136, 56), (214, 113, 12), (196, 100, 3), (156, 78, 0), + (129, 66, 2), (99, 51, 2), (104, 53, 2), (110, 56, 3), + (127, 65, 3), (149, 75, 1), (187, 94, 0), (202, 101, 0), + (193, 97, 1), (169, 86, 3), (146, 75, 5), (137, 70, 3), + (128, 65, 2), (116, 58, 1), (98, 50, 1), (80, 49, 17), + (73, 71, 69), (90, 152, 213), (78, 155, 231), (67, 158, 249), + (94, 170, 245), (152, 199, 246), (200, 218, 237), (232, 234, 236), + (121, 148, 176), (86, 127, 168), (52, 106, 160), (22, 44, 66), + (90, 70, 49), (98, 58, 17), (118, 60, 1), (152, 76, 0), + (200, 101, 1), (229, 149, 68), (234, 157, 80), (240, 166, 92), + (252, 175, 97), (254, 153, 52), (253, 140, 27), (252, 133, 14), + (236, 119, 2), (228, 115, 1), (221, 111, 0), (207, 103, 0), + (185, 92, 0), (152, 80, 7), (138, 72, 5), (124, 71, 18), + (130, 87, 44), (82, 122, 162), (47, 141, 235), (21, 124, 226), + (8, 110, 213), (1, 122, 244), (1, 127, 253), (55, 147, 239), + (187, 216, 246), (188, 216, 244), (190, 216, 243), (130, 188, 246), + (55, 155, 254), (4, 129, 254), (2, 118, 234), (4, 107, 210), + (5, 105, 205), (6, 105, 204), (0, 89, 177), (0, 87, 173), + (8, 101, 195), (79, 141, 203), (130, 157, 185), (141, 151, 160), + (208, 172, 137), (217, 175, 132), (219, 165, 111), (229, 147, 65), + (229, 127, 25), (229, 118, 7), (225, 113, 1), (231, 117, 4), + (236, 121, 5), (238, 121, 4), (239, 123, 7), (248, 130, 12), + (252, 132, 11), (251, 130, 9), (241, 124, 7), (236, 122, 8), + (223, 114, 4), (222, 111, 1), (198, 100, 2), (161, 82, 4), + (149, 76, 4), (144, 74, 4), (142, 73, 5), (147, 75, 2), + (160, 81, 2), (190, 95, 1), (211, 106, 1), (217, 111, 5), + (215, 109, 3), (198, 99, 0), (160, 81, 2), (150, 77, 3), + (147, 76, 5), (142, 74, 6), (146, 78, 10), (149, 86, 24), + (194, 120, 45), (209, 160, 110), (219, 183, 147), (234, 193, 153), + (254, 217, 181), (225, 211, 197), (227, 225, 222), (252, 222, 192), + (239, 208, 178), (216, 179, 142), (234, 178, 123), (250, 170, 89), + (252, 152, 52), (253, 143, 32), (243, 132, 20), (235, 121, 7), + (229, 119, 8), (215, 132, 50), (196, 148, 101), (174, 138, 102) + ), + +// 180 Apophysis-040426-163St +((79, 122, 116), (102, 152, 145), (90, 137, 130), (78, 122, 116), + (89, 108, 95), (101, 95, 74), (104, 98, 76), (108, 102, 79), + (158, 151, 120), (183, 175, 142), (208, 200, 165), (208, 200, 165), + (209, 201, 166), (195, 188, 153), (182, 175, 140), (166, 159, 127), + (151, 144, 114), (83, 128, 121), (77, 121, 114), (72, 114, 108), + (47, 76, 73), (22, 39, 39), (13, 23, 23), (4, 8, 8), + (5, 10, 5), (5, 10, 5), (5, 10, 5), (5, 10, 5), + (5, 10, 5), (5, 10, 5), (5, 10, 5), (5, 10, 5), + (5, 10, 5), (5, 10, 5), (5, 10, 5), (5, 10, 5), + (5, 10, 5), (5, 10, 5), (5, 10, 5), (5, 10, 5), + (5, 10, 5), (5, 10, 5), (5, 10, 5), (5, 10, 5), + (5, 10, 5), (5, 10, 5), (5, 10, 5), (5, 10, 5), + (5, 10, 5), (5, 10, 5), (5, 10, 5), (5, 10, 5), + (5, 10, 5), (5, 10, 5), (5, 10, 5), (5, 10, 5), + (5, 10, 5), (5, 10, 5), (5, 10, 5), (16, 17, 12), + (28, 24, 19), (50, 45, 35), (73, 67, 52), (128, 122, 96), + (171, 165, 131), (227, 172, 227), (237, 197, 238), (248, 223, 249), + (245, 231, 245), (242, 239, 241), (236, 238, 238), (254, 240, 223), + (230, 220, 187), (166, 186, 166), (103, 152, 145), (75, 115, 110), + (48, 78, 75), (31, 51, 50), (14, 25, 25), (5, 10, 5), + (5, 10, 5), (5, 10, 5), (5, 10, 5), (5, 10, 5), + (5, 10, 5), (5, 10, 5), (5, 10, 5), (5, 10, 5), + (5, 10, 5), (5, 10, 5), (5, 10, 5), (5, 10, 5), + (5, 10, 5), (5, 10, 5), (5, 10, 5), (5, 10, 5), + (5, 10, 5), (2, 4, 5), (2, 5, 3), (2, 6, 2), + (2, 7, 3), (3, 9, 4), (4, 10, 4), (5, 10, 5), + (5, 10, 5), (5, 10, 5), (5, 10, 5), (5, 10, 5), + (5, 10, 5), (5, 10, 5), (5, 10, 5), (5, 10, 5), + (5, 10, 5), (5, 10, 5), (5, 10, 5), (5, 10, 5), + (5, 10, 5), (5, 10, 5), (32, 28, 22), (67, 61, 48), + (156, 149, 118), (184, 176, 143), (212, 204, 169), (212, 204, 169), + (213, 205, 169), (211, 203, 167), (161, 155, 123), (123, 117, 91), + (92, 86, 67), (10, 18, 19), (7, 14, 12), (5, 10, 5), + (11, 20, 21), (40, 36, 28), (47, 78, 74), (66, 99, 93), + (100, 149, 142), (107, 156, 149), (114, 164, 157), (120, 170, 163), + (126, 177, 170), (143, 183, 172), (124, 175, 168), (103, 152, 145), + (127, 121, 94), (46, 41, 32), (31, 27, 21), (17, 14, 11), + (5, 10, 5), (2, 7, 2), (1, 2, 1), (0, 2, 0), + (0, 2, 0), (0, 2, 0), (0, 2, 1), (0, 2, 2), + (2, 4, 4), (3, 6, 7), (5, 10, 5), (4, 8, 9), + (21, 37, 37), (55, 90, 85), (79, 94, 80), (104, 98, 76), + (120, 114, 89), (139, 133, 104), (141, 135, 106), (123, 117, 91), + (97, 91, 71), (96, 90, 70), (96, 90, 70), (72, 83, 70), + (48, 43, 33), (21, 18, 14), (5, 10, 5), (5, 10, 5), + (5, 10, 5), (5, 10, 5), (5, 10, 5), (5, 10, 5), + (5, 10, 5), (5, 10, 5), (5, 10, 5), (4, 10, 4), + (5, 10, 5), (5, 10, 5), (5, 10, 5), (5, 10, 5), + (5, 10, 5), (11, 9, 7), (46, 41, 32), (85, 79, 61), + (112, 106, 83), (147, 140, 110), (157, 150, 119), (148, 141, 111), + (128, 121, 95), (112, 106, 82), (95, 89, 69), (52, 47, 36), + (23, 19, 15), (5, 10, 5), (5, 10, 5), (5, 10, 5), + (5, 10, 5), (5, 10, 5), (5, 10, 5), (5, 10, 5), + (5, 10, 5), (5, 10, 5), (5, 10, 5), (5, 10, 5), + (18, 32, 32), (46, 77, 74), (66, 105, 100), (70, 110, 105), + (54, 88, 84), (49, 44, 34), (19, 16, 13), (5, 10, 5), + (5, 10, 5), (5, 10, 5), (5, 10, 5), (5, 10, 5), + (5, 10, 5), (5, 10, 5), (5, 10, 5), (5, 10, 5), + (5, 10, 5), (5, 10, 5), (5, 10, 5), (5, 10, 5), + (5, 10, 5), (5, 10, 5), (5, 10, 5), (12, 10, 8), + (15, 27, 27), (35, 60, 58), (43, 72, 69), (40, 68, 65), + (27, 46, 45), (15, 26, 27), (5, 10, 5), (5, 10, 5), + (4, 9, 4), (6, 5, 4), (4, 4, 3), (1, 2, 1), + (1, 4, 1), (3, 7, 2), (5, 10, 5), (18, 32, 32), + (16, 48, 112), (61, 99, 94), (82, 126, 120), (95, 89, 69) + ), + +// 181 Apophysis-040426-163StSatAngel +((169, 159, 187), (200, 153, 237), (210, 169, 240), (220, 186, 244), + (228, 185, 237), (237, 184, 231), (244, 184, 216), (252, 184, 201), + (238, 136, 182), (231, 130, 188), (225, 124, 195), (223, 124, 198), + (222, 125, 201), (221, 122, 200), (220, 119, 199), (221, 118, 196), + (223, 118, 194), (241, 126, 165), (242, 128, 140), (243, 131, 116), + (239, 138, 115), (236, 145, 115), (233, 144, 110), (231, 144, 105), + (204, 182, 87), (202, 205, 106), (200, 228, 125), (200, 241, 139), + (200, 255, 153), (200, 252, 157), (201, 249, 161), (207, 241, 152), + (179, 233, 132), (155, 197, 121), (162, 186, 146), (169, 176, 171), + (182, 168, 196), (196, 161, 221), (199, 163, 224), (202, 165, 228), + (219, 170, 253), (230, 183, 245), (241, 197, 237), (242, 192, 229), + (244, 188, 221), (245, 190, 220), (247, 192, 219), (251, 207, 225), + (254, 215, 221), (254, 211, 224), (253, 205, 213), (253, 199, 203), + (253, 182, 192), (253, 166, 181), (253, 161, 175), (254, 157, 170), + (218, 188, 121), (181, 186, 116), (144, 185, 111), (137, 184, 98), + (131, 184, 85), (135, 191, 86), (139, 198, 88), (156, 242, 78), + (160, 254, 74), (167, 225, 56), (171, 218, 57), (175, 211, 59), + (176, 210, 59), (177, 209, 60), (182, 196, 56), (184, 202, 68), + (230, 147, 104), (234, 137, 104), (239, 128, 105), (245, 136, 125), + (251, 145, 145), (250, 157, 157), (250, 170, 169), (255, 190, 198), + (246, 188, 216), (229, 198, 250), (237, 209, 250), (246, 220, 250), + (244, 227, 250), (243, 235, 251), (250, 245, 247), (255, 254, 243), + (224, 217, 239), (221, 208, 233), (218, 199, 227), (223, 209, 228), + (229, 219, 229), (205, 212, 207), (209, 231, 195), (211, 242, 188), + (194, 254, 142), (145, 194, 103), (172, 214, 117), (200, 235, 132), + (206, 234, 143), (212, 233, 155), (212, 255, 176), (230, 246, 222), + (245, 245, 233), (236, 233, 237), (227, 221, 242), (236, 227, 233), + (246, 234, 224), (246, 217, 208), (234, 201, 167), (219, 203, 138), + (214, 205, 130), (202, 238, 140), (194, 229, 150), (187, 220, 161), + (194, 209, 187), (186, 170, 211), (199, 159, 229), (203, 156, 240), + (203, 151, 244), (198, 134, 248), (194, 118, 252), (199, 119, 243), + (204, 121, 234), (210, 119, 221), (222, 121, 198), (246, 134, 164), + (244, 149, 136), (211, 187, 107), (200, 193, 91), (190, 200, 76), + (186, 200, 69), (190, 191, 68), (206, 158, 67), (217, 140, 72), + (231, 137, 97), (231, 145, 106), (232, 153, 115), (231, 155, 116), + (231, 158, 117), (230, 161, 118), (230, 164, 121), (222, 180, 122), + (218, 193, 126), (218, 202, 136), (202, 205, 155), (187, 208, 174), + (206, 205, 215), (210, 182, 227), (210, 170, 239), (203, 154, 241), + (165, 156, 182), (157, 155, 167), (150, 155, 153), (147, 172, 130), + (126, 159, 100), (120, 170, 77), (121, 175, 74), (128, 169, 93), + (121, 168, 80), (120, 201, 45), (138, 219, 46), (156, 238, 47), + (155, 243, 50), (159, 232, 46), (168, 219, 51), (177, 214, 65), + (201, 203, 103), (198, 212, 107), (196, 221, 111), (201, 215, 115), + (207, 210, 121), (214, 198, 123), (215, 194, 121), (223, 184, 128), + (239, 164, 141), (233, 136, 190), (223, 147, 221), (199, 150, 237), + (191, 147, 225), (189, 145, 223), (205, 120, 231), (211, 118, 217), + (237, 128, 175), (236, 128, 178), (235, 129, 181), (157, 157, 165), + (163, 155, 179), (227, 120, 186), (240, 123, 163), (253, 131, 146), + (253, 138, 143), (252, 144, 146), (245, 126, 158), (235, 123, 175), + (230, 120, 181), (218, 119, 203), (208, 119, 225), (204, 121, 235), + (204, 121, 234), (208, 118, 223), (215, 118, 209), (225, 119, 190), + (242, 125, 162), (248, 133, 128), (236, 145, 116), (230, 153, 111), + (228, 161, 115), (227, 173, 124), (235, 181, 149), (245, 164, 195), + (219, 139, 223), (215, 146, 237), (215, 141, 231), (214, 125, 219), + (212, 119, 217), (215, 118, 210), (221, 118, 196), (225, 119, 191), + (231, 120, 179), (255, 151, 159), (251, 155, 174), (249, 182, 178), + (237, 200, 173), (233, 226, 190), (227, 230, 181), (219, 254, 193), + (233, 235, 200), (237, 236, 227), (211, 230, 201), (201, 204, 206), + (168, 189, 155), (146, 184, 115), (136, 196, 84), (131, 220, 49), + (151, 241, 68), (156, 243, 76), (160, 230, 97), (178, 251, 105), + (188, 245, 117), (191, 235, 114), (178, 245, 119), (183, 245, 128), + (169, 205, 141), (171, 184, 166), (242, 142, 179), (248, 135, 160), + (253, 137, 152), (255, 135, 145), (255, 133, 144), (254, 135, 142), + (250, 135, 134), (247, 143, 135), (243, 147, 131), (240, 158, 136) + ), + +// 182 Apophysis-040427-1knotted +((146, 120, 27), (146, 97, 30), (147, 80, 45), (148, 63, 60), + (139, 56, 56), (130, 50, 53), (119, 46, 39), (109, 42, 25), + (95, 56, 17), (80, 53, 28), (65, 51, 40), (91, 74, 47), + (117, 98, 55), (136, 113, 41), (156, 128, 28), (152, 139, 26), + (149, 151, 24), (146, 120, 27), (162, 98, 50), (178, 76, 74), + (190, 45, 111), (202, 15, 148), (219, 12, 179), (237, 9, 210), + (255, 0, 221), (255, 0, 224), (255, 0, 228), (255, 0, 231), + (255, 0, 234), (247, 0, 244), (239, 0, 254), (251, 12, 227), + (246, 3, 219), (219, 15, 172), (187, 19, 154), (156, 24, 136), + (160, 24, 133), (164, 24, 131), (164, 24, 131), (164, 24, 131), + (163, 25, 111), (149, 27, 80), (135, 29, 49), (137, 31, 47), + (139, 33, 45), (134, 33, 42), (129, 34, 40), (127, 37, 37), + (111, 46, 40), (71, 60, 77), (48, 76, 115), (25, 93, 154), + (25, 93, 154), (25, 93, 154), (27, 119, 125), (29, 145, 96), + (44, 125, 84), (65, 85, 76), (87, 45, 69), (107, 37, 59), + (127, 30, 50), (131, 29, 48), (136, 29, 47), (138, 30, 46), + (150, 40, 69), (155, 24, 138), (149, 24, 150), (143, 25, 163), + (145, 26, 159), (148, 27, 156), (148, 28, 136), (163, 26, 132), + (162, 25, 129), (154, 43, 95), (147, 61, 62), (149, 56, 61), + (151, 51, 61), (137, 50, 65), (124, 49, 70), (109, 54, 83), + (106, 55, 74), (64, 154, 102), (92, 157, 65), (121, 161, 28), + (127, 158, 27), (134, 155, 26), (134, 155, 26), (129, 149, 78), + (124, 114, 63), (107, 130, 45), (91, 146, 27), (91, 146, 27), + (91, 146, 27), (96, 111, 42), (75, 88, 60), (78, 46, 85), + (83, 28, 112), (109, 24, 143), (114, 31, 133), (119, 39, 124), + (121, 41, 93), (123, 44, 63), (115, 18, 29), (78, 9, 37), + (59, 9, 12), (42, 48, 31), (26, 88, 51), (28, 115, 64), + (30, 143, 77), (28, 155, 78), (28, 156, 81), (28, 156, 81), + (58, 114, 89), (164, 24, 131), (186, 18, 144), (208, 12, 158), + (223, 16, 192), (238, 8, 202), (214, 9, 176), (175, 20, 148), + (150, 26, 156), (87, 59, 155), (25, 93, 154), (25, 93, 154), + (25, 93, 154), (28, 94, 155), (102, 100, 139), (144, 87, 128), + (152, 53, 120), (185, 22, 69), (169, 43, 61), (154, 64, 53), + (146, 97, 30), (91, 146, 27), (27, 156, 76), (29, 158, 75), + (140, 96, 21), (101, 69, 32), (62, 42, 44), (59, 33, 40), + (57, 25, 36), (59, 63, 74), (66, 73, 79), (74, 87, 96), + (120, 53, 124), (118, 25, 155), (131, 26, 157), (145, 28, 160), + (144, 58, 131), (141, 71, 69), (159, 74, 33), (255, 60, 51), + (190, 24, 74), (183, 19, 84), (176, 15, 95), (147, 56, 63), + (137, 61, 61), (134, 93, 61), (125, 103, 56), (133, 117, 65), + (144, 102, 62), (182, 24, 57), (192, 25, 76), (203, 26, 96), + (216, 68, 152), (249, 199, 211), (202, 147, 168), (128, 126, 137), + (28, 156, 81), (28, 155, 79), (28, 155, 78), (43, 91, 77), + (78, 73, 54), (92, 52, 40), (113, 42, 38), (140, 42, 31), + (155, 53, 30), (155, 73, 33), (159, 88, 46), (160, 86, 49), + (154, 65, 51), (149, 47, 61), (168, 18, 108), (161, 20, 114), + (126, 30, 57), (105, 25, 52), (85, 21, 47), (72, 10, 47), + (38, 21, 27), (31, 15, 0), (1, 10, 27), (39, 26, 35), + (74, 27, 61), (104, 7, 110), (124, 8, 105), (184, 20, 71), + (188, 17, 59), (175, 18, 47), (157, 35, 34), (138, 33, 27), + (130, 11, 5), (117, 1, 22), (119, 10, 3), (109, 41, 4), + (125, 36, 20), (129, 35, 35), (128, 36, 37), (127, 35, 38), + (129, 34, 38), (138, 31, 39), (139, 35, 34), (139, 43, 31), + (159, 54, 22), (156, 71, 30), (157, 100, 31), (188, 117, 29), + (156, 116, 64), (157, 104, 86), (161, 76, 107), (222, 39, 157), + (255, 4, 193), (244, 8, 215), (236, 6, 219), (202, 16, 201), + (150, 31, 159), (153, 29, 141), (150, 46, 123), (131, 53, 75), + (124, 51, 70), (130, 59, 41), (146, 62, 28), (140, 60, 23), + (139, 43, 31), (143, 39, 30), (151, 31, 32), (138, 31, 41), + (140, 32, 45), (138, 31, 41), (138, 31, 41), (138, 31, 41), + (132, 36, 37), (128, 38, 38), (128, 40, 38), (139, 50, 32), + (146, 62, 28), (146, 89, 20), (146, 97, 30), (146, 97, 30), + (157, 100, 31), (146, 120, 27), (146, 120, 27), (146, 120, 27), + (146, 120, 27), (146, 120, 27), (146, 97, 30), (146, 97, 30) + ), + +// 183 Apophysis-040427-4AlngSpder +((88, 35, 3), (69, 26, 7), (67, 25, 6), (65, 24, 6), + (71, 27, 6), (77, 31, 7), (79, 31, 5), (81, 31, 4), + (82, 33, 3), (77, 30, 3), (72, 27, 4), (67, 24, 4), + (63, 22, 4), (62, 22, 6), (62, 23, 8), (67, 24, 6), + (72, 25, 5), (100, 33, 4), (107, 39, 4), (115, 46, 5), + (120, 47, 8), (126, 48, 12), (122, 45, 12), (118, 43, 12), + (100, 40, 16), (92, 38, 11), (85, 36, 6), (86, 35, 3), + (88, 34, 0), (87, 32, 0), (87, 31, 0), (83, 32, 1), + (83, 34, 4), (77, 33, 8), (77, 30, 7), (78, 27, 6), + (80, 28, 7), (82, 30, 8), (82, 31, 8), (83, 33, 8), + (102, 48, 10), (115, 54, 18), (129, 60, 27), (131, 62, 22), + (133, 65, 18), (134, 63, 17), (136, 62, 17), (131, 61, 12), + (121, 57, 11), (113, 46, 0), (116, 44, 0), (119, 43, 0), + (123, 47, 0), (127, 52, 0), (133, 55, 0), (140, 58, 0), + (127, 49, 13), (116, 47, 12), (105, 45, 11), (101, 45, 11), + (98, 45, 11), (96, 41, 7), (94, 38, 3), (102, 36, 0), + (109, 36, 0), (109, 41, 6), (102, 41, 8), (95, 42, 10), + (91, 41, 8), (87, 41, 7), (81, 36, 3), (73, 29, 2), + (60, 23, 5), (59, 21, 3), (58, 19, 2), (61, 20, 3), + (64, 21, 4), (64, 21, 4), (64, 21, 5), (58, 20, 7), + (57, 21, 5), (40, 27, 0), (42, 21, 2), (45, 15, 5), + (47, 14, 2), (49, 13, 0), (56, 17, 2), (61, 21, 11), + (82, 34, 11), (99, 47, 19), (117, 61, 28), (127, 65, 27), + (137, 70, 27), (129, 88, 32), (133, 74, 16), (132, 70, 13), + (133, 60, 7), (124, 57, 4), (124, 57, 7), (125, 57, 10), + (131, 59, 10), (138, 62, 10), (146, 75, 13), (161, 89, 17), + (251, 49, 39), (215, 90, 51), (179, 132, 64), (174, 112, 41), + (170, 92, 18), (145, 91, 17), (147, 76, 14), (154, 68, 7), + (155, 59, 19), (128, 60, 13), (125, 58, 13), (123, 56, 14), + (116, 52, 8), (105, 45, 8), (102, 39, 6), (100, 36, 0), + (87, 27, 0), (79, 27, 3), (72, 27, 6), (71, 27, 6), + (70, 28, 6), (73, 31, 9), (78, 37, 5), (82, 44, 8), + (97, 43, 15), (110, 50, 16), (112, 51, 12), (115, 52, 9), + (115, 47, 10), (107, 48, 8), (99, 46, 2), (86, 40, 0), + (69, 28, 0), (66, 25, 2), (64, 23, 5), (63, 23, 5), + (62, 24, 5), (59, 24, 5), (61, 24, 5), (64, 23, 5), + (70, 21, 4), (72, 15, 4), (71, 19, 6), (71, 23, 9), + (75, 28, 10), (72, 34, 11), (74, 39, 7), (86, 41, 12), + (105, 53, 16), (111, 57, 10), (117, 62, 5), (117, 58, 2), + (122, 53, 11), (124, 50, 11), (116, 46, 10), (103, 44, 10), + (86, 37, 7), (74, 32, 7), (74, 31, 7), (75, 30, 7), + (77, 31, 5), (82, 37, 6), (86, 40, 4), (93, 41, 4), + (97, 35, 0), (93, 34, 0), (89, 33, 0), (74, 28, 5), + (68, 27, 5), (61, 26, 6), (56, 24, 1), (50, 18, 5), + (45, 18, 23), (44, 16, 15), (54, 11, 0), (66, 17, 0), + (75, 29, 3), (93, 41, 4), (110, 51, 9), (126, 50, 14), + (135, 72, 19), (147, 73, 15), (159, 75, 11), (163, 83, 0), + (180, 75, 10), (157, 46, 0), (137, 42, 10), (131, 40, 9), + (124, 50, 11), (120, 54, 2), (117, 54, 0), (117, 50, 7), + (112, 48, 10), (106, 47, 17), (103, 44, 12), (98, 38, 10), + (94, 37, 7), (90, 38, 1), (92, 36, 0), (89, 35, 0), + (82, 36, 0), (76, 32, 3), (72, 25, 0), (71, 25, 2), + (72, 28, 3), (80, 29, 2), (91, 31, 3), (96, 36, 2), + (100, 40, 3), (104, 39, 0), (105, 42, 1), (118, 47, 0), + (111, 46, 4), (104, 45, 5), (96, 35, 7), (89, 33, 6), + (82, 28, 4), (77, 23, 0), (81, 23, 0), (86, 12, 1), + (106, 29, 0), (108, 35, 2), (112, 43, 10), (119, 49, 15), + (115, 47, 28), (118, 54, 16), (126, 58, 21), (121, 53, 16), + (110, 44, 12), (106, 37, 6), (101, 33, 0), (102, 29, 10), + (96, 29, 20), (111, 36, 13), (129, 49, 16), (142, 63, 20), + (150, 65, 26), (159, 82, 36), (158, 79, 20), (158, 85, 16), + (158, 78, 15), (153, 72, 19), (148, 71, 15), (145, 68, 14), + (137, 62, 4), (128, 67, 0), (134, 60, 0), (133, 55, 6), + (127, 52, 12), (131, 47, 13), (165, 48, 30), (172, 68, 13) + ), + +// 184 Apophysis-040427-4AlienFlwerBwl +((155, 136, 68), (138, 97, 53), (135, 105, 52), (133, 113, 52), + (130, 103, 51), (127, 94, 51), (120, 79, 51), (113, 65, 51), + (0, 0, 0), (24, 19, 18), (49, 38, 36), (83, 72, 57), + (118, 107, 79), (120, 103, 75), (123, 99, 71), (127, 95, 77), + (131, 91, 83), (151, 102, 61), (144, 107, 58), (138, 113, 56), + (148, 119, 60), (158, 126, 65), (156, 131, 66), (155, 136, 68), + (144, 137, 85), (150, 134, 91), (157, 131, 98), (163, 129, 95), + (170, 127, 92), (167, 130, 92), (165, 133, 92), (168, 135, 84), + (171, 133, 86), (166, 142, 94), (155, 140, 80), (145, 138, 66), + (137, 125, 72), (129, 113, 79), (135, 111, 75), (141, 109, 71), + (160, 130, 80), (167, 141, 89), (174, 153, 98), (179, 145, 98), + (185, 137, 99), (182, 133, 104), (180, 129, 110), (186, 136, 113), + (175, 144, 113), (173, 147, 112), (172, 139, 106), (172, 131, 101), + (161, 129, 107), (150, 128, 114), (147, 129, 111), (145, 130, 109), + (125, 132, 90), (119, 122, 86), (114, 113, 83), (118, 117, 88), + (123, 122, 94), (129, 123, 103), (136, 124, 112), (156, 139, 113), + (182, 163, 131), (212, 197, 158), (219, 207, 176), (226, 218, 195), + (226, 216, 197), (226, 214, 200), (228, 216, 200), (230, 219, 197), + (227, 219, 196), (226, 217, 191), (226, 215, 187), (221, 205, 176), + (217, 196, 165), (212, 197, 161), (208, 199, 158), (214, 201, 159), + (217, 206, 174), (224, 213, 185), (215, 203, 172), (207, 194, 160), + (207, 191, 153), (208, 189, 147), (193, 179, 134), (191, 162, 118), + (185, 161, 113), (182, 161, 114), (179, 162, 116), (180, 164, 117), + (181, 167, 118), (187, 181, 123), (193, 182, 136), (201, 188, 146), + (210, 184, 151), (207, 188, 156), (208, 191, 155), (209, 194, 155), + (207, 193, 154), (206, 192, 153), (205, 182, 164), (186, 180, 164), + (175, 162, 154), (168, 148, 136), (162, 135, 118), (166, 134, 113), + (170, 134, 108), (171, 135, 109), (189, 145, 108), (188, 149, 116), + (196, 160, 128), (212, 191, 160), (213, 191, 166), (214, 191, 173), + (214, 200, 174), (208, 196, 174), (212, 191, 160), (211, 182, 148), + (207, 177, 143), (201, 170, 139), (195, 164, 135), (189, 164, 134), + (183, 164, 134), (174, 154, 127), (161, 163, 116), (160, 150, 101), + (141, 137, 92), (129, 132, 89), (132, 133, 92), (136, 134, 95), + (143, 135, 96), (152, 133, 103), (165, 152, 117), (175, 156, 114), + (174, 149, 108), (162, 133, 96), (150, 117, 84), (146, 111, 79), + (142, 106, 74), (149, 95, 69), (143, 94, 53), (143, 99, 52), + (141, 97, 50), (142, 86, 63), (135, 82, 59), (129, 79, 56), + (134, 97, 52), (131, 98, 53), (119, 98, 53), (122, 90, 51), + (0, 2, 0), (0, 1, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 2, 1), (113, 64, 32), (132, 75, 46), + (124, 69, 48), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (46, 36, 27), (107, 80, 50), (126, 97, 65), + (136, 106, 70), (140, 110, 64), (144, 115, 59), (147, 122, 68), + (164, 142, 85), (183, 157, 108), (195, 168, 121), (201, 184, 141), + (205, 188, 145), (207, 187, 154), (183, 171, 147), (164, 128, 128), + (150, 128, 114), (130, 110, 111), (133, 119, 93), (148, 121, 78), + (160, 125, 83), (160, 126, 84), (161, 128, 85), (168, 136, 77), + (169, 130, 75), (171, 111, 85), (172, 112, 88), (164, 126, 90), + (157, 130, 83), (146, 126, 89), (140, 142, 105), (149, 153, 120), + (162, 157, 117), (170, 142, 105), (165, 131, 93), (156, 118, 82), + (149, 118, 74), (143, 108, 68), (153, 101, 77), (161, 101, 77), + (175, 114, 93), (179, 130, 100), (188, 150, 114), (195, 172, 128), + (201, 188, 144), (210, 195, 156), (217, 202, 169), (222, 208, 181), + (214, 200, 174), (206, 193, 174), (200, 180, 147), (194, 173, 142), + (192, 173, 130), (192, 164, 125), (195, 158, 129), (190, 161, 129), + (180, 151, 119), (168, 127, 107), (151, 115, 99), (131, 107, 83), + (140, 114, 79), (157, 131, 98), (181, 152, 118), (189, 165, 139), + (207, 195, 157), (216, 211, 181), (228, 218, 191), (220, 212, 191), + (206, 202, 190), (209, 208, 178), (199, 196, 155), (201, 190, 145), + (195, 187, 151), (184, 169, 128), (176, 162, 113), (168, 157, 101), + (157, 130, 77), (140, 104, 54), (114, 79, 41), (27, 22, 18), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 1, 0), (66, 52, 41), + (111, 104, 76), (144, 120, 86), (178, 148, 120), (157, 152, 86) + ), + +// 185 Apophysis-040427-4AlienFlwrBwl_inv +((54, 67, 109), (44, 66, 103), (45, 66, 99), (46, 67, 96), + (47, 65, 99), (49, 63, 102), (49, 68, 96), (50, 73, 91), + (67, 84, 91), (78, 89, 104), (89, 95, 117), (87, 108, 132), + (85, 121, 147), (75, 115, 147), (66, 110, 147), (66, 108, 143), + (67, 106, 139), (50, 90, 116), (45, 77, 99), (41, 64, 82), + (44, 61, 81), (47, 59, 81), (45, 61, 88), (43, 64, 95), + (40, 69, 113), (49, 78, 114), (58, 88, 116), (65, 89, 118), + (72, 91, 121), (76, 96, 124), (81, 101, 128), (94, 92, 139), + (95, 105, 154), (122, 119, 162), (120, 120, 161), (119, 121, 160), + (111, 121, 156), (103, 122, 152), (96, 112, 145), (90, 103, 138), + (80, 103, 145), (87, 113, 150), (94, 123, 155), (103, 136, 168), + (113, 149, 181), (109, 154, 183), (106, 160, 186), (112, 161, 202), + (112, 156, 203), (120, 162, 200), (123, 169, 199), (126, 176, 199), + (125, 166, 200), (124, 157, 202), (130, 157, 202), (136, 157, 202), + (153, 177, 221), (204, 216, 238), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 254, 254), (255, 253, 254), (142, 191, 223), + (123, 180, 209), (174, 211, 238), (214, 233, 246), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (209, 219, 228), (148, 175, 205), + (132, 148, 181), (121, 144, 188), (111, 140, 196), (101, 126, 183), + (91, 113, 170), (81, 105, 158), (72, 98, 147), (60, 87, 134), + (54, 71, 114), (48, 68, 101), (69, 97, 114), (91, 127, 127), + (98, 127, 134), (105, 127, 141), (125, 145, 144), (122, 136, 162), + (101, 135, 172), (97, 131, 171), (94, 127, 170), (90, 123, 174), + (87, 119, 178), (86, 125, 180), (84, 144, 170), (83, 143, 167), + (91, 129, 165), (109, 129, 166), (107, 115, 150), (106, 102, 135), + (99, 100, 136), (93, 98, 138), (85, 113, 150), (90, 124, 162), + (106, 137, 181), (104, 145, 179), (102, 154, 178), (98, 154, 178), + (94, 154, 178), (80, 141, 162), (76, 125, 155), (67, 105, 141), + (60, 83, 127), (45, 60, 99), (41, 56, 92), (38, 53, 86), + (33, 47, 74), (41, 55, 81), (49, 62, 81), (55, 75, 108), + (63, 82, 125), (61, 89, 125), (60, 97, 126), (62, 95, 126), + (65, 94, 126), (75, 104, 136), (87, 128, 148), (104, 140, 156), + (124, 148, 172), (98, 124, 157), (86, 113, 147), (74, 103, 137), + (66, 90, 116), (48, 60, 98), (39, 44, 74), (27, 37, 64), + (49, 53, 65), (52, 56, 82), (56, 59, 100), (55, 62, 105), + (54, 65, 110), (60, 68, 104), (71, 86, 127), (79, 93, 142), + (87, 98, 154), (115, 151, 201), (128, 163, 207), (141, 176, 214), + (228, 233, 237), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 254, 255), + (189, 203, 214), (144, 151, 179), (111, 135, 169), (77, 107, 135), + (98, 103, 169), (115, 151, 201), (116, 154, 201), (117, 158, 202), + (126, 154, 202), (122, 142, 203), (124, 150, 187), (128, 161, 204), + (254, 254, 252), (254, 254, 253), (255, 255, 255), (255, 255, 255), + (206, 217, 219), (148, 176, 179), (137, 148, 176), (127, 148, 175), + (132, 156, 184), (124, 164, 172), (111, 152, 184), (104, 153, 194), + (113, 150, 194), (117, 142, 199), (105, 137, 196), (97, 129, 190), + (105, 108, 179), (108, 113, 174), (111, 118, 170), (99, 122, 172), + (98, 124, 157), (94, 128, 163), (85, 128, 163), (90, 122, 163), + (87, 120, 171), (84, 122, 169), (82, 118, 166), (89, 113, 161), + (97, 114, 168), (110, 117, 189), (123, 136, 189), (126, 142, 176), + (114, 146, 184), (99, 136, 181), (95, 125, 175), (96, 104, 169), + (81, 102, 157), (80, 103, 147), (70, 118, 156), (75, 126, 145), + (69, 119, 142), (80, 111, 142), (82, 102, 139), (82, 108, 143), + (76, 117, 149), (83, 124, 154), (86, 145, 153), (105, 127, 141), + (110, 125, 146), (117, 120, 155), (130, 123, 165), (129, 137, 176), + (141, 142, 172), (134, 144, 171), (132, 133, 161), (119, 131, 143), + (99, 116, 142), (73, 92, 124), (56, 74, 110), (43, 58, 97), + (34, 43, 74), (29, 37, 60), (29, 41, 55), (27, 39, 55), + (25, 36, 58), (25, 36, 58), (28, 36, 59), (26, 36, 61), + (29, 40, 68), (34, 49, 80), (38, 59, 90), (47, 56, 97), + (41, 54, 96), (38, 49, 81), (32, 43, 71), (31, 42, 70), + (34, 45, 75), (48, 61, 95), (47, 66, 108), (62, 76, 121), + (64, 93, 137), (66, 93, 140), (70, 94, 142), (73, 96, 138), + (76, 93, 139), (74, 88, 137), (68, 74, 132), (62, 73, 119) + ), + +// 186 Apophysis-040427-4AmusePrk +((129, 14, 91), (27, 0, 69), (68, 0, 77), (109, 0, 85), + (153, 44, 52), (197, 88, 19), (211, 108, 16), (225, 128, 13), + (243, 189, 41), (248, 211, 45), (254, 234, 49), (254, 234, 48), + (255, 234, 47), (240, 193, 36), (226, 153, 25), (211, 149, 36), + (196, 146, 47), (249, 178, 116), (243, 192, 127), (237, 206, 139), + (239, 207, 109), (242, 209, 80), (243, 227, 86), (244, 245, 92), + (248, 246, 50), (250, 231, 46), (253, 217, 43), (224, 210, 65), + (195, 204, 87), (179, 198, 96), (164, 192, 105), (196, 112, 102), + (252, 67, 46), (162, 40, 1), (130, 20, 13), (99, 0, 25), + (85, 9, 35), (72, 19, 45), (77, 41, 58), (83, 63, 72), + (178, 131, 149), (183, 70, 117), (188, 10, 86), (220, 6, 65), + (252, 3, 45), (251, 1, 36), (250, 0, 27), (238, 0, 0), + (224, 0, 18), (129, 1, 14), (80, 6, 45), (31, 12, 76), + (15, 9, 41), (0, 7, 6), (0, 28, 3), (0, 49, 0), + (117, 167, 6), (170, 160, 13), (223, 153, 21), (230, 132, 38), + (238, 111, 56), (217, 110, 70), (196, 110, 85), (163, 65, 40), + (162, 65, 0), (26, 59, 40), (13, 74, 21), (0, 90, 2), + (0, 89, 2), (1, 89, 2), (2, 49, 31), (0, 13, 44), + (0, 0, 36), (0, 0, 33), (0, 0, 31), (0, 1, 28), + (0, 2, 25), (0, 3, 28), (0, 4, 31), (0, 0, 34), + (1, 0, 36), (0, 9, 44), (0, 20, 47), (0, 31, 51), + (0, 44, 55), (0, 58, 59), (0, 72, 61), (1, 86, 67), + (2, 54, 52), (3, 44, 26), (5, 35, 1), (2, 30, 10), + (0, 25, 19), (0, 34, 36), (2, 42, 54), (0, 54, 56), + (0, 86, 67), (17, 101, 103), (86, 132, 138), (155, 164, 173), + (194, 152, 179), (233, 140, 185), (192, 150, 138), (171, 163, 140), + (138, 184, 138), (119, 170, 96), (100, 157, 54), (108, 162, 43), + (117, 167, 32), (139, 180, 14), (164, 190, 28), (148, 189, 9), + (146, 181, 3), (123, 135, 1), (121, 97, 15), (119, 60, 30), + (99, 42, 31), (45, 39, 17), (27, 17, 51), (1, 10, 43), + (1, 0, 34), (0, 4, 36), (0, 9, 39), (0, 24, 37), + (0, 40, 36), (28, 100, 16), (67, 110, 3), (144, 119, 52), + (218, 148, 96), (218, 195, 128), (213, 193, 129), (208, 192, 130), + (156, 178, 95), (155, 151, 106), (149, 169, 134), (212, 126, 151), + (255, 5, 92), (255, 5, 124), (255, 5, 157), (237, 52, 163), + (220, 99, 170), (236, 119, 146), (243, 164, 157), (244, 165, 158), + (253, 155, 130), (253, 5, 89), (253, 5, 89), (254, 5, 89), + (243, 0, 64), (232, 0, 40), (223, 4, 0), (197, 15, 2), + (69, 0, 35), (49, 27, 26), (30, 54, 18), (2, 92, 2), + (0, 116, 2), (1, 118, 4), (0, 100, 20), (1, 102, 34), + (0, 101, 69), (2, 67, 37), (1, 84, 33), (1, 101, 29), + (42, 131, 3), (74, 136, 3), (47, 130, 0), (0, 117, 2), + (0, 86, 5), (0, 63, 18), (0, 40, 32), (0, 10, 42), + (0, 11, 43), (0, 33, 49), (41, 71, 47), (121, 148, 41), + (146, 182, 32), (197, 189, 29), (254, 235, 45), (253, 251, 55), + (250, 244, 68), (244, 244, 94), (248, 250, 149), (188, 211, 157), + (109, 170, 155), (106, 166, 146), (104, 162, 137), (50, 126, 114), + (3, 96, 86), (2, 85, 69), (2, 53, 56), (45, 27, 49), + (109, 0, 86), (184, 0, 88), (215, 1, 61), (240, 0, 61), + (238, 14, 25), (238, 14, 12), (232, 80, 4), (197, 111, 0), + (158, 170, 12), (177, 182, 66), (196, 164, 51), (252, 116, 64), + (240, 103, 69), (250, 67, 49), (251, 41, 26), (250, 63, 20), + (250, 63, 22), (237, 87, 36), (199, 134, 30), (139, 136, 65), + (137, 144, 92), (137, 103, 78), (88, 49, 54), (64, 68, 7), + (65, 68, 1), (100, 130, 0), (136, 167, 12), (162, 191, 47), + (214, 230, 33), (242, 243, 51), (250, 241, 112), (243, 248, 154), + (219, 223, 190), (209, 220, 180), (176, 205, 175), (183, 194, 188), + (242, 203, 224), (245, 234, 232), (250, 246, 209), (229, 239, 231), + (236, 225, 231), (219, 230, 214), (191, 211, 184), (164, 196, 149), + (130, 158, 136), (110, 163, 153), (110, 167, 158), (106, 151, 144), + (52, 125, 106), (41, 69, 70), (0, 69, 61), (0, 56, 57), + (1, 50, 54), (1, 30, 46), (0, 36, 50), (1, 52, 55), + (15, 62, 44), (1, 84, 16), (43, 72, 14), (64, 53, 8), + (43, 43, 15), (53, 13, 1), (66, 1, 35), (236, 0, 137) + ), + +// 187 Apophysis-040427-4AmusePrkInv +((19, 255, 118), (202, 242, 254), (196, 222, 250), (191, 202, 247), + (222, 186, 243), (254, 171, 239), (247, 182, 225), (240, 193, 211), + (255, 219, 205), (254, 212, 203), (254, 205, 201), (254, 195, 197), + (255, 186, 194), (229, 158, 171), (203, 130, 149), (176, 117, 130), + (149, 104, 111), (145, 92, 102), (118, 75, 104), (91, 59, 106), + (63, 42, 73), (36, 25, 41), (27, 27, 32), (19, 30, 24), + (5, 9, 46), (9, 30, 38), (13, 52, 31), (46, 51, 55), + (79, 50, 80), (62, 42, 77), (46, 35, 75), (36, 32, 65), + (12, 7, 101), (13, 12, 204), (53, 38, 206), (93, 64, 208), + (124, 94, 231), (155, 125, 255), (172, 156, 254), (190, 187, 254), + (167, 206, 201), (142, 158, 182), (118, 111, 163), (87, 116, 194), + (56, 121, 225), (37, 144, 222), (18, 168, 219), (5, 192, 233), + (5, 192, 235), (5, 188, 206), (4, 163, 198), (3, 139, 191), + (40, 106, 190), (78, 73, 189), (87, 79, 216), (97, 85, 243), + (23, 175, 251), (20, 208, 240), (17, 241, 230), (28, 247, 212), + (40, 254, 194), (55, 254, 180), (71, 255, 167), (146, 255, 169), + (210, 228, 206), (253, 170, 186), (229, 149, 163), (205, 129, 141), + (178, 111, 129), (151, 93, 118), (146, 85, 100), (108, 71, 88), + (7, 5, 106), (6, 8, 146), (5, 11, 187), (3, 15, 198), + (1, 20, 210), (29, 43, 218), (58, 66, 226), (109, 73, 223), + (134, 107, 214), (255, 222, 206), (255, 233, 209), (255, 245, 213), + (255, 230, 218), (255, 215, 223), (255, 169, 250), (252, 154, 255), + (208, 125, 255), (210, 124, 253), (213, 124, 252), (233, 139, 239), + (254, 154, 226), (253, 188, 218), (254, 169, 192), (255, 154, 186), + (254, 153, 221), (254, 137, 251), (253, 150, 252), (253, 163, 253), + (239, 182, 245), (225, 201, 237), (186, 255, 220), (113, 248, 254), + (32, 251, 255), (22, 253, 223), (12, 255, 191), (6, 252, 178), + (1, 250, 166), (2, 250, 166), (37, 153, 142), (2, 100, 125), + (11, 90, 97), (19, 136, 109), (27, 146, 97), (35, 156, 85), + (0, 250, 98), (1, 255, 129), (0, 250, 163), (19, 219, 110), + (106, 86, 121), (102, 81, 140), (99, 77, 160), (73, 70, 142), + (47, 63, 125), (37, 60, 127), (20, 42, 151), (37, 107, 159), + (111, 136, 203), (227, 155, 239), (241, 185, 229), (255, 215, 219), + (255, 246, 216), (254, 253, 222), (254, 255, 221), (255, 250, 214), + (228, 238, 204), (192, 225, 214), (156, 213, 224), (146, 204, 224), + (136, 195, 225), (132, 120, 254), (120, 84, 254), (109, 74, 252), + (107, 66, 246), (116, 75, 241), (127, 81, 232), (138, 88, 223), + (155, 98, 201), (151, 88, 131), (117, 71, 117), (102, 92, 116), + (63, 105, 117), (42, 110, 93), (22, 115, 70), (100, 91, 82), + (149, 123, 110), (238, 154, 152), (255, 153, 182), (255, 169, 188), + (255, 201, 199), (255, 221, 219), (255, 225, 227), (255, 230, 236), + (250, 220, 254), (254, 223, 229), (253, 201, 203), (254, 181, 192), + (255, 183, 194), (255, 190, 195), (255, 197, 196), (255, 224, 204), + (255, 244, 212), (255, 246, 211), (255, 255, 211), (254, 255, 219), + (255, 255, 221), (255, 251, 224), (255, 253, 230), (255, 255, 224), + (255, 255, 224), (255, 255, 221), (255, 255, 219), (255, 246, 215), + (253, 206, 224), (253, 186, 238), (254, 166, 253), (255, 165, 253), + (254, 167, 235), (229, 196, 215), (130, 217, 198), (93, 190, 255), + (92, 190, 215), (59, 145, 170), (17, 144, 199), (32, 103, 229), + (32, 102, 234), (45, 92, 230), (138, 88, 249), (213, 151, 248), + (255, 206, 255), (255, 248, 249), (213, 255, 209), (224, 243, 179), + (165, 231, 204), (126, 254, 241), (90, 232, 236), (31, 255, 237), + (17, 255, 255), (5, 255, 228), (3, 252, 210), (36, 251, 207), + (67, 245, 169), (37, 155, 103), (77, 124, 106), (101, 131, 141), + (172, 192, 183), (183, 236, 210), (155, 255, 226), (156, 255, 230), + (140, 230, 254), (93, 215, 254), (30, 238, 250), (3, 188, 209), + (59, 143, 153), (91, 63, 150), (60, 51, 168), (46, 36, 210), + (2, 38, 212), (0, 32, 203), (7, 9, 205), (1, 1, 183), + (11, 10, 163), (13, 46, 175), (2, 35, 148), (18, 49, 116), + (10, 63, 95), (6, 77, 139), (30, 72, 174), (59, 109, 208), + (29, 102, 230), (13, 66, 204), (0, 21, 208), (1, 19, 203), + (1, 21, 206), (2, 38, 212), (12, 66, 214), (32, 103, 231), + (30, 127, 242), (58, 167, 236), (134, 212, 198), (146, 255, 170), + (209, 231, 167), (228, 255, 186), (199, 235, 165), (126, 241, 164) + ), + +// 188 Apophysis-040427-4AmythIceInv +((109, 114, 50), (75, 80, 60), (85, 88, 62), (96, 97, 65), + (116, 116, 67), (136, 135, 70), (141, 145, 71), (147, 156, 73), + (177, 175, 88), (183, 180, 91), (190, 186, 95), (195, 191, 101), + (200, 196, 107), (201, 195, 110), (202, 195, 114), (200, 198, 113), + (199, 202, 113), (199, 195, 104), (194, 191, 100), (189, 188, 96), + (181, 180, 89), (173, 173, 83), (161, 162, 75), (149, 151, 68), + (64, 164, 48), (64, 164, 50), (64, 164, 52), (85, 134, 69), + (106, 105, 87), (107, 109, 76), (108, 114, 66), (128, 134, 62), + (131, 139, 62), (172, 172, 82), (179, 177, 90), (187, 182, 98), + (190, 187, 100), (193, 193, 103), (193, 190, 101), (194, 188, 100), + (187, 188, 94), (172, 172, 83), (157, 156, 73), (136, 136, 61), + (116, 117, 49), (96, 94, 42), (76, 72, 35), (70, 66, 37), + (55, 60, 38), (85, 97, 75), (123, 129, 86), (162, 162, 98), + (177, 176, 100), (192, 190, 103), (197, 194, 106), (202, 198, 109), + (218, 220, 121), (227, 222, 140), (236, 225, 159), (245, 231, 176), + (254, 237, 193), (247, 230, 184), (240, 224, 175), (234, 213, 170), + (225, 213, 131), (204, 200, 111), (210, 205, 118), (217, 211, 125), + (221, 213, 132), (225, 216, 139), (234, 217, 165), (255, 237, 223), + (255, 233, 225), (241, 224, 186), (228, 215, 147), (214, 206, 127), + (201, 197, 108), (193, 189, 101), (185, 181, 94), (155, 158, 77), + (116, 126, 66), (19, 49, 25), (18, 43, 34), (18, 37, 43), + (29, 45, 48), (41, 53, 53), (69, 84, 63), (91, 170, 91), + (148, 219, 141), (169, 204, 122), (190, 190, 104), (193, 192, 103), + (196, 195, 103), (196, 195, 103), (197, 196, 103), (197, 196, 103), + (197, 196, 103), (198, 198, 102), (199, 199, 103), (200, 200, 104), + (199, 200, 103), (199, 201, 102), (199, 199, 103), (199, 199, 103), + (196, 195, 103), (194, 192, 100), (193, 189, 98), (192, 185, 94), + (192, 181, 91), (182, 181, 91), (179, 178, 88), (166, 166, 78), + (151, 153, 69), (158, 157, 74), (166, 165, 81), (174, 174, 88), + (185, 186, 92), (188, 190, 93), (195, 191, 100), (196, 195, 102), + (193, 193, 103), (195, 193, 102), (197, 193, 102), (196, 193, 101), + (195, 194, 101), (196, 195, 103), (196, 195, 103), (197, 196, 103), + (197, 196, 103), (203, 199, 110), (204, 198, 113), (206, 198, 117), + (212, 198, 127), (216, 203, 135), (230, 213, 161), (248, 224, 196), + (242, 247, 253), (248, 251, 250), (255, 255, 247), (254, 255, 245), + (253, 255, 244), (253, 255, 242), (246, 242, 230), (234, 213, 170), + (219, 211, 136), (203, 200, 107), (204, 202, 106), (205, 205, 105), + (205, 207, 108), (190, 219, 109), (216, 241, 121), (222, 229, 123), + (213, 220, 117), (208, 214, 114), (204, 208, 111), (204, 208, 111), + (222, 229, 123), (233, 219, 144), (234, 219, 162), (229, 212, 158), + (226, 209, 139), (206, 196, 127), (206, 195, 124), (207, 195, 121), + (196, 189, 108), (193, 186, 105), (192, 183, 106), (160, 163, 120), + (139, 145, 85), (142, 151, 98), (146, 158, 112), (126, 139, 121), + (101, 193, 106), (92, 191, 109), (82, 179, 72), (65, 168, 51), + (53, 158, 39), (53, 156, 38), (63, 91, 50), (71, 79, 56), + (76, 79, 52), (74, 85, 51), (76, 89, 45), (46, 147, 25), + (57, 158, 40), (62, 162, 45), (67, 167, 51), (145, 152, 72), + (165, 165, 79), (180, 179, 89), (182, 187, 95), (189, 190, 97), + (195, 188, 107), (189, 196, 128), (144, 213, 166), (149, 219, 195), + (173, 230, 224), (197, 221, 171), (183, 198, 155), (203, 194, 129), + (205, 196, 117), (203, 199, 112), (203, 200, 105), (200, 200, 104), + (199, 199, 103), (198, 197, 104), (201, 197, 108), (201, 197, 108), + (206, 197, 118), (208, 196, 122), (216, 197, 129), (217, 206, 144), + (229, 208, 177), (219, 238, 219), (251, 255, 238), (239, 252, 224), + (221, 235, 173), (227, 235, 152), (229, 219, 132), (219, 214, 130), + (212, 206, 122), (204, 195, 116), (172, 168, 123), (151, 156, 124), + (117, 128, 98), (94, 97, 76), (75, 83, 62), (73, 78, 71), + (83, 84, 88), (105, 102, 97), (133, 136, 91), (151, 154, 77), + (163, 162, 79), (168, 173, 73), (148, 188, 89), (72, 179, 65), + (51, 166, 49), (43, 153, 30), (37, 151, 30), (32, 150, 30), + (19, 129, 14), (19, 128, 13), (29, 139, 18), (26, 133, 19), + (54, 77, 35), (61, 75, 40), (44, 49, 45), (31, 44, 34), + (28, 24, 15), (24, 33, 4), (46, 42, 4), (55, 56, 25), + (57, 64, 30), (87, 94, 52), (102, 100, 52), (115, 113, 54) + ), + +// 189 Apophysis-040427-4AmythIce +((146, 141, 205), (180, 175, 195), (169, 166, 192), (159, 158, 190), + (139, 139, 187), (119, 120, 185), (113, 109, 183), (108, 99, 182), + (78, 80, 167), (71, 74, 163), (65, 69, 160), (60, 64, 154), + (55, 59, 148), (54, 59, 144), (53, 60, 141), (54, 56, 141), + (56, 53, 142), (56, 60, 151), (61, 63, 155), (66, 67, 159), + (74, 74, 165), (82, 82, 172), (94, 93, 179), (106, 104, 187), + (191, 91, 207), (191, 91, 205), (191, 91, 203), (170, 120, 185), + (149, 150, 168), (148, 145, 178), (147, 141, 189), (127, 121, 193), + (124, 116, 193), (83, 83, 173), (75, 78, 165), (68, 73, 157), + (65, 67, 154), (62, 62, 152), (61, 64, 153), (61, 67, 155), + (68, 67, 161), (83, 83, 171), (98, 99, 182), (118, 118, 194), + (139, 138, 206), (159, 160, 213), (179, 183, 220), (185, 189, 218), + (200, 195, 217), (170, 158, 180), (131, 125, 168), (93, 93, 157), + (78, 79, 154), (63, 65, 152), (58, 61, 149), (53, 57, 146), + (37, 35, 134), (28, 32, 115), (19, 30, 96), (10, 24, 79), + (1, 18, 62), (8, 24, 71), (15, 31, 80), (21, 42, 85), + (30, 42, 124), (51, 55, 144), (44, 49, 137), (38, 44, 130), + (34, 41, 123), (30, 39, 116), (21, 38, 90), (0, 18, 32), + (0, 22, 30), (13, 31, 69), (27, 40, 108), (40, 49, 127), + (54, 58, 147), (62, 66, 154), (70, 74, 161), (100, 97, 178), + (139, 129, 189), (236, 206, 230), (236, 212, 221), (237, 218, 212), + (225, 210, 207), (214, 202, 202), (186, 171, 192), (164, 85, 164), + (107, 36, 114), (86, 50, 132), (65, 65, 151), (62, 62, 151), + (59, 60, 152), (59, 60, 152), (58, 59, 152), (58, 59, 152), + (58, 59, 152), (57, 57, 153), (56, 56, 152), (55, 55, 151), + (55, 54, 152), (56, 54, 153), (56, 56, 152), (56, 56, 152), + (59, 60, 152), (60, 63, 154), (62, 66, 157), (62, 70, 160), + (63, 74, 164), (73, 74, 164), (76, 77, 167), (89, 89, 177), + (104, 102, 186), (97, 98, 181), (89, 89, 174), (81, 81, 167), + (70, 69, 163), (67, 65, 162), (60, 64, 155), (59, 60, 153), + (62, 62, 152), (60, 62, 152), (58, 62, 153), (59, 61, 153), + (60, 61, 154), (59, 60, 152), (59, 60, 152), (58, 59, 152), + (58, 59, 152), (52, 56, 145), (50, 56, 141), (49, 57, 138), + (43, 57, 128), (39, 52, 120), (25, 42, 94), (7, 31, 59), + (13, 8, 2), (6, 4, 5), (0, 0, 8), (1, 0, 9), + (2, 0, 11), (2, 0, 13), (9, 13, 25), (21, 42, 85), + (36, 44, 119), (52, 55, 148), (51, 52, 149), (50, 50, 150), + (50, 48, 147), (65, 36, 146), (39, 14, 134), (33, 26, 132), + (42, 35, 138), (46, 41, 141), (51, 47, 144), (51, 47, 144), + (33, 26, 132), (22, 36, 111), (21, 36, 93), (26, 43, 97), + (29, 46, 116), (49, 59, 128), (48, 59, 131), (48, 60, 134), + (59, 66, 147), (62, 69, 150), (63, 72, 149), (95, 92, 135), + (116, 110, 170), (112, 103, 156), (109, 97, 143), (129, 116, 134), + (154, 62, 149), (163, 64, 146), (173, 76, 183), (190, 87, 204), + (202, 97, 216), (202, 99, 217), (192, 164, 205), (184, 176, 199), + (179, 176, 203), (181, 170, 204), (179, 166, 210), (209, 108, 230), + (198, 97, 215), (193, 92, 209), (188, 88, 204), (110, 103, 183), + (90, 90, 176), (75, 76, 166), (73, 68, 160), (66, 65, 158), + (60, 67, 148), (66, 59, 127), (111, 42, 89), (106, 36, 60), + (82, 25, 31), (58, 34, 84), (72, 57, 100), (52, 61, 126), + (50, 59, 138), (52, 56, 143), (52, 55, 150), (55, 55, 151), + (56, 56, 152), (57, 58, 151), (54, 58, 147), (54, 58, 147), + (49, 58, 137), (47, 59, 133), (39, 58, 126), (38, 49, 111), + (26, 47, 78), (36, 17, 36), (4, 0, 17), (16, 3, 31), + (34, 20, 82), (28, 20, 103), (26, 36, 123), (36, 41, 125), + (43, 49, 133), (51, 60, 139), (83, 87, 132), (104, 99, 131), + (138, 127, 157), (161, 158, 179), (180, 172, 193), (182, 177, 184), + (172, 171, 167), (150, 153, 158), (122, 119, 164), (104, 101, 178), + (92, 93, 176), (87, 82, 182), (107, 67, 166), (183, 76, 190), + (204, 89, 206), (212, 102, 225), (218, 104, 225), (223, 105, 225), + (236, 126, 241), (236, 127, 242), (226, 116, 237), (229, 122, 236), + (201, 178, 220), (194, 180, 215), (211, 206, 210), (224, 211, 221), + (227, 231, 240), (231, 222, 251), (209, 213, 251), (200, 199, 230), + (198, 191, 225), (168, 161, 203), (153, 155, 203), (140, 142, 201) + ), + +// 190 Apophysis-040427-4AngOrchid +((173, 229, 200), (192, 204, 200), (167, 156, 200), (143, 108, 200), + (122, 88, 172), (101, 69, 144), (101, 67, 145), (101, 66, 146), + (103, 73, 161), (104, 74, 174), (105, 75, 187), (98, 70, 189), + (92, 66, 191), (90, 62, 170), (88, 59, 149), (84, 56, 139), + (81, 53, 130), (91, 65, 188), (89, 70, 201), (87, 76, 215), + (78, 92, 205), (69, 109, 196), (71, 119, 192), (73, 129, 188), + (39, 99, 91), (19, 56, 57), (0, 13, 24), (19, 56, 58), + (39, 100, 92), (40, 100, 93), (41, 100, 94), (41, 102, 94), + (41, 104, 95), (41, 102, 94), (40, 101, 93), (39, 100, 92), + (40, 102, 93), (41, 104, 95), (41, 104, 95), (42, 105, 96), + (43, 113, 102), (49, 134, 110), (56, 156, 118), (56, 158, 123), + (56, 161, 128), (54, 159, 124), (53, 157, 120), (57, 161, 126), + (57, 162, 131), (70, 173, 152), (84, 183, 169), (99, 194, 186), + (130, 209, 199), (162, 224, 213), (163, 224, 213), (164, 224, 214), + (108, 191, 171), (86, 179, 154), (64, 167, 138), (59, 164, 135), + (55, 162, 132), (55, 162, 132), (56, 163, 133), (56, 165, 136), + (64, 176, 154), (107, 184, 192), (137, 198, 197), (167, 213, 203), + (175, 215, 205), (184, 217, 208), (188, 223, 216), (189, 236, 216), + (181, 228, 220), (180, 227, 219), (179, 226, 218), (174, 223, 217), + (169, 221, 217), (163, 212, 214), (157, 204, 212), (120, 185, 177), + (89, 150, 132), (51, 108, 101), (62, 78, 111), (74, 48, 122), + (75, 48, 122), (76, 48, 123), (77, 50, 127), (79, 52, 131), + (102, 92, 191), (107, 88, 203), (112, 85, 216), (119, 101, 219), + (127, 118, 223), (112, 166, 204), (99, 186, 177), (77, 170, 141), + (58, 154, 126), (42, 108, 98), (41, 104, 95), (40, 101, 93), + (39, 100, 92), (39, 100, 92), (39, 100, 92), (41, 102, 94), + (43, 109, 99), (53, 133, 118), (64, 157, 138), (72, 158, 154), + (80, 160, 171), (103, 181, 183), (128, 194, 190), (152, 189, 215), + (156, 166, 225), (116, 89, 218), (109, 83, 219), (103, 78, 221), + (93, 82, 221), (89, 76, 216), (95, 83, 209), (107, 122, 213), + (65, 162, 169), (65, 160, 153), (66, 158, 137), (60, 160, 137), + (55, 163, 137), (57, 169, 145), (65, 172, 152), (66, 175, 156), + (72, 180, 164), (65, 173, 157), (63, 171, 147), (61, 169, 137), + (61, 162, 128), (62, 162, 126), (67, 163, 126), (68, 165, 130), + (58, 163, 132), (57, 163, 134), (57, 164, 136), (56, 164, 137), + (56, 164, 138), (61, 170, 151), (74, 168, 176), (94, 172, 192), + (105, 181, 197), (143, 216, 209), (137, 205, 205), (132, 195, 202), + (118, 189, 173), (88, 171, 163), (55, 150, 144), (48, 121, 110), + (43, 109, 99), (43, 109, 99), (43, 109, 99), (46, 116, 105), + (62, 157, 125), (69, 172, 145), (101, 189, 167), (120, 202, 196), + (143, 204, 189), (169, 227, 177), (161, 218, 187), (153, 209, 198), + (154, 203, 208), (156, 219, 211), (166, 235, 204), (153, 208, 189), + (183, 224, 168), (184, 226, 172), (186, 229, 176), (181, 235, 199), + (182, 239, 206), (181, 221, 213), (190, 220, 212), (198, 239, 205), + (198, 240, 204), (194, 228, 201), (191, 222, 190), (177, 222, 163), + (152, 178, 165), (110, 182, 168), (78, 171, 142), (66, 165, 134), + (92, 185, 166), (101, 189, 172), (111, 193, 179), (134, 201, 184), + (173, 221, 161), (176, 220, 159), (181, 221, 158), (177, 219, 156), + (162, 195, 140), (102, 156, 142), (80, 171, 140), (93, 181, 156), + (127, 195, 172), (159, 208, 163), (173, 221, 159), (175, 219, 158), + (165, 196, 139), (153, 179, 131), (88, 146, 122), (74, 131, 161), + (106, 84, 157), (136, 106, 178), (176, 143, 230), (167, 184, 227), + (181, 214, 219), (195, 230, 224), (208, 244, 216), (212, 243, 225), + (206, 239, 222), (194, 239, 216), (194, 239, 218), (195, 230, 226), + (207, 230, 222), (206, 238, 225), (208, 235, 230), (211, 237, 228), + (210, 237, 228), (202, 228, 225), (186, 216, 218), (174, 188, 225), + (176, 155, 232), (149, 116, 221), (135, 99, 205), (107, 82, 210), + (104, 80, 218), (127, 103, 225), (111, 139, 213), (103, 161, 201), + (84, 152, 191), (64, 136, 151), (45, 117, 106), (43, 109, 99), + (41, 104, 95), (40, 101, 93), (41, 100, 94), (41, 100, 94), + (74, 48, 122), (77, 49, 124), (80, 52, 129), (86, 58, 143), + (87, 57, 131), (52, 109, 102), (42, 105, 96), (41, 104, 95), + (42, 108, 98), (43, 113, 102), (67, 138, 122), (90, 147, 154), + (127, 193, 183), (132, 213, 206), (167, 237, 201), (181, 238, 203) + ), + +// 191 Apophysis-040427-4Leaves +((186, 178, 193), (87, 98, 68), (64, 60, 46), (41, 22, 24), + (49, 22, 23), (57, 23, 22), (77, 40, 24), (98, 57, 27), + (159, 95, 33), (173, 122, 69), (188, 150, 105), (180, 163, 127), + (172, 176, 149), (166, 170, 160), (160, 165, 171), (159, 165, 173), + (159, 166, 176), (188, 198, 187), (193, 200, 187), (198, 202, 187), + (202, 195, 176), (207, 189, 165), (197, 184, 153), (188, 180, 141), + (192, 133, 29), (200, 137, 21), (209, 141, 14), (218, 156, 16), + (227, 172, 19), (227, 182, 19), (228, 192, 20), (228, 172, 25), + (226, 162, 26), (210, 142, 19), (194, 125, 29), (179, 109, 39), + (176, 118, 26), (174, 127, 13), (192, 141, 12), (211, 156, 11), + (221, 189, 90), (217, 196, 132), (214, 203, 175), (207, 212, 200), + (201, 222, 225), (198, 222, 229), (196, 223, 234), (188, 220, 243), + (198, 211, 243), (209, 217, 238), (205, 213, 217), (201, 209, 196), + (196, 191, 177), (192, 173, 158), (192, 172, 133), (192, 172, 109), + (232, 210, 46), (225, 216, 68), (219, 222, 91), (214, 213, 128), + (210, 205, 165), (206, 204, 171), (203, 203, 177), (197, 199, 185), + (179, 189, 181), (148, 141, 113), (125, 103, 67), (103, 66, 21), + (100, 61, 13), (97, 57, 6), (66, 37, 0), (38, 21, 14), + (21, 17, 34), (36, 30, 24), (52, 43, 14), (74, 52, 21), + (97, 61, 29), (107, 66, 34), (117, 72, 39), (132, 108, 74), + (171, 135, 109), (154, 163, 142), (154, 161, 155), (155, 159, 168), + (154, 158, 161), (153, 158, 154), (147, 156, 153), (150, 147, 140), + (168, 164, 129), (168, 182, 154), (168, 200, 179), (175, 208, 183), + (183, 216, 187), (208, 214, 210), (218, 223, 217), (214, 223, 218), + (207, 223, 213), (209, 200, 185), (206, 192, 149), (203, 185, 113), + (200, 183, 105), (198, 182, 97), (200, 190, 95), (210, 178, 91), + (203, 165, 64), (206, 137, 50), (210, 109, 37), (198, 98, 35), + (187, 88, 33), (158, 88, 19), (163, 97, 19), (158, 118, 57), + (176, 125, 98), (163, 168, 188), (168, 168, 197), (173, 169, 206), + (171, 193, 214), (173, 200, 217), (196, 204, 206), (201, 200, 198), + (209, 207, 194), (212, 207, 198), (215, 208, 202), (218, 210, 216), + (222, 213, 230), (231, 221, 219), (221, 215, 199), (217, 185, 170), + (200, 142, 96), (191, 130, 47), (193, 125, 39), (195, 121, 32), + (195, 146, 41), (189, 163, 88), (184, 172, 132), (186, 189, 178), + (187, 202, 197), (182, 195, 195), (177, 188, 194), (175, 188, 187), + (173, 188, 181), (165, 180, 187), (160, 185, 192), (163, 193, 204), + (181, 194, 200), (204, 212, 223), (210, 218, 225), (216, 224, 227), + (222, 231, 240), (227, 233, 233), (228, 232, 218), (222, 226, 212), + (212, 196, 173), (212, 194, 157), (212, 192, 141), (212, 176, 116), + (219, 156, 85), (177, 126, 60), (124, 86, 39), (116, 62, 26), + (82, 19, 27), (18, 18, 6), (14, 17, 6), (11, 17, 7), + (17, 9, 7), (15, 14, 12), (33, 22, 18), (35, 68, 23), + (164, 93, 123), (177, 125, 150), (191, 158, 177), (207, 193, 190), + (207, 205, 210), (210, 213, 220), (216, 220, 223), (205, 224, 222), + (190, 225, 227), (196, 209, 218), (201, 201, 201), (201, 195, 169), + (199, 191, 145), (178, 174, 129), (174, 169, 129), (174, 172, 134), + (175, 167, 165), (179, 176, 182), (184, 186, 199), (196, 200, 209), + (209, 211, 224), (205, 227, 241), (212, 233, 250), (221, 232, 250), + (209, 236, 245), (197, 224, 241), (212, 226, 226), (216, 229, 209), + (228, 233, 213), (236, 235, 171), (238, 208, 156), (217, 205, 119), + (205, 185, 90), (213, 169, 60), (215, 169, 58), (233, 180, 50), + (227, 201, 46), (221, 205, 34), (232, 206, 25), (236, 218, 20), + (231, 203, 34), (239, 187, 23), (232, 181, 30), (234, 177, 26), + (232, 164, 27), (218, 143, 15), (193, 124, 3), (152, 86, 12), + (108, 78, 14), (79, 68, 48), (120, 114, 90), (167, 157, 145), + (185, 187, 186), (212, 208, 223), (221, 209, 231), (213, 210, 229), + (209, 223, 232), (209, 219, 228), (197, 211, 224), (189, 203, 206), + (174, 187, 193), (153, 178, 174), (100, 176, 163), (134, 146, 134), + (120, 133, 141), (98, 122, 132), (111, 120, 135), (140, 141, 101), + (148, 142, 90), (179, 138, 50), (197, 107, 10), (166, 78, 7), + (143, 45, 20), (100, 55, 22), (62, 24, 15), (31, 9, 11), + (28, 4, 17), (50, 12, 11), (74, 38, 6), (115, 76, 0), + (133, 86, 30), (156, 96, 44), (145, 131, 86), (146, 124, 110), + (142, 158, 87), (135, 143, 94), (111, 118, 124), (102, 104, 103) + ), + +// 192 Apophysis-040427-4Bdlnds +((65, 55, 19), (44, 34, 24), (40, 28, 15), (36, 23, 7), + (38, 22, 7), (40, 22, 8), (45, 46, 9), (50, 70, 11), + (63, 89, 26), (78, 97, 52), (93, 106, 78), (110, 111, 99), + (127, 116, 120), (163, 122, 115), (200, 129, 111), (196, 142, 119), + (193, 156, 127), (195, 223, 226), (193, 221, 227), (191, 220, 228), + (185, 192, 183), (180, 164, 139), (183, 161, 134), (186, 159, 129), + (189, 168, 151), (194, 197, 188), (200, 226, 225), (207, 231, 230), + (215, 237, 235), (217, 238, 236), (220, 240, 238), (222, 243, 238), + (220, 238, 238), (220, 232, 230), (220, 232, 229), (221, 232, 228), + (214, 229, 230), (207, 226, 232), (210, 228, 232), (213, 231, 233), + (210, 234, 236), (209, 231, 233), (209, 229, 230), (206, 226, 226), + (204, 224, 222), (203, 196, 190), (203, 169, 159), (175, 151, 141), + (147, 128, 124), (133, 104, 100), (127, 109, 104), (122, 115, 109), + (131, 121, 120), (140, 128, 132), (157, 143, 136), (175, 158, 140), + (180, 223, 230), (184, 223, 227), (189, 223, 225), (179, 184, 179), + (170, 146, 134), (162, 134, 123), (155, 123, 112), (149, 115, 87), + (137, 113, 75), (99, 93, 35), (98, 88, 34), (97, 83, 34), + (98, 91, 39), (100, 99, 45), (111, 105, 81), (119, 104, 97), + (128, 117, 125), (133, 109, 105), (138, 102, 86), (125, 106, 80), + (113, 110, 75), (96, 106, 70), (80, 102, 66), (80, 102, 63), + (85, 101, 56), (80, 87, 36), (85, 85, 32), (90, 83, 28), + (87, 82, 28), (84, 81, 28), (82, 95, 16), (64, 90, 17), + (63, 66, 11), (73, 73, 15), (84, 80, 19), (102, 90, 27), + (121, 100, 35), (159, 100, 42), (147, 106, 74), (157, 99, 77), + (158, 113, 90), (175, 163, 115), (177, 167, 120), (180, 172, 126), + (186, 169, 131), (192, 167, 136), (218, 173, 154), (210, 225, 222), + (222, 238, 238), (226, 240, 239), (230, 242, 240), (230, 242, 240), + (231, 243, 241), (228, 243, 240), (228, 242, 243), (226, 241, 244), + (230, 240, 242), (245, 251, 247), (245, 251, 247), (245, 251, 247), + (241, 252, 246), (236, 248, 244), (230, 245, 242), (223, 239, 239), + (214, 233, 239), (203, 227, 236), (193, 221, 233), (192, 221, 230), + (191, 222, 227), (186, 163, 149), (154, 143, 137), (138, 132, 134), + (124, 113, 129), (105, 121, 121), (114, 128, 116), (123, 135, 111), + (147, 145, 106), (152, 132, 125), (176, 157, 153), (169, 213, 226), + (167, 215, 227), (150, 175, 179), (134, 136, 131), (124, 123, 108), + (115, 111, 86), (95, 93, 55), (102, 88, 41), (130, 100, 76), + (179, 139, 139), (117, 112, 48), (151, 123, 74), (185, 135, 100), + (203, 175, 154), (192, 221, 225), (187, 221, 230), (182, 222, 224), + (151, 134, 108), (137, 123, 100), (123, 112, 92), (96, 87, 58), + (95, 76, 46), (93, 69, 35), (104, 65, 34), (119, 76, 25), + (93, 82, 37), (126, 94, 73), (133, 107, 91), (140, 120, 109), + (180, 147, 132), (203, 169, 157), (207, 222, 225), (223, 234, 236), + (247, 253, 249), (250, 253, 248), (253, 254, 248), (246, 254, 255), + (247, 251, 252), (242, 251, 246), (233, 245, 241), (227, 239, 237), + (216, 232, 231), (202, 225, 219), (203, 183, 150), (193, 173, 122), + (178, 135, 93), (145, 119, 62), (121, 92, 58), (115, 90, 70), + (95, 110, 113), (106, 130, 136), (117, 150, 159), (150, 158, 179), + (163, 205, 229), (183, 218, 240), (194, 227, 236), (213, 232, 238), + (223, 237, 240), (228, 242, 242), (221, 239, 241), (212, 231, 238), + (211, 231, 230), (205, 230, 226), (209, 224, 229), (213, 199, 188), + (201, 154, 144), (177, 140, 132), (144, 122, 111), (138, 109, 79), + (119, 112, 70), (94, 109, 50), (84, 101, 46), (108, 102, 66), + (129, 108, 103), (146, 128, 142), (171, 161, 169), (184, 221, 227), + (186, 223, 231), (189, 224, 230), (198, 229, 231), (198, 230, 229), + (206, 226, 225), (215, 201, 190), (204, 174, 148), (180, 150, 124), + (139, 118, 65), (114, 105, 38), (103, 96, 28), (92, 92, 42), + (94, 94, 58), (114, 110, 98), (151, 158, 127), (176, 191, 188), + (182, 220, 231), (193, 221, 232), (201, 224, 232), (211, 229, 233), + (214, 232, 236), (217, 237, 235), (220, 240, 239), (217, 238, 241), + (213, 238, 243), (217, 236, 242), (217, 236, 242), (211, 233, 244), + (206, 230, 240), (188, 225, 243), (183, 219, 233), (186, 221, 227), + (193, 168, 161), (190, 147, 131), (171, 135, 135), (173, 126, 136), + (153, 119, 135), (148, 121, 138), (142, 126, 136), (145, 119, 132), + (131, 117, 108), (107, 102, 83), (80, 71, 64), (79, 76, 35) + ), + +// 193 Apophysis-040427-4BnnySurp +((246, 152, 80), (121, 73, 209), (160, 91, 174), (200, 109, 140), + (218, 122, 116), (237, 136, 92), (241, 143, 85), (245, 151, 79), + (254, 163, 72), (254, 165, 71), (255, 168, 71), (254, 165, 71), + (254, 163, 72), (254, 165, 71), (254, 167, 70), (254, 167, 70), + (255, 168, 71), (255, 169, 72), (245, 186, 62), (235, 204, 52), + (225, 197, 40), (216, 191, 29), (220, 181, 44), (224, 171, 59), + (223, 144, 103), (219, 137, 103), (215, 131, 103), (204, 126, 117), + (194, 121, 132), (182, 113, 150), (171, 105, 169), (140, 85, 187), + (117, 70, 208), (82, 51, 253), (96, 57, 235), (111, 64, 218), + (139, 82, 194), (168, 101, 170), (173, 105, 167), (179, 110, 165), + (203, 121, 109), (209, 126, 104), (216, 131, 100), (210, 125, 104), + (204, 120, 109), (198, 119, 116), (193, 118, 123), (184, 113, 145), + (132, 87, 154), (96, 73, 83), (149, 96, 65), (202, 120, 47), + (219, 133, 64), (236, 147, 81), (241, 149, 80), (246, 152, 80), + (255, 166, 70), (254, 168, 73), (253, 170, 76), (249, 161, 92), + (246, 153, 109), (230, 149, 119), (215, 146, 130), (219, 117, 128), + (188, 112, 161), (187, 114, 143), (201, 122, 123), (216, 130, 103), + (219, 133, 98), (223, 136, 93), (229, 142, 88), (241, 148, 79), + (253, 162, 71), (252, 159, 73), (251, 156, 76), (245, 152, 77), + (239, 148, 78), (236, 146, 81), (234, 144, 84), (232, 140, 89), + (230, 138, 89), (222, 131, 104), (222, 133, 98), (223, 136, 93), + (220, 136, 92), (217, 136, 91), (220, 136, 92), (226, 137, 95), + (235, 145, 83), (244, 152, 76), (254, 159, 69), (245, 158, 61), + (236, 157, 54), (232, 143, 83), (219, 134, 97), (201, 115, 118), + (182, 112, 149), (172, 106, 170), (176, 107, 162), (180, 108, 154), + (187, 112, 138), (194, 117, 123), (202, 117, 110), (210, 123, 103), + (205, 122, 108), (179, 109, 136), (153, 96, 165), (146, 90, 175), + (139, 84, 185), (106, 46, 180), (79, 36, 203), (62, 26, 238), + (50, 32, 242), (109, 63, 221), (109, 64, 222), (109, 65, 224), + (85, 60, 240), (82, 51, 253), (82, 50, 255), (80, 51, 255), + (81, 49, 255), (84, 49, 253), (87, 50, 252), (97, 56, 238), + (107, 62, 225), (125, 76, 204), (142, 88, 184), (179, 106, 162), + (199, 118, 114), (229, 139, 89), (235, 144, 84), (241, 150, 80), + (248, 155, 77), (255, 169, 69), (253, 187, 64), (248, 202, 20), + (250, 210, 1), (252, 190, 36), (254, 170, 71), (254, 167, 72), + (255, 164, 73), (251, 156, 76), (243, 148, 80), (235, 141, 89), + (220, 139, 94), (195, 119, 121), (182, 114, 134), (169, 109, 147), + (151, 94, 173), (121, 69, 203), (105, 62, 229), (97, 45, 251), + (74, 53, 254), (73, 53, 253), (72, 54, 252), (70, 51, 255), + (74, 51, 255), (75, 50, 253), (76, 51, 255), (80, 51, 255), + (82, 51, 253), (105, 62, 229), (108, 63, 222), (111, 65, 215), + (113, 67, 215), (116, 72, 209), (116, 72, 209), (126, 78, 198), + (115, 70, 212), (119, 72, 207), (124, 75, 203), (116, 76, 191), + (96, 66, 104), (76, 56, 19), (74, 53, 34), (5, 0, 110), + (8, 0, 177), (10, 0, 181), (20, 4, 225), (27, 8, 250), + (34, 14, 253), (53, 44, 255), (65, 46, 252), (63, 33, 251), + (31, 9, 255), (30, 9, 253), (29, 10, 252), (31, 12, 254), + (48, 24, 255), (67, 43, 255), (68, 49, 255), (70, 51, 255), + (73, 52, 255), (74, 53, 254), (74, 51, 255), (83, 51, 255), + (111, 67, 216), (127, 77, 198), (152, 90, 173), (177, 103, 136), + (199, 116, 112), (216, 129, 99), (219, 133, 98), (224, 135, 91), + (233, 142, 85), (235, 145, 83), (239, 145, 81), (235, 147, 84), + (234, 144, 84), (224, 138, 91), (219, 133, 98), (207, 121, 108), + (184, 113, 143), (143, 87, 184), (113, 67, 215), (84, 32, 241), + (38, 17, 255), (26, 7, 247), (27, 7, 244), (34, 7, 182), + (66, 42, 154), (113, 70, 178), (166, 100, 162), (189, 118, 136), + (215, 129, 104), (227, 139, 93), (240, 148, 81), (249, 156, 78), + (254, 163, 72), (255, 164, 71), (254, 164, 68), (255, 164, 71), + (254, 163, 72), (254, 163, 72), (246, 155, 76), (229, 157, 81), + (205, 171, 99), (172, 152, 93), (160, 115, 120), (166, 112, 146), + (180, 109, 149), (195, 116, 119), (202, 118, 107), (211, 128, 98), + (222, 134, 96), (228, 138, 88), (234, 144, 84), (242, 149, 80), + (243, 150, 80), (244, 150, 80), (255, 146, 80), (255, 150, 74), + (253, 157, 73), (255, 161, 71), (251, 156, 74), (243, 150, 80) + ), + +// 194 Apophysis-040427-4BorgEY +((136, 117, 102), (140, 124, 101), (139, 127, 100), (139, 130, 99), + (139, 132, 100), (140, 134, 102), (140, 134, 102), (140, 134, 102), + (139, 135, 100), (140, 137, 99), (141, 139, 98), (140, 138, 97), + (140, 137, 96), (140, 138, 97), (141, 139, 98), (140, 138, 98), + (140, 138, 99), (142, 138, 101), (140, 130, 100), (138, 123, 100), + (138, 125, 100), (139, 127, 101), (138, 123, 101), (137, 120, 102), + (135, 110, 103), (130, 100, 103), (126, 90, 104), (121, 64, 99), + (117, 38, 95), (104, 26, 91), (92, 15, 87), (79, 2, 80), + (29, 0, 80), (2, 0, 1), (38, 8, 21), (74, 16, 41), + (79, 8, 53), (85, 0, 65), (81, 0, 70), (77, 1, 75), + (118, 23, 105), (122, 48, 107), (126, 74, 110), (128, 84, 111), + (131, 94, 112), (132, 96, 112), (134, 98, 112), (135, 104, 112), + (136, 106, 106), (133, 105, 104), (132, 104, 104), (132, 103, 105), + (134, 104, 107), (136, 105, 110), (135, 107, 108), (135, 110, 106), + (140, 115, 110), (139, 117, 107), (138, 119, 104), (137, 122, 103), + (137, 125, 103), (137, 125, 101), (138, 126, 100), (140, 129, 99), + (139, 130, 99), (140, 131, 102), (141, 129, 104), (143, 128, 107), + (143, 129, 107), (143, 131, 107), (143, 132, 104), (142, 133, 104), + (139, 129, 102), (140, 132, 102), (142, 136, 102), (140, 131, 103), + (139, 127, 105), (138, 126, 104), (138, 126, 104), (138, 126, 104), + (140, 125, 104), (138, 123, 104), (138, 119, 104), (138, 116, 105), + (137, 113, 106), (136, 111, 107), (136, 108, 105), (134, 108, 107), + (130, 97, 108), (131, 98, 107), (133, 100, 107), (133, 102, 106), + (134, 104, 106), (135, 107, 104), (136, 111, 106), (136, 113, 107), + (137, 114, 108), (137, 119, 105), (138, 122, 103), (140, 125, 102), + (139, 126, 102), (139, 127, 103), (139, 128, 100), (138, 126, 100), + (139, 124, 101), (138, 122, 102), (138, 121, 103), (137, 120, 102), + (137, 120, 102), (137, 120, 102), (136, 117, 103), (136, 114, 103), + (137, 118, 104), (138, 123, 104), (138, 123, 104), (138, 123, 104), + (139, 124, 105), (139, 124, 105), (137, 125, 103), (135, 123, 99), + (135, 116, 99), (138, 119, 104), (142, 123, 109), (144, 126, 112), + (147, 129, 115), (143, 112, 117), (135, 96, 117), (131, 92, 110), + (128, 83, 112), (123, 77, 106), (120, 70, 105), (118, 63, 105), + (118, 59, 105), (116, 57, 105), (117, 57, 111), (116, 45, 113), + (117, 63, 99), (112, 60, 84), (108, 58, 69), (105, 52, 71), + (103, 47, 74), (96, 22, 85), (89, 8, 85), (90, 20, 83), + (93, 38, 69), (113, 85, 71), (119, 92, 78), (125, 99, 86), + (130, 98, 101), (131, 103, 99), (136, 103, 84), (116, 82, 70), + (112, 80, 67), (117, 76, 78), (123, 72, 89), (130, 91, 94), + (132, 94, 107), (130, 97, 108), (133, 104, 109), (135, 109, 108), + (135, 109, 108), (137, 113, 111), (138, 114, 111), (140, 116, 112), + (140, 117, 109), (143, 126, 110), (146, 124, 113), (160, 141, 111), + (141, 140, 94), (140, 141, 93), (139, 143, 92), (140, 139, 95), + (139, 137, 96), (139, 137, 96), (140, 136, 99), (140, 128, 102), + (138, 123, 100), (137, 115, 104), (134, 105, 109), (131, 92, 113), + (138, 71, 122), (148, 58, 110), (153, 67, 132), (180, 88, 153), + (136, 103, 114), (134, 102, 110), (133, 102, 107), (130, 94, 104), + (120, 68, 106), (111, 45, 106), (103, 14, 104), (100, 25, 90), + (109, 46, 101), (125, 76, 105), (130, 114, 89), (136, 133, 80), + (143, 161, 85), (151, 167, 94), (147, 151, 100), (146, 151, 95), + (143, 142, 94), (140, 137, 92), (139, 136, 93), (138, 129, 98), + (138, 122, 99), (136, 119, 99), (132, 113, 99), (134, 110, 100), + (130, 100, 102), (129, 96, 103), (121, 75, 104), (105, 52, 80), + (72, 29, 48), (72, 27, 47), (72, 25, 35), (90, 59, 38), + (108, 79, 61), (124, 93, 88), (126, 88, 99), (128, 84, 107), + (124, 76, 114), (128, 81, 113), (130, 88, 110), (132, 93, 111), + (136, 106, 108), (138, 126, 100), (143, 146, 91), (144, 172, 85), + (167, 184, 90), (170, 208, 99), (152, 174, 109), (156, 167, 109), + (170, 178, 165), (149, 150, 116), (147, 149, 102), (141, 139, 98), + (138, 132, 96), (138, 132, 96), (137, 132, 94), (133, 124, 91), + (137, 123, 97), (136, 117, 103), (137, 114, 106), (135, 111, 107), + (137, 108, 110), (137, 108, 110), (137, 108, 110), (139, 110, 112), + (138, 115, 107), (137, 117, 106), (137, 117, 106), (137, 118, 104), + (136, 117, 103), (134, 114, 105), (134, 115, 101), (136, 114, 101) + ), + +// 195 Apophysis-040427-4BB4 +((156, 137, 8), (161, 145, 10), (162, 146, 7), (164, 147, 5), + (163, 146, 7), (162, 146, 9), (161, 144, 10), (160, 143, 11), + (157, 143, 12), (158, 143, 12), (160, 143, 13), (161, 144, 13), + (163, 146, 14), (164, 146, 11), (165, 147, 9), (165, 147, 9), + (166, 148, 10), (166, 149, 9), (167, 147, 8), (169, 146, 8), + (166, 147, 10), (164, 148, 13), (164, 147, 14), (164, 147, 15), + (167, 146, 18), (165, 146, 17), (164, 147, 17), (162, 147, 16), + (161, 147, 16), (162, 146, 15), (163, 146, 14), (166, 148, 14), + (171, 153, 15), (184, 166, 8), (217, 202, 7), (250, 238, 6), + (252, 243, 7), (254, 249, 9), (254, 246, 9), (254, 244, 9), + (188, 171, 19), (176, 158, 19), (164, 146, 20), (150, 122, 42), + (137, 98, 65), (166, 79, 64), (196, 60, 64), (194, 41, 46), + (176, 37, 42), (174, 38, 42), (170, 36, 41), (166, 35, 40), + (166, 35, 40), (167, 36, 41), (161, 85, 35), (155, 134, 29), + (188, 172, 24), (220, 200, 17), (253, 228, 11), (254, 227, 10), + (255, 227, 9), (253, 227, 9), (252, 227, 10), (198, 174, 6), + (182, 166, 19), (92, 171, 44), (81, 159, 33), (71, 147, 23), + (69, 143, 23), (67, 140, 23), (117, 101, 6), (145, 109, 31), + (134, 121, 7), (144, 130, 9), (155, 140, 11), (159, 143, 12), + (163, 146, 14), (165, 149, 15), (168, 152, 17), (179, 162, 22), + (184, 169, 26), (195, 181, 58), (197, 183, 59), (200, 186, 61), + (220, 210, 39), (240, 234, 18), (252, 251, 13), (251, 255, 8), + (255, 255, 6), (255, 249, 4), (255, 244, 2), (253, 238, 5), + (251, 233, 9), (241, 214, 19), (183, 168, 17), (169, 151, 13), + (154, 137, 7), (114, 100, 3), (133, 114, 15), (152, 128, 28), + (154, 133, 21), (157, 139, 15), (155, 137, 9), (155, 138, 8), + (159, 141, 13), (160, 141, 18), (162, 141, 24), (162, 134, 40), + (162, 128, 57), (188, 100, 90), (198, 67, 73), (200, 65, 71), + (206, 90, 93), (201, 187, 64), (209, 196, 51), (218, 205, 39), + (254, 231, 13), (255, 250, 14), (255, 243, 22), (253, 226, 12), + (178, 167, 52), (176, 150, 47), (174, 133, 43), (169, 132, 55), + (165, 131, 68), (148, 110, 87), (128, 128, 190), (121, 120, 190), + (100, 98, 181), (74, 83, 174), (70, 74, 166), (66, 65, 159), + (66, 65, 159), (65, 64, 158), (65, 64, 158), (65, 64, 157), + (62, 62, 152), (98, 81, 111), (135, 100, 70), (135, 100, 71), + (135, 100, 72), (63, 63, 153), (64, 63, 156), (58, 56, 140), + (64, 137, 22), (127, 131, 10), (131, 128, 6), (135, 125, 2), + (154, 137, 5), (155, 138, 8), (156, 139, 9), (158, 141, 11), + (161, 147, 16), (162, 147, 16), (164, 147, 17), (170, 152, 18), + (183, 167, 22), (188, 176, 56), (209, 200, 97), (209, 200, 97), + (216, 210, 148), (234, 198, 200), (228, 174, 176), (222, 150, 153), + (204, 191, 76), (183, 172, 56), (170, 158, 36), (154, 135, 33), + (142, 117, 50), (106, 132, 36), (71, 147, 23), (74, 155, 26), + (76, 159, 27), (121, 186, 82), (135, 191, 100), (134, 190, 99), + (92, 171, 46), (75, 161, 26), (73, 154, 25), (71, 150, 25), + (68, 143, 24), (68, 143, 24), (136, 104, 66), (137, 108, 68), + (177, 161, 22), (191, 171, 20), (205, 181, 19), (254, 227, 13), + (255, 248, 9), (255, 254, 9), (255, 255, 14), (255, 251, 9), + (249, 229, 10), (189, 166, 28), (151, 124, 57), (141, 107, 69), + (149, 112, 85), (154, 122, 61), (175, 151, 55), (182, 153, 61), + (188, 152, 56), (167, 149, 23), (165, 151, 20), (167, 153, 18), + (164, 150, 17), (163, 149, 18), (165, 147, 21), (172, 158, 36), + (178, 166, 54), (154, 197, 126), (231, 201, 201), (228, 227, 223), + (199, 216, 184), (144, 191, 111), (157, 186, 106), (145, 165, 54), + (163, 148, 21), (164, 147, 17), (165, 148, 16), (167, 151, 16), + (169, 153, 18), (170, 153, 23), (179, 162, 20), (181, 164, 22), + (175, 157, 21), (168, 152, 17), (162, 148, 17), (162, 148, 15), + (162, 145, 15), (159, 145, 14), (159, 144, 17), (162, 145, 15), + (160, 141, 12), (158, 140, 12), (156, 138, 12), (160, 141, 12), + (160, 142, 16), (161, 143, 19), (162, 144, 18), (163, 146, 16), + (162, 145, 15), (164, 145, 14), (162, 145, 13), (162, 144, 10), + (160, 144, 5), (157, 141, 4), (155, 139, 4), (156, 137, 6), + (156, 139, 7), (156, 139, 9), (159, 142, 12), (159, 142, 12), + (162, 143, 12), (162, 145, 13), (160, 143, 11), (160, 143, 13) + ), + +// 196 Apophysis-040427-4BflyWindw2 +((2, 2, 2), (28, 75, 93), (34, 90, 96), (41, 106, 100), + (61, 80, 100), (81, 55, 100), (100, 61, 117), (120, 68, 134), + (188, 12, 147), (172, 8, 111), (156, 5, 76), (105, 3, 58), + (54, 2, 40), (43, 4, 38), (33, 6, 37), (35, 8, 39), + (37, 10, 41), (96, 19, 99), (125, 34, 121), (154, 49, 144), + (150, 39, 145), (147, 30, 147), (132, 29, 128), (117, 28, 110), + (54, 17, 61), (32, 8, 34), (11, 0, 8), (6, 1, 5), + (2, 2, 2), (2, 2, 2), (2, 2, 2), (2, 2, 2), + (2, 2, 2), (16, 21, 17), (44, 35, 15), (73, 49, 13), + (99, 68, 19), (126, 88, 25), (138, 94, 27), (151, 101, 30), + (188, 113, 11), (210, 112, 22), (232, 112, 34), (212, 136, 41), + (192, 160, 49), (216, 188, 58), (241, 217, 67), (228, 220, 145), + (254, 254, 246), (255, 253, 253), (255, 252, 250), (255, 251, 248), + (253, 153, 233), (252, 56, 218), (230, 58, 201), (209, 61, 185), + (146, 41, 134), (96, 26, 89), (46, 12, 45), (30, 8, 26), + (14, 5, 8), (23, 8, 10), (33, 11, 13), (87, 53, 15), + (123, 82, 30), (185, 196, 104), (190, 191, 137), (195, 186, 171), + (175, 166, 140), (155, 147, 110), (142, 139, 122), (116, 76, 128), + (53, 114, 132), (48, 134, 105), (43, 155, 79), (47, 129, 93), + (51, 104, 108), (44, 101, 108), (38, 98, 109), (37, 99, 114), + (45, 102, 129), (65, 108, 115), (109, 131, 141), (153, 155, 168), + (178, 178, 177), (204, 201, 186), (228, 246, 250), (255, 255, 217), + (130, 195, 191), (140, 130, 179), (150, 65, 168), (156, 67, 173), + (162, 70, 179), (241, 44, 209), (254, 15, 222), (255, 4, 247), + (255, 18, 234), (174, 75, 168), (138, 70, 148), (102, 66, 128), + (100, 70, 125), (99, 75, 123), (86, 86, 78), (124, 102, 63), + (117, 147, 113), (119, 115, 120), (121, 84, 128), (113, 67, 122), + (106, 51, 116), (78, 40, 123), (66, 37, 83), (46, 12, 39), + (24, 6, 22), (2, 2, 2), (2, 2, 2), (2, 2, 2), + (2, 2, 2), (2, 2, 2), (2, 2, 2), (2, 2, 2), + (1, 2, 4), (12, 10, 24), (23, 19, 44), (31, 22, 46), + (39, 25, 48), (65, 37, 62), (64, 38, 67), (47, 21, 60), + (18, 38, 49), (12, 15, 30), (6, 7, 20), (0, 0, 11), + (2, 2, 2), (1, 3, 0), (2, 2, 2), (2, 2, 2), + (2, 0, 1), (1, 0, 1), (1, 1, 1), (1, 1, 1), + (1, 1, 1), (1, 1, 1), (1, 1, 1), (2, 2, 2), + (2, 2, 2), (2, 2, 2), (2, 2, 2), (2, 2, 2), + (2, 2, 2), (2, 2, 2), (17, 23, 19), (14, 69, 37), + (68, 156, 10), (75, 168, 10), (82, 181, 10), (57, 219, 11), + (70, 205, 40), (62, 148, 39), (48, 137, 57), (66, 106, 69), + (68, 104, 30), (55, 65, 30), (39, 43, 25), (23, 22, 20), + (6, 14, 1), (2, 2, 2), (17, 21, 0), (65, 78, 9), + (101, 85, 33), (110, 98, 40), (119, 111, 48), (125, 101, 55), + (107, 97, 48), (72, 59, 43), (23, 32, 31), (9, 20, 16), + (2, 2, 2), (2, 2, 2), (25, 14, 0), (48, 34, 5), + (58, 40, 0), (55, 59, 0), (56, 81, 0), (49, 114, 14), + (157, 183, 22), (166, 186, 15), (175, 189, 8), (163, 172, 45), + (149, 126, 32), (93, 85, 72), (100, 23, 79), (84, 14, 50), + (55, 17, 56), (25, 34, 51), (20, 68, 68), (36, 70, 72), + (47, 86, 85), (69, 79, 78), (69, 67, 89), (106, 24, 90), + (181, 12, 113), (219, 13, 148), (255, 8, 208), (247, 26, 219), + (233, 86, 128), (165, 137, 133), (190, 159, 102), (207, 141, 57), + (176, 119, 40), (135, 86, 27), (136, 35, 49), (109, 5, 66), + (78, 29, 94), (35, 50, 73), (42, 67, 89), (46, 63, 83), + (61, 35, 72), (70, 32, 73), (78, 19, 65), (74, 12, 61), + (64, 5, 51), (44, 1, 31), (33, 8, 30), (29, 3, 28), + (26, 2, 24), (23, 10, 30), (15, 28, 37), (17, 44, 35), + (22, 64, 24), (66, 76, 16), (99, 76, 24), (98, 77, 34), + (116, 74, 24), (110, 67, 16), (114, 66, 0), (127, 79, 13), + (138, 76, 29), (159, 108, 77), (132, 45, 90), (144, 43, 135), + (171, 27, 151), (145, 51, 147), (82, 61, 120), (67, 76, 115), + (66, 78, 76), (60, 46, 59), (75, 45, 53), (70, 55, 48), + (53, 54, 38), (14, 37, 43), (12, 35, 41), (16, 13, 22), + (2, 2, 2), (2, 2, 2), (2, 2, 2), (2, 2, 2) + ), + +// 197 Apophysis-040427-4BflyWndw3 +((49, 55, 81), (81, 40, 96), (82, 31, 94), (83, 22, 92), + (68, 17, 67), (53, 12, 42), (26, 6, 21), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (1, 1, 0), + (2, 3, 0), (11, 27, 35), (21, 52, 70), (33, 50, 75), + (46, 49, 80), (78, 41, 93), (94, 37, 100), (111, 33, 108), + (117, 28, 111), (123, 24, 114), (126, 23, 115), (129, 22, 116), + (140, 31, 120), (136, 26, 118), (132, 21, 116), (125, 24, 114), + (119, 27, 112), (114, 35, 108), (109, 43, 105), (150, 147, 116), + (192, 187, 183), (249, 243, 209), (251, 235, 172), (253, 228, 135), + (226, 193, 116), (199, 159, 98), (191, 141, 72), (183, 124, 46), + (137, 99, 37), (108, 77, 26), (80, 55, 15), (40, 27, 7), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (50, 26, 3), (100, 53, 7), (156, 103, 41), + (212, 153, 75), (232, 179, 91), (252, 206, 108), (252, 218, 128), + (183, 190, 138), (125, 161, 147), (106, 116, 86), (88, 71, 25), + (92, 70, 22), (96, 70, 19), (94, 80, 15), (100, 99, 17), + (183, 71, 7), (202, 44, 72), (221, 17, 138), (235, 15, 145), + (250, 13, 153), (228, 103, 148), (207, 193, 144), (252, 217, 133), + (252, 219, 122), (187, 144, 31), (138, 107, 20), (90, 70, 9), + (79, 68, 19), (69, 67, 29), (38, 51, 60), (29, 49, 73), + (35, 58, 76), (48, 78, 52), (61, 98, 29), (66, 120, 26), + (71, 142, 24), (67, 161, 47), (84, 158, 45), (109, 172, 67), + (167, 143, 81), (240, 173, 69), (225, 154, 47), (211, 135, 25), + (191, 119, 27), (172, 104, 29), (136, 77, 7), (113, 67, 7), + (28, 62, 48), (28, 59, 60), (28, 57, 73), (33, 54, 75), + (39, 51, 77), (49, 43, 81), (74, 39, 93), (87, 39, 97), + (95, 33, 100), (98, 39, 103), (95, 41, 102), (93, 43, 102), + (91, 39, 101), (74, 44, 94), (69, 53, 90), (62, 58, 85), + (57, 50, 84), (52, 48, 82), (48, 47, 81), (48, 43, 68), + (48, 39, 56), (69, 45, 19), (83, 54, 14), (85, 64, 17), + (95, 103, 18), (96, 126, 2), (95, 119, 6), (95, 113, 11), + (95, 108, 16), (81, 99, 23), (76, 60, 86), (92, 38, 100), + (110, 27, 107), (106, 28, 105), (102, 30, 103), (103, 31, 103), + (104, 33, 103), (117, 33, 111), (128, 30, 117), (132, 27, 119), + (137, 23, 118), (221, 1, 153), (209, 3, 149), (198, 6, 145), + (146, 27, 129), (131, 31, 117), (110, 37, 108), (146, 115, 97), + (169, 199, 237), (204, 224, 238), (239, 249, 240), (255, 254, 253), + (247, 244, 225), (246, 191, 161), (198, 173, 119), (218, 13, 142), + (249, 3, 150), (247, 3, 160), (240, 4, 160), (234, 5, 160), + (198, 6, 145), (138, 19, 119), (141, 5, 113), (134, 1, 106), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (1, 1, 1), (23, 30, 56), (45, 45, 79), (46, 56, 81), + (38, 49, 77), (31, 41, 71), (25, 34, 65), (27, 9, 33), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (29, 41, 39), (54, 79, 40), (65, 109, 20), (69, 132, 2), + (53, 139, 16), (10, 121, 3), (8, 107, 25), (15, 91, 44), + (22, 76, 63), (20, 56, 70), (22, 53, 71), (21, 61, 73), + (22, 62, 70), (6, 80, 55), (1, 102, 36), (29, 133, 12), + (64, 142, 23), (87, 148, 27), (112, 148, 22), (98, 107, 14), + (63, 101, 26), (65, 60, 83), (75, 53, 92), (87, 50, 94), + (83, 53, 91), (130, 161, 101), (135, 190, 106), (114, 174, 148), + (110, 137, 128), (77, 58, 88), (67, 49, 87), (51, 33, 73), + (24, 32, 78), (2, 20, 42), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (57, 37, 10), + (73, 101, 24), (81, 103, 21), (66, 90, 32), (75, 59, 85), + (79, 42, 94), (88, 38, 99), (89, 47, 97), (78, 54, 90), + (67, 58, 85), (64, 60, 83), (52, 60, 81), (47, 67, 74), + (40, 72, 69), (44, 52, 37), (67, 43, 17), (56, 58, 34), + (36, 46, 38), (30, 53, 45), (33, 51, 75), (46, 58, 80) + ), + +// 198 Apophysis-040427-4ChalLghtDrknss +((93, 98, 130), (225, 205, 198), (232, 213, 201), (240, 221, 204), + (241, 221, 200), (243, 221, 197), (244, 221, 196), (246, 222, 196), + (240, 216, 188), (231, 212, 194), (222, 209, 201), (157, 158, 178), + (93, 107, 156), (85, 95, 138), (78, 84, 120), (86, 87, 115), + (94, 91, 110), (238, 214, 180), (241, 219, 188), (245, 224, 197), + (239, 222, 204), (234, 221, 212), (234, 221, 213), (235, 222, 214), + (228, 218, 219), (222, 213, 219), (217, 209, 220), (223, 214, 219), + (230, 220, 218), (230, 220, 218), (230, 220, 218), (235, 222, 214), + (237, 225, 213), (244, 226, 204), (242, 227, 211), (241, 228, 219), + (242, 231, 222), (244, 234, 225), (242, 232, 225), (240, 231, 226), + (240, 228, 216), (232, 221, 211), (225, 215, 206), (157, 152, 185), + (90, 90, 164), (61, 72, 165), (33, 55, 167), (20, 31, 146), + (23, 43, 114), (41, 45, 70), (51, 54, 67), (62, 63, 65), + (68, 71, 83), (74, 79, 101), (76, 83, 113), (79, 87, 126), + (106, 109, 178), (135, 137, 200), (165, 166, 222), (197, 192, 219), + (229, 218, 216), (233, 220, 211), (238, 222, 207), (244, 226, 206), + (247, 226, 205), (240, 216, 188), (239, 207, 167), (238, 198, 146), + (193, 164, 118), (148, 130, 90), (115, 103, 81), (81, 78, 69), + (69, 66, 51), (69, 65, 48), (70, 65, 45), (72, 72, 52), + (75, 80, 60), (81, 85, 66), (88, 91, 72), (119, 99, 46), + (213, 154, 60), (241, 212, 178), (241, 213, 181), (242, 215, 185), + (239, 214, 183), (236, 213, 182), (217, 200, 180), (113, 114, 116), + (71, 70, 68), (67, 65, 60), (63, 60, 53), (62, 60, 50), + (62, 60, 48), (62, 58, 47), (58, 57, 52), (56, 55, 51), + (51, 49, 50), (27, 30, 39), (16, 18, 25), (5, 6, 11), + (3, 3, 10), (2, 1, 9), (0, 3, 36), (10, 22, 48), + (57, 57, 93), (86, 85, 99), (116, 113, 106), (157, 137, 107), + (198, 161, 108), (246, 199, 143), (234, 188, 126), (121, 114, 106), + (83, 79, 78), (17, 26, 31), (14, 21, 26), (11, 16, 22), + (17, 14, 35), (31, 30, 38), (49, 49, 49), (52, 53, 48), + (59, 58, 40), (63, 60, 45), (67, 63, 51), (69, 65, 49), + (72, 67, 47), (76, 69, 50), (75, 68, 50), (72, 69, 60), + (73, 71, 82), (70, 74, 111), (64, 68, 113), (59, 62, 115), + (50, 66, 177), (95, 104, 209), (108, 115, 222), (176, 177, 221), + (228, 220, 217), (214, 210, 217), (201, 200, 218), (181, 180, 219), + (162, 161, 221), (104, 114, 167), (78, 87, 130), (60, 69, 108), + (54, 60, 74), (27, 26, 32), (18, 18, 22), (10, 11, 13), + (10, 4, 4), (11, 11, 11), (24, 28, 29), (33, 33, 45), + (49, 50, 54), (52, 52, 54), (55, 55, 55), (55, 56, 61), + (62, 62, 62), (65, 64, 59), (64, 63, 58), (67, 63, 51), + (66, 62, 50), (55, 52, 61), (51, 50, 61), (47, 49, 61), + (37, 45, 64), (39, 32, 65), (11, 21, 46), (26, 30, 39), + (59, 58, 66), (64, 64, 70), (69, 70, 75), (91, 92, 96), + (133, 126, 120), (216, 192, 158), (240, 211, 177), (241, 215, 180), + (240, 216, 190), (244, 226, 206), (242, 225, 209), (247, 225, 202), + (242, 222, 198), (241, 216, 185), (230, 214, 191), (192, 182, 181), + (88, 93, 131), (82, 87, 122), (77, 82, 114), (72, 79, 108), + (67, 79, 103), (73, 78, 100), (75, 73, 94), (77, 80, 69), + (71, 68, 59), (71, 67, 55), (72, 66, 52), (72, 66, 50), + (68, 66, 54), (72, 68, 56), (71, 61, 69), (67, 67, 67), + (62, 62, 62), (60, 59, 65), (51, 54, 63), (50, 52, 65), + (55, 52, 63), (62, 62, 64), (65, 69, 70), (63, 66, 75), + (69, 73, 85), (72, 76, 101), (69, 75, 101), (68, 70, 82), + (66, 67, 71), (65, 66, 71), (65, 67, 79), (67, 65, 89), + (67, 65, 89), (65, 65, 89), (57, 62, 81), (50, 52, 67), + (52, 52, 60), (53, 55, 54), (53, 55, 50), (52, 52, 50), + (50, 51, 46), (44, 44, 42), (34, 35, 29), (41, 39, 1), + (44, 47, 40), (51, 52, 46), (52, 52, 50), (54, 55, 50), + (61, 61, 53), (63, 63, 63), (69, 69, 67), (71, 75, 74), + (80, 81, 76), (80, 83, 92), (87, 87, 89), (104, 94, 95), + (115, 112, 97), (95, 94, 99), (79, 78, 92), (77, 81, 110), + (78, 83, 115), (98, 97, 111), (120, 130, 122), (204, 191, 183), + (240, 216, 182), (241, 215, 182), (243, 210, 169), (229, 197, 150), + (118, 109, 110), (68, 71, 80), (18, 27, 56), (56, 62, 96) + ), + +// 199 Apophysis-040427-4ChalicDrknsIce +((153, 141, 41), (36, 39, 30), (25, 32, 35), (14, 26, 40), + (12, 28, 49), (11, 31, 58), (11, 33, 62), (12, 35, 67), + (105, 106, 111), (131, 131, 127), (158, 156, 143), (163, 161, 154), + (168, 167, 165), (169, 168, 167), (170, 170, 170), (171, 171, 170), + (173, 172, 170), (168, 168, 168), (167, 168, 176), (166, 169, 184), + (164, 167, 193), (162, 166, 203), (165, 168, 194), (168, 171, 186), + (171, 173, 185), (174, 176, 184), (178, 179, 184), (175, 176, 183), + (173, 173, 183), (169, 167, 182), (166, 161, 181), (158, 164, 180), + (160, 163, 170), (160, 155, 133), (155, 149, 118), (151, 143, 104), + (92, 93, 77), (34, 43, 50), (27, 36, 45), (21, 29, 40), + (10, 24, 35), (9, 25, 40), (9, 26, 46), (10, 30, 56), + (11, 34, 66), (10, 34, 68), (9, 35, 70), (14, 58, 129), + (102, 116, 161), (160, 157, 148), (160, 159, 154), (161, 161, 161), + (162, 161, 164), (163, 162, 167), (164, 164, 166), (166, 166, 166), + (166, 173, 179), (174, 178, 181), (183, 183, 183), (192, 193, 191), + (201, 203, 200), (201, 202, 203), (202, 201, 207), (201, 204, 223), + (198, 203, 225), (179, 180, 184), (157, 155, 160), (135, 130, 136), + (114, 110, 116), (93, 90, 97), (25, 42, 60), (11, 31, 56), + (15, 31, 47), (52, 58, 61), (89, 85, 76), (121, 116, 101), + (153, 148, 126), (156, 154, 136), (159, 161, 147), (164, 177, 149), + (173, 171, 158), (181, 178, 143), (178, 172, 138), (176, 167, 134), + (167, 162, 135), (158, 157, 137), (153, 158, 136), (163, 161, 149), + (174, 178, 163), (186, 189, 175), (199, 201, 187), (201, 199, 185), + (203, 197, 183), (223, 209, 172), (214, 204, 145), (201, 188, 153), + (186, 182, 171), (163, 166, 181), (161, 164, 175), (159, 162, 169), + (159, 160, 165), (159, 159, 161), (148, 156, 145), (142, 143, 129), + (11, 48, 101), (19, 64, 142), (27, 80, 184), (38, 88, 193), + (49, 96, 202), (91, 117, 192), (105, 124, 183), (141, 150, 183), + (150, 155, 161), (144, 145, 150), (114, 120, 143), (84, 96, 136), + (28, 42, 68), (13, 33, 60), (9, 29, 56), (7, 25, 47), + (5, 22, 40), (7, 21, 36), (9, 21, 33), (9, 19, 28), + (10, 17, 23), (8, 15, 21), (14, 19, 25), (18, 26, 28), + (38, 40, 27), (106, 117, 83), (129, 130, 95), (152, 144, 107), + (179, 164, 143), (195, 192, 183), (221, 213, 194), (233, 221, 199), + (241, 226, 193), (226, 217, 209), (212, 208, 225), (208, 209, 228), + (204, 210, 232), (233, 227, 241), (238, 232, 244), (224, 225, 207), + (218, 221, 202), (190, 187, 180), (186, 181, 178), (182, 176, 176), + (168, 168, 166), (162, 158, 146), (146, 143, 128), (116, 116, 106), + (27, 36, 45), (33, 37, 43), (39, 39, 41), (93, 96, 85), + (124, 125, 120), (153, 150, 141), (185, 172, 163), (195, 191, 182), + (206, 202, 201), (212, 206, 218), (208, 202, 214), (205, 199, 211), + (185, 185, 193), (186, 186, 188), (178, 179, 184), (173, 174, 179), + (175, 175, 177), (176, 176, 175), (177, 178, 173), (182, 179, 172), + (185, 177, 175), (191, 181, 171), (190, 181, 172), (186, 185, 181), + (187, 185, 186), (182, 183, 188), (181, 181, 191), (181, 180, 198), + (183, 184, 189), (183, 183, 185), (183, 183, 183), (178, 177, 182), + (173, 173, 181), (172, 172, 180), (171, 171, 179), (173, 173, 173), + (174, 171, 166), (168, 167, 163), (175, 172, 163), (177, 175, 152), + (180, 174, 138), (162, 157, 138), (159, 159, 151), (163, 162, 158), + (167, 168, 163), (172, 172, 164), (167, 167, 159), (167, 164, 155), + (154, 153, 133), (149, 136, 119), (118, 119, 113), (75, 75, 63), + (34, 44, 43), (19, 28, 35), (15, 24, 31), (13, 22, 29), + (13, 22, 29), (8, 18, 30), (7, 17, 27), (4, 16, 28), + (7, 19, 31), (6, 20, 33), (6, 19, 35), (11, 23, 35), + (13, 22, 31), (14, 23, 30), (14, 24, 36), (15, 24, 41), + (7, 24, 42), (11, 26, 45), (8, 30, 54), (7, 30, 61), + (9, 29, 56), (12, 28, 53), (9, 27, 51), (11, 29, 53), + (11, 30, 60), (11, 35, 69), (55, 59, 94), (93, 108, 151), + (134, 146, 188), (151, 158, 186), (162, 159, 150), (154, 143, 115), + (142, 132, 79), (75, 74, 26), (55, 56, 25), (37, 41, 26), + (19, 27, 29), (18, 26, 29), (18, 26, 28), (17, 25, 27), + (15, 24, 29), (17, 24, 30), (18, 26, 29), (24, 33, 40), + (48, 51, 24), (61, 63, 24), (143, 133, 38), (164, 149, 48), + (201, 178, 64), (177, 156, 101), (158, 150, 113), (143, 140, 121) + ), + +// 200 Apophysis-040427-4CactusFlwer +((130, 133, 104), (131, 131, 103), (155, 120, 100), (180, 110, 98), + (191, 135, 116), (202, 160, 135), (189, 164, 134), (177, 169, 133), + (134, 134, 108), (128, 126, 108), (122, 118, 109), (119, 123, 100), + (116, 128, 92), (118, 118, 84), (120, 109, 77), (117, 106, 77), + (114, 104, 77), (123, 97, 84), (129, 99, 78), (135, 101, 73), + (123, 106, 73), (111, 111, 73), (111, 112, 73), (111, 113, 74), + (97, 121, 63), (93, 105, 58), (90, 90, 54), (94, 94, 63), + (99, 99, 73), (101, 101, 78), (104, 103, 83), (124, 106, 104), + (132, 126, 114), (183, 182, 162), (216, 203, 200), (249, 225, 239), + (235, 205, 212), (222, 186, 186), (227, 167, 162), (233, 149, 138), + (151, 133, 97), (133, 124, 89), (115, 116, 82), (122, 120, 91), + (129, 125, 100), (135, 126, 108), (142, 128, 117), (169, 168, 147), + (190, 189, 171), (201, 198, 215), (211, 216, 218), (221, 235, 222), + (215, 231, 215), (210, 227, 208), (207, 216, 200), (205, 206, 192), + (178, 198, 186), (171, 195, 163), (164, 192, 141), (164, 197, 159), + (165, 203, 178), (175, 193, 174), (186, 184, 171), (181, 180, 162), + (170, 171, 153), (124, 132, 134), (108, 117, 107), (93, 102, 81), + (91, 92, 72), (90, 83, 64), (91, 73, 59), (70, 71, 53), + (61, 61, 51), (60, 56, 43), (60, 51, 36), (61, 51, 34), + (63, 52, 32), (66, 58, 32), (70, 65, 33), (77, 74, 41), + (78, 87, 56), (117, 121, 96), (136, 137, 116), (155, 154, 136), + (158, 157, 135), (161, 161, 135), (157, 157, 129), (155, 148, 104), + (115, 130, 73), (104, 105, 60), (94, 81, 47), (86, 78, 45), + (78, 75, 44), (80, 77, 42), (98, 63, 25), (106, 73, 32), + (104, 84, 49), (111, 114, 93), (122, 129, 116), (134, 145, 139), + (149, 154, 139), (164, 164, 140), (172, 172, 148), (176, 175, 154), + (189, 182, 153), (175, 173, 149), (162, 165, 146), (142, 159, 142), + (122, 154, 139), (107, 120, 113), (88, 106, 92), (84, 92, 71), + (78, 82, 55), (79, 100, 59), (87, 98, 62), (95, 96, 65), + (105, 109, 76), (117, 127, 102), (123, 146, 118), (156, 167, 133), + (162, 162, 138), (149, 150, 116), (137, 138, 94), (133, 123, 87), + (130, 109, 80), (134, 89, 60), (146, 72, 69), (123, 74, 60), + (122, 83, 42), (68, 52, 36), (63, 46, 27), (59, 41, 19), + (29, 20, 11), (27, 21, 0), (20, 20, 8), (20, 20, 8), + (24, 24, 12), (36, 35, 19), (49, 47, 26), (52, 46, 25), + (56, 45, 25), (53, 43, 16), (42, 39, 6), (48, 46, 0), + (62, 53, 0), (55, 52, 19), (56, 52, 20), (57, 52, 22), + (54, 56, 34), (63, 64, 32), (66, 68, 31), (66, 65, 37), + (72, 72, 46), (68, 70, 44), (65, 69, 42), (62, 65, 38), + (61, 61, 35), (45, 51, 37), (39, 44, 21), (29, 32, 21), + (24, 28, 11), (43, 59, 32), (50, 61, 36), (58, 63, 41), + (82, 78, 49), (106, 87, 54), (112, 94, 72), (108, 109, 75), + (110, 116, 56), (109, 109, 58), (108, 103, 61), (105, 106, 75), + (114, 97, 67), (129, 111, 49), (131, 97, 33), (136, 105, 59), + (138, 118, 65), (148, 113, 81), (151, 110, 80), (161, 101, 90), + (143, 126, 100), (129, 104, 97), (110, 96, 83), (90, 90, 54), + (64, 74, 37), (62, 69, 32), (61, 65, 28), (65, 63, 22), + (60, 66, 28), (57, 63, 35), (58, 67, 36), (70, 71, 40), + (78, 77, 46), (91, 91, 55), (99, 99, 75), (106, 97, 92), + (128, 109, 102), (133, 130, 115), (161, 161, 137), (194, 177, 147), + (227, 215, 81), (238, 224, 65), (229, 215, 67), (161, 183, 118), + (172, 169, 134), (172, 171, 151), (174, 158, 158), (169, 157, 159), + (134, 154, 189), (163, 163, 175), (186, 184, 169), (186, 187, 173), + (193, 194, 178), (189, 200, 192), (225, 217, 181), (254, 252, 178), + (255, 252, 199), (250, 247, 228), (238, 254, 243), (238, 246, 255), + (224, 230, 252), (233, 244, 250), (254, 255, 197), (255, 244, 144), + (249, 225, 115), (255, 252, 103), (248, 246, 145), (222, 201, 174), + (198, 160, 149), (188, 150, 139), (160, 131, 117), (136, 135, 104), + (130, 131, 100), (130, 125, 96), (128, 114, 85), (106, 100, 78), + (93, 97, 72), (92, 91, 60), (94, 77, 59), (96, 74, 60), + (76, 71, 49), (69, 71, 47), (59, 63, 40), (62, 55, 39), + (45, 54, 33), (46, 49, 20), (43, 43, 15), (50, 51, 17), + (57, 57, 21), (70, 75, 34), (90, 89, 24), (97, 90, 48), + (96, 97, 66), (102, 103, 72), (107, 108, 74), (151, 142, 113) + ), + +// 201 Apophysis-040427-4ChrryBlssmT +((254, 188, 202), (254, 220, 208), (253, 227, 196), (253, 235, 185), + (230, 212, 157), (208, 189, 130), (171, 179, 118), (135, 170, 106), + (31, 109, 83), (62, 136, 109), (94, 164, 136), (152, 177, 136), + (211, 190, 137), (233, 197, 148), (255, 204, 159), (255, 211, 173), + (255, 218, 187), (255, 225, 212), (253, 224, 211), (252, 224, 210), + (240, 212, 192), (228, 201, 174), (223, 199, 159), (218, 198, 145), + (208, 178, 128), (211, 183, 132), (214, 188, 137), (221, 205, 151), + (228, 223, 165), (231, 228, 170), (235, 233, 176), (235, 233, 176), + (233, 233, 179), (235, 235, 181), (233, 230, 174), (231, 226, 168), + (225, 215, 158), (219, 204, 149), (216, 195, 142), (213, 187, 136), + (208, 174, 128), (205, 169, 122), (202, 164, 117), (173, 149, 128), + (145, 134, 140), (124, 135, 130), (103, 137, 120), (47, 101, 75), + (11, 50, 32), (38, 21, 5), (32, 10, 15), (27, 0, 26), + (35, 3, 38), (44, 7, 50), (45, 19, 54), (47, 31, 58), + (103, 114, 84), (163, 165, 119), (223, 217, 155), (238, 224, 183), + (253, 232, 211), (254, 231, 212), (255, 230, 213), (252, 237, 206), + (252, 241, 211), (241, 243, 196), (230, 224, 173), (220, 205, 150), + (214, 190, 143), (209, 175, 137), (220, 139, 148), (228, 122, 145), + (234, 111, 174), (242, 134, 181), (250, 157, 188), (249, 161, 189), + (248, 165, 191), (227, 151, 179), (206, 137, 168), (198, 135, 164), + (198, 147, 144), (202, 164, 117), (202, 166, 120), (203, 169, 123), + (203, 170, 124), (204, 172, 125), (206, 176, 126), (211, 181, 131), + (229, 215, 150), (224, 220, 171), (219, 226, 193), (235, 223, 201), + (252, 220, 209), (255, 207, 203), (254, 197, 203), (248, 186, 191), + (251, 172, 177), (199, 161, 114), (194, 149, 106), (190, 138, 98), + (190, 136, 98), (191, 135, 98), (188, 129, 95), (187, 128, 94), + (180, 120, 86), (184, 113, 76), (188, 106, 66), (176, 88, 51), + (164, 71, 37), (111, 38, 19), (108, 24, 24), (37, 11, 36), + (10, 0, 53), (8, 0, 52), (10, 0, 43), (12, 0, 34), + (18, 16, 21), (0, 19, 38), (10, 59, 64), (62, 113, 57), + (191, 139, 99), (183, 137, 118), (176, 136, 137), (134, 131, 128), + (92, 127, 120), (60, 85, 81), (57, 41, 67), (41, 31, 58), + (28, 7, 48), (15, 39, 77), (32, 53, 76), (49, 68, 75), + (53, 111, 99), (79, 150, 120), (102, 161, 129), (137, 179, 143), + (180, 140, 149), (193, 156, 137), (207, 173, 125), (211, 177, 134), + (215, 181, 143), (237, 195, 181), (230, 194, 198), (246, 194, 206), + (252, 193, 211), (253, 196, 202), (250, 191, 198), (248, 187, 195), + (255, 188, 183), (255, 166, 166), (216, 175, 143), (197, 148, 131), + (102, 76, 89), (77, 58, 77), (53, 41, 65), (40, 13, 48), + (19, 1, 53), (12, 2, 52), (6, 0, 53), (3, 0, 53), + (3, 0, 53), (1, 50, 46), (7, 53, 30), (14, 57, 14), + (8, 96, 38), (56, 82, 17), (45, 111, 37), (109, 112, 93), + (184, 124, 90), (180, 113, 82), (177, 103, 74), (154, 78, 46), + (110, 71, 32), (54, 34, 36), (33, 29, 44), (47, 36, 66), + (71, 64, 72), (171, 113, 75), (224, 99, 93), (214, 140, 91), + (199, 156, 113), (204, 168, 120), (204, 170, 124), (206, 172, 124), + (203, 166, 121), (200, 160, 115), (198, 155, 110), (191, 142, 101), + (191, 139, 99), (187, 128, 94), (185, 132, 92), (162, 164, 81), + (157, 175, 117), (119, 173, 147), (140, 182, 132), (194, 193, 129), + (223, 210, 155), (232, 227, 171), (235, 242, 191), (243, 245, 195), + (248, 247, 203), (253, 245, 206), (251, 243, 207), (250, 239, 207), + (253, 228, 208), (254, 214, 206), (255, 204, 195), (241, 177, 194), + (251, 163, 188), (228, 132, 170), (195, 128, 135), (111, 84, 63), + (70, 40, 52), (41, 48, 17), (56, 74, 16), (142, 101, 49), + (177, 114, 81), (196, 147, 106), (210, 181, 137), (232, 215, 163), + (233, 234, 176), (246, 244, 196), (249, 244, 204), (253, 242, 212), + (255, 242, 207), (254, 240, 203), (236, 236, 182), (228, 222, 164), + (218, 196, 139), (208, 177, 130), (203, 167, 119), (200, 157, 114), + (196, 151, 109), (194, 150, 105), (196, 151, 109), (195, 146, 114), + (197, 152, 113), (198, 155, 112), (216, 156, 122), (225, 169, 122), + (250, 159, 156), (242, 194, 180), (239, 241, 194), (247, 246, 202), + (250, 246, 217), (252, 244, 223), (249, 255, 216), (242, 251, 206), + (245, 247, 200), (245, 247, 197), (241, 243, 193), (235, 235, 181), + (232, 233, 175), (230, 231, 173), (223, 212, 156), (228, 230, 165) + ), + +// 202 Apophysis-040427-4ChrryBlssm2 +((221, 222, 178), (228, 234, 188), (234, 236, 177), (241, 238, 167), + (246, 227, 171), (252, 217, 175), (253, 199, 183), (255, 182, 191), + (253, 202, 207), (254, 210, 220), (255, 219, 234), (255, 220, 223), + (255, 222, 213), (252, 232, 213), (250, 243, 214), (248, 244, 212), + (246, 246, 210), (250, 244, 222), (251, 243, 223), (253, 242, 224), + (246, 244, 214), (239, 246, 205), (238, 245, 202), (237, 244, 200), + (233, 238, 198), (229, 234, 190), (225, 231, 183), (208, 211, 169), + (191, 191, 155), (173, 186, 143), (155, 182, 131), (85, 149, 115), + (0, 88, 106), (0, 44, 75), (35, 73, 99), (70, 102, 123), + (126, 166, 151), (183, 231, 179), (196, 239, 189), (209, 247, 200), + (237, 241, 206), (244, 242, 219), (252, 244, 233), (253, 246, 235), + (255, 249, 238), (255, 246, 232), (255, 243, 227), (251, 241, 214), + (246, 243, 208), (231, 239, 192), (229, 236, 189), (227, 233, 187), + (220, 220, 177), (213, 208, 168), (205, 193, 157), (198, 179, 147), + (165, 111, 101), (94, 72, 59), (23, 34, 17), (11, 53, 8), + (0, 73, 0), (0, 80, 34), (0, 87, 69), (78, 121, 112), + (124, 162, 125), (91, 169, 121), (45, 139, 118), (0, 110, 116), + (27, 118, 129), (55, 127, 142), (129, 141, 139), (180, 152, 130), + (198, 169, 125), (205, 194, 124), (213, 219, 123), (219, 224, 151), + (225, 229, 179), (225, 230, 182), (226, 232, 186), (229, 235, 191), + (230, 236, 190), (228, 236, 189), (226, 232, 186), (225, 228, 183), + (223, 225, 181), (222, 223, 179), (217, 216, 172), (197, 198, 164), + (199, 180, 148), (202, 186, 151), (206, 192, 155), (205, 193, 155), + (204, 195, 156), (227, 203, 159), (228, 189, 150), (216, 160, 133), + (239, 129, 142), (235, 108, 179), (215, 115, 173), (196, 123, 168), + (179, 117, 134), (162, 112, 101), (65, 78, 87), (31, 34, 69), + (0, 0, 64), (0, 3, 64), (1, 7, 65), (0, 14, 66), + (0, 21, 68), (44, 64, 91), (111, 114, 123), (169, 126, 110), + (171, 123, 109), (76, 100, 100), (66, 75, 68), (56, 50, 36), + (36, 15, 46), (0, 3, 48), (1, 1, 51), (0, 0, 52), + (0, 1, 58), (0, 13, 66), (0, 26, 75), (0, 35, 72), + (1, 45, 70), (39, 81, 80), (159, 137, 96), (176, 137, 120), + (185, 153, 132), (195, 172, 141), (194, 169, 140), (193, 167, 140), + (187, 157, 131), (184, 152, 131), (184, 150, 125), (186, 156, 130), + (194, 171, 140), (200, 182, 148), (207, 193, 156), (220, 195, 155), + (234, 197, 155), (249, 217, 170), (253, 207, 207), (253, 203, 214), + (253, 196, 213), (222, 200, 213), (220, 203, 198), (219, 207, 183), + (193, 163, 175), (187, 155, 134), (179, 137, 121), (180, 117, 136), + (118, 21, 30), (95, 18, 22), (72, 16, 15), (34, 16, 2), + (20, 32, 8), (22, 63, 57), (89, 113, 97), (176, 138, 119), + (198, 179, 147), (223, 229, 183), (222, 228, 182), (222, 228, 182), + (207, 203, 158), (196, 173, 142), (180, 142, 123), (176, 96, 109), + (85, 33, 22), (69, 20, 21), (54, 8, 21), (39, 0, 8), + (14, 8, 34), (0, 0, 47), (0, 0, 56), (1, 0, 57), + (1, 1, 55), (0, 0, 52), (0, 1, 47), (0, 26, 11), + (0, 32, 0), (0, 5, 0), (23, 0, 12), (30, 0, 5), + (33, 22, 4), (20, 23, 5), (8, 25, 6), (0, 14, 38), + (0, 28, 61), (0, 34, 83), (4, 67, 98), (59, 127, 146), + (151, 132, 138), (175, 133, 117), (174, 132, 116), (124, 148, 86), + (33, 83, 74), (17, 18, 62), (1, 5, 69), (0, 0, 57), + (0, 0, 56), (0, 0, 56), (1, 1, 61), (2, 1, 71), + (0, 4, 71), (0, 13, 68), (12, 28, 62), (55, 89, 101), + (167, 117, 106), (216, 101, 140), (228, 102, 149), (244, 139, 146), + (253, 144, 186), (255, 144, 193), (247, 131, 194), (255, 141, 215), + (251, 151, 205), (255, 157, 198), (252, 178, 213), (254, 190, 214), + (254, 209, 214), (254, 216, 215), (254, 221, 212), (248, 220, 206), + (238, 210, 198), (227, 210, 194), (218, 217, 173), (211, 203, 164), + (199, 180, 148), (195, 169, 146), (190, 158, 137), (180, 142, 123), + (178, 140, 121), (129, 145, 108), (80, 111, 103), (18, 59, 61), + (0, 53, 56), (0, 74, 88), (17, 127, 128), (107, 157, 132), + (142, 161, 97), (168, 163, 121), (190, 160, 134), (193, 169, 141), + (225, 162, 181), (222, 133, 179), (225, 137, 187), (255, 183, 207), + (251, 211, 212), (253, 224, 216), (251, 243, 206), (240, 237, 204), + (238, 246, 199), (237, 245, 198), (232, 239, 195), (227, 233, 187) + ), + +// 203 Apophysis-040427-4CircAmbr +((40, 17, 1), (38, 16, 2), (40, 16, 2), (43, 17, 2), + (49, 20, 1), (55, 23, 0), (65, 26, 3), (75, 29, 6), + (124, 75, 6), (155, 99, 9), (187, 123, 13), (209, 138, 26), + (231, 154, 40), (215, 142, 29), (200, 130, 18), (197, 123, 13), + (194, 117, 9), (155, 90, 0), (156, 87, 1), (157, 85, 3), + (177, 105, 6), (197, 126, 10), (202, 129, 15), (208, 132, 20), + (222, 145, 29), (212, 138, 18), (202, 131, 7), (176, 109, 3), + (151, 87, 0), (130, 72, 0), (110, 58, 0), (88, 43, 1), + (60, 24, 0), (86, 37, 4), (119, 63, 2), (153, 89, 1), + (198, 127, 27), (243, 165, 54), (248, 173, 63), (253, 181, 73), + (253, 184, 80), (238, 165, 55), (224, 147, 31), (216, 138, 25), + (208, 130, 19), (206, 131, 20), (204, 132, 21), (198, 122, 12), + (172, 98, 3), (114, 89, 49), (91, 61, 25), (69, 33, 1), + (59, 26, 1), (49, 20, 2), (48, 19, 1), (47, 19, 0), + (44, 18, 1), (43, 17, 1), (42, 16, 1), (42, 16, 1), + (42, 16, 1), (42, 16, 1), (42, 16, 1), (42, 16, 1), + (42, 16, 1), (42, 16, 1), (42, 15, 1), (42, 14, 2), + (41, 14, 1), (40, 14, 0), (40, 14, 0), (39, 16, 0), + (38, 15, 0), (38, 15, 0), (38, 15, 1), (38, 15, 0), + (38, 15, 0), (38, 15, 0), (39, 16, 0), (42, 15, 0), + (43, 14, 0), (42, 16, 1), (42, 16, 0), (43, 17, 0), + (43, 18, 0), (44, 19, 0), (44, 19, 0), (45, 18, 1), + (45, 18, 1), (45, 18, 1), (45, 18, 1), (45, 18, 1), + (45, 18, 1), (45, 18, 1), (45, 18, 0), (46, 19, 0), + (49, 21, 0), (68, 29, 0), (93, 46, 1), (118, 64, 2), + (132, 72, 5), (147, 80, 9), (156, 109, 39), (142, 134, 87), + (255, 195, 97), (254, 202, 107), (253, 210, 118), (252, 211, 121), + (252, 212, 125), (234, 211, 131), (252, 225, 158), (251, 218, 123), + (251, 206, 113), (228, 150, 39), (212, 136, 26), (197, 123, 14), + (159, 95, 7), (130, 72, 0), (106, 55, 0), (75, 35, 0), + (47, 18, 0), (43, 17, 0), (39, 16, 0), (38, 15, 0), + (38, 15, 1), (38, 15, 1), (39, 16, 0), (39, 16, 0), + (39, 16, 0), (43, 17, 0), (43, 17, 0), (44, 17, 0), + (44, 17, 0), (44, 18, 1), (45, 18, 1), (45, 18, 1), + (47, 19, 0), (47, 19, 0), (48, 20, 0), (48, 21, 0), + (49, 22, 0), (52, 21, 0), (52, 21, 0), (52, 21, 0), + (52, 21, 0), (48, 20, 0), (47, 19, 0), (46, 19, 0), + (45, 18, 0), (43, 17, 0), (42, 16, 0), (39, 16, 0), + (39, 16, 0), (39, 16, 0), (39, 16, 0), (39, 16, 0), + (39, 16, 0), (42, 16, 0), (43, 17, 0), (44, 17, 0), + (44, 17, 0), (45, 18, 1), (45, 18, 1), (45, 18, 1), + (45, 18, 1), (45, 18, 1), (45, 18, 1), (45, 18, 1), + (47, 18, 0), (47, 18, 0), (48, 19, 1), (50, 22, 1), + (49, 20, 2), (93, 46, 4), (108, 58, 9), (113, 55, 5), + (101, 51, 0), (75, 37, 1), (60, 24, 0), (52, 21, 0), + (52, 21, 0), (48, 20, 0), (45, 18, 0), (45, 18, 1), + (46, 19, 0), (46, 19, 0), (47, 20, 0), (52, 21, 1), + (61, 25, 0), (73, 33, 0), (94, 47, 5), (108, 56, 0), + (110, 58, 0), (111, 56, 0), (97, 49, 0), (72, 28, 0), + (58, 23, 1), (53, 22, 2), (51, 20, 0), (45, 18, 0), + (43, 17, 0), (42, 16, 1), (42, 16, 1), (42, 16, 1), + (43, 16, 0), (43, 17, 0), (43, 17, 0), (43, 17, 0), + (42, 16, 1), (41, 15, 0), (39, 16, 0), (39, 16, 0), + (39, 16, 0), (39, 16, 0), (41, 15, 0), (44, 15, 0), + (49, 13, 0), (52, 18, 0), (53, 21, 0), (60, 24, 0), + (82, 38, 0), (101, 50, 3), (109, 58, 1), (119, 65, 3), + (137, 78, 0), (147, 81, 3), (160, 90, 2), (142, 84, 2), + (133, 74, 0), (132, 74, 1), (119, 83, 9), (125, 71, 0), + (123, 68, 1), (114, 67, 0), (87, 54, 0), (70, 31, 0), + (56, 26, 2), (51, 20, 0), (47, 18, 0), (44, 17, 0), + (42, 16, 0), (39, 16, 0), (38, 15, 1), (37, 15, 1), + (37, 15, 1), (37, 15, 1), (35, 14, 0), (28, 8, 0), + (36, 12, 0), (37, 15, 1), (37, 15, 1), (37, 15, 1), + (38, 15, 1), (38, 17, 0), (39, 18, 1), (41, 20, 3) + ), + +// 204 Apophysis-040427-4CsmcOwl +((63, 47, 154), (63, 47, 154), (63, 47, 154), (63, 47, 154), + (63, 47, 154), (63, 47, 154), (63, 47, 154), (63, 47, 154), + (52, 37, 138), (36, 20, 87), (21, 4, 36), (10, 2, 18), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (1, 1, 1), (4, 0, 22), (7, 0, 44), + (5, 0, 57), (4, 1, 70), (12, 4, 83), (20, 7, 97), + (63, 47, 154), (63, 47, 154), (63, 47, 154), (63, 47, 154), + (63, 47, 154), (63, 47, 154), (63, 47, 154), (63, 47, 154), + (63, 47, 154), (63, 47, 154), (63, 47, 154), (63, 47, 154), + (63, 47, 154), (63, 47, 154), (63, 47, 154), (63, 47, 154), + (67, 52, 157), (116, 104, 187), (166, 156, 217), (140, 130, 208), + (115, 104, 200), (89, 76, 177), (64, 49, 154), (63, 47, 154), + (63, 47, 154), (85, 82, 113), (115, 100, 92), (145, 118, 71), + (167, 114, 74), (190, 110, 77), (178, 108, 87), (166, 106, 98), + (66, 55, 147), (64, 51, 150), (63, 47, 154), (63, 47, 154), + (63, 47, 154), (63, 47, 154), (63, 47, 154), (69, 51, 171), + (134, 121, 211), (203, 197, 211), (209, 201, 206), (216, 205, 201), + (211, 203, 206), (207, 201, 211), (204, 185, 205), (179, 171, 220), + (36, 191, 193), (48, 214, 164), (61, 237, 136), (62, 170, 136), + (63, 104, 136), (63, 75, 145), (63, 47, 154), (63, 47, 154), + (63, 47, 154), (63, 47, 154), (63, 47, 154), (63, 47, 154), + (63, 47, 154), (63, 47, 154), (63, 47, 154), (63, 44, 152), + (23, 17, 63), (11, 11, 31), (0, 5, 0), (0, 4, 0), + (1, 3, 0), (3, 0, 28), (28, 10, 60), (22, 9, 97), + (59, 43, 152), (63, 47, 154), (62, 46, 153), (61, 45, 152), + (50, 35, 137), (40, 26, 123), (36, 0, 68), (32, 19, 26), + (4, 29, 0), (45, 30, 1), (87, 32, 2), (96, 30, 1), + (106, 29, 0), (104, 29, 8), (133, 11, 32), (120, 9, 41), + (105, 3, 68), (61, 45, 154), (53, 36, 147), (45, 28, 140), + (17, 4, 92), (5, 0, 64), (0, 0, 44), (3, 3, 31), + (21, 0, 63), (29, 14, 97), (37, 29, 132), (49, 37, 142), + (62, 46, 153), (63, 47, 154), (63, 47, 154), (63, 47, 154), + (63, 47, 154), (138, 115, 187), (157, 130, 174), (177, 146, 161), + (215, 185, 177), (164, 160, 174), (94, 158, 170), (80, 160, 151), + (128, 104, 78), (145, 91, 59), (162, 78, 41), (148, 73, 33), + (135, 68, 26), (69, 72, 65), (58, 65, 109), (63, 47, 154), + (63, 47, 154), (57, 65, 114), (72, 73, 97), (87, 81, 81), + (121, 98, 56), (168, 136, 51), (214, 133, 42), (228, 114, 17), + (190, 110, 75), (192, 112, 80), (194, 115, 85), (185, 182, 103), + (225, 183, 169), (211, 197, 196), (215, 186, 178), (216, 167, 153), + (213, 154, 136), (192, 113, 82), (170, 110, 82), (149, 107, 83), + (88, 86, 63), (77, 95, 99), (87, 127, 126), (108, 108, 198), + (100, 83, 195), (81, 66, 176), (62, 49, 157), (63, 47, 154), + (63, 47, 154), (70, 48, 95), (60, 48, 148), (63, 47, 154), + (69, 50, 142), (114, 84, 56), (142, 57, 37), (136, 52, 16), + (136, 52, 15), (128, 40, 2), (111, 32, 2), (105, 37, 2), + (81, 18, 45), (73, 9, 66), (66, 0, 87), (61, 46, 151), + (63, 47, 154), (63, 47, 154), (63, 47, 154), (63, 47, 154), + (63, 47, 154), (63, 47, 154), (63, 47, 154), (63, 47, 154), + (63, 47, 154), (63, 47, 154), (67, 55, 103), (76, 43, 62), + (101, 44, 24), (111, 18, 62), (62, 47, 152), (63, 47, 154), + (63, 47, 154), (63, 47, 154), (63, 47, 154), (63, 47, 154), + (61, 46, 149), (44, 42, 63), (62, 56, 4), (68, 40, 0), + (65, 36, 4), (37, 22, 27), (29, 0, 2), (6, 0, 4), + (33, 2, 0), (70, 7, 0), (88, 1, 0), (118, 32, 0), + (132, 48, 4), (134, 49, 12), (132, 57, 28), (94, 56, 81), + (70, 48, 149), (63, 47, 154), (63, 47, 154), (63, 47, 154), + (63, 47, 154), (63, 47, 154), (63, 47, 154), (63, 47, 154), + (63, 47, 154), (63, 47, 154), (63, 47, 154), (63, 47, 154), + (63, 47, 154), (63, 47, 154), (63, 47, 154), (63, 47, 154), + (63, 47, 154), (63, 47, 154), (63, 47, 154), (63, 47, 154), + (63, 47, 154), (63, 47, 154), (63, 47, 154), (63, 47, 154), + (63, 47, 154), (63, 47, 154), (63, 47, 154), (63, 47, 154), + (63, 47, 154), (63, 47, 154), (63, 47, 154), (63, 47, 154) + ), + +// 205 Apophysis-040427-4DblBeetle +((174, 77, 26), (181, 84, 33), (181, 84, 33), (181, 84, 33), + (181, 84, 33), (181, 84, 33), (181, 84, 33), (181, 84, 33), + (181, 84, 33), (181, 84, 33), (181, 84, 33), (181, 84, 33), + (181, 84, 33), (181, 84, 33), (181, 84, 33), (181, 84, 33), + (181, 84, 33), (181, 84, 33), (181, 84, 33), (181, 84, 33), + (181, 84, 33), (181, 84, 33), (177, 80, 29), (174, 77, 26), + (174, 77, 26), (175, 77, 25), (177, 77, 25), (179, 80, 29), + (181, 84, 33), (181, 84, 33), (181, 84, 33), (174, 77, 26), + (171, 74, 23), (68, 29, 92), (37, 22, 118), (7, 16, 145), + (20, 31, 164), (33, 46, 184), (43, 56, 181), (54, 66, 178), + (40, 48, 157), (56, 40, 122), (72, 33, 88), (123, 55, 57), + (174, 77, 26), (177, 80, 29), (181, 84, 33), (181, 84, 33), + (188, 93, 35), (192, 92, 40), (200, 100, 47), (208, 109, 54), + (158, 108, 120), (109, 108, 186), (110, 117, 202), (111, 126, 219), + (204, 176, 190), (224, 171, 137), (245, 167, 84), (227, 138, 68), + (209, 110, 53), (200, 101, 46), (192, 92, 40), (173, 76, 25), + (140, 48, 0), (55, 0, 58), (67, 5, 47), (80, 10, 36), + (108, 27, 18), (136, 45, 1), (173, 76, 25), (174, 77, 26), + (174, 77, 26), (174, 77, 26), (174, 77, 26), (183, 84, 33), + (192, 92, 40), (200, 100, 47), (208, 109, 54), (216, 117, 60), + (231, 132, 75), (240, 167, 122), (245, 156, 107), (250, 146, 93), + (247, 146, 91), (245, 146, 89), (228, 129, 72), (223, 123, 71), + (201, 106, 48), (196, 98, 43), (191, 91, 39), (186, 87, 36), + (181, 84, 33), (174, 77, 26), (181, 84, 33), (181, 84, 33), + (181, 84, 33), (130, 100, 110), (128, 109, 120), (127, 119, 130), + (147, 118, 113), (168, 117, 96), (200, 100, 48), (192, 92, 40), + (181, 84, 33), (181, 84, 33), (181, 84, 33), (181, 84, 33), + (181, 84, 33), (181, 84, 33), (181, 84, 33), (181, 84, 33), + (181, 84, 33), (181, 84, 33), (181, 84, 33), (181, 84, 33), + (174, 77, 26), (174, 77, 26), (174, 77, 26), (174, 77, 26), + (147, 52, 4), (83, 26, 43), (19, 0, 82), (11, 1, 97), + (3, 3, 113), (0, 8, 132), (5, 14, 131), (20, 23, 94), + (67, 2, 45), (171, 74, 23), (172, 75, 24), (174, 77, 26), + (180, 87, 26), (181, 84, 33), (181, 84, 33), (181, 84, 33), + (211, 98, 32), (204, 98, 37), (197, 98, 43), (198, 99, 45), + (200, 100, 48), (199, 99, 47), (192, 92, 40), (192, 92, 40), + (192, 92, 40), (192, 92, 40), (192, 92, 40), (192, 92, 40), + (191, 91, 39), (191, 91, 39), (186, 89, 36), (181, 84, 33), + (174, 77, 26), (174, 77, 26), (174, 77, 26), (174, 77, 26), + (174, 77, 26), (174, 77, 26), (174, 77, 26), (181, 84, 33), + (181, 84, 33), (181, 84, 33), (181, 84, 33), (181, 84, 33), + (181, 84, 33), (181, 84, 33), (181, 84, 33), (181, 84, 33), + (181, 84, 33), (181, 84, 33), (181, 84, 33), (181, 84, 33), + (181, 84, 33), (181, 84, 33), (174, 77, 26), (174, 77, 26), + (174, 77, 26), (174, 77, 26), (174, 77, 26), (174, 77, 26), + (174, 77, 26), (174, 77, 26), (174, 77, 26), (173, 76, 25), + (94, 22, 7), (73, 13, 33), (52, 5, 59), (18, 9, 88), + (5, 13, 94), (1, 14, 108), (16, 26, 95), (40, 8, 73), + (118, 47, 45), (174, 77, 26), (174, 77, 26), (173, 75, 26), + (174, 77, 26), (174, 77, 26), (174, 77, 26), (174, 77, 26), + (181, 84, 33), (181, 84, 33), (181, 84, 33), (181, 84, 33), + (184, 87, 34), (192, 92, 40), (200, 100, 48), (208, 109, 52), + (234, 147, 70), (238, 191, 135), (253, 245, 164), (255, 248, 178), + (212, 211, 219), (203, 216, 233), (164, 160, 211), (153, 181, 202), + (182, 178, 141), (174, 110, 64), (195, 98, 45), (192, 92, 40), + (181, 84, 33), (179, 82, 29), (174, 77, 26), (174, 77, 26), + (174, 77, 26), (174, 77, 26), (174, 77, 26), (174, 77, 26), + (174, 77, 26), (174, 77, 26), (174, 77, 26), (174, 77, 26), + (174, 77, 26), (174, 77, 26), (174, 77, 26), (174, 77, 26), + (174, 77, 26), (174, 77, 26), (174, 77, 26), (174, 77, 26), + (181, 84, 33), (109, 97, 111), (63, 76, 190), (48, 72, 198), + (66, 81, 226), (67, 80, 236), (115, 124, 251), (134, 135, 251), + (132, 147, 240), (107, 122, 249), (74, 85, 201), (66, 78, 196), + (65, 76, 194), (84, 91, 179), (119, 88, 147), (90, 75, 94) + ), + +// 206 Apophysis-040427-4DrkMantis +((45, 96, 1), (96, 132, 0), (69, 113, 0), (43, 94, 1), + (37, 90, 0), (31, 87, 0), (31, 77, 0), (31, 68, 0), + (27, 66, 0), (28, 75, 0), (29, 84, 0), (39, 90, 0), + (49, 96, 0), (86, 97, 0), (123, 99, 0), (116, 99, 0), + (109, 100, 0), (44, 95, 0), (39, 84, 0), (34, 74, 1), + (58, 81, 0), (82, 88, 0), (86, 91, 0), (90, 94, 0), + (144, 107, 0), (158, 126, 0), (173, 145, 0), (166, 155, 0), + (160, 165, 0), (159, 164, 0), (158, 163, 0), (143, 145, 0), + (125, 147, 2), (90, 129, 0), (63, 128, 1), (36, 128, 3), + (31, 106, 1), (26, 84, 0), (21, 77, 0), (17, 70, 0), + (9, 51, 3), (8, 40, 2), (7, 30, 1), (8, 37, 1), + (9, 45, 1), (13, 48, 1), (18, 52, 1), (21, 51, 1), + (28, 50, 1), (44, 41, 0), (58, 33, 1), (72, 26, 3), + (91, 46, 1), (110, 67, 0), (113, 72, 0), (116, 77, 0), + (168, 74, 0), (145, 82, 0), (122, 91, 0), (129, 100, 0), + (136, 110, 0), (136, 116, 0), (137, 123, 0), (163, 140, 2), + (183, 161, 0), (205, 168, 1), (194, 163, 0), (183, 159, 0), + (176, 151, 0), (169, 144, 0), (155, 135, 2), (125, 115, 0), + (50, 73, 1), (42, 64, 0), (35, 56, 0), (33, 58, 0), + (31, 61, 1), (32, 62, 1), (33, 63, 1), (43, 68, 0), + (53, 66, 0), (96, 84, 0), (93, 72, 0), (91, 61, 0), + (74, 57, 0), (57, 54, 0), (36, 60, 0), (31, 61, 1), + (21, 67, 2), (18, 68, 1), (16, 69, 1), (15, 69, 0), + (14, 70, 0), (14, 62, 0), (15, 53, 6), (17, 54, 0), + (21, 54, 1), (27, 58, 0), (28, 72, 0), (30, 86, 0), + (30, 88, 0), (31, 90, 0), (36, 93, 0), (35, 90, 0), + (33, 68, 0), (33, 66, 0), (33, 65, 0), (32, 63, 0), + (32, 62, 0), (39, 59, 0), (53, 50, 0), (62, 55, 3), + (78, 67, 5), (98, 75, 0), (87, 72, 0), (77, 69, 0), + (42, 69, 0), (29, 57, 0), (19, 52, 0), (7, 32, 3), + (6, 17, 3), (6, 19, 1), (6, 21, 0), (8, 26, 0), + (10, 31, 0), (24, 37, 7), (41, 44, 1), (52, 45, 0), + (56, 38, 0), (52, 52, 0), (49, 57, 0), (46, 62, 0), + (42, 67, 1), (43, 81, 0), (66, 108, 0), (97, 147, 0), + (123, 161, 0), (151, 159, 0), (180, 157, 1), (183, 148, 16), + (187, 140, 32), (218, 129, 0), (229, 100, 0), (229, 101, 0), + (195, 136, 0), (131, 87, 0), (124, 81, 0), (118, 76, 0), + (96, 60, 0), (80, 60, 1), (76, 55, 2), (53, 49, 1), + (30, 60, 0), (27, 62, 0), (24, 64, 1), (24, 66, 0), + (26, 67, 0), (29, 68, 1), (33, 75, 1), (29, 87, 0), + (20, 78, 1), (15, 71, 0), (17, 68, 0), (20, 66, 1), + (24, 64, 1), (26, 53, 0), (35, 42, 1), (44, 18, 3), + (62, 4, 0), (75, 8, 0), (89, 13, 0), (106, 0, 2), + (87, 19, 0), (77, 19, 0), (60, 38, 0), (43, 51, 0), + (31, 54, 0), (29, 53, 1), (26, 50, 0), (22, 45, 0), + (31, 42, 0), (32, 33, 1), (36, 38, 0), (32, 50, 0), + (39, 59, 0), (42, 59, 0), (45, 59, 0), (54, 54, 0), + (76, 60, 1), (93, 75, 0), (108, 86, 3), (123, 116, 0), + (121, 127, 1), (129, 132, 1), (119, 129, 0), (106, 140, 1), + (74, 110, 0), (46, 96, 0), (40, 94, 0), (36, 93, 0), + (34, 88, 0), (33, 68, 0), (41, 63, 0), (50, 53, 0), + (61, 51, 0), (92, 75, 0), (121, 91, 1), (125, 108, 0), + (133, 116, 0), (135, 124, 0), (126, 114, 2), (123, 97, 0), + (107, 82, 0), (81, 72, 7), (46, 65, 1), (35, 64, 0), + (32, 60, 1), (32, 57, 0), (40, 62, 0), (43, 65, 0), + (49, 54, 0), (49, 47, 0), (40, 46, 0), (39, 52, 6), + (28, 51, 0), (23, 53, 1), (23, 53, 1), (22, 55, 2), + (20, 53, 0), (18, 53, 0), (17, 61, 0), (16, 62, 0), + (20, 62, 0), (19, 57, 0), (22, 55, 0), (27, 58, 1), + (21, 63, 0), (21, 61, 0), (23, 58, 0), (28, 57, 0), + (24, 54, 0), (18, 52, 1), (11, 47, 3), (7, 32, 0), + (4, 30, 0), (5, 25, 0), (5, 23, 0), (8, 28, 0), + (9, 28, 0), (23, 27, 0), (22, 9, 0), (31, 15, 0), + (36, 21, 0), (26, 33, 0), (35, 59, 0), (99, 123, 1) + ), + +// 207 Apophysis-040427-4HolidyBull +((13, 0, 193), (12, 0, 68), (20, 0, 47), (29, 0, 27), + (21, 5, 29), (13, 11, 32), (10, 12, 36), (7, 14, 40), + (0, 18, 49), (4, 20, 55), (8, 22, 61), (11, 16, 61), + (15, 11, 62), (13, 9, 47), (11, 7, 32), (12, 3, 28), + (14, 0, 25), (14, 8, 8), (20, 20, 13), (26, 32, 18), + (26, 16, 20), (26, 0, 23), (22, 6, 19), (18, 12, 16), + (4, 7, 24), (23, 20, 26), (42, 33, 28), (51, 62, 38), + (61, 92, 48), (30, 73, 65), (0, 54, 83), (30, 82, 157), + (25, 82, 234), (27, 6, 133), (21, 5, 84), (16, 5, 35), + (8, 3, 22), (0, 1, 9), (3, 7, 16), (6, 13, 23), + (35, 33, 57), (33, 113, 99), (31, 194, 141), (15, 133, 188), + (0, 73, 235), (4, 50, 235), (8, 28, 236), (27, 14, 215), + (34, 5, 121), (32, 0, 31), (29, 0, 15), (26, 1, 0), + (35, 0, 0), (44, 0, 0), (51, 6, 0), (59, 13, 0), + (156, 5, 10), (184, 14, 5), (213, 23, 0), (217, 19, 6), + (221, 16, 13), (201, 24, 6), (182, 33, 0), (124, 43, 16), + (97, 43, 0), (58, 13, 0), (44, 14, 0), (30, 15, 0), + (29, 13, 0), (28, 11, 0), (21, 0, 0), (14, 0, 0), + (0, 29, 0), (8, 27, 0), (16, 26, 0), (16, 18, 9), + (17, 10, 18), (15, 12, 32), (14, 15, 46), (8, 11, 80), + (18, 19, 112), (15, 12, 215), (12, 15, 235), (10, 19, 255), + (14, 19, 255), (19, 20, 255), (40, 5, 255), (17, 13, 255), + (10, 10, 255), (11, 6, 252), (12, 3, 250), (11, 4, 251), + (11, 5, 253), (13, 13, 255), (29, 0, 246), (50, 1, 232), + (60, 16, 237), (157, 10, 255), (179, 98, 248), (202, 187, 242), + (225, 210, 240), (249, 234, 239), (255, 221, 201), (255, 255, 159), + (255, 193, 125), (247, 157, 75), (239, 121, 25), (235, 123, 12), + (231, 126, 0), (234, 128, 10), (254, 200, 12), (255, 221, 17), + (255, 230, 21), (255, 238, 32), (255, 246, 45), (255, 255, 59), + (255, 238, 50), (236, 212, 54), (250, 206, 37), (254, 182, 35), + (255, 119, 26), (237, 106, 34), (219, 93, 42), (212, 90, 34), + (206, 88, 26), (203, 125, 14), (152, 100, 63), (85, 39, 114), + (56, 12, 195), (1, 19, 243), (2, 26, 249), (3, 34, 255), + (9, 71, 242), (38, 77, 255), (44, 94, 251), (0, 206, 254), + (20, 255, 238), (28, 243, 235), (37, 231, 233), (31, 216, 244), + (26, 201, 255), (5, 74, 255), (15, 71, 244), (0, 38, 229), + (2, 10, 155), (3, 0, 89), (1, 0, 68), (0, 0, 48), + (0, 9, 23), (0, 12, 5), (0, 15, 0), (6, 9, 0), + (30, 16, 0), (35, 20, 1), (40, 25, 2), (68, 52, 1), + (106, 50, 3), (134, 95, 18), (169, 152, 22), (224, 197, 0), + (244, 203, 0), (255, 186, 62), (225, 158, 64), (195, 130, 66), + (109, 90, 50), (35, 64, 124), (34, 60, 153), (16, 52, 234), + (8, 17, 246), (11, 13, 246), (14, 10, 247), (12, 15, 255), + (5, 19, 255), (0, 23, 255), (6, 12, 244), (4, 0, 254), + (0, 2, 251), (1, 8, 246), (6, 1, 218), (9, 17, 190), + (0, 0, 144), (0, 3, 106), (23, 0, 131), (2, 2, 212), + (0, 0, 249), (0, 1, 246), (0, 2, 243), (0, 4, 213), + (11, 14, 145), (0, 74, 44), (0, 144, 0), (8, 228, 40), + (106, 197, 102), (115, 194, 189), (139, 175, 201), (168, 145, 153), + (187, 163, 75), (128, 118, 5), (107, 66, 12), (112, 41, 0), + (158, 17, 0), (210, 25, 0), (216, 47, 0), (255, 73, 15), + (248, 81, 10), (195, 90, 7), (128, 63, 0), (119, 47, 9), + (80, 35, 56), (60, 16, 39), (60, 39, 34), (76, 35, 0), + (90, 22, 1), (150, 86, 12), (184, 144, 33), (207, 170, 27), + (229, 202, 35), (241, 229, 23), (255, 235, 22), (255, 248, 36), + (255, 251, 41), (245, 239, 39), (247, 244, 43), (216, 205, 123), + (127, 245, 149), (145, 158, 175), (157, 146, 178), (162, 62, 132), + (117, 44, 237), (151, 149, 188), (200, 155, 196), (195, 155, 145), + (161, 173, 127), (177, 209, 64), (130, 174, 37), (118, 68, 7), + (144, 26, 0), (204, 6, 19), (254, 8, 29), (237, 38, 97), + (176, 0, 165), (45, 11, 134), (7, 9, 96), (0, 0, 78), + (3, 3, 41), (0, 0, 18), (3, 2, 0), (7, 1, 1), + (14, 0, 0), (6, 3, 0), (4, 6, 0), (0, 8, 0), + (0, 3, 30), (0, 14, 46), (1, 9, 94), (6, 18, 78) + ), + +// 208 Apophysis-040427-4DrkFlorCnpy +((107, 203, 67), (111, 205, 69), (110, 204, 66), (110, 203, 63), + (109, 201, 62), (109, 200, 61), (109, 201, 61), (109, 202, 62), + (116, 213, 71), (120, 217, 74), (124, 222, 77), (129, 229, 81), + (134, 237, 86), (127, 229, 79), (121, 221, 73), (119, 218, 71), + (117, 215, 70), (90, 168, 49), (92, 165, 48), (94, 163, 47), + (88, 156, 45), (83, 150, 44), (80, 140, 40), (77, 131, 37), + (50, 77, 24), (49, 69, 22), (49, 61, 21), (47, 55, 19), + (46, 49, 18), (45, 50, 18), (44, 51, 18), (46, 61, 22), + (49, 64, 21), (48, 67, 21), (46, 74, 21), (44, 82, 21), + (43, 74, 20), (43, 66, 20), (39, 58, 17), (36, 50, 15), + (21, 25, 11), (15, 16, 7), (9, 8, 4), (10, 13, 5), + (11, 19, 6), (13, 27, 7), (15, 35, 8), (29, 65, 17), + (37, 94, 26), (77, 142, 40), (89, 162, 47), (101, 183, 55), + (103, 188, 57), (106, 193, 60), (105, 192, 59), (105, 191, 58), + (99, 184, 57), (98, 176, 53), (97, 168, 50), (95, 164, 48), + (94, 161, 46), (87, 159, 45), (80, 157, 45), (85, 143, 41), + (71, 137, 39), (58, 107, 28), (54, 101, 27), (51, 96, 27), + (50, 95, 26), (49, 94, 25), (50, 95, 26), (52, 99, 27), + (68, 134, 37), (80, 148, 41), (92, 162, 46), (94, 166, 47), + (96, 170, 49), (94, 170, 50), (93, 171, 51), (86, 158, 46), + (74, 145, 41), (71, 114, 34), (59, 95, 28), (47, 77, 23), + (44, 70, 21), (42, 63, 20), (28, 45, 13), (16, 31, 8), + (16, 36, 9), (25, 54, 13), (34, 73, 18), (41, 83, 21), + (48, 93, 24), (50, 95, 26), (47, 77, 23), (45, 50, 20), + (44, 2, 48), (47, 3, 52), (46, 27, 35), (46, 51, 19), + (50, 63, 21), (55, 75, 24), (77, 128, 36), (101, 177, 53), + (158, 251, 108), (166, 243, 116), (174, 236, 125), (145, 216, 98), + (117, 197, 72), (98, 172, 51), (82, 140, 40), (57, 103, 28), + (47, 81, 21), (29, 51, 13), (23, 44, 11), (18, 37, 9), + (19, 35, 9), (23, 29, 15), (22, 22, 10), (21, 21, 11), + (19, 10, 13), (26, 5, 25), (34, 0, 37), (36, 0, 40), + (38, 1, 44), (41, 2, 47), (36, 0, 44), (29, 0, 31), + (26, 0, 29), (14, 0, 13), (13, 1, 9), (12, 3, 6), + (10, 6, 5), (12, 8, 7), (18, 18, 8), (23, 23, 13), + (52, 69, 24), (66, 104, 31), (81, 139, 39), (87, 148, 42), + (94, 158, 46), (97, 176, 51), (102, 181, 54), (96, 181, 54), + (85, 159, 46), (65, 130, 36), (58, 114, 31), (51, 98, 26), + (41, 74, 19), (24, 50, 15), (16, 34, 8), (14, 32, 8), + (15, 21, 7), (16, 19, 7), (18, 18, 8), (19, 23, 9), + (19, 23, 9), (27, 23, 12), (27, 30, 13), (43, 50, 19), + (50, 67, 22), (66, 122, 33), (69, 134, 37), (73, 146, 41), + (81, 178, 63), (102, 193, 62), (109, 201, 64), (116, 213, 71), + (140, 245, 90), (145, 247, 97), (150, 249, 104), (166, 252, 119), + (161, 252, 113), (152, 252, 100), (142, 247, 85), (128, 224, 72), + (123, 223, 75), (116, 217, 75), (113, 210, 68), (110, 198, 60), + (104, 185, 56), (92, 159, 46), (72, 140, 41), (54, 102, 28), + (34, 47, 19), (30, 41, 15), (27, 35, 12), (16, 31, 8), + (16, 31, 8), (19, 39, 11), (36, 68, 18), (51, 98, 26), + (64, 129, 35), (80, 152, 44), (93, 163, 47), (103, 184, 55), + (101, 191, 59), (97, 186, 60), (96, 176, 53), (91, 169, 50), + (92, 162, 48), (91, 171, 50), (93, 171, 51), (101, 180, 53), + (103, 186, 56), (106, 193, 60), (110, 198, 60), (111, 202, 62), + (114, 207, 66), (114, 208, 68), (115, 210, 68), (113, 210, 68), + (112, 209, 68), (114, 207, 66), (112, 203, 64), (114, 198, 58), + (109, 197, 59), (105, 192, 59), (97, 182, 55), (88, 167, 50), + (74, 140, 40), (55, 101, 28), (47, 76, 22), (45, 63, 21), + (38, 40, 16), (20, 12, 10), (19, 2, 21), (25, 1, 27), + (23, 1, 24), (19, 0, 20), (19, 0, 20), (14, 0, 15), + (13, 0, 10), (8, 2, 4), (10, 6, 5), (12, 18, 6), + (14, 18, 4), (12, 18, 6), (14, 13, 9), (17, 6, 10), + (22, 0, 21), (31, 0, 36), (41, 2, 47), (50, 6, 59), + (61, 10, 69), (75, 18, 87), (63, 11, 73), (54, 4, 65), + (48, 4, 55), (53, 64, 24), (57, 89, 26), (77, 123, 35), + (87, 152, 50), (99, 178, 53), (108, 194, 59), (108, 199, 62) + ), + +// 209 Apophysis-040427-4DethstrDemis +((189, 180, 171), (110, 91, 84), (110, 75, 55), (110, 60, 27), + (97, 45, 13), (84, 31, 0), (72, 17, 0), (61, 3, 1), + (2, 10, 23), (16, 26, 40), (30, 42, 58), (48, 60, 77), + (66, 79, 96), (72, 82, 98), (78, 85, 101), (74, 82, 99), + (71, 79, 98), (49, 59, 71), (55, 50, 53), (61, 42, 35), + (89, 61, 48), (118, 81, 62), (122, 89, 78), (126, 98, 94), + (153, 150, 157), (164, 170, 183), (176, 191, 210), (186, 199, 220), + (196, 208, 230), (193, 208, 229), (191, 208, 228), (168, 194, 219), + (172, 185, 201), (169, 180, 198), (163, 175, 191), (158, 170, 184), + (148, 157, 170), (139, 145, 157), (142, 143, 151), (146, 141, 145), + (152, 133, 116), (164, 132, 111), (177, 131, 107), (179, 122, 86), + (181, 113, 66), (176, 94, 45), (171, 75, 25), (143, 49, 11), + (77, 28, 14), (1, 11, 23), (0, 7, 19), (0, 3, 15), + (13, 14, 27), (27, 25, 39), (56, 35, 38), (86, 46, 38), + (153, 80, 45), (157, 90, 53), (162, 100, 61), (157, 109, 81), + (152, 119, 102), (147, 119, 105), (142, 120, 109), (125, 129, 141), + (123, 130, 146), (117, 123, 139), (113, 119, 134), (110, 116, 130), + (106, 112, 127), (102, 109, 125), (93, 99, 115), (93, 99, 115), + (112, 118, 132), (118, 125, 141), (124, 133, 150), (134, 144, 162), + (145, 156, 174), (149, 161, 180), (154, 167, 186), (159, 170, 188), + (148, 156, 175), (128, 131, 146), (118, 125, 142), (109, 120, 138), + (97, 110, 132), (86, 100, 126), (87, 94, 110), (92, 92, 100), + (93, 99, 115), (108, 114, 130), (123, 130, 146), (134, 143, 159), + (145, 157, 173), (161, 172, 190), (176, 191, 210), (194, 212, 234), + (202, 222, 247), (206, 227, 248), (205, 225, 248), (204, 224, 248), + (203, 223, 248), (203, 223, 248), (191, 218, 239), (193, 209, 232), + (196, 196, 196), (188, 171, 158), (180, 146, 121), (168, 139, 121), + (156, 132, 122), (127, 129, 141), (122, 130, 143), (123, 130, 146), + (123, 130, 146), (124, 128, 139), (128, 128, 137), (132, 129, 136), + (124, 130, 144), (131, 140, 155), (128, 146, 170), (140, 156, 181), + (159, 172, 189), (152, 163, 182), (146, 154, 175), (145, 152, 172), + (144, 151, 169), (135, 144, 159), (137, 147, 159), (144, 153, 170), + (145, 155, 180), (169, 180, 198), (170, 181, 199), (171, 182, 200), + (158, 171, 188), (141, 141, 151), (130, 126, 127), (142, 118, 108), + (95, 92, 87), (79, 81, 85), (63, 71, 84), (53, 66, 81), + (44, 61, 79), (28, 38, 65), (25, 41, 64), (23, 40, 58), + (28, 41, 57), (32, 45, 64), (36, 48, 66), (40, 52, 68), + (58, 65, 81), (65, 74, 89), (72, 76, 87), (87, 80, 87), + (135, 90, 61), (143, 89, 61), (152, 88, 61), (132, 97, 78), + (121, 98, 90), (95, 95, 105), (93, 99, 115), (93, 99, 115), + (93, 99, 115), (83, 85, 98), (82, 80, 89), (81, 76, 80), + (84, 83, 89), (79, 88, 103), (73, 94, 113), (80, 89, 122), + (93, 99, 115), (93, 99, 115), (93, 99, 115), (100, 106, 122), + (105, 114, 129), (95, 101, 115), (93, 99, 115), (85, 94, 109), + (81, 76, 80), (63, 52, 60), (46, 35, 31), (61, 21, 9), + (57, 19, 8), (31, 29, 34), (33, 42, 57), (53, 52, 58), + (102, 70, 55), (104, 83, 73), (107, 96, 92), (100, 108, 119), + (120, 120, 128), (140, 129, 125), (152, 129, 115), (152, 124, 110), + (146, 118, 106), (134, 107, 98), (125, 97, 83), (115, 98, 90), + (121, 117, 114), (116, 125, 142), (120, 131, 149), (135, 144, 159), + (154, 166, 182), (168, 181, 198), (174, 190, 206), (186, 201, 222), + (194, 212, 234), (221, 234, 227), (249, 233, 234), (209, 227, 249), + (197, 218, 239), (189, 211, 232), (179, 191, 213), (175, 186, 204), + (169, 180, 198), (158, 169, 187), (141, 152, 170), (123, 130, 146), + (117, 119, 131), (101, 109, 122), (94, 100, 114), (99, 102, 109), + (128, 100, 89), (148, 107, 85), (194, 121, 80), (232, 139, 78), + (249, 172, 104), (221, 186, 154), (197, 171, 154), (189, 171, 169), + (159, 168, 183), (145, 152, 168), (129, 138, 153), (105, 121, 144), + (93, 99, 115), (81, 87, 101), (64, 70, 84), (38, 42, 54), + (20, 33, 49), (4, 19, 38), (11, 31, 42), (18, 34, 50), + (34, 41, 59), (52, 61, 76), (64, 71, 87), (77, 84, 100), + (93, 99, 115), (105, 111, 125), (122, 130, 149), (145, 154, 171), + (163, 174, 192), (168, 179, 199), (168, 181, 200), (171, 182, 200), + (178, 188, 200), (188, 187, 193), (189, 180, 175), (202, 178, 166) + ), + +// 210 Apophysis-040427-4DethstrDems +((46, 26, 0), (52, 32, 7), (57, 39, 15), (62, 46, 23), + (60, 52, 41), (59, 59, 59), (54, 76, 89), (49, 93, 120), + (99, 123, 133), (116, 124, 122), (133, 125, 112), (132, 125, 110), + (132, 125, 109), (131, 126, 112), (131, 127, 116), (127, 126, 117), + (123, 126, 119), (124, 115, 100), (119, 107, 87), (115, 99, 74), + (105, 91, 70), (96, 83, 66), (97, 85, 67), (98, 87, 69), + (111, 104, 86), (114, 106, 91), (118, 108, 96), (114, 104, 85), + (110, 100, 75), (103, 92, 71), (96, 85, 67), (86, 75, 57), + (84, 73, 55), (114, 114, 104), (113, 125, 125), (113, 137, 147), + (136, 150, 157), (160, 163, 168), (165, 167, 167), (171, 172, 166), + (211, 194, 176), (220, 204, 183), (230, 214, 191), (228, 214, 194), + (227, 214, 198), (227, 212, 195), (227, 210, 192), (223, 210, 191), + (215, 203, 187), (190, 181, 166), (179, 178, 167), (168, 175, 168), + (144, 170, 181), (120, 165, 194), (111, 166, 194), (103, 167, 194), + (134, 157, 165), (148, 156, 152), (162, 156, 140), (162, 156, 140), + (162, 156, 140), (166, 162, 142), (170, 168, 145), (172, 170, 157), + (174, 179, 175), (176, 167, 152), (175, 166, 142), (175, 166, 133), + (168, 161, 136), (162, 156, 140), (162, 156, 140), (162, 156, 140), + (150, 141, 126), (156, 148, 133), (162, 156, 140), (168, 167, 157), + (174, 179, 175), (183, 191, 185), (192, 203, 195), (209, 220, 224), + (194, 234, 246), (224, 226, 221), (213, 214, 209), (202, 203, 197), + (190, 197, 185), (178, 191, 173), (153, 185, 200), (148, 159, 163), + (135, 135, 127), (119, 130, 133), (103, 126, 140), (103, 128, 142), + (103, 131, 145), (109, 137, 149), (121, 148, 157), (130, 158, 172), + (140, 157, 165), (139, 130, 113), (129, 120, 104), (120, 111, 96), + (110, 100, 84), (101, 89, 73), (87, 74, 57), (81, 65, 49), + (61, 43, 21), (33, 32, 21), (6, 22, 21), (26, 25, 13), + (46, 28, 6), (58, 37, 16), (66, 44, 23), (76, 64, 42), + (80, 69, 51), (97, 86, 68), (105, 94, 76), (114, 103, 85), + (132, 125, 109), (138, 136, 124), (154, 146, 133), (161, 155, 141), + (127, 155, 166), (94, 144, 170), (61, 134, 175), (42, 125, 176), + (23, 116, 177), (6, 83, 151), (34, 69, 101), (58, 84, 101), + (66, 84, 86), (110, 103, 87), (118, 110, 94), (126, 117, 102), + (150, 134, 111), (162, 156, 140), (174, 168, 154), (191, 185, 171), + (235, 222, 206), (239, 223, 209), (244, 224, 213), (240, 222, 209), + (237, 221, 205), (221, 214, 196), (203, 194, 179), (191, 184, 168), + (178, 171, 155), (150, 144, 130), (141, 134, 118), (133, 125, 106), + (110, 101, 84), (92, 81, 63), (87, 76, 56), (87, 74, 55), + (77, 67, 55), (72, 67, 58), (67, 68, 62), (66, 75, 80), + (53, 77, 89), (66, 75, 84), (153, 147, 131), (145, 164, 171), + (147, 185, 204), (160, 233, 252), (165, 228, 253), (171, 224, 255), + (194, 252, 254), (247, 255, 253), (253, 245, 232), (255, 238, 222), + (198, 189, 174), (193, 182, 166), (189, 176, 159), (183, 173, 148), + (177, 170, 154), (184, 176, 157), (198, 187, 169), (206, 196, 184), + (198, 209, 215), (194, 213, 220), (153, 196, 215), (137, 174, 193), + (129, 157, 161), (123, 126, 119), (102, 105, 98), (93, 80, 63), + (66, 53, 34), (62, 50, 29), (59, 47, 25), (64, 47, 27), + (87, 61, 36), (83, 70, 54), (86, 73, 56), (86, 75, 57), + (90, 77, 58), (97, 85, 71), (108, 99, 82), (116, 110, 98), + (109, 114, 110), (108, 122, 122), (103, 122, 139), (81, 118, 144), + (78, 124, 148), (72, 136, 182), (74, 142, 189), (84, 180, 230), + (112, 206, 244), (178, 227, 241), (247, 239, 226), (254, 244, 232), + (255, 243, 237), (255, 252, 240), (247, 244, 237), (228, 230, 216), + (169, 209, 217), (108, 191, 233), (102, 175, 210), (92, 161, 200), + (93, 155, 194), (93, 146, 178), (103, 136, 153), (113, 135, 146), + (130, 126, 114), (132, 125, 109), (132, 125, 109), (138, 132, 116), + (144, 133, 115), (145, 139, 125), (153, 146, 130), (162, 156, 140), + (162, 156, 140), (152, 146, 132), (143, 137, 123), (132, 125, 109), + (131, 122, 105), (121, 112, 97), (110, 99, 81), (101, 88, 69), + (96, 85, 67), (107, 99, 80), (119, 112, 96), (127, 124, 109), + (132, 125, 109), (146, 135, 117), (169, 155, 129), (168, 161, 145), + (163, 163, 155), (162, 156, 140), (162, 156, 140), (153, 144, 129), + (132, 125, 109), (110, 98, 82), (94, 83, 65), (79, 64, 45), + (61, 43, 21), (53, 33, 8), (51, 31, 7), (49, 28, 7) + ), + +// 211 Apophysis-040427-4DeerDemMsk +((164, 151, 181), (1, 5, 16), (1, 2, 10), (1, 0, 4), + (0, 0, 2), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 1, 0), (0, 1, 0), + (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 1), (0, 0, 2), (0, 0, 2), (2, 0, 1), + (3, 4, 6), (21, 25, 22), (39, 46, 39), (115, 101, 68), + (192, 156, 98), (216, 184, 100), (240, 212, 102), (225, 244, 118), + (253, 253, 131), (252, 188, 78), (225, 139, 47), (199, 91, 16), + (120, 63, 20), (42, 36, 24), (8, 8, 8), (3, 3, 3), + (1, 1, 1), (0, 1, 1), (0, 2, 1), (0, 2, 0), + (0, 2, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 1, 0), (1, 1, 0), (1, 1, 0), (1, 1, 1), + (5, 6, 0), (28, 35, 4), (52, 65, 9), (94, 120, 16), + (136, 175, 24), (226, 214, 66), (243, 238, 82), (243, 222, 69), + (249, 195, 73), (39, 143, 46), (23, 97, 32), (7, 52, 19), + (7, 7, 5), (3, 3, 3), (2, 2, 2), (3, 1, 2), + (0, 1, 6), (0, 0, 4), (1, 0, 2), (1, 1, 2), + (2, 2, 2), (5, 5, 5), (11, 12, 7), (73, 61, 21), + (179, 156, 28), (255, 249, 89), (253, 250, 96), (252, 252, 104), + (245, 254, 101), (216, 235, 83), (157, 195, 56), (118, 98, 65), + (8, 7, 5), (5, 4, 6), (3, 2, 7), (0, 4, 7), + (1, 1, 1), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (1, 1, 1), (1, 1, 1), (2, 2, 2), + (5, 5, 5), (11, 11, 9), (70, 56, 30), (150, 146, 55), + (171, 168, 127), (179, 151, 150), (187, 135, 173), (168, 111, 146), + (226, 143, 103), (251, 161, 98), (236, 131, 112), (224, 102, 81), + (146, 127, 59), (39, 43, 29), (11, 11, 9), (4, 4, 2), + (2, 3, 0), (3, 2, 0), (3, 3, 3), (7, 6, 4), + (159, 40, 18), (185, 56, 28), (212, 72, 39), (190, 69, 104), + (92, 62, 54), (16, 12, 9), (5, 5, 5), (3, 3, 3), + (4, 4, 4), (9, 9, 9), (41, 30, 28), (108, 104, 93), + (176, 206, 146), (242, 218, 172), (241, 207, 179), (213, 163, 128), + (211, 161, 100), (141, 117, 71), (80, 51, 82), (134, 56, 140), + (218, 46, 122), (242, 183, 203), (251, 194, 201), (254, 237, 247), + (218, 236, 214), (194, 224, 160), (130, 135, 69), (36, 77, 59), + (15, 17, 12), (6, 6, 6), (2, 2, 2), (1, 1, 1), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (1, 0, 0), + (1, 0, 0), (3, 0, 0), (8, 0, 0), (6, 5, 3), + (14, 11, 4), (170, 36, 25), (243, 31, 56), (247, 10, 62), + (242, 15, 84), (247, 1, 146), (239, 3, 147), (248, 71, 152), + (223, 134, 118), (167, 210, 33), (126, 184, 22), (63, 143, 8), + (19, 20, 14), (8, 8, 6), (3, 3, 1), (1, 1, 1), + (1, 1, 1), (1, 1, 1), (3, 3, 3), (8, 3, 7), + (16, 7, 12), (121, 28, 72), (240, 3, 143), (243, 0, 156), + (204, 185, 213), (238, 225, 235), (250, 250, 212), (195, 223, 182) + ), + +// 212 Apophysis-040427-4CrouchDragn +((172, 5, 83), (177, 6, 84), (176, 6, 84), (175, 7, 85), + (168, 52, 89), (162, 97, 93), (175, 114, 68), (189, 132, 43), + (233, 166, 13), (236, 193, 6), (240, 220, 0), (241, 221, 0), + (242, 222, 1), (238, 215, 14), (234, 209, 28), (239, 212, 41), + (244, 216, 55), (254, 213, 63), (242, 196, 67), (230, 179, 72), + (228, 173, 53), (227, 167, 35), (221, 165, 38), (215, 163, 41), + (158, 133, 30), (153, 106, 37), (149, 79, 45), (157, 42, 62), + (166, 6, 80), (169, 5, 81), (172, 5, 83), (176, 5, 84), + (178, 5, 85), (178, 5, 85), (178, 5, 85), (178, 5, 85), + (177, 5, 85), (177, 6, 85), (176, 5, 84), (176, 5, 84), + (177, 4, 84), (177, 4, 84), (177, 4, 84), (176, 4, 84), + (176, 5, 84), (175, 5, 84), (174, 6, 84), (172, 6, 82), + (166, 6, 80), (151, 4, 72), (141, 4, 67), (132, 4, 63), + (122, 4, 58), (112, 4, 53), (115, 48, 27), (118, 93, 1), + (136, 111, 21), (132, 64, 43), (128, 18, 65), (135, 10, 66), + (142, 3, 68), (146, 3, 70), (151, 4, 72), (159, 3, 74), + (161, 3, 77), (172, 6, 82), (169, 5, 81), (167, 5, 80), + (164, 4, 79), (162, 4, 78), (159, 5, 77), (158, 4, 74), + (140, 4, 68), (137, 4, 66), (134, 4, 64), (127, 4, 61), + (121, 4, 59), (111, 4, 54), (101, 4, 49), (105, 79, 5), + (128, 100, 0), (173, 116, 11), (178, 115, 16), (184, 115, 22), + (172, 98, 52), (160, 82, 82), (150, 38, 84), (170, 15, 83), + (174, 6, 83), (175, 5, 83), (176, 5, 83), (176, 4, 83), + (177, 4, 84), (176, 5, 83), (173, 5, 82), (170, 5, 81), + (167, 5, 80), (162, 4, 78), (164, 4, 79), (167, 5, 80), + (167, 5, 80), (167, 5, 80), (172, 5, 83), (177, 6, 85), + (174, 113, 108), (189, 144, 114), (205, 175, 121), (228, 208, 168), + (251, 241, 216), (254, 248, 234), (243, 207, 123), (234, 191, 97), + (255, 211, 60), (242, 222, 3), (242, 222, 6), (242, 223, 9), + (233, 207, 32), (205, 186, 66), (192, 145, 65), (173, 110, 101), + (147, 88, 48), (164, 101, 43), (181, 115, 39), (190, 130, 38), + (199, 145, 37), (206, 140, 27), (209, 145, 19), (214, 148, 8), + (200, 124, 2), (196, 137, 19), (205, 137, 24), (214, 137, 29), + (225, 155, 33), (216, 156, 32), (205, 146, 30), (186, 135, 46), + (166, 48, 100), (170, 27, 92), (174, 6, 84), (175, 6, 84), + (177, 6, 85), (179, 6, 86), (180, 4, 85), (178, 5, 84), + (177, 4, 83), (173, 5, 82), (173, 5, 82), (173, 5, 82), + (173, 5, 82), (174, 6, 83), (174, 6, 83), (174, 6, 83), + (152, 72, 73), (159, 89, 45), (166, 107, 17), (186, 126, 12), + (189, 127, 8), (185, 125, 5), (162, 127, 1), (172, 112, 0), + (152, 100, 16), (145, 9, 71), (152, 7, 73), (159, 5, 75), + (160, 6, 76), (165, 5, 79), (167, 5, 80), (172, 6, 82), + (172, 19, 86), (175, 51, 97), (178, 84, 108), (186, 141, 60), + (204, 145, 43), (221, 162, 36), (229, 170, 40), (227, 171, 48), + (219, 168, 61), (232, 179, 67), (234, 180, 54), (242, 189, 31), + (239, 186, 12), (240, 185, 6), (241, 187, 1), (224, 174, 1), + (180, 121, 19), (164, 103, 13), (148, 85, 8), (135, 12, 66), + (145, 5, 68), (159, 5, 75), (161, 5, 76), (165, 5, 79), + (166, 6, 80), (167, 5, 80), (167, 5, 80), (170, 5, 81), + (172, 6, 82), (173, 5, 82), (173, 5, 82), (173, 5, 82), + (172, 5, 83), (172, 5, 83), (169, 4, 80), (165, 5, 79), + (160, 4, 77), (152, 5, 73), (140, 4, 68), (122, 3, 59), + (107, 4, 51), (111, 64, 10), (117, 92, 0), (129, 101, 1), + (145, 93, 9), (160, 94, 7), (144, 94, 21), (136, 84, 45), + (153, 21, 78), (159, 8, 77), (166, 6, 80), (172, 6, 82), + (176, 5, 83), (177, 4, 84), (177, 4, 84), (178, 5, 85), + (178, 5, 85), (178, 5, 85), (178, 5, 85), (178, 5, 85), + (178, 5, 85), (178, 5, 85), (176, 5, 84), (173, 5, 82), + (166, 4, 79), (158, 4, 74), (142, 2, 65), (125, 4, 58), + (110, 4, 53), (101, 4, 49), (101, 4, 49), (111, 3, 53), + (129, 8, 62), (148, 88, 15), (184, 128, 33), (206, 153, 41), + (212, 191, 38), (224, 204, 19), (239, 216, 0), (242, 188, 0), + (227, 175, 1), (226, 160, 20), (197, 136, 21), (155, 61, 87), + (153, 24, 81), (162, 8, 78), (166, 6, 80), (176, 5, 84) + ), + +// 213 Apophysis-040427-4CopprMapleleaf +((24, 5, 0), (33, 1, 4), (45, 10, 7), (57, 20, 11), + (65, 28, 18), (74, 36, 25), (74, 36, 24), (74, 36, 23), + (68, 30, 19), (57, 26, 15), (47, 23, 11), (44, 19, 7), + (42, 16, 3), (35, 10, 7), (28, 5, 11), (26, 7, 12), + (24, 9, 14), (53, 15, 12), (82, 41, 33), (112, 68, 55), + (145, 96, 82), (178, 125, 109), (193, 138, 120), (208, 151, 132), + (242, 196, 160), (244, 197, 164), (246, 199, 169), (239, 186, 162), + (232, 173, 155), (225, 167, 149), (219, 162, 143), (208, 151, 132), + (195, 139, 122), (170, 119, 102), (152, 103, 87), (135, 88, 72), + (116, 71, 56), (97, 55, 41), (92, 51, 38), (87, 47, 35), + (85, 45, 33), (99, 57, 44), (113, 69, 56), (141, 99, 78), + (169, 130, 101), (182, 141, 111), (196, 153, 121), (227, 182, 149), + (243, 188, 168), (253, 203, 180), (251, 205, 176), (250, 207, 172), + (245, 193, 166), (240, 179, 160), (224, 165, 147), (209, 152, 135), + (168, 117, 100), (144, 96, 81), (121, 75, 62), (111, 67, 53), + (101, 59, 45), (99, 57, 43), (98, 56, 42), (96, 54, 42), + (91, 49, 37), (102, 58, 45), (103, 59, 46), (104, 60, 47), + (102, 59, 45), (100, 58, 44), (87, 56, 35), (79, 41, 30), + (79, 39, 29), (91, 49, 38), (104, 60, 47), (112, 67, 54), + (120, 74, 61), (182, 129, 113), (245, 184, 165), (208, 151, 132), + (171, 118, 102), (141, 94, 78), (132, 85, 70), (123, 77, 62), + (124, 78, 63), (125, 79, 64), (142, 95, 79), (156, 107, 92), + (175, 122, 106), (178, 125, 109), (181, 128, 112), (175, 123, 107), + (170, 119, 102), (151, 102, 87), (135, 88, 72), (124, 78, 63), + (112, 69, 52), (110, 66, 53), (117, 72, 58), (124, 78, 63), + (134, 87, 72), (145, 96, 81), (163, 111, 97), (186, 133, 115), + (227, 168, 150), (232, 185, 165), (238, 202, 180), (237, 203, 185), + (237, 205, 190), (233, 210, 192), (235, 209, 194), (240, 204, 188), + (243, 200, 181), (241, 195, 161), (238, 192, 158), (235, 189, 155), + (211, 166, 135), (209, 166, 132), (203, 164, 133), (207, 163, 134), + (237, 179, 159), (237, 192, 173), (238, 205, 188), (235, 207, 189), + (232, 209, 191), (235, 206, 190), (237, 202, 180), (242, 185, 165), + (223, 164, 146), (187, 131, 114), (172, 118, 103), (158, 106, 92), + (138, 91, 75), (123, 77, 64), (107, 69, 56), (105, 61, 48), + (112, 69, 53), (123, 84, 62), (135, 100, 72), (144, 108, 81), + (154, 117, 90), (169, 130, 101), (197, 141, 124), (216, 159, 140), + (246, 185, 166), (247, 190, 171), (242, 191, 164), (238, 192, 158), + (211, 168, 134), (187, 146, 114), (176, 123, 107), (173, 122, 105), + (178, 137, 107), (187, 138, 115), (196, 140, 123), (202, 146, 129), + (203, 147, 130), (200, 153, 133), (204, 148, 131), (192, 136, 119), + (173, 120, 104), (152, 103, 88), (151, 102, 87), (151, 102, 87), + (147, 98, 83), (149, 100, 85), (155, 106, 91), (158, 109, 94), + (167, 116, 99), (163, 113, 97), (160, 111, 96), (154, 105, 90), + (145, 96, 81), (144, 95, 80), (135, 87, 73), (124, 78, 63), + (124, 78, 63), (123, 77, 62), (113, 70, 54), (112, 69, 53), + (104, 70, 45), (113, 79, 54), (132, 96, 70), (152, 103, 88), + (183, 130, 112), (186, 133, 115), (190, 137, 119), (199, 143, 126), + (206, 149, 130), (206, 161, 130), (223, 164, 146), (235, 177, 157), + (240, 182, 162), (250, 189, 170), (251, 198, 180), (250, 202, 182), + (248, 206, 192), (246, 215, 195), (239, 212, 193), (238, 205, 190), + (243, 201, 187), (250, 202, 182), (253, 199, 187), (251, 206, 187), + (249, 206, 187), (249, 206, 190), (236, 208, 194), (231, 214, 196), + (234, 221, 205), (232, 225, 207), (240, 240, 216), (245, 239, 223), + (233, 224, 207), (231, 222, 205), (229, 224, 205), (227, 220, 204), + (227, 220, 204), (226, 220, 204), (225, 218, 202), (224, 221, 204), + (202, 240, 219), (222, 231, 204), (225, 223, 200), (227, 220, 202), + (227, 218, 203), (229, 217, 203), (227, 214, 198), (235, 209, 196), + (247, 200, 192), (250, 200, 193), (248, 213, 194), (238, 216, 195), + (233, 216, 198), (232, 220, 204), (232, 213, 206), (231, 214, 198), + (235, 206, 190), (231, 187, 152), (195, 143, 122), (157, 108, 93), + (123, 77, 64), (73, 61, 49), (48, 20, 9), (21, 10, 8), + (16, 21, 17), (30, 24, 10), (60, 23, 14), (75, 37, 26), + (87, 47, 35), (91, 49, 37), (104, 60, 47), (95, 53, 39), + (83, 43, 31), (72, 34, 23), (51, 17, 7), (31, 5, 8) + ), + +// 214 Apophysis-040427-4Circulations +((243, 231, 189), (255, 250, 221), (253, 248, 226), (252, 246, 232), + (252, 244, 236), (253, 243, 241), (254, 243, 241), (255, 244, 242), + (253, 245, 242), (253, 247, 241), (253, 249, 240), (254, 248, 239), + (255, 248, 238), (253, 250, 240), (251, 253, 242), (251, 254, 246), + (252, 255, 251), (254, 254, 254), (254, 254, 254), (255, 255, 255), + (254, 254, 254), (254, 254, 254), (254, 254, 254), (254, 254, 254), + (255, 245, 253), (254, 249, 253), (254, 254, 254), (254, 254, 254), + (254, 254, 254), (252, 250, 252), (251, 246, 250), (252, 244, 241), + (251, 243, 222), (242, 220, 171), (228, 198, 124), (214, 176, 77), + (164, 129, 42), (115, 83, 8), (83, 61, 4), (52, 40, 0), + (11, 3, 0), (13, 7, 1), (15, 11, 2), (29, 20, 1), + (43, 30, 0), (57, 40, 0), (71, 51, 1), (105, 75, 2), + (150, 109, 4), (187, 144, 32), (204, 163, 54), (221, 183, 76), + (230, 202, 118), (240, 222, 160), (243, 224, 170), (247, 226, 181), + (250, 242, 221), (250, 242, 221), (250, 242, 221), (248, 237, 208), + (246, 232, 195), (241, 226, 178), (236, 220, 161), (237, 202, 118), + (217, 182, 82), (164, 121, 9), (126, 93, 4), (88, 65, 0), + (81, 58, 0), (74, 51, 0), (71, 51, 1), (73, 52, 0), + (94, 65, 0), (116, 83, 2), (139, 101, 4), (149, 107, 3), + (160, 114, 2), (160, 116, 4), (160, 118, 6), (163, 120, 5), + (160, 117, 2), (166, 121, 6), (177, 133, 19), (188, 145, 32), + (203, 161, 57), (218, 178, 82), (233, 203, 130), (242, 223, 167), + (248, 233, 210), (250, 239, 219), (253, 246, 228), (252, 244, 225), + (251, 243, 222), (250, 234, 211), (248, 234, 205), (246, 232, 193), + (244, 227, 181), (246, 232, 193), (248, 233, 203), (250, 235, 214), + (249, 240, 222), (248, 245, 230), (245, 244, 242), (249, 247, 250), + (252, 255, 255), (252, 252, 248), (252, 249, 242), (252, 248, 235), + (252, 247, 228), (247, 244, 213), (244, 231, 199), (235, 207, 160), + (219, 189, 116), (148, 106, 8), (119, 86, 5), (91, 67, 3), + (50, 38, 0), (29, 15, 2), (23, 18, 0), (33, 20, 12), + (65, 48, 2), (88, 61, 1), (111, 75, 0), (120, 84, 0), + (130, 94, 0), (146, 105, 0), (157, 113, 4), (151, 109, 1), + (139, 98, 6), (68, 50, 0), (52, 39, 0), (36, 29, 1), + (32, 21, 1), (43, 32, 2), (76, 55, 0), (112, 91, 38), + (228, 209, 167), (236, 219, 185), (245, 229, 203), (248, 234, 216), + (252, 239, 230), (251, 243, 240), (252, 244, 241), (253, 245, 243), + (253, 245, 243), (253, 245, 243), (253, 245, 243), (254, 246, 244), + (254, 246, 244), (254, 243, 247), (255, 244, 248), (255, 246, 251), + (253, 242, 248), (251, 244, 247), (250, 246, 247), (253, 245, 243), + (255, 248, 246), (255, 249, 247), (255, 245, 244), (253, 245, 243), + (253, 245, 243), (252, 248, 237), (252, 247, 233), (252, 246, 230), + (253, 246, 228), (250, 243, 224), (250, 231, 214), (247, 230, 210), + (251, 246, 226), (251, 248, 225), (252, 250, 225), (255, 250, 226), + (252, 247, 228), (252, 246, 232), (251, 247, 238), (252, 244, 241), + (253, 243, 241), (253, 243, 241), (252, 248, 237), (253, 246, 228), + (251, 236, 215), (248, 234, 199), (246, 227, 185), (242, 220, 163), + (217, 181, 87), (212, 177, 81), (208, 174, 76), (189, 147, 35), + (174, 131, 18), (169, 124, 9), (161, 118, 3), (143, 102, 0), + (120, 88, 3), (104, 72, 0), (84, 60, 0), (78, 57, 0), + (86, 56, 2), (109, 80, 20), (172, 130, 20), (208, 166, 68), + (223, 189, 102), (239, 210, 154), (248, 219, 163), (244, 226, 178), + (246, 232, 193), (247, 234, 199), (247, 234, 199), (248, 234, 205), + (248, 234, 205), (242, 229, 210), (248, 225, 209), (248, 226, 205), + (247, 226, 205), (245, 231, 205), (247, 234, 199), (247, 233, 198), + (255, 235, 182), (254, 211, 143), (222, 182, 94), (212, 174, 75), + (187, 148, 47), (181, 138, 23), (197, 155, 43), (214, 176, 77), + (232, 200, 123), (243, 216, 169), (248, 226, 189), (247, 235, 209), + (251, 246, 227), (253, 247, 233), (252, 244, 241), (253, 245, 243), + (253, 248, 242), (251, 249, 237), (252, 246, 230), (253, 246, 228), + (253, 246, 228), (253, 246, 230), (252, 248, 237), (251, 249, 237), + (251, 249, 236), (252, 246, 230), (253, 246, 230), (253, 246, 228), + (253, 246, 228), (251, 246, 226), (251, 244, 226), (251, 236, 213), + (248, 232, 209), (245, 227, 203), (245, 225, 188), (244, 221, 179), + (239, 215, 155), (237, 213, 143), (230, 195, 114), (222, 192, 102) + ), + +// 215 Apophysis-040427-4DmnContaind +((245, 179, 83), (251, 216, 174), (253, 207, 146), (255, 199, 119), + (251, 196, 107), (248, 194, 96), (251, 193, 92), (255, 193, 89), + (255, 170, 87), (252, 179, 95), (250, 188, 103), (252, 198, 124), + (254, 208, 146), (251, 213, 165), (248, 218, 184), (231, 214, 203), + (214, 211, 222), (177, 148, 254), (163, 141, 184), (149, 134, 115), + (162, 121, 68), (175, 108, 21), (182, 108, 10), (190, 108, 0), + (236, 132, 1), (245, 146, 20), (255, 160, 39), (253, 177, 82), + (251, 194, 125), (240, 201, 154), (229, 209, 184), (175, 164, 204), + (99, 81, 131), (79, 56, 24), (79, 51, 16), (79, 47, 9), + (56, 39, 23), (33, 32, 38), (32, 19, 68), (31, 6, 98), + (63, 9, 217), (86, 32, 236), (109, 55, 255), (118, 68, 255), + (128, 81, 255), (132, 86, 253), (137, 91, 251), (143, 103, 254), + (146, 106, 254), (180, 152, 254), (192, 177, 234), (205, 203, 214), + (229, 197, 162), (254, 191, 111), (254, 182, 90), (255, 174, 69), + (255, 145, 4), (255, 141, 2), (255, 138, 0), (235, 129, 0), + (215, 121, 0), (211, 119, 0), (207, 117, 0), (202, 115, 0), + (194, 109, 0), (192, 107, 0), (179, 100, 0), (167, 94, 0), + (164, 90, 1), (161, 87, 2), (147, 83, 0), (132, 72, 0), + (89, 55, 10), (60, 28, 65), (32, 1, 121), (47, 0, 177), + (62, 0, 233), (66, 2, 244), (71, 4, 255), (72, 19, 245), + (74, 29, 194), (64, 59, 81), (95, 66, 42), (127, 74, 4), + (136, 77, 2), (145, 80, 0), (157, 90, 1), (143, 94, 35), + (172, 147, 241), (177, 151, 248), (182, 156, 255), (181, 155, 254), + (180, 154, 253), (179, 152, 255), (168, 137, 254), (155, 119, 255), + (141, 100, 254), (113, 60, 255), (86, 37, 212), (59, 15, 170), + (45, 7, 146), (32, 0, 123), (22, 0, 79), (13, 0, 48), + (7, 5, 19), (11, 2, 39), (15, 0, 59), (20, 0, 79), + (26, 0, 99), (39, 0, 143), (57, 1, 212), (85, 23, 254), + (108, 53, 255), (130, 84, 255), (135, 92, 255), (141, 100, 255), + (145, 105, 255), (154, 118, 254), (145, 123, 205), (160, 115, 60), + (241, 141, 4), (248, 143, 4), (255, 145, 4), (255, 145, 4), + (255, 145, 4), (254, 148, 10), (255, 160, 40), (247, 175, 93), + (241, 192, 116), (177, 148, 254), (161, 127, 254), (146, 106, 254), + (142, 102, 250), (139, 98, 255), (132, 91, 247), (124, 84, 232), + (136, 94, 255), (134, 90, 255), (132, 86, 255), (132, 86, 255), + (132, 86, 255), (122, 74, 255), (110, 56, 254), (88, 53, 197), + (62, 26, 160), (18, 3, 58), (15, 1, 52), (12, 0, 46), + (2, 4, 17), (2, 0, 3), (3, 0, 0), (2, 2, 2), + (21, 5, 68), (28, 2, 100), (36, 0, 132), (59, 0, 214), + (87, 25, 255), (96, 39, 255), (100, 44, 255), (95, 38, 255), + (80, 17, 254), (41, 2, 127), (33, 1, 113), (26, 0, 99), + (17, 1, 66), (11, 0, 51), (15, 0, 55), (21, 0, 77), + (52, 22, 136), (65, 25, 166), (78, 29, 196), (105, 54, 245), + (112, 60, 255), (120, 72, 255), (122, 74, 255), (127, 80, 255), + (128, 81, 255), (132, 86, 255), (136, 94, 254), (140, 99, 255), + (144, 103, 255), (150, 111, 255), (154, 117, 255), (160, 129, 255), + (188, 163, 255), (192, 168, 255), (196, 174, 255), (204, 184, 255), + (242, 220, 196), (255, 215, 164), (255, 206, 140), (255, 192, 112), + (255, 190, 108), (254, 198, 123), (251, 214, 169), (210, 206, 223), + (189, 164, 255), (178, 149, 255), (169, 139, 253), (157, 121, 255), + (176, 147, 255), (184, 159, 253), (194, 178, 240), (198, 197, 211), + (254, 208, 146), (255, 193, 106), (255, 162, 48), (222, 127, 1), + (166, 97, 20), (84, 83, 91), (76, 65, 107), (72, 41, 160), + (99, 58, 216), (129, 83, 254), (155, 119, 255), (156, 120, 255), + (161, 129, 255), (161, 129, 252), (157, 121, 255), (146, 106, 255), + (132, 86, 255), (117, 66, 255), (107, 58, 255), (104, 49, 254), + (96, 39, 255), (95, 38, 255), (78, 15, 255), (63, 1, 236), + (69, 37, 162), (66, 55, 97), (112, 63, 23), (165, 95, 0), + (208, 124, 2), (236, 134, 0), (255, 144, 2), (255, 160, 0), + (255, 152, 17), (254, 173, 68), (255, 186, 83), (255, 174, 69), + (253, 167, 64), (228, 158, 44), (170, 117, 49), (104, 81, 65), + (101, 79, 65), (137, 93, 32), (148, 87, 6), (183, 104, 3), + (194, 109, 3), (199, 129, 43), (182, 141, 75), (147, 141, 167), + (177, 151, 252), (201, 180, 255), (222, 217, 213), (246, 195, 129) + ), + +// 216 Apophysis-040427-4DmnCntndWP +((116, 190, 251), (121, 191, 251), (123, 192, 249), (126, 193, 248), + (131, 196, 250), (137, 200, 253), (138, 200, 253), (140, 200, 254), + (171, 216, 255), (172, 215, 252), (174, 214, 249), (197, 215, 230), + (220, 217, 212), (228, 214, 201), (237, 212, 190), (231, 212, 197), + (226, 213, 204), (161, 205, 240), (149, 201, 246), (137, 198, 252), + (133, 193, 245), (130, 188, 238), (130, 188, 238), (130, 188, 238), + (132, 185, 229), (141, 167, 194), (150, 150, 160), (201, 150, 114), + (253, 151, 69), (252, 137, 46), (252, 124, 23), (245, 127, 40), + (255, 155, 77), (208, 171, 142), (177, 162, 151), (146, 153, 161), + (115, 132, 144), (84, 111, 128), (71, 103, 128), (59, 95, 129), + (84, 138, 184), (90, 156, 211), (96, 174, 238), (83, 171, 244), + (70, 169, 250), (59, 163, 248), (48, 158, 247), (35, 154, 254), + (21, 148, 253), (5, 135, 245), (2, 133, 243), (0, 132, 241), + (2, 129, 235), (4, 127, 230), (2, 121, 220), (0, 115, 210), + (1, 68, 123), (0, 59, 108), (0, 51, 94), (2, 47, 86), + (4, 44, 79), (8, 46, 80), (13, 49, 81), (8, 61, 105), + (4, 67, 121), (17, 126, 217), (75, 152, 217), (133, 178, 217), + (149, 183, 215), (165, 189, 213), (201, 201, 201), (244, 189, 148), + (212, 169, 137), (186, 178, 174), (160, 188, 212), (147, 189, 226), + (135, 191, 240), (133, 194, 245), (132, 197, 251), (127, 196, 255), + (124, 193, 252), (130, 197, 252), (150, 195, 234), (171, 193, 216), + (192, 192, 194), (213, 192, 173), (217, 164, 122), (238, 147, 76), + (183, 82, 0), (169, 83, 16), (155, 85, 33), (162, 88, 30), + (170, 92, 28), (198, 90, 2), (235, 106, 4), (253, 113, 0), + (204, 121, 53), (128, 81, 35), (100, 96, 89), (72, 111, 144), + (60, 105, 144), (48, 99, 144), (41, 97, 144), (31, 110, 177), + (15, 122, 218), (24, 137, 234), (34, 152, 250), (53, 161, 252), + (72, 171, 254), (89, 180, 253), (102, 185, 255), (105, 186, 252), + (106, 185, 251), (54, 160, 248), (46, 158, 251), (38, 156, 254), + (28, 151, 254), (24, 147, 250), (10, 133, 236), (0, 130, 236), + (11, 80, 137), (25, 60, 90), (39, 40, 44), (56, 47, 43), + (73, 55, 43), (142, 66, 6), (143, 60, 0), (126, 55, 1), + (54, 24, 0), (22, 18, 15), (11, 19, 26), (1, 20, 37), + (3, 33, 59), (1, 20, 35), (4, 5, 7), (18, 6, 0), + (8, 17, 24), (10, 36, 59), (12, 56, 95), (26, 68, 105), + (41, 81, 116), (50, 94, 133), (63, 98, 128), (55, 100, 141), + (56, 107, 150), (61, 126, 180), (66, 138, 198), (72, 150, 216), + (93, 163, 223), (132, 174, 216), (171, 169, 170), (127, 192, 248), + (135, 200, 254), (137, 200, 254), (140, 200, 254), (145, 199, 246), + (172, 200, 224), (211, 206, 202), (240, 203, 174), (245, 205, 170), + (252, 207, 168), (224, 214, 205), (203, 205, 207), (183, 197, 210), + (158, 202, 239), (150, 204, 250), (153, 202, 243), (180, 202, 223), + (254, 202, 162), (254, 190, 140), (254, 178, 118), (236, 165, 109), + (255, 169, 98), (250, 158, 85), (188, 134, 96), (143, 95, 57), + (137, 70, 18), (76, 42, 15), (52, 61, 70), (54, 94, 129), + (28, 116, 190), (39, 147, 237), (70, 166, 250), (91, 179, 253), + (113, 188, 253), (115, 190, 253), (118, 192, 253), (108, 186, 252), + (77, 173, 250), (49, 159, 254), (34, 152, 252), (29, 145, 244), + (10, 127, 223), (7, 115, 205), (36, 89, 133), (31, 66, 96), + (39, 31, 28), (47, 33, 24), (30, 60, 88), (47, 91, 128), + (63, 114, 157), (36, 114, 180), (26, 130, 217), (21, 130, 223), + (32, 146, 242), (27, 149, 255), (25, 151, 253), (16, 144, 251), + (11, 132, 236), (10, 121, 213), (31, 109, 175), (25, 78, 122), + (9, 65, 114), (5, 65, 117), (19, 78, 138), (10, 109, 190), + (7, 116, 209), (9, 119, 208), (19, 110, 189), (24, 91, 146), + (34, 81, 123), (36, 64, 88), (120, 74, 38), (143, 65, 1), + (171, 77, 3), (186, 94, 21), (216, 116, 30), (154, 108, 82), + (127, 122, 119), (122, 153, 181), (102, 149, 191), (34, 136, 221), + (32, 145, 239), (37, 145, 235), (66, 168, 253), (84, 176, 253), + (91, 179, 253), (100, 183, 251), (101, 180, 247), (88, 175, 246), + (78, 173, 253), (72, 171, 255), (65, 166, 254), (68, 168, 253), + (91, 179, 253), (98, 181, 251), (105, 183, 249), (109, 178, 237), + (106, 172, 230), (109, 179, 238), (113, 187, 250), (112, 187, 252), + (106, 184, 248), (111, 187, 249), (115, 185, 245), (115, 190, 248) + ), + +// 217 Apophysis-040427-4DmnDimensn +((139, 118, 97), (129, 113, 124), (123, 110, 111), (118, 108, 98), + (92, 91, 95), (67, 74, 93), (72, 55, 56), (78, 37, 19), + (77, 36, 18), (86, 40, 44), (95, 45, 70), (99, 45, 84), + (104, 45, 99), (112, 52, 97), (120, 60, 96), (124, 56, 87), + (129, 53, 79), (161, 45, 84), (145, 68, 101), (130, 91, 118), + (119, 90, 115), (108, 90, 112), (99, 77, 105), (91, 64, 99), + (77, 36, 18), (77, 36, 18), (77, 36, 18), (98, 55, 47), + (120, 74, 77), (146, 93, 103), (173, 112, 130), (228, 158, 166), + (230, 182, 196), (228, 166, 181), (190, 153, 118), (153, 141, 55), + (149, 143, 55), (145, 145, 55), (139, 135, 57), (134, 125, 60), + (164, 111, 61), (166, 78, 64), (168, 46, 67), (169, 50, 72), + (171, 55, 78), (172, 48, 77), (173, 42, 76), (162, 29, 58), + (166, 28, 51), (162, 4, 19), (134, 3, 22), (107, 3, 26), + (92, 19, 22), (77, 36, 18), (77, 36, 18), (77, 36, 18), + (77, 36, 18), (77, 36, 18), (78, 37, 19), (102, 74, 54), + (126, 111, 90), (142, 117, 104), (159, 124, 118), (214, 117, 128), + (224, 107, 133), (190, 123, 141), (157, 118, 136), (125, 114, 131), + (112, 116, 131), (100, 118, 132), (94, 120, 121), (114, 117, 126), + (138, 94, 119), (152, 64, 87), (167, 34, 55), (163, 18, 37), + (159, 2, 19), (153, 1, 14), (148, 0, 10), (142, 0, 43), + (99, 0, 108), (101, 15, 106), (117, 7, 70), (133, 0, 34), + (128, 0, 28), (124, 0, 23), (77, 36, 18), (77, 36, 18), + (77, 36, 18), (78, 49, 56), (80, 63, 95), (89, 79, 109), + (99, 96, 123), (113, 118, 114), (111, 116, 96), (102, 110, 97), + (106, 78, 93), (78, 37, 19), (77, 36, 18), (77, 36, 18), + (77, 36, 18), (77, 36, 18), (77, 36, 18), (77, 36, 18), + (77, 36, 18), (77, 36, 18), (77, 36, 18), (77, 36, 18), + (77, 36, 18), (77, 36, 18), (77, 36, 18), (78, 37, 19), + (127, 55, 59), (132, 101, 55), (143, 105, 79), (155, 110, 104), + (151, 129, 106), (143, 122, 93), (114, 142, 83), (37, 158, 79), + (85, 123, 136), (100, 126, 120), (116, 130, 104), (126, 155, 108), + (136, 181, 112), (156, 219, 78), (165, 157, 85), (178, 141, 112), + (239, 174, 180), (249, 220, 240), (252, 232, 247), (255, 244, 255), + (230, 227, 234), (222, 220, 242), (245, 211, 236), (224, 195, 215), + (142, 105, 139), (91, 61, 118), (41, 18, 98), (46, 12, 96), + (52, 6, 94), (63, 37, 66), (77, 36, 18), (77, 36, 18), + (77, 36, 18), (77, 36, 18), (77, 36, 18), (77, 36, 18), + (77, 36, 18), (77, 36, 18), (77, 36, 18), (77, 36, 18), + (77, 36, 18), (77, 36, 18), (77, 36, 18), (99, 30, 59), + (135, 39, 67), (157, 36, 71), (162, 18, 45), (137, 7, 33), + (77, 36, 18), (77, 36, 18), (77, 36, 18), (77, 36, 18), + (77, 36, 18), (76, 38, 2), (77, 36, 18), (77, 36, 18), + (77, 36, 18), (77, 36, 18), (77, 36, 18), (77, 36, 18), + (77, 36, 18), (50, 68, 56), (55, 93, 80), (92, 95, 88), + (141, 135, 57), (20, 13, 106), (25, 13, 111), (44, 13, 107), + (71, 0, 101), (104, 64, 153), (140, 125, 132), (167, 119, 143), + (230, 138, 159), (224, 134, 153), (218, 131, 147), (225, 110, 125), + (210, 100, 111), (207, 86, 101), (187, 47, 94), (174, 44, 92), + (164, 41, 72), (152, 30, 55), (150, 28, 41), (143, 38, 53), + (77, 36, 18), (77, 36, 18), (77, 36, 18), (77, 36, 18), + (77, 36, 18), (77, 36, 18), (77, 36, 18), (77, 36, 18), + (77, 36, 18), (128, 5, 23), (140, 0, 35), (156, 3, 21), + (146, 18, 33), (144, 19, 49), (139, 31, 65), (120, 24, 98), + (97, 41, 90), (87, 59, 100), (81, 71, 98), (88, 84, 111), + (82, 65, 120), (52, 43, 126), (48, 24, 136), (0, 73, 143), + (38, 99, 156), (75, 100, 120), (84, 125, 111), (82, 139, 133), + (99, 134, 140), (118, 139, 170), (133, 156, 172), (224, 153, 171), + (230, 159, 173), (217, 132, 151), (183, 92, 109), (163, 58, 73), + (149, 53, 64), (78, 37, 19), (77, 36, 18), (77, 36, 18), + (79, 38, 20), (137, 92, 59), (122, 108, 79), (164, 70, 96), + (191, 59, 70), (199, 83, 94), (179, 88, 105), (167, 73, 99), + (166, 71, 95), (153, 58, 102), (134, 44, 98), (135, 21, 106), + (118, 51, 105), (109, 72, 105), (114, 91, 120), (100, 107, 117), + (85, 97, 135), (95, 110, 139), (121, 101, 128), (139, 103, 117) + ), + +// 218 Apophysis-040427-4SatnFlorlSwag +((115, 96, 79), (58, 30, 44), (42, 31, 43), (26, 33, 43), + (13, 47, 45), (0, 62, 48), (15, 63, 53), (30, 65, 59), + (120, 89, 71), (146, 108, 87), (172, 127, 104), (190, 142, 121), + (209, 158, 139), (215, 158, 152), (221, 158, 166), (229, 157, 172), + (238, 156, 178), (227, 181, 168), (209, 196, 154), (191, 211, 140), + (163, 201, 135), (136, 192, 131), (133, 190, 130), (131, 189, 130), + (127, 190, 143), (143, 193, 153), (159, 196, 163), (151, 195, 153), + (144, 194, 143), (145, 197, 137), (147, 200, 132), (187, 158, 118), + (174, 129, 106), (170, 128, 104), (181, 155, 115), (193, 182, 126), + (205, 188, 138), (218, 195, 151), (220, 198, 152), (223, 201, 154), + (224, 168, 169), (212, 154, 153), (200, 141, 137), (181, 122, 116), + (163, 104, 96), (159, 100, 93), (156, 97, 91), (140, 113, 86), + (116, 130, 105), (28, 102, 129), (20, 82, 122), (12, 62, 115), + (6, 45, 102), (0, 29, 89), (5, 17, 84), (10, 6, 80), + (46, 40, 88), (76, 60, 78), (107, 80, 69), (107, 73, 65), + (108, 67, 61), (111, 66, 57), (114, 66, 54), (111, 65, 52), + (110, 61, 57), (119, 65, 63), (122, 64, 67), (126, 63, 72), + (124, 62, 70), (122, 61, 68), (119, 57, 68), (108, 55, 63), + (50, 26, 50), (25, 14, 25), (1, 3, 0), (1, 2, 0), + (2, 2, 0), (11, 14, 13), (21, 27, 27), (55, 29, 38), + (81, 39, 49), (109, 60, 56), (114, 71, 64), (119, 82, 73), + (126, 86, 78), (134, 91, 84), (149, 94, 87), (153, 94, 90), + (167, 98, 103), (185, 128, 119), (203, 158, 135), (194, 175, 140), + (185, 193, 146), (189, 189, 189), (146, 170, 172), (127, 127, 127), + (111, 92, 78), (62, 40, 52), (52, 29, 47), (43, 19, 43), + (45, 21, 43), (48, 23, 44), (70, 38, 49), (99, 57, 59), + (102, 75, 68), (92, 66, 60), (82, 57, 52), (65, 55, 44), + (49, 53, 36), (32, 46, 29), (47, 31, 32), (79, 44, 48), + (105, 56, 62), (131, 66, 74), (130, 66, 74), (130, 67, 75), + (124, 75, 68), (122, 82, 70), (109, 79, 68), (90, 74, 77), + (37, 56, 96), (25, 43, 94), (14, 30, 92), (14, 21, 87), + (15, 12, 83), (36, 25, 68), (56, 21, 61), (53, 30, 56), + (55, 28, 47), (49, 103, 105), (62, 130, 125), (75, 157, 145), + (76, 154, 164), (67, 156, 160), (50, 109, 123), (52, 84, 122), + (70, 117, 111), (83, 131, 112), (96, 145, 113), (103, 154, 115), + (110, 163, 117), (115, 184, 155), (105, 181, 169), (108, 178, 154), + (109, 156, 136), (94, 81, 75), (97, 78, 71), (100, 75, 68), + (86, 50, 64), (65, 39, 76), (56, 34, 55), (46, 22, 48), + (14, 17, 50), (13, 14, 55), (13, 11, 60), (24, 12, 62), + (56, 33, 53), (84, 53, 51), (102, 56, 56), (105, 54, 59), + (108, 58, 57), (120, 60, 68), (124, 62, 71), (128, 65, 74), + (141, 81, 80), (150, 89, 88), (152, 100, 89), (145, 90, 83), + (113, 61, 63), (101, 58, 59), (89, 55, 56), (50, 60, 36), + (9, 74, 40), (6, 84, 42), (0, 90, 68), (70, 78, 91), + (80, 81, 99), (81, 114, 97), (105, 139, 123), (105, 145, 144), + (114, 162, 148), (142, 173, 168), (185, 185, 185), (190, 190, 190), + (193, 193, 193), (198, 199, 200), (204, 205, 207), (224, 224, 224), + (225, 225, 217), (195, 195, 195), (194, 194, 184), (189, 194, 188), + (191, 191, 191), (196, 192, 191), (214, 181, 146), (207, 163, 150), + (195, 142, 128), (184, 113, 121), (164, 90, 107), (169, 105, 105), + (192, 128, 128), (205, 138, 145), (203, 143, 143), (198, 150, 130), + (184, 138, 115), (183, 126, 115), (184, 145, 116), (199, 152, 132), + (206, 158, 138), (209, 152, 135), (185, 121, 121), (170, 94, 107), + (246, 39, 49), (154, 83, 89), (149, 82, 89), (137, 70, 79), + (130, 70, 72), (135, 77, 75), (139, 96, 79), (142, 100, 84), + (137, 99, 80), (137, 99, 80), (133, 90, 74), (120, 73, 65), + (119, 63, 62), (119, 65, 63), (112, 75, 66), (113, 81, 70), + (108, 81, 70), (110, 76, 66), (115, 75, 65), (109, 66, 59), + (103, 62, 56), (99, 61, 52), (95, 45, 46), (66, 32, 48), + (40, 13, 44), (5, 3, 8), (0, 0, 0), (0, 0, 0), + (10, 12, 60), (0, 0, 69), (0, 0, 74), (2, 19, 89), + (0, 35, 128), (0, 67, 136), (0, 69, 137), (12, 99, 118), + (29, 101, 126), (59, 118, 116), (91, 138, 120), (125, 125, 125), + (162, 131, 102), (165, 130, 102), (152, 122, 94), (147, 117, 83) + ), + +// 219 Apophysis-040427-4DDragHeart +((114, 84, 22), (131, 106, 50), (178, 143, 91), (225, 181, 132), + (225, 181, 132), (225, 181, 132), (200, 168, 113), (175, 155, 94), + (114, 88, 29), (114, 86, 26), (114, 84, 24), (114, 83, 23), + (115, 83, 22), (115, 82, 21), (116, 82, 21), (116, 82, 21), + (116, 82, 21), (113, 83, 19), (111, 80, 19), (110, 78, 19), + (106, 77, 20), (103, 76, 21), (89, 61, 28), (75, 47, 35), + (99, 73, 22), (103, 75, 22), (107, 78, 22), (108, 78, 23), + (109, 78, 24), (109, 79, 24), (110, 81, 25), (109, 83, 24), + (109, 83, 22), (110, 86, 24), (111, 86, 26), (113, 87, 28), + (124, 99, 37), (136, 111, 47), (154, 133, 69), (173, 155, 91), + (189, 174, 115), (153, 127, 88), (118, 81, 62), (115, 82, 44), + (112, 83, 27), (111, 82, 26), (111, 82, 26), (112, 81, 24), + (111, 80, 25), (110, 81, 25), (110, 81, 25), (111, 82, 26), + (111, 82, 24), (112, 83, 23), (112, 83, 23), (113, 83, 23), + (113, 84, 26), (113, 85, 27), (113, 87, 28), (112, 86, 26), + (111, 85, 24), (111, 85, 24), (111, 85, 24), (112, 83, 23), + (113, 83, 23), (113, 81, 24), (112, 81, 24), (112, 81, 24), + (112, 81, 24), (112, 81, 24), (112, 82, 22), (112, 82, 20), + (111, 83, 20), (111, 82, 20), (111, 81, 21), (110, 80, 20), + (110, 80, 20), (110, 80, 20), (111, 81, 21), (112, 81, 24), + (112, 83, 25), (112, 83, 25), (112, 82, 23), (113, 81, 22), + (113, 81, 22), (113, 81, 22), (112, 82, 20), (110, 82, 17), + (113, 81, 22), (112, 81, 22), (112, 82, 22), (111, 82, 22), + (111, 82, 22), (109, 83, 22), (110, 84, 23), (111, 85, 24), + (111, 85, 26), (113, 87, 28), (115, 88, 30), (118, 89, 33), + (179, 75, 49), (240, 61, 65), (255, 82, 86), (252, 210, 62), + (253, 246, 77), (254, 235, 41), (255, 225, 5), (250, 222, 5), + (246, 219, 5), (221, 197, 3), (215, 192, 2), (237, 211, 2), + (255, 220, 4), (255, 255, 85), (255, 255, 84), (255, 255, 83), + (255, 227, 71), (254, 110, 102), (255, 83, 87), (255, 112, 116), + (208, 199, 166), (224, 210, 181), (241, 221, 197), (241, 221, 197), + (241, 221, 197), (216, 209, 183), (225, 181, 134), (225, 181, 134), + (254, 98, 99), (255, 78, 84), (254, 76, 81), (254, 75, 78), + (255, 73, 75), (247, 62, 67), (214, 37, 47), (119, 85, 22), + (113, 83, 23), (113, 84, 24), (114, 85, 25), (114, 84, 25), + (114, 83, 26), (113, 84, 26), (112, 83, 25), (112, 83, 23), + (111, 82, 22), (109, 78, 23), (108, 77, 23), (108, 77, 23), + (105, 80, 26), (104, 79, 23), (105, 76, 18), (101, 72, 16), + (95, 5, 7), (101, 24, 3), (107, 44, 0), (100, 74, 17), + (107, 77, 17), (108, 77, 20), (107, 78, 18), (108, 80, 17), + (109, 79, 15), (109, 77, 16), (109, 77, 17), (109, 77, 18), + (110, 78, 19), (111, 79, 20), (112, 80, 19), (113, 83, 19), + (117, 83, 20), (117, 83, 20), (118, 84, 21), (118, 84, 23), + (207, 40, 47), (241, 60, 65), (254, 68, 73), (254, 73, 78), + (255, 72, 76), (255, 66, 70), (240, 61, 65), (120, 86, 25), + (118, 87, 23), (117, 86, 22), (117, 85, 24), (116, 86, 24), + (124, 94, 34), (157, 123, 28), (191, 152, 23), (227, 165, 32), + (234, 179, 37), (184, 165, 1), (154, 126, 17), (118, 89, 23), + (119, 88, 23), (117, 86, 21), (116, 85, 21), (115, 86, 20), + (114, 84, 22), (113, 83, 21), (113, 83, 21), (112, 82, 20), + (112, 80, 19), (113, 79, 18), (114, 80, 19), (113, 78, 20), + (112, 80, 21), (113, 81, 22), (113, 81, 22), (115, 83, 22), + (116, 81, 23), (207, 35, 47), (237, 41, 55), (247, 64, 68), + (254, 69, 74), (251, 64, 59), (119, 90, 24), (118, 89, 23), + (117, 86, 22), (113, 87, 26), (110, 86, 24), (110, 84, 23), + (109, 83, 22), (109, 83, 22), (109, 83, 22), (109, 80, 22), + (110, 79, 22), (109, 78, 21), (110, 78, 19), (109, 77, 18), + (109, 79, 17), (111, 79, 18), (111, 79, 18), (110, 78, 19), + (110, 78, 19), (111, 79, 20), (111, 79, 20), (112, 80, 21), + (112, 80, 21), (113, 81, 22), (113, 81, 22), (113, 81, 22), + (114, 82, 21), (115, 83, 22), (116, 84, 23), (116, 82, 21), + (117, 83, 20), (116, 85, 21), (117, 86, 22), (118, 89, 23), + (120, 89, 25), (138, 103, 13), (196, 103, 25), (253, 79, 81), + (254, 84, 87), (224, 180, 133), (196, 184, 124), (173, 154, 96) + ), + +// 220 Apophysis-040427-4DimesPathsE +((212, 252, 226), (139, 125, 160), (98, 90, 114), (57, 55, 69), + (35, 28, 42), (13, 1, 15), (9, 1, 8), (6, 2, 1), + (2, 2, 2), (5, 1, 2), (8, 0, 2), (11, 0, 3), + (14, 0, 5), (32, 0, 18), (50, 0, 32), (67, 13, 50), + (84, 27, 68), (140, 63, 71), (148, 74, 65), (156, 86, 60), + (117, 66, 58), (78, 46, 57), (66, 42, 39), (55, 38, 22), + (39, 86, 92), (39, 88, 111), (39, 91, 131), (85, 101, 142), + (132, 111, 154), (137, 104, 160), (143, 98, 167), (144, 96, 144), + (96, 88, 112), (80, 45, 109), (91, 63, 123), (102, 81, 137), + (149, 107, 122), (197, 133, 108), (213, 144, 114), (230, 156, 121), + (233, 217, 217), (224, 235, 225), (216, 254, 233), (199, 242, 226), + (183, 231, 219), (173, 222, 210), (163, 213, 202), (166, 195, 190), + (168, 188, 176), (208, 231, 202), (230, 243, 228), (252, 255, 255), + (253, 252, 253), (254, 250, 251), (254, 241, 253), (255, 232, 255), + (248, 250, 249), (235, 242, 249), (222, 234, 250), (158, 217, 252), + (94, 200, 255), (109, 186, 202), (125, 173, 149), (112, 86, 111), + (110, 45, 88), (159, 67, 130), (167, 64, 185), (176, 61, 240), + (196, 85, 247), (216, 109, 255), (200, 147, 237), (193, 196, 239), + (219, 143, 241), (227, 132, 234), (235, 122, 228), (224, 129, 231), + (213, 137, 235), (213, 151, 223), (213, 166, 212), (192, 230, 121), + (184, 208, 34), (87, 164, 0), (105, 156, 58), (124, 149, 117), + (154, 139, 117), (184, 130, 118), (198, 167, 185), (254, 187, 196), + (186, 222, 72), (134, 162, 39), (83, 103, 6), (58, 70, 10), + (34, 38, 15), (17, 6, 10), (6, 9, 0), (0, 17, 0), + (0, 30, 18), (17, 135, 47), (8, 163, 23), (0, 191, 0), + (56, 182, 58), (113, 174, 117), (163, 185, 164), (158, 213, 158), + (133, 212, 103), (117, 195, 93), (101, 178, 84), (94, 174, 58), + (88, 170, 33), (57, 245, 46), (170, 255, 30), (247, 255, 43), + (254, 253, 38), (245, 244, 226), (248, 239, 239), (252, 235, 253), + (255, 221, 252), (226, 208, 208), (192, 178, 165), (193, 161, 84), + (207, 190, 12), (204, 104, 7), (202, 19, 3), (184, 14, 1), + (167, 9, 0), (111, 18, 1), (66, 111, 6), (41, 141, 71), + (15, 93, 41), (12, 38, 55), (17, 33, 58), (22, 28, 62), + (37, 0, 75), (43, 0, 76), (42, 9, 90), (18, 1, 116), + (27, 13, 186), (24, 6, 127), (21, 0, 68), (13, 1, 58), + (5, 2, 49), (0, 0, 26), (11, 0, 23), (28, 6, 19), + (45, 16, 0), (95, 69, 80), (115, 74, 87), (136, 79, 94), + (178, 114, 166), (175, 132, 185), (189, 130, 188), (162, 55, 219), + (110, 76, 173), (115, 61, 167), (120, 46, 161), (118, 40, 150), + (114, 40, 153), (91, 21, 154), (70, 20, 153), (45, 0, 101), + (50, 0, 83), (91, 33, 118), (94, 40, 117), (98, 47, 116), + (73, 50, 79), (95, 19, 57), (122, 13, 81), (130, 56, 135), + (145, 36, 225), (159, 40, 238), (173, 45, 252), (147, 52, 198), + (103, 24, 149), (59, 2, 97), (53, 3, 66), (19, 0, 55), + (13, 4, 31), (0, 12, 20), (0, 18, 24), (7, 22, 45), + (4, 45, 99), (17, 29, 131), (62, 32, 118), (72, 90, 90), + (96, 148, 125), (126, 127, 111), (156, 106, 97), (164, 69, 67), + (181, 149, 90), (202, 142, 108), (196, 175, 172), (190, 186, 209), + (208, 186, 209), (221, 215, 217), (200, 209, 208), (186, 177, 232), + (193, 126, 170), (240, 79, 129), (169, 77, 40), (179, 28, 0), + (152, 15, 9), (116, 1, 4), (48, 5, 0), (18, 0, 12), + (8, 7, 3), (2, 14, 0), (0, 21, 0), (25, 25, 13), + (43, 18, 40), (60, 23, 64), (68, 39, 95), (50, 76, 150), + (14, 104, 201), (39, 237, 240), (31, 192, 174), (72, 177, 120), + (38, 95, 89), (17, 53, 67), (24, 34, 61), (20, 18, 32), + (6, 7, 11), (3, 3, 3), (4, 9, 3), (4, 10, 6), + (5, 6, 10), (0, 11, 17), (0, 1, 15), (0, 0, 2), + (1, 1, 1), (0, 2, 1), (0, 5, 0), (0, 7, 3), + (7, 3, 17), (39, 4, 46), (63, 0, 80), (63, 10, 142), + (81, 65, 164), (71, 82, 148), (70, 55, 112), (48, 35, 78), + (56, 18, 77), (36, 22, 57), (25, 0, 35), (18, 0, 26), + (3, 0, 17), (3, 3, 15), (2, 1, 19), (0, 2, 23), + (0, 0, 43), (11, 0, 58), (32, 2, 76), (61, 36, 101), + (110, 68, 144), (145, 107, 182), (202, 237, 207), (176, 153, 205) + ), + +// 221 Apophysis-040427-4DimensPathsE2 +((255, 234, 255), (204, 132, 244), (181, 127, 233), (158, 123, 223), + (148, 116, 203), (139, 109, 183), (137, 119, 161), (136, 130, 140), + (81, 135, 51), (72, 112, 68), (63, 89, 86), (39, 65, 68), + (15, 42, 51), (9, 29, 38), (3, 16, 25), (1, 12, 20), + (0, 8, 15), (1, 1, 1), (2, 2, 6), (4, 4, 12), + (9, 21, 14), (14, 38, 16), (22, 41, 20), (30, 45, 24), + (61, 99, 14), (100, 85, 35), (140, 71, 56), (133, 69, 87), + (126, 68, 119), (110, 80, 153), (94, 93, 187), (107, 64, 197), + (103, 26, 180), (57, 22, 102), (57, 37, 106), (57, 52, 110), + (72, 71, 140), (87, 90, 171), (123, 114, 187), (160, 139, 204), + (192, 224, 235), (154, 192, 230), (116, 161, 226), (106, 112, 201), + (96, 63, 176), (77, 45, 145), (58, 28, 114), (33, 2, 80), + (25, 0, 81), (24, 0, 57), (24, 0, 47), (25, 0, 37), + (21, 0, 29), (17, 0, 21), (15, 4, 17), (13, 8, 14), + (17, 0, 38), (14, 0, 42), (12, 0, 47), (6, 2, 30), + (0, 4, 14), (0, 2, 10), (1, 0, 7), (1, 1, 1), + (0, 2, 0), (1, 1, 1), (0, 2, 0), (0, 3, 0), + (0, 8, 0), (0, 14, 0), (9, 36, 3), (17, 69, 21), + (67, 141, 54), (103, 138, 36), (140, 135, 18), (122, 115, 22), + (105, 95, 26), (84, 95, 34), (63, 96, 43), (56, 34, 36), + (65, 22, 41), (128, 54, 107), (124, 51, 149), (121, 48, 191), + (115, 45, 187), (110, 43, 184), (132, 13, 181), (108, 17, 200), + (84, 0, 174), (56, 0, 126), (29, 0, 78), (33, 0, 68), + (37, 0, 58), (29, 0, 43), (15, 1, 24), (8, 1, 17), + (0, 0, 12), (7, 2, 9), (9, 1, 11), (11, 0, 14), + (8, 0, 16), (5, 1, 18), (20, 0, 27), (29, 2, 21), + (37, 5, 28), (39, 19, 24), (42, 34, 21), (31, 33, 16), + (20, 32, 12), (16, 11, 34), (1, 17, 43), (26, 35, 50), + (61, 47, 64), (137, 108, 138), (156, 122, 151), (176, 137, 164), + (211, 164, 232), (255, 191, 230), (235, 186, 171), (236, 179, 160), + (165, 205, 57), (142, 189, 70), (119, 174, 83), (143, 173, 78), + (167, 173, 73), (181, 80, 24), (181, 27, 77), (167, 70, 165), + (145, 76, 143), (141, 73, 50), (164, 84, 40), (187, 95, 30), + (217, 69, 5), (195, 67, 0), (179, 91, 4), (144, 79, 21), + (67, 19, 0), (39, 9, 0), (11, 0, 0), (8, 6, 1), + (5, 13, 2), (9, 43, 0), (43, 106, 0), (64, 173, 0), + (19, 242, 11), (99, 222, 95), (124, 210, 128), (149, 199, 162), + (186, 239, 197), (210, 197, 188), (220, 196, 170), (198, 177, 114), + (205, 187, 17), (185, 186, 11), (166, 185, 5), (139, 186, 30), + (129, 112, 84), (77, 72, 79), (81, 47, 84), (67, 25, 91), + (63, 0, 77), (20, 14, 16), (16, 8, 13), (13, 2, 10), + (9, 0, 0), (3, 0, 0), (4, 0, 0), (18, 5, 0), + (50, 0, 0), (67, 11, 3), (85, 22, 7), (115, 5, 0), + (132, 59, 16), (151, 62, 30), (134, 58, 44), (123, 52, 30), + (59, 38, 55), (39, 31, 70), (0, 64, 133), (20, 96, 112), + (69, 141, 104), (107, 157, 122), (109, 165, 154), (126, 117, 144), + (29, 88, 86), (25, 86, 70), (21, 84, 55), (0, 26, 0), + (8, 0, 38), (11, 4, 37), (11, 0, 22), (10, 8, 21), + (0, 29, 19), (16, 43, 24), (43, 34, 37), (58, 49, 66), + (65, 64, 106), (66, 87, 150), (81, 135, 101), (68, 129, 87), + (75, 134, 90), (80, 151, 93), (116, 174, 87), (144, 160, 121), + (206, 157, 160), (241, 233, 187), (241, 255, 215), (231, 255, 218), + (244, 255, 246), (255, 241, 255), (216, 213, 240), (207, 179, 168), + (147, 142, 113), (97, 86, 103), (77, 72, 79), (140, 69, 47), + (158, 84, 35), (173, 107, 21), (196, 140, 105), (154, 119, 143), + (142, 110, 121), (86, 65, 106), (43, 48, 70), (38, 25, 53), + (41, 14, 31), (28, 8, 20), (22, 0, 18), (24, 1, 11), + (15, 0, 8), (6, 0, 0), (1, 0, 4), (5, 2, 13), + (8, 5, 16), (11, 0, 23), (22, 0, 35), (34, 7, 50), + (49, 18, 60), (58, 8, 45), (59, 4, 43), (68, 22, 25), + (59, 10, 6), (39, 0, 0), (25, 0, 0), (28, 0, 13), + (46, 26, 28), (79, 56, 66), (86, 89, 104), (135, 130, 137), + (134, 169, 188), (135, 238, 235), (129, 238, 241), (90, 187, 168), + (98, 211, 149), (164, 221, 214), (238, 246, 225), (255, 252, 255) + ), + +// 222 Apophysis-040427-4DimensPathE2 +((224, 151, 145), (12, 8, 7), (12, 6, 4), (13, 5, 2), + (16, 6, 1), (20, 8, 0), (19, 4, 0), (19, 0, 0), + (28, 0, 0), (30, 3, 0), (32, 7, 0), (39, 7, 0), + (47, 7, 0), (52, 3, 12), (58, 0, 24), (66, 4, 24), + (75, 8, 25), (73, 44, 46), (58, 132, 126), (44, 220, 207), + (50, 224, 204), (56, 228, 202), (76, 238, 165), (96, 248, 129), + (154, 200, 200), (195, 227, 220), (237, 255, 241), (246, 238, 247), + (255, 222, 254), (255, 211, 227), (255, 200, 201), (250, 185, 103), + (251, 239, 5), (180, 250, 14), (196, 208, 17), (212, 166, 21), + (184, 169, 21), (156, 172, 21), (169, 197, 31), (183, 222, 41), + (124, 180, 0), (124, 153, 30), (124, 126, 61), (161, 106, 30), + (198, 86, 0), (202, 85, 16), (206, 85, 32), (187, 58, 36), + (189, 43, 54), (100, 0, 16), (103, 23, 8), (107, 46, 0), + (98, 110, 0), (90, 174, 0), (100, 214, 36), (111, 255, 72), + (144, 197, 81), (195, 142, 90), (247, 87, 99), (228, 58, 100), + (209, 29, 102), (220, 35, 89), (231, 41, 77), (189, 69, 44), + (182, 70, 33), (81, 24, 4), (77, 23, 2), (74, 22, 0), + (68, 24, 0), (62, 26, 0), (72, 37, 7), (72, 60, 48), + (144, 112, 117), (164, 136, 126), (185, 161, 135), (186, 176, 139), + (188, 191, 144), (183, 182, 131), (178, 173, 118), (183, 148, 118), + (182, 156, 105), (218, 144, 55), (208, 105, 61), (199, 66, 67), + (212, 74, 71), (225, 82, 76), (221, 59, 108), (211, 84, 135), + (168, 21, 189), (114, 33, 179), (61, 45, 169), (70, 42, 108), + (80, 40, 48), (65, 23, 35), (36, 29, 36), (41, 32, 25), + (49, 10, 13), (16, 7, 0), (8, 4, 0), (1, 1, 1), + (1, 1, 1), (1, 1, 1), (8, 0, 5), (18, 0, 0), + (51, 9, 10), (86, 23, 39), (122, 37, 68), (138, 59, 83), + (155, 81, 98), (167, 114, 130), (201, 147, 173), (241, 211, 211), + (255, 224, 219), (240, 163, 145), (216, 146, 145), (192, 129, 146), + (143, 103, 91), (96, 79, 72), (96, 67, 59), (112, 80, 81), + (130, 116, 113), (133, 118, 112), (137, 120, 112), (134, 127, 114), + (132, 135, 116), (152, 138, 129), (174, 154, 153), (181, 157, 155), + (177, 166, 144), (148, 138, 102), (155, 138, 98), (163, 139, 95), + (215, 171, 46), (202, 199, 10), (174, 245, 17), (126, 234, 9), + (25, 191, 3), (27, 154, 1), (29, 118, 0), (24, 101, 0), + (19, 85, 0), (16, 38, 0), (56, 29, 2), (82, 137, 0), + (22, 158, 0), (61, 183, 0), (77, 162, 7), (93, 142, 14), + (134, 66, 27), (109, 47, 52), (103, 48, 41), (92, 49, 43), + (157, 110, 82), (167, 138, 100), (177, 167, 118), (193, 187, 171), + (255, 224, 241), (255, 251, 234), (255, 255, 242), (255, 246, 243), + (255, 224, 255), (213, 224, 182), (192, 212, 179), (172, 200, 177), + (159, 152, 142), (114, 117, 132), (66, 78, 74), (43, 90, 70), + (55, 25, 0), (53, 16, 0), (51, 8, 1), (44, 0, 0), + (49, 0, 17), (45, 0, 44), (43, 7, 55), (56, 0, 114), + (75, 35, 167), (94, 78, 200), (89, 127, 202), (85, 160, 189), + (137, 167, 103), (147, 133, 94), (133, 108, 101), (138, 95, 89), + (133, 52, 49), (135, 30, 51), (138, 8, 54), (129, 0, 71), + (144, 0, 71), (158, 43, 138), (159, 65, 149), (165, 106, 124), + (196, 128, 119), (161, 114, 108), (171, 72, 90), (183, 66, 110), + (230, 79, 72), (252, 102, 17), (238, 31, 15), (232, 21, 28), + (218, 33, 38), (219, 32, 23), (193, 13, 14), (101, 1, 0), + (96, 0, 0), (83, 18, 0), (82, 2, 3), (81, 0, 8), + (80, 0, 0), (75, 0, 1), (52, 1, 0), (29, 5, 3), + (27, 0, 0), (29, 0, 0), (41, 0, 0), (67, 0, 8), + (93, 1, 2), (123, 10, 40), (178, 61, 70), (216, 141, 164), + (221, 194, 199), (255, 240, 241), (255, 252, 228), (223, 234, 191), + (198, 171, 160), (168, 117, 88), (144, 76, 41), (109, 55, 27), + (80, 20, 22), (77, 20, 11), (61, 13, 9), (61, 10, 7), + (51, 7, 8), (57, 0, 0), (55, 0, 0), (50, 0, 0), + (42, 8, 0), (28, 9, 0), (19, 16, 0), (14, 6, 3), + (10, 1, 0), (0, 6, 0), (0, 6, 2), (1, 1, 1), + (14, 0, 0), (17, 0, 0), (18, 2, 3), (14, 0, 0), + (5, 0, 4), (0, 0, 7), (1, 5, 6), (7, 7, 7), + (24, 25, 0), (59, 58, 37), (142, 102, 90), (255, 175, 156) + ), + +// 223 Apophysis-040427-4Doodles +((145, 106, 3), (181, 151, 125), (169, 173, 151), (157, 196, 177), + (154, 193, 174), (152, 191, 172), (158, 189, 173), (165, 187, 175), + (161, 161, 161), (154, 154, 154), (148, 148, 148), (148, 141, 144), + (149, 134, 141), (105, 114, 124), (61, 95, 107), (51, 84, 113), + (41, 73, 120), (17, 28, 134), (8, 30, 94), (0, 32, 54), + (15, 33, 54), (30, 35, 54), (38, 41, 51), (46, 47, 49), + (185, 150, 120), (219, 193, 125), (254, 237, 131), (210, 177, 72), + (166, 117, 14), (158, 112, 8), (150, 107, 2), (148, 91, 22), + (152, 56, 16), (145, 141, 96), (166, 164, 140), (187, 187, 185), + (195, 194, 192), (203, 202, 200), (202, 202, 201), (202, 202, 202), + (193, 193, 193), (176, 197, 187), (160, 202, 182), (98, 205, 180), + (36, 209, 179), (35, 174, 148), (34, 140, 117), (11, 72, 73), + (38, 50, 62), (88, 64, 28), (103, 75, 59), (119, 87, 90), + (137, 122, 127), (155, 158, 165), (172, 173, 176), (189, 189, 187), + (233, 237, 240), (241, 245, 247), (250, 253, 255), (252, 254, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (242, 253, 249), + (232, 232, 208), (159, 159, 159), (124, 124, 124), (89, 89, 89), + (82, 81, 82), (76, 74, 75), (64, 65, 57), (73, 55, 31), + (69, 40, 6), (58, 37, 9), (47, 35, 13), (46, 23, 7), + (46, 12, 2), (54, 18, 5), (63, 24, 9), (71, 14, 5), + (60, 13, 3), (31, 7, 43), (37, 18, 31), (44, 30, 19), + (53, 39, 19), (63, 48, 19), (78, 55, 13), (114, 85, 27), + (168, 153, 84), (162, 174, 130), (156, 195, 176), (145, 205, 205), + (134, 215, 234), (173, 255, 253), (217, 255, 250), (230, 255, 255), + (231, 255, 253), (198, 198, 196), (165, 165, 163), (133, 133, 131), + (117, 114, 108), (102, 95, 85), (82, 77, 74), (61, 79, 83), + (138, 137, 142), (156, 156, 158), (175, 175, 175), (182, 182, 182), + (189, 189, 189), (191, 191, 189), (176, 174, 175), (151, 151, 151), + (119, 119, 119), (62, 95, 4), (58, 70, 14), (54, 46, 25), + (45, 45, 45), (45, 45, 45), (41, 52, 56), (52, 59, 140), + (178, 81, 249), (162, 115, 223), (146, 150, 197), (125, 142, 183), + (105, 135, 169), (48, 165, 95), (4, 139, 34), (5, 48, 38), + (15, 15, 15), (37, 29, 6), (35, 32, 17), (34, 35, 29), + (45, 45, 45), (49, 55, 67), (60, 86, 99), (128, 128, 128), + (243, 162, 254), (241, 193, 254), (240, 225, 254), (235, 228, 242), + (231, 231, 231), (226, 215, 211), (212, 203, 206), (208, 208, 206), + (206, 206, 204), (203, 203, 201), (202, 202, 200), (202, 202, 200), + (198, 198, 198), (194, 194, 192), (190, 190, 188), (185, 185, 185), + (148, 146, 151), (154, 147, 151), (160, 148, 152), (183, 168, 173), + (193, 193, 191), (208, 214, 210), (219, 251, 240), (236, 255, 255), + (247, 255, 253), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (254, 255, 247), (254, 255, 191), + (252, 246, 148), (253, 247, 126), (255, 249, 105), (211, 255, 95), + (229, 223, 87), (237, 93, 56), (227, 4, 97), (173, 0, 72), + (160, 28, 23), (105, 118, 124), (126, 70, 69), (0, 6, 0), + (11, 9, 10), (27, 26, 24), (48, 35, 29), (47, 25, 64), + (78, 10, 121), (97, 31, 78), (116, 53, 35), (162, 44, 18), + (205, 61, 53), (242, 85, 94), (218, 112, 70), (190, 165, 85), + (204, 186, 114), (193, 186, 178), (210, 193, 201), (222, 220, 208), + (247, 247, 245), (254, 249, 253), (255, 254, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (251, 253, 252), (255, 236, 222), + (255, 250, 189), (252, 247, 183), (247, 231, 146), (251, 222, 142), + (209, 177, 192), (187, 187, 185), (179, 179, 179), (160, 160, 160), + (154, 154, 154), (141, 147, 145), (141, 141, 141), (141, 141, 141), + (140, 140, 140), (133, 149, 139), (130, 164, 148), (129, 171, 196), + (130, 205, 224), (160, 174, 235), (179, 131, 230), (201, 134, 250), + (206, 156, 229), (191, 191, 191), (160, 199, 180), (161, 181, 170), + (145, 145, 145), (120, 120, 120), (121, 89, 51), (90, 71, 57), + (101, 70, 39), (113, 48, 28), (118, 33, 13), (144, 55, 11) + ), + +// 224 Apophysis-040427-4Doodles2 +((191, 182, 107), (176, 142, 19), (182, 145, 11), (189, 148, 4), + (188, 147, 3), (188, 146, 2), (183, 142, 3), (179, 139, 5), + (150, 128, 42), (131, 120, 76), (113, 112, 110), (89, 89, 89), + (66, 67, 69), (43, 47, 39), (20, 27, 9), (25, 26, 13), + (30, 26, 17), (56, 61, 21), (101, 88, 12), (147, 115, 4), + (172, 134, 4), (197, 153, 5), (208, 161, 5), (219, 170, 5), + (239, 187, 5), (243, 191, 4), (248, 195, 3), (249, 195, 4), + (250, 195, 6), (250, 195, 6), (250, 195, 6), (250, 195, 6), + (250, 195, 6), (250, 195, 6), (250, 195, 6), (250, 195, 6), + (240, 187, 5), (230, 180, 5), (221, 172, 5), (213, 165, 5), + (170, 92, 82), (144, 75, 71), (119, 59, 61), (101, 66, 62), + (83, 73, 64), (80, 68, 67), (77, 64, 71), (90, 75, 80), + (115, 98, 91), (178, 172, 156), (202, 192, 182), (227, 212, 209), + (207, 176, 185), (188, 141, 161), (159, 128, 137), (130, 116, 113), + (163, 127, 65), (185, 144, 35), (207, 161, 5), (221, 172, 5), + (235, 184, 5), (240, 188, 4), (246, 192, 4), (251, 193, 5), + (245, 191, 7), (219, 170, 5), (207, 161, 5), (195, 153, 5), + (186, 146, 5), (178, 140, 5), (167, 132, 4), (163, 128, 2), + (165, 130, 2), (174, 137, 3), (183, 144, 4), (199, 156, 4), + (216, 169, 5), (219, 171, 4), (222, 174, 4), (230, 180, 5), + (236, 186, 5), (229, 179, 6), (219, 172, 5), (210, 165, 4), + (206, 161, 4), (202, 157, 4), (195, 151, 2), (180, 141, 4), + (167, 129, 4), (168, 130, 4), (169, 131, 4), (174, 135, 4), + (179, 139, 5), (191, 149, 3), (208, 162, 4), (222, 174, 4), + (231, 180, 3), (246, 192, 6), (248, 193, 6), (250, 195, 6), + (250, 195, 6), (250, 195, 6), (250, 195, 6), (250, 195, 6), + (250, 195, 6), (244, 190, 6), (238, 186, 6), (233, 181, 5), + (228, 176, 4), (210, 162, 4), (185, 143, 5), (156, 121, 3), + (123, 94, 2), (57, 25, 2), (43, 22, 5), (30, 20, 8), + (21, 15, 3), (0, 18, 6), (5, 28, 8), (0, 41, 9), + (17, 71, 21), (72, 44, 11), (127, 17, 2), (151, 21, 5), + (175, 25, 8), (193, 13, 24), (153, 31, 26), (140, 108, 5), + (146, 112, 4), (139, 49, 38), (135, 50, 39), (131, 51, 40), + (127, 77, 6), (137, 105, 4), (147, 115, 4), (163, 127, 4), + (201, 158, 4), (211, 166, 4), (222, 174, 4), (224, 174, 5), + (226, 175, 6), (226, 179, 5), (228, 177, 6), (231, 179, 5), + (238, 186, 4), (250, 195, 6), (250, 195, 6), (250, 195, 6), + (250, 195, 6), (252, 194, 6), (252, 194, 6), (51, 0, 9), + (26, 45, 13), (24, 65, 19), (22, 86, 26), (18, 90, 27), + (12, 90, 28), (17, 85, 28), (15, 55, 20), (19, 34, 11), + (24, 11, 2), (44, 5, 8), (38, 3, 8), (32, 1, 9), + (12, 4, 1), (5, 4, 2), (0, 1, 0), (0, 2, 1), + (50, 34, 44), (54, 57, 54), (59, 80, 65), (105, 101, 98), + (120, 116, 113), (124, 121, 116), (135, 128, 120), (161, 160, 158), + (169, 103, 105), (205, 107, 94), (182, 90, 79), (180, 78, 64), + (115, 92, 60), (110, 85, 54), (107, 93, 93), (115, 106, 107), + (175, 147, 37), (186, 150, 21), (198, 154, 6), (214, 166, 4), + (226, 179, 3), (238, 186, 4), (248, 193, 5), (249, 194, 5), + (248, 193, 5), (247, 193, 5), (239, 187, 5), (224, 176, 4), + (200, 156, 5), (175, 160, 93), (129, 123, 109), (112, 108, 105), + (82, 68, 83), (64, 57, 65), (53, 49, 24), (79, 48, 4), + (75, 58, 2), (103, 80, 2), (124, 100, 2), (144, 112, 1), + (157, 122, 2), (160, 119, 5), (160, 119, 5), (162, 119, 6), + (163, 122, 6), (160, 124, 4), (162, 126, 3), (165, 130, 4), + (172, 133, 2), (187, 146, 2), (199, 155, 4), (214, 166, 4), + (222, 174, 4), (224, 176, 4), (222, 174, 4), (220, 172, 4), + (209, 164, 3), (193, 148, 5), (172, 133, 2), (159, 125, 2), + (139, 107, 4), (87, 81, 5), (48, 56, 5), (24, 18, 2), + (3, 0, 0), (0, 0, 0), (11, 6, 2), (41, 18, 2), + (85, 19, 3), (78, 23, 26), (117, 51, 39), (162, 115, 7), + (169, 125, 2), (177, 139, 4), (190, 148, 4), (198, 154, 5), + (202, 159, 3), (204, 159, 4), (208, 162, 4), (208, 162, 4), + (210, 165, 4), (216, 166, 5), (224, 173, 4), (226, 174, 3), + (224, 176, 4), (217, 167, 6), (194, 173, 82), (204, 191, 112) + ), + +// 225 Apophysis-040427-4doodles3 +((255, 255, 253), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (254, 254, 253), (254, 253, 251), (246, 245, 244), (238, 238, 238), + (132, 129, 206), (73, 79, 156), (14, 30, 107), (16, 24, 62), + (19, 19, 17), (9, 9, 9), (0, 0, 2), (0, 0, 11), + (0, 0, 21), (7, 22, 105), (73, 11, 63), (140, 1, 22), + (140, 0, 16), (141, 0, 11), (133, 0, 36), (125, 1, 61), + (8, 0, 135), (15, 5, 158), (23, 11, 181), (33, 38, 166), + (43, 65, 151), (23, 97, 156), (3, 130, 162), (8, 149, 231), + (9, 147, 235), (91, 118, 231), (146, 116, 166), (201, 115, 102), + (206, 100, 82), (212, 86, 63), (212, 126, 103), (212, 167, 144), + (244, 244, 244), (249, 249, 249), (255, 255, 255), (254, 254, 254), + (254, 254, 254), (248, 248, 248), (243, 243, 243), (210, 210, 210), + (174, 174, 174), (167, 63, 38), (151, 33, 19), (135, 3, 1), + (95, 5, 0), (56, 7, 0), (28, 3, 0), (1, 0, 0), + (15, 15, 15), (29, 39, 27), (44, 64, 39), (71, 92, 75), + (98, 121, 111), (126, 147, 138), (154, 174, 165), (203, 203, 203), + (246, 246, 246), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (254, 255, 255), (254, 254, 254), + (239, 243, 255), (156, 175, 169), (99, 121, 168), (42, 67, 168), + (29, 33, 171), (17, 0, 174), (11, 0, 178), (10, 0, 175), + (6, 0, 110), (3, 0, 56), (0, 0, 2), (0, 0, 1), + (0, 0, 0), (5, 6, 8), (48, 24, 24), (100, 51, 55), + (161, 109, 95), (243, 224, 220), (247, 238, 236), (252, 252, 252), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (248, 248, 248), (230, 230, 230), (213, 213, 213), + (201, 185, 185), (209, 153, 138), (182, 92, 68), (132, 53, 49), + (84, 31, 13), (80, 32, 15), (76, 33, 17), (81, 31, 15), + (87, 30, 13), (110, 13, 24), (120, 43, 23), (129, 46, 40), + (142, 37, 31), (207, 15, 0), (200, 32, 0), (193, 49, 0), + (184, 43, 23), (173, 56, 39), (183, 77, 51), (186, 86, 60), + (214, 73, 46), (220, 69, 32), (227, 65, 19), (223, 74, 50), + (218, 105, 87), (220, 161, 145), (238, 205, 196), (206, 206, 206), + (207, 193, 192), (176, 176, 176), (153, 153, 153), (130, 130, 130), + (100, 100, 100), (67, 97, 85), (43, 109, 73), (34, 95, 61), + (19, 130, 61), (46, 136, 81), (74, 142, 101), (167, 166, 164), + (196, 196, 196), (240, 240, 240), (254, 254, 254), (255, 255, 255), + (255, 255, 255), (252, 255, 255), (242, 241, 239), (200, 198, 199), + (171, 171, 171), (124, 124, 124), (126, 95, 66), (160, 67, 60), + (178, 97, 54), (188, 103, 71), (198, 110, 88), (213, 175, 166), + (229, 220, 221), (251, 251, 251), (254, 255, 255), (255, 255, 255), + (255, 255, 255), (254, 255, 255), (253, 253, 253), (229, 229, 229), + (180, 184, 211), (120, 116, 203), (68, 107, 226), (6, 144, 180), + (68, 82, 143), (135, 43, 130), (128, 87, 91), (117, 77, 65), + (102, 60, 48), (95, 51, 42), (88, 31, 37), (92, 31, 36), + (117, 49, 30), (102, 54, 50), (114, 69, 72), (113, 112, 108), + (177, 177, 177), (222, 222, 224), (245, 245, 245), (254, 254, 254), + (255, 255, 255), (250, 250, 250), (223, 223, 223), (191, 193, 192), + (138, 146, 185), (97, 103, 153), (40, 73, 124), (5, 22, 104), + (4, 32, 69), (14, 14, 16), (1, 0, 0), (1, 0, 0), + (0, 0, 0), (1, 1, 1), (40, 15, 18), (52, 52, 52), + (116, 84, 73), (131, 101, 91), (161, 161, 161), (178, 178, 180), + (180, 181, 183), (182, 182, 182), (183, 182, 180), (179, 179, 179), + (158, 158, 158), (106, 132, 119), (73, 128, 96), (52, 116, 81), + (64, 90, 79), (32, 46, 117), (10, 26, 121), (43, 60, 142), + (63, 84, 89), (104, 103, 101), (151, 143, 141), (186, 186, 188), + (230, 228, 229), (250, 250, 250), (255, 255, 253), (255, 255, 255) + ), + +// 226 Apophysis-040427-4Doodle3inv +((124, 154, 164), (77, 77, 75), (75, 75, 74), (73, 73, 73), + (74, 74, 74), (76, 76, 76), (86, 86, 86), (97, 97, 97), + (182, 127, 159), (186, 146, 167), (191, 165, 176), (218, 197, 155), + (245, 229, 134), (218, 200, 150), (192, 171, 166), (171, 161, 160), + (151, 152, 154), (69, 69, 67), (37, 37, 36), (5, 5, 5), + (2, 2, 2), (0, 0, 0), (0, 0, 1), (0, 0, 2), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 1, 2), + (1, 2, 4), (9, 9, 10), (17, 17, 17), (61, 57, 56), + (123, 126, 49), (241, 225, 148), (238, 230, 193), (236, 236, 238), + (245, 245, 245), (255, 255, 253), (255, 255, 243), (255, 255, 234), + (248, 233, 150), (181, 243, 191), (115, 254, 233), (114, 254, 238), + (114, 255, 244), (122, 254, 219), (130, 254, 194), (188, 250, 113), + (247, 255, 120), (232, 244, 74), (222, 217, 89), (212, 190, 104), + (229, 148, 64), (247, 106, 24), (246, 107, 22), (246, 108, 20), + (164, 137, 24), (109, 138, 88), (54, 140, 153), (48, 154, 172), + (43, 169, 192), (43, 128, 151), (43, 88, 111), (28, 47, 53), + (11, 11, 11), (0, 0, 0), (0, 0, 0), (1, 1, 1), + (6, 6, 6), (12, 12, 12), (45, 45, 45), (81, 81, 81), + (88, 192, 217), (104, 222, 235), (120, 252, 254), (159, 250, 254), + (199, 248, 255), (226, 251, 255), (254, 255, 255), (255, 254, 255), + (240, 240, 240), (211, 191, 216), (184, 162, 180), (157, 134, 144), + (129, 107, 117), (101, 81, 90), (52, 52, 52), (9, 9, 9), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (1, 0, 0), (1, 1, 1), (16, 12, 0), + (99, 80, 86), (156, 134, 86), (213, 188, 87), (225, 221, 84), + (238, 255, 81), (244, 255, 77), (245, 255, 80), (244, 255, 81), + (249, 255, 145), (255, 255, 253), (255, 255, 254), (255, 255, 255), + (250, 249, 247), (207, 231, 231), (155, 204, 200), (94, 146, 160), + (12, 31, 35), (6, 15, 17), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (7, 7, 7), (24, 24, 24), (42, 42, 42), (54, 70, 70), + (46, 102, 117), (73, 163, 187), (123, 202, 206), (138, 211, 230), + (171, 224, 242), (179, 222, 238), (173, 223, 240), (168, 225, 242), + (145, 242, 231), (135, 212, 232), (126, 209, 215), (113, 218, 224), + (48, 240, 255), (55, 223, 255), (62, 206, 255), (71, 212, 232), + (82, 199, 216), (72, 178, 204), (69, 169, 195), (45, 184, 205), + (41, 182, 209), (28, 190, 236), (32, 181, 205), (37, 150, 168), + (35, 94, 110), (17, 50, 59), (49, 49, 49), (48, 62, 63), + (79, 79, 79), (102, 102, 102), (125, 125, 125), (155, 155, 155), + (188, 158, 170), (212, 146, 182), (221, 160, 194), (246, 171, 194), + (236, 125, 194), (181, 113, 154), (88, 89, 91), (59, 59, 59), + (15, 15, 15), (1, 1, 1), (0, 0, 0), (0, 0, 0), + (3, 0, 0), (13, 14, 16), (55, 57, 56), (84, 84, 84), + (131, 131, 131), (129, 160, 189), (95, 188, 195), (79, 158, 199), + (77, 158, 201), (57, 145, 167), (42, 80, 89), (26, 35, 34), + (4, 4, 4), (1, 0, 0), (0, 0, 0), (0, 0, 0), + (1, 0, 0), (2, 2, 2), (26, 26, 26), (75, 71, 44), + (135, 139, 52), (187, 148, 29), (249, 111, 75), (187, 173, 112), + (120, 212, 125), (127, 168, 164), (138, 178, 190), (153, 195, 207), + (160, 204, 213), (167, 224, 218), (163, 224, 219), (138, 206, 225), + (153, 201, 205), (141, 186, 183), (142, 143, 147), (78, 78, 78), + (33, 33, 31), (10, 10, 10), (1, 1, 1), (0, 0, 0), + (5, 5, 5), (32, 32, 32), (64, 62, 63), (117, 109, 70), + (158, 152, 102), (215, 182, 131), (250, 233, 151), (251, 223, 186), + (241, 241, 239), (254, 255, 255), (254, 255, 255), (255, 255, 255), + (254, 254, 254), (215, 240, 237), (203, 203, 203), (139, 171, 182) + ), + +// 227 Apophysis-040427-6DoublEagles2 +((127, 51, 1), (127, 51, 1), (127, 51, 1), (127, 51, 1), + (127, 51, 1), (127, 51, 1), (127, 51, 1), (127, 51, 1), + (127, 51, 1), (127, 51, 1), (127, 51, 1), (127, 51, 1), + (127, 51, 1), (127, 51, 1), (127, 51, 1), (127, 51, 1), + (127, 51, 1), (127, 51, 1), (127, 51, 1), (127, 51, 1), + (127, 51, 1), (127, 51, 1), (127, 51, 1), (127, 51, 1), + (127, 51, 1), (127, 51, 1), (127, 51, 1), (127, 51, 1), + (127, 51, 1), (127, 51, 1), (127, 51, 1), (127, 51, 1), + (127, 51, 1), (127, 51, 1), (127, 51, 1), (127, 51, 1), + (127, 51, 1), (127, 51, 1), (127, 51, 1), (127, 51, 1), + (127, 51, 1), (127, 51, 1), (127, 51, 1), (127, 51, 1), + (127, 51, 1), (126, 50, 0), (126, 50, 0), (112, 44, 0), + (1, 5, 50), (1, 5, 50), (21, 27, 83), (42, 49, 117), + (58, 65, 128), (75, 81, 139), (75, 81, 139), (75, 81, 139), + (127, 35, 108), (100, 44, 55), (73, 53, 2), (37, 29, 26), + (1, 5, 50), (1, 5, 50), (1, 5, 50), (1, 5, 50), + (1, 5, 50), (1, 5, 50), (1, 5, 53), (2, 5, 56), + (22, 27, 86), (42, 49, 117), (18, 70, 172), (32, 93, 156), + (196, 197, 181), (213, 185, 110), (230, 173, 40), (216, 158, 20), + (202, 144, 0), (195, 138, 0), (189, 132, 0), (167, 80, 1), + (149, 59, 0), (127, 51, 1), (127, 52, 2), (127, 54, 3), + (115, 63, 15), (104, 73, 27), (77, 84, 77), (75, 81, 139), + (75, 81, 139), (75, 81, 139), (75, 81, 139), (88, 86, 101), + (102, 91, 63), (134, 68, 16), (122, 50, 0), (88, 30, 6), + (1, 0, 42), (1, 5, 50), (21, 27, 83), (42, 49, 117), + (42, 49, 117), (42, 49, 117), (42, 49, 117), (143, 15, 98), + (162, 108, 38), (154, 82, 19), (146, 57, 1), (139, 55, 0), + (133, 53, 0), (128, 52, 2), (127, 51, 1), (127, 51, 1), + (229, 175, 27), (163, 111, 35), (151, 102, 17), (140, 94, 0), + (135, 54, 1), (128, 50, 1), (128, 50, 1), (133, 53, 0), + (178, 80, 9), (199, 123, 26), (221, 167, 43), (232, 193, 95), + (243, 219, 147), (232, 219, 184), (234, 246, 246), (225, 250, 255), + (208, 211, 200), (232, 165, 76), (224, 150, 62), (217, 135, 49), + (232, 93, 2), (183, 72, 0), (130, 54, 4), (98, 64, 27), + (1, 5, 50), (1, 7, 70), (1, 9, 90), (21, 29, 103), + (42, 49, 117), (42, 49, 117), (42, 49, 117), (16, 13, 90), + (1, 5, 50), (1, 5, 50), (1, 5, 50), (1, 5, 50), + (1, 5, 50), (1, 5, 50), (1, 5, 50), (1, 5, 50), + (1, 5, 50), (1, 5, 50), (1, 5, 50), (0, 11, 85), + (42, 49, 117), (75, 81, 139), (75, 81, 139), (76, 81, 139), + (145, 155, 165), (211, 226, 229), (200, 225, 230), (190, 225, 231), + (150, 212, 253), (97, 187, 250), (75, 81, 139), (75, 81, 139), + (120, 193, 244), (140, 207, 247), (161, 222, 250), (172, 219, 247), + (170, 216, 232), (125, 110, 105), (167, 116, 59), (136, 60, 10), + (127, 54, 3), (127, 51, 1), (127, 51, 1), (127, 51, 1), + (127, 51, 1), (127, 51, 1), (127, 51, 1), (127, 51, 1), + (134, 53, 0), (148, 58, 0), (163, 64, 0), (193, 3, 89), + (221, 5, 102), (246, 40, 122), (233, 49, 119), (168, 117, 60), + (158, 99, 29), (145, 66, 7), (128, 50, 1), (127, 51, 1), + (127, 51, 1), (127, 51, 1), (127, 51, 1), (127, 51, 1), + (127, 51, 1), (127, 51, 1), (127, 51, 1), (125, 52, 1), + (118, 47, 1), (39, 28, 0), (1, 0, 42), (1, 5, 50), + (1, 5, 50), (1, 5, 50), (100, 41, 1), (126, 50, 0), + (126, 50, 0), (124, 50, 1), (118, 14, 93), (79, 33, 141), + (75, 81, 139), (75, 81, 139), (33, 117, 190), (59, 167, 240), + (72, 120, 184), (137, 142, 146), (175, 149, 74), (170, 118, 43), + (154, 100, 0), (138, 55, 1), (133, 53, 0), (127, 51, 1), + (127, 51, 1), (127, 51, 1), (127, 51, 1), (127, 51, 1), + (127, 51, 1), (127, 51, 1), (127, 51, 1), (127, 51, 1), + (127, 51, 1), (127, 51, 1), (127, 51, 1), (127, 51, 1), + (127, 51, 1), (127, 51, 1), (127, 51, 1), (127, 51, 1), + (127, 51, 1), (127, 51, 1), (127, 51, 1), (127, 51, 1), + (127, 51, 1), (127, 51, 1), (127, 51, 1), (127, 51, 1), + (127, 51, 1), (127, 51, 1), (127, 51, 1), (127, 51, 1) + ), + +// 228 Apophysis-040427-6Equinox +((114, 110, 231), (112, 110, 233), (113, 110, 231), (115, 110, 230), + (116, 110, 227), (118, 111, 225), (119, 112, 225), (120, 113, 225), + (120, 114, 224), (120, 114, 224), (120, 114, 224), (120, 114, 224), + (120, 114, 224), (120, 114, 223), (121, 115, 223), (122, 115, 222), + (123, 116, 222), (130, 123, 219), (139, 132, 216), (149, 141, 214), + (164, 148, 193), (180, 156, 172), (176, 155, 177), (173, 154, 182), + (140, 127, 206), (139, 125, 207), (138, 124, 209), (154, 135, 191), + (171, 147, 173), (181, 150, 154), (192, 153, 136), (219, 153, 69), + (199, 128, 46), (176, 95, 29), (163, 96, 70), (150, 98, 111), + (142, 110, 160), (135, 123, 209), (132, 121, 208), (130, 120, 207), + (119, 115, 200), (116, 78, 120), (113, 42, 40), (148, 74, 34), + (183, 106, 28), (203, 133, 51), (223, 161, 74), (251, 202, 100), + (254, 231, 101), (255, 235, 102), (254, 241, 109), (254, 247, 117), + (254, 241, 116), (254, 235, 115), (243, 222, 116), (233, 210, 117), + (202, 187, 158), (200, 184, 159), (199, 181, 161), (214, 175, 128), + (229, 169, 96), (228, 169, 87), (228, 169, 79), (237, 176, 83), + (237, 183, 87), (200, 183, 153), (181, 163, 173), (163, 143, 194), + (150, 133, 201), (138, 124, 209), (122, 117, 219), (111, 110, 230), + (99, 100, 242), (98, 100, 243), (98, 101, 244), (99, 99, 244), + (101, 97, 244), (102, 99, 241), (103, 102, 238), (107, 106, 236), + (108, 105, 236), (108, 105, 234), (111, 107, 232), (114, 110, 231), + (117, 111, 228), (120, 113, 225), (124, 116, 219), (134, 121, 211), + (170, 148, 187), (177, 155, 180), (184, 162, 174), (183, 157, 167), + (183, 152, 160), (161, 127, 154), (170, 151, 155), (178, 159, 153), + (196, 176, 167), (206, 184, 147), (209, 191, 149), (212, 198, 151), + (211, 192, 153), (210, 187, 155), (195, 170, 174), (174, 155, 183), + (136, 124, 210), (132, 121, 212), (128, 118, 215), (125, 116, 218), + (123, 114, 221), (120, 113, 225), (115, 110, 230), (109, 107, 234), + (108, 105, 234), (107, 106, 236), (107, 106, 236), (107, 106, 236), + (103, 102, 240), (102, 101, 239), (96, 93, 242), (80, 97, 247), + (89, 96, 255), (104, 105, 239), (120, 114, 224), (127, 119, 218), + (135, 125, 212), (155, 136, 200), (183, 160, 178), (195, 175, 166), + (197, 178, 163), (168, 151, 187), (155, 141, 197), (142, 131, 207), + (130, 129, 207), (130, 121, 214), (125, 117, 218), (122, 115, 221), + (123, 114, 221), (122, 114, 221), (122, 115, 221), (121, 114, 222), + (120, 114, 224), (120, 112, 223), (120, 113, 225), (120, 113, 225), + (116, 111, 229), (112, 110, 233), (110, 108, 233), (109, 107, 234), + (108, 105, 234), (109, 106, 235), (112, 110, 233), (114, 115, 241), + (118, 119, 237), (119, 121, 230), (121, 123, 224), (125, 117, 218), + (128, 118, 215), (128, 118, 215), (124, 116, 219), (122, 115, 219), + (113, 105, 214), (102, 101, 237), (78, 76, 222), (55, 51, 208), + (22, 39, 189), (0, 24, 151), (49, 11, 72), (69, 14, 53), + (126, 40, 5), (139, 53, 6), (153, 67, 8), (168, 84, 20), + (168, 85, 19), (171, 90, 24), (176, 100, 84), (162, 128, 119), + (153, 115, 164), (134, 122, 204), (134, 121, 209), (135, 122, 212), + (133, 120, 212), (130, 121, 214), (129, 118, 212), (132, 118, 213), + (128, 118, 215), (128, 118, 215), (128, 118, 215), (124, 116, 219), + (122, 115, 221), (120, 114, 224), (120, 113, 225), (116, 111, 227), + (114, 110, 230), (110, 108, 231), (109, 107, 234), (106, 106, 238), + (108, 110, 247), (108, 113, 243), (114, 113, 240), (113, 112, 232), + (120, 113, 225), (123, 114, 221), (130, 121, 214), (136, 124, 210), + (154, 128, 189), (181, 149, 124), (221, 152, 75), (227, 169, 62), + (207, 136, 54), (198, 121, 49), (203, 132, 50), (210, 142, 61), + (218, 156, 69), (182, 154, 132), (172, 135, 143), (145, 129, 200), + (111, 112, 218), (99, 100, 240), (84, 90, 236), (56, 56, 188), + (3, 26, 156), (0, 7, 88), (38, 8, 72), (53, 16, 59), + (125, 49, 15), (161, 77, 13), (177, 95, 37), (199, 126, 49), + (184, 151, 136), (166, 149, 181), (146, 134, 200), (135, 122, 210), + (133, 120, 210), (129, 119, 216), (124, 116, 219), (122, 115, 221), + (121, 115, 223), (120, 113, 225), (116, 111, 227), (112, 111, 231), + (109, 107, 234), (108, 105, 234), (107, 106, 234), (103, 103, 233), + (102, 104, 227), (107, 104, 233), (108, 105, 234), (108, 105, 234), + (109, 107, 234), (114, 110, 231), (120, 113, 225), (121, 115, 223), + (126, 119, 225), (122, 116, 222), (124, 118, 216), (122, 115, 221) + ), + +// 229 Apophysis-040427-6Equinox2 +((46, 5, 49), (137, 106, 112), (140, 156, 106), (144, 207, 100), + (141, 207, 99), (139, 207, 98), (140, 206, 100), (141, 206, 102), + (152, 194, 94), (158, 142, 115), (164, 91, 137), (140, 130, 132), + (116, 169, 127), (129, 187, 116), (143, 205, 106), (140, 206, 103), + (138, 207, 100), (132, 212, 99), (135, 208, 103), (138, 204, 107), + (142, 191, 123), (146, 178, 139), (161, 164, 146), (177, 151, 154), + (193, 152, 156), (194, 154, 153), (195, 156, 151), (175, 179, 129), + (156, 203, 107), (150, 208, 102), (145, 214, 97), (147, 223, 91), + (151, 234, 84), (154, 255, 69), (155, 250, 70), (156, 246, 71), + (150, 240, 77), (145, 234, 84), (142, 227, 81), (139, 220, 79), + (146, 221, 92), (146, 218, 93), (146, 216, 94), (145, 215, 93), + (144, 215, 93), (144, 215, 93), (145, 216, 94), (146, 216, 94), + (145, 214, 97), (144, 215, 95), (145, 217, 94), (147, 219, 94), + (147, 219, 94), (148, 220, 94), (148, 220, 94), (148, 220, 94), + (151, 233, 87), (153, 235, 86), (155, 238, 86), (153, 236, 85), + (152, 235, 85), (152, 233, 85), (152, 231, 86), (149, 227, 89), + (146, 222, 90), (154, 196, 94), (191, 175, 91), (229, 154, 89), + (242, 160, 78), (255, 167, 68), (249, 122, 43), (238, 116, 69), + (211, 126, 62), (213, 107, 53), (216, 89, 44), (221, 100, 55), + (226, 111, 66), (230, 129, 83), (234, 148, 101), (205, 159, 135), + (200, 159, 137), (172, 69, 72), (179, 50, 43), (187, 32, 14), + (177, 30, 15), (167, 29, 16), (160, 19, 9), (140, 8, 0), + (19, 4, 23), (84, 27, 41), (150, 50, 60), (177, 60, 46), + (205, 71, 33), (241, 110, 68), (247, 160, 80), (255, 167, 93), + (230, 189, 110), (143, 225, 99), (172, 207, 122), (202, 189, 145), + (213, 184, 146), (225, 180, 147), (209, 168, 138), (147, 208, 104), + (139, 215, 55), (144, 228, 62), (149, 241, 70), (151, 241, 73), + (153, 241, 77), (152, 240, 78), (152, 235, 85), (152, 235, 85), + (152, 235, 85), (155, 238, 86), (155, 238, 86), (155, 238, 86), + (155, 238, 86), (154, 239, 86), (154, 239, 84), (153, 246, 80), + (146, 255, 71), (149, 249, 74), (152, 243, 77), (152, 239, 81), + (152, 235, 85), (151, 237, 88), (151, 233, 87), (148, 229, 90), + (147, 223, 91), (149, 221, 95), (155, 213, 103), (161, 206, 111), + (200, 168, 145), (199, 157, 141), (146, 189, 118), (141, 198, 101), + (144, 196, 113), (163, 176, 135), (183, 157, 158), (188, 154, 156), + (194, 152, 154), (211, 165, 142), (241, 172, 107), (253, 187, 91), + (255, 199, 89), (157, 218, 89), (154, 223, 91), (152, 228, 93), + (153, 230, 90), (153, 232, 89), (156, 230, 91), (153, 230, 90), + (148, 220, 94), (145, 215, 96), (143, 211, 98), (141, 207, 101), + (142, 198, 107), (147, 170, 128), (167, 146, 165), (162, 137, 166), + (143, 171, 172), (181, 180, 185), (176, 181, 179), (172, 182, 174), + (157, 195, 148), (143, 184, 142), (142, 200, 116), (143, 205, 106), + (147, 219, 94), (148, 220, 91), (149, 222, 89), (149, 227, 89), + (149, 227, 89), (155, 229, 92), (163, 234, 102), (232, 210, 124), + (251, 201, 128), (240, 193, 115), (223, 175, 111), (204, 158, 143), + (196, 155, 149), (194, 153, 149), (187, 153, 154), (146, 188, 124), + (143, 209, 99), (143, 211, 97), (144, 213, 96), (147, 219, 94), + (147, 223, 91), (150, 228, 90), (151, 229, 91), (149, 227, 91), + (146, 221, 92), (144, 215, 93), (142, 208, 98), (143, 200, 95), + (142, 195, 103), (169, 87, 76), (192, 62, 28), (195, 52, 20), + (169, 27, 15), (108, 8, 18), (22, 56, 5), (23, 67, 4), + (30, 82, 18), (57, 98, 0), (68, 113, 18), (99, 152, 64), + (130, 214, 90), (141, 216, 89), (144, 215, 93), (144, 215, 95), + (144, 213, 97), (144, 213, 97), (145, 214, 97), (144, 219, 92), + (146, 221, 92), (147, 225, 89), (147, 229, 82), (151, 230, 85), + (150, 232, 85), (152, 235, 85), (152, 235, 85), (152, 235, 85), + (153, 232, 89), (149, 227, 89), (147, 223, 91), (147, 223, 91), + (146, 221, 92), (146, 217, 87), (154, 216, 71), (149, 224, 69), + (149, 232, 64), (133, 233, 72), (142, 236, 86), (148, 233, 90), + (151, 229, 91), (149, 227, 89), (147, 223, 91), (147, 223, 91), + (147, 223, 91), (147, 223, 91), (147, 223, 91), (148, 220, 92), + (146, 216, 94), (143, 211, 98), (144, 200, 109), (141, 185, 126), + (140, 181, 147), (139, 175, 171), (169, 143, 168), (186, 147, 168), + (182, 152, 160), (195, 148, 154), (198, 155, 146), (195, 152, 146) + ), + +// 230 Apophysis-040427-6BluBrd +((254, 169, 16), (252, 167, 16), (252, 161, 15), (252, 155, 14), + (245, 143, 14), (238, 132, 14), (238, 132, 14), (238, 132, 14), + (112, 170, 8), (106, 149, 35), (100, 129, 63), (105, 139, 73), + (110, 149, 84), (117, 117, 85), (125, 86, 87), (117, 89, 112), + (110, 93, 137), (20, 70, 195), (27, 102, 225), (35, 135, 255), + (19, 93, 227), (4, 51, 199), (9, 42, 166), (15, 33, 133), + (7, 4, 61), (20, 11, 43), (33, 18, 25), (17, 17, 37), + (1, 17, 50), (8, 13, 33), (16, 9, 17), (40, 17, 0), + (33, 35, 0), (65, 49, 33), (92, 81, 49), (119, 113, 65), + (142, 137, 79), (166, 161, 93), (209, 167, 68), (253, 174, 43), + (255, 182, 27), (255, 176, 23), (255, 170, 19), (253, 162, 16), + (252, 155, 14), (245, 143, 14), (238, 132, 14), (238, 124, 12), + (246, 113, 10), (238, 111, 14), (237, 115, 14), (236, 119, 14), + (237, 123, 13), (239, 128, 13), (239, 128, 13), (239, 129, 14), + (253, 153, 15), (253, 157, 14), (253, 161, 14), (253, 157, 14), + (253, 153, 15), (250, 146, 14), (248, 140, 14), (244, 130, 16), + (240, 129, 14), (240, 129, 14), (239, 126, 13), (238, 124, 12), + (238, 124, 12), (238, 124, 12), (225, 122, 17), (204, 143, 60), + (141, 151, 88), (141, 177, 97), (141, 203, 106), (148, 182, 100), + (155, 162, 94), (149, 150, 88), (143, 138, 82), (124, 147, 91), + (118, 113, 94), (85, 158, 165), (46, 103, 169), (8, 49, 173), + (9, 41, 152), (10, 34, 132), (0, 20, 81), (48, 54, 40), + (38, 25, 35), (19, 25, 73), (0, 25, 112), (10, 26, 123), + (20, 27, 134), (13, 19, 117), (90, 47, 56), (94, 51, 6), + (69, 46, 12), (85, 52, 7), (96, 80, 3), (107, 108, 0), + (160, 98, 4), (213, 88, 8), (222, 91, 11), (221, 90, 10), + (163, 81, 7), (141, 82, 35), (120, 83, 64), (140, 89, 69), + (160, 95, 75), (220, 89, 11), (221, 100, 11), (233, 111, 12), + (232, 114, 14), (217, 92, 10), (168, 100, 40), (120, 108, 70), + (101, 65, 93), (69, 24, 177), (5, 31, 152), (0, 33, 186), + (107, 104, 113), (174, 138, 72), (241, 172, 32), (246, 176, 34), + (252, 180, 36), (251, 169, 43), (171, 141, 91), (139, 110, 80), + (123, 93, 67), (42, 90, 30), (48, 77, 33), (54, 64, 37), + (91, 53, 34), (101, 47, 83), (132, 78, 101), (180, 117, 86), + (231, 115, 12), (231, 110, 19), (232, 105, 26), (230, 81, 50), + (228, 57, 75), (186, 84, 147), (133, 30, 199), (95, 29, 225), + (63, 67, 236), (55, 141, 216), (49, 143, 212), (44, 146, 208), + (41, 191, 218), (134, 172, 195), (92, 60, 255), (142, 0, 242), + (123, 12, 194), (167, 33, 132), (211, 54, 71), (227, 96, 14), + (233, 111, 12), (231, 115, 12), (232, 116, 13), (233, 118, 11), + (234, 119, 12), (239, 128, 13), (243, 134, 13), (248, 140, 14), + (253, 153, 15), (255, 163, 16), (255, 170, 19), (255, 170, 19), + (252, 182, 24), (250, 190, 24), (249, 199, 24), (249, 204, 25), + (253, 201, 29), (254, 196, 27), (255, 183, 23), (254, 170, 19), + (248, 147, 15), (207, 132, 15), (172, 128, 89), (140, 123, 80), + (205, 101, 12), (230, 114, 11), (240, 129, 14), (253, 152, 20), + (255, 192, 29), (254, 202, 29), (253, 213, 29), (197, 254, 19), + (111, 255, 11), (138, 249, 20), (235, 237, 52), (255, 200, 41), + (255, 201, 30), (255, 201, 30), (255, 202, 28), (255, 201, 30), + (255, 190, 26), (255, 183, 23), (255, 183, 23), (255, 183, 23), + (255, 183, 23), (255, 183, 23), (255, 183, 23), (255, 182, 27), + (255, 185, 28), (254, 190, 30), (255, 192, 29), (255, 187, 26), + (255, 182, 27), (255, 173, 27), (255, 171, 20), (255, 170, 19), + (255, 171, 20), (255, 181, 24), (255, 183, 23), (255, 183, 28), + (255, 185, 30), (254, 183, 29), (255, 182, 27), (255, 178, 22), + (255, 170, 19), (255, 170, 19), (252, 163, 17), (249, 148, 14), + (232, 116, 13), (177, 108, 67), (138, 94, 91), (103, 15, 177), + (128, 11, 203), (146, 21, 226), (151, 23, 224), (176, 83, 190), + (169, 164, 132), (227, 173, 41), (248, 184, 26), (253, 183, 25), + (255, 183, 23), (255, 196, 17), (253, 198, 17), (255, 191, 5), + (245, 183, 14), (254, 177, 19), (255, 177, 19), (255, 182, 23), + (244, 185, 21), (235, 192, 27), (213, 209, 22), (169, 213, 16), + (150, 204, 28), (129, 228, 41), (60, 176, 49), (101, 152, 73), + (112, 153, 85), (134, 160, 89), (150, 124, 37), (231, 125, 5) + ), + +// 231 Apophysis-040427-6BluBrdInv +((231, 125, 5), (134, 160, 89), (117, 156, 81), (101, 152, 73), + (115, 190, 57), (129, 228, 41), (139, 216, 34), (150, 204, 28), + (213, 209, 22), (228, 197, 21), (244, 185, 21), (249, 181, 20), + (255, 177, 19), (250, 180, 16), (245, 183, 14), (250, 187, 9), + (255, 191, 5), (255, 196, 17), (254, 189, 21), (253, 183, 25), + (240, 178, 33), (227, 173, 41), (198, 168, 86), (169, 164, 132), + (151, 23, 224), (139, 17, 213), (128, 11, 203), (133, 52, 147), + (138, 94, 91), (157, 101, 79), (177, 108, 67), (232, 116, 13), + (249, 148, 14), (255, 170, 19), (255, 174, 20), (255, 178, 22), + (254, 180, 25), (254, 183, 29), (254, 184, 29), (255, 185, 30), + (255, 183, 23), (255, 177, 21), (255, 171, 20), (255, 171, 20), + (255, 171, 20), (255, 172, 23), (255, 173, 27), (255, 182, 27), + (255, 187, 26), (254, 190, 30), (254, 186, 28), (255, 182, 27), + (255, 182, 25), (255, 183, 23), (255, 183, 23), (255, 183, 23), + (255, 183, 23), (255, 186, 24), (255, 190, 26), (255, 196, 27), + (255, 202, 28), (255, 201, 29), (255, 201, 30), (255, 201, 30), + (255, 200, 41), (138, 249, 20), (167, 251, 19), (197, 254, 19), + (225, 233, 24), (253, 213, 29), (255, 192, 29), (255, 173, 25), + (240, 129, 14), (222, 115, 13), (205, 101, 12), (188, 114, 50), + (172, 128, 89), (189, 130, 52), (207, 132, 15), (248, 147, 15), + (254, 170, 19), (254, 196, 27), (251, 200, 26), (249, 204, 25), + (249, 201, 24), (249, 199, 24), (252, 182, 24), (255, 172, 18), + (255, 170, 19), (254, 161, 17), (253, 153, 15), (250, 146, 14), + (248, 140, 14), (239, 128, 13), (238, 124, 12), (234, 119, 12), + (233, 118, 11), (231, 115, 12), (229, 105, 13), (227, 96, 14), + (219, 75, 42), (211, 54, 71), (123, 12, 194), (146, 15, 231), + (92, 60, 255), (66, 125, 236), (41, 191, 218), (42, 168, 213), + (44, 146, 208), (55, 141, 216), (61, 94, 199), (63, 67, 236), + (95, 29, 225), (186, 84, 147), (207, 70, 111), (228, 57, 75), + (232, 105, 26), (231, 115, 12), (231, 115, 12), (224, 115, 14), + (132, 78, 101), (111, 65, 67), (91, 53, 34), (72, 58, 35), + (54, 64, 37), (42, 90, 30), (70, 71, 53), (123, 93, 67), + (139, 110, 80), (251, 169, 43), (251, 174, 39), (252, 180, 36), + (241, 172, 32), (165, 136, 94), (107, 104, 113), (25, 43, 171), + (5, 31, 152), (53, 48, 122), (101, 65, 93), (110, 86, 81), + (120, 108, 70), (217, 92, 10), (227, 109, 13), (232, 114, 14), + (233, 111, 12), (220, 89, 11), (190, 92, 43), (160, 95, 75), + (120, 83, 64), (94, 67, 56), (163, 81, 7), (215, 81, 8), + (222, 91, 11), (217, 89, 9), (213, 88, 8), (107, 108, 0), + (107, 76, 12), (85, 52, 7), (60, 41, 1), (69, 46, 12), + (94, 51, 6), (13, 19, 117), (16, 23, 125), (20, 27, 134), + (0, 25, 112), (3, 18, 75), (38, 25, 35), (56, 42, 29), + (0, 20, 81), (5, 27, 106), (10, 34, 132), (8, 49, 173), + (41, 152, 182), (85, 158, 165), (132, 108, 140), (118, 113, 94), + (124, 147, 91), (143, 138, 82), (155, 162, 94), (143, 182, 103), + (141, 203, 106), (113, 163, 94), (141, 151, 88), (173, 133, 84), + (225, 122, 17), (231, 123, 14), (238, 124, 12), (238, 124, 12), + (238, 126, 14), (240, 129, 14), (239, 128, 13), (240, 129, 14), + (244, 130, 16), (248, 140, 14), (253, 153, 15), (252, 155, 14), + (253, 161, 14), (255, 161, 17), (253, 153, 15), (249, 141, 15), + (239, 129, 14), (239, 128, 13), (238, 124, 12), (236, 119, 14), + (235, 113, 14), (238, 111, 14), (252, 111, 6), (246, 113, 10), + (238, 124, 12), (238, 132, 14), (252, 155, 14), (254, 164, 16), + (255, 170, 19), (255, 171, 20), (255, 182, 27), (255, 176, 29), + (253, 174, 43), (166, 161, 93), (137, 117, 80), (119, 113, 65), + (88, 72, 59), (65, 49, 33), (42, 27, 4), (33, 35, 0), + (40, 17, 0), (16, 9, 17), (1, 17, 50), (8, 17, 60), + (33, 18, 25), (4, 14, 49), (7, 4, 61), (16, 11, 69), + (15, 33, 133), (4, 51, 199), (11, 132, 255), (35, 135, 255), + (41, 101, 223), (20, 70, 195), (55, 78, 145), (110, 93, 137), + (125, 86, 87), (134, 105, 75), (110, 149, 84), (107, 152, 87), + (100, 129, 63), (96, 138, 0), (112, 170, 8), (183, 172, 22), + (238, 132, 14), (238, 132, 14), (249, 148, 14), (252, 155, 14), + (253, 163, 17), (252, 167, 16), (255, 170, 19), (254, 169, 16) + ), + +// 232 Apophysis-040427-6FaerieKng +((1, 1, 1), (76, 14, 63), (84, 18, 80), (93, 22, 98), + (95, 31, 68), (98, 40, 39), (95, 35, 36), (93, 31, 34), + (3, 3, 3), (3, 5, 7), (3, 8, 12), (44, 26, 18), + (85, 44, 24), (108, 71, 39), (132, 99, 54), (134, 109, 71), + (136, 119, 89), (155, 162, 180), (128, 119, 200), (102, 77, 221), + (95, 48, 163), (89, 19, 105), (89, 17, 99), (90, 16, 93), + (103, 50, 56), (120, 62, 28), (138, 75, 0), (163, 93, 0), + (189, 112, 0), (194, 108, 0), (199, 104, 0), (162, 94, 47), + (141, 62, 57), (71, 20, 97), (35, 27, 120), (0, 34, 144), + (48, 26, 119), (97, 19, 95), (91, 31, 103), (85, 44, 112), + (71, 23, 97), (55, 13, 71), (39, 4, 46), (20, 2, 23), + (1, 1, 1), (1, 1, 1), (1, 1, 1), (0, 3, 0), + (5, 21, 0), (8, 112, 0), (44, 120, 27), (81, 129, 55), + (109, 120, 77), (138, 111, 100), (125, 107, 116), (112, 103, 132), + (69, 137, 184), (154, 178, 184), (239, 219, 184), (219, 207, 170), + (200, 195, 157), (172, 167, 147), (145, 140, 137), (94, 86, 99), + (65, 42, 96), (24, 20, 47), (22, 36, 46), (21, 52, 46), + (15, 55, 53), (10, 58, 60), (8, 91, 71), (22, 98, 86), + (145, 64, 159), (150, 103, 170), (155, 143, 181), (157, 117, 162), + (159, 92, 143), (147, 106, 125), (135, 121, 108), (153, 145, 108), + (204, 189, 122), (127, 172, 115), (111, 137, 82), (96, 103, 49), + (66, 69, 42), (37, 35, 36), (12, 12, 12), (3, 3, 3), + (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), + (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), + (1, 1, 1), (25, 11, 44), (40, 22, 67), (55, 34, 91), + (37, 33, 88), (19, 32, 85), (0, 23, 83), (0, 43, 78), + (4, 89, 68), (5, 52, 41), (7, 16, 15), (4, 8, 10), + (2, 1, 6), (1, 1, 1), (1, 1, 1), (1, 1, 1), + (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), + (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), + (5, 7, 2), (33, 30, 17), (62, 54, 33), (74, 42, 49), + (86, 30, 65), (120, 43, 95), (176, 68, 128), (177, 70, 150), + (150, 48, 157), (140, 42, 117), (142, 50, 107), (145, 59, 98), + (134, 58, 68), (104, 58, 45), (107, 98, 67), (151, 121, 61), + (109, 164, 96), (114, 108, 100), (119, 52, 105), (117, 35, 105), + (115, 19, 106), (106, 11, 101), (131, 8, 71), (139, 58, 73), + (177, 91, 76), (177, 108, 5), (172, 110, 8), (167, 112, 11), + (155, 119, 43), (148, 142, 58), (149, 151, 67), (161, 136, 72), + (201, 121, 194), (209, 106, 212), (218, 91, 230), (204, 111, 202), + (122, 95, 140), (42, 86, 121), (14, 86, 85), (31, 100, 115), + (85, 101, 152), (247, 88, 234), (251, 97, 244), (255, 107, 255), + (255, 108, 206), (210, 120, 158), (203, 156, 100), (185, 135, 82), + (134, 53, 85), (135, 55, 100), (136, 58, 116), (155, 67, 128), + (189, 63, 145), (189, 63, 147), (194, 65, 157), (178, 45, 188), + (180, 67, 183), (168, 77, 157), (100, 65, 129), (96, 77, 99), + (52, 47, 54), (21, 22, 24), (4, 4, 6), (1, 1, 1), + (5, 1, 2), (23, 8, 1), (41, 15, 0), (82, 41, 19), + (94, 35, 41), (61, 42, 44), (32, 17, 48), (9, 4, 24), + (4, 4, 4), (1, 1, 1), (1, 1, 1), (1, 1, 1), + (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), + (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), + (1, 1, 1), (1, 1, 1), (1, 1, 1), (4, 0, 1), + (7, 2, 8), (13, 5, 46), (32, 20, 56), (18, 14, 51), + (6, 1, 68), (8, 1, 43), (0, 0, 30), (0, 0, 4), + (0, 0, 2), (1, 1, 1), (1, 1, 1), (1, 1, 1), + (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), + (0, 0, 0), (1, 0, 0), (1, 0, 0), (1, 1, 1), + (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), + (0, 1, 3), (0, 8, 14), (0, 35, 30), (11, 80, 49), + (5, 103, 28), (22, 112, 42), (87, 63, 25), (118, 56, 41), + (144, 78, 46), (136, 88, 12), (132, 79, 25), (92, 43, 28), + (36, 28, 26), (6, 9, 0), (1, 1, 1), (1, 1, 1), + (1, 1, 1), (1, 1, 1), (2, 2, 0), (9, 10, 0), + (41, 59, 33), (89, 45, 32), (132, 57, 28), (154, 87, 6) + ), + +// 233 Apophysis-040427-6FireDemnOrch +((42, 230, 232), (8, 250, 199), (4, 218, 181), (1, 187, 164), + (0, 140, 149), (0, 93, 135), (0, 84, 119), (0, 75, 104), + (5, 13, 85), (8, 15, 96), (11, 18, 108), (6, 35, 106), + (2, 52, 105), (1, 71, 101), (1, 90, 98), (8, 80, 86), + (16, 71, 74), (24, 10, 87), (68, 46, 77), (112, 83, 67), + (132, 131, 74), (153, 179, 82), (181, 195, 65), (210, 212, 49), + (225, 211, 150), (232, 224, 111), (239, 238, 72), (221, 222, 60), + (203, 207, 48), (183, 184, 65), (163, 162, 82), (134, 111, 70), + (114, 80, 68), (15, 14, 131), (34, 33, 161), (53, 52, 192), + (68, 63, 201), (83, 75, 210), (81, 72, 221), (80, 69, 233), + (76, 61, 252), (109, 61, 253), (143, 62, 255), (175, 74, 234), + (208, 87, 214), (204, 80, 214), (201, 74, 215), (184, 55, 218), + (173, 38, 228), (124, 66, 226), (148, 57, 226), (173, 48, 226), + (141, 26, 191), (110, 5, 157), (81, 6, 135), (53, 8, 113), + (12, 4, 87), (17, 5, 82), (22, 6, 77), (56, 14, 64), + (91, 22, 51), (89, 18, 44), (87, 15, 37), (95, 16, 35), + (100, 26, 51), (110, 30, 39), (125, 36, 36), (140, 42, 33), + (153, 66, 40), (167, 90, 48), (171, 96, 65), (211, 111, 85), + (187, 58, 96), (182, 31, 77), (178, 5, 59), (165, 6, 39), + (153, 7, 20), (150, 10, 21), (148, 14, 23), (147, 21, 6), + (147, 6, 15), (139, 23, 0), (135, 45, 0), (132, 68, 0), + (138, 65, 3), (144, 63, 7), (133, 55, 55), (137, 70, 64), + (134, 127, 37), (80, 148, 53), (27, 169, 69), (31, 156, 98), + (36, 143, 127), (4, 147, 145), (3, 156, 151), (0, 182, 164), + (36, 165, 187), (169, 166, 209), (197, 127, 183), (226, 89, 157), + (235, 103, 147), (244, 117, 138), (224, 136, 134), (204, 165, 126), + (210, 207, 76), (175, 175, 78), (141, 143, 80), (137, 134, 88), + (134, 125, 96), (108, 65, 144), (100, 67, 208), (120, 63, 194), + (184, 57, 164), (137, 68, 97), (94, 68, 116), (51, 69, 135), + (45, 78, 121), (24, 70, 119), (4, 62, 162), (27, 69, 177), + (174, 77, 192), (197, 83, 200), (221, 89, 209), (182, 126, 213), + (143, 164, 217), (70, 205, 198), (25, 238, 190), (10, 241, 197), + (5, 239, 190), (102, 169, 188), (105, 152, 165), (108, 135, 142), + (157, 68, 150), (180, 56, 178), (200, 38, 175), (196, 42, 172), + (198, 51, 121), (197, 86, 118), (196, 121, 115), (203, 129, 120), + (210, 138, 126), (222, 126, 137), (245, 103, 125), (239, 130, 99), + (246, 179, 88), (254, 83, 31), (220, 76, 40), (187, 70, 50), + (112, 84, 73), (47, 95, 141), (32, 87, 154), (98, 145, 139), + (223, 136, 170), (223, 157, 161), (223, 179, 152), (239, 213, 176), + (207, 170, 178), (101, 187, 212), (75, 213, 252), (43, 206, 213), + (3, 163, 185), (0, 70, 129), (15, 48, 125), (30, 26, 121), + (57, 1, 108), (104, 0, 75), (119, 11, 43), (117, 14, 15), + (129, 24, 0), (147, 26, 4), (165, 28, 9), (187, 49, 20), + (216, 79, 37), (211, 83, 74), (194, 90, 77), (193, 65, 80), + (213, 61, 100), (209, 70, 159), (188, 70, 193), (197, 50, 200), + (153, 55, 200), (91, 53, 214), (68, 53, 204), (32, 49, 155), + (16, 8, 94), (24, 9, 101), (32, 10, 108), (36, 18, 118), + (36, 53, 161), (63, 82, 187), (89, 84, 202), (72, 188, 229), + (49, 227, 237), (23, 242, 210), (13, 231, 183), (4, 219, 152), + (93, 149, 76), (164, 92, 44), (224, 34, 0), (225, 23, 1), + (215, 8, 0), (204, 7, 1), (190, 13, 0), (177, 15, 4), + (152, 16, 28), (133, 43, 42), (169, 13, 112), (180, 35, 176), + (200, 39, 203), (187, 58, 213), (159, 53, 211), (117, 60, 201), + (89, 55, 191), (69, 26, 115), (72, 8, 92), (102, 3, 70), + (100, 11, 41), (150, 2, 26), (160, 9, 24), (181, 13, 10), + (230, 4, 5), (243, 7, 19), (254, 68, 17), (255, 93, 0), + (188, 170, 2), (158, 166, 55), (131, 196, 30), (86, 147, 43), + (70, 138, 35), (16, 82, 78), (1, 47, 73), (8, 4, 89), + (42, 4, 91), (84, 12, 86), (155, 9, 92), (193, 47, 148), + (177, 56, 187), (164, 66, 211), (129, 69, 217), (97, 68, 236), + (104, 94, 245), (62, 169, 223), (52, 180, 217), (14, 201, 180), + (6, 195, 163), (7, 201, 177), (0, 208, 184), (1, 228, 185), + (1, 233, 185), (16, 225, 170), (20, 212, 161), (90, 180, 116), + (107, 130, 52), (133, 60, 51), (120, 59, 4), (133, 41, 30) + ), + +// 234 Apophysis-040427-6CsmcLottoWhl +((110, 68, 10), (206, 107, 22), (230, 139, 25), (255, 172, 28), + (255, 212, 33), (255, 252, 39), (255, 253, 38), (255, 255, 38), + (250, 242, 9), (221, 204, 9), (193, 167, 10), (189, 148, 5), + (186, 129, 0), (190, 125, 7), (194, 122, 14), (203, 123, 10), + (213, 124, 6), (217, 131, 18), (220, 133, 9), (223, 136, 0), + (239, 155, 10), (255, 174, 20), (255, 174, 22), (255, 175, 24), + (254, 215, 14), (254, 203, 21), (255, 192, 29), (231, 153, 30), + (207, 115, 32), (181, 101, 36), (155, 87, 40), (116, 75, 29), + (80, 51, 19), (17, 10, 17), (12, 9, 12), (8, 8, 8), + (27, 15, 4), (47, 23, 0), (61, 32, 0), (75, 42, 1), + (145, 74, 28), (158, 84, 28), (172, 94, 28), (152, 94, 16), + (132, 95, 4), (119, 89, 2), (107, 84, 0), (104, 69, 5), + (87, 54, 11), (20, 6, 0), (14, 7, 4), (8, 8, 8), + (9, 9, 9), (10, 10, 10), (23, 15, 5), (36, 20, 0), + (87, 52, 14), (92, 46, 9), (97, 41, 4), (100, 42, 5), + (104, 44, 7), (110, 50, 3), (116, 57, 0), (116, 70, 10), + (114, 79, 11), (171, 102, 1), (165, 86, 3), (160, 71, 5), + (147, 71, 2), (135, 72, 0), (116, 56, 0), (86, 36, 0), + (11, 7, 6), (7, 5, 4), (3, 3, 3), (2, 2, 2), + (1, 1, 1), (1, 1, 1), (1, 1, 1), (2, 2, 2), + (2, 2, 2), (4, 16, 6), (5, 16, 13), (7, 16, 21), + (36, 33, 26), (66, 51, 32), (97, 84, 32), (134, 85, 19), + (172, 104, 5), (148, 90, 2), (125, 76, 0), (118, 68, 0), + (112, 61, 0), (79, 46, 13), (49, 28, 9), (12, 12, 10), + (9, 9, 9), (40, 30, 0), (67, 33, 0), (94, 36, 0), + (106, 47, 4), (118, 58, 8), (127, 56, 10), (114, 52, 5), + (63, 24, 0), (36, 16, 4), (9, 9, 9), (8, 8, 8), + (8, 8, 8), (6, 6, 6), (4, 4, 4), (3, 3, 3), + (2, 2, 2), (2, 2, 2), (2, 2, 2), (3, 3, 3), + (4, 4, 4), (6, 6, 6), (7, 7, 7), (7, 7, 7), + (3, 3, 3), (2, 2, 2), (2, 2, 2), (2, 2, 2), + (2, 2, 2), (2, 2, 2), (2, 2, 2), (2, 2, 2), + (2, 2, 2), (2, 2, 2), (1, 1, 3), (1, 0, 5), + (2, 2, 2), (2, 2, 2), (2, 2, 2), (2, 2, 2), + (3, 3, 3), (3, 3, 3), (3, 3, 3), (3, 3, 3), + (3, 3, 3), (3, 3, 3), (3, 3, 3), (5, 5, 5), + (9, 9, 9), (69, 39, 11), (86, 51, 21), (104, 63, 31), + (126, 96, 34), (181, 132, 39), (197, 189, 202), (255, 250, 192), + (210, 182, 0), (215, 180, 0), (221, 179, 0), (241, 186, 0), + (255, 177, 19), (254, 176, 28), (255, 173, 28), (255, 165, 33), + (219, 155, 21), (144, 87, 18), (128, 73, 12), (112, 59, 7), + (83, 35, 0), (36, 20, 0), (9, 9, 9), (4, 4, 4), + (1, 1, 1), (2, 0, 0), (3, 0, 0), (5, 1, 0), + (3, 3, 1), (2, 2, 2), (2, 2, 2), (1, 1, 1), + (1, 1, 1), (1, 1, 1), (1, 1, 1), (0, 0, 0), + (0, 0, 0), (1, 1, 1), (2, 2, 2), (4, 4, 4), + (8, 8, 8), (7, 7, 6), (7, 7, 5), (12, 0, 0), + (8, 7, 3), (6, 6, 6), (5, 10, 6), (9, 9, 9), + (9, 9, 9), (21, 7, 7), (54, 31, 0), (82, 44, 0), + (104, 64, 5), (103, 67, 7), (103, 58, 16), (77, 41, 7), + (64, 29, 0), (23, 9, 0), (16, 5, 1), (22, 14, 0), + (53, 43, 7), (81, 61, 24), (123, 96, 25), (157, 125, 22), + (191, 119, 11), (221, 105, 0), (234, 116, 18), (253, 120, 15), + (255, 139, 23), (254, 162, 25), (232, 146, 35), (193, 120, 18), + (162, 118, 0), (146, 104, 6), (122, 77, 12), (116, 72, 11), + (132, 76, 29), (167, 74, 15), (179, 83, 9), (188, 94, 4), + (192, 93, 12), (186, 111, 10), (171, 93, 18), (148, 86, 9), + (144, 87, 6), (131, 76, 0), (137, 96, 0), (135, 117, 0), + (142, 118, 0), (159, 129, 0), (184, 150, 0), (199, 177, 3), + (240, 179, 10), (253, 175, 17), (239, 141, 6), (245, 112, 11), + (212, 104, 16), (161, 115, 30), (121, 91, 31), (114, 81, 30), + (117, 72, 7), (128, 48, 0), (131, 24, 0), (153, 37, 0), + (129, 52, 0), (128, 55, 10), (143, 60, 18), (138, 67, 0), + (156, 62, 0), (169, 76, 7), (245, 109, 23), (209, 86, 8) + ), + +// 235 Apophysis-040427-6DreamFaeriRlm +((3, 0, 0), (1, 1, 1), (19, 10, 6), (38, 19, 12), + (62, 34, 17), (87, 50, 23), (106, 60, 30), (125, 71, 37), + (155, 92, 77), (157, 111, 89), (160, 131, 101), (161, 126, 102), + (162, 121, 103), (151, 120, 98), (141, 120, 93), (135, 114, 90), + (130, 109, 88), (94, 66, 52), (87, 58, 39), (81, 51, 27), + (79, 50, 28), (78, 50, 29), (78, 52, 26), (78, 55, 24), + (124, 83, 51), (138, 93, 46), (153, 103, 42), (156, 95, 48), + (160, 87, 54), (165, 85, 43), (170, 84, 33), (156, 83, 42), + (146, 88, 42), (104, 58, 32), (97, 51, 30), (90, 44, 28), + (81, 44, 26), (73, 45, 24), (77, 46, 21), (81, 47, 19), + (88, 43, 1), (88, 45, 9), (88, 47, 17), (94, 58, 38), + (100, 70, 60), (114, 76, 64), (128, 82, 69), (155, 112, 80), + (165, 122, 80), (198, 146, 89), (209, 178, 128), (220, 211, 168), + (229, 216, 187), (239, 222, 206), (237, 238, 199), (235, 255, 192), + (231, 205, 144), (220, 182, 130), (209, 160, 117), (204, 171, 142), + (200, 183, 167), (203, 180, 156), (206, 177, 145), (210, 176, 139), + (210, 173, 131), (218, 203, 148), (236, 228, 158), (254, 254, 168), + (254, 254, 174), (255, 255, 180), (246, 255, 196), (252, 235, 241), + (222, 196, 183), (202, 165, 147), (182, 134, 111), (180, 131, 100), + (178, 129, 89), (176, 127, 89), (175, 125, 90), (154, 119, 77), + (155, 109, 75), (134, 72, 35), (112, 56, 27), (91, 40, 19), + (85, 37, 11), (79, 34, 3), (78, 33, 2), (78, 33, 2), + (78, 34, 0), (78, 34, 0), (79, 35, 0), (79, 35, 0), + (79, 35, 0), (78, 33, 2), (79, 34, 3), (85, 33, 0), + (84, 35, 3), (93, 42, 21), (106, 54, 33), (119, 67, 46), + (125, 77, 48), (132, 88, 51), (156, 104, 64), (167, 114, 64), + (180, 121, 81), (191, 129, 83), (203, 137, 85), (198, 143, 78), + (193, 150, 72), (176, 125, 68), (189, 148, 8), (187, 130, 15), + (150, 97, 3), (105, 53, 39), (95, 45, 37), (86, 38, 36), + (67, 38, 32), (60, 36, 26), (54, 35, 20), (52, 38, 29), + (87, 58, 52), (108, 86, 72), (129, 114, 93), (144, 122, 103), + (160, 131, 113), (188, 145, 128), (182, 149, 140), (184, 156, 142), + (179, 158, 131), (182, 165, 135), (184, 158, 146), (186, 151, 158), + (175, 145, 157), (154, 135, 131), (158, 117, 121), (141, 122, 108), + (66, 80, 63), (54, 56, 46), (42, 32, 30), (38, 32, 29), + (34, 33, 28), (53, 31, 18), (70, 27, 11), (77, 32, 3), + (77, 32, 3), (78, 33, 2), (78, 33, 2), (78, 33, 2), + (77, 34, 2), (75, 34, 2), (53, 25, 11), (49, 12, 0), + (9, 0, 0), (4, 0, 3), (0, 1, 7), (0, 5, 11), + (23, 18, 15), (55, 37, 17), (82, 52, 26), (115, 71, 32), + (128, 95, 44), (129, 83, 67), (121, 82, 59), (113, 82, 51), + (93, 58, 38), (71, 38, 23), (41, 24, 17), (33, 19, 19), + (31, 30, 25), (46, 35, 30), (61, 40, 35), (80, 56, 32), + (109, 69, 43), (112, 77, 49), (124, 71, 40), (105, 63, 39), + (88, 58, 30), (79, 57, 34), (71, 61, 52), (85, 66, 52), + (124, 85, 68), (149, 111, 88), (173, 133, 107), (182, 153, 119), + (164, 153, 135), (171, 149, 132), (179, 146, 129), (173, 134, 105), + (169, 116, 84), (153, 109, 84), (147, 113, 86), (152, 112, 86), + (154, 119, 81), (147, 113, 76), (139, 98, 66), (103, 92, 60), + (94, 62, 37), (93, 52, 30), (80, 42, 23), (62, 34, 13), + (54, 27, 8), (42, 20, 9), (37, 11, 0), (26, 0, 0), + (7, 0, 0), (1, 1, 1), (0, 0, 0), (0, 0, 0), + (1, 1, 1), (0, 2, 2), (0, 4, 8), (2, 7, 10), + (27, 12, 7), (40, 7, 0), (61, 9, 13), (76, 13, 4), + (71, 32, 1), (75, 34, 2), (77, 32, 1), (77, 32, 1), + (78, 33, 2), (79, 32, 2), (79, 32, 2), (78, 33, 2), + (78, 33, 2), (78, 33, 2), (78, 33, 2), (78, 32, 6), + (83, 46, 20), (82, 44, 23), (78, 40, 19), (70, 35, 16), + (58, 29, 21), (52, 30, 17), (40, 21, 14), (32, 17, 12), + (33, 16, 8), (22, 11, 0), (4, 4, 4), (1, 1, 1), + (1, 1, 1), (4, 4, 2), (22, 19, 2), (40, 22, 10), + (56, 29, 18), (71, 35, 19), (76, 41, 22), (75, 37, 26), + (75, 37, 26), (78, 42, 28), (79, 44, 24), (86, 44, 20), + (95, 53, 29), (114, 75, 46), (145, 108, 100), (132, 90, 65) + ), + +// 236 Apophysis-040427-6EyeUniv +((236, 112, 100), (209, 107, 103), (206, 102, 97), (204, 97, 91), + (203, 90, 83), (202, 83, 75), (201, 83, 74), (201, 84, 74), + (197, 79, 75), (197, 79, 73), (198, 79, 71), (194, 76, 69), + (191, 74, 67), (193, 75, 68), (195, 76, 70), (197, 77, 69), + (199, 78, 69), (238, 94, 60), (234, 91, 57), (231, 88, 54), + (211, 76, 53), (191, 65, 53), (187, 60, 50), (183, 56, 47), + (181, 57, 47), (184, 60, 52), (187, 64, 57), (190, 70, 62), + (194, 77, 68), (194, 78, 70), (194, 79, 72), (192, 73, 65), + (190, 71, 63), (187, 66, 58), (186, 64, 56), (186, 63, 55), + (186, 64, 56), (187, 66, 58), (188, 69, 62), (190, 73, 66), + (198, 83, 76), (203, 88, 77), (209, 93, 78), (205, 87, 74), + (202, 81, 70), (200, 79, 69), (199, 78, 69), (191, 70, 61), + (189, 68, 59), (187, 64, 56), (189, 71, 64), (191, 78, 72), + (197, 89, 82), (204, 101, 92), (208, 107, 100), (213, 114, 109), + (221, 133, 119), (218, 129, 122), (216, 126, 125), (194, 114, 127), + (173, 103, 129), (179, 98, 118), (186, 94, 107), (187, 101, 86), + (196, 84, 80), (134, 154, 152), (117, 139, 137), (100, 125, 122), + (109, 104, 120), (118, 84, 119), (36, 53, 61), (9, 26, 69), + (43, 2, 18), (111, 22, 25), (180, 43, 33), (187, 59, 50), + (194, 75, 67), (199, 85, 77), (204, 95, 88), (215, 114, 104), + (222, 136, 123), (219, 160, 118), (177, 167, 96), (136, 174, 75), + (131, 170, 72), (126, 166, 69), (121, 139, 53), (84, 80, 53), + (15, 31, 18), (27, 15, 22), (39, 0, 27), (39, 0, 27), + (40, 0, 27), (40, 1, 22), (38, 3, 9), (47, 5, 7), + (81, 50, 19), (183, 56, 47), (190, 70, 64), (197, 85, 81), + (199, 92, 88), (202, 100, 96), (209, 112, 103), (210, 125, 122), + (226, 169, 139), (232, 188, 162), (238, 207, 186), (239, 211, 189), + (240, 215, 193), (227, 240, 187), (216, 242, 181), (213, 226, 173), + (230, 178, 156), (227, 154, 147), (223, 150, 142), (220, 147, 138), + (223, 148, 129), (214, 183, 136), (194, 178, 119), (169, 166, 97), + (209, 111, 102), (155, 93, 79), (102, 75, 56), (72, 39, 44), + (43, 4, 33), (36, 4, 5), (15, 5, 6), (15, 0, 9), + (37, 2, 6), (76, 33, 14), (127, 37, 23), (179, 42, 32), + (182, 48, 37), (180, 52, 43), (184, 60, 52), (190, 72, 62), + (204, 100, 91), (212, 116, 105), (221, 133, 119), (225, 143, 120), + (229, 154, 122), (230, 178, 139), (236, 210, 177), (243, 229, 190), + (238, 207, 187), (228, 168, 158), (225, 156, 149), (222, 144, 140), + (215, 129, 128), (209, 110, 104), (203, 98, 92), (198, 86, 82), + (185, 62, 54), (183, 58, 50), (182, 55, 46), (187, 53, 42), + (185, 51, 40), (167, 77, 24), (134, 88, 29), (108, 99, 30), + (125, 119, 45), (196, 84, 80), (200, 89, 85), (204, 95, 90), + (214, 108, 92), (217, 115, 100), (214, 117, 108), (210, 115, 113), + (214, 126, 124), (214, 123, 122), (214, 120, 120), (212, 119, 112), + (210, 106, 103), (207, 98, 91), (200, 91, 84), (200, 89, 82), + (199, 87, 83), (196, 85, 78), (193, 80, 74), (148, 120, 55), + (102, 105, 78), (86, 52, 77), (76, 32, 65), (83, 49, 22), + (98, 89, 32), (102, 92, 33), (106, 96, 34), (125, 132, 55), + (147, 151, 75), (152, 159, 82), (145, 179, 85), (202, 190, 132), + (211, 229, 169), (205, 230, 164), (186, 213, 142), (171, 215, 126), + (164, 211, 119), (201, 184, 132), (203, 187, 136), (213, 203, 154), + (215, 226, 170), (230, 229, 183), (234, 197, 178), (229, 184, 145), + (219, 186, 141), (220, 182, 137), (224, 165, 125), (220, 137, 131), + (216, 128, 124), (213, 114, 109), (205, 107, 106), (211, 113, 110), + (216, 128, 116), (218, 136, 124), (219, 135, 125), (218, 131, 121), + (216, 119, 110), (207, 102, 98), (200, 91, 84), (198, 79, 71), + (194, 70, 60), (187, 64, 56), (185, 62, 54), (190, 59, 49), + (190, 57, 48), (192, 61, 51), (193, 66, 57), (194, 77, 70), + (200, 86, 76), (200, 87, 79), (201, 92, 85), (204, 93, 86), + (204, 93, 84), (204, 96, 84), (206, 95, 84), (209, 99, 86), + (216, 116, 93), (238, 129, 46), (235, 124, 43), (214, 95, 37), + (203, 94, 29), (190, 86, 31), (180, 71, 50), (184, 63, 54), + (189, 61, 50), (192, 64, 53), (199, 76, 61), (230, 92, 55), + (238, 110, 47), (246, 114, 49), (250, 105, 61), (239, 95, 61), + (225, 90, 61), (214, 86, 73), (210, 100, 87), (224, 112, 101) + ), + +// 237 Apophysis-040427-6FaeriRob +((156, 68, 4), (118, 44, 0), (119, 47, 1), (121, 51, 2), + (111, 74, 52), (102, 97, 103), (90, 85, 117), (79, 74, 132), + (71, 77, 161), (71, 76, 180), (72, 76, 199), (86, 101, 219), + (100, 127, 240), (104, 113, 244), (109, 99, 248), (86, 81, 229), + (64, 64, 210), (102, 88, 165), (110, 106, 173), (118, 124, 182), + (128, 137, 187), (138, 150, 192), (143, 160, 193), (149, 171, 194), + (179, 207, 132), (192, 229, 117), (206, 252, 102), (210, 252, 96), + (215, 253, 90), (223, 254, 81), (231, 255, 73), (242, 255, 80), + (255, 250, 79), (250, 212, 65), (237, 181, 53), (224, 150, 41), + (208, 123, 24), (192, 97, 7), (183, 88, 5), (175, 79, 3), + (173, 90, 0), (175, 125, 23), (178, 161, 47), (215, 177, 53), + (253, 193, 60), (253, 191, 59), (254, 190, 58), (249, 166, 38), + (234, 149, 42), (178, 98, 9), (168, 78, 11), (159, 58, 14), + (147, 57, 7), (135, 56, 0), (136, 56, 6), (138, 57, 12), + (150, 68, 12), (162, 78, 12), (174, 88, 13), (186, 101, 11), + (198, 115, 9), (203, 132, 14), (209, 149, 19), (254, 175, 48), + (247, 185, 50), (191, 150, 70), (175, 135, 97), (160, 121, 124), + (150, 126, 133), (141, 131, 142), (123, 135, 157), (111, 108, 75), + (112, 60, 0), (112, 50, 0), (113, 41, 1), (106, 38, 0), + (100, 35, 0), (98, 34, 0), (97, 34, 1), (103, 38, 0), + (105, 40, 0), (113, 46, 1), (108, 42, 0), (104, 39, 0), + (100, 37, 0), (97, 35, 0), (90, 29, 0), (96, 22, 0), + (96, 33, 0), (96, 33, 0), (97, 34, 1), (97, 36, 0), + (97, 38, 0), (99, 37, 0), (107, 42, 0), (107, 43, 0), + (100, 37, 0), (20, 9, 17), (12, 8, 37), (5, 7, 58), + (9, 8, 60), (13, 10, 63), (19, 8, 77), (30, 7, 61), + (42, 25, 61), (40, 29, 77), (38, 34, 93), (35, 33, 104), + (32, 33, 116), (43, 48, 140), (32, 36, 123), (53, 40, 93), + (75, 42, 69), (114, 49, 11), (123, 49, 14), (132, 49, 17), + (126, 53, 2), (125, 54, 2), (121, 49, 0), (100, 37, 6), + (44, 21, 67), (43, 24, 81), (42, 27, 96), (47, 29, 108), + (52, 32, 121), (43, 30, 122), (32, 31, 124), (50, 37, 145), + (69, 49, 162), (43, 39, 150), (42, 40, 159), (42, 41, 168), + (49, 57, 181), (36, 50, 208), (58, 52, 224), (93, 97, 207), + (149, 149, 211), (147, 162, 184), (145, 176, 158), (140, 163, 162), + (135, 151, 166), (141, 167, 166), (160, 175, 170), (154, 159, 179), + (140, 149, 188), (111, 120, 199), (102, 98, 194), (94, 77, 189), + (78, 79, 161), (96, 107, 137), (147, 110, 127), (168, 116, 69), + (206, 142, 55), (223, 142, 56), (241, 142, 57), (254, 179, 52), + (255, 194, 56), (255, 193, 60), (255, 193, 69), (242, 179, 84), + (192, 162, 110), (176, 139, 112), (186, 127, 86), (196, 115, 60), + (195, 117, 32), (202, 108, 12), (207, 110, 13), (210, 114, 14), + (227, 133, 17), (230, 136, 21), (234, 140, 26), (225, 127, 20), + (213, 116, 22), (210, 126, 30), (185, 135, 64), (192, 182, 113), + (197, 200, 93), (195, 233, 120), (192, 254, 111), (193, 248, 95), + (222, 227, 72), (203, 188, 63), (171, 146, 54), (155, 131, 59), + (177, 169, 107), (155, 160, 125), (134, 151, 143), (139, 163, 149), + (164, 154, 165), (175, 153, 139), (196, 186, 125), (207, 250, 100), + (244, 250, 102), (241, 250, 79), (252, 241, 87), (255, 212, 73), + (255, 211, 63), (255, 188, 57), (255, 159, 34), (255, 168, 27), + (248, 213, 61), (246, 225, 48), (244, 224, 51), (218, 232, 95), + (173, 205, 122), (136, 154, 178), (101, 98, 203), (80, 73, 166), + (52, 49, 164), (57, 57, 143), (64, 44, 115), (112, 85, 100), + (161, 103, 57), (196, 104, 21), (195, 100, 18), (203, 105, 18), + (204, 94, 33), (200, 103, 60), (144, 108, 96), (106, 87, 142), + (106, 89, 143), (115, 116, 102), (139, 103, 41), (167, 74, 30), + (169, 75, 5), (161, 66, 0), (170, 77, 0), (181, 79, 5), + (188, 92, 8), (198, 103, 11), (206, 114, 13), (213, 126, 11), + (236, 142, 26), (239, 145, 31), (243, 153, 31), (250, 154, 33), + (248, 152, 31), (242, 149, 28), (234, 140, 24), (212, 116, 16), + (189, 86, 7), (174, 79, 0), (163, 72, 1), (155, 70, 6), + (157, 72, 7), (166, 89, 21), (166, 98, 13), (162, 84, 10), + (153, 78, 0), (145, 61, 1), (144, 62, 4), (119, 70, 0), + (128, 53, 0), (145, 55, 0), (150, 60, 0), (164, 73, 2) + ), + +// 238 Apophysis-040427-6FaeriRob2 +((174, 71, 2), (128, 50, 2), (118, 46, 1), (109, 42, 0), + (104, 38, 0), (100, 34, 0), (96, 33, 0), (92, 33, 1), + (91, 32, 0), (87, 30, 0), (83, 28, 0), (80, 22, 5), + (77, 16, 11), (40, 16, 47), (3, 16, 84), (7, 14, 97), + (12, 12, 110), (25, 1, 51), (51, 12, 25), (78, 24, 0), + (79, 24, 0), (81, 25, 0), (82, 26, 0), (83, 27, 0), + (76, 25, 0), (77, 24, 0), (79, 23, 0), (82, 24, 0), + (86, 26, 0), (89, 29, 0), (92, 32, 0), (92, 33, 1), + (89, 30, 0), (74, 44, 52), (50, 35, 86), (26, 27, 120), + (44, 15, 76), (62, 3, 33), (68, 15, 22), (75, 28, 12), + (35, 31, 92), (35, 31, 86), (35, 31, 81), (59, 30, 43), + (83, 29, 5), (88, 32, 4), (94, 35, 3), (102, 31, 9), + (105, 31, 0), (128, 50, 1), (141, 56, 0), (155, 63, 0), + (172, 75, 5), (190, 87, 10), (190, 89, 12), (191, 91, 15), + (231, 125, 23), (240, 134, 23), (249, 143, 23), (252, 172, 39), + (255, 201, 56), (253, 212, 59), (252, 224, 62), (255, 206, 60), + (255, 184, 53), (224, 165, 63), (196, 142, 76), (168, 119, 89), + (151, 115, 105), (134, 111, 121), (84, 93, 132), (68, 70, 111), + (95, 51, 64), (127, 98, 71), (160, 145, 78), (184, 182, 83), + (208, 219, 89), (219, 230, 93), (230, 242, 98), (229, 255, 97), + (211, 251, 93), (246, 234, 52), (248, 229, 47), (250, 224, 43), + (248, 223, 46), (246, 223, 49), (226, 225, 83), (166, 215, 90), + (141, 158, 186), (118, 128, 209), (95, 99, 232), (77, 79, 228), + (60, 59, 225), (65, 69, 220), (97, 106, 235), (125, 119, 219), + (136, 147, 192), (185, 204, 148), (168, 194, 138), (151, 184, 129), + (147, 177, 113), (144, 170, 97), (134, 129, 97), (150, 79, 27), + (128, 52, 3), (140, 54, 3), (152, 57, 3), (158, 64, 1), + (165, 71, 0), (175, 78, 7), (174, 77, 9), (166, 72, 2), + (155, 60, 6), (132, 52, 1), (134, 54, 2), (137, 56, 3), + (158, 66, 1), (173, 66, 0), (184, 81, 6), (186, 93, 0), + (180, 89, 10), (169, 106, 8), (159, 124, 6), (170, 126, 14), + (181, 128, 22), (185, 153, 66), (145, 143, 128), (142, 147, 187), + (141, 127, 214), (65, 78, 208), (60, 66, 199), (55, 54, 190), + (83, 76, 169), (63, 49, 124), (54, 40, 127), (40, 38, 148), + (78, 72, 255), (92, 87, 246), (106, 102, 238), (92, 100, 233), + (79, 98, 229), (82, 85, 180), (82, 91, 106), (102, 90, 42), + (130, 65, 0), (162, 71, 1), (160, 72, 9), (159, 74, 17), + (164, 89, 31), (158, 98, 64), (121, 127, 65), (103, 118, 111), + (74, 87, 155), (85, 88, 141), (97, 89, 128), (131, 117, 117), + (134, 146, 122), (151, 194, 104), (191, 209, 89), (212, 229, 71), + (247, 224, 66), (244, 243, 65), (242, 244, 58), (240, 246, 52), + (240, 253, 60), (211, 255, 80), (189, 255, 78), (218, 248, 74), + (246, 195, 54), (238, 181, 51), (230, 168, 49), (234, 148, 49), + (246, 167, 64), (222, 167, 87), (219, 174, 141), (168, 197, 117), + (183, 230, 114), (168, 245, 163), (184, 236, 128), (208, 247, 104), + (249, 226, 110), (252, 218, 67), (247, 189, 55), (255, 160, 34), + (244, 141, 23), (247, 138, 25), (250, 135, 28), (236, 131, 24), + (226, 109, 16), (210, 97, 3), (198, 98, 12), (192, 94, 19), + (203, 106, 12), (198, 109, 19), (193, 114, 22), (182, 121, 40), + (198, 129, 62), (194, 157, 86), (167, 176, 113), (136, 159, 143), + (164, 145, 167), (158, 94, 131), (139, 93, 78), (158, 85, 42), + (148, 84, 22), (129, 55, 8), (123, 36, 6), (122, 31, 0), + (112, 44, 0), (111, 48, 17), (119, 81, 36), (100, 82, 58), + (74, 70, 129), (87, 93, 169), (115, 131, 182), (122, 152, 163), + (133, 149, 164), (157, 122, 126), (139, 108, 103), (119, 72, 42), + (98, 57, 13), (64, 24, 0), (47, 11, 15), (32, 0, 1), + (27, 5, 8), (23, 3, 15), (15, 2, 22), (8, 3, 44), + (11, 16, 74), (37, 0, 51), (73, 19, 7), (97, 37, 9), + (119, 46, 11), (141, 65, 7), (162, 94, 21), (181, 106, 38), + (184, 109, 44), (196, 98, 27), (177, 88, 20), (170, 78, 11), + (152, 69, 3), (130, 53, 1), (110, 46, 0), (103, 41, 4), + (99, 42, 0), (101, 36, 4), (115, 44, 12), (108, 60, 37), + (45, 57, 97), (35, 42, 149), (39, 38, 176), (48, 46, 205), + (58, 72, 203), (104, 108, 208), (175, 175, 147), (229, 244, 99) + ), + +// 239 Apophysis-040427-6FaeriRobDet +((4, 7, 84), (0, 0, 93), (19, 12, 150), (38, 24, 208), + (49, 40, 222), (60, 56, 237), (73, 71, 246), (86, 86, 255), + (21, 47, 206), (11, 23, 142), (1, 0, 78), (0, 0, 70), + (0, 1, 62), (3, 6, 90), (7, 11, 119), (19, 26, 126), + (32, 41, 134), (31, 29, 162), (58, 21, 94), (85, 13, 27), + (91, 21, 15), (97, 30, 3), (97, 27, 1), (97, 25, 0), + (97, 25, 1), (106, 31, 2), (116, 37, 4), (143, 53, 2), + (170, 69, 1), (182, 80, 0), (194, 91, 0), (206, 99, 3), + (255, 123, 27), (255, 174, 43), (248, 167, 42), (241, 160, 42), + (217, 125, 22), (194, 90, 3), (177, 75, 1), (160, 61, 0), + (113, 37, 1), (112, 35, 0), (112, 33, 0), (112, 51, 0), + (112, 70, 0), (123, 101, 40), (134, 132, 81), (164, 162, 150), + (154, 164, 163), (79, 87, 186), (40, 45, 133), (2, 4, 81), + (12, 4, 56), (23, 5, 31), (31, 5, 18), (39, 5, 6), + (77, 9, 6), (78, 9, 3), (80, 10, 0), (81, 13, 0), + (82, 17, 0), (83, 16, 0), (84, 15, 0), (85, 16, 1), + (86, 17, 1), (85, 16, 0), (91, 20, 0), (97, 25, 0), + (106, 30, 0), (115, 35, 0), (139, 48, 0), (172, 69, 2), + (203, 106, 3), (216, 120, 1), (230, 134, 0), (241, 148, 2), + (252, 162, 4), (253, 168, 14), (255, 175, 24), (245, 168, 26), + (216, 143, 30), (205, 98, 0), (204, 96, 0), (204, 95, 0), + (200, 91, 0), (196, 88, 0), (172, 68, 0), (144, 46, 0), + (107, 30, 2), (96, 23, 1), (86, 17, 1), (91, 11, 0), + (96, 5, 0), (103, 26, 0), (115, 35, 0), (135, 44, 0), + (171, 68, 0), (216, 110, 0), (217, 121, 2), (218, 133, 4), + (207, 136, 18), (197, 140, 33), (187, 121, 25), (175, 89, 4), + (119, 42, 0), (104, 30, 3), (90, 18, 6), (85, 15, 3), + (81, 13, 0), (79, 11, 0), (77, 9, 0), (70, 9, 0), + (41, 2, 3), (52, 0, 5), (64, 4, 3), (77, 8, 1), + (84, 15, 0), (95, 23, 0), (108, 37, 0), (117, 39, 1), + (156, 62, 0), (167, 67, 0), (179, 72, 0), (179, 73, 0), + (180, 74, 0), (178, 75, 0), (180, 77, 2), (182, 76, 2), + (194, 97, 3), (233, 155, 5), (239, 170, 12), (246, 185, 19), + (253, 173, 24), (227, 164, 51), (177, 144, 31), (138, 141, 62), + (149, 176, 157), (142, 167, 164), (136, 158, 171), (125, 142, 179), + (115, 127, 187), (86, 91, 209), (67, 68, 161), (93, 72, 53), + (90, 40, 5), (86, 18, 0), (89, 21, 2), (93, 25, 4), + (110, 31, 0), (122, 40, 0), (135, 53, 0), (147, 67, 0), + (201, 97, 0), (214, 110, 0), (227, 124, 0), (235, 153, 27), + (254, 181, 42), (255, 201, 48), (255, 224, 68), (251, 231, 58), + (244, 236, 63), (246, 253, 61), (249, 254, 62), (253, 255, 63), + (254, 244, 61), (249, 249, 57), (228, 255, 56), (218, 255, 90), + (184, 254, 129), (193, 234, 108), (202, 214, 88), (231, 211, 52), + (246, 194, 46), (243, 192, 41), (255, 174, 38), (255, 172, 34), + (255, 158, 21), (255, 159, 18), (254, 171, 33), (249, 188, 38), + (246, 208, 49), (237, 202, 72), (201, 199, 124), (172, 188, 143), + (149, 166, 192), (130, 146, 223), (112, 127, 255), (104, 113, 244), + (101, 109, 244), (104, 117, 213), (106, 88, 126), (128, 59, 17), + (130, 38, 1), (132, 33, 2), (120, 30, 3), (116, 36, 1), + (134, 43, 0), (131, 51, 0), (147, 65, 0), (164, 76, 0), + (195, 92, 0), (209, 97, 0), (219, 113, 3), (234, 142, 19), + (250, 148, 14), (255, 142, 4), (247, 139, 13), (239, 135, 10), + (228, 133, 3), (202, 134, 37), (198, 122, 46), (164, 128, 92), + (157, 140, 148), (107, 117, 166), (47, 42, 145), (89, 39, 42), + (78, 31, 23), (105, 34, 2), (124, 47, 1), (139, 63, 14), + (104, 110, 98), (149, 195, 120), (167, 216, 125), (170, 226, 101), + (183, 247, 91), (199, 220, 89), (195, 197, 124), (173, 197, 119), + (162, 181, 162), (140, 158, 162), (153, 113, 173), (122, 103, 228), + (92, 101, 255), (65, 68, 209), (53, 53, 141), (129, 73, 50), + (132, 51, 4), (127, 46, 0), (123, 41, 1), (129, 35, 0), + (136, 43, 0), (146, 44, 4), (155, 28, 0), (162, 56, 4), + (172, 67, 1), (173, 73, 0), (177, 70, 0), (180, 66, 0), + (163, 61, 0), (154, 54, 0), (154, 53, 1), (151, 57, 3), + (158, 92, 14), (178, 114, 27), (203, 255, 108), (189, 176, 80) + ), + +// 240 Apophysis-040427-6FlakWhorls +((114, 150, 80), (61, 59, 44), (34, 33, 22), (8, 8, 0), + (4, 4, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (11, 8, 1), + (23, 17, 3), (63, 45, 24), (104, 73, 45), (122, 89, 65), + (141, 106, 86), (183, 136, 80), (168, 151, 68), (153, 167, 56), + (134, 123, 57), (116, 80, 58), (111, 69, 61), (107, 58, 64), + (105, 52, 38), (107, 63, 44), (110, 74, 50), (129, 87, 42), + (149, 100, 34), (158, 113, 31), (168, 126, 28), (202, 138, 38), + (244, 128, 45), (255, 205, 93), (255, 220, 144), (255, 235, 195), + (232, 214, 150), (209, 193, 105), (192, 193, 77), (176, 194, 50), + (109, 171, 44), (70, 144, 38), (32, 117, 32), (33, 108, 21), + (34, 100, 10), (35, 101, 20), (36, 102, 30), (46, 79, 52), + (52, 61, 66), (67, 68, 73), (77, 66, 92), (87, 65, 112), + (104, 68, 97), (122, 72, 83), (118, 74, 81), (115, 76, 79), + (97, 91, 75), (99, 78, 74), (102, 65, 73), (92, 72, 69), + (83, 80, 65), (86, 73, 67), (89, 67, 69), (74, 58, 61), + (87, 73, 60), (81, 77, 52), (83, 76, 48), (86, 75, 45), + (88, 73, 41), (90, 71, 38), (85, 67, 43), (82, 66, 43), + (78, 62, 36), (72, 69, 40), (66, 77, 45), (60, 79, 47), + (54, 81, 50), (61, 76, 50), (69, 71, 50), (71, 58, 49), + (66, 58, 47), (61, 59, 0), (52, 65, 11), (44, 72, 23), + (44, 70, 40), (45, 68, 58), (50, 75, 54), (56, 89, 42), + (109, 57, 36), (127, 41, 28), (145, 26, 20), (161, 26, 20), + (178, 26, 21), (173, 72, 42), (172, 95, 51), (158, 104, 78), + (147, 97, 98), (163, 130, 139), (158, 127, 133), (154, 125, 127), + (136, 108, 121), (119, 91, 116), (88, 54, 81), (54, 31, 41), + (2, 0, 5), (1, 0, 2), (0, 0, 0), (2, 2, 0), + (4, 5, 0), (17, 15, 2), (43, 57, 42), (63, 97, 62), + (83, 120, 66), (138, 120, 98), (136, 114, 104), (134, 108, 111), + (138, 108, 108), (142, 108, 99), (137, 128, 95), (133, 144, 84), + (130, 158, 39), (159, 169, 44), (189, 180, 49), (188, 181, 52), + (188, 183, 55), (231, 187, 92), (249, 209, 75), (199, 192, 52), + (184, 194, 43), (124, 143, 54), (118, 140, 68), (113, 138, 83), + (111, 117, 73), (124, 92, 81), (143, 94, 90), (174, 95, 90), + (228, 149, 80), (240, 178, 76), (253, 207, 72), (250, 209, 76), + (248, 211, 81), (233, 202, 158), (228, 193, 135), (194, 155, 100), + (146, 132, 83), (94, 101, 49), (91, 95, 47), (89, 90, 46), + (39, 87, 37), (42, 102, 28), (41, 134, 17), (70, 143, 12), + (54, 106, 23), (68, 100, 32), (82, 95, 42), (79, 131, 31), + (109, 134, 50), (114, 127, 48), (124, 106, 34), (148, 126, 43), + (178, 145, 40), (159, 131, 24), (157, 129, 39), (156, 128, 55), + (141, 111, 73), (109, 99, 74), (89, 94, 64), (89, 83, 59), + (108, 93, 38), (108, 108, 39), (108, 123, 40), (114, 120, 48), + (113, 81, 68), (109, 73, 75), (102, 68, 84), (97, 68, 90), + (119, 77, 99), (135, 84, 99), (170, 108, 85), (183, 119, 94), + (189, 135, 99), (185, 135, 112), (195, 142, 108), (216, 173, 104), + (233, 157, 95), (225, 147, 87), (217, 138, 79), (235, 121, 48), + (219, 151, 50), (194, 135, 33), (188, 107, 44), (186, 83, 24), + (201, 47, 37), (194, 42, 41), (179, 46, 37), (153, 55, 46), + (152, 73, 58), (119, 67, 71), (98, 62, 74), (88, 63, 69), + (88, 58, 68), (85, 55, 53), (94, 45, 41), (90, 37, 33), + (88, 43, 20), (93, 43, 34), (87, 60, 53), (94, 61, 78), + (88, 70, 86), (84, 63, 82), (70, 54, 81), (69, 51, 77), + (65, 60, 66), (57, 53, 42), (22, 22, 22), (2, 4, 3), + (0, 0, 0), (3, 0, 0), (13, 7, 7), (62, 26, 38), + (80, 14, 41), (124, 42, 44), (146, 49, 66), (157, 89, 40), + (185, 104, 49), (161, 102, 44), (127, 82, 53), (88, 74, 61), + (73, 78, 58), (61, 79, 53), (62, 81, 51), (83, 90, 48), + (115, 91, 43), (139, 82, 29), (180, 86, 35), (206, 107, 26), + (238, 95, 25), (228, 98, 38), (207, 112, 32), (208, 116, 39), + (219, 137, 35), (209, 123, 62), (180, 126, 66), (115, 89, 64), + (92, 74, 50), (68, 45, 31), (58, 22, 6), (15, 12, 5), + (1, 0, 2), (5, 6, 10), (30, 24, 34), (46, 49, 104), + (82, 69, 115), (83, 76, 120), (104, 90, 141), (144, 192, 46) + ), + +// 241 Apophysis-040427-11FlarCelebrat +((218, 193, 173), (217, 187, 163), (212, 177, 148), (208, 168, 133), + (124, 193, 73), (41, 218, 14), (40, 227, 8), (39, 237, 2), + (55, 197, 49), (131, 168, 73), (207, 140, 98), (135, 197, 50), + (64, 255, 2), (58, 255, 2), (52, 255, 3), (51, 255, 1), + (50, 255, 0), (48, 243, 1), (123, 184, 38), (199, 125, 76), + (197, 103, 51), (196, 81, 26), (221, 73, 13), (247, 65, 0), + (255, 79, 1), (255, 87, 1), (255, 95, 1), (255, 112, 21), + (255, 129, 42), (228, 128, 61), (202, 128, 81), (203, 129, 84), + (201, 128, 83), (61, 255, 0), (31, 234, 24), (1, 213, 49), + (38, 144, 100), (76, 75, 151), (79, 51, 194), (82, 28, 238), + (98, 22, 255), (90, 24, 250), (83, 26, 245), (87, 62, 217), + (91, 98, 189), (151, 132, 163), (211, 166, 137), (214, 187, 160), + (218, 191, 170), (219, 208, 190), (218, 202, 182), (217, 196, 175), + (216, 189, 165), (216, 182, 155), (215, 177, 149), (214, 173, 143), + (208, 146, 105), (205, 137, 93), (202, 128, 81), (198, 103, 52), + (195, 78, 24), (193, 72, 17), (192, 67, 11), (241, 38, 0), + (246, 13, 0), (219, 0, 95), (190, 0, 119), (162, 1, 143), + (130, 1, 137), (98, 1, 132), (159, 1, 140), (174, 18, 127), + (211, 144, 102), (211, 153, 116), (212, 163, 131), (214, 177, 151), + (217, 192, 172), (218, 197, 180), (219, 203, 188), (220, 219, 214), + (232, 255, 242), (221, 231, 223), (218, 212, 197), (215, 193, 172), + (212, 177, 148), (209, 161, 125), (203, 129, 84), (200, 108, 57), + (244, 65, 0), (243, 32, 0), (242, 0, 1), (241, 0, 0), + (241, 1, 0), (165, 1, 0), (162, 0, 0), (158, 0, 27), + (117, 1, 76), (114, 27, 253), (117, 13, 254), (121, 0, 255), + (123, 0, 254), (126, 0, 254), (174, 0, 185), (193, 0, 132), + (203, 129, 84), (207, 141, 100), (211, 153, 116), (214, 164, 132), + (217, 176, 148), (216, 188, 164), (218, 192, 169), (255, 218, 145), + (255, 185, 116), (212, 173, 140), (212, 170, 137), (213, 168, 135), + (210, 161, 129), (90, 111, 178), (93, 78, 203), (95, 68, 211), + (1, 146, 237), (0, 167, 201), (0, 188, 166), (0, 186, 139), + (1, 185, 113), (0, 193, 88), (0, 202, 58), (0, 200, 65), + (76, 167, 98), (215, 181, 153), (216, 186, 161), (217, 192, 170), + (218, 196, 175), (222, 199, 181), (255, 226, 156), (254, 216, 143), + (208, 146, 105), (209, 155, 117), (210, 164, 130), (212, 172, 141), + (215, 181, 153), (216, 194, 171), (233, 235, 195), (234, 255, 224), + (246, 253, 211), (255, 241, 172), (255, 238, 171), (255, 236, 170), + (254, 231, 163), (215, 182, 151), (239, 206, 163), (225, 134, 87), + (94, 64, 214), (100, 45, 233), (107, 26, 253), (117, 21, 255), + (99, 23, 255), (83, 26, 242), (116, 47, 112), (200, 114, 67), + (201, 109, 58), (141, 130, 48), (94, 170, 38), (47, 211, 28), + (34, 231, 1), (1, 255, 1), (0, 255, 7), (0, 226, 38), + (39, 173, 172), (128, 191, 183), (218, 209, 194), (223, 231, 207), + (233, 255, 234), (237, 243, 207), (219, 203, 187), (212, 177, 147), + (80, 159, 112), (1, 172, 200), (0, 159, 219), (31, 112, 255), + (39, 64, 255), (34, 46, 252), (33, 37, 250), (41, 6, 220), + (91, 1, 148), (125, 0, 154), (160, 0, 160), (175, 0, 136), + (167, 0, 134), (164, 56, 90), (200, 118, 68), (206, 135, 91), + (206, 135, 91), (209, 140, 98), (255, 151, 66), (255, 138, 50), + (254, 112, 14), (255, 108, 12), (254, 110, 14), (202, 108, 56), + (201, 109, 58), (199, 105, 54), (199, 105, 53), (197, 96, 42), + (197, 82, 27), (255, 78, 2), (254, 79, 0), (255, 88, 0), + (255, 98, 3), (254, 127, 34), (255, 164, 87), (213, 167, 133), + (212, 175, 146), (157, 168, 186), (92, 83, 202), (86, 26, 244), + (109, 26, 254), (118, 1, 255), (86, 17, 255), (37, 0, 219), + (39, 0, 213), (39, 0, 205), (57, 1, 188), (67, 0, 175), + (108, 2, 103), (149, 0, 56), (172, 31, 1), (186, 44, 0), + (196, 75, 22), (195, 84, 28), (198, 95, 37), (197, 94, 36), + (194, 79, 24), (195, 78, 24), (192, 71, 16), (191, 64, 9), + (188, 54, 1), (179, 35, 0), (180, 33, 0), (236, 0, 2), + (230, 0, 36), (225, 0, 63), (226, 0, 76), (200, 0, 122), + (167, 0, 157), (137, 0, 238), (132, 0, 247), (161, 0, 156), + (183, 0, 140), (203, 0, 120), (219, 0, 94), (203, 112, 65), + (208, 137, 95), (210, 160, 125), (214, 177, 148), (217, 190, 169) + ), + +// 242 Apophysis-040427-11SpacTrees +((83, 77, 3), (38, 15, 33), (56, 10, 57), (74, 6, 81), + (93, 6, 87), (112, 6, 94), (111, 3, 89), (110, 1, 84), + (135, 6, 70), (156, 23, 61), (178, 40, 53), (199, 67, 79), + (220, 94, 106), (221, 85, 94), (222, 77, 82), (219, 77, 62), + (216, 78, 42), (192, 59, 40), (194, 60, 41), (196, 61, 42), + (200, 61, 45), (204, 62, 48), (214, 59, 49), (224, 57, 51), + (241, 59, 46), (243, 62, 55), (246, 66, 65), (245, 68, 72), + (244, 70, 80), (241, 71, 81), (239, 73, 83), (235, 78, 87), + (233, 76, 85), (189, 58, 40), (144, 45, 23), (99, 32, 6), + (89, 31, 29), (79, 30, 52), (103, 20, 66), (127, 10, 80), + (140, 7, 62), (141, 6, 43), (143, 6, 24), (116, 17, 14), + (90, 28, 5), (87, 26, 4), (85, 24, 3), (36, 29, 13), + (23, 8, 11), (53, 2, 61), (92, 5, 63), (132, 9, 66), + (138, 7, 45), (145, 6, 25), (144, 6, 24), (143, 6, 24), + (90, 23, 4), (94, 25, 34), (99, 27, 64), (112, 34, 82), + (126, 42, 101), (147, 74, 95), (169, 106, 89), (199, 138, 31), + (218, 163, 46), (164, 255, 22), (168, 249, 23), (173, 243, 25), + (205, 237, 18), (238, 232, 12), (246, 197, 16), (236, 189, 15), + (216, 119, 16), (206, 103, 12), (197, 87, 8), (182, 93, 8), + (167, 100, 9), (164, 99, 8), (162, 98, 8), (160, 94, 8), + (148, 82, 8), (120, 85, 43), (104, 70, 30), (88, 56, 17), + (86, 51, 10), (85, 46, 3), (86, 35, 0), (107, 45, 6), + (157, 47, 22), (183, 51, 21), (210, 56, 20), (215, 54, 16), + (220, 52, 13), (211, 79, 4), (231, 91, 14), (208, 135, 24), + (197, 130, 17), (183, 120, 49), (163, 71, 48), (144, 22, 47), + (140, 19, 54), (136, 16, 61), (135, 48, 80), (121, 109, 121), + (124, 206, 106), (124, 193, 112), (125, 181, 118), (121, 169, 104), + (118, 157, 90), (177, 81, 95), (160, 52, 50), (156, 32, 22), + (138, 37, 9), (45, 29, 6), (33, 19, 8), (22, 10, 10), + (22, 8, 8), (17, 10, 18), (20, 25, 19), (7, 51, 28), + (5, 59, 35), (7, 60, 30), (9, 61, 25), (8, 67, 26), + (7, 73, 27), (7, 62, 23), (11, 52, 12), (7, 51, 2), + (7, 49, 1), (70, 57, 5), (94, 55, 7), (118, 54, 10), + (148, 39, 6), (158, 50, 47), (166, 76, 39), (163, 97, 10), + (196, 86, 7), (202, 73, 12), (208, 61, 17), (206, 63, 31), + (205, 66, 45), (215, 63, 52), (213, 65, 29), (196, 57, 14), + (200, 45, 27), (166, 54, 30), (155, 56, 17), (145, 58, 5), + (124, 54, 5), (117, 51, 3), (93, 54, 0), (71, 85, 0), + (21, 68, 14), (17, 56, 9), (13, 45, 4), (24, 37, 9), + (22, 11, 9), (19, 8, 12), (22, 6, 16), (20, 3, 13), + (16, 4, 16), (11, 5, 9), (14, 5, 11), (18, 5, 14), + (19, 6, 15), (22, 6, 17), (22, 8, 33), (40, 2, 53), + (93, 12, 91), (103, 9, 93), (113, 7, 95), (168, 7, 147), + (161, 45, 142), (161, 110, 167), (156, 115, 119), (159, 162, 119), + (183, 188, 122), (162, 139, 98), (161, 116, 93), (155, 111, 110), + (179, 100, 93), (190, 113, 85), (204, 126, 106), (202, 109, 140), + (255, 255, 251), (252, 249, 250), (249, 244, 250), (247, 87, 157), + (246, 84, 105), (243, 108, 76), (231, 106, 86), (213, 113, 90), + (170, 144, 95), (151, 175, 115), (129, 178, 157), (125, 181, 156), + (130, 193, 172), (121, 196, 155), (122, 201, 122), (123, 213, 90), + (147, 244, 27), (120, 230, 35), (191, 120, 12), (159, 93, 7), + (118, 50, 5), (113, 38, 9), (96, 31, 3), (103, 37, 5), + (128, 54, 15), (143, 68, 10), (150, 96, 6), (159, 107, 5), + (167, 102, 10), (187, 118, 14), (215, 148, 17), (226, 173, 17), + (238, 196, 22), (230, 153, 25), (219, 151, 18), (219, 106, 48), + (240, 84, 43), (231, 77, 41), (222, 61, 53), (212, 82, 46), + (223, 103, 53), (235, 111, 75), (218, 134, 46), (231, 143, 79), + (171, 131, 96), (130, 98, 113), (71, 52, 54), (31, 27, 16), + (31, 35, 8), (69, 77, 18), (132, 117, 22), (159, 145, 57), + (229, 150, 84), (235, 123, 85), (224, 83, 91), (197, 60, 76), + (175, 30, 45), (145, 21, 55), (137, 40, 59), (141, 87, 27), + (157, 150, 43), (131, 233, 35), (170, 246, 36), (148, 245, 26), + (123, 228, 50), (103, 212, 85), (82, 202, 104), (103, 208, 113), + (163, 206, 88), (152, 177, 86), (123, 168, 73), (126, 136, 40) + ), + +// 243 Apophysis-040427-11FloralQult +((88, 3, 68), (62, 75, 83), (59, 87, 68), (57, 100, 54), + (58, 114, 59), (60, 129, 64), (58, 120, 73), (57, 112, 83), + (116, 92, 116), (139, 105, 148), (162, 118, 181), (159, 147, 177), + (157, 176, 174), (162, 185, 170), (168, 194, 167), (147, 204, 154), + (127, 215, 141), (124, 201, 99), (133, 183, 124), (143, 166, 150), + (144, 147, 156), (145, 128, 162), (124, 133, 159), (103, 138, 157), + (58, 117, 113), (43, 83, 95), (29, 50, 77), (19, 36, 62), + (10, 22, 48), (5, 15, 48), (0, 8, 49), (1, 21, 71), + (21, 37, 71), (88, 84, 119), (129, 125, 143), (170, 166, 167), + (181, 172, 172), (193, 179, 178), (187, 169, 175), (181, 159, 172), + (151, 136, 131), (112, 83, 100), (73, 31, 69), (55, 22, 62), + (37, 14, 56), (20, 8, 54), (3, 3, 53), (4, 0, 51), + (2, 4, 53), (1, 5, 50), (0, 5, 46), (0, 6, 42), + (14, 3, 40), (28, 0, 38), (37, 0, 49), (46, 0, 61), + (23, 14, 77), (11, 10, 66), (0, 6, 56), (6, 16, 62), + (13, 26, 68), (16, 31, 73), (19, 36, 79), (77, 58, 88), + (94, 68, 93), (186, 147, 166), (200, 171, 165), (214, 195, 165), + (222, 207, 171), (231, 219, 177), (225, 235, 162), (188, 223, 159), + (180, 224, 173), (191, 229, 181), (202, 235, 190), (206, 217, 199), + (211, 200, 208), (209, 198, 193), (207, 196, 178), (211, 212, 180), + (207, 216, 151), (196, 184, 172), (169, 141, 165), (142, 98, 159), + (142, 71, 143), (143, 44, 127), (116, 6, 55), (116, 2, 51), + (112, 2, 51), (126, 33, 79), (141, 64, 108), (163, 86, 101), + (186, 108, 95), (177, 127, 104), (167, 137, 101), (166, 124, 108), + (125, 109, 75), (59, 48, 52), (46, 47, 35), (34, 47, 19), + (45, 64, 31), (56, 82, 43), (67, 138, 44), (103, 173, 57), + (126, 236, 87), (156, 227, 99), (186, 218, 111), (195, 219, 112), + (204, 220, 113), (197, 168, 126), (185, 147, 100), (170, 99, 77), + (140, 37, 66), (113, 2, 45), (109, 5, 42), (105, 8, 39), + (112, 26, 51), (128, 49, 45), (147, 67, 56), (177, 100, 72), + (183, 111, 87), (159, 76, 73), (135, 41, 59), (124, 22, 63), + (114, 4, 67), (106, 4, 43), (106, 12, 48), (81, 23, 45), + (82, 40, 52), (136, 173, 80), (143, 172, 86), (151, 172, 93), + (150, 137, 118), (168, 142, 117), (167, 128, 147), (153, 123, 157), + (134, 103, 101), (137, 61, 81), (141, 20, 61), (139, 26, 67), + (138, 33, 73), (181, 88, 80), (195, 114, 95), (225, 154, 126), + (245, 224, 131), (220, 212, 139), (215, 192, 140), (211, 172, 141), + (198, 157, 139), (164, 148, 112), (183, 131, 110), (200, 141, 147), + (205, 184, 155), (208, 185, 159), (211, 187, 163), (218, 193, 162), + (227, 198, 164), (230, 208, 167), (222, 203, 170), (214, 206, 170), + (204, 192, 176), (158, 169, 175), (146, 155, 168), (135, 142, 161), + (81, 159, 117), (82, 165, 111), (51, 109, 68), (59, 77, 53), + (47, 31, 18), (54, 16, 22), (62, 2, 27), (78, 0, 47), + (104, 1, 54), (96, 0, 46), (90, 0, 35), (54, 0, 18), + (44, 1, 18), (25, 2, 22), (7, 2, 43), (4, 8, 45), + (15, 15, 23), (31, 21, 30), (81, 19, 40), (77, 39, 26), + (103, 97, 61), (103, 139, 67), (104, 182, 73), (127, 220, 79), + (157, 246, 102), (193, 217, 103), (234, 231, 124), (220, 219, 136), + (202, 197, 129), (173, 161, 119), (137, 108, 90), (84, 84, 86), + (94, 109, 88), (128, 131, 150), (145, 132, 158), (165, 167, 164), + (155, 178, 168), (138, 200, 101), (129, 238, 97), (119, 240, 101), + (109, 222, 90), (86, 218, 96), (89, 201, 101), (79, 176, 73), + (93, 155, 92), (80, 73, 55), (65, 14, 71), (77, 5, 69), + (62, 16, 45), (50, 29, 48), (76, 59, 33), (64, 56, 45), + (45, 41, 56), (32, 47, 54), (11, 31, 38), (14, 37, 53), + (12, 32, 65), (29, 45, 68), (64, 53, 67), (87, 50, 102), + (123, 37, 82), (123, 14, 105), (82, 2, 91), (81, 5, 69), + (110, 0, 48), (120, 4, 49), (129, 33, 60), (152, 48, 71), + (175, 101, 102), (184, 154, 128), (198, 166, 128), (176, 173, 132), + (135, 172, 105), (112, 149, 106), (92, 77, 72), (89, 45, 72), + (99, 35, 59), (121, 42, 48), (142, 41, 59), (181, 95, 82), + (194, 121, 106), (196, 140, 149), (201, 164, 171), (193, 152, 166), + (173, 125, 177), (156, 130, 157), (120, 124, 151), (89, 154, 132), + (90, 207, 137), (106, 219, 139), (174, 225, 156), (196, 213, 168) + ), + +// 244 Apophysis-040427-20FlwrFrnsBFly +((238, 199, 80), (204, 175, 73), (201, 168, 80), (199, 161, 88), + (167, 149, 79), (136, 137, 71), (120, 120, 62), (104, 104, 54), + (105, 89, 29), (124, 96, 26), (144, 103, 23), (138, 101, 21), + (133, 100, 19), (115, 98, 30), (98, 97, 41), (72, 91, 40), + (47, 86, 39), (53, 64, 50), (36, 66, 53), (20, 68, 56), + (27, 85, 49), (35, 103, 42), (17, 132, 40), (0, 161, 38), + (26, 64, 13), (43, 55, 6), (61, 46, 0), (76, 50, 0), + (91, 55, 0), (95, 48, 7), (99, 42, 15), (121, 50, 6), + (122, 74, 10), (89, 67, 30), (81, 62, 17), (73, 57, 5), + (81, 34, 2), (90, 11, 0), (79, 9, 11), (69, 7, 22), + (111, 46, 68), (144, 40, 74), (177, 35, 81), (165, 30, 80), + (154, 25, 79), (135, 32, 64), (116, 40, 50), (115, 80, 22), + (133, 92, 26), (161, 120, 41), (172, 129, 48), (183, 138, 55), + (181, 136, 62), (179, 135, 70), (179, 132, 72), (179, 130, 74), + (167, 148, 80), (164, 144, 91), (162, 140, 103), (138, 156, 144), + (114, 172, 186), (86, 211, 214), (59, 250, 243), (93, 183, 194), + (106, 152, 168), (136, 192, 117), (166, 182, 103), (197, 172, 90), + (199, 159, 87), (201, 147, 85), (177, 139, 76), (156, 133, 81), + (101, 101, 101), (91, 106, 93), (82, 112, 86), (89, 123, 90), + (97, 135, 94), (123, 133, 72), (149, 132, 50), (150, 122, 25), + (154, 118, 0), (151, 117, 17), (160, 133, 26), (169, 149, 36), + (178, 159, 43), (188, 169, 51), (199, 174, 71), (208, 174, 85), + (251, 235, 100), (251, 241, 96), (252, 247, 93), (253, 245, 88), + (255, 243, 83), (255, 236, 70), (250, 234, 61), (255, 205, 69), + (222, 158, 48), (155, 62, 73), (130, 52, 70), (106, 42, 68), + (101, 34, 69), (97, 26, 70), (72, 18, 41), (77, 20, 29), + (75, 3, 43), (48, 13, 40), (22, 24, 37), (16, 24, 40), + (10, 25, 44), (16, 38, 17), (39, 46, 38), (53, 50, 31), + (61, 57, 32), (86, 50, 52), (83, 49, 58), (81, 48, 65), + (102, 33, 87), (86, 29, 124), (51, 32, 122), (20, 47, 102), + (33, 73, 98), (49, 88, 133), (66, 104, 169), (77, 127, 169), + (89, 150, 169), (140, 196, 219), (174, 217, 234), (197, 216, 150), + (223, 200, 107), (255, 255, 216), (255, 237, 235), (255, 220, 255), + (255, 136, 250), (189, 160, 152), (182, 114, 129), (172, 70, 120), + (120, 38, 74), (118, 24, 73), (116, 10, 72), (121, 11, 67), + (126, 12, 63), (126, 27, 73), (162, 60, 84), (158, 78, 105), + (125, 67, 92), (53, 97, 74), (52, 98, 78), (52, 99, 83), + (27, 92, 72), (3, 68, 48), (21, 46, 42), (44, 49, 29), + (99, 82, 12), (122, 97, 6), (146, 113, 0), (189, 133, 12), + (195, 159, 45), (196, 197, 57), (182, 223, 33), (190, 161, 43), + (183, 144, 23), (172, 122, 25), (164, 110, 25), (157, 99, 26), + (142, 85, 16), (135, 88, 0), (122, 86, 2), (133, 101, 0), + (146, 88, 4), (143, 84, 6), (140, 80, 8), (130, 100, 36), + (126, 115, 83), (131, 133, 111), (128, 177, 130), (125, 187, 138), + (132, 255, 180), (164, 214, 143), (185, 196, 136), (196, 199, 118), + (182, 189, 83), (167, 184, 72), (167, 124, 55), (147, 107, 46), + (69, 127, 77), (65, 127, 78), (62, 128, 80), (60, 126, 64), + (40, 75, 51), (34, 43, 16), (22, 21, 1), (18, 8, 0), + (0, 18, 0), (2, 3, 7), (3, 26, 44), (0, 15, 53), + (14, 10, 45), (18, 12, 40), (22, 27, 5), (47, 44, 13), + (70, 79, 14), (83, 103, 14), (89, 104, 49), (73, 93, 68), + (65, 88, 46), (79, 74, 32), (97, 75, 0), (120, 84, 0), + (134, 111, 0), (147, 138, 33), (157, 144, 50), (155, 159, 48), + (177, 154, 58), (183, 144, 41), (173, 127, 29), (162, 127, 33), + (164, 112, 36), (164, 119, 28), (151, 118, 23), (158, 115, 2), + (163, 116, 0), (178, 151, 12), (184, 176, 67), (178, 154, 126), + (127, 152, 252), (113, 128, 247), (44, 41, 158), (14, 45, 128), + (6, 31, 95), (21, 55, 65), (39, 38, 54), (31, 27, 44), + (51, 38, 56), (107, 37, 73), (165, 73, 114), (253, 18, 207), + (192, 51, 117), (182, 84, 83), (177, 110, 104), (113, 119, 85), + (83, 107, 83), (79, 103, 79), (71, 102, 68), (49, 72, 43), + (39, 65, 26), (38, 55, 23), (2, 35, 6), (12, 24, 0), + (40, 55, 0), (43, 55, 0), (57, 41, 18), (68, 28, 26), + (74, 31, 38), (72, 61, 65), (96, 103, 69), (105, 139, 104) + ), + +// 245 Apophysis-040427-24FracrameE +((255, 255, 253), (254, 255, 253), (253, 255, 253), (253, 255, 254), + (249, 255, 253), (245, 255, 252), (246, 252, 252), (248, 249, 253), + (213, 215, 212), (174, 175, 175), (135, 136, 138), (105, 104, 103), + (76, 73, 68), (59, 51, 43), (43, 29, 18), (38, 28, 19), + (34, 27, 21), (44, 22, 9), (34, 20, 11), (24, 19, 13), + (19, 15, 16), (14, 11, 20), (12, 9, 20), (10, 8, 21), + (6, 13, 21), (6, 14, 21), (6, 15, 22), (3, 12, 14), + (0, 9, 6), (2, 5, 4), (5, 1, 2), (13, 6, 0), + (25, 15, 5), (21, 21, 21), (20, 19, 26), (20, 18, 32), + (19, 29, 46), (18, 40, 61), (22, 43, 62), (27, 46, 63), + (39, 44, 50), (45, 49, 55), (51, 54, 61), (62, 65, 78), + (74, 77, 96), (82, 86, 98), (91, 96, 100), (116, 112, 111), + (128, 120, 109), (126, 128, 141), (145, 148, 156), (165, 169, 172), + (184, 193, 198), (204, 217, 225), (210, 225, 234), (216, 233, 243), + (235, 246, 252), (243, 248, 253), (252, 250, 255), (253, 252, 255), + (254, 255, 255), (254, 255, 255), (254, 255, 255), (255, 254, 255), + (255, 254, 251), (252, 250, 238), (214, 217, 212), (176, 184, 187), + (153, 159, 162), (130, 135, 138), (95, 103, 106), (62, 72, 73), + (36, 41, 47), (33, 33, 32), (30, 26, 17), (21, 16, 8), + (13, 6, 0), (12, 3, 0), (12, 1, 0), (7, 10, 15), + (4, 22, 26), (22, 41, 74), (35, 47, 70), (48, 54, 66), + (47, 55, 64), (47, 56, 63), (50, 60, 70), (55, 59, 68), + (65, 62, 55), (74, 73, 68), (84, 84, 82), (94, 94, 91), + (105, 104, 100), (140, 143, 158), (124, 124, 126), (219, 211, 198), + (182, 180, 181), (126, 134, 136), (104, 114, 118), (83, 94, 100), + (80, 87, 93), (77, 80, 87), (86, 81, 75), (82, 87, 91), + (79, 86, 96), (85, 93, 99), (91, 101, 103), (91, 103, 109), + (91, 105, 116), (104, 111, 129), (124, 131, 141), (144, 167, 183), + (156, 182, 209), (174, 179, 182), (168, 167, 164), (163, 156, 146), + (150, 129, 110), (125, 104, 85), (103, 78, 58), (75, 53, 39), + (62, 53, 36), (54, 48, 35), (47, 44, 35), (43, 42, 40), + (40, 41, 45), (40, 37, 54), (42, 46, 55), (43, 55, 69), + (43, 74, 95), (74, 79, 85), (81, 86, 94), (89, 93, 104), + (84, 98, 109), (97, 98, 103), (110, 106, 94), (114, 105, 96), + (123, 115, 104), (118, 120, 120), (113, 125, 137), (119, 128, 143), + (125, 132, 150), (177, 184, 192), (224, 219, 213), (244, 241, 222), + (255, 240, 228), (195, 183, 169), (177, 159, 152), (159, 135, 135), + (117, 108, 101), (86, 79, 73), (63, 58, 54), (60, 47, 31), + (57, 35, 22), (53, 33, 19), (50, 31, 16), (45, 36, 27), + (50, 45, 39), (48, 44, 45), (55, 60, 66), (60, 77, 97), + (61, 88, 115), (95, 119, 147), (107, 131, 162), (120, 143, 177), + (163, 168, 187), (172, 185, 191), (168, 178, 188), (158, 162, 171), + (136, 129, 121), (141, 133, 124), (146, 137, 128), (159, 167, 169), + (175, 179, 182), (203, 180, 166), (201, 177, 165), (183, 176, 157), + (168, 150, 130), (142, 128, 117), (139, 126, 107), (109, 102, 92), + (80, 77, 70), (60, 59, 54), (36, 41, 44), (16, 25, 34), + (9, 12, 29), (14, 16, 28), (20, 20, 28), (35, 40, 46), + (41, 43, 42), (55, 54, 52), (77, 70, 64), (100, 77, 59), + (102, 80, 57), (99, 85, 74), (107, 90, 74), (99, 87, 75), + (86, 83, 68), (84, 70, 59), (83, 67, 54), (77, 70, 64), + (76, 67, 58), (76, 75, 70), (71, 72, 77), (84, 89, 95), + (89, 98, 107), (91, 100, 107), (108, 103, 97), (109, 99, 89), + (97, 84, 67), (78, 67, 49), (62, 53, 46), (53, 48, 44), + (56, 52, 53), (67, 60, 54), (74, 61, 52), (57, 66, 63), + (48, 57, 66), (41, 54, 63), (25, 45, 69), (29, 36, 52), + (25, 18, 34), (19, 11, 26), (11, 0, 6), (8, 0, 0), + (3, 0, 0), (6, 1, 5), (0, 4, 10), (5, 4, 12), + (2, 4, 16), (4, 8, 19), (1, 7, 23), (2, 7, 26), + (6, 11, 31), (10, 17, 33), (19, 38, 55), (49, 62, 70), + (83, 99, 114), (130, 139, 146), (203, 209, 207), (226, 234, 237), + (226, 233, 249), (227, 231, 232), (219, 211, 198), (214, 191, 160), + (176, 162, 151), (182, 156, 139), (217, 178, 145), (220, 198, 184), + (247, 230, 214), (255, 253, 225), (255, 251, 239), (253, 248, 242), + (251, 254, 247), (255, 254, 251), (255, 255, 253), (255, 255, 253) + ), + +// 246 Apophysis-040427-24FNouveau +((157, 97, 97), (100, 75, 115), (135, 65, 69), (170, 55, 24), + (173, 49, 12), (177, 44, 1), (181, 47, 4), (186, 50, 8), + (164, 97, 29), (130, 113, 67), (97, 129, 106), (104, 122, 133), + (112, 115, 160), (97, 93, 129), (82, 72, 99), (83, 50, 81), + (85, 28, 63), (81, 22, 50), (94, 48, 30), (108, 74, 11), + (127, 81, 13), (147, 89, 16), (159, 104, 17), (171, 119, 18), + (171, 158, 28), (184, 161, 15), (198, 165, 2), (226, 188, 16), + (255, 211, 30), (255, 210, 41), (255, 209, 52), (240, 202, 69), + (255, 183, 94), (231, 203, 226), (231, 167, 212), (232, 131, 199), + (242, 130, 149), (253, 130, 99), (248, 138, 72), (244, 146, 45), + (245, 162, 30), (222, 163, 37), (200, 164, 44), (174, 127, 33), + (149, 90, 22), (130, 84, 16), (111, 78, 11), (111, 77, 6), + (105, 69, 9), (131, 78, 60), (124, 97, 109), (118, 117, 159), + (118, 116, 162), (118, 116, 165), (118, 115, 161), (118, 115, 158), + (161, 44, 60), (193, 37, 62), (226, 31, 65), (197, 45, 59), + (168, 59, 54), (163, 74, 60), (158, 90, 67), (131, 94, 50), + (161, 97, 69), (200, 129, 87), (203, 98, 57), (207, 68, 27), + (209, 82, 34), (211, 96, 42), (218, 123, 75), (239, 123, 84), + (247, 87, 95), (212, 113, 104), (177, 140, 114), (147, 128, 139), + (118, 116, 165), (118, 116, 165), (118, 116, 165), (118, 116, 165), + (118, 116, 165), (118, 116, 165), (149, 130, 158), (181, 144, 152), + (189, 148, 135), (197, 153, 118), (215, 151, 126), (209, 162, 118), + (195, 179, 68), (177, 163, 53), (159, 147, 39), (153, 129, 33), + (147, 111, 27), (150, 94, 20), (163, 86, 0), (174, 45, 3), + (176, 45, 1), (178, 100, 26), (163, 106, 56), (149, 113, 87), + (144, 115, 115), (140, 117, 143), (119, 116, 163), (118, 116, 165), + (123, 113, 166), (149, 130, 177), (176, 148, 189), (196, 166, 207), + (216, 185, 226), (194, 186, 233), (185, 212, 233), (154, 197, 213), + (133, 134, 201), (118, 116, 165), (118, 116, 165), (118, 116, 165), + (118, 116, 165), (118, 116, 165), (118, 116, 165), (118, 116, 165), + (118, 116, 165), (131, 114, 151), (145, 113, 137), (166, 115, 116), + (188, 117, 95), (192, 128, 100), (208, 144, 116), (212, 148, 139), + (149, 122, 141), (131, 126, 166), (170, 143, 156), (210, 161, 147), + (251, 174, 118), (255, 160, 103), (237, 190, 72), (231, 205, 58), + (173, 133, 11), (141, 100, 5), (110, 68, 0), (93, 59, 5), + (76, 51, 10), (73, 53, 3), (72, 60, 10), (76, 66, 17), + (114, 55, 23), (185, 19, 21), (195, 19, 31), (206, 20, 41), + (174, 45, 14), (172, 94, 32), (179, 132, 40), (183, 145, 74), + (200, 136, 100), (174, 129, 109), (148, 123, 118), (111, 105, 153), + (84, 83, 114), (59, 94, 62), (68, 51, 41), (53, 7, 18), + (48, 32, 6), (84, 40, 11), (104, 56, 40), (124, 73, 69), + (123, 50, 70), (98, 14, 48), (64, 1, 71), (41, 0, 68), + (30, 0, 28), (28, 0, 19), (27, 0, 11), (19, 0, 36), + (17, 8, 51), (24, 0, 36), (33, 21, 21), (30, 32, 29), + (28, 34, 32), (14, 1, 73), (0, 43, 95), (83, 84, 128), + (112, 105, 159), (113, 112, 170), (118, 116, 165), (118, 116, 165), + (118, 116, 165), (122, 125, 173), (127, 135, 182), (190, 173, 130), + (210, 217, 139), (203, 194, 165), (222, 159, 170), (182, 151, 149), + (119, 116, 163), (118, 116, 165), (118, 116, 165), (118, 116, 165), + (118, 116, 165), (118, 116, 165), (118, 116, 165), (118, 116, 165), + (118, 116, 165), (131, 109, 147), (161, 112, 107), (167, 146, 63), + (193, 138, 48), (191, 114, 8), (171, 91, 2), (188, 100, 11), + (199, 111, 22), (210, 130, 33), (187, 120, 31), (184, 111, 42), + (175, 113, 40), (175, 106, 37), (156, 107, 40), (156, 96, 42), + (127, 105, 82), (116, 113, 156), (118, 116, 165), (118, 116, 165), + (118, 116, 165), (118, 116, 165), (118, 116, 165), (140, 107, 136), + (148, 101, 85), (148, 102, 40), (156, 112, 23), (184, 130, 0), + (197, 106, 0), (170, 96, 1), (134, 108, 34), (62, 108, 69), + (84, 85, 115), (89, 83, 129), (103, 93, 145), (109, 107, 156), + (92, 89, 120), (82, 67, 106), (47, 10, 64), (30, 6, 68), + (8, 0, 58), (8, 4, 41), (15, 34, 14), (10, 38, 15), + (11, 40, 9), (67, 54, 1), (74, 59, 2), (102, 84, 18), + (103, 84, 16), (114, 97, 7), (126, 101, 0), (145, 130, 15), + (159, 134, 15), (175, 111, 21), (181, 108, 57), (138, 106, 145) + ), + +// 247 Apophysis-040427-24GuardFaeriR +((224, 121, 86), (96, 113, 68), (48, 103, 70), (0, 94, 73), + (43, 131, 112), (87, 168, 151), (86, 147, 129), (85, 127, 107), + (188, 117, 11), (199, 120, 7), (210, 124, 3), (167, 83, 49), + (125, 42, 96), (112, 36, 85), (99, 30, 75), (92, 32, 53), + (85, 34, 31), (9, 29, 17), (5, 15, 9), (1, 1, 1), + (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), + (1, 1, 1), (1, 1, 1), (1, 1, 1), (3, 3, 0), + (5, 5, 0), (9, 10, 5), (14, 15, 10), (62, 54, 17), + (101, 89, 63), (122, 143, 100), (155, 150, 98), (188, 158, 96), + (211, 177, 58), (234, 197, 20), (228, 184, 10), (223, 171, 0), + (103, 43, 32), (60, 25, 21), (17, 8, 11), (10, 4, 6), + (4, 0, 1), (2, 0, 1), (1, 1, 1), (1, 1, 1), + (1, 1, 1), (0, 4, 8), (25, 12, 32), (51, 21, 57), + (76, 25, 67), (102, 30, 78), (100, 25, 85), (98, 21, 93), + (89, 42, 26), (111, 58, 15), (134, 75, 5), (134, 74, 8), + (134, 74, 12), (109, 55, 18), (84, 36, 24), (37, 8, 2), + (11, 0, 7), (0, 34, 68), (27, 36, 72), (55, 39, 76), + (74, 37, 55), (93, 35, 34), (103, 28, 22), (104, 24, 0), + (31, 3, 0), (16, 2, 0), (1, 1, 1), (1, 1, 1), + (1, 1, 1), (1, 1, 1), (1, 1, 1), (0, 3, 4), + (6, 4, 17), (18, 0, 96), (15, 1, 57), (13, 2, 19), + (7, 2, 11), (2, 2, 4), (1, 1, 1), (1, 1, 1), + (0, 2, 2), (6, 13, 18), (12, 25, 34), (32, 25, 46), + (52, 25, 58), (85, 55, 81), (75, 71, 85), (64, 78, 53), + (87, 39, 35), (90, 41, 26), (110, 48, 69), (131, 56, 112), + (144, 59, 137), (158, 63, 163), (200, 70, 178), (205, 84, 190), + (138, 51, 130), (117, 41, 107), (96, 32, 84), (93, 29, 91), + (90, 27, 98), (57, 45, 93), (9, 40, 120), (17, 12, 141), + (44, 44, 144), (68, 47, 104), (72, 34, 99), (77, 21, 94), + (52, 14, 75), (35, 1, 75), (20, 0, 19), (5, 3, 4), + (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), + (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), + (1, 1, 1), (4, 0, 21), (9, 0, 45), (15, 0, 69), + (12, 10, 107), (102, 28, 115), (127, 42, 143), (150, 58, 169), + (183, 25, 171), (153, 24, 157), (124, 23, 143), (122, 24, 130), + (121, 26, 118), (111, 26, 111), (137, 28, 119), (152, 49, 130), + (151, 68, 146), (122, 108, 47), (109, 99, 50), (96, 91, 53), + (77, 59, 21), (27, 19, 0), (7, 6, 1), (2, 3, 0), + (4, 5, 0), (2, 16, 8), (0, 27, 17), (0, 63, 13), + (0, 80, 3), (15, 77, 14), (88, 41, 25), (173, 42, 0), + (231, 49, 1), (156, 100, 53), (154, 111, 73), (152, 122, 94), + (167, 110, 153), (182, 133, 119), (236, 116, 125), (216, 137, 96), + (154, 70, 46), (147, 57, 27), (141, 44, 9), (83, 38, 19), + (15, 6, 0), (6, 2, 3), (1, 1, 1), (1, 1, 1), + (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), + (1, 1, 1), (1, 1, 1), (1, 1, 1), (2, 3, 0), + (4, 86, 2), (12, 103, 14), (21, 120, 27), (50, 85, 29), + (96, 71, 17), (146, 113, 20), (170, 102, 3), (191, 94, 0), + (197, 117, 2), (194, 119, 2), (196, 108, 0), (175, 75, 0), + (166, 49, 0), (120, 36, 0), (83, 38, 19), (15, 23, 26), + (6, 21, 28), (29, 35, 67), (63, 44, 76), (108, 61, 105), + (119, 65, 117), (131, 100, 131), (137, 118, 148), (152, 115, 148), + (143, 139, 166), (125, 131, 147), (117, 102, 131), (84, 55, 103), + (6, 62, 85), (3, 78, 81), (6, 69, 60), (0, 84, 19), + (6, 78, 15), (33, 43, 18), (83, 42, 24), (92, 36, 37), + (145, 78, 85), (145, 90, 119), (168, 155, 199), (195, 184, 178), + (200, 213, 144), (175, 188, 132), (119, 117, 102), (68, 65, 84), + (13, 61, 73), (7, 42, 22), (14, 5, 6), (35, 4, 1), + (94, 21, 2), (116, 32, 0), (139, 47, 0), (131, 60, 30), + (139, 70, 63), (136, 46, 108), (171, 41, 137), (191, 40, 145), + (228, 73, 201), (223, 159, 183), (209, 199, 200), (198, 193, 213), + (165, 200, 222), (186, 210, 176), (200, 202, 178), (212, 202, 200), + (241, 119, 238), (243, 100, 214), (202, 97, 225), (180, 162, 204), + (136, 136, 134), (127, 149, 113), (143, 170, 129), (185, 154, 100) + ), + +// 248 Apophysis-040427-24GoldenRays +((0, 0, 0), (0, 0, 0), (1, 0, 0), (3, 0, 0), + (36, 30, 25), (70, 60, 50), (86, 72, 61), (102, 84, 72), + (139, 121, 85), (151, 133, 105), (164, 146, 126), (173, 154, 132), + (183, 163, 138), (177, 158, 142), (171, 154, 146), (172, 151, 138), + (174, 148, 131), (167, 146, 119), (146, 129, 119), (126, 113, 120), + (120, 114, 120), (115, 116, 120), (112, 111, 122), (110, 107, 124), + (99, 102, 121), (88, 96, 119), (77, 91, 118), (67, 72, 87), + (58, 53, 57), (36, 33, 35), (14, 14, 14), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (22, 17, 13), (45, 35, 26), (57, 46, 34), + (69, 57, 43), (68, 54, 39), (67, 51, 35), (47, 28, 21), + (1, 0, 0), (0, 0, 0), (28, 23, 24), (57, 47, 48), + (67, 66, 78), (78, 86, 109), (80, 94, 119), (82, 102, 129), + (92, 112, 147), (91, 113, 145), (91, 115, 143), (78, 86, 104), + (65, 58, 66), (65, 49, 51), (65, 41, 37), (1, 1, 1), + (0, 0, 0), (0, 1, 0), (40, 34, 28), (81, 67, 56), + (99, 84, 72), (117, 101, 88), (165, 147, 133), (207, 190, 170), + (249, 248, 246), (251, 251, 250), (254, 254, 254), (252, 248, 243), + (251, 242, 233), (237, 226, 218), (224, 211, 203), (223, 200, 168), + (204, 177, 166), (181, 164, 144), (187, 175, 158), (194, 186, 173), + (202, 186, 169), (211, 186, 166), (244, 231, 212), (253, 253, 251), + (254, 254, 254), (254, 254, 254), (254, 254, 254), (251, 251, 251), + (249, 249, 249), (219, 203, 187), (172, 161, 143), (141, 122, 108), + (91, 82, 73), (1, 1, 1), (0, 0, 0), (0, 0, 0), + (3, 3, 3), (7, 7, 7), (58, 46, 46), (61, 65, 77), + (82, 83, 103), (70, 63, 73), (58, 44, 44), (31, 24, 24), + (5, 5, 5), (0, 0, 0), (0, 0, 0), (1, 1, 1), + (51, 39, 27), (98, 81, 65), (107, 87, 67), (116, 94, 70), + (137, 106, 77), (139, 112, 83), (132, 116, 82), (130, 102, 78), + (87, 65, 51), (44, 32, 25), (1, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (35, 16, 22), (65, 47, 43), + (89, 77, 65), (143, 112, 91), (147, 118, 94), (151, 124, 97), + (164, 133, 102), (171, 144, 114), (171, 145, 120), (145, 133, 121), + (116, 112, 137), (116, 116, 142), (116, 120, 147), (143, 140, 157), + (171, 160, 168), (235, 221, 212), (251, 250, 246), (255, 254, 252), + (246, 240, 224), (166, 156, 164), (158, 147, 155), (150, 139, 147), + (152, 138, 138), (150, 135, 138), (143, 127, 128), (144, 130, 121), + (149, 126, 94), (146, 123, 91), (144, 121, 89), (132, 105, 78), + (112, 90, 77), (105, 89, 74), (92, 82, 81), (80, 78, 91), + (77, 88, 110), (104, 92, 94), (108, 97, 91), (112, 103, 88), + (109, 107, 108), (142, 124, 104), (141, 121, 96), (120, 101, 87), + (92, 81, 75), (83, 69, 66), (74, 58, 58), (66, 47, 41), + (36, 20, 5), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (1, 0, 0), + (48, 32, 19), (70, 58, 44), (93, 85, 64), (112, 99, 83), + (143, 121, 98), (155, 123, 110), (144, 124, 100), (147, 120, 90), + (146, 119, 98), (137, 120, 100), (123, 123, 125), (131, 131, 131), + (158, 138, 137), (167, 153, 140), (181, 166, 147), (198, 169, 135), + (255, 255, 6), (209, 185, 151), (215, 178, 151), (188, 161, 132), + (183, 162, 131), (180, 160, 135), (160, 138, 115), (111, 94, 87), + (74, 65, 56), (55, 38, 28), (3, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (5, 4, 9), (50, 48, 61), (86, 100, 126) + ), + +// 249 Apophysis-040427-24HunterSunset +((255, 217, 0), (220, 148, 38), (141, 118, 40), (62, 88, 43), + (35, 71, 25), (8, 54, 7), (10, 50, 4), (13, 46, 1), + (54, 65, 0), (85, 85, 26), (117, 106, 52), (180, 120, 40), + (243, 134, 29), (190, 147, 23), (137, 160, 17), (110, 146, 27), + (83, 133, 38), (44, 91, 0), (37, 89, 3), (31, 88, 7), + (24, 83, 3), (18, 78, 0), (20, 82, 6), (23, 87, 13), + (27, 133, 32), (23, 132, 40), (19, 131, 49), (19, 130, 53), + (20, 130, 57), (22, 125, 66), (25, 120, 76), (43, 116, 96), + (29, 104, 107), (37, 87, 112), (56, 93, 82), (76, 99, 53), + (114, 141, 46), (152, 184, 39), (180, 207, 36), (208, 230, 33), + (253, 240, 3), (254, 237, 3), (255, 234, 3), (255, 231, 2), + (255, 229, 2), (255, 230, 1), (255, 232, 0), (254, 234, 0), + (255, 240, 0), (255, 240, 1), (253, 240, 1), (252, 241, 1), + (252, 240, 0), (252, 239, 0), (252, 237, 0), (253, 236, 0), + (253, 223, 3), (254, 213, 29), (255, 203, 55), (201, 170, 81), + (148, 137, 107), (139, 126, 94), (130, 115, 82), (78, 110, 47), + (45, 94, 3), (27, 63, 0), (20, 51, 0), (13, 39, 0), + (26, 39, 2), (39, 39, 5), (81, 32, 0), (100, 30, 0), + (108, 35, 3), (113, 41, 18), (119, 47, 33), (183, 88, 20), + (248, 130, 7), (251, 141, 7), (254, 152, 7), (253, 159, 1), + (236, 164, 2), (231, 150, 0), (242, 135, 1), (253, 120, 2), + (254, 117, 7), (255, 115, 12), (220, 112, 24), (98, 97, 30), + (90, 140, 67), (112, 155, 93), (134, 171, 120), (129, 164, 108), + (124, 158, 97), (82, 136, 50), (50, 122, 22), (34, 116, 6), + (11, 91, 0), (0, 52, 4), (0, 68, 5), (0, 84, 6), + (0, 86, 3), (0, 88, 1), (1, 98, 1), (31, 105, 8), + (135, 115, 0), (187, 152, 0), (239, 190, 0), (246, 204, 1), + (254, 219, 3), (252, 229, 3), (247, 242, 26), (239, 233, 49), + (168, 165, 88), (24, 128, 65), (21, 127, 53), (19, 127, 42), + (31, 123, 36), (18, 106, 28), (2, 88, 13), (2, 81, 2), + (1, 69, 0), (2, 72, 1), (3, 76, 3), (4, 80, 3), + (5, 84, 3), (20, 93, 14), (45, 128, 36), (124, 179, 85), + (192, 215, 111), (249, 249, 63), (252, 248, 40), (255, 248, 17), + (253, 244, 3), (249, 243, 0), (255, 246, 0), (254, 249, 0), + (255, 248, 0), (255, 246, 0), (255, 244, 0), (254, 246, 0), + (254, 249, 0), (254, 249, 0), (254, 249, 0), (254, 249, 0), + (254, 249, 0), (254, 249, 0), (254, 244, 0), (255, 240, 0), + (254, 227, 0), (245, 204, 0), (236, 178, 19), (175, 163, 43), + (70, 95, 12), (60, 87, 6), (51, 80, 0), (53, 69, 0), + (58, 77, 0), (70, 84, 7), (83, 102, 36), (126, 132, 98), + (158, 188, 98), (233, 204, 148), (192, 182, 172), (152, 160, 196), + (110, 135, 155), (61, 107, 141), (42, 104, 81), (28, 104, 32), + (6, 70, 10), (8, 66, 9), (10, 63, 9), (13, 85, 21), + (40, 92, 53), (39, 91, 78), (77, 109, 98), (71, 96, 75), + (50, 81, 49), (42, 84, 8), (44, 74, 0), (51, 48, 0), + (75, 47, 0), (88, 79, 12), (81, 101, 4), (132, 149, 0), + (243, 198, 7), (247, 210, 4), (252, 222, 2), (255, 228, 0), + (255, 235, 1), (254, 239, 0), (253, 242, 0), (255, 240, 1), + (255, 234, 1), (255, 228, 0), (255, 223, 1), (255, 214, 0), + (250, 189, 0), (253, 171, 1), (255, 169, 8), (245, 190, 2), + (255, 221, 2), (254, 225, 1), (254, 227, 0), (254, 225, 1), + (255, 221, 0), (237, 181, 0), (149, 165, 32), (84, 146, 47), + (78, 129, 52), (74, 118, 43), (74, 119, 36), (81, 112, 19), + (82, 86, 2), (89, 78, 0), (114, 76, 1), (221, 123, 26), + (245, 132, 12), (129, 72, 3), (91, 72, 6), (69, 78, 0), + (32, 75, 4), (28, 85, 6), (19, 77, 3), (8, 44, 0), + (13, 22, 0), (20, 33, 5), (32, 34, 0), (41, 52, 10), + (47, 80, 35), (83, 131, 71), (95, 122, 89), (88, 131, 138), + (96, 106, 141), (51, 100, 114), (33, 96, 101), (34, 87, 61), + (30, 96, 25), (22, 84, 11), (48, 72, 0), (63, 75, 9), + (88, 82, 50), (99, 100, 58), (118, 98, 87), (105, 91, 78), + (73, 96, 78), (37, 119, 35), (8, 107, 16), (6, 102, 12), + (0, 103, 1), (19, 104, 0), (46, 114, 15), (85, 127, 19), + (163, 168, 4), (240, 201, 2), (253, 249, 0), (253, 224, 0) + ), + +// 250 Apophysis-040427-25IntoWeave +((0, 32, 174), (0, 0, 30), (5, 1, 20), (10, 3, 10), + (52, 42, 20), (94, 82, 30), (100, 93, 64), (107, 104, 99), + (172, 158, 85), (183, 157, 48), (194, 156, 11), (191, 190, 74), + (188, 224, 137), (187, 226, 160), (186, 229, 183), (181, 227, 174), + (177, 225, 165), (238, 228, 97), (246, 216, 50), (255, 205, 4), + (253, 169, 3), (251, 134, 2), (216, 109, 1), (182, 85, 0), + (185, 128, 0), (206, 146, 0), (227, 164, 1), (240, 192, 0), + (253, 220, 0), (249, 224, 0), (246, 228, 0), (253, 226, 0), + (255, 215, 1), (246, 171, 28), (239, 165, 95), (232, 160, 163), + (211, 191, 155), (191, 223, 148), (201, 227, 142), (212, 232, 137), + (254, 219, 0), (219, 221, 49), (184, 224, 99), (174, 224, 130), + (165, 225, 161), (171, 224, 174), (178, 224, 187), (181, 223, 211), + (197, 228, 210), (198, 235, 191), (181, 228, 186), (165, 222, 181), + (145, 204, 193), (126, 187, 205), (116, 157, 188), (107, 128, 171), + (17, 31, 94), (10, 15, 53), (4, 0, 12), (3, 0, 8), + (3, 0, 4), (3, 0, 3), (3, 0, 2), (1, 1, 1), + (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), + (1, 1, 1), (1, 1, 1), (1, 1, 1), (6, 0, 9), + (55, 55, 107), (96, 101, 132), (138, 148, 158), (130, 128, 143), + (122, 109, 129), (99, 98, 104), (76, 87, 79), (82, 42, 50), + (18, 4, 0), (6, 0, 7), (3, 0, 4), (1, 1, 1), + (0, 0, 1), (0, 0, 2), (1, 1, 9), (0, 0, 22), + (5, 48, 142), (23, 73, 178), (41, 98, 214), (39, 101, 226), + (37, 105, 238), (48, 119, 223), (23, 158, 216), (57, 154, 251), + (98, 176, 225), (119, 180, 209), (68, 105, 155), (18, 30, 102), + (10, 18, 78), (3, 7, 55), (1, 0, 10), (1, 0, 5), + (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), + (1, 1, 1), (0, 1, 0), (0, 2, 0), (0, 2, 0), + (0, 1, 0), (0, 0, 0), (0, 0, 0), (1, 1, 0), + (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), + (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), + (1, 1, 1), (1, 1, 1), (1, 1, 1), (0, 2, 8), + (0, 8, 9), (72, 84, 98), (91, 99, 128), (110, 114, 159), + (141, 159, 205), (133, 191, 202), (129, 192, 201), (139, 207, 226), + (129, 195, 230), (133, 198, 220), (138, 202, 211), (136, 199, 203), + (134, 196, 195), (160, 203, 186), (156, 118, 159), (116, 99, 143), + (73, 75, 116), (3, 1, 14), (1, 2, 10), (0, 3, 6), + (0, 3, 4), (0, 2, 7), (0, 0, 7), (0, 1, 15), + (3, 49, 127), (13, 53, 154), (24, 58, 182), (41, 105, 205), + (113, 111, 160), (196, 154, 130), (242, 207, 89), (251, 191, 5), + (251, 178, 14), (171, 129, 0), (94, 178, 5), (18, 227, 11), + (23, 47, 73), (46, 60, 133), (82, 105, 149), (99, 140, 184), + (63, 104, 230), (54, 106, 224), (46, 108, 219), (12, 28, 165), + (0, 13, 70), (0, 4, 23), (1, 0, 9), (0, 0, 2), + (0, 0, 2), (1, 1, 1), (1, 1, 1), (1, 0, 0), + (1, 0, 0), (1, 1, 1), (1, 1, 1), (1, 1, 1), + (0, 2, 0), (0, 2, 0), (0, 2, 0), (0, 5, 0), + (0, 5, 0), (0, 6, 0), (0, 6, 0), (0, 6, 0), + (0, 4, 1), (1, 1, 1), (3, 0, 0), (11, 0, 0), + (17, 8, 13), (73, 25, 67), (110, 99, 131), (153, 160, 168), + (140, 205, 199), (136, 206, 206), (136, 196, 230), (143, 166, 244), + (111, 159, 221), (60, 97, 141), (47, 35, 71), (50, 21, 26), + (50, 8, 0), (90, 45, 3), (85, 64, 0), (69, 38, 0), + (39, 11, 0), (15, 3, 3), (10, 0, 0), (3, 0, 0), + (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), + (1, 1, 1), (6, 0, 2), (8, 0, 0), (12, 0, 0), + (20, 0, 0), (38, 2, 0), (91, 42, 1), (123, 55, 0), + (150, 81, 3), (206, 148, 5), (251, 191, 5), (255, 217, 0), + (255, 226, 0), (253, 231, 0), (255, 225, 0), (255, 214, 1), + (250, 211, 0), (253, 160, 0), (245, 152, 0), (229, 153, 15), + (230, 188, 52), (251, 202, 136), (245, 215, 204), (223, 213, 203), + (169, 216, 182), (137, 204, 171), (62, 109, 135), (36, 63, 84), + (0, 7, 23), (13, 0, 9), (40, 21, 14), (94, 35, 0), + (173, 61, 0), (181, 107, 0), (255, 219, 0), (223, 149, 0) + ), + +// 251 Apophysis-040427-26AlienMind +((82, 105, 198), (62, 83, 166), (52, 71, 149), (42, 60, 132), + (33, 49, 116), (25, 39, 100), (23, 36, 97), (22, 34, 94), + (15, 27, 79), (15, 27, 79), (15, 27, 79), (15, 26, 79), + (15, 26, 80), (17, 28, 84), (19, 31, 89), (21, 33, 93), + (24, 35, 97), (36, 53, 123), (39, 57, 128), (43, 61, 133), + (43, 61, 134), (43, 61, 135), (40, 58, 130), (37, 56, 125), + (28, 42, 105), (22, 35, 93), (17, 28, 82), (14, 24, 77), + (11, 21, 72), (9, 18, 67), (8, 16, 62), (21, 20, 26), + (65, 46, 6), (43, 27, 2), (23, 18, 25), (4, 9, 49), + (8, 16, 61), (12, 24, 74), (13, 25, 75), (14, 26, 76), + (77, 62, 31), (94, 74, 30), (111, 86, 29), (97, 83, 45), + (84, 81, 62), (93, 89, 72), (103, 97, 83), (103, 99, 87), + (107, 111, 136), (97, 121, 219), (119, 140, 223), (142, 159, 228), + (130, 147, 210), (119, 136, 192), (101, 121, 195), (83, 106, 199), + (99, 103, 114), (149, 133, 98), (199, 164, 83), (192, 160, 90), + (186, 157, 97), (156, 135, 93), (126, 114, 90), (85, 86, 104), + (61, 70, 113), (28, 44, 106), (22, 35, 93), (16, 27, 81), + (14, 26, 78), (13, 25, 75), (10, 18, 65), (26, 31, 37), + (65, 53, 31), (105, 80, 29), (146, 108, 27), (168, 131, 51), + (190, 154, 76), (181, 143, 61), (173, 133, 46), (125, 99, 38), + (97, 86, 58), (19, 32, 87), (17, 29, 84), (16, 27, 81), + (18, 30, 87), (21, 33, 93), (23, 38, 97), (27, 46, 105), + (34, 51, 120), (34, 51, 120), (34, 51, 120), (33, 50, 118), + (32, 50, 116), (26, 41, 106), (21, 36, 95), (16, 27, 81), + (15, 26, 80), (14, 26, 78), (13, 25, 76), (13, 25, 75), + (13, 25, 76), (14, 26, 78), (14, 26, 78), (15, 26, 80), + (26, 40, 101), (35, 51, 118), (44, 62, 136), (51, 71, 148), + (59, 80, 161), (72, 96, 184), (90, 113, 209), (100, 125, 218), + (138, 157, 234), (131, 156, 240), (142, 161, 226), (154, 167, 212), + (167, 172, 194), (172, 173, 193), (185, 180, 184), (191, 184, 178), + (244, 204, 134), (240, 202, 120), (236, 200, 106), (227, 197, 129), + (218, 195, 153), (202, 186, 170), (196, 183, 174), (183, 178, 185), + (135, 140, 169), (59, 80, 159), (54, 74, 151), (49, 68, 144), + (70, 73, 92), (80, 80, 82), (86, 94, 115), (62, 83, 166), + (86, 112, 205), (79, 104, 195), (72, 96, 186), (68, 91, 178), + (64, 86, 171), (56, 75, 154), (55, 74, 153), (51, 70, 147), + (52, 71, 148), (62, 83, 166), (67, 88, 173), (72, 94, 180), + (82, 105, 198), (91, 115, 211), (97, 123, 220), (123, 150, 253), + (116, 144, 243), (104, 131, 228), (92, 118, 213), (75, 99, 189), + (61, 82, 165), (46, 64, 140), (35, 52, 121), (25, 36, 100), + (17, 28, 82), (7, 15, 62), (6, 15, 60), (6, 15, 58), + (4, 9, 28), (1, 8, 52), (9, 15, 65), (10, 18, 65), + (10, 20, 69), (10, 20, 69), (10, 20, 69), (10, 20, 69), + (10, 20, 69), (10, 20, 69), (12, 24, 74), (13, 25, 75), + (14, 26, 76), (14, 26, 78), (15, 26, 80), (15, 26, 80), + (20, 32, 90), (23, 37, 98), (30, 48, 112), (34, 52, 118), + (40, 58, 130), (42, 60, 133), (44, 62, 136), (57, 75, 157), + (68, 92, 180), (76, 100, 190), (90, 114, 210), (98, 122, 220), + (143, 161, 223), (170, 172, 197), (188, 183, 179), (192, 187, 167), + (206, 181, 127), (186, 165, 134), (110, 99, 81), (69, 69, 69), + (21, 36, 95), (19, 31, 89), (21, 36, 95), (29, 44, 109), + (39, 58, 127), (56, 75, 154), (101, 110, 143), (123, 124, 128), + (147, 160, 202), (138, 156, 228), (93, 119, 216), (81, 104, 197), + (66, 90, 176), (61, 82, 165), (54, 75, 154), (50, 69, 146), + (49, 67, 143), (49, 68, 144), (52, 71, 148), (54, 75, 154), + (51, 70, 147), (47, 66, 142), (42, 60, 132), (33, 51, 117), + (29, 44, 109), (23, 37, 98), (19, 31, 89), (18, 28, 87), + (19, 31, 89), (20, 32, 90), (21, 36, 95), (25, 36, 98), + (31, 45, 110), (35, 52, 121), (43, 61, 133), (48, 66, 142), + (60, 81, 162), (69, 93, 179), (71, 95, 183), (65, 87, 172), + (59, 80, 161), (49, 68, 145), (37, 56, 125), (29, 47, 111), + (21, 36, 95), (16, 29, 84), (15, 26, 80), (14, 26, 78), + (13, 25, 75), (13, 25, 75), (12, 24, 74), (14, 24, 75), + (29, 32, 47), (62, 56, 40), (178, 146, 69), (106, 90, 54) + ), + +// 252 Apophysis-040427-26ISpher4 +((33, 87, 0), (60, 100, 29), (78, 109, 54), (96, 118, 80), + (100, 118, 85), (104, 119, 90), (105, 122, 90), (106, 126, 91), + (100, 143, 90), (85, 125, 64), (71, 108, 39), (54, 99, 23), + (38, 90, 7), (32, 80, 3), (27, 70, 0), (26, 69, 0), + (26, 69, 0), (27, 68, 0), (27, 71, 0), (28, 74, 1), + (31, 81, 1), (35, 89, 1), (39, 93, 5), (43, 97, 9), + (72, 126, 38), (96, 145, 63), (120, 164, 89), (125, 168, 96), + (131, 172, 104), (132, 173, 105), (133, 174, 106), (132, 171, 104), + (128, 169, 101), (86, 127, 59), (63, 116, 42), (40, 105, 25), + (40, 100, 17), (41, 95, 9), (40, 94, 7), (40, 94, 6), + (34, 88, 0), (36, 90, 2), (38, 92, 4), (48, 95, 15), + (58, 98, 27), (62, 100, 36), (67, 102, 46), (91, 91, 91), + (99, 101, 100), (110, 109, 107), (115, 128, 108), (120, 148, 110), + (129, 163, 112), (139, 178, 115), (141, 179, 117), (143, 181, 120), + (153, 166, 138), (156, 169, 141), (159, 172, 144), (155, 179, 137), + (152, 187, 131), (148, 185, 127), (145, 183, 124), (142, 170, 121), + (137, 175, 116), (133, 174, 108), (118, 158, 102), (104, 143, 96), + (100, 138, 89), (97, 134, 82), (77, 127, 64), (70, 113, 42), + (62, 116, 28), (80, 133, 48), (99, 151, 68), (114, 161, 85), + (130, 171, 103), (131, 172, 105), (133, 174, 108), (133, 174, 108), + (133, 174, 108), (131, 172, 104), (130, 171, 103), (130, 171, 103), + (129, 170, 102), (128, 169, 101), (121, 149, 108), (123, 123, 115), + (109, 108, 106), (118, 138, 103), (128, 169, 101), (129, 170, 102), + (130, 171, 103), (130, 171, 103), (124, 167, 96), (108, 157, 78), + (86, 135, 53), (71, 110, 47), (84, 114, 66), (97, 118, 85), + (99, 120, 87), (102, 123, 90), (84, 124, 62), (71, 110, 45), + (45, 99, 11), (38, 91, 6), (32, 84, 1), (30, 79, 0), + (29, 75, 0), (26, 65, 2), (25, 60, 2), (23, 56, 1), + (24, 59, 1), (23, 61, 0), (24, 63, 1), (26, 65, 2), + (27, 70, 0), (27, 73, 0), (31, 72, 4), (30, 79, 0), + (31, 80, 1), (32, 84, 0), (34, 88, 0), (35, 89, 1), + (36, 90, 2), (38, 90, 7), (45, 78, 25), (58, 58, 50), + (67, 69, 55), (76, 102, 54), (73, 104, 50), (71, 107, 46), + (66, 107, 41), (66, 107, 41), (66, 107, 39), (62, 108, 35), + (46, 98, 13), (43, 96, 10), (41, 95, 7), (43, 97, 9), + (45, 99, 11), (51, 103, 20), (60, 114, 26), (72, 126, 38), + (86, 129, 58), (103, 141, 90), (103, 132, 90), (103, 124, 91), + (105, 125, 90), (111, 133, 95), (116, 149, 92), (127, 168, 100), + (114, 160, 85), (106, 155, 76), (99, 151, 68), (78, 132, 44), + (72, 115, 44), (68, 117, 51), (94, 146, 61), (109, 158, 79), + (124, 167, 96), (130, 171, 103), (129, 170, 102), (128, 169, 101), + (124, 167, 96), (106, 144, 95), (107, 141, 91), (108, 137, 89), + (95, 132, 65), (91, 122, 64), (88, 112, 64), (74, 110, 48), + (72, 105, 48), (68, 109, 43), (66, 107, 39), (70, 109, 44), + (79, 112, 55), (92, 112, 77), (110, 108, 96), (107, 106, 104), + (102, 102, 102), (97, 97, 97), (87, 87, 87), (69, 69, 57), + (46, 75, 21), (40, 71, 14), (34, 68, 8), (29, 70, 4), + (26, 69, 0), (26, 69, 0), (29, 75, 2), (32, 84, 1), + (39, 93, 5), (51, 105, 17), (61, 115, 27), (72, 126, 38), + (104, 153, 72), (123, 166, 95), (129, 170, 102), (126, 169, 100), + (109, 149, 99), (103, 135, 86), (83, 104, 65), (58, 58, 50), + (46, 45, 41), (43, 42, 38), (28, 64, 3), (30, 76, 1), + (33, 87, 1), (39, 93, 7), (52, 95, 23), (60, 91, 32), + (76, 94, 56), (89, 89, 89), (94, 92, 95), (91, 91, 91), + (72, 99, 58), (67, 93, 48), (54, 83, 27), (53, 82, 26), + (51, 85, 24), (40, 89, 8), (36, 85, 6), (33, 74, 4), + (47, 80, 25), (63, 82, 36), (77, 93, 56), (93, 93, 93), + (100, 100, 100), (87, 87, 87), (67, 89, 50), (58, 93, 27), + (44, 93, 12), (40, 94, 6), (37, 91, 3), (36, 90, 2), + (35, 89, 1), (35, 89, 1), (37, 91, 3), (39, 93, 5), + (42, 96, 8), (50, 102, 19), (65, 109, 34), (99, 148, 67), + (114, 160, 88), (133, 174, 108), (155, 185, 133), (195, 209, 184), + (204, 216, 196), (220, 231, 217), (222, 230, 217), (206, 218, 198), + (201, 213, 193), (164, 179, 150), (139, 164, 135), (126, 144, 104) + ), + +// 253 Apophysis-040427-26ISph2 +((153, 146, 180), (163, 169, 195), (165, 170, 198), (168, 171, 202), + (168, 171, 202), (168, 171, 202), (166, 164, 199), (164, 158, 196), + (144, 139, 169), (135, 134, 158), (127, 130, 147), (133, 136, 147), + (139, 142, 147), (156, 159, 168), (174, 176, 189), (174, 178, 195), + (175, 180, 202), (180, 187, 205), (181, 182, 206), (182, 177, 207), + (177, 177, 207), (173, 178, 207), (173, 177, 207), (173, 176, 207), + (169, 172, 205), (168, 171, 203), (167, 170, 201), (160, 157, 190), + (154, 144, 179), (150, 144, 173), (146, 144, 168), (136, 140, 149), + (125, 128, 143), (120, 126, 138), (115, 116, 138), (110, 106, 139), + (116, 110, 145), (123, 115, 152), (128, 119, 161), (133, 124, 171), + (154, 147, 189), (159, 157, 194), (165, 168, 199), (166, 169, 200), + (168, 171, 202), (168, 171, 202), (168, 171, 202), (170, 173, 204), + (173, 177, 206), (175, 179, 204), (173, 178, 203), (172, 178, 202), + (173, 177, 200), (174, 176, 199), (172, 176, 198), (170, 176, 198), + (168, 173, 202), (167, 172, 201), (167, 171, 200), (163, 168, 192), + (160, 165, 185), (158, 159, 174), (157, 154, 163), (146, 150, 153), + (130, 133, 148), (129, 116, 38), (165, 149, 36), (202, 182, 35), + (207, 210, 32), (212, 238, 29), (161, 201, 42), (113, 166, 60), + (110, 106, 133), (109, 103, 148), (109, 100, 163), (119, 112, 160), + (130, 124, 158), (132, 125, 159), (134, 127, 160), (145, 140, 170), + (157, 161, 188), (173, 168, 191), (170, 171, 193), (168, 174, 196), + (167, 173, 196), (167, 173, 197), (165, 170, 200), (167, 172, 202), + (160, 164, 193), (158, 162, 189), (156, 160, 185), (148, 149, 179), + (140, 139, 173), (128, 134, 150), (129, 132, 149), (135, 136, 154), + (144, 139, 179), (155, 155, 189), (158, 161, 188), (161, 168, 187), + (162, 169, 188), (164, 171, 190), (162, 169, 187), (160, 167, 185), + (162, 169, 187), (168, 173, 195), (174, 178, 203), (179, 179, 209), + (185, 181, 216), (194, 199, 219), (203, 206, 223), (203, 206, 225), + (203, 206, 225), (205, 208, 227), (210, 210, 226), (216, 212, 226), + (226, 229, 236), (232, 231, 236), (233, 230, 239), (233, 232, 238), + (230, 236, 236), (223, 229, 229), (216, 222, 222), (208, 213, 220), + (201, 204, 219), (196, 199, 216), (175, 179, 208), (171, 175, 204), + (168, 171, 202), (168, 171, 202), (168, 171, 202), (168, 171, 202), + (168, 171, 202), (168, 171, 202), (168, 171, 202), (168, 171, 204), + (168, 171, 204), (168, 171, 204), (168, 171, 204), (168, 171, 203), + (168, 171, 202), (168, 171, 202), (168, 171, 202), (167, 172, 202), + (167, 172, 202), (171, 177, 203), (171, 177, 201), (171, 177, 199), + (170, 177, 196), (168, 175, 193), (168, 174, 186), (159, 166, 185), + (132, 134, 155), (129, 133, 149), (126, 132, 144), (125, 129, 141), + (125, 126, 144), (130, 125, 157), (129, 124, 156), (115, 107, 167), + (113, 103, 166), (124, 123, 181), (131, 127, 182), (139, 132, 183), + (148, 145, 190), (158, 161, 196), (167, 170, 201), (168, 171, 202), + (168, 171, 202), (168, 171, 202), (168, 171, 202), (168, 171, 202), + (168, 171, 202), (168, 171, 202), (168, 171, 202), (168, 171, 202), + (168, 171, 202), (168, 171, 202), (168, 171, 202), (168, 171, 202), + (168, 171, 202), (168, 171, 202), (168, 171, 202), (168, 171, 202), + (168, 171, 202), (168, 171, 202), (168, 171, 202), (168, 171, 202), + (168, 171, 202), (168, 171, 202), (168, 171, 202), (168, 171, 202), + (168, 171, 202), (168, 172, 201), (171, 171, 199), (170, 176, 198), + (169, 175, 197), (166, 172, 198), (160, 164, 191), (150, 143, 187), + (127, 120, 164), (100, 90, 159), (82, 68, 127), (48, 33, 92), + (30, 37, 83), (26, 28, 79), (35, 29, 91), (89, 75, 128), + (116, 109, 153), (141, 136, 176), (159, 165, 187), (175, 181, 205), + (189, 188, 219), (198, 203, 223), (198, 205, 221), (197, 200, 215), + (184, 186, 201), (171, 165, 201), (142, 136, 196), (134, 125, 178), + (113, 103, 164), (100, 88, 138), (100, 88, 138), (99, 87, 135), + (97, 88, 135), (92, 80, 130), (77, 85, 134), (86, 80, 126), + (61, 57, 107), (48, 33, 92), (68, 61, 141), (71, 62, 141), + (89, 85, 159), (102, 108, 170), (136, 134, 173), (157, 162, 191), + (165, 168, 199), (172, 172, 200), (180, 178, 200), (178, 180, 201), + (180, 181, 201), (190, 185, 208), (200, 196, 213), (202, 199, 220), + (208, 204, 221), (210, 207, 228), (222, 217, 224), (209, 213, 214), + (205, 208, 223), (202, 205, 222), (196, 192, 215), (183, 177, 203), + (178, 171, 202), (165, 172, 191), (160, 166, 188), (163, 172, 189) + ), + +// 254 Apophysis-040427-26ISph11 +((146, 62, 86), (85, 25, 95), (86, 20, 83), (87, 16, 72), + (84, 16, 64), (82, 17, 57), (76, 20, 66), (70, 23, 75), + (72, 28, 113), (83, 40, 107), (95, 53, 101), (111, 70, 98), + (127, 87, 95), (154, 94, 107), (182, 101, 120), (197, 109, 119), + (212, 118, 118), (206, 155, 170), (191, 151, 165), (176, 148, 160), + (153, 121, 155), (130, 95, 151), (119, 88, 151), (109, 82, 151), + (128, 78, 147), (135, 100, 151), (143, 122, 155), (145, 145, 177), + (148, 169, 200), (151, 179, 218), (155, 189, 237), (156, 204, 242), + (140, 174, 202), (74, 189, 172), (100, 175, 156), (126, 161, 141), + (138, 148, 148), (150, 135, 156), (150, 133, 153), (150, 131, 151), + (114, 139, 133), (98, 149, 145), (83, 159, 157), (126, 166, 180), + (170, 173, 204), (172, 170, 202), (174, 167, 201), (179, 179, 205), + (191, 180, 220), (200, 212, 228), (180, 201, 219), (160, 191, 211), + (154, 166, 202), (148, 141, 193), (151, 132, 176), (154, 124, 160), + (152, 112, 138), (150, 121, 132), (149, 130, 126), (167, 130, 134), + (186, 130, 143), (201, 122, 133), (216, 115, 123), (222, 142, 145), + (219, 173, 175), (216, 178, 193), (202, 179, 204), (188, 181, 215), + (174, 174, 213), (160, 167, 211), (141, 142, 196), (131, 133, 184), + (108, 86, 132), (98, 77, 104), (89, 68, 77), (61, 96, 79), + (34, 125, 82), (54, 152, 110), (75, 180, 139), (62, 181, 175), + (67, 179, 191), (106, 77, 144), (102, 60, 134), (98, 43, 124), + (93, 46, 120), (88, 49, 116), (91, 54, 108), (102, 66, 112), + (134, 93, 123), (150, 94, 113), (167, 96, 104), (165, 101, 99), + (163, 107, 94), (134, 94, 95), (130, 89, 95), (120, 86, 100), + (115, 83, 94), (125, 59, 73), (108, 41, 77), (92, 24, 81), + (88, 20, 77), (85, 16, 73), (84, 31, 99), (69, 42, 113), + (88, 113, 135), (99, 119, 139), (110, 125, 144), (118, 128, 137), + (126, 132, 130), (131, 121, 129), (105, 95, 145), (103, 77, 124), + (90, 65, 97), (91, 65, 66), (107, 74, 73), (124, 83, 81), + (125, 82, 89), (128, 87, 93), (124, 87, 94), (123, 85, 106), + (108, 69, 100), (88, 54, 100), (68, 40, 101), (67, 40, 105), + (66, 41, 109), (27, 69, 127), (29, 71, 131), (57, 19, 130), + (66, 43, 147), (105, 60, 155), (137, 65, 171), (170, 71, 187), + (224, 95, 149), (217, 154, 165), (226, 180, 180), (237, 195, 197), + (246, 230, 230), (246, 231, 231), (246, 232, 232), (245, 230, 230), + (245, 229, 229), (222, 216, 226), (175, 180, 209), (135, 150, 189), + (130, 138, 157), (123, 101, 139), (115, 100, 144), (107, 99, 150), + (96, 90, 160), (47, 80, 173), (87, 97, 184), (107, 109, 186), + (167, 142, 161), (184, 149, 166), (201, 157, 172), (212, 167, 164), + (195, 186, 181), (183, 178, 175), (174, 164, 162), (175, 132, 160), + (197, 139, 153), (229, 187, 189), (230, 201, 204), (231, 216, 219), + (244, 228, 229), (241, 211, 211), (230, 196, 197), (217, 156, 171), + (187, 138, 71), (182, 130, 80), (178, 122, 89), (143, 104, 109), + (131, 92, 113), (120, 105, 108), (85, 142, 99), (58, 153, 72), + (56, 158, 56), (44, 123, 44), (76, 115, 62), (76, 53, 61), + (53, 38, 41), (53, 26, 61), (54, 32, 68), (70, 55, 86), + (112, 79, 134), (127, 83, 140), (142, 88, 146), (156, 108, 124), + (142, 121, 116), (165, 130, 111), (186, 129, 118), (173, 120, 136), + (161, 113, 129), (142, 113, 118), (131, 123, 120), (123, 142, 120), + (90, 157, 103), (82, 177, 119), (76, 181, 140), (56, 139, 109), + (85, 86, 107), (118, 91, 100), (112, 81, 122), (129, 96, 127), + (138, 107, 148), (139, 127, 151), (137, 127, 164), (138, 121, 165), + (127, 117, 169), (112, 114, 189), (110, 113, 164), (112, 103, 156), + (103, 96, 148), (100, 71, 129), (94, 65, 129), (107, 71, 117), + (120, 69, 112), (157, 61, 98), (165, 59, 79), (159, 80, 85), + (126, 79, 85), (124, 87, 94), (125, 89, 93), (128, 88, 96), + (147, 103, 116), (175, 105, 133), (192, 134, 149), (197, 139, 153), + (173, 137, 137), (169, 116, 134), (140, 95, 126), (113, 70, 115), + (101, 62, 107), (95, 36, 100), (85, 34, 101), (73, 47, 86), + (76, 53, 61), (70, 49, 54), (78, 20, 45), (77, 19, 41), + (77, 19, 41), (81, 18, 49), (57, 27, 61), (64, 37, 68), + (69, 45, 77), (77, 53, 85), (101, 62, 109), (116, 66, 125), + (158, 75, 147), (182, 101, 120), (219, 114, 119), (223, 113, 116), + (184, 109, 113), (152, 112, 113), (123, 107, 120), (74, 115, 117) + ), + +// 255 Apophysis-040427-43HeartFlwr +((65, 126, 131), (77, 88, 58), (78, 81, 46), (79, 74, 34), + (78, 75, 28), (78, 77, 23), (101, 75, 22), (124, 74, 21), + (173, 66, 12), (169, 54, 23), (166, 43, 35), (157, 37, 31), + (149, 31, 27), (119, 46, 33), (89, 61, 40), (71, 63, 32), + (53, 65, 25), (49, 81, 31), (32, 75, 38), (16, 70, 46), + (33, 80, 37), (51, 91, 28), (49, 78, 25), (47, 65, 23), + (22, 44, 58), (24, 76, 61), (27, 108, 65), (92, 159, 66), + (157, 210, 68), (177, 209, 71), (198, 208, 75), (232, 157, 42), + (222, 131, 52), (209, 52, 9), (197, 40, 17), (186, 28, 25), + (162, 20, 44), (139, 12, 63), (130, 31, 61), (121, 51, 59), + (117, 115, 103), (126, 135, 130), (136, 156, 157), (173, 167, 196), + (211, 178, 235), (188, 172, 214), (165, 166, 194), (133, 123, 134), + (72, 102, 113), (0, 95, 41), (12, 83, 21), (25, 72, 2), + (28, 92, 7), (31, 113, 13), (30, 122, 6), (29, 131, 0), + (23, 107, 19), (35, 82, 9), (47, 57, 0), (38, 52, 30), + (29, 47, 61), (14, 55, 80), (0, 63, 99), (0, 78, 80), + (13, 78, 84), (72, 97, 119), (75, 87, 91), (79, 77, 64), + (87, 70, 58), (95, 63, 52), (165, 67, 58), (224, 56, 55), + (247, 77, 104), (223, 71, 83), (199, 65, 62), (182, 45, 58), + (166, 26, 55), (173, 13, 55), (181, 0, 55), (216, 0, 15), + (255, 12, 28), (255, 11, 42), (246, 36, 21), (238, 61, 0), + (238, 115, 0), (239, 170, 0), (246, 199, 61), (222, 247, 57), + (229, 205, 73), (237, 212, 134), (245, 219, 196), (250, 208, 210), + (255, 197, 225), (222, 223, 218), (218, 196, 219), (138, 150, 190), + (89, 120, 151), (74, 141, 150), (93, 143, 138), (112, 145, 126), + (126, 144, 129), (141, 144, 133), (161, 171, 163), (210, 152, 202), + (236, 91, 108), (225, 66, 76), (215, 42, 44), (193, 37, 37), + (172, 33, 30), (149, 31, 27), (123, 34, 28), (86, 50, 50), + (77, 53, 51), (60, 56, 73), (55, 59, 63), (50, 63, 54), + (60, 44, 31), (68, 39, 43), (79, 53, 38), (81, 65, 39), + (71, 65, 49), (70, 75, 50), (69, 86, 52), (80, 85, 57), + (92, 84, 63), (83, 119, 58), (146, 112, 85), (141, 136, 80), + (140, 149, 102), (194, 241, 125), (202, 238, 133), (211, 235, 141), + (227, 255, 96), (247, 244, 105), (234, 226, 151), (218, 237, 158), + (232, 199, 208), (146, 176, 175), (60, 153, 142), (66, 131, 127), + (72, 110, 113), (78, 87, 66), (69, 71, 57), (84, 82, 43), + (139, 90, 49), (210, 88, 37), (215, 73, 42), (220, 58, 47), + (198, 42, 20), (175, 9, 47), (194, 0, 32), (193, 0, 12), + (174, 0, 1), (170, 0, 0), (166, 0, 0), (173, 8, 6), + (193, 0, 10), (184, 11, 5), (166, 14, 11), (169, 57, 9), + (178, 69, 2), (164, 69, 3), (159, 68, 9), (155, 68, 15), + (155, 67, 19), (169, 40, 34), (154, 29, 37), (132, 38, 39), + (90, 57, 38), (92, 56, 30), (94, 55, 22), (96, 33, 0), + (77, 7, 17), (85, 23, 38), (102, 44, 56), (104, 14, 78), + (78, 45, 92), (79, 59, 71), (118, 71, 55), (136, 86, 75), + (150, 89, 71), (179, 71, 33), (222, 41, 0), (239, 47, 0), + (199, 58, 12), (183, 63, 10), (168, 68, 8), (143, 79, 5), + (85, 79, 1), (73, 89, 0), (73, 86, 4), (63, 85, 13), + (85, 83, 24), (137, 79, 33), (172, 45, 38), (179, 30, 26), + (182, 13, 10), (183, 14, 11), (189, 15, 14), (200, 44, 0), + (219, 32, 0), (214, 12, 10), (252, 5, 0), (255, 28, 0), + (223, 51, 1), (179, 65, 2), (148, 74, 13), (99, 48, 0), + (79, 42, 15), (50, 43, 1), (13, 54, 0), (43, 41, 0), + (83, 23, 15), (115, 29, 16), (117, 20, 31), (117, 34, 28), + (99, 48, 17), (85, 59, 2), (72, 69, 14), (72, 66, 32), + (79, 68, 40), (75, 93, 41), (79, 135, 48), (78, 136, 77), + (69, 135, 107), (68, 129, 121), (64, 109, 76), (70, 92, 56), + (42, 105, 35), (31, 135, 58), (70, 145, 42), (129, 216, 24), + (173, 239, 17), (171, 213, 51), (88, 152, 66), (64, 161, 80), + (101, 183, 39), (113, 220, 2), (120, 178, 14), (103, 170, 29), + (80, 165, 0), (43, 126, 10), (57, 84, 15), (53, 84, 25), + (62, 88, 23), (73, 77, 26), (83, 68, 27), (131, 65, 17), + (159, 32, 0), (194, 31, 0), (204, 48, 0), (189, 52, 8), + (170, 36, 27), (127, 30, 24), (90, 49, 45), (68, 76, 63) + ), + +// 256 Apophysis-040427-43JunglThron +((59, 170, 52), (18, 118, 46), (18, 105, 52), (18, 92, 59), + (19, 94, 62), (20, 97, 65), (19, 100, 66), (19, 103, 67), + (33, 138, 54), (25, 124, 55), (17, 110, 57), (14, 97, 57), + (11, 85, 58), (15, 76, 54), (19, 67, 51), (25, 61, 56), + (31, 56, 61), (31, 77, 51), (25, 91, 55), (20, 106, 59), + (16, 106, 65), (13, 107, 71), (13, 104, 74), (13, 101, 77), + (14, 103, 81), (25, 112, 79), (36, 122, 77), (46, 142, 74), + (57, 163, 71), (71, 173, 77), (86, 184, 83), (115, 206, 113), + (154, 208, 150), (225, 189, 199), (207, 197, 156), (190, 205, 114), + (132, 179, 90), (74, 154, 67), (69, 146, 64), (64, 138, 61), + (24, 104, 79), (23, 97, 77), (23, 91, 76), (17, 86, 67), + (12, 82, 58), (14, 83, 49), (16, 85, 41), (10, 91, 35), + (25, 94, 40), (33, 142, 37), (49, 148, 46), (65, 155, 55), + (50, 153, 56), (36, 151, 58), (34, 148, 59), (32, 146, 61), + (36, 139, 56), (31, 127, 60), (27, 115, 64), (26, 101, 67), + (25, 88, 71), (22, 78, 70), (19, 69, 70), (19, 69, 70), + (16, 79, 71), (16, 120, 67), (32, 139, 73), (49, 158, 79), + (50, 162, 93), (52, 167, 108), (67, 158, 78), (67, 164, 71), + (49, 157, 72), (38, 144, 66), (28, 131, 60), (18, 121, 59), + (8, 112, 59), (7, 111, 58), (7, 110, 57), (2, 106, 55), + (11, 98, 66), (16, 75, 57), (12, 73, 59), (8, 71, 62), + (8, 70, 62), (9, 70, 62), (20, 64, 65), (43, 73, 73), + (97, 71, 100), (84, 55, 90), (71, 40, 81), (64, 57, 69), + (58, 75, 57), (61, 75, 50), (38, 67, 65), (21, 67, 67), + (10, 95, 66), (12, 114, 67), (13, 116, 60), (14, 119, 53), + (14, 117, 45), (15, 116, 38), (20, 118, 31), (18, 100, 26), + (0, 37, 20), (13, 28, 45), (27, 20, 71), (28, 28, 68), + (29, 36, 65), (20, 46, 59), (25, 67, 63), (28, 107, 60), + (51, 139, 79), (103, 183, 110), (99, 185, 105), (95, 187, 100), + (82, 164, 82), (61, 142, 76), (46, 124, 76), (29, 110, 77), + (0, 96, 81), (3, 87, 65), (6, 79, 50), (5, 83, 44), + (5, 87, 38), (14, 73, 19), (1, 69, 44), (7, 74, 67), + (6, 80, 65), (11, 81, 73), (15, 84, 73), (19, 87, 74), + (30, 85, 88), (20, 85, 81), (14, 87, 70), (8, 78, 50), + (0, 31, 0), (3, 18, 7), (7, 6, 14), (20, 24, 24), + (33, 43, 34), (110, 60, 59), (126, 77, 81), (127, 102, 105), + (161, 112, 82), (189, 137, 80), (190, 169, 96), (192, 202, 113), + (157, 211, 115), (169, 210, 150), (179, 212, 157), (198, 217, 136), + (239, 250, 130), (247, 229, 122), (255, 208, 115), (217, 180, 162), + (228, 186, 200), (232, 177, 200), (238, 176, 197), (238, 180, 205), + (230, 183, 201), (219, 212, 170), (195, 212, 162), (172, 213, 155), + (118, 199, 123), (108, 156, 82), (43, 130, 95), (26, 99, 80), + (36, 90, 77), (43, 85, 78), (50, 80, 80), (90, 89, 103), + (119, 91, 79), (126, 118, 131), (142, 122, 123), (117, 187, 98), + (107, 190, 82), (136, 209, 104), (143, 211, 98), (154, 210, 135), + (146, 206, 144), (130, 205, 123), (117, 203, 102), (128, 207, 79), + (71, 168, 65), (64, 164, 63), (57, 161, 62), (52, 155, 64), + (44, 148, 71), (36, 133, 82), (27, 116, 68), (24, 107, 63), + (16, 110, 57), (13, 110, 57), (13, 99, 60), (12, 98, 73), + (6, 99, 72), (4, 100, 72), (9, 99, 74), (12, 99, 83), + (12, 98, 87), (10, 93, 73), (6, 95, 73), (2, 86, 63), + (0, 86, 61), (10, 82, 58), (3, 90, 55), (8, 100, 53), + (10, 106, 43), (15, 113, 40), (16, 117, 39), (30, 141, 47), + (49, 161, 51), (58, 176, 53), (65, 186, 59), (69, 185, 60), + (72, 189, 57), (80, 181, 59), (107, 182, 79), (155, 193, 108), + (174, 139, 97), (231, 154, 62), (226, 153, 59), (188, 94, 42), + (178, 125, 75), (131, 189, 104), (132, 208, 118), (145, 208, 153), + (150, 206, 167), (192, 220, 205), (217, 197, 190), (217, 195, 182), + (184, 213, 165), (141, 203, 162), (131, 203, 140), (129, 211, 101), + (111, 207, 84), (79, 189, 68), (68, 173, 55), (64, 155, 62), + (41, 136, 70), (26, 125, 79), (18, 116, 75), (21, 111, 76), + (17, 108, 75), (18, 110, 85), (28, 113, 84), (23, 117, 83), + (30, 138, 86), (63, 161, 74), (100, 191, 88), (98, 204, 93), + (84, 192, 72), (61, 174, 58), (21, 124, 41), (42, 151, 60) + ), + +// 257 Apophysis-040427-44jawa +((121, 90, 72), (121, 91, 83), (130, 101, 92), (139, 112, 101), + (148, 117, 112), (157, 123, 124), (161, 130, 125), (166, 138, 127), + (156, 122, 123), (151, 117, 117), (146, 112, 111), (129, 95, 91), + (112, 79, 72), (100, 69, 62), (89, 60, 52), (86, 57, 49), + (83, 54, 46), (76, 51, 46), (81, 54, 48), (87, 58, 50), + (99, 68, 61), (112, 79, 72), (120, 88, 80), (128, 98, 88), + (175, 151, 139), (198, 182, 162), (221, 214, 185), (224, 209, 201), + (227, 205, 217), (223, 200, 208), (220, 195, 199), (195, 163, 176), + (179, 144, 151), (142, 108, 107), (127, 97, 92), (113, 86, 77), + (104, 76, 69), (95, 66, 62), (93, 63, 57), (91, 61, 53), + (79, 52, 43), (75, 47, 41), (71, 43, 39), (68, 42, 36), + (65, 42, 34), (63, 42, 33), (62, 42, 33), (62, 39, 31), + (62, 39, 31), (60, 37, 29), (57, 37, 24), (55, 38, 20), + (59, 40, 22), (63, 42, 25), (63, 43, 25), (63, 45, 25), + (88, 59, 51), (103, 74, 69), (119, 89, 87), (147, 115, 117), + (176, 141, 148), (185, 151, 161), (195, 161, 175), (216, 185, 203), + (228, 196, 207), (212, 181, 199), (190, 157, 169), (168, 133, 139), + (156, 122, 124), (145, 111, 109), (131, 101, 91), (122, 91, 86), + (113, 80, 73), (105, 74, 66), (98, 68, 60), (92, 62, 54), + (87, 57, 49), (83, 55, 46), (80, 53, 44), (77, 50, 41), + (72, 45, 36), (64, 41, 33), (63, 40, 32), (62, 39, 31), + (61, 38, 30), (60, 37, 29), (53, 33, 26), (50, 31, 24), + (50, 31, 24), (55, 34, 27), (60, 37, 31), (61, 38, 31), + (62, 39, 31), (62, 39, 31), (67, 43, 33), (73, 46, 37), + (79, 52, 43), (101, 69, 56), (108, 76, 66), (116, 83, 76), + (116, 83, 76), (117, 84, 77), (115, 82, 75), (115, 82, 75), + (97, 68, 60), (92, 63, 55), (87, 58, 50), (83, 55, 46), + (79, 52, 43), (76, 49, 40), (72, 45, 36), (72, 45, 36), + (74, 47, 38), (78, 51, 42), (78, 51, 42), (78, 51, 42), + (77, 50, 43), (75, 48, 41), (70, 45, 38), (71, 44, 35), + (71, 44, 35), (69, 44, 34), (68, 44, 34), (67, 43, 33), + (67, 43, 33), (64, 41, 33), (60, 37, 31), (55, 35, 28), + (49, 30, 23), (40, 26, 17), (38, 24, 16), (37, 22, 15), + (36, 15, 10), (28, 9, 2), (40, 17, 9), (39, 22, 15), + (56, 33, 27), (61, 37, 29), (66, 42, 32), (66, 42, 32), + (67, 43, 33), (70, 43, 34), (72, 44, 33), (71, 44, 35), + (69, 45, 35), (75, 48, 39), (76, 49, 40), (78, 51, 42), + (81, 54, 45), (87, 58, 50), (92, 62, 54), (93, 63, 55), + (90, 61, 53), (87, 58, 50), (84, 55, 47), (79, 52, 43), + (76, 49, 40), (72, 45, 36), (68, 44, 34), (67, 43, 33), + (66, 44, 33), (64, 41, 33), (63, 40, 32), (63, 40, 32), + (62, 39, 31), (62, 39, 31), (62, 39, 31), (65, 38, 29), + (60, 37, 29), (57, 36, 28), (55, 35, 28), (53, 33, 26), + (52, 33, 26), (51, 31, 24), (57, 27, 25), (60, 37, 29), + (61, 37, 33), (62, 39, 33), (65, 42, 34), (69, 44, 37), + (78, 51, 42), (83, 56, 47), (92, 62, 54), (94, 64, 56), + (111, 78, 71), (111, 78, 71), (112, 79, 72), (110, 77, 70), + (101, 71, 63), (96, 67, 59), (94, 64, 56), (98, 68, 60), + (106, 76, 74), (114, 86, 82), (132, 99, 94), (153, 119, 118), + (174, 139, 146), (189, 156, 167), (201, 169, 184), (213, 187, 200), + (204, 173, 188), (201, 169, 184), (209, 178, 196), (225, 192, 209), + (228, 203, 224), (227, 214, 208), (249, 243, 227), (255, 232, 254), + (242, 223, 245), (224, 193, 208), (187, 153, 167), (167, 131, 133), + (148, 114, 115), (134, 100, 98), (122, 89, 84), (112, 79, 72), + (100, 70, 62), (93, 63, 55), (88, 58, 50), (86, 57, 49), + (83, 56, 49), (86, 57, 49), (92, 63, 55), (94, 64, 56), + (103, 78, 47), (106, 80, 67), (113, 83, 72), (117, 84, 79), + (127, 94, 89), (136, 107, 101), (138, 117, 114), (156, 122, 123), + (165, 130, 134), (172, 137, 143), (172, 140, 145), (171, 136, 142), + (163, 128, 134), (153, 119, 118), (146, 116, 108), (137, 114, 98), + (123, 97, 82), (128, 101, 84), (139, 117, 93), (145, 122, 108), + (173, 162, 116), (153, 140, 121), (139, 118, 75), (107, 87, 50), + (96, 80, 46), (90, 61, 53), (82, 55, 46), (79, 52, 43), + (79, 52, 43), (81, 59, 35), (88, 59, 51), (95, 65, 57) + ), + +// 258 Apophysis-040427-51KaosGrn +((241, 232, 227), (155, 72, 56), (137, 55, 41), (120, 38, 26), + (109, 31, 18), (98, 24, 11), (98, 22, 9), (98, 20, 8), + (99, 17, 5), (98, 19, 6), (97, 21, 8), (95, 26, 12), + (94, 32, 17), (81, 61, 35), (69, 91, 53), (64, 96, 53), + (59, 101, 53), (68, 84, 47), (80, 57, 31), (93, 31, 16), + (93, 22, 11), (93, 13, 6), (92, 10, 6), (91, 7, 7), + (79, 6, 0), (79, 6, 0), (79, 6, 0), (80, 4, 0), + (81, 3, 1), (81, 2, 0), (81, 1, 0), (82, 2, 1), + (83, 2, 0), (90, 6, 4), (91, 21, 12), (93, 37, 20), + (86, 78, 12), (79, 119, 5), (97, 133, 3), (115, 147, 2), + (125, 221, 147), (140, 230, 163), (155, 239, 179), (117, 204, 139), + (80, 170, 100), (70, 162, 96), (60, 154, 92), (71, 113, 67), + (81, 85, 48), (93, 36, 19), (80, 63, 11), (67, 91, 3), + (68, 90, 1), (70, 90, 0), (83, 65, 2), (96, 40, 5), + (100, 13, 3), (94, 6, 2), (89, 0, 1), (88, 2, 1), + (88, 5, 1), (90, 5, 0), (92, 5, 0), (94, 7, 0), + (97, 8, 0), (96, 9, 0), (95, 8, 0), (94, 7, 0), + (94, 7, 0), (94, 7, 0), (94, 7, 0), (94, 7, 0), + (84, 11, 5), (87, 14, 2), (90, 17, 0), (92, 24, 7), + (94, 31, 14), (94, 36, 18), (94, 41, 23), (62, 87, 45), + (58, 120, 69), (49, 139, 75), (59, 130, 44), (69, 121, 13), + (83, 113, 8), (98, 106, 3), (105, 67, 2), (98, 34, 6), + (96, 19, 1), (95, 20, 4), (95, 22, 7), (94, 20, 6), + (94, 18, 5), (93, 17, 1), (96, 12, 1), (95, 10, 3), + (98, 10, 0), (103, 15, 3), (100, 18, 5), (97, 21, 8), + (98, 24, 10), (100, 28, 13), (99, 33, 17), (99, 30, 15), + (113, 21, 10), (106, 20, 9), (99, 19, 8), (98, 19, 7), + (97, 19, 7), (97, 15, 3), (92, 13, 0), (85, 6, 1), + (85, 4, 1), (84, 3, 0), (85, 3, 0), (87, 4, 0), + (93, 5, 1), (94, 6, 2), (91, 6, 1), (86, 6, 0), + (85, 6, 1), (90, 15, 0), (96, 24, 0), (97, 40, 3), + (98, 56, 6), (62, 90, 3), (57, 89, 6), (52, 88, 0), + (48, 88, 0), (46, 86, 0), (46, 86, 0), (46, 86, 0), + (46, 86, 0), (45, 83, 0), (45, 84, 3), (46, 85, 2), + (60, 86, 0), (79, 60, 9), (98, 35, 18), (96, 34, 18), + (95, 33, 18), (97, 30, 14), (95, 29, 13), (95, 33, 18), + (94, 41, 23), (72, 105, 0), (70, 97, 0), (69, 89, 0), + (95, 38, 19), (93, 34, 18), (92, 27, 9), (97, 21, 8), + (96, 24, 0), (96, 24, 0), (96, 24, 0), (96, 23, 8), + (95, 29, 15), (90, 29, 24), (93, 40, 22), (62, 88, 1), + (66, 93, 0), (100, 66, 3), (97, 50, 11), (94, 35, 19), + (97, 25, 11), (100, 18, 6), (105, 5, 3), (113, 5, 2), + (128, 25, 0), (135, 26, 6), (143, 27, 12), (152, 34, 22), + (155, 62, 31), (116, 114, 63), (141, 191, 106), (195, 200, 142), + (220, 226, 120), (248, 246, 159), (231, 186, 157), (232, 195, 177), + (226, 227, 209), (230, 241, 185), (190, 228, 189), (173, 222, 167), + (165, 180, 139), (145, 141, 106), (126, 102, 74), (107, 78, 48), + (102, 37, 19), (107, 68, 3), (129, 114, 13), (80, 131, 12), + (69, 140, 74), (63, 170, 114), (61, 182, 115), (51, 175, 112), + (56, 152, 89), (58, 120, 53), (69, 111, 9), (66, 89, 0), + (95, 40, 20), (95, 28, 12), (97, 21, 7), (92, 16, 0), + (90, 17, 0), (86, 23, 6), (93, 35, 13), (66, 87, 0), + (56, 92, 0), (54, 92, 0), (56, 85, 1), (63, 85, 0), + (94, 35, 17), (94, 27, 11), (96, 24, 2), (96, 24, 0), + (96, 24, 0), (100, 35, 3), (128, 86, 10), (137, 113, 27), + (156, 134, 14), (168, 175, 131), (192, 203, 163), (196, 225, 220), + (231, 251, 223), (255, 251, 252), (241, 236, 240), (241, 230, 208), + (164, 192, 151), (121, 138, 94), (132, 97, 57), (110, 55, 34), + (96, 40, 23), (94, 41, 23), (60, 86, 0), (51, 85, 0), + (49, 85, 0), (47, 85, 0), (48, 88, 0), (49, 89, 3), + (59, 99, 2), (55, 102, 48), (53, 137, 75), (52, 151, 87), + (54, 134, 73), (96, 101, 61), (96, 44, 23), (109, 37, 22), + (137, 54, 38), (164, 64, 48), (162, 52, 39), (163, 29, 28), + (158, 0, 0), (134, 26, 13), (116, 27, 13), (109, 42, 25) + ), + +// 259 Apophysis-040427-51KaosFish +((75, 31, 90), (79, 34, 89), (77, 32, 89), (75, 31, 90), + (75, 31, 90), (75, 31, 90), (77, 32, 89), (79, 34, 89), + (79, 34, 89), (79, 34, 89), (79, 34, 89), (77, 32, 89), + (75, 31, 90), (75, 31, 90), (75, 31, 90), (75, 31, 90), + (75, 31, 90), (75, 31, 90), (75, 31, 90), (75, 31, 90), + (77, 32, 89), (79, 34, 89), (79, 34, 89), (79, 34, 89), + (79, 34, 89), (80, 33, 90), (82, 32, 91), (128, 73, 80), + (175, 114, 70), (199, 135, 70), (224, 157, 70), (225, 158, 71), + (224, 157, 70), (198, 125, 46), (194, 127, 33), (190, 130, 20), + (184, 137, 25), (178, 145, 30), (176, 145, 33), (174, 146, 36), + (163, 146, 38), (122, 92, 64), (81, 38, 91), (80, 36, 90), + (79, 34, 89), (79, 34, 89), (79, 34, 89), (79, 34, 89), + (79, 34, 89), (79, 34, 89), (77, 32, 89), (75, 31, 90), + (65, 39, 54), (56, 47, 18), (62, 51, 15), (69, 56, 12), + (104, 75, 0), (144, 107, 16), (184, 140, 33), (205, 149, 51), + (226, 159, 70), (225, 159, 71), (225, 159, 72), (227, 161, 74), + (231, 164, 73), (225, 189, 49), (205, 169, 41), (186, 149, 34), + (199, 157, 53), (212, 165, 73), (226, 167, 75), (216, 157, 101), + (192, 169, 137), (196, 146, 167), (200, 124, 198), (188, 116, 206), + (177, 108, 214), (127, 104, 179), (78, 101, 145), (81, 33, 93), + (79, 34, 89), (79, 34, 89), (79, 34, 89), (79, 34, 89), + (77, 32, 89), (75, 31, 90), (75, 31, 90), (78, 28, 91), + (80, 32, 90), (114, 48, 109), (149, 64, 129), (158, 93, 121), + (167, 123, 114), (178, 137, 115), (190, 148, 110), (195, 153, 113), + (215, 156, 100), (224, 157, 70), (202, 130, 45), (181, 103, 20), + (179, 98, 19), (177, 94, 18), (133, 84, 15), (84, 49, 17), + (75, 31, 90), (77, 32, 89), (79, 34, 89), (53, 25, 52), + (28, 16, 16), (13, 0, 17), (37, 31, 19), (51, 11, 61), + (80, 35, 90), (177, 112, 90), (184, 127, 88), (192, 143, 87), + (195, 153, 113), (193, 159, 122), (200, 171, 129), (199, 165, 127), + (178, 137, 115), (152, 117, 104), (127, 98, 94), (103, 66, 91), + (79, 34, 89), (79, 34, 89), (79, 34, 89), (79, 34, 89), + (79, 34, 89), (79, 34, 89), (79, 34, 89), (79, 34, 89), + (79, 34, 89), (79, 34, 89), (79, 34, 89), (79, 34, 89), + (79, 34, 89), (79, 34, 89), (79, 34, 89), (79, 34, 89), + (79, 34, 89), (79, 34, 89), (79, 34, 89), (79, 34, 89), + (81, 34, 88), (177, 113, 75), (197, 123, 76), (218, 133, 78), + (224, 158, 71), (226, 165, 72), (231, 168, 75), (226, 169, 82), + (190, 155, 115), (185, 145, 112), (181, 135, 109), (184, 126, 88), + (170, 114, 79), (169, 142, 61), (166, 144, 43), (167, 145, 46), + (158, 117, 99), (77, 139, 196), (75, 139, 181), (74, 140, 166), + (64, 115, 119), (87, 127, 54), (137, 107, 45), (177, 95, 19), + (182, 110, 8), (179, 105, 10), (177, 101, 13), (124, 90, 3), + (79, 65, 20), (71, 29, 79), (75, 31, 90), (79, 34, 89), + (98, 102, 51), (113, 118, 36), (116, 103, 50), (71, 88, 43), + (71, 29, 77), (78, 33, 88), (79, 34, 89), (79, 34, 89), + (79, 34, 89), (76, 33, 67), (74, 32, 46), (68, 43, 13), + (69, 43, 10), (52, 28, 2), (52, 48, 10), (36, 61, 19), + (39, 78, 11), (56, 108, 10), (91, 86, 22), (134, 98, 24), + (175, 93, 17), (169, 80, 0), (142, 26, 3), (69, 57, 17), + (35, 84, 28), (29, 66, 58), (48, 78, 28), (87, 71, 12), + (140, 88, 13), (177, 94, 18), (182, 102, 17), (178, 96, 20), + (136, 59, 49), (84, 36, 84), (79, 34, 89), (79, 34, 89), + (75, 31, 90), (75, 31, 90), (75, 31, 90), (75, 31, 90), + (79, 34, 89), (79, 34, 89), (79, 34, 89), (79, 34, 89), + (81, 37, 70), (92, 80, 20), (141, 92, 23), (170, 123, 19), + (186, 128, 18), (193, 114, 19), (179, 121, 21), (162, 123, 32), + (116, 110, 26), (69, 60, 17), (17, 44, 0), (23, 27, 4), + (0, 5, 4), (17, 0, 26), (34, 1, 46), (58, 16, 54), + (71, 29, 79), (75, 31, 90), (74, 33, 93), (37, 68, 115), + (26, 93, 109), (51, 119, 104), (62, 107, 126), (50, 89, 122), + (39, 69, 121), (78, 34, 95), (79, 34, 89), (79, 34, 89), + (79, 34, 89), (79, 34, 89), (79, 34, 89), (79, 34, 89), + (79, 34, 89), (75, 31, 90), (75, 31, 90), (75, 31, 90) + ), + +// 260 Apophysis-040427-51KKlown +((41, 23, 105), (134, 59, 141), (137, 63, 125), (140, 67, 110), + (182, 109, 89), (224, 152, 68), (237, 165, 81), (250, 178, 94), + (252, 211, 61), (240, 232, 50), (229, 254, 39), (221, 219, 46), + (213, 184, 54), (158, 175, 67), (103, 167, 81), (86, 153, 94), + (70, 139, 108), (78, 106, 120), (133, 76, 126), (189, 47, 133), + (205, 25, 133), (222, 3, 133), (202, 1, 127), (182, 0, 121), + (62, 28, 44), (42, 37, 38), (23, 47, 33), (74, 74, 38), + (126, 101, 44), (158, 128, 38), (191, 155, 33), (226, 159, 46), + (255, 136, 63), (226, 146, 95), (217, 138, 120), (208, 130, 146), + (159, 103, 144), (111, 76, 142), (70, 65, 139), (30, 55, 137), + (47, 50, 57), (30, 83, 72), (13, 116, 87), (62, 113, 116), + (111, 111, 145), (130, 115, 138), (149, 119, 131), (213, 170, 115), + (255, 190, 121), (255, 240, 76), (254, 222, 109), (253, 205, 143), + (222, 191, 164), (191, 178, 185), (156, 162, 177), (122, 146, 170), + (151, 198, 143), (126, 187, 129), (102, 176, 115), (75, 113, 111), + (48, 50, 107), (35, 42, 102), (23, 34, 98), (4, 95, 100), + (23, 92, 61), (33, 111, 27), (84, 120, 22), (136, 130, 18), + (147, 124, 9), (159, 118, 0), (236, 118, 31), (220, 91, 23), + (95, 113, 5), (64, 96, 27), (33, 79, 50), (33, 107, 60), + (34, 136, 71), (39, 136, 62), (44, 136, 53), (61, 160, 17), + (50, 144, 8), (113, 98, 7), (146, 115, 56), (179, 132, 106), + (189, 144, 90), (199, 157, 75), (145, 180, 64), (135, 160, 43), + (132, 94, 45), (153, 65, 35), (174, 36, 26), (202, 22, 13), + (231, 8, 0), (251, 8, 12), (214, 20, 44), (204, 22, 11), + (188, 64, 13), (147, 33, 58), (107, 34, 37), (67, 36, 16), + (59, 53, 12), (52, 70, 8), (37, 132, 2), (41, 134, 2), + (117, 191, 6), (139, 189, 24), (162, 187, 43), (171, 202, 48), + (180, 218, 53), (194, 226, 67), (195, 200, 106), (173, 187, 151), + (202, 178, 174), (214, 174, 87), (211, 166, 93), (208, 159, 100), + (211, 136, 141), (188, 134, 186), (220, 115, 197), (254, 110, 208), + (222, 51, 117), (230, 44, 85), (239, 38, 54), (197, 35, 44), + (155, 32, 34), (107, 35, 23), (76, 36, 24), (53, 29, 27), + (92, 19, 26), (165, 11, 81), (167, 7, 88), (169, 4, 96), + (168, 10, 133), (185, 21, 136), (184, 26, 121), (218, 18, 117), + (222, 5, 60), (223, 2, 47), (224, 0, 34), (224, 0, 19), + (224, 0, 4), (184, 2, 17), (121, 11, 0), (97, 39, 17), + (72, 54, 30), (16, 92, 17), (14, 106, 9), (13, 121, 2), + (18, 136, 58), (46, 146, 74), (67, 136, 92), (126, 169, 115), + (215, 231, 70), (234, 240, 94), (253, 250, 119), (245, 251, 155), + (255, 246, 185), (255, 240, 188), (254, 243, 213), (242, 197, 220), + (226, 185, 203), (227, 132, 176), (237, 124, 182), (248, 116, 189), + (237, 72, 176), (255, 49, 169), (253, 14, 157), (229, 25, 94), + (254, 4, 14), (253, 3, 11), (252, 3, 9), (241, 5, 5), + (223, 1, 0), (186, 20, 0), (125, 20, 1), (122, 54, 9), + (101, 53, 33), (99, 96, 55), (121, 122, 114), (96, 148, 112), + (49, 141, 130), (0, 128, 109), (0, 133, 76), (0, 123, 75), + (21, 111, 60), (16, 106, 61), (11, 101, 63), (1, 62, 54), + (7, 32, 52), (61, 28, 57), (61, 6, 61), (155, 2, 82), + (206, 12, 47), (219, 34, 75), (180, 43, 125), (170, 25, 128), + (150, 82, 165), (146, 129, 165), (164, 149, 214), (198, 230, 225), + (224, 217, 211), (239, 193, 196), (255, 206, 173), (242, 213, 135), + (218, 237, 60), (186, 222, 38), (195, 170, 18), (171, 162, 5), + (69, 140, 10), (46, 107, 27), (52, 69, 0), (99, 58, 14), + (147, 47, 21), (188, 87, 77), (207, 95, 49), (217, 92, 72), + (234, 106, 95), (239, 75, 102), (210, 92, 108), (185, 82, 109), + (146, 68, 144), (140, 121, 140), (156, 208, 134), (169, 220, 117), + (163, 230, 124), (177, 209, 168), (250, 252, 187), (249, 242, 200), + (255, 241, 222), (255, 253, 243), (232, 228, 255), (241, 234, 228), + (255, 237, 204), (255, 206, 173), (179, 185, 113), (102, 169, 66), + (64, 158, 10), (62, 141, 0), (100, 79, 22), (149, 21, 20), + (170, 11, 31), (209, 0, 41), (234, 0, 61), (255, 11, 129), + (239, 3, 148), (248, 0, 140), (255, 0, 75), (241, 0, 26), + (255, 5, 17), (242, 8, 7), (237, 11, 0), (242, 7, 3), + (228, 0, 0), (215, 40, 9), (210, 42, 0), (219, 63, 4) + ), + +// 261 Apophysis-040427-51KaosEgg +((113, 89, 87), (97, 73, 69), (97, 72, 68), (97, 72, 68), + (97, 72, 68), (97, 72, 68), (97, 72, 68), (97, 72, 68), + (97, 72, 68), (97, 72, 68), (97, 72, 68), (97, 72, 68), + (97, 72, 68), (97, 72, 68), (97, 72, 68), (97, 72, 68), + (97, 72, 68), (97, 72, 68), (97, 72, 68), (97, 72, 68), + (97, 72, 68), (97, 72, 68), (97, 72, 68), (97, 72, 68), + (97, 72, 68), (97, 72, 68), (97, 72, 68), (97, 72, 68), + (97, 72, 68), (97, 72, 68), (97, 72, 68), (97, 72, 68), + (97, 72, 68), (97, 72, 68), (97, 72, 68), (97, 72, 68), + (97, 72, 68), (97, 72, 68), (97, 72, 68), (97, 72, 68), + (97, 72, 68), (97, 72, 68), (97, 72, 68), (97, 72, 68), + (97, 72, 68), (97, 72, 68), (97, 72, 68), (98, 73, 69), + (110, 89, 86), (129, 130, 114), (138, 137, 125), (148, 145, 136), + (132, 121, 112), (116, 98, 88), (114, 91, 84), (113, 85, 81), + (100, 75, 71), (112, 85, 80), (125, 96, 90), (148, 124, 110), + (171, 153, 131), (183, 167, 152), (195, 182, 173), (216, 213, 208), + (245, 241, 242), (214, 211, 204), (188, 184, 179), (163, 158, 155), + (155, 150, 146), (148, 143, 137), (136, 122, 122), (125, 108, 92), + (112, 114, 101), (130, 134, 116), (149, 154, 132), (162, 157, 134), + (176, 160, 137), (177, 161, 138), (178, 162, 139), (178, 168, 143), + (175, 170, 148), (184, 175, 166), (191, 177, 169), (198, 179, 173), + (192, 169, 162), (186, 159, 152), (170, 150, 125), (138, 104, 95), + (106, 83, 75), (101, 77, 71), (97, 72, 68), (97, 72, 68), + (97, 72, 68), (97, 72, 68), (97, 72, 68), (97, 72, 68), + (97, 72, 68), (97, 72, 68), (97, 72, 68), (97, 72, 68), + (97, 72, 68), (97, 72, 68), (97, 72, 68), (97, 72, 68), + (96, 71, 67), (82, 63, 66), (69, 56, 65), (63, 50, 60), + (58, 45, 55), (63, 43, 45), (55, 48, 42), (60, 42, 38), + (59, 41, 37), (53, 46, 40), (50, 44, 39), (47, 42, 39), + (39, 30, 31), (38, 24, 21), (43, 24, 28), (52, 32, 33), + (78, 54, 52), (84, 60, 58), (90, 66, 64), (89, 66, 63), + (88, 67, 62), (84, 65, 61), (80, 56, 54), (72, 46, 47), + (63, 42, 41), (78, 54, 52), (81, 55, 52), (85, 57, 53), + (89, 61, 57), (96, 68, 65), (95, 70, 66), (90, 66, 62), + (70, 50, 49), (56, 37, 39), (43, 24, 30), (37, 23, 26), + (32, 22, 23), (39, 26, 20), (39, 35, 26), (47, 43, 32), + (61, 59, 47), (94, 70, 66), (95, 70, 66), (96, 71, 67), + (97, 72, 68), (97, 72, 68), (96, 72, 70), (100, 81, 74), + (133, 116, 124), (145, 127, 134), (158, 139, 145), (164, 154, 153), + (163, 158, 154), (159, 146, 153), (149, 130, 124), (138, 104, 95), + (122, 100, 102), (112, 94, 106), (115, 97, 108), (118, 101, 111), + (130, 114, 124), (142, 139, 130), (159, 154, 148), (162, 157, 151), + (150, 140, 141), (143, 131, 139), (136, 122, 137), (137, 122, 129), + (134, 117, 125), (117, 112, 108), (117, 115, 103), (110, 102, 100), + (104, 86, 82), (91, 75, 88), (81, 63, 77), (97, 72, 68), + (97, 72, 68), (97, 72, 68), (97, 72, 68), (98, 80, 70), + (105, 109, 94), (106, 106, 94), (107, 104, 95), (106, 99, 91), + (97, 99, 85), (95, 95, 83), (96, 75, 70), (97, 72, 68), + (98, 76, 65), (99, 80, 65), (113, 90, 76), (126, 102, 90), + (137, 123, 114), (146, 150, 133), (160, 155, 149), (156, 161, 141), + (152, 157, 135), (141, 130, 124), (118, 111, 103), (111, 93, 89), + (98, 78, 71), (94, 75, 69), (89, 73, 60), (79, 66, 50), + (69, 52, 45), (59, 41, 37), (50, 31, 37), (47, 28, 34), + (56, 31, 34), (53, 32, 39), (63, 45, 45), (72, 72, 62), + (73, 73, 65), (78, 78, 66), (81, 82, 68), (93, 75, 63), + (96, 72, 68), (97, 72, 68), (97, 72, 68), (97, 72, 68), + (97, 72, 68), (95, 71, 67), (90, 65, 60), (85, 60, 53), + (75, 54, 51), (60, 42, 38), (44, 25, 31), (38, 18, 27), + (31, 17, 17), (30, 16, 15), (24, 12, 12), (23, 11, 11), + (30, 16, 15), (35, 20, 17), (38, 21, 29), (44, 39, 33), + (56, 46, 44), (71, 52, 48), (81, 60, 59), (94, 70, 66), + (97, 72, 68), (97, 72, 68), (97, 72, 68), (97, 72, 68), + (97, 72, 68), (97, 72, 68), (97, 72, 68), (97, 72, 68), + (97, 72, 68), (97, 72, 68), (97, 72, 68), (97, 72, 68) + ), + +// 262 Apophysis-040427-51LavLace +((253, 226, 233), (255, 184, 235), (246, 195, 223), (238, 206, 211), + (229, 208, 210), (221, 211, 210), (210, 202, 198), (200, 193, 187), + (212, 212, 210), (226, 214, 223), (241, 216, 237), (243, 202, 235), + (245, 188, 233), (247, 208, 230), (249, 229, 228), (247, 236, 237), + (246, 244, 247), (255, 229, 246), (252, 238, 249), (249, 247, 252), + (235, 248, 234), (222, 249, 216), (225, 239, 218), (228, 229, 221), + (230, 227, 210), (236, 229, 218), (242, 231, 227), (241, 221, 229), + (240, 211, 231), (244, 195, 232), (248, 179, 234), (255, 175, 231), + (255, 181, 222), (240, 171, 225), (234, 176, 219), (229, 182, 214), + (215, 171, 192), (202, 160, 170), (192, 137, 165), (183, 114, 161), + (180, 139, 153), (205, 190, 161), (230, 242, 170), (218, 243, 201), + (207, 245, 232), (191, 241, 210), (175, 237, 188), (185, 204, 172), + (165, 160, 214), (137, 100, 133), (105, 63, 103), (74, 26, 74), + (67, 25, 64), (60, 25, 55), (60, 23, 51), (61, 21, 47), + (47, 10, 41), (51, 13, 39), (55, 16, 37), (69, 22, 44), + (83, 29, 52), (80, 31, 62), (78, 33, 72), (76, 36, 73), + (76, 36, 73), (77, 37, 74), (77, 37, 74), (77, 37, 74), + (77, 37, 74), (77, 37, 74), (77, 37, 74), (95, 41, 77), + (151, 88, 135), (174, 121, 158), (197, 154, 182), (212, 147, 188), + (227, 140, 195), (212, 148, 183), (198, 157, 171), (179, 134, 137), + (145, 84, 128), (80, 35, 74), (82, 37, 78), (85, 40, 83), + (109, 57, 99), (133, 75, 116), (160, 88, 154), (171, 105, 151), + (127, 65, 114), (102, 51, 94), (77, 37, 74), (77, 37, 74), + (77, 37, 74), (77, 37, 74), (77, 37, 74), (77, 37, 74), + (77, 37, 74), (77, 37, 74), (77, 37, 74), (77, 37, 74), + (77, 37, 74), (77, 37, 74), (77, 37, 74), (81, 43, 80), + (152, 81, 147), (163, 103, 155), (175, 125, 163), (180, 152, 167), + (186, 179, 171), (187, 197, 173), (171, 184, 167), (176, 165, 159), + (168, 152, 129), (128, 109, 103), (113, 88, 89), (99, 68, 76), + (76, 38, 75), (75, 37, 74), (75, 37, 74), (75, 37, 74), + (77, 36, 76), (116, 65, 105), (156, 94, 135), (174, 129, 158), + (193, 164, 182), (226, 221, 201), (244, 238, 216), (255, 254, 227), + (255, 243, 222), (221, 212, 183), (206, 201, 180), (192, 190, 178), + (163, 155, 134), (138, 111, 128), (116, 58, 96), (82, 30, 76), + (126, 83, 110), (156, 121, 136), (186, 160, 163), (193, 162, 167), + (200, 165, 172), (204, 165, 186), (202, 157, 177), (202, 141, 174), + (174, 107, 158), (83, 38, 81), (79, 36, 76), (75, 35, 72), + (71, 26, 69), (66, 26, 63), (61, 25, 63), (68, 23, 62), + (66, 27, 71), (71, 28, 72), (76, 29, 73), (76, 36, 73), + (77, 37, 74), (77, 37, 74), (77, 37, 74), (77, 37, 74), + (77, 37, 74), (77, 37, 74), (77, 37, 74), (77, 37, 74), + (77, 37, 74), (77, 37, 74), (77, 37, 74), (77, 37, 74), + (77, 37, 74), (77, 37, 74), (77, 37, 74), (77, 37, 74), + (77, 37, 74), (77, 37, 74), (77, 37, 74), (77, 37, 74), + (77, 37, 74), (77, 37, 74), (77, 37, 74), (77, 37, 74), + (77, 37, 74), (77, 37, 74), (77, 37, 74), (77, 37, 74), + (77, 37, 74), (77, 37, 74), (77, 37, 74), (77, 37, 74), + (74, 36, 75), (75, 37, 78), (83, 44, 91), (138, 62, 126), + (178, 0, 122), (93, 37, 86), (80, 35, 74), (77, 37, 74), + (77, 37, 74), (77, 37, 74), (77, 37, 72), (87, 31, 66), + (102, 44, 68), (145, 84, 81), (166, 97, 115), (145, 96, 118), + (88, 50, 87), (75, 40, 80), (75, 37, 76), (77, 37, 74), + (77, 37, 74), (77, 37, 74), (77, 37, 74), (77, 37, 74), + (77, 37, 74), (77, 37, 74), (77, 37, 74), (77, 37, 74), + (77, 37, 74), (77, 37, 74), (77, 37, 74), (77, 37, 74), + (117, 75, 85), (149, 126, 120), (188, 156, 169), (229, 171, 193), + (240, 193, 213), (255, 186, 223), (240, 165, 221), (235, 170, 224), + (222, 168, 202), (207, 172, 204), (195, 177, 199), (203, 180, 188), + (212, 191, 190), (229, 190, 195), (233, 192, 210), (224, 189, 211), + (213, 184, 176), (179, 178, 160), (167, 164, 145), (181, 155, 138), + (195, 148, 156), (219, 183, 149), (245, 210, 180), (255, 235, 219), + (251, 251, 241), (254, 255, 244), (252, 255, 250), (252, 254, 251), + (252, 247, 254), (255, 248, 255), (255, 254, 255), (248, 255, 253), + (244, 255, 253), (243, 253, 252), (229, 255, 235), (246, 255, 248) + ), + +// 263 Apophysis-040427-51mudding +((171, 134, 128), (227, 182, 163), (227, 197, 170), (227, 213, 178), + (205, 187, 161), (183, 162, 145), (174, 156, 134), (166, 150, 124), + (135, 112, 78), (123, 94, 64), (111, 77, 50), (123, 80, 44), + (136, 83, 39), (140, 90, 51), (144, 98, 64), (144, 98, 78), + (145, 98, 92), (132, 121, 137), (151, 132, 141), (170, 144, 145), + (170, 150, 153), (171, 156, 161), (169, 157, 165), (168, 158, 169), + (181, 157, 145), (186, 160, 134), (191, 163, 123), (195, 169, 134), + (199, 176, 145), (198, 181, 143), (198, 187, 141), (200, 185, 146), + (217, 193, 165), (188, 184, 136), (192, 179, 112), (196, 174, 89), + (187, 166, 99), (179, 159, 109), (174, 155, 94), (170, 152, 80), + (170, 140, 104), (181, 141, 105), (193, 143, 106), (200, 148, 122), + (207, 154, 138), (220, 166, 153), (233, 179, 169), (230, 216, 203), + (248, 232, 235), (255, 255, 255), (252, 253, 253), (250, 252, 251), + (237, 244, 244), (225, 236, 238), (216, 218, 214), (207, 200, 190), + (162, 157, 153), (143, 139, 141), (125, 122, 129), (107, 103, 110), + (90, 85, 92), (88, 75, 83), (87, 66, 75), (90, 62, 40), + (75, 55, 30), (62, 33, 19), (54, 33, 13), (46, 34, 8), + (50, 37, 9), (55, 40, 11), (59, 50, 9), (59, 48, 18), + (65, 49, 15), (68, 53, 19), (71, 58, 24), (95, 81, 42), + (119, 104, 61), (130, 115, 72), (141, 126, 83), (161, 152, 113), + (199, 194, 154), (255, 244, 229), (251, 248, 227), (247, 253, 225), + (238, 242, 228), (230, 232, 231), (213, 195, 183), (222, 188, 160), + (151, 167, 190), (157, 161, 181), (164, 155, 172), (166, 147, 151), + (168, 139, 131), (156, 130, 113), (146, 110, 88), (138, 108, 72), + (129, 99, 63), (133, 107, 84), (141, 129, 106), (150, 152, 128), + (156, 168, 145), (163, 185, 162), (179, 213, 197), (175, 197, 236), + (188, 218, 180), (194, 210, 160), (201, 203, 140), (187, 200, 129), + (174, 197, 119), (171, 161, 92), (179, 128, 97), (173, 101, 87), + (177, 91, 68), (131, 117, 90), (123, 115, 89), (115, 113, 88), + (105, 97, 94), (100, 99, 81), (100, 92, 73), (92, 71, 68), + (71, 48, 34), (60, 41, 28), (49, 35, 22), (51, 35, 21), + (53, 35, 21), (62, 35, 16), (65, 41, 3), (67, 39, 2), + (93, 39, 13), (106, 76, 38), (117, 81, 44), (129, 86, 51), + (134, 100, 62), (151, 119, 72), (157, 117, 68), (160, 128, 67), + (166, 137, 93), (165, 132, 97), (165, 128, 101), (160, 124, 93), + (155, 121, 86), (145, 113, 102), (125, 109, 86), (123, 87, 71), + (112, 75, 59), (93, 52, 34), (91, 57, 29), (90, 62, 25), + (93, 63, 27), (98, 66, 27), (109, 55, 17), (117, 69, 20), + (110, 71, 30), (112, 77, 34), (114, 83, 39), (119, 94, 53), + (109, 97, 49), (112, 88, 44), (104, 80, 46), (97, 69, 30), + (83, 65, 19), (58, 41, 0), (56, 38, 5), (55, 35, 10), + (45, 29, 0), (37, 27, 0), (34, 15, 1), (26, 23, 6), + (36, 28, 15), (40, 32, 15), (45, 37, 16), (55, 46, 17), + (76, 47, 13), (74, 60, 23), (81, 68, 26), (86, 70, 36), + (97, 79, 55), (111, 87, 77), (122, 101, 116), (130, 135, 155), + (166, 169, 212), (192, 180, 226), (174, 169, 175), (195, 179, 146), + (202, 170, 145), (197, 165, 143), (193, 160, 141), (197, 164, 133), + (179, 143, 107), (153, 121, 100), (135, 100, 72), (124, 84, 59), + (106, 80, 53), (95, 76, 43), (90, 73, 47), (94, 70, 42), + (98, 69, 39), (98, 74, 36), (93, 71, 32), (93, 69, 35), + (88, 57, 36), (78, 56, 33), (84, 55, 25), (86, 60, 27), + (97, 66, 37), (99, 72, 51), (109, 93, 67), (119, 97, 73), + (114, 125, 95), (124, 131, 98), (136, 124, 100), (147, 135, 119), + (138, 138, 126), (130, 116, 107), (137, 116, 95), (134, 109, 79), + (132, 106, 73), (122, 90, 69), (123, 102, 75), (123, 108, 89), + (129, 116, 107), (143, 130, 114), (167, 140, 121), (171, 140, 119), + (150, 134, 101), (146, 127, 85), (137, 113, 77), (123, 94, 64), + (118, 95, 61), (110, 93, 65), (99, 86, 67), (91, 84, 76), + (79, 88, 87), (100, 92, 79), (114, 96, 76), (117, 92, 72), + (118, 94, 70), (112, 92, 65), (115, 88, 59), (105, 83, 60), + (115, 80, 58), (121, 90, 61), (127, 100, 55), (145, 93, 56), + (149, 76, 67), (141, 76, 48), (143, 72, 40), (104, 73, 45), + (79, 71, 50), (50, 62, 58), (76, 63, 55), (85, 58, 37), + (86, 65, 36), (92, 74, 54), (99, 85, 74), (94, 74, 65) + ), + +// 264 Apophysis-040427-51pane; +((154, 121, 5), (154, 121, 5), (154, 121, 5), (154, 121, 5), + (152, 120, 5), (151, 119, 6), (149, 117, 6), (147, 115, 6), + (135, 113, 37), (131, 118, 32), (127, 124, 27), (121, 118, 34), + (115, 112, 41), (96, 94, 59), (77, 77, 77), (76, 76, 76), + (76, 76, 76), (42, 54, 14), (36, 42, 10), (31, 31, 7), + (38, 37, 7), (46, 43, 8), (64, 61, 11), (83, 79, 15), + (142, 115, 70), (149, 127, 97), (156, 140, 125), (163, 154, 132), + (170, 169, 139), (172, 172, 139), (175, 175, 139), (169, 168, 137), + (147, 172, 140), (178, 144, 98), (171, 140, 63), (164, 136, 29), + (157, 127, 17), (150, 118, 5), (146, 114, 5), (142, 111, 5), + (120, 95, 5), (105, 83, 4), (90, 71, 3), (66, 51, 4), + (42, 32, 5), (37, 30, 4), (33, 29, 4), (28, 30, 6), + (33, 28, 6), (58, 55, 10), (76, 65, 10), (94, 76, 10), + (88, 78, 12), (82, 81, 14), (83, 82, 15), (84, 83, 16), + (129, 119, 24), (142, 124, 25), (156, 129, 26), (149, 123, 44), + (142, 117, 63), (134, 116, 58), (127, 116, 54), (123, 121, 46), + (129, 126, 29), (115, 113, 30), (99, 98, 23), (84, 83, 16), + (75, 73, 14), (66, 64, 13), (41, 41, 7), (31, 31, 7), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (8, 6, 3), + (16, 13, 6), (32, 16, 6), (49, 20, 6), (82, 34, 12), + (100, 59, 15), (113, 88, 4), (125, 96, 17), (138, 104, 30), + (139, 112, 38), (140, 120, 47), (143, 139, 68), (141, 128, 83), + (158, 160, 155), (178, 165, 155), (198, 170, 156), (199, 179, 163), + (201, 188, 171), (190, 184, 150), (181, 177, 140), (173, 172, 128), + (163, 162, 118), (163, 142, 53), (175, 130, 69), (187, 118, 85), + (173, 124, 79), (159, 130, 74), (148, 126, 68), (131, 123, 50), + (152, 121, 5), (153, 121, 5), (154, 121, 5), (154, 121, 5), + (154, 121, 5), (153, 120, 5), (150, 118, 5), (135, 106, 4), + (123, 97, 4), (93, 99, 27), (97, 99, 28), (102, 99, 30), + (108, 98, 26), (117, 99, 27), (134, 105, 5), (148, 116, 5), + (151, 119, 6), (147, 102, 12), (143, 86, 19), (157, 76, 19), + (172, 67, 19), (136, 87, 18), (137, 108, 6), (150, 118, 5), + (152, 121, 5), (154, 121, 5), (154, 121, 5), (154, 121, 5), + (154, 121, 5), (154, 121, 5), (154, 121, 5), (153, 120, 4), + (151, 118, 5), (141, 111, 4), (132, 104, 4), (128, 101, 4), + (124, 98, 5), (123, 97, 4), (123, 96, 5), (106, 94, 18), + (113, 111, 24), (130, 127, 24), (148, 134, 32), (166, 141, 41), + (172, 148, 42), (164, 134, 24), (159, 127, 14), (156, 120, 6), + (154, 121, 5), (154, 121, 5), (154, 121, 5), (154, 121, 5), + (153, 120, 5), (150, 118, 5), (139, 110, 6), (130, 102, 3), + (117, 91, 4), (79, 77, 16), (72, 70, 14), (66, 64, 13), + (73, 36, 9), (86, 51, 13), (102, 73, 15), (95, 76, 10), + (104, 83, 2), (100, 80, 8), (96, 78, 14), (105, 88, 18), + (101, 95, 19), (102, 96, 18), (101, 98, 17), (112, 108, 19), + (135, 106, 6), (149, 117, 4), (153, 120, 4), (154, 121, 5), + (154, 121, 5), (154, 121, 5), (154, 121, 5), (154, 121, 5), + (150, 122, 15), (146, 129, 20), (142, 136, 26), (134, 131, 24), + (128, 125, 22), (127, 123, 23), (128, 125, 22), (149, 117, 6), + (142, 111, 5), (134, 105, 3), (121, 96, 4), (104, 82, 6), + (92, 72, 3), (53, 48, 10), (39, 32, 6), (31, 29, 6), + (32, 30, 7), (46, 43, 8), (79, 75, 14), (82, 81, 14), + (73, 71, 12), (48, 46, 8), (34, 30, 5), (27, 26, 6), + (2, 7, 3), (0, 0, 0), (0, 0, 0), (3, 3, 3), + (25, 29, 6), (46, 40, 8), (94, 74, 3), (108, 86, 3), + (132, 104, 4), (150, 118, 5), (153, 120, 4), (154, 121, 5), + (154, 121, 5), (154, 121, 5), (154, 121, 5), (154, 121, 5), + (154, 121, 5), (153, 120, 5), (150, 118, 5), (148, 116, 5), + (138, 109, 5), (133, 104, 4), (134, 105, 3), (148, 116, 5), + (153, 120, 4), (151, 120, 4), (145, 115, 5), (131, 103, 4), + (116, 92, 4), (95, 75, 4), (55, 54, 10), (36, 35, 5), + (31, 31, 7), (36, 35, 5), (47, 45, 7), (93, 73, 2), + (115, 91, 3), (131, 103, 4), (145, 115, 5), (152, 119, 4), + (153, 120, 4), (154, 121, 5), (154, 121, 5), (154, 121, 5), + (154, 121, 5), (154, 121, 5), (154, 121, 5), (154, 121, 5) + ), + +// 265 Apophysis-040427-51RiftAO +((172, 134, 37), (141, 80, 23), (110, 58, 23), (80, 36, 23), + (60, 40, 22), (41, 45, 22), (40, 45, 21), (40, 46, 20), + (52, 23, 19), (49, 21, 12), (47, 19, 5), (46, 16, 8), + (45, 14, 11), (48, 16, 11), (51, 18, 11), (53, 19, 12), + (55, 20, 14), (61, 24, 16), (67, 29, 19), (74, 34, 22), + (78, 34, 13), (82, 35, 5), (92, 42, 7), (102, 49, 9), + (98, 70, 20), (85, 64, 31), (72, 59, 42), (54, 50, 47), + (37, 41, 53), (36, 40, 52), (36, 40, 52), (33, 47, 21), + (28, 54, 17), (38, 44, 18), (36, 41, 13), (35, 38, 9), + (42, 28, 9), (49, 19, 9), (50, 21, 8), (52, 23, 7), + (68, 28, 18), (66, 27, 17), (65, 27, 16), (58, 23, 14), + (52, 19, 12), (48, 16, 11), (44, 13, 10), (27, 7, 8), + (21, 3, 3), (8, 5, 0), (8, 3, 0), (8, 1, 0), + (16, 6, 1), (25, 11, 2), (31, 13, 3), (37, 15, 4), + (36, 36, 8), (33, 38, 8), (31, 40, 9), (33, 39, 9), + (35, 38, 9), (37, 38, 11), (39, 39, 13), (53, 35, 23), + (69, 32, 26), (102, 70, 31), (123, 88, 57), (145, 107, 84), + (145, 112, 92), (146, 117, 101), (161, 124, 72), (164, 141, 73), + (131, 79, 81), (124, 79, 59), (117, 80, 38), (98, 58, 29), + (80, 37, 20), (84, 45, 23), (89, 54, 26), (76, 65, 37), + (56, 65, 34), (35, 38, 55), (29, 32, 45), (24, 27, 36), + (21, 22, 31), (18, 18, 26), (16, 11, 5), (10, 7, 2), + (15, 7, 4), (16, 12, 15), (18, 18, 26), (21, 22, 31), + (24, 27, 36), (24, 27, 36), (24, 27, 36), (18, 18, 26), + (0, 1, 32), (0, 1, 0), (7, 4, 0), (14, 7, 1), + (22, 10, 2), (30, 13, 3), (53, 24, 8), (72, 37, 15), + (124, 62, 13), (154, 73, 26), (185, 84, 40), (187, 105, 47), + (190, 126, 54), (148, 108, 116), (94, 106, 158), (82, 94, 146), + (70, 80, 133), (50, 54, 66), (55, 59, 53), (60, 64, 41), + (80, 70, 35), (115, 88, 77), (166, 137, 129), (154, 160, 150), + (231, 199, 238), (233, 214, 198), (236, 229, 159), (217, 201, 148), + (199, 173, 138), (183, 148, 118), (173, 133, 107), (167, 126, 94), + (154, 111, 79), (140, 88, 64), (141, 96, 63), (143, 104, 63), + (150, 105, 86), (124, 94, 86), (84, 82, 96), (64, 62, 73), + (46, 49, 64), (41, 44, 58), (36, 40, 52), (32, 36, 49), + (29, 32, 47), (25, 27, 40), (22, 25, 42), (24, 28, 37), + (24, 27, 36), (24, 27, 36), (24, 27, 36), (24, 27, 36), + (22, 26, 35), (17, 17, 25), (19, 5, 4), (25, 0, 0), + (45, 12, 7), (51, 12, 5), (57, 13, 4), (71, 23, 0), + (75, 24, 3), (74, 6, 0), (41, 5, 0), (36, 8, 5), + (30, 12, 2), (23, 3, 2), (22, 3, 2), (21, 3, 3), + (21, 2, 0), (13, 0, 0), (9, 6, 0), (12, 9, 0), + (38, 16, 3), (36, 27, 6), (35, 38, 9), (39, 45, 19), + (52, 55, 24), (45, 54, 27), (37, 46, 19), (36, 42, 16), + (35, 38, 9), (35, 38, 9), (35, 38, 9), (35, 38, 9), + (36, 16, 5), (29, 11, 1), (18, 9, 0), (16, 9, 0), + (31, 11, 0), (33, 12, 0), (36, 14, 1), (37, 15, 2), + (38, 16, 3), (38, 18, 7), (35, 38, 9), (35, 38, 9), + (47, 19, 7), (44, 18, 5), (44, 18, 5), (44, 18, 5), + (41, 17, 5), (40, 16, 4), (40, 16, 4), (41, 17, 5), + (44, 18, 5), (59, 22, 14), (71, 32, 17), (94, 48, 24), + (122, 88, 42), (150, 107, 75), (171, 136, 106), (215, 190, 149), + (229, 211, 173), (251, 216, 194), (203, 200, 207), (173, 175, 196), + (143, 144, 172), (179, 186, 194), (204, 231, 226), (204, 208, 211), + (222, 208, 159), (167, 171, 136), (146, 158, 118), (137, 135, 114), + (100, 100, 126), (71, 74, 89), (48, 49, 69), (54, 56, 34), + (39, 45, 19), (35, 38, 9), (31, 16, 11), (18, 18, 26), + (24, 27, 36), (24, 27, 36), (24, 27, 36), (24, 27, 36), + (24, 27, 36), (25, 28, 37), (25, 28, 37), (34, 32, 35), + (46, 14, 15), (48, 19, 13), (47, 20, 13), (24, 27, 34), + (24, 27, 36), (24, 27, 36), (24, 27, 36), (24, 27, 36), + (24, 28, 37), (26, 29, 44), (32, 36, 48), (34, 37, 54), + (29, 31, 52), (22, 23, 71), (30, 38, 61), (46, 49, 66), + (57, 58, 76), (84, 75, 94), (158, 138, 105), (139, 128, 110) + ), + +// 266 Apophysis-040427-51ylwAlien +((6, 7, 2), (0, 1, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (1, 1, 1), (13, 0, 0), (96, 38, 2), (180, 76, 5), + (194, 110, 25), (208, 144, 46), (213, 146, 45), (219, 148, 44), + (234, 179, 50), (224, 176, 55), (214, 174, 60), (199, 173, 52), + (184, 173, 45), (169, 159, 38), (155, 145, 32), (69, 120, 0), + (60, 107, 11), (202, 105, 26), (224, 113, 40), (247, 122, 55), + (218, 95, 35), (190, 69, 16), (138, 59, 17), (86, 50, 18), + (2, 2, 4), (1, 1, 2), (0, 0, 0), (0, 0, 1), + (0, 0, 2), (0, 0, 3), (0, 1, 4), (0, 0, 7), + (0, 2, 8), (46, 105, 23), (137, 147, 40), (228, 190, 57), + (232, 201, 58), (237, 212, 60), (239, 219, 68), (244, 218, 69), + (240, 204, 64), (241, 187, 58), (242, 170, 52), (240, 166, 48), + (239, 162, 44), (239, 173, 48), (239, 185, 53), (245, 217, 58), + (247, 221, 64), (255, 242, 77), (253, 243, 69), (251, 245, 61), + (252, 235, 66), (254, 225, 71), (243, 218, 74), (244, 212, 161), + (245, 218, 225), (248, 229, 235), (252, 241, 245), (252, 245, 241), + (252, 250, 238), (245, 246, 238), (243, 212, 207), (246, 223, 81), + (249, 224, 72), (230, 182, 54), (174, 128, 38), (118, 75, 22), + (79, 46, 16), (41, 18, 10), (5, 2, 9), (1, 0, 4), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (2, 2, 2), + (101, 129, 52), (148, 153, 47), (196, 178, 42), (200, 181, 45), + (204, 184, 49), (217, 150, 46), (177, 134, 39), (81, 54, 11), + (9, 5, 4), (15, 1, 0), (40, 17, 3), (65, 34, 6), + (114, 71, 36), (185, 134, 45), (222, 151, 45), (248, 174, 51), + (250, 185, 57), (237, 169, 48), (225, 154, 40), (202, 105, 26), + (133, 33, 17), (45, 8, 0), (3, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (10, 0, 0), + (45, 18, 7), (113, 44, 5), (191, 113, 41), (218, 151, 47), + (234, 205, 209), (235, 210, 221), (237, 216, 233), (241, 222, 242), + (230, 233, 224), (240, 229, 207), (211, 220, 173), (234, 213, 70), + (241, 216, 72), (246, 222, 64), (247, 224, 66), (248, 222, 65), + (247, 220, 67), (243, 216, 63), (234, 187, 55), (235, 184, 56), + (235, 184, 57), (209, 188, 69), (170, 170, 100), (91, 119, 35), + (55, 51, 26), (5, 3, 8), (0, 0, 2), (2, 1, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 2, 0), (7, 3, 0), (66, 35, 15), (125, 143, 83), + (172, 172, 148), (195, 204, 175), (211, 220, 193), (213, 191, 116), + (235, 211, 75), (232, 211, 68), (228, 199, 71), (213, 193, 46), + (175, 154, 11), (104, 83, 30), (30, 20, 18), (3, 3, 1), + (1, 1, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (1, 1, 1), (11, 1, 0), (77, 57, 0), + (144, 158, 13), (185, 187, 24), (206, 148, 51), (165, 117, 45), + (61, 42, 36), (15, 11, 10), (1, 1, 1), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (3, 0, 0) + ), + +// 267 Apophysis-040427-51elecforest +((0, 0, 0), (0, 0, 0), (0, 1, 0), (0, 2, 1), + (7, 6, 10), (14, 11, 20), (32, 30, 33), (50, 49, 47), + (130, 35, 129), (92, 45, 86), (54, 56, 43), (65, 64, 44), + (77, 73, 46), (100, 74, 63), (124, 75, 81), (143, 61, 100), + (162, 48, 120), (223, 15, 163), (231, 57, 141), (239, 100, 119), + (221, 139, 102), (204, 179, 86), (197, 172, 86), (191, 166, 86), + (142, 159, 166), (130, 117, 149), (119, 76, 132), (77, 58, 81), + (35, 41, 31), (18, 22, 19), (2, 3, 8), (0, 0, 5), + (0, 0, 5), (0, 0, 4), (1, 4, 4), (3, 9, 5), + (44, 45, 31), (86, 82, 57), (110, 96, 80), (135, 110, 103), + (223, 204, 200), (238, 225, 219), (253, 246, 238), (199, 218, 182), + (145, 191, 126), (149, 197, 109), (153, 203, 92), (160, 189, 73), + (142, 168, 95), (85, 117, 78), (45, 76, 53), (5, 36, 28), + (2, 21, 14), (0, 6, 0), (0, 4, 0), (0, 2, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (1, 1, 1), (7, 3, 4), (33, 20, 0), + (121, 45, 11), (129, 49, 14), (138, 54, 18), (117, 58, 26), + (97, 62, 34), (82, 50, 29), (68, 39, 25), (12, 7, 4), + (13, 0, 2), (3, 0, 4), (10, 10, 15), (17, 20, 27), + (38, 47, 23), (59, 74, 19), (98, 104, 66), (121, 148, 81), + (186, 199, 119), (204, 210, 113), (222, 222, 108), (213, 198, 106), + (204, 175, 105), (243, 136, 56), (171, 99, 74), (169, 35, 86), + (138, 17, 112), (105, 49, 26), (52, 31, 13), (0, 14, 0), + (0, 10, 0), (0, 6, 0), (3, 3, 11), (11, 50, 55), + (8, 109, 105), (89, 122, 99), (170, 135, 93), (188, 125, 104), + (207, 116, 115), (220, 138, 124), (220, 130, 165), (255, 211, 214), + (255, 222, 208), (224, 135, 67), (199, 102, 37), (174, 70, 7), + (164, 54, 17), (131, 50, 5), (85, 64, 0), (43, 33, 0), + (0, 3, 0), (0, 2, 0), (0, 1, 0), (0, 1, 0), + (0, 1, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (3, 3, 3), (6, 3, 7), (10, 3, 11), (50, 43, 35), + (82, 76, 54), (76, 123, 69), (42, 136, 22), (43, 113, 14), + (38, 97, 3), (10, 30, 2), (1, 3, 0), (1, 1, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (1, 0, 0), (3, 0, 0), (7, 7, 0), (32, 36, 3), + (92, 112, 15), (109, 138, 56), (162, 129, 58), (170, 150, 1), + (150, 89, 22), (149, 67, 56), (89, 30, 24), (31, 0, 2), + (5, 0, 3), (1, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (1, 1, 0), (9, 7, 0), (65, 37, 15), (107, 74, 41), + (170, 120, 61), (186, 163, 67), (173, 160, 82), (131, 118, 84), + (79, 75, 74), (14, 25, 29), (3, 0, 11), (1, 0, 8), + (0, 0, 4), (0, 0, 4), (0, 0, 2), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (3, 0, 0), + (8, 3, 0), (25, 0, 0), (91, 22, 25), (154, 32, 81), + (157, 7, 45), (147, 24, 6), (171, 25, 12), (177, 38, 7), + (245, 0, 0), (209, 14, 12), (185, 24, 58), (233, 4, 107), + (244, 23, 152), (253, 79, 166), (246, 94, 155), (249, 74, 81), + (249, 76, 72), (240, 95, 90), (199, 112, 69), (163, 124, 85), + (81, 94, 76), (27, 76, 93), (16, 82, 96), (60, 71, 54) + ), + +// 268 Apophysis-040427-51ReachMoon +((140, 144, 33), (114, 88, 29), (73, 79, 38), (32, 70, 47), + (32, 51, 34), (32, 32, 22), (42, 32, 20), (52, 33, 19), + (103, 76, 29), (141, 113, 28), (180, 150, 28), (191, 164, 32), + (203, 178, 36), (191, 169, 35), (180, 160, 35), (166, 143, 34), + (152, 127, 34), (76, 35, 53), (83, 52, 43), (90, 70, 33), + (110, 92, 34), (131, 114, 36), (146, 124, 38), (161, 135, 40), + (192, 143, 41), (205, 142, 39), (218, 141, 37), (181, 130, 33), + (144, 119, 29), (136, 109, 30), (129, 100, 32), (115, 80, 22), + (108, 77, 22), (52, 35, 27), (56, 29, 34), (60, 23, 41), + (64, 24, 47), (69, 26, 54), (68, 27, 55), (67, 28, 57), + (66, 29, 60), (62, 20, 59), (58, 12, 59), (58, 11, 58), + (59, 10, 57), (59, 10, 57), (60, 11, 58), (60, 11, 58), + (60, 11, 58), (59, 13, 60), (59, 29, 47), (59, 45, 34), + (95, 74, 26), (131, 103, 19), (141, 119, 28), (152, 136, 38), + (183, 163, 38), (176, 156, 36), (169, 149, 34), (142, 122, 33), + (116, 96, 33), (103, 85, 34), (90, 75, 36), (39, 78, 51), + (33, 97, 125), (103, 143, 93), (66, 100, 91), (29, 58, 90), + (29, 53, 86), (29, 49, 82), (25, 39, 68), (47, 14, 59), + (46, 13, 58), (51, 14, 45), (56, 15, 33), (51, 14, 21), + (47, 14, 9), (47, 14, 9), (47, 14, 9), (56, 31, 9), + (54, 31, 17), (59, 34, 14), (60, 41, 22), (61, 48, 31), + (66, 53, 34), (71, 59, 37), (96, 87, 48), (126, 117, 60), + (122, 115, 60), (104, 87, 38), (87, 60, 17), (78, 53, 14), + (70, 46, 12), (55, 36, 22), (57, 24, 45), (66, 27, 54), + (69, 26, 54), (69, 26, 54), (63, 24, 54), (57, 22, 55), + (58, 16, 55), (60, 11, 56), (59, 10, 57), (55, 11, 60), + (54, 12, 60), (56, 11, 57), (59, 10, 55), (57, 11, 48), + (56, 13, 41), (55, 14, 30), (55, 14, 30), (53, 15, 30), + (54, 15, 33), (47, 14, 59), (39, 18, 67), (31, 22, 75), + (28, 32, 95), (26, 43, 87), (36, 36, 88), (50, 35, 78), + (71, 24, 70), (68, 26, 65), (66, 29, 60), (66, 29, 60), + (66, 29, 60), (69, 26, 54), (69, 26, 54), (69, 26, 54), + (69, 26, 54), (55, 27, 52), (55, 27, 52), (55, 27, 52), + (50, 27, 53), (52, 31, 40), (57, 41, 28), (68, 47, 20), + (108, 94, 49), (135, 113, 74), (162, 133, 99), (163, 133, 87), + (164, 133, 76), (147, 136, 54), (168, 144, 36), (186, 156, 32), + (203, 163, 39), (227, 178, 120), (226, 199, 116), (225, 221, 113), + (225, 191, 153), (240, 212, 175), (250, 240, 230), (179, 181, 202), + (163, 157, 133), (150, 140, 141), (137, 123, 149), (123, 109, 98), + (89, 55, 69), (68, 29, 58), (69, 26, 54), (69, 26, 54), + (69, 26, 54), (69, 26, 54), (70, 29, 52), (72, 33, 51), + (87, 71, 48), (123, 118, 54), (165, 152, 40), (191, 184, 34), + (211, 196, 45), (210, 203, 47), (210, 210, 50), (216, 191, 49), + (216, 186, 40), (203, 176, 33), (182, 156, 33), (143, 127, 39), + (104, 93, 47), (74, 35, 53), (69, 26, 54), (69, 26, 54), + (69, 26, 54), (69, 26, 54), (72, 33, 51), (101, 73, 23), + (116, 96, 33), (114, 101, 44), (112, 106, 56), (36, 142, 42), + (30, 98, 97), (23, 61, 100), (36, 56, 81), (53, 36, 80), + (65, 28, 61), (66, 29, 60), (68, 33, 65), (66, 29, 60), + (67, 28, 57), (69, 26, 54), (69, 26, 54), (66, 27, 54), + (56, 27, 55), (51, 14, 58), (47, 9, 58), (53, 11, 59), + (54, 12, 60), (55, 11, 60), (55, 11, 60), (59, 10, 57), + (59, 12, 54), (67, 22, 51), (69, 26, 54), (66, 27, 54), + (56, 26, 52), (51, 14, 58), (55, 25, 51), (53, 30, 50), + (44, 33, 29), (24, 26, 47), (19, 25, 51), (23, 24, 44), + (50, 28, 49), (67, 28, 57), (76, 35, 53), (71, 53, 29), + (76, 50, 13), (64, 40, 12), (53, 23, 31), (60, 12, 52), + (59, 10, 55), (59, 10, 55), (59, 10, 55), (59, 10, 57), + (59, 10, 57), (59, 10, 55), (59, 12, 54), (57, 25, 49), + (57, 22, 44), (57, 22, 44), (57, 24, 45), (51, 31, 42), + (27, 24, 45), (18, 25, 53), (14, 41, 84), (15, 58, 77), + (20, 61, 105), (37, 40, 95), (36, 35, 93), (36, 37, 91), + (37, 38, 92), (48, 35, 89), (53, 30, 74), (52, 30, 51), + (53, 32, 47), (49, 29, 38), (52, 29, 35), (53, 24, 29) + ), + +// 269 Apophysis-040427-51satPhlox +((137, 75, 14), (98, 74, 46), (91, 85, 80), (84, 97, 114), + (64, 79, 96), (44, 61, 79), (36, 57, 78), (28, 54, 77), + (81, 64, 46), (95, 67, 39), (110, 71, 32), (155, 89, 23), + (200, 107, 14), (186, 123, 59), (173, 140, 105), (170, 145, 116), + (168, 150, 128), (179, 219, 255), (164, 205, 244), (150, 192, 234), + (130, 187, 244), (111, 183, 255), (106, 184, 255), (102, 186, 255), + (35, 157, 255), (29, 150, 255), (23, 144, 255), (40, 152, 255), + (57, 160, 255), (61, 156, 248), (65, 153, 242), (55, 158, 253), + (40, 164, 254), (19, 152, 255), (22, 152, 255), (25, 152, 255), + (49, 163, 255), (73, 175, 255), (86, 180, 255), (99, 186, 255), + (137, 207, 255), (144, 207, 254), (151, 207, 254), (131, 203, 253), + (112, 199, 253), (108, 192, 254), (105, 185, 255), (80, 158, 233), + (17, 111, 201), (1, 78, 150), (1, 67, 133), (2, 56, 116), + (25, 97, 169), (49, 138, 222), (79, 154, 228), (110, 171, 234), + (210, 232, 253), (232, 243, 253), (255, 255, 253), (249, 251, 254), + (244, 247, 255), (224, 242, 255), (205, 238, 255), (203, 243, 251), + (197, 241, 254), (198, 235, 254), (169, 212, 248), (140, 190, 243), + (129, 175, 222), (119, 161, 201), (110, 118, 131), (96, 80, 65), + (17, 18, 22), (9, 37, 67), (1, 56, 112), (1, 79, 160), + (1, 102, 208), (0, 110, 224), (0, 118, 241), (0, 137, 255), + (2, 125, 254), (1, 100, 202), (1, 74, 152), (2, 49, 103), + (7, 36, 71), (12, 24, 40), (0, 10, 22), (1, 9, 22), + (33, 23, 13), (47, 30, 13), (62, 38, 14), (71, 45, 19), + (80, 53, 24), (110, 67, 25), (112, 67, 25), (114, 67, 23), + (121, 68, 16), (119, 75, 30), (124, 83, 38), (129, 91, 46), + (139, 115, 87), (149, 139, 129), (118, 136, 150), (109, 144, 174), + (71, 114, 156), (76, 107, 138), (82, 100, 120), (89, 92, 96), + (97, 85, 73), (94, 70, 42), (106, 68, 23), (77, 51, 24), + (61, 30, 1), (31, 15, 0), (24, 11, 0), (17, 8, 1), + (9, 4, 0), (0, 0, 0), (0, 0, 0), (1, 1, 1), + (0, 17, 43), (8, 44, 84), (16, 71, 125), (15, 85, 154), + (15, 100, 183), (10, 111, 215), (9, 133, 255), (35, 133, 232), + (68, 150, 234), (85, 145, 207), (88, 136, 185), (92, 128, 164), + (92, 117, 139), (55, 63, 74), (37, 36, 34), (18, 15, 10), + (2, 1, 0), (1, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (7, 4, 0), (12, 8, 0), (34, 17, 1), + (50, 26, 0), (89, 60, 30), (93, 70, 45), (98, 80, 60), + (113, 102, 98), (98, 112, 123), (94, 110, 125), (99, 98, 96), + (64, 51, 42), (56, 46, 37), (49, 42, 32), (30, 26, 25), + (31, 32, 34), (1, 35, 73), (0, 60, 118), (0, 82, 168), + (0, 105, 214), (0, 139, 255), (18, 145, 255), (36, 152, 255), + (47, 162, 255), (58, 168, 255), (64, 170, 254), (70, 160, 248), + (38, 130, 217), (31, 118, 198), (24, 106, 180), (48, 101, 153), + (62, 97, 129), (60, 65, 69), (77, 51, 24), (66, 31, 1), + (62, 28, 0), (58, 26, 1), (53, 25, 1), (44, 23, 2), + (36, 17, 0), (39, 18, 1), (40, 26, 13), (53, 40, 23), + (58, 63, 69), (58, 67, 78), (58, 71, 87), (43, 82, 123), + (20, 70, 119), (1, 75, 150), (6, 87, 168), (0, 91, 186), + (13, 106, 202), (37, 135, 232), (73, 161, 250), (112, 198, 255), + (144, 216, 254), (181, 225, 254), (187, 236, 253), (189, 234, 253), + (191, 233, 255), (195, 226, 255), (201, 240, 255), (225, 248, 254), + (250, 254, 255), (224, 240, 255), (206, 231, 253), (183, 222, 255), + (146, 208, 255), (102, 169, 237), (33, 127, 223), (0, 102, 205), + (3, 82, 161), (14, 56, 98), (30, 47, 63), (14, 17, 22), + (0, 8, 21), (1, 4, 13), (1, 4, 13), (0, 7, 15), + (10, 20, 30), (19, 52, 85), (35, 92, 147), (35, 107, 181), + (100, 161, 218), (119, 169, 220), (112, 165, 219), (111, 147, 183), + (129, 115, 104), (99, 83, 68), (106, 66, 31), (70, 41, 11), + (64, 30, 2), (59, 28, 0), (64, 31, 0), (83, 45, 6), + (113, 66, 22), (115, 67, 18), (110, 66, 17), (70, 34, 0), + (49, 23, 0), (23, 11, 0), (8, 3, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (7, 3, 0), + (11, 6, 2), (35, 28, 20), (50, 43, 35), (87, 77, 67), + (102, 106, 109), (119, 152, 187), (190, 214, 238), (150, 185, 223) + ), + +// 270 Apophysis-040427-51SnikRchg +((234, 180, 156), (154, 82, 60), (130, 60, 45), (107, 39, 30), + (82, 29, 32), (57, 19, 34), (58, 19, 36), (59, 20, 38), + (102, 56, 66), (146, 87, 75), (191, 118, 85), (191, 119, 87), + (191, 120, 90), (177, 106, 83), (164, 92, 77), (161, 70, 64), + (158, 49, 52), (184, 18, 56), (191, 22, 75), (198, 27, 95), + (206, 64, 130), (215, 102, 166), (202, 122, 153), (190, 142, 140), + (145, 99, 101), (105, 65, 76), (66, 31, 51), (49, 20, 35), + (32, 9, 19), (43, 12, 28), (54, 16, 37), (82, 44, 59), + (133, 75, 74), (209, 131, 95), (226, 154, 104), (243, 178, 114), + (246, 201, 114), (250, 224, 114), (250, 227, 125), (251, 231, 136), + (244, 225, 166), (244, 228, 202), (245, 232, 239), (249, 243, 242), + (254, 255, 245), (252, 250, 228), (250, 246, 211), (243, 238, 182), + (231, 207, 147), (203, 142, 113), (197, 130, 103), (191, 119, 94), + (169, 68, 76), (148, 17, 59), (128, 24, 53), (108, 31, 47), + (42, 11, 17), (38, 9, 14), (34, 7, 12), (67, 9, 26), + (101, 12, 40), (119, 28, 33), (137, 44, 27), (142, 45, 28), + (137, 54, 84), (154, 118, 118), (187, 130, 152), (221, 142, 187), + (221, 134, 185), (222, 127, 183), (242, 129, 149), (204, 112, 125), + (212, 18, 55), (208, 15, 54), (204, 13, 54), (201, 13, 54), + (199, 14, 55), (201, 14, 54), (203, 14, 54), (200, 26, 51), + (173, 84, 52), (161, 66, 48), (172, 45, 50), (183, 24, 52), + (180, 19, 41), (177, 14, 31), (185, 15, 44), (188, 17, 69), + (172, 141, 149), (187, 146, 145), (202, 152, 141), (198, 142, 127), + (194, 133, 114), (196, 120, 96), (185, 88, 79), (161, 31, 69), + (103, 26, 78), (25, 60, 64), (26, 34, 42), (27, 9, 21), + (26, 9, 19), (25, 10, 17), (15, 5, 16), (2, 6, 7), + (4, 13, 22), (12, 11, 21), (20, 10, 21), (20, 8, 22), + (21, 7, 24), (15, 9, 23), (11, 8, 25), (20, 5, 34), + (41, 8, 55), (98, 66, 89), (113, 85, 105), (129, 105, 121), + (155, 125, 135), (99, 129, 181), (88, 142, 170), (100, 155, 176), + (190, 225, 159), (206, 211, 147), (222, 198, 136), (229, 199, 137), + (236, 200, 138), (235, 171, 123), (206, 150, 123), (190, 195, 129), + (197, 233, 161), (168, 218, 241), (163, 217, 240), (159, 217, 239), + (155, 221, 233), (154, 215, 199), (192, 227, 171), (169, 212, 140), + (200, 140, 112), (197, 126, 99), (194, 113, 86), (197, 69, 72), + (200, 25, 58), (201, 16, 47), (198, 16, 41), (192, 15, 35), + (191, 8, 39), (195, 17, 49), (199, 16, 49), (203, 15, 50), + (202, 14, 49), (201, 14, 45), (202, 16, 39), (208, 13, 43), + (220, 24, 62), (218, 29, 68), (217, 35, 75), (209, 96, 82), + (216, 135, 79), (219, 121, 82), (234, 80, 88), (222, 31, 82), + (222, 25, 78), (228, 90, 88), (233, 119, 93), (238, 148, 98), + (246, 163, 111), (243, 157, 122), (238, 195, 140), (252, 214, 165), + (233, 157, 203), (226, 166, 187), (220, 175, 172), (218, 166, 168), + (200, 172, 171), (194, 162, 163), (162, 185, 133), (170, 211, 132), + (183, 218, 150), (210, 232, 167), (231, 202, 222), (224, 240, 253), + (238, 224, 224), (228, 238, 177), (237, 212, 156), (252, 195, 128), + (241, 165, 105), (239, 160, 102), (238, 156, 100), (235, 154, 99), + (233, 147, 98), (203, 126, 100), (160, 97, 90), (107, 72, 78), + (88, 56, 80), (96, 61, 94), (80, 114, 162), (98, 173, 196), + (159, 211, 233), (169, 215, 239), (194, 237, 194), (192, 231, 166), + (204, 228, 152), (192, 227, 171), (187, 225, 244), (176, 227, 246), + (180, 217, 243), (170, 202, 227), (185, 158, 167), (178, 152, 155), + (123, 159, 123), (130, 197, 104), (109, 185, 110), (106, 152, 123), + (99, 172, 187), (109, 213, 206), (133, 216, 234), (142, 217, 238), + (148, 215, 232), (138, 215, 233), (130, 215, 235), (116, 205, 223), + (115, 196, 217), (109, 153, 188), (171, 148, 156), (176, 156, 167), + (163, 211, 163), (151, 216, 186), (154, 224, 232), (154, 225, 243), + (167, 230, 248), (161, 226, 244), (155, 223, 242), (153, 224, 242), + (152, 223, 225), (163, 225, 184), (161, 216, 132), (143, 192, 110), + (116, 140, 104), (108, 77, 83), (111, 54, 61), (96, 47, 32), + (109, 22, 28), (106, 54, 41), (98, 47, 64), (100, 32, 73), + (100, 69, 84), (120, 82, 103), (163, 103, 115), (180, 113, 105), + (180, 130, 97), (198, 131, 102), (204, 139, 101), (205, 131, 94), + (211, 130, 100), (230, 141, 101), (245, 139, 125), (233, 191, 166) + ), + +// 271 Apophysis-040427-51SmwhrDream +((40, 44, 29), (132, 60, 64), (142, 89, 47), (153, 119, 30), + (173, 136, 35), (193, 153, 40), (186, 153, 59), (179, 153, 78), + (193, 153, 118), (188, 139, 90), (183, 125, 62), (173, 91, 31), + (163, 58, 0), (170, 100, 47), (177, 143, 95), (184, 152, 111), + (192, 162, 128), (189, 164, 142), (177, 166, 141), (166, 169, 140), + (159, 167, 144), (153, 166, 148), (157, 162, 143), (161, 158, 139), + (169, 160, 93), (134, 144, 59), (100, 128, 26), (91, 107, 14), + (82, 86, 2), (89, 76, 1), (96, 67, 1), (75, 64, 2), + (64, 64, 2), (63, 49, 2), (71, 48, 1), (79, 47, 0), + (75, 43, 0), (71, 39, 0), (72, 35, 3), (73, 31, 6), + (13, 10, 5), (7, 5, 3), (1, 1, 1), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (1, 0, 0), + (2, 1, 0), (26, 19, 1), (52, 45, 1), (78, 71, 1), + (108, 104, 55), (138, 138, 110), (160, 158, 138), (182, 178, 166), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (252, 230, 204), + (249, 206, 153), (239, 189, 149), (229, 173, 146), (215, 195, 160), + (212, 193, 160), (173, 163, 101), (145, 137, 55), (117, 112, 10), + (124, 104, 5), (131, 97, 0), (140, 103, 12), (143, 124, 32), + (143, 105, 68), (122, 108, 41), (101, 111, 15), (96, 103, 8), + (92, 96, 1), (97, 91, 4), (103, 86, 8), (124, 81, 2), + (136, 67, 0), (171, 73, 2), (161, 88, 11), (151, 103, 21), + (161, 127, 27), (172, 151, 34), (177, 151, 76), (143, 146, 93), + (137, 60, 70), (125, 55, 60), (114, 50, 51), (104, 47, 27), + (94, 45, 4), (69, 51, 5), (46, 34, 12), (27, 39, 1), + (40, 48, 1), (74, 76, 1), (68, 80, 0), (63, 85, 0), + (53, 80, 0), (44, 75, 0), (35, 84, 3), (15, 79, 1), + (28, 46, 0), (31, 61, 6), (34, 76, 12), (39, 78, 10), + (45, 81, 9), (58, 80, 7), (65, 84, 3), (65, 104, 21), + (71, 109, 26), (70, 70, 0), (71, 75, 1), (73, 80, 2), + (137, 125, 25), (102, 104, 7), (72, 86, 0), (47, 61, 0), + (54, 53, 0), (67, 50, 1), (80, 47, 2), (84, 50, 2), + (89, 53, 3), (97, 49, 0), (100, 50, 0), (95, 56, 0), + (80, 64, 5), (83, 77, 0), (85, 88, 0), (87, 99, 1), + (94, 87, 0), (105, 79, 4), (121, 94, 3), (126, 84, 2), + (81, 56, 0), (67, 57, 2), (54, 59, 5), (47, 64, 7), + (41, 69, 10), (40, 80, 9), (39, 95, 30), (24, 98, 73), + (4, 89, 58), (63, 80, 10), (72, 87, 7), (81, 94, 4), + (100, 94, 0), (125, 95, 0), (131, 117, 8), (170, 159, 5), + (195, 173, 12), (199, 176, 39), (203, 180, 66), (185, 167, 85), + (169, 155, 58), (139, 129, 32), (91, 114, 24), (86, 109, 19), + (101, 121, 22), (206, 143, 4), (222, 162, 6), (239, 181, 9), + (219, 203, 6), (180, 167, 9), (129, 124, 4), (97, 100, 0), + (63, 110, 32), (54, 108, 53), (45, 106, 75), (85, 135, 100), + (116, 129, 76), (132, 128, 81), (141, 120, 31), (130, 101, 1), + (163, 111, 2), (190, 121, 0), (201, 117, 1), (221, 102, 0), + (194, 102, 1), (158, 86, 1), (134, 74, 1), (121, 84, 31), + (136, 46, 58), (138, 58, 29), (140, 70, 1), (143, 85, 1), + (179, 106, 1), (228, 153, 10), (255, 181, 20), (253, 197, 22), + (255, 234, 45), (250, 234, 60), (208, 180, 141), (215, 168, 152), + (240, 183, 114), (240, 200, 25), (245, 180, 14), (218, 116, 15), + (175, 99, 3), (141, 97, 2), (140, 97, 5), (148, 105, 1), + (185, 103, 1), (228, 112, 3), (234, 108, 6), (252, 142, 17), + (228, 132, 12), (197, 141, 28), (183, 168, 87), (170, 150, 123), + (163, 156, 138), (139, 152, 124), (140, 134, 72), (161, 131, 19), + (176, 137, 10), (166, 118, 7), (147, 113, 3), (141, 90, 1), + (127, 91, 3), (118, 81, 1), (104, 59, 2), (78, 55, 1), + (31, 38, 0), (7, 30, 1), (0, 4, 0), (0, 1, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (1, 3, 0), + (7, 10, 0), (18, 25, 7), (64, 35, 5), (97, 39, 2), + (135, 56, 0), (146, 48, 3), (127, 44, 0), (80, 37, 2), + (60, 7, 13), (24, 12, 0), (8, 1, 0), (2, 1, 0), + (1, 1, 1), (0, 0, 0), (0, 0, 0), (0, 0, 2), + (1, 0, 2), (1, 1, 1), (7, 15, 2), (16, 30, 4) + ), + +// 272 Apophysis-040427-51eyepuzzl +((68, 193, 221), (51, 242, 255), (48, 241, 208), (46, 241, 162), + (43, 246, 96), (41, 251, 30), (25, 223, 32), (9, 195, 34), + (0, 226, 97), (0, 228, 159), (0, 231, 221), (0, 199, 201), + (0, 168, 181), (58, 109, 130), (117, 51, 79), (127, 32, 61), + (137, 14, 43), (198, 7, 50), (217, 19, 46), (237, 31, 43), + (195, 51, 21), (153, 71, 0), (127, 53, 18), (101, 35, 36), + (47, 112, 130), (59, 137, 153), (71, 163, 176), (35, 153, 165), + (0, 143, 154), (2, 123, 144), (5, 104, 135), (45, 68, 112), + (126, 8, 157), (204, 4, 190), (223, 18, 206), (242, 33, 222), + (219, 32, 205), (197, 31, 189), (184, 22, 205), (172, 14, 221), + (138, 11, 216), (144, 7, 187), (151, 3, 159), (155, 23, 110), + (159, 44, 61), (141, 65, 40), (124, 87, 19), (134, 103, 39), + (143, 121, 20), (150, 133, 17), (151, 135, 16), (153, 137, 16), + (149, 133, 15), (146, 129, 15), (144, 127, 15), (143, 125, 15), + (116, 107, 12), (112, 99, 13), (108, 92, 14), (102, 88, 9), + (96, 85, 5), (98, 85, 6), (101, 85, 7), (101, 90, 10), + (107, 92, 7), (107, 90, 12), (115, 93, 12), (123, 97, 13), + (118, 97, 11), (113, 97, 9), (114, 102, 4), (115, 94, 3), + (110, 96, 8), (120, 105, 8), (131, 114, 8), (150, 139, 8), + (169, 164, 8), (163, 174, 4), (158, 184, 0), (135, 221, 28), + (154, 207, 15), (168, 155, 0), (143, 130, 4), (118, 105, 9), + (113, 102, 6), (109, 99, 4), (93, 112, 0), (44, 108, 21), + (11, 174, 121), (26, 159, 109), (42, 145, 98), (61, 137, 68), + (80, 129, 38), (131, 124, 56), (159, 127, 44), (220, 150, 36), + (212, 207, 45), (223, 187, 31), (195, 164, 29), (168, 141, 28), + (164, 142, 32), (161, 144, 36), (158, 137, 20), (158, 138, 17), + (152, 133, 15), (147, 128, 14), (142, 124, 14), (134, 117, 14), + (127, 111, 15), (113, 97, 9), (97, 101, 17), (63, 109, 44), + (16, 136, 74), (0, 136, 103), (1, 138, 74), (3, 141, 46), + (12, 152, 21), (61, 135, 0), (71, 151, 2), (51, 144, 14), + (12, 141, 121), (26, 128, 102), (40, 115, 84), (56, 94, 61), + (72, 73, 39), (99, 90, 11), (102, 87, 6), (103, 88, 5), + (103, 88, 5), (105, 91, 3), (109, 92, 1), (114, 93, 0), + (128, 101, 0), (138, 119, 0), (143, 123, 11), (142, 124, 12), + (124, 104, 15), (107, 125, 31), (90, 146, 47), (87, 150, 64), + (84, 154, 82), (51, 228, 62), (13, 235, 10), (28, 203, 2), + (74, 158, 8), (140, 116, 20), (142, 122, 17), (145, 128, 14), + (149, 129, 14), (144, 127, 13), (142, 124, 14), (122, 101, 18), + (92, 93, 15), (68, 91, 20), (44, 90, 26), (16, 114, 65), + (19, 172, 108), (0, 204, 135), (1, 251, 162), (16, 227, 174), + (17, 211, 138), (56, 212, 17), (53, 189, 8), (51, 166, 0), + (103, 167, 0), (116, 179, 4), (129, 144, 0), (126, 107, 4), + (117, 105, 0), (128, 113, 5), (140, 122, 10), (143, 125, 15), + (144, 127, 13), (144, 126, 16), (137, 118, 15), (125, 104, 21), + (126, 87, 30), (152, 21, 26), (136, 20, 20), (113, 39, 36), + (108, 69, 26), (105, 87, 13), (103, 92, 10), (106, 91, 8), + (105, 86, 9), (105, 86, 8), (105, 86, 7), (106, 91, 6), + (117, 86, 3), (113, 84, 18), (111, 44, 2), (89, 70, 2), + (80, 70, 0), (89, 74, 5), (94, 80, 0), (98, 86, 10), + (80, 80, 6), (50, 80, 8), (12, 125, 0), (29, 137, 17), + (42, 131, 23), (74, 130, 29), (77, 123, 15), (96, 96, 10), + (101, 93, 10), (116, 100, 13), (122, 112, 50), (121, 118, 63), + (88, 129, 147), (55, 165, 192), (95, 153, 255), (44, 77, 193), + (106, 40, 200), (135, 28, 220), (193, 9, 243), (231, 36, 254), + (229, 18, 221), (249, 7, 154), (191, 0, 100), (244, 107, 39), + (251, 138, 42), (250, 226, 12), (250, 255, 38), (219, 255, 51), + (170, 238, 41), (156, 230, 13), (174, 156, 18), (163, 149, 14), + (158, 138, 17), (156, 135, 16), (155, 136, 16), (152, 133, 15), + (150, 135, 10), (146, 141, 15), (150, 133, 15), (135, 124, 9), + (124, 129, 9), (101, 154, 50), (68, 181, 91), (50, 243, 124), + (85, 238, 121), (71, 203, 83), (131, 218, 28), (176, 191, 38), + (209, 185, 37), (195, 185, 113), (200, 188, 114), (225, 126, 157), + (247, 23, 122), (192, 100, 37), (166, 114, 31), (163, 103, 0), + (154, 114, 29), (128, 123, 42), (159, 147, 75), (87, 221, 255) + ), + +// 273 Apophysis-040427-51SpherInBlm +((144, 139, 107), (30, 25, 29), (38, 32, 37), (46, 39, 46), + (44, 43, 51), (43, 47, 56), (41, 50, 56), (39, 54, 57), + (47, 54, 62), (44, 58, 62), (42, 62, 63), (49, 80, 70), + (57, 99, 77), (79, 130, 119), (101, 161, 161), (111, 176, 177), + (121, 192, 194), (139, 224, 219), (132, 218, 207), (125, 212, 195), + (122, 200, 160), (119, 188, 125), (110, 167, 108), (102, 147, 92), + (82, 64, 62), (69, 42, 54), (57, 21, 47), (42, 26, 32), + (28, 32, 17), (28, 31, 17), (29, 31, 17), (27, 21, 9), + (29, 21, 8), (31, 29, 16), (41, 34, 16), (51, 39, 17), + (60, 47, 23), (70, 56, 29), (91, 67, 35), (113, 79, 41), + (130, 113, 85), (167, 119, 86), (205, 126, 87), (197, 137, 85), + (189, 148, 84), (164, 139, 89), (140, 130, 95), (106, 106, 108), + (113, 119, 91), (152, 148, 100), (177, 156, 101), (202, 164, 102), + (206, 156, 101), (211, 149, 100), (197, 144, 99), (184, 139, 98), + (122, 114, 125), (117, 118, 121), (113, 122, 117), (122, 143, 142), + (131, 165, 167), (142, 179, 179), (154, 193, 192), (212, 199, 191), + (229, 237, 213), (138, 218, 215), (128, 192, 198), (119, 167, 181), + (108, 160, 167), (98, 154, 153), (86, 150, 126), (81, 139, 115), + (96, 149, 155), (111, 169, 174), (126, 189, 194), (125, 194, 194), + (125, 200, 195), (125, 203, 189), (125, 207, 184), (177, 217, 154), + (211, 198, 145), (231, 201, 149), (209, 211, 154), (187, 221, 160), + (169, 216, 160), (152, 212, 161), (122, 207, 188), (121, 204, 184), + (76, 117, 119), (56, 89, 80), (37, 62, 41), (34, 49, 30), + (32, 36, 19), (24, 28, 14), (16, 22, 12), (12, 10, 11), + (15, 11, 12), (24, 22, 25), (30, 28, 33), (37, 34, 41), + (37, 35, 42), (38, 37, 43), (36, 36, 38), (23, 23, 25), + (16, 21, 15), (14, 18, 13), (13, 15, 12), (13, 14, 12), + (13, 13, 13), (13, 12, 8), (22, 18, 7), (22, 18, 7), + (17, 17, 7), (12, 11, 7), (12, 11, 7), (12, 11, 7), + (10, 10, 8), (9, 9, 7), (10, 10, 8), (11, 11, 9), + (11, 12, 7), (10, 10, 7), (10, 9, 7), (11, 8, 7), + (12, 8, 7), (12, 8, 7), (14, 8, 8), (14, 8, 8), + (13, 11, 12), (34, 39, 45), (47, 46, 54), (61, 53, 64), + (125, 83, 107), (169, 124, 105), (221, 115, 129), (212, 131, 137), + (199, 178, 125), (174, 192, 141), (150, 206, 157), (141, 216, 179), + (133, 227, 201), (141, 233, 220), (137, 227, 215), (126, 205, 199), + (126, 187, 188), (85, 91, 107), (77, 90, 103), (69, 89, 100), + (54, 80, 81), (56, 73, 81), (56, 66, 76), (54, 64, 74), + (48, 63, 70), (51, 60, 69), (55, 57, 69), (45, 55, 64), + (58, 48, 56), (68, 75, 44), (80, 80, 46), (68, 67, 37), + (64, 64, 36), (55, 53, 64), (51, 58, 67), (47, 64, 71), + (47, 64, 71), (50, 65, 72), (53, 77, 77), (71, 80, 89), + (123, 121, 83), (153, 139, 90), (184, 158, 97), (170, 182, 108), + (142, 196, 147), (107, 178, 148), (82, 128, 126), (69, 102, 109), + (50, 71, 76), (43, 40, 47), (22, 26, 25), (19, 21, 18), + (20, 30, 21), (21, 31, 23), (24, 35, 29), (31, 47, 46), + (61, 75, 86), (69, 95, 104), (77, 116, 123), (102, 161, 159), + (118, 177, 171), (128, 190, 187), (141, 196, 164), (177, 219, 156), + (202, 218, 156), (215, 189, 138), (220, 188, 137), (216, 186, 134), + (209, 182, 135), (200, 176, 116), (204, 170, 98), (196, 172, 112), + (165, 145, 147), (124, 165, 133), (109, 167, 129), (90, 137, 103), + (71, 113, 77), (64, 110, 84), (72, 113, 81), (79, 116, 83), + (85, 131, 105), (100, 160, 160), (112, 194, 171), (118, 191, 162), + (104, 177, 147), (88, 135, 101), (56, 85, 83), (47, 57, 66), + (31, 41, 43), (21, 31, 20), (18, 28, 19), (15, 15, 7), + (13, 12, 8), (16, 12, 13), (22, 18, 19), (23, 29, 17), + (27, 44, 28), (30, 51, 36), (31, 50, 44), (39, 48, 55), + (47, 46, 54), (51, 42, 47), (52, 52, 40), (67, 60, 32), + (49, 51, 30), (33, 50, 44), (37, 61, 48), (39, 70, 52), + (50, 78, 55), (57, 80, 86), (95, 96, 98), (94, 102, 104), + (97, 90, 108), (65, 79, 90), (59, 56, 67), (48, 61, 70), + (44, 69, 63), (51, 80, 75), (62, 94, 93), (80, 133, 115), + (116, 173, 164), (147, 196, 175), (186, 231, 172), (213, 213, 201), + (200, 226, 187), (179, 224, 169), (124, 200, 162), (112, 182, 146) + ), + +// 274 Apophysis-040427-51SunrisSpacTim +((13, 63, 152), (76, 120, 215), (111, 148, 198), (147, 176, 182), + (169, 191, 176), (191, 207, 171), (193, 215, 166), (195, 223, 162), + (205, 235, 149), (219, 242, 138), (233, 249, 127), (234, 232, 119), + (235, 216, 111), (236, 235, 115), (237, 255, 119), (241, 246, 115), + (246, 238, 111), (236, 169, 64), (219, 158, 63), (202, 148, 62), + (177, 131, 68), (153, 114, 75), (138, 113, 100), (123, 112, 126), + (120, 159, 224), (123, 161, 231), (126, 164, 239), (128, 160, 213), + (131, 156, 187), (112, 139, 177), (94, 123, 167), (135, 110, 79), + (154, 129, 62), (176, 159, 115), (173, 181, 150), (170, 203, 186), + (154, 187, 199), (139, 171, 212), (140, 174, 208), (142, 177, 205), + (169, 201, 212), (161, 198, 199), (154, 195, 187), (155, 176, 170), + (157, 158, 153), (166, 144, 124), (175, 131, 96), (170, 120, 59), + (186, 122, 24), (128, 76, 0), (119, 67, 0), (111, 59, 1), + (100, 53, 16), (90, 47, 31), (84, 65, 58), (79, 83, 86), + (43, 87, 182), (62, 111, 212), (82, 136, 242), (96, 144, 239), + (110, 152, 236), (114, 153, 235), (118, 155, 235), (125, 164, 223), + (127, 167, 218), (161, 195, 207), (186, 195, 165), (212, 195, 123), + (221, 189, 94), (230, 183, 65), (227, 169, 59), (221, 154, 47), + (195, 132, 26), (181, 119, 13), (168, 107, 0), (167, 105, 0), + (167, 103, 0), (157, 97, 7), (148, 92, 15), (131, 104, 61), + (168, 133, 93), (189, 221, 154), (204, 236, 138), (219, 252, 122), + (233, 251, 118), (248, 250, 115), (243, 230, 90), (245, 193, 84), + (229, 167, 56), (207, 154, 60), (185, 142, 64), (163, 133, 63), + (141, 125, 63), (128, 112, 96), (93, 105, 155), (49, 99, 184), + (60, 104, 199), (77, 121, 216), (79, 123, 218), (81, 125, 220), + (78, 122, 217), (75, 119, 214), (74, 118, 213), (72, 118, 212), + (53, 94, 184), (65, 84, 137), (78, 74, 91), (82, 59, 68), + (87, 45, 46), (66, 27, 58), (56, 14, 54), (47, 12, 52), + (38, 16, 98), (106, 91, 88), (114, 94, 89), (123, 98, 91), + (130, 125, 106), (143, 151, 153), (147, 169, 180), (143, 169, 184), + (145, 124, 105), (162, 133, 91), (180, 142, 77), (194, 161, 72), + (208, 181, 68), (211, 195, 120), (191, 209, 151), (183, 206, 164), + (142, 194, 172), (159, 171, 69), (171, 166, 64), (183, 161, 60), + (210, 163, 55), (205, 141, 33), (187, 125, 14), (177, 114, 9), + (124, 77, 9), (94, 53, 34), (64, 29, 59), (49, 18, 67), + (34, 7, 76), (2, 30, 93), (7, 14, 105), (0, 32, 130), + (4, 47, 141), (44, 88, 183), (55, 99, 194), (67, 111, 206), + (82, 124, 208), (94, 139, 240), (111, 153, 239), (81, 129, 205), + (107, 97, 85), (110, 96, 69), (114, 95, 53), (126, 75, 18), + (110, 60, 1), (96, 47, 0), (81, 29, 18), (81, 38, 29), + (72, 43, 29), (93, 42, 21), (97, 47, 15), (102, 53, 10), + (111, 61, 10), (123, 73, 4), (141, 85, 0), (161, 99, 0), + (150, 93, 3), (146, 85, 4), (142, 78, 6), (120, 68, 10), + (83, 43, 33), (57, 38, 60), (9, 34, 116), (17, 61, 156), + (16, 64, 162), (21, 65, 160), (22, 66, 161), (20, 64, 159), + (19, 56, 136), (29, 36, 106), (47, 45, 82), (56, 46, 83), + (85, 46, 31), (95, 53, 21), (106, 60, 11), (130, 77, 7), + (144, 87, 6), (147, 97, 2), (156, 99, 0), (162, 102, 0), + (156, 97, 0), (153, 97, 2), (142, 92, 3), (136, 103, 10), + (145, 95, 46), (135, 101, 73), (105, 96, 79), (84, 98, 124), + (67, 102, 170), (54, 101, 193), (49, 102, 208), (49, 93, 188), + (43, 87, 182), (21, 83, 202), (14, 78, 214), (2, 58, 181), + (22, 66, 161), (24, 71, 163), (41, 75, 165), (75, 73, 122), + (102, 83, 85), (104, 75, 57), (112, 80, 29), (94, 71, 19), + (91, 47, 22), (84, 42, 26), (81, 44, 26), (84, 46, 27), + (98, 53, 32), (127, 74, 58), (138, 103, 81), (132, 115, 97), + (132, 127, 89), (130, 117, 82), (117, 110, 82), (119, 100, 44), + (128, 72, 25), (103, 49, 15), (78, 41, 35), (62, 27, 57), + (61, 55, 69), (110, 66, 57), (124, 85, 54), (133, 104, 88), + (118, 105, 123), (100, 134, 198), (101, 143, 225), (111, 155, 228), + (127, 164, 190), (145, 166, 161), (179, 149, 87), (206, 160, 62), + (216, 152, 44), (202, 138, 30), (192, 128, 18), (183, 125, 17), + (192, 128, 30), (201, 137, 31), (212, 148, 42), (219, 151, 42), + (214, 146, 35), (204, 141, 10), (162, 124, 41), (186, 134, 25) + ), + +// 275 Apophysis-040427-51synaps +((170, 150, 97), (201, 224, 56), (223, 239, 55), (246, 255, 54), + (246, 255, 66), (246, 255, 78), (231, 247, 70), (216, 239, 63), + (185, 180, 54), (202, 193, 60), (219, 206, 66), (229, 220, 87), + (239, 235, 109), (241, 222, 90), (243, 210, 71), (217, 192, 65), + (192, 175, 59), (204, 51, 71), (210, 27, 107), (216, 3, 143), + (206, 43, 105), (197, 84, 68), (193, 125, 77), (190, 167, 87), + (184, 195, 65), (200, 208, 79), (217, 222, 93), (234, 234, 111), + (252, 247, 129), (247, 242, 133), (242, 237, 137), (204, 209, 83), + (154, 202, 6), (78, 168, 55), (87, 146, 38), (97, 124, 21), + (109, 125, 27), (121, 126, 34), (124, 122, 33), (128, 118, 33), + (150, 167, 65), (188, 193, 83), (226, 219, 102), (237, 236, 164), + (248, 254, 226), (249, 254, 240), (251, 255, 255), (255, 251, 255), + (250, 253, 244), (209, 200, 193), (178, 177, 175), (147, 155, 158), + (153, 114, 118), (159, 74, 79), (159, 80, 82), (160, 86, 85), + (112, 68, 93), (133, 34, 104), (155, 0, 116), (182, 0, 140), + (210, 0, 164), (223, 5, 172), (236, 10, 180), (252, 20, 228), + (246, 8, 241), (238, 7, 173), (246, 17, 123), (254, 27, 73), + (248, 17, 50), (243, 7, 27), (235, 6, 37), (229, 36, 91), + (225, 183, 219), (230, 210, 227), (236, 238, 235), (224, 192, 236), + (213, 147, 237), (217, 118, 219), (221, 90, 202), (202, 33, 186), + (189, 52, 158), (167, 156, 170), (172, 171, 183), (177, 187, 197), + (191, 192, 202), (205, 197, 208), (218, 164, 213), (193, 168, 163), + (200, 119, 125), (195, 76, 144), (190, 33, 164), (197, 18, 163), + (205, 4, 162), (217, 0, 145), (198, 0, 149), (197, 0, 134), + (192, 9, 65), (132, 21, 2), (94, 19, 20), (57, 18, 39), + (51, 14, 40), (46, 11, 41), (22, 13, 34), (47, 28, 50), + (32, 37, 75), (32, 31, 76), (33, 26, 77), (40, 21, 87), + (48, 17, 97), (90, 22, 83), (79, 48, 66), (47, 82, 62), + (33, 97, 73), (135, 101, 76), (157, 99, 78), (179, 98, 81), + (184, 155, 95), (203, 154, 122), (174, 151, 97), (130, 109, 54), + (71, 42, 34), (52, 26, 31), (33, 10, 28), (26, 5, 26), + (20, 0, 25), (42, 11, 0), (52, 36, 13), (94, 57, 5), + (68, 72, 13), (58, 86, 2), (56, 75, 15), (54, 64, 29), + (24, 81, 0), (32, 113, 8), (22, 81, 0), (15, 58, 30), + (71, 41, 77), (98, 48, 101), (126, 55, 125), (148, 43, 136), + (171, 32, 147), (176, 10, 144), (169, 18, 125), (139, 71, 94), + (154, 73, 70), (169, 40, 35), (152, 26, 55), (135, 12, 75), + (177, 0, 129), (211, 8, 188), (241, 32, 211), (255, 41, 249), + (255, 46, 234), (242, 34, 215), (229, 23, 196), (231, 1, 161), + (222, 10, 146), (248, 11, 57), (251, 5, 26), (249, 29, 15), + (212, 18, 27), (183, 0, 107), (191, 0, 135), (199, 0, 164), + (198, 9, 171), (203, 23, 172), (175, 41, 166), (152, 66, 127), + (90, 69, 52), (66, 55, 52), (42, 42, 52), (36, 60, 60), + (64, 72, 85), (71, 48, 94), (99, 51, 99), (110, 31, 96), + (113, 28, 147), (127, 23, 122), (150, 4, 105), (163, 0, 116), + (171, 0, 101), (209, 9, 48), (215, 1, 25), (179, 16, 35), + (110, 77, 68), (109, 83, 66), (109, 89, 64), (161, 94, 39), + (172, 142, 18), (145, 126, 57), (141, 86, 83), (170, 13, 120), + (200, 11, 140), (211, 8, 159), (240, 34, 179), (240, 29, 184), + (231, 30, 188), (193, 51, 173), (152, 102, 139), (132, 138, 102), + (80, 162, 122), (43, 120, 150), (45, 108, 97), (37, 79, 93), + (68, 50, 74), (89, 44, 64), (129, 13, 52), (163, 0, 15), + (168, 1, 8), (161, 7, 7), (158, 1, 30), (136, 0, 81), + (140, 22, 116), (148, 76, 140), (123, 123, 161), (93, 181, 185), + (140, 219, 214), (82, 245, 242), (66, 173, 229), (94, 185, 176), + (113, 153, 82), (180, 154, 93), (198, 167, 100), (199, 186, 94), + (213, 187, 126), (240, 217, 147), (211, 155, 138), (151, 125, 134), + (112, 113, 97), (97, 97, 97), (89, 92, 107), (138, 103, 127), + (185, 101, 134), (201, 124, 144), (240, 85, 189), (222, 30, 193), + (189, 20, 171), (174, 0, 156), (151, 0, 118), (112, 4, 105), + (92, 28, 65), (65, 28, 36), (53, 34, 66), (67, 81, 46), + (92, 83, 54), (107, 70, 62), (113, 28, 93), (104, 17, 86), + (76, 6, 69), (53, 22, 56), (66, 47, 33), (80, 56, 30), + (93, 72, 53), (117, 94, 78), (154, 115, 58), (196, 125, 93) + ), + +// 276 Apophysis-040427-51StPeacocl +((18, 8, 193), (33, 37, 48), (45, 21, 35), (58, 5, 23), + (101, 9, 34), (144, 13, 45), (161, 6, 52), (179, 0, 60), + (230, 13, 21), (235, 6, 11), (241, 0, 2), (237, 3, 4), + (234, 6, 7), (237, 46, 13), (241, 86, 20), (232, 95, 37), + (224, 104, 54), (194, 162, 79), (169, 188, 42), (144, 214, 6), + (110, 159, 9), (76, 105, 13), (57, 79, 13), (39, 54, 13), + (10, 4, 0), (5, 2, 0), (0, 1, 0), (0, 2, 0), + (0, 4, 0), (8, 6, 0), (16, 9, 1), (41, 17, 33), + (38, 9, 149), (27, 68, 192), (39, 55, 118), (52, 43, 44), + (49, 58, 33), (46, 73, 22), (53, 70, 20), (61, 67, 19), + (109, 80, 14), (131, 95, 35), (154, 111, 56), (125, 103, 80), + (97, 96, 104), (101, 94, 125), (106, 93, 147), (127, 44, 134), + (74, 4, 137), (0, 16, 224), (28, 13, 223), (56, 10, 222), + (65, 54, 234), (75, 99, 247), (75, 78, 205), (76, 57, 164), + (82, 30, 69), (120, 26, 47), (158, 22, 26), (185, 16, 20), + (213, 10, 14), (220, 7, 13), (228, 4, 12), (228, 3, 9), + (248, 1, 9), (245, 1, 3), (238, 6, 8), (232, 12, 14), + (227, 35, 19), (222, 59, 24), (239, 96, 40), (242, 116, 66), + (218, 166, 212), (193, 116, 189), (169, 67, 167), (147, 79, 114), + (126, 91, 61), (103, 75, 48), (81, 59, 36), (60, 54, 38), + (57, 61, 11), (17, 40, 0), (10, 21, 0), (3, 3, 0), + (2, 2, 0), (1, 1, 1), (8, 0, 0), (31, 0, 0), + (79, 0, 4), (123, 0, 2), (167, 0, 0), (173, 2, 4), + (179, 4, 9), (213, 10, 16), (202, 52, 15), (201, 98, 55), + (169, 146, 50), (221, 85, 71), (238, 135, 65), (255, 185, 60), + (254, 192, 53), (253, 199, 47), (247, 140, 12), (229, 95, 22), + (131, 58, 26), (88, 45, 14), (46, 32, 3), (43, 40, 1), + (41, 48, 0), (22, 52, 0), (36, 80, 5), (52, 137, 80), + (54, 205, 108), (53, 235, 186), (61, 173, 171), (70, 111, 157), + (98, 95, 90), (126, 31, 71), (168, 5, 52), (181, 1, 64), + (198, 5, 10), (206, 2, 5), (214, 0, 0), (201, 15, 0), + (188, 30, 0), (162, 50, 10), (169, 94, 0), (168, 131, 17), + (158, 125, 22), (89, 153, 41), (61, 160, 20), (34, 167, 0), + (59, 181, 60), (101, 184, 92), (70, 181, 113), (75, 220, 187), + (123, 150, 117), (141, 120, 83), (160, 91, 50), (152, 90, 57), + (144, 90, 64), (132, 89, 54), (95, 87, 51), (82, 109, 64), + (54, 109, 70), (96, 102, 0), (121, 94, 3), (147, 86, 6), + (177, 32, 5), (206, 10, 0), (215, 2, 0), (225, 0, 1), + (227, 0, 9), (224, 3, 7), (221, 7, 5), (199, 29, 0), + (220, 61, 5), (240, 74, 0), (239, 74, 29), (255, 82, 14), + (255, 108, 14), (224, 82, 10), (221, 86, 15), (218, 91, 20), + (192, 107, 26), (181, 70, 24), (160, 83, 27), (152, 58, 33), + (76, 5, 11), (70, 5, 5), (65, 6, 0), (47, 0, 0), + (41, 14, 0), (38, 16, 3), (28, 16, 0), (36, 26, 14), + (26, 37, 23), (53, 55, 5), (52, 52, 0), (59, 47, 5), + (56, 46, 11), (68, 24, 25), (81, 55, 40), (121, 59, 36), + (210, 30, 104), (212, 17, 142), (215, 4, 181), (144, 18, 153), + (105, 32, 166), (120, 0, 156), (92, 2, 125), (57, 20, 74), + (53, 4, 25), (106, 0, 14), (138, 0, 7), (158, 0, 0), + (170, 8, 19), (151, 6, 9), (135, 12, 15), (122, 60, 13), + (109, 51, 14), (101, 49, 0), (69, 34, 0), (74, 66, 4), + (76, 77, 11), (60, 109, 30), (52, 107, 68), (54, 83, 61), + (42, 78, 42), (60, 87, 20), (56, 61, 5), (19, 31, 21), + (7, 0, 7), (1, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 1, 0), (1, 0, 0), + (3, 0, 0), (20, 0, 0), (45, 2, 11), (59, 32, 73), + (124, 19, 75), (118, 0, 109), (92, 6, 117), (96, 19, 101), + (102, 42, 104), (99, 77, 63), (131, 88, 45), (112, 97, 38), + (91, 88, 37), (53, 80, 61), (72, 70, 58), (113, 79, 44), + (137, 62, 22), (200, 84, 25), (207, 69, 7), (219, 68, 0), + (216, 80, 22), (205, 82, 48), (222, 60, 81), (182, 81, 63), + (162, 106, 69), (148, 83, 61), (174, 53, 70), (185, 14, 23), + (190, 3, 10), (193, 5, 6), (181, 0, 7), (175, 0, 0), + (171, 0, 0), (147, 0, 0), (87, 16, 34), (131, 5, 27) + ), + +// 277 Apophysis-040427-51TmplWatrs2 +((58, 31, 10), (30, 12, 2), (33, 29, 15), (37, 46, 29), + (47, 48, 28), (58, 50, 27), (60, 55, 26), (63, 60, 25), + (104, 56, 16), (139, 64, 20), (175, 73, 25), (199, 39, 12), + (224, 5, 0), (182, 26, 3), (141, 48, 7), (125, 57, 10), + (110, 67, 14), (102, 61, 29), (83, 40, 15), (65, 20, 1), + (61, 10, 7), (57, 0, 13), (54, 2, 8), (52, 4, 4), + (23, 0, 8), (25, 5, 4), (28, 11, 1), (43, 16, 2), + (59, 22, 4), (75, 36, 7), (92, 50, 10), (127, 51, 15), + (132, 70, 29), (133, 89, 40), (133, 95, 47), (133, 102, 55), + (139, 119, 63), (145, 137, 72), (148, 145, 78), (152, 153, 85), + (189, 154, 88), (213, 145, 83), (237, 137, 78), (201, 132, 80), + (165, 127, 82), (156, 119, 79), (147, 111, 77), (120, 91, 61), + (98, 81, 63), (98, 59, 28), (102, 52, 18), (106, 46, 9), + (117, 64, 21), (128, 82, 33), (132, 84, 34), (137, 87, 36), + (144, 105, 50), (137, 115, 60), (131, 126, 70), (140, 124, 67), + (149, 123, 64), (155, 124, 63), (161, 125, 63), (150, 110, 49), + (153, 98, 44), (167, 104, 51), (168, 104, 47), (169, 105, 44), + (165, 98, 41), (161, 91, 39), (148, 67, 14), (133, 44, 2), + (110, 0, 5), (91, 0, 3), (72, 0, 1), (61, 6, 1), + (50, 12, 1), (52, 20, 4), (55, 28, 7), (61, 39, 16), + (85, 49, 23), (134, 100, 55), (158, 126, 70), (183, 152, 85), + (203, 160, 96), (223, 169, 107), (239, 179, 129), (250, 213, 142), + (236, 166, 107), (213, 136, 80), (190, 107, 53), (181, 100, 46), + (173, 93, 40), (161, 94, 42), (153, 94, 38), (145, 98, 46), + (135, 88, 36), (135, 73, 24), (142, 55, 12), (149, 37, 0), + (142, 22, 2), (135, 7, 4), (130, 8, 3), (131, 47, 13), + (155, 102, 48), (161, 113, 55), (168, 124, 63), (162, 120, 59), + (157, 117, 56), (156, 93, 39), (161, 62, 20), (145, 30, 1), + (108, 3, 0), (81, 31, 20), (78, 43, 24), (76, 56, 29), + (77, 66, 38), (88, 82, 48), (121, 89, 51), (130, 86, 37), + (167, 76, 31), (165, 66, 21), (164, 57, 11), (161, 44, 5), + (159, 32, 0), (155, 52, 9), (157, 61, 19), (158, 62, 20), + (149, 59, 22), (100, 55, 16), (91, 50, 18), (82, 46, 20), + (68, 55, 21), (60, 43, 27), (56, 41, 20), (50, 16, 40), + (15, 0, 55), (31, 0, 30), (47, 0, 6), (59, 0, 4), + (72, 0, 3), (98, 3, 1), (120, 0, 2), (123, 1, 0), + (124, 2, 25), (80, 58, 34), (79, 70, 42), (79, 82, 51), + (87, 90, 59), (113, 99, 54), (126, 104, 54), (141, 102, 43), + (133, 86, 34), (126, 79, 33), (120, 72, 32), (116, 75, 29), + (127, 84, 31), (136, 91, 36), (144, 106, 44), (154, 105, 47), + (173, 109, 47), (198, 146, 73), (190, 127, 62), (183, 108, 51), + (179, 89, 36), (145, 67, 18), (111, 46, 4), (89, 23, 1), + (90, 0, 0), (88, 1, 0), (86, 2, 0), (79, 0, 0), + (76, 12, 2), (71, 13, 1), (70, 14, 1), (85, 39, 5), + (96, 53, 19), (100, 70, 34), (106, 92, 43), (105, 107, 60), + (126, 120, 70), (133, 129, 65), (136, 135, 78), (136, 137, 79), + (124, 127, 70), (122, 123, 69), (121, 119, 68), (95, 88, 78), + (73, 74, 56), (69, 66, 31), (52, 67, 36), (62, 61, 33), + (77, 56, 27), (104, 60, 21), (121, 74, 28), (156, 90, 40), + (179, 102, 46), (223, 127, 77), (240, 168, 110), (227, 204, 186), + (235, 236, 222), (238, 237, 235), (235, 236, 230), (236, 237, 221), + (200, 200, 202), (210, 189, 124), (193, 139, 105), (153, 136, 126), + (130, 101, 85), (123, 99, 87), (122, 102, 75), (111, 103, 64), + (107, 94, 60), (89, 83, 59), (84, 70, 44), (84, 55, 25), + (94, 44, 7), (78, 20, 0), (71, 23, 0), (94, 45, 13), + (116, 74, 26), (133, 93, 57), (139, 118, 75), (172, 142, 106), + (185, 180, 124), (207, 198, 123), (226, 227, 159), (235, 236, 218), + (236, 237, 231), (244, 243, 223), (237, 238, 194), (238, 235, 166), + (234, 235, 159), (236, 217, 149), (232, 199, 132), (221, 172, 105), + (163, 129, 68), (132, 96, 48), (101, 78, 36), (68, 44, 18), + (50, 21, 3), (55, 18, 0), (67, 37, 13), (94, 51, 19), + (124, 97, 50), (149, 150, 92), (156, 176, 105), (186, 199, 130), + (190, 186, 113), (182, 171, 105), (159, 154, 88), (150, 151, 83), + (157, 132, 68), (167, 141, 80), (172, 175, 104), (168, 148, 89) + ), + +// 278 Apophysis-040427-51TeddyScare +((176, 153, 163), (59, 219, 255), (48, 197, 238), (37, 175, 222), + (39, 134, 230), (42, 93, 238), (38, 73, 228), (35, 54, 219), + (38, 111, 216), (41, 137, 215), (44, 164, 214), (38, 181, 212), + (32, 198, 210), (37, 209, 205), (42, 221, 200), (45, 216, 199), + (49, 211, 198), (23, 157, 186), (11, 114, 121), (0, 71, 56), + (0, 40, 32), (0, 10, 8), (0, 9, 8), (0, 9, 8), + (20, 63, 53), (20, 94, 86), (21, 126, 119), (18, 101, 94), + (16, 77, 70), (14, 60, 55), (13, 43, 41), (0, 0, 14), + (1, 3, 2), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 1, 0), (0, 3, 0), (0, 8, 3), (0, 13, 6), + (18, 87, 84), (24, 107, 133), (31, 128, 183), (101, 147, 172), + (171, 166, 162), (184, 161, 103), (198, 156, 44), (201, 181, 32), + (158, 133, 32), (39, 145, 135), (41, 153, 157), (44, 161, 179), + (45, 178, 197), (47, 196, 216), (69, 196, 222), (92, 197, 229), + (179, 183, 218), (117, 173, 227), (55, 163, 236), (45, 190, 224), + (36, 217, 212), (37, 218, 208), (39, 220, 205), (39, 220, 205), + (36, 211, 194), (39, 180, 226), (39, 149, 220), (40, 119, 214), + (37, 89, 216), (35, 59, 219), (42, 37, 228), (35, 54, 219), + (39, 76, 217), (35, 107, 223), (31, 139, 229), (31, 175, 224), + (31, 212, 219), (38, 227, 216), (46, 243, 213), (36, 223, 206), + (37, 215, 201), (38, 175, 217), (34, 165, 201), (30, 155, 185), + (28, 165, 182), (26, 175, 179), (28, 174, 174), (29, 145, 136), + (30, 147, 131), (21, 111, 99), (13, 76, 68), (10, 60, 60), + (7, 44, 53), (19, 7, 17), (3, 1, 4), (0, 0, 2), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (1, 0, 2), + (24, 0, 22), (29, 16, 67), (35, 32, 113), (28, 34, 160), + (22, 36, 207), (35, 54, 219), (31, 58, 211), (35, 61, 208), + (51, 24, 139), (19, 0, 21), (10, 0, 13), (1, 0, 5), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 1, 0), + (0, 2, 0), (0, 6, 3), (0, 10, 9), (0, 45, 45), + (19, 80, 75), (17, 173, 162), (23, 189, 175), (30, 205, 188), + (36, 199, 196), (29, 167, 154), (29, 133, 126), (16, 69, 61), + (1, 5, 4), (0, 2, 2), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 2, 4), (0, 1, 10), (0, 0, 16), + (0, 35, 51), (26, 62, 136), (18, 80, 203), (45, 112, 219), + (145, 130, 135), (166, 92, 150), (188, 54, 165), (195, 34, 189), + (192, 38, 210), (174, 36, 183), (142, 20, 141), (56, 3, 59), + (32, 0, 36), (22, 5, 23), (5, 3, 8), (1, 1, 1), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 2), (0, 1, 4), (0, 2, 6), (4, 14, 13), + (7, 52, 55), (33, 114, 141), (24, 135, 191), (28, 109, 198), + (28, 51, 189), (54, 59, 140), (53, 17, 61), (53, 1, 47), + (32, 4, 26), (11, 0, 0), (3, 1, 2), (2, 12, 11), + (9, 51, 47), (21, 115, 89), (27, 151, 125), (19, 160, 144), + (20, 173, 155), (25, 161, 151), (20, 137, 119), (17, 59, 57), + (7, 18, 22), (1, 5, 4), (0, 2, 2), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 2), (0, 4, 7), + (0, 22, 20), (0, 51, 47), (0, 85, 96), (27, 103, 163), + (28, 143, 200), (33, 153, 188), (25, 153, 202), (32, 169, 215), + (36, 161, 215), (26, 150, 212), (26, 134, 222), (25, 123, 212), + (34, 95, 210), (28, 75, 213), (70, 80, 203), (105, 116, 232), + (161, 130, 210), (218, 222, 231), (226, 235, 250), (250, 224, 237), + (193, 79, 255), (203, 27, 222), (199, 28, 218), (191, 33, 214), + (170, 33, 183), (75, 47, 124), (47, 50, 101), (39, 25, 58), + (29, 5, 31), (16, 4, 14), (3, 7, 10), (7, 22, 17), + (8, 61, 53), (19, 123, 114), (32, 163, 158), (33, 202, 181), + (27, 218, 187), (23, 214, 183), (15, 187, 165), (15, 168, 150) + ), + +// 279 Apophysis-040427-51kaosGardenr +((59, 0, 80), (4, 81, 87), (27, 106, 102), (50, 132, 118), + (42, 172, 97), (34, 212, 76), (44, 226, 89), (55, 240, 103), + (83, 241, 94), (128, 244, 117), (174, 247, 140), (209, 242, 72), + (244, 238, 4), (211, 197, 51), (178, 156, 99), (168, 168, 105), + (159, 180, 111), (118, 201, 121), (133, 196, 120), (148, 191, 119), + (159, 164, 109), (171, 137, 99), (175, 120, 94), (179, 103, 89), + (187, 51, 53), (201, 27, 56), (216, 3, 59), (196, 8, 40), + (177, 13, 22), (161, 17, 34), (145, 21, 47), (83, 48, 72), + (4, 0, 173), (0, 5, 40), (0, 2, 20), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 1, 6), (0, 1, 5), (0, 1, 4), (0, 0, 2), + (0, 0, 0), (0, 1, 0), (0, 2, 0), (0, 43, 34), + (0, 111, 17), (39, 201, 79), (75, 203, 97), (112, 205, 116), + (77, 225, 110), (42, 245, 104), (29, 246, 95), (17, 247, 87), + (32, 208, 136), (21, 210, 161), (11, 213, 187), (32, 178, 139), + (53, 143, 91), (85, 136, 82), (118, 129, 73), (126, 120, 60), + (134, 111, 69), (126, 90, 78), (135, 100, 75), (144, 110, 73), + (154, 116, 78), (165, 123, 83), (181, 144, 102), (229, 132, 149), + (249, 161, 235), (249, 148, 224), (249, 136, 214), (204, 153, 164), + (160, 171, 115), (148, 176, 116), (137, 181, 118), (108, 187, 106), + (100, 181, 89), (139, 159, 8), (150, 132, 41), (162, 105, 75), + (182, 128, 71), (202, 152, 67), (255, 137, 109), (232, 145, 138), + (243, 120, 166), (239, 109, 157), (236, 98, 149), (222, 99, 147), + (208, 101, 145), (177, 119, 134), (157, 113, 166), (121, 27, 177), + (137, 4, 181), (116, 27, 45), (131, 13, 22), (147, 0, 0), + (126, 12, 22), (106, 25, 44), (70, 48, 50), (73, 44, 40), + (147, 57, 23), (154, 48, 19), (162, 40, 16), (143, 49, 14), + (125, 58, 13), (85, 91, 5), (22, 64, 0), (55, 111, 20), + (92, 114, 31), (149, 85, 73), (166, 93, 80), (184, 102, 88), + (241, 102, 121), (247, 93, 127), (230, 104, 125), (234, 163, 131), + (200, 184, 133), (157, 190, 118), (115, 196, 103), (103, 205, 89), + (92, 215, 75), (112, 196, 111), (141, 207, 120), (181, 199, 141), + (207, 217, 156), (241, 236, 180), (243, 226, 178), (246, 217, 177), + (233, 174, 156), (243, 120, 166), (255, 114, 164), (243, 102, 154), + (227, 137, 146), (192, 156, 131), (157, 175, 117), (151, 189, 121), + (146, 203, 126), (153, 204, 127), (177, 188, 122), (202, 182, 123), + (216, 152, 142), (196, 124, 102), (174, 113, 86), (152, 103, 70), + (94, 109, 44), (80, 114, 19), (27, 206, 78), (6, 233, 64), + (0, 239, 67), (9, 240, 77), (18, 241, 88), (50, 231, 92), + (68, 200, 81), (81, 205, 81), (99, 176, 82), (120, 178, 93), + (136, 133, 92), (146, 125, 80), (142, 133, 87), (139, 142, 95), + (124, 166, 103), (120, 196, 106), (131, 185, 109), (128, 172, 113), + (121, 107, 106), (119, 91, 95), (117, 76, 84), (175, 47, 36), + (177, 42, 38), (189, 55, 52), (161, 55, 59), (102, 71, 68), + (66, 84, 94), (28, 2, 161), (92, 0, 217), (134, 78, 227), + (120, 106, 193), (175, 125, 137), (177, 140, 134), (154, 100, 98), + (134, 61, 20), (134, 61, 18), (135, 61, 16), (139, 53, 18), + (162, 33, 27), (157, 54, 19), (183, 98, 0), (126, 91, 0), + (42, 40, 0), (8, 10, 9), (0, 3, 0), (3, 0, 2), + (18, 6, 0), (57, 57, 59), (94, 84, 75), (133, 110, 78), + (167, 161, 109), (186, 186, 126), (189, 196, 129), (190, 204, 142), + (232, 198, 153), (231, 189, 165), (209, 171, 126), (173, 155, 115), + (164, 132, 109), (181, 124, 107), (199, 102, 111), (183, 106, 114), + (148, 128, 104), (145, 175, 105), (147, 183, 121), (142, 212, 126), + (152, 233, 141), (159, 255, 154), (174, 252, 153), (155, 247, 120), + (125, 202, 106), (85, 186, 92), (105, 157, 93), (74, 102, 87), + (118, 100, 100), (150, 98, 76), (199, 102, 57), (241, 76, 70), + (222, 42, 43), (186, 8, 84), (202, 12, 164), (137, 110, 103), + (69, 189, 92), (15, 226, 69), (2, 235, 66), (2, 236, 63), + (3, 235, 63), (25, 218, 73), (55, 202, 87), (113, 218, 125), + (179, 232, 160), (222, 247, 153), (242, 240, 165), (243, 236, 168), + (234, 223, 169), (233, 188, 165), (234, 200, 172), (243, 221, 182), + (244, 240, 166), (241, 224, 178), (237, 182, 161), (236, 133, 154), + (232, 94, 143), (221, 100, 141), (190, 132, 131), (179, 157, 107) + ), + +// 280 Apophysis-040427-51Thatway4 +((108, 55, 21), (208, 161, 89), (219, 198, 105), (231, 235, 122), + (235, 215, 156), (240, 195, 190), (236, 177, 193), (233, 159, 196), + (162, 127, 229), (154, 120, 227), (146, 113, 226), (175, 154, 204), + (204, 196, 183), (222, 194, 141), (241, 192, 99), (223, 163, 90), + (206, 135, 81), (134, 91, 46), (129, 75, 39), (124, 60, 33), + (126, 64, 19), (129, 69, 6), (129, 67, 5), (130, 66, 4), + (126, 55, 13), (118, 67, 15), (110, 80, 18), (114, 73, 22), + (118, 66, 27), (131, 78, 32), (144, 91, 37), (166, 96, 34), + (205, 123, 37), (197, 148, 71), (216, 189, 79), (236, 231, 88), + (228, 193, 73), (221, 155, 59), (209, 137, 54), (198, 119, 50), + (135, 65, 29), (109, 51, 16), (83, 37, 4), (48, 24, 10), + (13, 11, 16), (8, 14, 19), (4, 17, 23), (19, 37, 47), + (102, 68, 41), (144, 106, 33), (178, 105, 40), (213, 104, 47), + (196, 100, 34), (179, 97, 21), (166, 84, 13), (153, 72, 6), + (131, 55, 0), (140, 56, 5), (149, 57, 10), (135, 64, 19), + (122, 71, 28), (128, 71, 25), (135, 71, 23), (141, 77, 15), + (136, 68, 3), (145, 65, 0), (140, 49, 0), (136, 34, 0), + (130, 34, 0), (124, 34, 0), (93, 34, 2), (72, 28, 0), + (16, 22, 0), (12, 14, 5), (9, 7, 10), (16, 9, 14), + (24, 11, 18), (32, 15, 14), (40, 20, 11), (88, 37, 0), + (124, 54, 0), (151, 66, 35), (141, 76, 43), (131, 87, 52), + (138, 83, 52), (146, 79, 52), (155, 78, 50), (154, 81, 48), + (118, 68, 35), (119, 62, 32), (120, 56, 29), (125, 49, 24), + (130, 42, 20), (147, 46, 18), (133, 45, 7), (121, 39, 0), + (107, 40, 0), (70, 10, 0), (46, 5, 0), (23, 0, 0), + (22, 0, 5), (21, 0, 10), (2, 0, 19), (4, 6, 21), + (9, 0, 36), (16, 2, 49), (23, 5, 63), (21, 10, 59), + (20, 15, 55), (22, 22, 48), (62, 12, 21), (92, 28, 0), + (116, 34, 0), (95, 12, 0), (86, 6, 0), (78, 0, 0), + (82, 21, 0), (100, 40, 12), (122, 39, 23), (130, 59, 15), + (160, 78, 28), (164, 79, 23), (169, 81, 18), (172, 71, 9), + (176, 62, 0), (177, 74, 15), (216, 111, 45), (229, 114, 57), + (237, 132, 77), (233, 145, 74), (224, 144, 69), (216, 143, 64), + (231, 136, 44), (218, 125, 45), (184, 102, 26), (163, 87, 11), + (116, 63, 0), (97, 62, 10), (79, 61, 21), (50, 45, 29), + (22, 29, 37), (21, 19, 30), (40, 26, 26), (98, 54, 17), + (122, 55, 13), (128, 48, 0), (124, 50, 0), (120, 53, 0), + (106, 46, 0), (103, 52, 9), (105, 46, 14), (113, 47, 13), + (109, 44, 14), (108, 49, 18), (107, 54, 23), (111, 64, 20), + (121, 78, 25), (125, 83, 25), (154, 95, 15), (186, 121, 39), + (202, 132, 60), (220, 131, 63), (227, 137, 68), (234, 143, 73), + (244, 153, 80), (255, 168, 108), (240, 173, 102), (216, 178, 131), + (232, 229, 194), (232, 231, 211), (233, 234, 228), (233, 232, 188), + (216, 203, 169), (209, 211, 189), (231, 225, 239), (240, 226, 241), + (249, 215, 248), (255, 225, 248), (252, 241, 239), (255, 229, 190), + (223, 196, 143), (181, 157, 87), (160, 123, 43), (156, 90, 40), + (152, 73, 30), (152, 75, 25), (153, 78, 20), (140, 76, 28), + (133, 83, 34), (136, 76, 50), (115, 68, 38), (102, 69, 36), + (98, 64, 26), (104, 55, 23), (97, 50, 20), (59, 9, 10), + (32, 6, 9), (25, 6, 0), (42, 6, 0), (51, 23, 0), + (79, 49, 0), (99, 48, 0), (95, 33, 0), (92, 34, 0), + (74, 19, 0), (56, 17, 0), (34, 4, 0), (20, 0, 0), + (18, 0, 0), (0, 11, 0), (14, 13, 0), (17, 7, 5), + (9, 6, 17), (19, 5, 18), (47, 17, 17), (90, 69, 38), + (75, 71, 104), (124, 96, 121), (122, 127, 227), (97, 111, 236), + (117, 94, 244), (82, 47, 235), (67, 36, 95), (77, 9, 84), + (108, 45, 76), (121, 55, 31), (148, 62, 27), (158, 76, 20), + (160, 71, 13), (150, 66, 19), (136, 60, 28), (121, 57, 29), + (123, 60, 27), (142, 64, 18), (168, 80, 34), (187, 106, 61), + (229, 150, 91), (253, 221, 120), (242, 232, 119), (231, 242, 103), + (233, 229, 103), (192, 170, 110), (188, 123, 91), (142, 95, 53), + (121, 70, 49), (96, 72, 28), (93, 62, 16), (50, 24, 9), + (26, 20, 8), (20, 26, 22), (97, 58, 29), (106, 76, 38), + (118, 63, 42), (142, 78, 43), (226, 125, 57), (173, 89, 29) + ), + +// 281 Apophysis-040427-51ThatwayGrn +((79, 66, 13), (83, 51, 0), (100, 55, 0), (118, 59, 0), + (119, 65, 0), (120, 72, 0), (119, 72, 0), (119, 72, 0), + (78, 55, 5), (66, 48, 5), (54, 41, 6), (56, 39, 10), + (58, 38, 14), (70, 61, 16), (82, 85, 18), (74, 109, 39), + (67, 133, 61), (67, 133, 62), (65, 125, 61), (64, 117, 61), + (67, 82, 33), (71, 48, 6), (68, 41, 3), (65, 35, 0), + (70, 53, 1), (69, 95, 25), (69, 137, 50), (67, 144, 51), + (66, 152, 53), (63, 156, 52), (61, 160, 52), (59, 163, 52), + (59, 163, 52), (58, 161, 52), (60, 161, 52), (62, 161, 53), + (61, 160, 52), (61, 160, 52), (61, 158, 52), (62, 157, 53), + (64, 134, 64), (67, 128, 69), (71, 123, 74), (72, 121, 78), + (73, 119, 82), (73, 119, 82), (73, 119, 82), (73, 119, 82), + (73, 121, 79), (68, 148, 53), (66, 150, 53), (65, 153, 53), + (66, 151, 53), (68, 149, 54), (70, 146, 54), (73, 143, 54), + (144, 90, 0), (125, 98, 6), (106, 107, 13), (86, 119, 39), + (67, 132, 66), (67, 131, 70), (68, 131, 74), (71, 129, 79), + (74, 127, 85), (75, 120, 87), (75, 119, 86), (75, 119, 86), + (75, 119, 86), (75, 119, 86), (76, 122, 86), (76, 119, 89), + (75, 119, 86), (68, 121, 82), (61, 124, 79), (62, 132, 69), + (64, 141, 59), (63, 145, 57), (63, 150, 55), (67, 148, 53), + (66, 141, 59), (70, 146, 55), (66, 149, 55), (62, 152, 56), + (63, 154, 54), (64, 157, 53), (61, 160, 52), (61, 160, 52), + (65, 153, 53), (67, 150, 53), (70, 147, 53), (85, 123, 34), + (101, 99, 16), (122, 84, 0), (107, 57, 0), (85, 42, 0), + (60, 32, 0), (53, 34, 1), (70, 38, 1), (88, 43, 2), + (95, 49, 1), (102, 56, 0), (117, 64, 0), (118, 71, 1), + (92, 84, 22), (80, 103, 46), (69, 123, 71), (64, 86, 48), + (60, 50, 25), (45, 32, 16), (37, 28, 11), (32, 18, 7), + (45, 32, 13), (70, 118, 70), (71, 119, 75), (72, 120, 80), + (76, 119, 91), (75, 120, 100), (76, 119, 100), (76, 119, 100), + (75, 122, 86), (115, 115, 45), (155, 108, 4), (158, 114, 3), + (162, 120, 2), (104, 137, 48), (71, 146, 55), (70, 146, 55), + (68, 136, 61), (67, 133, 62), (67, 133, 62), (67, 133, 62), + (67, 126, 68), (70, 120, 69), (109, 69, 17), (127, 82, 0), + (148, 78, 6), (137, 70, 3), (126, 62, 1), (113, 57, 2), + (100, 52, 3), (76, 30, 7), (63, 29, 1), (58, 22, 0), + (54, 21, 2), (61, 28, 0), (66, 30, 2), (72, 33, 4), + (103, 56, 4), (131, 73, 0), (157, 97, 0), (170, 133, 0), + (162, 148, 43), (124, 152, 39), (86, 157, 35), (72, 154, 56), + (66, 154, 52), (65, 156, 53), (65, 156, 53), (64, 155, 52), + (65, 156, 53), (63, 158, 54), (62, 159, 53), (62, 161, 53), + (60, 164, 53), (60, 164, 53), (62, 161, 53), (63, 158, 54), + (66, 152, 53), (67, 148, 53), (69, 145, 54), (106, 118, 32), + (154, 108, 0), (164, 115, 0), (143, 108, 16), (82, 118, 90), + (80, 119, 98), (78, 120, 100), (75, 119, 102), (78, 120, 100), + (79, 119, 95), (75, 119, 86), (71, 120, 75), (62, 70, 19), + (45, 28, 0), (44, 24, 3), (44, 21, 7), (37, 19, 5), + (45, 17, 3), (47, 21, 0), (49, 34, 1), (56, 48, 2), + (74, 54, 0), (98, 57, 1), (123, 59, 0), (128, 69, 0), + (130, 86, 0), (108, 98, 49), (73, 119, 80), (76, 119, 92), + (75, 120, 100), (72, 120, 108), (73, 119, 108), (75, 119, 102), + (76, 119, 100), (76, 119, 91), (73, 119, 80), (71, 120, 75), + (56, 57, 15), (51, 40, 8), (47, 36, 8), (44, 41, 8), + (47, 44, 11), (47, 50, 7), (53, 65, 1), (60, 91, 34), + (71, 120, 75), (75, 127, 89), (75, 134, 90), (71, 129, 79), + (64, 134, 62), (68, 148, 53), (67, 151, 55), (67, 151, 53), + (68, 148, 53), (67, 134, 63), (73, 124, 81), (76, 119, 91), + (79, 119, 95), (78, 120, 98), (80, 119, 98), (80, 119, 98), + (80, 119, 100), (80, 119, 98), (80, 119, 98), (78, 122, 97), + (75, 122, 88), (72, 127, 85), (69, 130, 73), (65, 139, 64), + (68, 148, 53), (68, 148, 53), (68, 141, 59), (70, 133, 62), + (67, 125, 67), (92, 71, 18), (62, 40, 19), (51, 29, 8), + (46, 25, 4), (57, 32, 1), (73, 46, 1), (105, 58, 4), + (131, 80, 1), (154, 99, 0), (178, 160, 62), (170, 124, 2) + ), + +// 282 Apophysis-040427-51TreeLife1 +((199, 144, 17), (41, 30, 44), (89, 62, 36), (138, 94, 29), + (161, 115, 26), (184, 137, 23), (190, 143, 30), (197, 149, 38), + (206, 169, 62), (214, 187, 99), (223, 206, 136), (222, 207, 148), + (221, 209, 161), (207, 169, 114), (193, 129, 68), (191, 133, 53), + (190, 138, 39), (173, 120, 6), (172, 119, 4), (171, 118, 2), + (166, 111, 1), (161, 105, 0), (162, 102, 0), (164, 100, 0), + (148, 76, 0), (142, 68, 0), (137, 61, 0), (131, 43, 0), + (125, 26, 0), (116, 22, 0), (107, 18, 0), (74, 0, 28), + (33, 0, 29), (7, 6, 12), (45, 10, 9), (84, 14, 6), + (106, 30, 3), (129, 47, 0), (137, 60, 0), (146, 74, 0), + (170, 113, 6), (176, 122, 8), (182, 132, 11), (194, 142, 17), + (206, 153, 23), (209, 160, 28), (212, 168, 33), (214, 181, 42), + (228, 189, 50), (238, 212, 65), (240, 213, 68), (243, 215, 72), + (233, 199, 62), (224, 184, 53), (217, 177, 51), (211, 171, 49), + (195, 147, 23), (187, 138, 15), (179, 129, 8), (171, 115, 6), + (164, 101, 4), (159, 94, 2), (155, 88, 1), (149, 77, 1), + (146, 74, 2), (152, 81, 1), (155, 90, 1), (159, 99, 1), + (158, 98, 1), (157, 97, 1), (144, 87, 0), (138, 68, 0), + (116, 69, 0), (116, 65, 0), (117, 61, 0), (121, 52, 0), + (125, 44, 1), (121, 42, 0), (117, 41, 0), (109, 42, 0), + (125, 44, 1), (139, 61, 0), (149, 81, 1), (159, 101, 2), + (164, 108, 4), (170, 116, 7), (177, 124, 10), (182, 132, 11), + (183, 133, 12), (184, 135, 10), (185, 137, 9), (185, 136, 10), + (185, 135, 12), (186, 136, 13), (190, 140, 15), (196, 149, 19), + (208, 162, 25), (221, 180, 40), (224, 184, 44), (228, 189, 49), + (225, 186, 46), (222, 183, 43), (216, 172, 37), (211, 162, 34), + (198, 151, 21), (190, 141, 16), (182, 132, 11), (176, 125, 8), + (171, 118, 6), (160, 100, 2), (148, 76, 0), (138, 64, 0), + (138, 61, 5), (145, 77, 6), (155, 91, 5), (165, 106, 4), + (181, 130, 12), (193, 143, 22), (204, 157, 25), (211, 165, 30), + (211, 167, 32), (206, 159, 35), (201, 151, 38), (195, 145, 27), + (189, 139, 16), (173, 120, 6), (161, 97, 7), (140, 67, 16), + (112, 35, 7), (54, 4, 29), (55, 13, 38), (56, 22, 47), + (32, 29, 36), (49, 35, 52), (43, 47, 85), (80, 52, 103), + (68, 77, 76), (82, 78, 89), (97, 79, 103), (104, 85, 84), + (112, 92, 65), (147, 95, 45), (165, 105, 9), (170, 116, 7), + (182, 132, 11), (192, 142, 17), (196, 147, 20), (200, 153, 23), + (205, 161, 28), (211, 165, 30), (203, 159, 26), (197, 150, 20), + (179, 121, 22), (173, 116, 33), (167, 112, 45), (176, 138, 161), + (165, 153, 203), (168, 156, 206), (171, 158, 228), (201, 201, 227), + (207, 195, 209), (255, 230, 156), (250, 235, 142), (246, 240, 128), + (246, 248, 115), (254, 245, 92), (255, 235, 96), (255, 233, 97), + (239, 202, 59), (237, 201, 58), (235, 200, 58), (237, 198, 59), + (232, 194, 61), (233, 203, 105), (211, 162, 155), (160, 101, 103), + (145, 88, 45), (131, 74, 31), (139, 65, 18), (138, 63, 5), + (137, 61, 0), (134, 63, 1), (134, 63, 1), (137, 62, 0), + (131, 49, 1), (130, 48, 0), (129, 47, 0), (132, 52, 1), + (139, 63, 0), (144, 72, 0), (147, 78, 0), (154, 91, 0), + (161, 101, 3), (164, 109, 8), (160, 125, 0), (173, 124, 3), + (182, 132, 11), (192, 142, 17), (204, 157, 27), (209, 159, 38), + (214, 170, 35), (221, 182, 42), (228, 189, 49), (229, 192, 49), + (231, 194, 53), (232, 193, 53), (227, 188, 48), (222, 181, 41), + (213, 169, 34), (201, 154, 24), (189, 132, 19), (163, 106, 16), + (118, 76, 34), (93, 69, 93), (110, 89, 108), (114, 75, 104), + (128, 70, 50), (153, 94, 24), (168, 116, 6), (173, 122, 7), + (181, 131, 10), (175, 124, 7), (172, 119, 5), (168, 106, 7), + (169, 89, 4), (150, 65, 0), (128, 46, 0), (117, 35, 0), + (109, 28, 0), (88, 0, 0), (65, 0, 26), (33, 0, 27), + (8, 0, 15), (38, 5, 26), (98, 14, 3), (116, 26, 15), + (117, 29, 15), (122, 43, 28), (111, 94, 110), (149, 131, 179), + (159, 145, 180), (131, 112, 134), (158, 97, 113), (167, 99, 38), + (176, 123, 11), (181, 130, 12), (188, 138, 15), (197, 151, 16), + (199, 164, 18), (213, 172, 32), (234, 189, 12), (255, 197, 35), + (240, 201, 44), (229, 190, 50), (220, 176, 41), (210, 161, 32) + ), + +// 283 Apophysis-040427-51TreeLife +((160, 85, 2), (162, 86, 2), (159, 84, 6), (157, 83, 10), + (161, 87, 6), (166, 92, 3), (167, 95, 2), (168, 98, 2), + (164, 90, 3), (157, 83, 2), (150, 76, 1), (144, 69, 0), + (138, 62, 0), (132, 55, 0), (127, 49, 0), (123, 46, 0), + (120, 43, 1), (118, 40, 1), (119, 39, 0), (120, 39, 0), + (123, 44, 0), (127, 49, 1), (130, 53, 1), (134, 57, 1), + (153, 110, 78), (186, 152, 121), (219, 194, 164), (234, 209, 131), + (250, 225, 99), (239, 209, 77), (229, 193, 55), (208, 157, 30), + (169, 98, 8), (134, 57, 1), (124, 48, 0), (115, 40, 0), + (111, 35, 0), (107, 31, 0), (106, 31, 0), (105, 32, 0), + (110, 36, 1), (114, 38, 1), (118, 40, 1), (120, 44, 2), + (123, 49, 4), (128, 52, 2), (133, 56, 0), (139, 64, 0), + (146, 69, 1), (161, 85, 7), (164, 98, 3), (167, 112, 0), + (164, 111, 28), (162, 111, 56), (153, 105, 60), (145, 99, 65), + (162, 97, 17), (154, 83, 13), (146, 70, 10), (133, 57, 5), + (121, 44, 0), (116, 40, 0), (112, 36, 0), (106, 31, 0), + (98, 26, 1), (96, 24, 0), (93, 30, 0), (90, 36, 0), + (95, 34, 0), (100, 32, 0), (111, 37, 0), (120, 43, 1), + (136, 66, 17), (160, 104, 58), (184, 142, 100), (196, 162, 141), + (209, 183, 182), (228, 208, 155), (247, 233, 128), (255, 245, 130), + (252, 238, 116), (253, 236, 104), (250, 233, 104), (248, 230, 104), + (246, 222, 94), (244, 215, 85), (221, 176, 49), (185, 129, 46), + (154, 78, 2), (144, 66, 1), (134, 54, 1), (127, 48, 3), + (121, 43, 5), (118, 39, 6), (113, 42, 14), (111, 35, 9), + (108, 33, 1), (108, 33, 1), (111, 36, 1), (115, 40, 1), + (116, 39, 0), (117, 39, 0), (120, 43, 1), (123, 46, 4), + (132, 55, 0), (133, 57, 0), (135, 59, 1), (134, 57, 0), + (133, 56, 0), (132, 55, 0), (131, 52, 0), (125, 47, 1), + (127, 46, 3), (132, 55, 1), (133, 57, 1), (135, 59, 1), + (140, 65, 0), (141, 71, 0), (141, 82, 0), (141, 72, 0), + (130, 53, 1), (124, 47, 0), (119, 42, 0), (117, 41, 0), + (115, 40, 1), (113, 37, 1), (108, 34, 0), (104, 33, 1), + (105, 32, 0), (108, 33, 1), (108, 33, 0), (109, 34, 0), + (112, 36, 0), (116, 38, 0), (117, 39, 0), (113, 38, 0), + (106, 31, 0), (103, 28, 0), (100, 26, 0), (98, 25, 0), + (97, 25, 1), (97, 25, 1), (95, 28, 2), (98, 26, 1), + (102, 28, 1), (104, 30, 1), (104, 31, 0), (105, 32, 0), + (104, 31, 0), (102, 28, 1), (99, 27, 2), (98, 25, 0), + (96, 24, 0), (95, 23, 0), (95, 23, 1), (96, 24, 0), + (96, 24, 0), (97, 25, 1), (102, 28, 1), (108, 34, 0), + (115, 40, 0), (135, 58, 2), (140, 63, 7), (145, 68, 12), + (151, 76, 9), (156, 101, 60), (177, 134, 81), (202, 169, 152), + (220, 203, 237), (219, 203, 238), (219, 203, 240), (225, 211, 202), + (252, 248, 138), (243, 222, 95), (211, 162, 31), (213, 133, 20), + (189, 115, 20), (164, 93, 3), (155, 79, 1), (148, 75, 0), + (147, 73, 0), (145, 71, 0), (146, 72, 1), (148, 71, 3), + (132, 55, 1), (128, 51, 1), (125, 47, 1), (120, 42, 0), + (118, 40, 1), (116, 41, 1), (115, 43, 0), (119, 42, 0), + (121, 44, 0), (126, 48, 0), (132, 52, 0), (134, 57, 1), + (130, 63, 8), (140, 70, 11), (139, 72, 20), (146, 122, 76), + (198, 164, 136), (207, 180, 189), (207, 182, 204), (211, 190, 199), + (224, 203, 212), (237, 224, 231), (241, 240, 173), (247, 223, 101), + (220, 175, 82), (183, 132, 69), (165, 94, 14), (154, 78, 2), + (141, 63, 0), (126, 50, 0), (118, 40, 1), (108, 33, 1), + (102, 28, 1), (93, 23, 0), (85, 18, 1), (70, 14, 0), + (70, 10, 0), (75, 9, 0), (87, 19, 0), (96, 24, 0), + (103, 29, 0), (110, 36, 0), (118, 41, 0), (127, 49, 1), + (134, 58, 0), (139, 63, 1), (142, 67, 0), (143, 68, 0), + (144, 66, 2), (138, 62, 2), (139, 60, 1), (137, 61, 1), + (135, 59, 1), (134, 58, 0), (137, 58, 1), (141, 59, 0), + (145, 68, 0), (150, 76, 1), (160, 88, 3), (169, 102, 0), + (190, 127, 13), (199, 141, 16), (205, 152, 24), (206, 151, 25), + (200, 136, 28), (176, 107, 14), (163, 88, 7), (150, 72, 8), + (142, 57, 0), (128, 51, 9), (130, 35, 0), (125, 36, 4) + ), + +// 284 Apophysis-040427-51triflwr +((105, 58, 4), (155, 91, 4), (157, 94, 12), (160, 98, 21), + (177, 101, 60), (194, 105, 99), (189, 109, 109), (185, 114, 120), + (148, 101, 21), (96, 61, 17), (44, 21, 13), (22, 11, 6), + (0, 1, 0), (0, 0, 13), (0, 0, 27), (1, 34, 60), + (2, 68, 94), (1, 57, 106), (57, 91, 147), (114, 125, 189), + (129, 153, 202), (145, 181, 215), (158, 195, 213), (172, 210, 211), + (115, 95, 156), (100, 54, 124), (85, 14, 92), (42, 9, 49), + (0, 4, 7), (0, 2, 3), (0, 0, 0), (1, 0, 0), + (6, 0, 0), (113, 36, 10), (128, 65, 5), (143, 94, 1), + (139, 110, 3), (136, 126, 5), (122, 128, 6), (109, 131, 7), + (40, 117, 1), (40, 116, 0), (41, 116, 0), (71, 107, 1), + (102, 99, 2), (102, 83, 4), (102, 68, 7), (115, 74, 20), + (93, 72, 45), (107, 55, 78), (132, 83, 104), (158, 111, 131), + (178, 159, 143), (198, 208, 155), (204, 203, 173), (211, 198, 192), + (179, 147, 158), (178, 137, 142), (178, 127, 126), (171, 140, 144), + (165, 154, 162), (154, 149, 172), (144, 144, 182), (117, 139, 197), + (54, 87, 202), (46, 59, 199), (23, 35, 180), (1, 11, 161), + (0, 28, 138), (0, 46, 116), (0, 50, 113), (7, 55, 129), + (66, 100, 210), (87, 137, 222), (109, 175, 235), (136, 191, 231), + (163, 208, 227), (160, 214, 218), (158, 220, 209), (148, 178, 204), + (128, 116, 162), (54, 45, 174), (38, 52, 128), (23, 59, 83), + (43, 65, 62), (63, 72, 41), (87, 78, 19), (128, 85, 7), + (153, 80, 1), (143, 46, 0), (133, 13, 0), (142, 10, 0), + (151, 7, 0), (172, 0, 23), (140, 0, 37), (136, 15, 4), + (137, 48, 4), (113, 71, 21), (68, 71, 48), (23, 71, 75), + (12, 72, 82), (1, 74, 89), (0, 66, 98), (0, 52, 110), + (80, 23, 126), (100, 42, 116), (121, 62, 106), (134, 65, 94), + (147, 69, 83), (142, 100, 16), (150, 93, 6), (162, 84, 2), + (170, 77, 0), (170, 83, 6), (167, 77, 3), (164, 72, 0), + (144, 56, 18), (129, 15, 25), (114, 13, 43), (124, 0, 62), + (185, 11, 34), (205, 16, 19), (226, 21, 4), (225, 31, 5), + (224, 41, 7), (176, 74, 0), (174, 76, 1), (165, 84, 5), + (152, 92, 6), (102, 95, 41), (70, 85, 42), (39, 76, 43), + (10, 81, 77), (0, 50, 113), (11, 0, 159), (18, 0, 168), + (0, 5, 183), (9, 15, 188), (18, 25, 193), (19, 24, 191), + (20, 23, 190), (0, 30, 136), (1, 60, 104), (22, 79, 72), + (60, 103, 13), (127, 129, 2), (132, 125, 4), (137, 122, 7), + (150, 93, 6), (157, 87, 1), (166, 83, 3), (163, 82, 1), + (150, 69, 6), (135, 56, 16), (120, 43, 27), (113, 27, 76), + (81, 3, 102), (47, 20, 99), (19, 43, 103), (38, 55, 73), + (1, 6, 10), (0, 0, 0), (3, 0, 0), (7, 0, 0), + (68, 59, 28), (108, 69, 4), (139, 103, 6), (136, 120, 7), + (133, 106, 0), (114, 90, 8), (96, 74, 17), (65, 69, 32), + (29, 79, 42), (14, 85, 71), (4, 84, 93), (16, 105, 83), + (6, 107, 49), (1, 108, 26), (1, 110, 19), (42, 122, 37), + (111, 96, 13), (145, 94, 5), (156, 91, 9), (169, 83, 6), + (219, 75, 49), (224, 92, 58), (229, 110, 67), (230, 84, 47), + (228, 70, 7), (176, 76, 0), (173, 81, 6), (188, 96, 71), + (215, 143, 103), (171, 192, 175), (173, 223, 220), (173, 228, 222), + (156, 244, 220), (149, 235, 255), (174, 233, 241), (174, 231, 240), + (178, 226, 238), (198, 202, 240), (203, 198, 228), (194, 230, 220), + (180, 225, 205), (196, 190, 174), (175, 164, 160), (182, 119, 138), + (143, 66, 110), (128, 34, 87), (137, 33, 82), (136, 28, 80), + (150, 30, 57), (167, 36, 68), (152, 93, 25), (169, 83, 6), + (179, 97, 0), (213, 101, 19), (233, 116, 72), (255, 187, 82), + (245, 255, 172), (232, 203, 247), (232, 178, 253), (239, 159, 228), + (221, 199, 201), (215, 169, 153), (228, 121, 75), (223, 120, 19), + (224, 93, 11), (206, 85, 2), (176, 76, 1), (170, 91, 0), + (161, 86, 3), (155, 88, 1), (152, 79, 0), (124, 54, 2), + (129, 35, 0), (131, 13, 0), (128, 12, 31), (106, 23, 43), + (75, 28, 62), (52, 7, 112), (40, 8, 145), (15, 2, 144), + (24, 11, 127), (64, 34, 88), (63, 45, 59), (73, 68, 26), + (120, 69, 4), (148, 81, 3), (164, 78, 1), (171, 78, 0), + (167, 69, 0), (171, 39, 62), (127, 64, 107), (136, 55, 98) + ), + +// 285 Apophysis-040427-51mitosis +((78, 82, 109), (113, 49, 65), (84, 46, 45), (55, 44, 26), + (53, 48, 29), (51, 53, 32), (45, 49, 38), (40, 46, 44), + (45, 37, 52), (47, 44, 55), (49, 52, 59), (59, 72, 83), + (70, 93, 107), (96, 119, 134), (122, 145, 161), (136, 156, 172), + (151, 168, 184), (119, 165, 189), (119, 174, 191), (120, 184, 194), + (163, 219, 214), (206, 255, 234), (224, 255, 243), (242, 255, 253), + (250, 250, 255), (233, 211, 215), (217, 172, 175), (229, 167, 134), + (242, 163, 94), (244, 149, 92), (247, 136, 90), (240, 130, 71), + (206, 149, 106), (180, 98, 134), (204, 98, 92), (229, 99, 50), + (200, 91, 51), (172, 83, 53), (163, 74, 72), (155, 65, 91), + (113, 101, 115), (118, 113, 117), (124, 125, 119), (139, 138, 133), + (155, 152, 147), (154, 157, 156), (154, 162, 165), (149, 144, 164), + (126, 129, 138), (82, 92, 93), (64, 74, 74), (47, 57, 56), + (47, 41, 47), (48, 26, 38), (51, 23, 28), (54, 20, 19), + (51, 5, 7), (89, 7, 3), (127, 9, 0), (151, 11, 5), + (175, 13, 10), (194, 31, 38), (213, 50, 67), (233, 33, 20), + (211, 21, 5), (159, 34, 12), (161, 45, 42), (164, 56, 72), + (156, 54, 72), (148, 53, 73), (123, 83, 71), (124, 33, 42), + (80, 24, 33), (67, 12, 16), (54, 0, 0), (30, 1, 0), + (6, 2, 1), (4, 3, 0), (3, 4, 0), (15, 4, 2), + (14, 4, 5), (16, 31, 26), (30, 36, 42), (45, 42, 59), + (51, 49, 69), (58, 56, 80), (79, 74, 104), (84, 78, 106), + (66, 65, 83), (55, 59, 69), (45, 53, 56), (38, 48, 48), + (31, 43, 41), (15, 30, 23), (10, 8, 9), (8, 6, 0), + (14, 6, 4), (22, 26, 12), (29, 35, 10), (37, 45, 8), + (36, 53, 8), (35, 62, 9), (48, 58, 6), (53, 59, 57), + (90, 101, 123), (91, 121, 140), (92, 141, 158), (91, 130, 149), + (91, 119, 140), (105, 117, 143), (96, 112, 128), (89, 105, 128), + (89, 116, 107), (63, 113, 124), (65, 111, 117), (68, 109, 111), + (81, 104, 112), (91, 97, 123), (126, 96, 134), (163, 111, 160), + (191, 180, 196), (195, 195, 201), (199, 211, 207), (222, 228, 231), + (246, 246, 255), (252, 249, 255), (252, 253, 255), (255, 251, 255), + (251, 255, 255), (196, 212, 211), (181, 197, 195), (167, 182, 179), + (151, 150, 156), (124, 116, 137), (98, 96, 109), (80, 86, 84), + (42, 59, 51), (37, 53, 51), (33, 48, 51), (29, 45, 43), + (26, 43, 35), (21, 32, 36), (20, 14, 26), (29, 14, 21), + (30, 29, 27), (54, 28, 27), (60, 26, 26), (67, 25, 26), + (90, 32, 44), (66, 51, 46), (61, 70, 87), (87, 85, 96), + (141, 98, 141), (149, 101, 146), (158, 105, 151), (141, 84, 119), + (106, 79, 114), (87, 78, 105), (69, 83, 86), (63, 66, 71), + (48, 59, 55), (44, 51, 61), (45, 58, 70), (46, 65, 80), + (59, 92, 81), (62, 88, 101), (61, 110, 117), (60, 87, 98), + (41, 51, 63), (39, 54, 58), (38, 57, 53), (39, 61, 49), + (48, 64, 53), (53, 76, 68), (85, 85, 83), (112, 113, 73), + (113, 113, 103), (125, 127, 124), (158, 156, 144), (158, 170, 170), + (161, 165, 174), (158, 149, 178), (127, 153, 150), (114, 120, 154), + (121, 153, 178), (143, 166, 178), (165, 179, 179), (175, 190, 195), + (210, 249, 248), (241, 255, 254), (247, 255, 254), (228, 237, 242), + (190, 173, 215), (148, 138, 162), (111, 99, 139), (100, 105, 101), + (67, 99, 86), (50, 73, 65), (49, 62, 55), (56, 65, 60), + (61, 86, 67), (58, 103, 82), (52, 102, 109), (70, 118, 128), + (76, 130, 142), (84, 115, 133), (80, 109, 127), (71, 117, 130), + (71, 117, 130), (74, 110, 122), (76, 100, 112), (70, 78, 97), + (59, 56, 75), (58, 39, 58), (80, 41, 44), (61, 20, 24), + (47, 8, 9), (59, 0, 2), (38, 4, 2), (26, 16, 25), + (37, 38, 40), (39, 48, 57), (48, 55, 73), (66, 68, 91), + (92, 91, 105), (103, 129, 116), (128, 136, 139), (142, 157, 162), + (130, 172, 150), (126, 147, 140), (127, 116, 110), (115, 88, 61), + (67, 62, 59), (50, 45, 49), (37, 49, 45), (34, 41, 34), + (25, 34, 31), (34, 36, 25), (24, 49, 7), (17, 40, 0), + (15, 20, 0), (8, 15, 0), (6, 6, 0), (14, 4, 2), + (23, 3, 2), (39, 1, 0), (38, 5, 0), (48, 11, 2), + (51, 21, 21), (39, 33, 33), (21, 32, 28), (13, 17, 16), + (27, 12, 15), (35, 23, 35), (30, 27, 38), (45, 31, 31) + ), + +// 286 Apophysis-040427-51triflwer +((142, 104, 5), (140, 108, 9), (121, 111, 10), (102, 114, 12), + (83, 73, 43), (64, 33, 74), (88, 73, 103), (113, 114, 132), + (160, 203, 186), (163, 207, 205), (167, 211, 224), (144, 200, 229), + (122, 189, 234), (121, 200, 242), (120, 212, 251), (133, 221, 244), + (147, 230, 238), (203, 237, 202), (201, 210, 196), (199, 184, 191), + (179, 151, 157), (159, 118, 124), (126, 110, 73), (93, 102, 23), + (0, 49, 115), (2, 28, 128), (4, 8, 141), (27, 24, 158), + (50, 40, 175), (58, 68, 190), (66, 96, 206), (99, 139, 208), + (149, 163, 212), (234, 235, 203), (230, 219, 194), (226, 203, 185), + (218, 221, 143), (211, 239, 102), (223, 220, 120), (235, 201, 138), + (215, 94, 13), (210, 103, 9), (205, 112, 6), (195, 105, 3), + (185, 99, 0), (179, 89, 2), (173, 79, 5), (167, 82, 2), + (165, 78, 1), (182, 65, 0), (163, 42, 0), (145, 20, 0), + (135, 20, 2), (126, 20, 4), (132, 12, 7), (139, 4, 11), + (118, 0, 61), (85, 13, 76), (52, 26, 91), (40, 16, 87), + (28, 7, 84), (15, 5, 42), (3, 4, 0), (0, 0, 0), + (0, 0, 0), (79, 54, 34), (95, 52, 20), (112, 51, 6), + (120, 37, 3), (129, 23, 0), (129, 18, 1), (131, 7, 5), + (108, 4, 57), (77, 19, 115), (47, 35, 173), (71, 51, 186), + (95, 68, 199), (92, 67, 178), (90, 67, 158), (89, 62, 157), + (99, 47, 130), (97, 50, 130), (128, 84, 133), (159, 118, 136), + (161, 117, 133), (163, 117, 130), (189, 133, 120), (188, 91, 58), + (155, 91, 4), (154, 89, 3), (154, 88, 2), (155, 84, 1), + (157, 80, 0), (169, 77, 0), (182, 74, 12), (188, 62, 66), + (165, 94, 112), (94, 93, 169), (103, 110, 178), (113, 128, 187), + (120, 148, 200), (127, 168, 214), (156, 178, 192), (113, 136, 190), + (93, 89, 165), (113, 96, 154), (134, 103, 144), (134, 95, 138), + (134, 87, 133), (159, 78, 93), (162, 40, 79), (127, 52, 13), + (143, 51, 2), (122, 69, 15), (119, 60, 21), (116, 52, 27), + (84, 19, 53), (34, 51, 79), (8, 66, 88), (7, 99, 84), + (5, 88, 78), (6, 93, 56), (8, 98, 34), (7, 89, 57), + (6, 80, 81), (8, 63, 93), (11, 62, 93), (0, 60, 104), + (0, 60, 107), (42, 26, 89), (48, 25, 88), (55, 25, 87), + (83, 57, 34), (116, 22, 12), (127, 13, 21), (124, 0, 52), + (125, 9, 72), (116, 43, 108), (108, 77, 145), (112, 80, 143), + (117, 84, 141), (130, 98, 139), (133, 111, 157), (90, 67, 158), + (17, 46, 186), (63, 103, 224), (80, 111, 209), (97, 119, 195), + (160, 174, 177), (210, 173, 214), (230, 215, 148), (231, 201, 147), + (211, 97, 71), (210, 93, 69), (210, 89, 68), (213, 81, 56), + (194, 65, 69), (185, 51, 60), (169, 42, 69), (155, 30, 72), + (163, 7, 46), (170, 1, 30), (164, 1, 37), (158, 1, 44), + (147, 0, 44), (133, 0, 45), (125, 15, 28), (124, 65, 25), + (133, 97, 0), (111, 101, 8), (89, 105, 16), (51, 90, 23), + (18, 67, 81), (14, 52, 97), (4, 27, 133), (10, 6, 142), + (25, 3, 138), (33, 0, 149), (50, 0, 126), (82, 24, 108), + (133, 39, 89), (156, 39, 81), (156, 40, 79), (191, 55, 59), + (248, 79, 10), (224, 89, 8), (200, 100, 6), (164, 85, 6), + (151, 90, 1), (149, 92, 2), (133, 88, 3), (119, 58, 1), + (84, 63, 20), (79, 75, 30), (67, 74, 23), (8, 5, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 2, 1), (2, 16, 104), (0, 37, 125), (2, 9, 142), + (4, 0, 147), (11, 0, 154), (16, 0, 150), (22, 1, 158), + (6, 0, 177), (13, 36, 210), (1, 38, 249), (0, 48, 221), + (18, 12, 180), (62, 10, 137), (69, 26, 69), (112, 67, 25), + (147, 72, 7), (163, 90, 11), (198, 118, 111), (211, 158, 116), + (204, 143, 114), (140, 89, 104), (56, 50, 60), (43, 58, 61), + (2, 2, 2), (0, 0, 0), (7, 14, 0), (80, 80, 10), + (106, 128, 1), (98, 129, 0), (76, 124, 4), (70, 124, 2), + (10, 97, 19), (1, 111, 16), (30, 126, 28), (78, 126, 6), + (130, 131, 1), (133, 129, 3), (137, 124, 9), (139, 112, 5), + (146, 95, 6), (150, 94, 7), (160, 88, 6), (171, 79, 2), + (175, 71, 0), (184, 71, 0), (176, 76, 0), (168, 77, 0), + (163, 80, 0), (154, 87, 0), (150, 88, 1), (140, 89, 0), + (117, 58, 0), (111, 40, 10), (58, 12, 0), (0, 0, 0) + ), + +// 287 Apophysis-040427-51yggF +((47, 48, 42), (64, 65, 59), (76, 77, 71), (88, 89, 84), + (90, 90, 93), (92, 92, 102), (93, 93, 103), (94, 94, 104), + (100, 101, 96), (95, 96, 91), (91, 92, 87), (81, 84, 79), + (72, 77, 71), (61, 65, 63), (50, 54, 55), (48, 50, 52), + (47, 47, 49), (42, 41, 39), (42, 42, 38), (42, 43, 38), + (41, 42, 38), (41, 41, 39), (43, 43, 41), (45, 45, 43), + (54, 53, 49), (52, 55, 47), (50, 58, 45), (50, 54, 46), + (50, 50, 48), (50, 47, 46), (51, 45, 45), (52, 42, 40), + (48, 46, 47), (56, 59, 64), (64, 67, 74), (72, 75, 84), + (74, 78, 88), (77, 81, 92), (82, 84, 94), (87, 87, 97), + (84, 94, 83), (81, 87, 79), (79, 80, 75), (69, 70, 70), + (60, 61, 66), (57, 58, 63), (55, 56, 61), (53, 52, 57), + (50, 49, 54), (46, 45, 50), (43, 43, 44), (41, 41, 39), + (36, 36, 37), (31, 32, 36), (31, 31, 36), (32, 31, 36), + (22, 21, 26), (14, 16, 18), (6, 12, 10), (16, 19, 16), + (26, 27, 22), (28, 28, 25), (30, 30, 28), (36, 36, 34), + (42, 43, 38), (54, 56, 45), (56, 58, 49), (59, 60, 54), + (59, 60, 55), (60, 61, 56), (60, 60, 58), (59, 63, 64), + (59, 62, 71), (63, 65, 67), (68, 69, 64), (64, 64, 61), + (60, 60, 58), (59, 59, 57), (59, 59, 57), (56, 56, 54), + (52, 52, 50), (46, 47, 42), (45, 45, 41), (45, 44, 40), + (45, 44, 41), (45, 45, 43), (46, 46, 44), (46, 45, 50), + (45, 44, 49), (42, 41, 46), (39, 38, 43), (38, 37, 42), + (38, 37, 42), (42, 42, 40), (43, 43, 45), (47, 46, 51), + (50, 49, 54), (50, 49, 54), (48, 47, 51), (46, 46, 48), + (43, 43, 43), (41, 41, 39), (36, 36, 34), (32, 32, 30), + (32, 32, 30), (37, 37, 34), (42, 43, 38), (48, 49, 44), + (54, 55, 50), (62, 63, 58), (74, 70, 67), (81, 82, 76), + (84, 85, 80), (79, 80, 74), (78, 78, 74), (77, 77, 75), + (73, 74, 69), (73, 73, 71), (73, 73, 81), (75, 75, 85), + (89, 92, 99), (112, 105, 101), (135, 119, 103), (159, 120, 68), + (183, 122, 33), (175, 109, 22), (166, 103, 10), (121, 72, 3), + (104, 68, 8), (108, 111, 120), (121, 124, 132), (134, 137, 144), + (163, 162, 167), (184, 186, 181), (175, 190, 185), (167, 166, 172), + (127, 128, 133), (111, 112, 112), (96, 97, 91), (96, 97, 91), + (97, 98, 92), (117, 117, 119), (135, 141, 131), (143, 144, 148), + (166, 165, 161), (185, 185, 193), (205, 202, 212), (226, 220, 232), + (251, 229, 208), (254, 224, 200), (242, 213, 157), (243, 189, 129), + (144, 147, 126), (131, 133, 127), (119, 119, 129), (105, 105, 103), + (86, 87, 82), (73, 73, 71), (68, 68, 66), (64, 65, 60), + (60, 61, 56), (58, 59, 53), (58, 59, 54), (59, 60, 55), + (59, 60, 55), (60, 61, 55), (62, 61, 57), (63, 64, 59), + (67, 67, 65), (68, 69, 65), (70, 71, 66), (71, 72, 67), + (76, 76, 74), (93, 92, 88), (106, 107, 102), (159, 129, 101), + (215, 162, 94), (216, 165, 102), (217, 205, 181), (226, 227, 231), + (240, 243, 232), (253, 227, 200), (254, 217, 188), (248, 196, 139), + (180, 128, 29), (149, 98, 14), (118, 69, 0), (47, 49, 36), + (37, 37, 35), (27, 27, 29), (26, 25, 30), (24, 26, 23), + (29, 29, 27), (35, 35, 33), (40, 40, 38), (43, 44, 39), + (48, 49, 44), (53, 53, 51), (57, 56, 54), (58, 59, 53), + (59, 60, 54), (58, 59, 53), (54, 55, 50), (51, 52, 47), + (47, 47, 45), (44, 44, 42), (41, 46, 39), (41, 48, 41), + (46, 47, 42), (48, 49, 44), (50, 51, 46), (51, 52, 47), + (51, 51, 49), (50, 50, 50), (49, 50, 52), (52, 51, 56), + (54, 53, 58), (59, 59, 57), (61, 60, 56), (63, 62, 58), + (64, 65, 60), (64, 66, 61), (65, 65, 63), (63, 63, 61), + (58, 60, 59), (55, 54, 59), (53, 52, 57), (50, 49, 54), + (47, 46, 51), (45, 45, 43), (41, 41, 39), (37, 37, 35), + (35, 35, 33), (31, 31, 29), (29, 29, 27), (29, 29, 27), + (28, 28, 26), (28, 28, 26), (29, 30, 25), (31, 31, 23), + (32, 33, 27), (35, 35, 33), (38, 38, 36), (40, 39, 35), + (44, 43, 38), (45, 46, 41), (52, 53, 48), (58, 59, 53), + (59, 60, 55), (60, 61, 56), (62, 63, 58), (64, 65, 60), + (63, 64, 59), (59, 60, 55), (57, 57, 55), (48, 52, 53) + ), + +// 288 Apophysis-040427-51Gwrap +((0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (167, 112, 29), (200, 139, 27), (233, 166, 25), (242, 176, 62), + (252, 186, 99), (245, 188, 96), (239, 191, 93), (243, 186, 90), + (247, 181, 87), (160, 146, 107), (107, 130, 122), (54, 114, 138), + (27, 127, 116), (0, 141, 95), (16, 154, 83), (32, 167, 72), + (181, 172, 139), (134, 110, 122), (87, 49, 106), (43, 24, 53), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (82, 53, 26), (164, 107, 52), + (194, 137, 36), (224, 168, 21), (250, 151, 6), (234, 66, 27), + (220, 36, 28), (237, 30, 27), (254, 24, 26), (233, 12, 21), + (212, 0, 17), (152, 20, 9), (92, 40, 1), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (103, 49, 62), (178, 115, 44), (254, 181, 27), + (250, 181, 57), (247, 181, 87), (250, 183, 92), (254, 188, 29), + (255, 152, 0), (198, 107, 26), (141, 63, 53), (111, 57, 56), + (82, 51, 59), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (1, 0, 0), (132, 56, 32), (176, 90, 75), + (203, 90, 76), (184, 79, 57), (174, 62, 42), (95, 53, 31), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (49, 70, 63), + (166, 146, 119), (197, 190, 171), (255, 255, 243), (254, 255, 224), + (253, 255, 120), (251, 184, 95), (255, 57, 58), (190, 6, 30), + (92, 37, 43), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (1, 1, 1), (75, 118, 73), (103, 202, 0), + (170, 188, 76), (190, 188, 103), (185, 153, 52), (130, 104, 47), + (44, 47, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0) + ), + +// 289 Apophysis-040428-1Gradient1 +((28, 157, 73), (31, 129, 68), (15, 64, 34), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (22, 98, 0), (25, 142, 4), (28, 187, 8), (26, 202, 4), + (25, 218, 1), (25, 218, 1), (25, 218, 1), (25, 218, 1), + (25, 218, 1), (25, 218, 1), (25, 218, 1), (25, 218, 1), + (28, 218, 4), (31, 219, 7), (32, 219, 8), (33, 219, 10), + (20, 180, 76), (25, 158, 73), (31, 137, 71), (31, 68, 76), + (31, 0, 82), (30, 0, 95), (30, 0, 109), (32, 0, 162), + (26, 0, 166), (75, 0, 131), (117, 29, 98), (159, 59, 66), + (172, 101, 68), (185, 144, 71), (193, 143, 42), (202, 143, 14), + (255, 55, 0), (228, 52, 30), (202, 50, 61), (165, 85, 44), + (129, 121, 27), (150, 139, 17), (171, 157, 7), (236, 218, 10), + (243, 224, 10), (243, 224, 10), (216, 186, 40), (189, 148, 71), + (163, 138, 58), (137, 129, 46), (140, 126, 51), (144, 124, 57), + (150, 144, 66), (109, 150, 83), (68, 157, 101), (55, 78, 106), + (43, 0, 112), (55, 0, 124), (67, 0, 137), (63, 0, 154), + (55, 0, 145), (13, 53, 36), (18, 119, 18), (23, 186, 1), + (24, 202, 1), (25, 218, 1), (25, 218, 1), (25, 218, 1), + (25, 218, 1), (23, 190, 1), (21, 163, 2), (22, 154, 5), + (23, 145, 9), (25, 151, 41), (28, 157, 73), (56, 169, 96), + (73, 162, 105), (207, 151, 41), (225, 187, 25), (243, 224, 10), + (226, 193, 36), (209, 163, 62), (241, 233, 218), (236, 248, 240), + (243, 224, 10), (249, 219, 5), (255, 215, 0), (255, 196, 0), + (255, 178, 0), (255, 132, 0), (201, 91, 0), (213, 51, 63), + (207, 0, 35), (255, 9, 0), (255, 63, 0), (255, 118, 0), + (255, 144, 0), (255, 171, 0), (255, 211, 0), (243, 224, 10), + (243, 224, 10), (243, 224, 10), (243, 224, 10), (243, 224, 10), + (243, 224, 10), (255, 200, 0), (255, 160, 0), (255, 138, 0), + (203, 145, 18), (195, 146, 47), (205, 105, 61), (216, 65, 76), + (209, 40, 52), (242, 0, 10), (204, 0, 37), (207, 50, 60), + (150, 58, 66), (90, 67, 41), (30, 77, 17), (23, 81, 11), + (17, 85, 6), (17, 74, 6), (14, 53, 7), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (18, 18, 13), (36, 36, 27), + (38, 68, 26), (61, 61, 45), (76, 61, 8), (32, 73, 18), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (13, 74, 5), (18, 129, 4), (32, 189, 10), + (28, 218, 4), (32, 219, 9), (34, 219, 11), (37, 219, 14), + (73, 190, 54), (66, 195, 111), (136, 236, 124), (183, 227, 199), + (73, 179, 110), (73, 177, 109), (73, 176, 109), (73, 176, 109), + (74, 155, 105), (141, 117, 55), (159, 59, 66), (189, 55, 65), + (202, 52, 63), (218, 76, 86), (210, 38, 159), (203, 0, 233), + (139, 0, 221), (127, 0, 233), (73, 0, 157), (55, 0, 109), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (14, 58, 6), (18, 86, 6), (12, 113, 0), + (19, 121, 4), (31, 147, 74), (62, 170, 100), (68, 173, 105), + (68, 173, 105), (49, 165, 90), (51, 109, 39), (29, 82, 15), + (47, 80, 0), (44, 85, 0), (42, 91, 0), (46, 128, 31), + (31, 147, 74), (32, 166, 80), (37, 160, 80), (45, 136, 29), + (23, 145, 9), (17, 126, 3), (12, 113, 0), (19, 130, 5), + (20, 156, 2), (25, 190, 4), (25, 218, 1), (28, 218, 4), + (43, 200, 0), (98, 174, 0), (222, 205, 9), (243, 224, 10), + (243, 224, 10), (243, 224, 10), (243, 224, 10), (255, 207, 0), + (239, 171, 21), (203, 145, 18), (140, 132, 45), (64, 165, 52), + (45, 173, 27), (31, 214, 9), (30, 207, 8), (71, 158, 0), + (104, 93, 21), (91, 91, 68), (72, 111, 92), (118, 58, 63), + (153, 0, 74), (159, 0, 70), (169, 0, 62), (176, 0, 45), + (133, 22, 30), (98, 76, 19), (19, 111, 5), (20, 153, 3), + (30, 207, 8), (33, 219, 10), (41, 201, 20), (47, 165, 88), + (66, 163, 101), (71, 162, 104), (113, 144, 129), (152, 145, 68), + (198, 155, 69), (209, 162, 61), (209, 162, 63), (201, 157, 69), + (208, 188, 181), (173, 137, 125), (161, 59, 67), (122, 58, 63), + (131, 21, 30), (73, 8, 13), (117, 18, 25), (128, 61, 37), + (126, 105, 22), (162, 55, 0), (197, 30, 43), (202, 0, 39), + (192, 0, 46), (191, 43, 54), (169, 119, 30), (169, 59, 67) + ), + +// 290 Apophysis-040428-3Gradient2 +((0, 97, 216), (82, 149, 179), (115, 153, 172), (148, 157, 166), + (146, 144, 131), (144, 132, 97), (139, 133, 99), (134, 134, 102), + (91, 95, 94), (91, 95, 94), (91, 95, 94), (101, 99, 86), + (112, 104, 79), (128, 114, 69), (145, 124, 60), (119, 100, 48), + (93, 77, 37), (54, 54, 40), (70, 72, 64), (86, 90, 89), + (137, 131, 132), (188, 173, 175), (187, 183, 185), (186, 193, 195), + (244, 216, 216), (206, 192, 192), (168, 168, 168), (104, 114, 156), + (40, 61, 144), (31, 40, 140), (22, 19, 137), (3, 0, 128), + (3, 0, 128), (1, 0, 37), (0, 0, 18), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (7, 7, 5), + (15, 15, 11), (18, 18, 13), (21, 21, 16), (38, 38, 28), + (73, 73, 54), (116, 186, 132), (155, 182, 131), (194, 179, 130), + (195, 159, 78), (196, 139, 26), (183, 129, 29), (170, 120, 32), + (104, 78, 24), (65, 52, 25), (27, 27, 27), (14, 14, 13), + (1, 1, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (4, 4, 3), + (8, 8, 6), (22, 22, 16), (28, 39, 15), (35, 101, 0), + (64, 178, 0), (215, 33, 24), (185, 21, 21), (155, 10, 19), + (137, 12, 21), (119, 14, 23), (64, 5, 10), (15, 15, 11), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (41, 8, 1), + (59, 37, 0), (44, 44, 33), (46, 46, 34), (48, 48, 36), + (56, 62, 66), (73, 53, 144), (126, 64, 95), (180, 129, 97), + (202, 174, 132), (214, 187, 141), (226, 201, 150), (233, 200, 138), + (240, 199, 127), (236, 176, 60), (228, 148, 6), (255, 69, 0), + (253, 40, 19), (221, 12, 26), (190, 6, 13), (160, 0, 0), + (145, 15, 18), (97, 45, 30), (97, 78, 39), (87, 87, 65), + (89, 120, 73), (85, 124, 71), (82, 129, 70), (56, 110, 68), + (31, 92, 67), (5, 80, 0), (30, 30, 22), (42, 32, 57), + (54, 17, 113), (22, 19, 142), (41, 11, 138), (61, 3, 135), + (82, 8, 143), (110, 5, 141), (86, 4, 137), (68, 0, 114), + (23, 21, 37), (23, 22, 27), (23, 23, 17), (22, 22, 16), + (24, 24, 18), (55, 15, 22), (114, 17, 89), (168, 6, 103), + (178, 14, 128), (80, 5, 135), (42, 4, 131), (4, 3, 128), + (1, 0, 36), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (23, 23, 17), (31, 31, 28), (39, 39, 39), (52, 39, 91), + (66, 15, 125), (59, 55, 151), (58, 56, 156), (113, 121, 125), + (135, 149, 159), (138, 142, 145), (91, 95, 94), (48, 48, 48), + (38, 38, 28), (21, 21, 16), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (36, 7, 1), (70, 45, 1), + (88, 56, 0), (143, 95, 3), (196, 130, 4), (228, 148, 9), + (228, 150, 13), (232, 163, 42), (233, 172, 64), (190, 178, 76), + (146, 141, 97), (122, 112, 84), (124, 67, 63), (111, 78, 27), + (168, 16, 20), (197, 51, 38), (161, 89, 66), (185, 127, 96), + (212, 130, 125), (245, 162, 168), (228, 188, 140), (209, 187, 160), + (191, 189, 153), (210, 196, 152), (252, 202, 101), (238, 185, 71), + (247, 175, 48), (233, 161, 34), (240, 161, 17), (230, 146, 0), + (230, 146, 0), (255, 84, 0), (238, 7, 0), (232, 11, 26), + (153, 8, 19), (75, 6, 12), (41, 8, 1), (7, 7, 5), + (0, 0, 0), (1, 1, 1), (15, 15, 11), (19, 19, 19), + (0, 16, 87), (0, 55, 114), (0, 113, 80), (82, 131, 67), + (90, 178, 40), (99, 151, 86), (90, 138, 79), (87, 87, 65), + (68, 64, 42), (57, 57, 42), (91, 63, 46), (148, 51, 66), + (177, 9, 169), (205, 9, 169), (205, 9, 169), (206, 9, 169), + (206, 9, 169), (217, 65, 165), (216, 120, 119), (216, 143, 31), + (224, 148, 14), (201, 127, 0), (167, 124, 105), (187, 141, 58) + ), + +// 291 Apophysis-040602-1 +((255, 255, 255), (255, 255, 255), (236, 214, 211), (218, 173, 167), + (184, 166, 158), (150, 160, 150), (150, 160, 150), (150, 160, 150), + (140, 150, 140), (140, 150, 140), (140, 150, 140), (140, 150, 140), + (140, 150, 140), (140, 150, 140), (140, 150, 140), (140, 150, 140), + (140, 150, 140), (97, 83, 57), (104, 101, 84), (111, 119, 111), + (125, 134, 125), (140, 150, 140), (140, 150, 140), (140, 150, 140), + (148, 158, 148), (149, 159, 149), (150, 160, 150), (145, 155, 145), + (140, 150, 140), (134, 127, 103), (128, 104, 66), (161, 59, 19), + (209, 127, 0), (182, 125, 108), (161, 137, 124), (140, 150, 140), + (140, 150, 140), (140, 150, 140), (140, 150, 140), (140, 150, 140), + (115, 97, 57), (160, 100, 51), (206, 103, 45), (181, 121, 90), + (157, 139, 135), (152, 147, 141), (147, 156, 147), (150, 160, 150), + (150, 160, 150), (150, 160, 150), (150, 160, 150), (150, 160, 150), + (150, 160, 150), (150, 160, 150), (150, 160, 150), (150, 160, 150), + (140, 150, 140), (140, 150, 140), (140, 150, 140), (140, 150, 140), + (140, 150, 140), (140, 150, 140), (140, 150, 140), (140, 150, 140), + (140, 150, 140), (140, 150, 140), (140, 150, 140), (140, 150, 140), + (140, 150, 140), (140, 150, 140), (93, 99, 93), (91, 71, 47), + (3, 9, 5), (1, 4, 2), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (1, 1, 0), (25, 9, 0), + (71, 47, 13), (133, 83, 60), (136, 116, 100), (140, 150, 140), + (145, 155, 145), (150, 160, 150), (150, 160, 150), (184, 166, 126), + (255, 237, 174), (231, 221, 194), (208, 205, 214), (179, 182, 182), + (150, 160, 150), (140, 150, 140), (138, 148, 138), (87, 93, 87), + (1, 28, 117), (150, 160, 150), (202, 207, 202), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (150, 160, 150), (140, 150, 140), + (93, 92, 62), (43, 35, 22), (27, 25, 11), (12, 15, 0), + (1, 3, 0), (0, 0, 0), (1, 1, 1), (4, 3, 0), + (60, 52, 39), (100, 101, 89), (140, 150, 140), (140, 150, 140), + (140, 150, 140), (140, 150, 140), (140, 150, 140), (140, 150, 140), + (140, 150, 140), (140, 150, 140), (140, 150, 140), (140, 150, 140), + (87, 93, 87), (52, 41, 37), (26, 21, 15), (4, 4, 2), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (1, 1, 1), (1, 0, 3), (1, 0, 5), + (1, 0, 9), (17, 15, 54), (38, 58, 108), (103, 115, 107), + (140, 150, 140), (140, 150, 140), (140, 150, 140), (149, 151, 127), + (122, 131, 122), (115, 60, 40), (97, 28, 21), (22, 8, 8), + (4, 0, 2), (1, 0, 0), (2, 0, 0), (4, 0, 0), + (22, 0, 0), (69, 2, 19), (114, 21, 16), (102, 80, 56), + (140, 150, 140), (140, 150, 140), (140, 150, 140), (140, 150, 140), + (140, 150, 140), (140, 150, 140), (140, 150, 140), (140, 150, 140), + (140, 150, 140), (150, 160, 150), (150, 160, 150), (212, 208, 200), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (212, 208, 200), (150, 160, 150), (150, 160, 150), + (150, 160, 150), (150, 160, 150), (150, 160, 150), (150, 160, 150), + (150, 160, 150), (140, 150, 140), (140, 150, 140), (140, 150, 140), + (140, 150, 140), (140, 150, 140), (140, 150, 140), (140, 150, 140), + (140, 150, 140), (140, 150, 140), (150, 160, 150), (150, 160, 150), + (150, 160, 150), (150, 160, 150), (150, 160, 150), (150, 160, 150), + (150, 160, 150), (150, 160, 150), (150, 160, 150), (150, 160, 150), + (150, 160, 150), (150, 160, 150), (209, 182, 161), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (150, 160, 150), + (139, 148, 139), (93, 99, 93), (48, 64, 64), (11, 17, 53), + (0, 23, 117), (0, 23, 119), (3, 21, 119), (2, 22, 109), + (1, 0, 9), (0, 0, 5), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (1, 1, 0), (3, 0, 0), (7, 0, 0), + (56, 21, 2), (117, 65, 43), (150, 136, 107), (150, 160, 150), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255) + ), + +// 292 Apophysis-040531-100figurine_2abcd +((210, 159, 138), (220, 182, 145), (209, 178, 152), (198, 175, 159), + (208, 159, 148), (218, 143, 137), (211, 123, 155), (204, 104, 174), + (207, 57, 154), (190, 58, 127), (174, 59, 100), (142, 46, 95), + (111, 33, 91), (110, 38, 90), (109, 43, 89), (116, 41, 92), + (123, 40, 96), (133, 54, 119), (134, 61, 133), (135, 68, 148), + (123, 99, 151), (111, 131, 155), (107, 134, 164), (104, 138, 173), + (97, 130, 165), (91, 124, 159), (85, 118, 153), (100, 99, 148), + (115, 80, 144), (128, 83, 132), (142, 86, 121), (177, 116, 111), + (190, 135, 130), (184, 183, 152), (190, 148, 153), (196, 113, 155), + (188, 78, 186), (180, 43, 217), (164, 38, 190), (148, 33, 164), + (73, 36, 116), (59, 21, 95), (46, 7, 74), (44, 5, 67), + (43, 4, 61), (43, 4, 62), (43, 5, 64), (44, 4, 64), + (53, 8, 73), (79, 31, 91), (99, 47, 97), (120, 64, 103), + (140, 74, 103), (161, 84, 104), (170, 83, 105), (180, 82, 107), + (176, 70, 108), (159, 59, 104), (142, 48, 100), (117, 39, 97), + (93, 31, 94), (91, 36, 95), (90, 41, 97), (69, 77, 80), + (59, 77, 115), (80, 106, 155), (77, 107, 149), (75, 109, 144), + (70, 101, 139), (66, 94, 134), (70, 92, 129), (57, 75, 121), + (55, 74, 116), (64, 83, 121), (73, 93, 126), (88, 107, 127), + (103, 122, 129), (89, 114, 134), (76, 106, 140), (72, 83, 147), + (78, 43, 109), (68, 27, 93), (63, 19, 86), (59, 12, 80), + (57, 11, 77), (56, 10, 75), (56, 10, 74), (46, 42, 75), + (48, 52, 100), (61, 44, 107), (75, 37, 114), (74, 34, 112), + (73, 32, 111), (82, 29, 101), (91, 30, 89), (107, 40, 93), + (117, 50, 101), (142, 58, 120), (152, 44, 130), (163, 31, 140), + (155, 39, 122), (148, 47, 105), (117, 31, 104), (109, 31, 93), + (89, 23, 113), (72, 15, 100), (56, 7, 88), (56, 8, 86), + (56, 10, 85), (57, 9, 83), (72, 15, 83), (85, 14, 80), + (92, 24, 73), (108, 29, 86), (119, 33, 90), (131, 38, 95), + (160, 67, 96), (189, 90, 119), (203, 90, 134), (203, 98, 115), + (206, 117, 123), (208, 127, 131), (210, 138, 139), (210, 137, 133), + (210, 136, 127), (203, 127, 131), (199, 131, 132), (182, 119, 136), + (163, 131, 144), (135, 140, 196), (126, 145, 187), (117, 151, 179), + (92, 118, 151), (92, 74, 116), (90, 47, 101), (81, 31, 92), + (80, 26, 102), (73, 26, 98), (66, 27, 94), (63, 27, 95), + (61, 28, 97), (48, 64, 98), (55, 74, 114), (45, 53, 92), + (43, 40, 83), (64, 23, 89), (68, 23, 87), (72, 24, 86), + (80, 21, 89), (86, 27, 91), (100, 38, 89), (113, 50, 93), + (205, 48, 115), (203, 48, 140), (202, 49, 165), (188, 56, 217), + (215, 60, 224), (205, 103, 213), (192, 114, 215), (236, 164, 202), + (239, 170, 199), (204, 198, 212), (204, 183, 195), (205, 169, 179), + (166, 121, 162), (132, 90, 138), (125, 62, 109), (93, 47, 96), + (63, 15, 77), (58, 11, 75), (54, 8, 73), (57, 9, 71), + (68, 14, 74), (91, 21, 83), (110, 36, 95), (149, 56, 113), + (183, 86, 117), (194, 110, 123), (197, 115, 127), (199, 123, 127), + (192, 111, 126), (189, 105, 128), (172, 104, 119), (144, 88, 115), + (134, 67, 100), (125, 59, 96), (116, 51, 93), (109, 47, 98), + (104, 45, 89), (99, 37, 88), (93, 44, 91), (101, 47, 97), + (108, 63, 102), (115, 79, 117), (140, 84, 111), (165, 99, 103), + (184, 106, 122), (181, 119, 130), (175, 126, 130), (159, 94, 118), + (143, 68, 111), (133, 63, 100), (126, 48, 96), (125, 59, 95), + (123, 72, 105), (134, 79, 110), (152, 71, 140), (190, 48, 158), + (179, 76, 185), (146, 91, 158), (136, 108, 157), (131, 140, 181), + (101, 131, 165), (96, 95, 127), (88, 70, 118), (82, 40, 106), + (86, 31, 88), (90, 29, 86), (91, 30, 89), (99, 30, 87), + (101, 31, 85), (103, 28, 87), (101, 27, 86), (101, 25, 89), + (94, 24, 87), (78, 22, 85), (70, 20, 81), (71, 18, 74), + (66, 19, 74), (62, 12, 73), (54, 10, 71), (47, 5, 68), + (47, 6, 66), (47, 6, 66), (51, 6, 71), (55, 6, 72), + (58, 6, 72), (57, 11, 76), (74, 13, 80), (88, 15, 84), + (95, 19, 81), (87, 30, 81), (80, 32, 90), (72, 27, 94), + (68, 19, 110), (66, 17, 109), (56, 9, 89), (49, 7, 81), + (46, 6, 76), (47, 7, 77), (54, 8, 81), (69, 21, 81), + (85, 31, 89), (106, 60, 99), (145, 91, 114), (161, 109, 121) + ), + +// 293 Apo-040627-1_chickadee_pix +((148, 120, 109), (130, 103, 92), (115, 95, 94), (101, 88, 97), + (103, 83, 81), (105, 79, 66), (106, 80, 67), (107, 81, 68), + (133, 108, 101), (128, 112, 115), (124, 116, 129), (134, 119, 120), + (145, 123, 112), (144, 123, 115), (144, 123, 118), (144, 123, 121), + (145, 123, 125), (147, 122, 115), (167, 143, 113), (187, 164, 112), + (195, 174, 127), (204, 185, 143), (221, 197, 165), (238, 210, 188), + (158, 137, 134), (136, 117, 109), (115, 97, 85), (91, 73, 62), + (68, 50, 40), (59, 43, 35), (50, 37, 31), (33, 20, 4), + (23, 9, 0), (5, 0, 1), (3, 1, 1), (1, 3, 2), + (6, 4, 3), (11, 5, 5), (20, 15, 8), (29, 26, 11), + (87, 57, 29), (119, 92, 25), (151, 127, 21), (176, 145, 10), + (202, 163, 0), (191, 160, 3), (181, 157, 7), (154, 141, 27), + (156, 111, 44), (142, 115, 104), (148, 119, 108), (154, 124, 113), + (154, 127, 116), (154, 130, 120), (153, 128, 119), (153, 126, 119), + (150, 122, 111), (148, 121, 110), (147, 120, 109), (142, 114, 103), + (137, 109, 98), (135, 107, 97), (134, 105, 97), (138, 108, 97), + (139, 111, 100), (148, 120, 109), (144, 118, 109), (141, 116, 109), + (140, 116, 110), (140, 116, 112), (137, 114, 108), (132, 105, 98), + (115, 88, 81), (107, 84, 75), (100, 80, 69), (87, 69, 60), + (75, 58, 51), (68, 52, 47), (62, 47, 44), (60, 46, 45), + (60, 50, 61), (52, 45, 39), (56, 44, 36), (61, 43, 33), + (59, 42, 32), (58, 41, 31), (52, 39, 33), (43, 33, 32), + (39, 31, 12), (38, 32, 20), (37, 34, 29), (42, 36, 34), + (47, 38, 39), (57, 43, 34), (60, 46, 35), (59, 46, 40), + (64, 50, 50), (67, 55, 67), (64, 54, 68), (61, 54, 70), + (66, 57, 70), (72, 60, 70), (86, 65, 60), (87, 67, 56), + (76, 58, 48), (64, 48, 38), (53, 39, 28), (44, 33, 17), + (35, 27, 6), (25, 23, 10), (13, 8, 5), (7, 1, 1), + (3, 0, 0), (0, 1, 0), (0, 0, 0), (1, 0, 0), + (5, 0, 0), (5, 1, 0), (12, 8, 0), (20, 18, 0), + (49, 34, 15), (60, 44, 27), (72, 54, 40), (76, 58, 45), + (81, 63, 51), (97, 77, 66), (101, 78, 72), (103, 80, 72), + (117, 92, 87), (130, 100, 89), (125, 96, 81), (120, 93, 74), + (123, 85, 62), (148, 113, 31), (184, 127, 22), (156, 109, 1), + (90, 69, 2), (62, 43, 2), (35, 17, 3), (33, 12, 1), + (31, 7, 0), (24, 6, 0), (19, 1, 0), (17, 4, 0), + (15, 5, 0), (13, 6, 0), (14, 6, 0), (15, 6, 1), + (21, 7, 0), (32, 22, 0), (38, 17, 0), (46, 34, 0), + (55, 39, 26), (55, 40, 30), (55, 42, 34), (58, 44, 33), + (56, 43, 35), (45, 34, 32), (36, 23, 15), (29, 10, 12), + (9, 8, 13), (10, 6, 0), (9, 5, 0), (9, 4, 0), + (9, 1, 0), (11, 1, 0), (16, 8, 0), (31, 10, 15), + (48, 39, 40), (53, 41, 40), (58, 44, 41), (59, 45, 42), + (71, 51, 42), (77, 61, 48), (98, 75, 61), (104, 77, 66), + (109, 82, 71), (111, 89, 78), (119, 92, 83), (133, 105, 93), + (152, 119, 104), (164, 133, 115), (160, 151, 142), (178, 158, 167), + (215, 204, 208), (205, 195, 196), (196, 186, 185), (171, 162, 157), + (145, 134, 112), (127, 103, 91), (115, 93, 82), (100, 76, 64), + (79, 57, 44), (70, 48, 24), (51, 37, 24), (29, 26, 19), + (15, 10, 17), (11, 6, 3), (6, 5, 1), (15, 10, 6), + (36, 22, 13), (57, 40, 30), (72, 53, 39), (94, 67, 48), + (105, 79, 64), (107, 81, 66), (102, 76, 63), (87, 65, 51), + (71, 53, 41), (60, 42, 30), (57, 40, 30), (62, 48, 3), + (61, 51, 0), (69, 47, 0), (99, 72, 27), (110, 87, 45), + (127, 101, 86), (150, 120, 110), (160, 147, 138), (178, 170, 149), + (201, 187, 187), (219, 206, 213), (229, 212, 202), (217, 208, 209), + (187, 171, 174), (155, 132, 126), (130, 103, 94), (106, 79, 70), + (93, 70, 52), (78, 59, 45), (67, 49, 39), (63, 45, 33), + (70, 51, 37), (77, 59, 47), (81, 74, 46), (96, 74, 63), + (93, 71, 57), (84, 60, 50), (70, 52, 32), (50, 41, 26), + (44, 27, 7), (41, 36, 0), (53, 45, 9), (61, 44, 34), + (82, 60, 47), (100, 77, 63), (108, 82, 69), (122, 95, 84), + (126, 104, 93), (132, 108, 98), (141, 113, 102), (141, 113, 109), + (138, 111, 104), (131, 106, 101), (125, 101, 99), (117, 98, 84) + ), + + + +// 294 2u0026t.jpg from bTomchek +((95, 14, 0), (88, 23, 17), (91, 40, 23), (94, 57, 30), + (97, 63, 20), (100, 70, 10), (96, 68, 8), (93, 67, 6), + (89, 32, 12), (93, 23, 17), (98, 15, 23), (100, 14, 20), + (102, 13, 17), (106, 11, 15), (110, 9, 13), (112, 9, 14), + (115, 10, 15), (124, 27, 10), (133, 44, 14), (142, 61, 18), + (136, 77, 21), (131, 94, 24), (131, 103, 16), (131, 112, 9), + (141, 107, 7), (153, 104, 3), (166, 101, 0), (172, 109, 5), + (178, 117, 10), (179, 118, 8), (181, 119, 6), (181, 117, 9), + (179, 114, 10), (147, 100, 8), (137, 90, 8), (127, 80, 8), + (131, 77, 6), (135, 75, 5), (135, 75, 9), (135, 75, 13), + (150, 99, 16), (155, 97, 13), (161, 95, 11), (165, 103, 5), + (169, 112, 0), (165, 121, 0), (161, 131, 0), (163, 133, 0), + (165, 135, 1), (152, 120, 9), (140, 94, 11), (128, 69, 13), + (121, 53, 13), (115, 37, 14), (116, 29, 15), (117, 22, 16), + (101, 9, 12), (99, 14, 16), (98, 20, 20), (105, 30, 16), + (112, 41, 13), (120, 51, 9), (128, 61, 6), (130, 72, 0), + (136, 89, 0), (143, 78, 10), (139, 77, 12), (135, 77, 14), + (130, 68, 17), (125, 60, 20), (110, 42, 23), (107, 34, 25), + (125, 51, 26), (130, 52, 20), (135, 53, 15), (136, 57, 13), + (137, 61, 11), (140, 68, 9), (144, 75, 8), (160, 81, 2), + (165, 77, 5), (136, 62, 0), (123, 44, 1), (110, 26, 2), + (104, 22, 1), (99, 18, 0), (90, 12, 8), (87, 6, 5), + (95, 6, 8), (94, 10, 11), (94, 14, 15), (92, 13, 17), + (90, 13, 19), (90, 22, 21), (99, 32, 23), (99, 42, 23), + (107, 38, 22), (117, 49, 36), (127, 51, 26), (137, 53, 16), + (144, 55, 22), (151, 57, 29), (144, 73, 41), (135, 72, 28), + (134, 60, 33), (123, 48, 24), (113, 36, 16), (112, 28, 10), + (112, 20, 5), (112, 14, 3), (113, 19, 7), (119, 43, 9), + (129, 50, 11), (128, 43, 14), (125, 39, 18), (123, 35, 23), + (112, 33, 18), (115, 25, 16), (112, 16, 17), (103, 8, 16), + (109, 29, 20), (113, 30, 25), (117, 31, 30), (117, 29, 32), + (118, 27, 34), (106, 28, 28), (105, 23, 25), (103, 18, 11), + (103, 16, 7), (128, 43, 4), (129, 54, 4), (131, 65, 4), + (141, 79, 0), (159, 87, 2), (167, 92, 9), (176, 100, 14), + (174, 119, 16), (174, 120, 14), (175, 121, 13), (174, 118, 10), + (173, 115, 8), (164, 103, 0), (164, 101, 0), (153, 103, 14), + (150, 120, 10), (137, 149, 5), (147, 151, 3), (157, 154, 1), + (166, 140, 4), (173, 146, 0), (172, 136, 0), (174, 130, 0), + (184, 152, 5), (187, 154, 7), (191, 156, 10), (180, 156, 0), + (184, 147, 0), (183, 137, 0), (183, 132, 4), (179, 129, 4), + (182, 132, 7), (174, 118, 33), (169, 110, 43), (165, 103, 54), + (145, 94, 28), (150, 77, 36), (140, 79, 25), (147, 85, 10), + (147, 84, 7), (144, 84, 3), (142, 84, 0), (155, 84, 2), + (160, 87, 0), (157, 85, 0), (155, 82, 3), (140, 71, 2), + (135, 66, 0), (129, 58, 0), (115, 49, 0), (110, 33, 5), + (97, 19, 0), (82, 14, 0), (86, 11, 6), (86, 7, 12), + (76, 21, 14), (80, 23, 16), (84, 25, 19), (90, 29, 24), + (106, 42, 15), (104, 60, 0), (104, 54, 0), (109, 34, 5), + (101, 19, 7), (106, 14, 1), (115, 28, 1), (134, 47, 4), + (133, 69, 5), (151, 86, 6), (161, 87, 0), (170, 92, 7), + (166, 97, 2), (162, 97, 3), (157, 98, 6), (154, 95, 3), + (139, 98, 0), (125, 98, 9), (126, 76, 5), (124, 63, 0), + (114, 56, 8), (103, 66, 13), (117, 61, 14), (127, 63, 15), + (133, 65, 16), (138, 68, 17), (151, 84, 13), (158, 103, 13), + (169, 118, 11), (176, 124, 4), (175, 127, 1), (175, 139, 0), + (171, 146, 1), (167, 148, 7), (170, 150, 3), (174, 160, 1), + (178, 159, 5), (178, 162, 4), (176, 173, 8), (177, 172, 10), + (168, 163, 9), (177, 172, 6), (180, 172, 1), (181, 191, 8), + (177, 175, 4), (160, 167, 2), (152, 163, 0), (152, 155, 2), + (142, 146, 7), (151, 125, 4), (148, 115, 10), (140, 98, 0), + (128, 80, 0), (123, 70, 0), (120, 55, 1), (126, 43, 9), + (121, 33, 11), (128, 18, 17), (129, 20, 17), (143, 39, 14), + (147, 71, 9), (148, 90, 6), (149, 110, 7), (156, 132, 0), + (165, 139, 0), (168, 140, 0), (166, 132, 6), (169, 139, 17) + ), + +// 295 2u0007t.jpg +((41, 88, 10), (77, 67, 16), (81, 66, 19), (86, 65, 22), + (89, 70, 27), (92, 75, 32), (69, 79, 31), (47, 84, 30), + (50, 38, 48), (58, 33, 45), (67, 29, 42), (56, 60, 57), + (45, 92, 72), (54, 104, 99), (64, 116, 127), (67, 120, 143), + (70, 124, 160), (96, 157, 178), (105, 163, 177), (114, 169, 176), + (111, 158, 104), (108, 148, 33), (115, 144, 28), (122, 141, 23), + (68, 99, 130), (62, 116, 143), (56, 134, 157), (45, 105, 142), + (34, 77, 128), (17, 77, 98), (0, 77, 69), (0, 78, 75), + (51, 121, 131), (89, 156, 185), (105, 150, 183), (121, 145, 181), + (123, 129, 174), (126, 113, 167), (117, 102, 162), (108, 92, 157), + (92, 15, 47), (134, 9, 52), (177, 4, 57), (181, 51, 49), + (185, 99, 42), (176, 108, 45), (168, 118, 49), (176, 155, 38), + (178, 160, 36), (167, 161, 25), (128, 158, 23), (90, 156, 22), + (74, 152, 50), (58, 148, 78), (64, 161, 104), (71, 174, 131), + (104, 137, 182), (120, 121, 174), (137, 106, 166), (150, 118, 99), + (163, 131, 32), (176, 144, 28), (190, 157, 24), (203, 165, 42), + (198, 120, 37), (195, 78, 34), (180, 84, 28), (165, 90, 23), + (142, 90, 28), (120, 91, 33), (39, 65, 56), (15, 66, 57), + (56, 36, 35), (64, 28, 39), (72, 20, 43), (67, 25, 57), + (63, 31, 72), (73, 51, 111), (83, 72, 151), (92, 80, 144), + (143, 30, 76), (134, 30, 27), (151, 47, 30), (169, 64, 34), + (175, 83, 35), (181, 102, 36), (188, 124, 37), (190, 147, 43), + (179, 189, 66), (172, 175, 52), (165, 161, 38), (149, 149, 32), + (133, 137, 26), (159, 126, 29), (171, 116, 33), (198, 120, 37), + (209, 105, 44), (187, 110, 30), (169, 116, 26), (152, 123, 23), + (152, 144, 23), (153, 166, 24), (133, 158, 40), (114, 182, 133), + (138, 184, 197), (119, 177, 196), (101, 171, 196), (91, 170, 191), + (82, 169, 186), (83, 160, 186), (89, 161, 175), (108, 153, 184), + (114, 160, 194), (134, 179, 158), (131, 168, 103), (128, 157, 49), + (159, 150, 33), (164, 142, 22), (176, 155, 28), (179, 139, 26), + (178, 136, 24), (161, 125, 21), (144, 114, 18), (129, 104, 22), + (115, 94, 27), (95, 80, 25), (102, 97, 31), (113, 103, 14), + (105, 102, 0), (112, 130, 18), (110, 132, 18), (108, 135, 18), + (88, 127, 12), (89, 121, 0), (101, 117, 0), (101, 111, 0), + (77, 74, 7), (69, 48, 5), (61, 23, 4), (57, 29, 20), + (54, 36, 36), (23, 11, 85), (29, 25, 101), (20, 38, 124), + (29, 75, 127), (69, 79, 138), (71, 85, 136), (73, 92, 134), + (76, 91, 150), (83, 143, 179), (110, 174, 201), (124, 186, 207), + (129, 181, 194), (102, 171, 188), (75, 162, 182), (31, 157, 135), + (22, 146, 110), (50, 149, 94), (45, 155, 116), (87, 175, 161), + (133, 188, 195), (139, 196, 205), (143, 196, 207), (147, 196, 210), + (170, 219, 223), (173, 211, 170), (163, 204, 160), (125, 194, 163), + (50, 151, 107), (37, 129, 96), (25, 107, 85), (20, 88, 65), + (46, 92, 56), (50, 131, 29), (58, 126, 15), (67, 126, 0), + (84, 121, 7), (77, 111, 1), (71, 77, 3), (68, 59, 0), + (68, 56, 8), (87, 50, 8), (91, 47, 8), (86, 59, 12), + (117, 102, 17), (133, 109, 17), (149, 117, 18), (156, 110, 14), + (164, 95, 30), (181, 114, 35), (197, 92, 44), (197, 94, 36), + (168, 95, 27), (162, 73, 29), (117, 71, 21), (100, 35, 33), + (58, 29, 34), (36, 24, 36), (42, 26, 29), (57, 27, 17), + (30, 21, 26), (31, 18, 25), (33, 17, 0), (16, 18, 0), + (10, 36, 27), (24, 35, 39), (49, 54, 24), (70, 91, 16), + (63, 119, 10), (62, 125, 10), (45, 136, 7), (33, 132, 15), + (48, 150, 25), (5, 157, 46), (13, 134, 63), (16, 171, 80), + (28, 189, 75), (35, 171, 89), (40, 160, 71), (49, 155, 54), + (50, 122, 76), (73, 123, 50), (122, 105, 35), (150, 93, 38), + (154, 75, 42), (134, 40, 40), (116, 35, 31), (86, 26, 28), + (64, 47, 21), (23, 64, 4), (50, 87, 7), (62, 96, 9), + (60, 110, 15), (55, 110, 52), (55, 126, 96), (75, 127, 149), + (66, 147, 174), (68, 161, 179), (45, 160, 167), (55, 160, 117), + (56, 145, 81), (98, 128, 38), (139, 121, 39), (139, 123, 28), + (126, 121, 19), (119, 111, 48), (99, 129, 67), (64, 121, 88), + (54, 144, 93), (86, 147, 106), (96, 104, 65), (72, 54, 50), + (80, 24, 23), (82, 24, 20), (93, 67, 8), (122, 93, 15) + ), + +// 296 2u0010t.jpg +((42, 44, 67), (60, 55, 77), (43, 47, 79), (27, 39, 81), + (18, 30, 79), (10, 21, 77), (17, 16, 69), (25, 11, 62), + (46, 32, 67), (54, 46, 83), (62, 60, 100), (58, 80, 94), + (55, 101, 88), (57, 102, 90), (60, 103, 93), (63, 89, 98), + (66, 76, 103), (37, 33, 107), (22, 18, 105), (8, 3, 103), + (4, 8, 84), (0, 13, 65), (4, 9, 48), (9, 5, 32), + (10, 13, 0), (9, 23, 22), (9, 33, 45), (16, 31, 66), + (24, 29, 87), (29, 32, 89), (34, 35, 92), (46, 36, 88), + (43, 43, 79), (28, 36, 99), (35, 29, 112), (43, 22, 125), + (31, 19, 136), (19, 16, 147), (9, 22, 135), (0, 29, 123), + (34, 50, 110), (47, 67, 129), (61, 85, 149), (67, 101, 145), + (73, 118, 141), (67, 121, 138), (62, 124, 135), (56, 112, 137), + (61, 97, 145), (58, 74, 110), (49, 69, 114), (41, 64, 118), + (24, 68, 142), (7, 73, 167), (8, 69, 170), (9, 65, 174), + (52, 77, 161), (56, 87, 153), (61, 97, 145), (69, 82, 130), + (77, 68, 115), (76, 56, 100), (75, 44, 86), (82, 37, 60), + (86, 23, 32), (68, 10, 0), (82, 11, 24), (97, 13, 49), + (104, 29, 38), (111, 46, 28), (118, 114, 25), (125, 129, 42), + (172, 143, 51), (192, 95, 56), (213, 48, 62), (203, 29, 42), + (193, 11, 23), (177, 11, 29), (161, 11, 36), (160, 28, 41), + (107, 41, 69), (58, 11, 127), (60, 19, 132), (63, 27, 137), + (77, 31, 135), (91, 35, 134), (104, 29, 124), (111, 46, 100), + (150, 21, 49), (143, 48, 70), (137, 76, 92), (126, 65, 112), + (116, 55, 132), (88, 49, 128), (66, 45, 146), (35, 45, 143), + (47, 66, 132), (101, 58, 127), (94, 61, 118), (88, 65, 109), + (84, 71, 108), (80, 77, 108), (70, 73, 106), (78, 73, 96), + (65, 65, 57), (60, 59, 31), (55, 53, 5), (69, 45, 10), + (84, 38, 15), (57, 61, 24), (53, 49, 37), (63, 43, 70), + (74, 48, 73), (118, 39, 86), (123, 32, 69), (129, 26, 53), + (136, 16, 26), (126, 18, 33), (114, 45, 50), (82, 49, 66), + (61, 44, 89), (41, 34, 90), (21, 24, 91), (20, 18, 87), + (19, 13, 83), (33, 7, 80), (34, 19, 88), (37, 22, 89), + (35, 31, 81), (40, 23, 68), (43, 17, 53), (47, 11, 39), + (52, 18, 19), (39, 27, 29), (16, 39, 57), (26, 37, 67), + (44, 28, 91), (66, 44, 112), (88, 60, 134), (81, 76, 137), + (75, 93, 141), (87, 108, 135), (109, 117, 76), (102, 108, 34), + (92, 127, 61), (72, 117, 176), (78, 128, 186), (84, 140, 197), + (73, 119, 196), (56, 94, 167), (47, 65, 167), (27, 43, 156), + (46, 43, 110), (46, 46, 100), (47, 49, 90), (43, 38, 78), + (39, 32, 66), (40, 26, 61), (40, 30, 57), (56, 15, 47), + (56, 6, 43), (53, 33, 45), (42, 48, 38), (32, 63, 32), + (24, 57, 48), (44, 47, 66), (64, 56, 80), (74, 64, 101), + (103, 66, 118), (101, 68, 123), (99, 70, 128), (95, 78, 123), + (84, 75, 128), (87, 83, 142), (102, 94, 154), (121, 113, 152), + (98, 135, 188), (113, 139, 190), (124, 149, 205), (129, 150, 177), + (125, 141, 166), (152, 65, 169), (113, 44, 151), (107, 30, 146), + (110, 42, 141), (115, 61, 142), (120, 80, 143), (92, 112, 145), + (96, 105, 110), (88, 72, 72), (74, 58, 61), (38, 54, 9), + (20, 62, 50), (31, 58, 77), (47, 58, 90), (41, 61, 96), + (41, 54, 96), (54, 53, 111), (56, 35, 100), (55, 28, 107), + (77, 31, 93), (115, 67, 63), (155, 99, 66), (154, 122, 65), + (141, 146, 52), (109, 142, 97), (104, 133, 163), (82, 111, 145), + (70, 100, 160), (67, 94, 139), (60, 64, 91), (74, 72, 60), + (89, 55, 56), (74, 50, 46), (85, 64, 33), (125, 51, 48), + (136, 43, 62), (122, 50, 62), (93, 39, 75), (86, 49, 67), + (80, 60, 88), (65, 59, 71), (62, 70, 73), (71, 66, 89), + (75, 59, 95), (105, 47, 95), (100, 63, 104), (75, 59, 104), + (66, 41, 124), (41, 31, 164), (23, 35, 169), (18, 59, 177), + (17, 57, 204), (7, 63, 212), (10, 78, 201), (49, 80, 186), + (84, 88, 162), (74, 76, 135), (87, 57, 119), (67, 70, 105), + (58, 50, 99), (59, 47, 87), (48, 35, 65), (52, 22, 58), + (68, 38, 66), (56, 48, 69), (36, 75, 70), (1, 97, 70), + (8, 75, 84), (20, 38, 76), (26, 48, 85), (34, 69, 91), + (28, 83, 88), (39, 73, 75), (60, 62, 75), (57, 43, 60) + ), + +// 297 2u0015t.jpg +((129, 96, 65), (144, 152, 101), (152, 164, 104), (161, 176, 107), + (161, 186, 119), (162, 197, 131), (165, 202, 136), (168, 207, 142), + (178, 193, 160), (178, 178, 150), (179, 163, 140), (177, 152, 155), + (176, 141, 171), (177, 149, 183), (178, 158, 195), (177, 166, 191), + (176, 174, 187), (182, 198, 169), (175, 190, 168), (168, 182, 167), + (161, 173, 157), (154, 165, 148), (152, 170, 145), (151, 175, 143), + (156, 183, 132), (164, 180, 125), (172, 177, 119), (170, 171, 126), + (168, 165, 134), (164, 167, 136), (160, 169, 138), (150, 171, 132), + (156, 170, 145), (160, 146, 159), (144, 136, 149), (129, 127, 140), + (120, 108, 132), (111, 89, 125), (106, 78, 118), (101, 68, 111), + (78, 21, 38), (66, 44, 47), (55, 67, 57), (68, 57, 73), + (82, 47, 89), (86, 53, 94), (90, 59, 100), (102, 81, 88), + (114, 109, 71), (129, 145, 82), (144, 155, 103), (160, 165, 124), + (153, 176, 124), (147, 187, 124), (153, 177, 121), (159, 167, 118), + (169, 155, 128), (173, 165, 129), (177, 176, 130), (173, 176, 133), + (170, 177, 136), (162, 169, 134), (155, 161, 133), (137, 139, 128), + (139, 128, 100), (138, 100, 38), (143, 99, 53), (148, 99, 69), + (154, 108, 76), (161, 118, 83), (170, 115, 85), (165, 106, 74), + (114, 44, 34), (105, 32, 33), (96, 20, 33), (84, 24, 21), + (72, 29, 10), (59, 20, 6), (46, 12, 3), (64, 16, 0), + (76, 33, 14), (88, 71, 28), (108, 83, 44), (128, 95, 60), + (130, 92, 67), (132, 90, 74), (129, 95, 86), (137, 102, 70), + (151, 81, 55), (132, 67, 38), (113, 54, 22), (108, 52, 29), + (103, 51, 37), (136, 87, 54), (142, 111, 91), (156, 133, 139), + (149, 164, 143), (180, 184, 159), (168, 190, 163), (156, 197, 167), + (158, 190, 162), (161, 184, 158), (160, 178, 154), (150, 185, 129), + (122, 177, 96), (133, 167, 100), (144, 157, 104), (152, 162, 109), + (160, 167, 115), (162, 161, 115), (160, 141, 108), (167, 123, 96), + (175, 121, 87), (155, 121, 93), (155, 119, 106), (156, 117, 120), + (165, 110, 142), (160, 88, 151), (139, 113, 148), (130, 132, 147), + (124, 154, 130), (113, 131, 123), (102, 109, 117), (105, 104, 113), + (109, 99, 110), (97, 85, 97), (89, 72, 106), (78, 63, 102), + (86, 68, 94), (135, 72, 54), (140, 76, 57), (145, 80, 60), + (137, 70, 54), (127, 63, 51), (119, 61, 50), (135, 63, 48), + (161, 93, 58), (154, 88, 60), (148, 83, 63), (144, 87, 62), + (141, 92, 62), (128, 96, 45), (110, 93, 41), (94, 104, 41), + (80, 120, 47), (113, 134, 101), (115, 123, 110), (118, 113, 120), + (126, 109, 127), (115, 93, 114), (123, 84, 115), (150, 100, 75), + (148, 133, 92), (156, 139, 85), (165, 146, 78), (165, 145, 95), + (167, 141, 104), (160, 150, 114), (153, 144, 115), (148, 147, 103), + (137, 129, 92), (122, 104, 68), (122, 105, 57), (122, 106, 46), + (139, 117, 57), (142, 129, 74), (159, 124, 86), (171, 139, 92), + (181, 125, 98), (179, 126, 100), (177, 127, 102), (179, 142, 98), + (163, 152, 122), (159, 157, 132), (145, 159, 133), (143, 142, 137), + (130, 124, 138), (131, 115, 125), (136, 121, 140), (149, 130, 162), + (152, 144, 167), (157, 153, 168), (171, 154, 170), (175, 149, 178), + (165, 178, 168), (158, 170, 166), (152, 162, 164), (144, 164, 137), + (147, 165, 125), (141, 161, 112), (143, 155, 109), (133, 154, 97), + (121, 136, 81), (119, 127, 86), (116, 113, 104), (100, 106, 102), + (110, 93, 112), (119, 79, 116), (105, 84, 123), (91, 82, 113), + (85, 81, 104), (87, 91, 103), (92, 87, 110), (107, 82, 112), + (106, 93, 110), (107, 102, 125), (115, 109, 137), (123, 112, 142), + (127, 122, 142), (141, 120, 139), (140, 102, 141), (118, 97, 138), + (117, 101, 130), (101, 98, 115), (64, 85, 86), (54, 99, 76), + (74, 58, 69), (88, 30, 26), (116, 35, 6), (117, 51, 17), + (104, 61, 27), (128, 79, 38), (145, 100, 59), (173, 113, 79), + (185, 121, 94), (201, 135, 113), (179, 143, 111), (180, 141, 160), + (184, 156, 178), (184, 159, 181), (192, 169, 187), (181, 184, 177), + (185, 194, 165), (177, 215, 154), (177, 214, 147), (167, 220, 138), + (153, 183, 119), (141, 143, 78), (112, 108, 45), (113, 80, 37), + (115, 81, 46), (98, 64, 97), (109, 57, 121), (129, 66, 123), + (126, 76, 125), (141, 84, 127), (147, 123, 119), (150, 145, 149), + (149, 142, 160), (139, 152, 134), (129, 160, 100), (116, 161, 78), + (116, 141, 76), (132, 136, 77), (145, 135, 74), (153, 114, 81) + ), + +// 298 2u0017pp1t.jpg +((199, 122, 218), (208, 121, 218), (202, 104, 202), (197, 87, 186), + (191, 99, 173), (185, 111, 160), (178, 126, 149), (171, 142, 138), + (196, 164, 123), (205, 163, 132), (214, 163, 142), (234, 163, 139), + (255, 164, 137), (235, 169, 110), (215, 174, 84), (215, 171, 77), + (215, 169, 71), (213, 114, 57), (209, 94, 54), (206, 74, 51), + (213, 85, 60), (221, 97, 69), (212, 109, 71), (204, 122, 74), + (185, 100, 63), (189, 89, 56), (193, 78, 49), (200, 71, 50), + (207, 65, 51), (206, 67, 49), (205, 70, 48), (210, 93, 50), + (210, 128, 72), (213, 136, 118), (213, 140, 116), (214, 145, 114), + (213, 121, 94), (212, 98, 74), (205, 80, 66), (198, 63, 59), + (193, 39, 39), (188, 49, 53), (184, 59, 67), (195, 51, 67), + (207, 43, 68), (204, 48, 64), (201, 54, 60), (197, 53, 45), + (189, 54, 48), (201, 68, 63), (207, 91, 78), (213, 114, 93), + (230, 126, 136), (247, 138, 179), (246, 152, 196), (246, 167, 214), + (247, 232, 193), (245, 223, 184), (244, 215, 175), (228, 192, 188), + (213, 169, 202), (208, 146, 210), (204, 124, 219), (169, 103, 193), + (161, 108, 186), (168, 126, 146), (176, 122, 138), (184, 118, 130), + (186, 113, 135), (188, 109, 140), (206, 98, 148), (202, 56, 163), + (194, 61, 127), (201, 83, 110), (208, 106, 94), (210, 86, 86), + (212, 66, 79), (201, 80, 100), (191, 95, 122), (172, 120, 124), + (168, 119, 102), (186, 129, 84), (185, 130, 86), (185, 132, 88), + (181, 130, 92), (177, 128, 96), (175, 131, 128), (170, 125, 154), + (169, 136, 181), (165, 145, 196), (162, 154, 211), (177, 151, 214), + (193, 148, 217), (190, 150, 203), (199, 142, 185), (204, 138, 174), + (195, 135, 143), (185, 114, 84), (169, 91, 106), (153, 69, 128), + (165, 80, 133), (178, 92, 139), (186, 91, 147), (192, 106, 145), + (201, 143, 139), (194, 159, 144), (187, 175, 149), (193, 172, 144), + (199, 170, 140), (204, 170, 125), (196, 169, 92), (192, 178, 71), + (207, 167, 79), (209, 126, 72), (220, 121, 81), (232, 117, 90), + (232, 69, 134), (252, 90, 150), (254, 92, 139), (255, 119, 135), + (238, 139, 170), (213, 166, 162), (189, 194, 154), (194, 201, 132), + (199, 209, 110), (195, 201, 95), (208, 207, 89), (201, 192, 87), + (203, 165, 58), (182, 108, 37), (182, 97, 54), (182, 86, 72), + (178, 93, 86), (172, 108, 134), (170, 111, 155), (180, 103, 159), + (187, 44, 172), (177, 57, 156), (168, 71, 140), (178, 91, 131), + (189, 112, 122), (206, 131, 110), (212, 157, 93), (217, 171, 75), + (230, 178, 76), (213, 154, 84), (213, 145, 84), (213, 137, 85), + (198, 141, 88), (192, 117, 88), (201, 108, 90), (204, 132, 94), + (181, 118, 111), (189, 107, 119), (197, 96, 128), (210, 98, 134), + (197, 105, 154), (218, 119, 173), (241, 117, 141), (221, 159, 122), + (217, 175, 77), (215, 205, 94), (223, 192, 91), (231, 180, 88), + (239, 180, 136), (243, 187, 170), (214, 180, 196), (227, 160, 227), + (179, 184, 203), (199, 197, 188), (219, 211, 174), (237, 229, 157), + (238, 241, 162), (246, 232, 169), (236, 218, 170), (217, 174, 132), + (204, 144, 74), (198, 133, 49), (181, 127, 27), (183, 114, 21), + (185, 128, 39), (193, 133, 60), (198, 141, 52), (210, 141, 64), + (192, 168, 46), (187, 161, 50), (183, 154, 54), (191, 153, 42), + (195, 146, 27), (191, 150, 44), (194, 135, 69), (198, 127, 65), + (195, 122, 67), (190, 115, 76), (205, 120, 81), (221, 116, 113), + (205, 131, 154), (207, 136, 178), (234, 140, 214), (214, 125, 235), + (208, 160, 244), (170, 171, 235), (199, 197, 210), (222, 236, 221), + (230, 228, 203), (245, 229, 169), (250, 206, 159), (237, 197, 146), + (234, 205, 139), (226, 206, 145), (201, 201, 127), (202, 208, 112), + (212, 222, 125), (216, 222, 152), (220, 215, 151), (236, 188, 139), + (229, 158, 166), (198, 132, 180), (180, 105, 170), (173, 80, 169), + (189, 91, 150), (193, 104, 148), (194, 130, 156), (219, 156, 141), + (229, 170, 136), (222, 174, 134), (223, 185, 140), (194, 164, 188), + (216, 149, 220), (187, 132, 236), (175, 117, 238), (145, 89, 226), + (158, 84, 239), (197, 71, 215), (229, 115, 185), (233, 133, 183), + (245, 130, 195), (215, 143, 209), (176, 167, 222), (190, 131, 189), + (190, 137, 181), (202, 151, 148), (192, 153, 110), (193, 150, 99), + (192, 170, 97), (199, 179, 120), (209, 169, 118), (207, 162, 95), + (208, 158, 85), (209, 167, 81), (201, 157, 70), (196, 147, 55), + (203, 143, 57), (206, 158, 58), (198, 183, 68), (198, 172, 61) + ), + +// 299 2u0017t.jpg +((48, 99, 204), (50, 97, 205), (52, 101, 208), (55, 106, 211), + (62, 94, 200), (70, 82, 190), (64, 86, 191), (59, 91, 192), + (81, 117, 179), (75, 159, 183), (69, 201, 187), (70, 208, 174), + (71, 216, 161), (48, 186, 143), (26, 157, 125), (17, 160, 128), + (8, 163, 131), (33, 141, 144), (40, 139, 151), (47, 138, 159), + (56, 133, 192), (65, 128, 225), (67, 128, 226), (69, 128, 228), + (51, 121, 216), (48, 124, 201), (45, 127, 187), (41, 147, 190), + (38, 168, 194), (46, 177, 193), (54, 187, 192), (64, 201, 183), + (74, 168, 154), (63, 126, 144), (52, 137, 141), (41, 148, 138), + (36, 155, 123), (31, 162, 108), (28, 160, 105), (26, 159, 102), + (34, 132, 75), (42, 124, 65), (51, 117, 56), (60, 121, 40), + (70, 125, 24), (71, 125, 19), (72, 126, 14), (85, 131, 22), + (80, 130, 45), (71, 125, 91), (63, 123, 111), (55, 122, 131), + (49, 104, 146), (44, 86, 162), (35, 89, 166), (27, 93, 171), + (35, 53, 161), (31, 39, 152), (27, 26, 143), (37, 59, 135), + (47, 93, 127), (46, 98, 108), (46, 104, 89), (11, 94, 86), + (6, 91, 94), (42, 72, 136), (46, 68, 134), (50, 65, 132), + (50, 57, 139), (51, 49, 146), (52, 77, 161), (44, 94, 189), + (31, 113, 186), (27, 104, 162), (23, 96, 139), (21, 101, 107), + (20, 107, 75), (21, 118, 64), (22, 130, 54), (0, 113, 54), + (19, 102, 48), (61, 101, 74), (67, 111, 93), (74, 121, 113), + (62, 121, 117), (50, 122, 121), (23, 132, 139), (10, 127, 145), + (55, 137, 161), (60, 137, 173), (65, 137, 185), (65, 143, 189), + (66, 149, 193), (48, 167, 197), (49, 147, 192), (60, 135, 190), + (56, 116, 179), (65, 114, 173), (64, 113, 161), (64, 112, 150), + (73, 116, 144), (82, 121, 138), (98, 129, 131), (96, 145, 124), + (84, 141, 124), (86, 141, 106), (88, 141, 89), (88, 139, 87), + (88, 138, 85), (87, 145, 69), (81, 137, 64), (68, 104, 60), + (53, 59, 55), (84, 94, 57), (91, 97, 61), (99, 100, 66), + (85, 94, 29), (85, 70, 29), (52, 37, 40), (28, 39, 69), + (37, 125, 12), (35, 138, 21), (33, 151, 31), (37, 135, 26), + (42, 120, 21), (24, 85, 43), (0, 61, 60), (3, 74, 92), + (15, 90, 111), (30, 118, 122), (31, 115, 116), (32, 112, 111), + (46, 106, 94), (60, 85, 107), (82, 118, 106), (80, 128, 90), + (72, 135, 116), (63, 132, 137), (54, 129, 158), (54, 135, 160), + (55, 142, 162), (59, 155, 171), (65, 168, 199), (54, 158, 211), + (54, 137, 205), (47, 108, 191), (49, 108, 192), (51, 109, 193), + (71, 98, 179), (59, 85, 162), (57, 96, 171), (54, 100, 178), + (69, 98, 224), (73, 110, 222), (78, 122, 221), (93, 136, 228), + (81, 139, 239), (68, 153, 210), (47, 166, 208), (57, 175, 203), + (73, 181, 209), (60, 202, 204), (60, 202, 196), (60, 202, 188), + (39, 201, 180), (30, 210, 171), (24, 186, 162), (34, 160, 148), + (44, 157, 155), (52, 165, 160), (60, 174, 166), (60, 159, 178), + (51, 159, 198), (61, 170, 201), (55, 181, 204), (36, 192, 181), + (0, 200, 170), (12, 205, 152), (12, 183, 130), (30, 169, 140), + (48, 151, 130), (77, 138, 130), (80, 143, 112), (78, 140, 91), + (67, 119, 80), (60, 119, 74), (53, 120, 69), (57, 131, 70), + (45, 158, 42), (50, 176, 32), (55, 210, 48), (80, 201, 74), + (72, 154, 106), (75, 175, 105), (78, 155, 119), (81, 173, 134), + (51, 202, 131), (21, 225, 128), (49, 209, 85), (56, 189, 96), + (73, 146, 116), (69, 110, 132), (57, 94, 162), (47, 89, 189), + (50, 76, 189), (47, 71, 177), (50, 68, 168), (58, 86, 160), + (64, 110, 160), (65, 139, 138), (51, 158, 104), (59, 159, 45), + (75, 152, 38), (60, 151, 11), (79, 120, 0), (89, 113, 15), + (78, 116, 39), (54, 146, 71), (51, 157, 121), (70, 158, 144), + (73, 144, 150), (67, 146, 176), (66, 134, 171), (71, 121, 194), + (66, 115, 174), (48, 104, 163), (48, 106, 144), (33, 95, 144), + (9, 72, 115), (18, 66, 114), (22, 22, 96), (2, 3, 83), + (21, 30, 107), (36, 36, 150), (52, 61, 178), (32, 74, 186), + (43, 77, 184), (47, 92, 175), (37, 120, 160), (34, 136, 138), + (41, 149, 134), (59, 134, 137), (80, 143, 112), (88, 159, 81), + (78, 190, 54), (96, 190, 44), (83, 173, 59), (94, 147, 75), + (83, 135, 97), (71, 124, 130), (60, 122, 147), (70, 109, 152), + (62, 98, 134), (58, 107, 137), (63, 116, 122), (59, 114, 74) + ), + +// 300 2u0018t.jpg +((135, 38, 171), (122, 35, 130), (138, 44, 114), (155, 54, 98), + (175, 42, 103), (196, 31, 108), (194, 23, 124), (192, 16, 140), + (177, 39, 135), (177, 55, 126), (178, 72, 118), (172, 72, 107), + (167, 73, 97), (158, 71, 100), (149, 69, 104), (142, 69, 101), + (136, 70, 98), (145, 88, 143), (151, 76, 155), (157, 64, 168), + (147, 58, 153), (138, 53, 138), (133, 58, 139), (128, 64, 140), + (124, 42, 152), (123, 32, 163), (122, 23, 175), (129, 31, 185), + (136, 39, 196), (136, 41, 191), (137, 44, 187), (145, 42, 147), + (157, 46, 123), (123, 41, 115), (114, 51, 104), (106, 61, 94), + (103, 61, 88), (100, 61, 82), (109, 68, 70), (119, 76, 59), + (147, 108, 39), (167, 119, 46), (187, 131, 54), (191, 108, 62), + (195, 85, 70), (194, 77, 82), (194, 70, 94), (178, 71, 101), + (149, 53, 117), (98, 25, 166), (109, 16, 153), (121, 8, 140), + (130, 14, 121), (139, 20, 102), (147, 26, 94), (155, 32, 87), + (139, 67, 78), (157, 99, 85), (175, 131, 92), (181, 117, 95), + (187, 104, 98), (187, 98, 118), (188, 92, 138), (183, 90, 160), + (196, 60, 168), (165, 38, 177), (152, 41, 186), (140, 44, 195), + (150, 46, 175), (161, 48, 156), (178, 49, 132), (184, 32, 107), + (194, 33, 103), (185, 47, 99), (176, 62, 96), (152, 72, 89), + (129, 83, 83), (124, 76, 74), (120, 69, 65), (107, 64, 84), + (110, 68, 80), (122, 134, 96), (143, 153, 97), (165, 173, 98), + (159, 176, 106), (154, 180, 115), (142, 180, 107), (141, 177, 113), + (150, 166, 117), (145, 159, 111), (140, 152, 106), (138, 154, 103), + (136, 157, 101), (151, 161, 108), (155, 145, 110), (150, 146, 98), + (139, 126, 92), (143, 91, 77), (156, 62, 62), (169, 34, 48), + (177, 29, 37), (185, 25, 27), (188, 4, 28), (159, 27, 40), + (166, 26, 75), (168, 27, 88), (171, 29, 101), (166, 28, 89), + (161, 27, 77), (166, 19, 61), (160, 31, 51), (151, 37, 36), + (164, 53, 23), (152, 41, 58), (140, 46, 61), (128, 52, 64), + (131, 59, 73), (132, 64, 79), (134, 67, 76), (139, 66, 83), + (174, 59, 137), (166, 57, 142), (159, 56, 147), (164, 57, 149), + (170, 59, 151), (180, 49, 153), (165, 45, 134), (155, 56, 102), + (154, 67, 76), (180, 88, 37), (172, 87, 46), (165, 86, 56), + (133, 91, 77), (139, 119, 86), (142, 152, 79), (146, 127, 97), + (167, 81, 130), (165, 85, 165), (163, 89, 200), (152, 83, 197), + (142, 77, 195), (166, 88, 198), (182, 107, 225), (167, 121, 209), + (200, 153, 171), (170, 150, 126), (166, 147, 123), (163, 145, 121), + (152, 156, 106), (153, 153, 99), (153, 147, 95), (180, 148, 101), + (208, 100, 97), (192, 92, 114), (177, 84, 131), (169, 74, 138), + (155, 43, 145), (147, 43, 138), (152, 68, 145), (167, 81, 130), + (153, 88, 122), (145, 121, 83), (149, 122, 85), (153, 123, 87), + (178, 108, 82), (212, 70, 92), (204, 57, 125), (208, 26, 103), + (159, 32, 109), (146, 33, 108), (134, 34, 107), (117, 37, 108), + (119, 47, 97), (109, 49, 83), (102, 53, 85), (93, 38, 77), + (91, 19, 92), (77, 14, 105), (110, 37, 116), (125, 25, 98), + (131, 16, 107), (139, 29, 92), (130, 48, 86), (112, 52, 78), + (143, 49, 83), (144, 48, 74), (145, 48, 65), (137, 48, 52), + (118, 34, 50), (107, 23, 56), (94, 51, 61), (94, 57, 48), + (109, 85, 59), (133, 85, 62), (129, 85, 72), (109, 79, 81), + (119, 51, 128), (124, 57, 162), (134, 39, 169), (137, 39, 162), + (134, 32, 132), (136, 24, 108), (155, 33, 110), (147, 52, 120), + (138, 63, 122), (148, 68, 103), (153, 78, 98), (155, 101, 89), + (159, 76, 104), (161, 73, 121), (151, 56, 124), (140, 63, 131), + (137, 49, 125), (113, 40, 132), (88, 43, 136), (104, 17, 132), + (149, 4, 123), (172, 22, 109), (167, 35, 108), (154, 20, 81), + (150, 34, 57), (127, 25, 73), (93, 6, 74), (78, 6, 69), + (91, 16, 81), (100, 39, 81), (124, 37, 88), (168, 36, 96), + (180, 41, 80), (192, 65, 84), (195, 66, 84), (194, 58, 94), + (172, 57, 98), (151, 57, 117), (148, 51, 120), (162, 45, 123), + (164, 47, 118), (173, 27, 108), (173, 35, 86), (176, 43, 70), + (179, 43, 47), (184, 53, 11), (195, 66, 24), (186, 76, 25), + (181, 53, 42), (180, 54, 57), (176, 45, 59), (180, 51, 71), + (179, 45, 95), (165, 55, 116), (169, 63, 138), (171, 66, 151), + (174, 74, 126), (187, 81, 101), (182, 80, 75), (187, 77, 24) + ), + + +// 301 2u0020pp1t.jpg +((115, 229, 180), (98, 154, 203), (102, 136, 219), (107, 118, 236), + (119, 112, 233), (131, 107, 231), (128, 105, 234), (125, 103, 237), + (113, 114, 241), (131, 137, 240), (150, 161, 240), (150, 162, 181), + (151, 163, 123), (142, 160, 125), (134, 157, 128), (122, 148, 150), + (110, 139, 173), (134, 150, 227), (125, 153, 231), (116, 157, 236), + (143, 147, 193), (170, 138, 151), (175, 126, 133), (181, 115, 116), + (208, 159, 103), (196, 153, 118), (185, 147, 134), (177, 148, 146), + (169, 149, 158), (156, 126, 197), (144, 104, 237), (128, 98, 230), + (112, 123, 241), (106, 176, 245), (105, 191, 228), (105, 207, 211), + (119, 211, 193), (133, 215, 175), (142, 212, 173), (152, 210, 172), + (158, 205, 163), (143, 199, 148), (128, 194, 133), (125, 204, 145), + (123, 214, 157), (124, 219, 160), (126, 224, 163), (124, 215, 172), + (121, 214, 185), (121, 222, 182), (123, 216, 180), (126, 211, 178), + (130, 209, 182), (134, 207, 187), (131, 204, 192), (129, 201, 198), + (151, 200, 196), (163, 201, 178), (176, 203, 160), (180, 198, 157), + (185, 193, 154), (175, 185, 148), (166, 178, 142), (152, 178, 141), + (147, 184, 115), (128, 206, 130), (139, 203, 137), (151, 200, 144), + (163, 196, 146), (176, 193, 148), (207, 162, 131), (215, 154, 125), + (232, 168, 94), (220, 161, 93), (208, 154, 92), (190, 151, 106), + (173, 149, 121), (175, 157, 126), (178, 165, 131), (159, 192, 149), + (136, 230, 168), (127, 240, 184), (117, 243, 182), (108, 247, 180), + (106, 243, 194), (104, 239, 209), (115, 228, 200), (124, 230, 207), + (166, 234, 209), (159, 224, 191), (153, 215, 174), (149, 213, 171), + (145, 212, 168), (143, 210, 166), (138, 218, 159), (153, 210, 157), + (171, 202, 132), (152, 159, 108), (154, 159, 107), (156, 159, 106), + (151, 161, 110), (147, 163, 114), (134, 165, 134), (98, 156, 202), + (73, 202, 164), (90, 211, 165), (107, 220, 166), (93, 215, 180), + (79, 210, 194), (92, 206, 207), (96, 200, 209), (86, 211, 203), + (84, 229, 196), (113, 231, 171), (119, 231, 178), (125, 231, 185), + (126, 228, 189), (120, 233, 177), (117, 220, 165), (101, 238, 170), + (94, 245, 152), (97, 240, 162), (100, 236, 172), (109, 228, 184), + (118, 220, 196), (127, 220, 209), (127, 215, 227), (111, 211, 227), + (86, 209, 242), (53, 185, 233), (60, 178, 240), (68, 171, 248), + (75, 188, 230), (84, 198, 224), (118, 207, 221), (113, 212, 207), + (131, 203, 163), (128, 191, 142), (125, 180, 122), (124, 179, 115), + (123, 179, 108), (128, 183, 116), (138, 188, 129), (146, 176, 138), + (153, 186, 157), (120, 195, 188), (113, 183, 198), (107, 171, 209), + (119, 187, 196), (154, 178, 165), (147, 163, 116), (145, 137, 100), + (173, 120, 80), (175, 124, 82), (177, 128, 85), (196, 117, 87), + (200, 126, 89), (196, 128, 83), (209, 131, 83), (227, 159, 84), + (235, 173, 90), (193, 190, 97), (183, 202, 107), (174, 214, 118), + (151, 242, 162), (118, 232, 163), (107, 223, 178), (82, 207, 199), + (72, 185, 225), (78, 173, 231), (85, 161, 237), (95, 144, 239), + (87, 147, 220), (91, 158, 228), (97, 157, 227), (120, 179, 219), + (132, 191, 199), (136, 204, 165), (130, 188, 163), (137, 191, 142), + (147, 188, 132), (149, 180, 120), (153, 166, 123), (172, 160, 120), + (194, 176, 110), (193, 187, 110), (192, 198, 110), (166, 213, 121), + (148, 221, 139), (124, 232, 146), (129, 229, 157), (124, 228, 167), + (107, 217, 190), (97, 214, 208), (95, 222, 213), (88, 228, 217), + (88, 221, 230), (85, 222, 230), (70, 204, 241), (56, 195, 238), + (62, 170, 234), (73, 168, 252), (87, 165, 248), (83, 153, 248), + (61, 151, 247), (59, 138, 241), (72, 140, 241), (79, 142, 247), + (89, 149, 245), (94, 148, 244), (106, 148, 234), (118, 130, 242), + (101, 145, 234), (103, 147, 212), (121, 169, 209), (123, 192, 173), + (122, 186, 149), (144, 186, 123), (143, 193, 108), (134, 181, 113), + (133, 184, 105), (142, 170, 96), (152, 175, 103), (184, 177, 89), + (194, 147, 65), (190, 123, 81), (186, 128, 88), (175, 149, 132), + (168, 169, 155), (107, 175, 198), (85, 173, 213), (71, 177, 235), + (65, 156, 247), (51, 151, 229), (62, 149, 229), (83, 168, 223), + (83, 191, 217), (84, 217, 212), (97, 233, 229), (104, 246, 222), + (120, 234, 226), (128, 223, 227), (130, 236, 232), (134, 233, 228), + (146, 236, 224), (130, 246, 211), (136, 220, 187), (152, 209, 176), + (157, 193, 167), (161, 166, 136), (157, 147, 112), (165, 145, 86), + (158, 139, 83), (133, 168, 110), (117, 231, 159), (114, 203, 123) + ), + +// 302 2u0020t.jpg +((178, 61, 28), (160, 61, 30), (159, 60, 38), (158, 60, 47), + (153, 41, 46), (148, 22, 46), (145, 14, 37), (142, 6, 28), + (117, 18, 23), (110, 27, 42), (104, 36, 61), (100, 28, 74), + (96, 21, 88), (97, 20, 103), (99, 19, 118), (106, 16, 111), + (114, 14, 104), (138, 23, 80), (143, 20, 66), (148, 18, 52), + (138, 24, 53), (128, 30, 55), (135, 29, 59), (143, 29, 63), + (159, 11, 61), (154, 19, 66), (150, 27, 71), (144, 32, 70), + (139, 38, 70), (129, 42, 80), (119, 46, 91), (103, 45, 106), + (109, 55, 115), (110, 73, 127), (113, 67, 128), (117, 62, 130), + (115, 59, 128), (113, 56, 127), (116, 58, 120), (119, 60, 114), + (103, 66, 109), (107, 64, 113), (111, 62, 117), (123, 56, 101), + (136, 50, 85), (136, 48, 71), (137, 47, 57), (132, 35, 66), + (125, 35, 87), (70, 28, 112), (41, 34, 135), (12, 41, 159), + (25, 76, 161), (39, 112, 163), (46, 116, 151), (53, 121, 140), + (95, 110, 129), (101, 93, 123), (108, 77, 118), (111, 86, 120), + (115, 95, 123), (106, 99, 131), (98, 104, 140), (96, 122, 139), + (91, 133, 157), (55, 122, 164), (69, 104, 141), (84, 87, 118), + (82, 72, 105), (81, 57, 93), (107, 57, 82), (108, 55, 51), + (156, 76, 27), (155, 84, 16), (155, 93, 6), (168, 93, 3), + (181, 94, 1), (180, 96, 7), (180, 98, 14), (173, 102, 12), + (172, 106, 9), (164, 119, 36), (172, 107, 24), (181, 96, 13), + (185, 83, 15), (190, 70, 18), (187, 64, 31), (170, 68, 30), + (150, 123, 32), (147, 135, 23), (145, 148, 15), (124, 153, 12), + (103, 159, 10), (133, 144, 6), (144, 140, 15), (133, 121, 19), + (133, 101, 24), (120, 53, 86), (129, 35, 90), (139, 18, 95), + (151, 18, 93), (163, 19, 91), (163, 11, 84), (153, 19, 72), + (163, 26, 52), (141, 24, 58), (120, 23, 64), (117, 27, 75), + (114, 31, 87), (94, 53, 111), (99, 59, 121), (90, 82, 129), + (78, 86, 151), (87, 118, 164), (93, 119, 166), (100, 121, 168), + (103, 101, 166), (72, 76, 165), (54, 79, 145), (39, 81, 131), + (15, 82, 152), (22, 87, 160), (30, 92, 169), (48, 96, 167), + (67, 101, 165), (97, 97, 149), (113, 96, 138), (125, 81, 116), + (156, 73, 103), (178, 37, 43), (173, 28, 39), (168, 20, 36), + (165, 10, 42), (169, 22, 50), (163, 26, 46), (158, 37, 54), + (113, 54, 86), (101, 63, 100), (90, 72, 114), (89, 76, 118), + (89, 81, 122), (98, 104, 138), (90, 122, 135), (50, 123, 114), + (49, 120, 116), (78, 82, 145), (83, 81, 147), (88, 81, 149), + (101, 79, 128), (110, 81, 139), (113, 72, 142), (139, 70, 137), + (144, 44, 116), (150, 39, 105), (157, 35, 94), (161, 17, 79), + (158, 13, 78), (157, 14, 78), (157, 16, 82), (138, 30, 90), + (125, 31, 84), (113, 46, 53), (121, 42, 51), (129, 39, 49), + (126, 19, 63), (142, 20, 61), (139, 20, 48), (144, 10, 35), + (167, 27, 38), (166, 38, 40), (166, 49, 42), (163, 73, 38), + (141, 86, 47), (112, 82, 108), (93, 67, 104), (60, 58, 123), + (58, 72, 135), (39, 87, 153), (39, 108, 175), (56, 104, 176), + (68, 60, 159), (83, 63, 134), (123, 53, 126), (137, 26, 120), + (121, 15, 89), (121, 18, 82), (121, 21, 75), (113, 11, 76), + (109, 20, 76), (118, 38, 97), (133, 38, 104), (142, 14, 97), + (159, 8, 101), (169, 13, 76), (186, 46, 59), (190, 58, 37), + (194, 98, 22), (193, 113, 14), (193, 106, 9), (180, 83, 14), + (173, 55, 5), (167, 31, 35), (159, 31, 32), (160, 36, 34), + (150, 51, 30), (158, 64, 38), (138, 75, 21), (137, 98, 23), + (141, 94, 12), (141, 95, 10), (145, 106, 13), (154, 114, 19), + (152, 114, 41), (103, 89, 60), (106, 91, 70), (102, 70, 75), + (106, 60, 63), (118, 71, 55), (165, 76, 36), (193, 85, 21), + (194, 74, 13), (198, 74, 14), (199, 67, 18), (176, 56, 6), + (185, 36, 30), (174, 31, 25), (150, 20, 30), (154, 13, 29), + (177, 20, 11), (183, 61, 12), (172, 94, 28), (170, 103, 35), + (163, 97, 37), (161, 87, 88), (127, 91, 117), (121, 107, 107), + (114, 86, 100), (115, 86, 88), (153, 80, 45), (164, 80, 33), + (147, 63, 53), (144, 56, 98), (124, 53, 111), (124, 80, 133), + (115, 88, 143), (109, 95, 157), (101, 105, 153), (103, 106, 149), + (97, 110, 154), (98, 107, 150), (83, 90, 132), (65, 108, 89), + (68, 97, 113), (72, 60, 134), (88, 43, 112), (71, 48, 126) + ), + +// 303 2u0024t.jpg +((14, 80, 34), (48, 76, 62), (69, 60, 71), (91, 44, 80), + (118, 37, 87), (145, 30, 95), (149, 48, 90), (154, 67, 86), + (157, 108, 67), (162, 114, 55), (167, 121, 44), (161, 106, 45), + (156, 92, 46), (164, 79, 47), (172, 67, 48), (162, 60, 49), + (152, 54, 51), (168, 98, 38), (177, 112, 25), (186, 126, 12), + (185, 120, 27), (185, 115, 43), (187, 115, 54), (189, 115, 66), + (180, 34, 45), (167, 44, 58), (155, 54, 72), (142, 66, 73), + (129, 78, 75), (123, 82, 70), (118, 87, 66), (112, 96, 62), + (109, 91, 77), (86, 74, 86), (82, 57, 90), (78, 41, 95), + (68, 31, 93), (58, 22, 92), (60, 14, 93), (62, 6, 95), + (67, 19, 59), (73, 16, 57), (79, 14, 56), (90, 34, 61), + (101, 55, 66), (113, 68, 62), (126, 81, 58), (151, 101, 50), + (159, 114, 33), (148, 121, 34), (154, 113, 24), (160, 105, 15), + (124, 96, 19), (88, 87, 23), (69, 63, 20), (51, 39, 17), + (55, 24, 56), (68, 42, 59), (82, 60, 62), (80, 94, 52), + (78, 128, 43), (80, 123, 29), (83, 118, 16), (91, 102, 34), + (115, 94, 65), (96, 68, 109), (89, 54, 106), (82, 40, 103), + (83, 48, 105), (84, 57, 108), (90, 76, 102), (100, 82, 94), + (98, 66, 79), (92, 55, 62), (86, 44, 45), (85, 36, 55), + (84, 28, 65), (78, 31, 74), (72, 34, 83), (62, 33, 89), + (59, 28, 96), (73, 11, 96), (85, 13, 67), (97, 15, 38), + (111, 34, 30), (125, 54, 22), (160, 59, 7), (149, 82, 30), + (190, 107, 5), (187, 101, 21), (185, 96, 38), (180, 100, 46), + (176, 104, 54), (171, 105, 57), (159, 103, 68), (161, 89, 64), + (168, 77, 56), (156, 92, 80), (151, 99, 69), (147, 107, 58), + (138, 110, 57), (130, 113, 57), (131, 107, 69), (121, 104, 74), + (132, 87, 68), (134, 69, 74), (137, 52, 81), (144, 41, 78), + (152, 31, 76), (148, 24, 86), (148, 9, 76), (142, 24, 76), + (149, 46, 47), (123, 87, 51), (121, 89, 45), (119, 92, 39), + (119, 99, 38), (133, 113, 40), (142, 94, 58), (141, 91, 68), + (120, 86, 76), (110, 73, 73), (100, 60, 71), (103, 54, 67), + (107, 49, 63), (101, 14, 48), (90, 6, 40), (85, 0, 34), + (78, 6, 54), (91, 20, 54), (96, 25, 61), (101, 31, 68), + (108, 61, 71), (121, 81, 69), (133, 92, 60), (125, 99, 40), + (128, 98, 62), (120, 97, 68), (113, 97, 74), (118, 94, 90), + (123, 91, 106), (106, 74, 95), (88, 80, 95), (84, 76, 91), + (83, 71, 91), (91, 51, 85), (95, 52, 82), (99, 53, 79), + (96, 65, 80), (106, 70, 72), (99, 84, 43), (95, 65, 27), + (75, 28, 38), (81, 21, 40), (87, 14, 43), (79, 37, 39), + (104, 61, 10), (133, 87, 37), (153, 93, 39), (162, 104, 40), + (161, 107, 35), (175, 118, 63), (178, 117, 66), (181, 117, 69), + (193, 107, 82), (206, 123, 81), (219, 122, 90), (203, 118, 87), + (143, 101, 103), (122, 107, 101), (102, 113, 99), (112, 112, 84), + (133, 120, 75), (143, 118, 51), (148, 121, 44), (167, 126, 74), + (172, 117, 76), (157, 108, 91), (145, 102, 83), (120, 91, 73), + (110, 83, 76), (100, 62, 75), (111, 52, 70), (99, 21, 60), + (100, 6, 56), (104, 9, 52), (108, 12, 49), (95, 15, 40), + (88, 17, 49), (93, 11, 49), (103, 15, 65), (123, 15, 77), + (119, 6, 84), (130, 1, 81), (139, 12, 101), (133, 33, 87), + (122, 45, 77), (109, 63, 73), (105, 65, 74), (104, 79, 74), + (113, 81, 56), (120, 73, 47), (91, 53, 30), (90, 57, 24), + (73, 64, 31), (42, 52, 27), (20, 36, 7), (13, 81, 24), + (21, 55, 41), (57, 30, 61), (70, 51, 44), (61, 103, 40), + (53, 107, 9), (36, 107, 37), (45, 116, 40), (69, 102, 47), + (79, 70, 89), (74, 45, 73), (72, 22, 75), (65, 27, 88), + (79, 29, 88), (92, 43, 90), (83, 53, 91), (80, 43, 94), + (80, 39, 109), (75, 34, 110), (72, 34, 107), (66, 27, 84), + (79, 44, 84), (90, 48, 84), (94, 70, 84), (109, 84, 88), + (104, 91, 83), (97, 91, 75), (125, 80, 57), (136, 81, 42), + (142, 103, 38), (133, 120, 15), (104, 138, 0), (85, 144, 16), + (79, 151, 15), (84, 145, 8), (118, 128, 5), (134, 118, 30), + (131, 113, 41), (138, 126, 44), (153, 125, 41), (150, 118, 45), + (155, 105, 54), (130, 94, 78), (121, 78, 97), (130, 65, 89), + (131, 59, 79), (125, 75, 66), (100, 69, 87), (102, 69, 80) + ), + +// 304 gradient0000.jpg +((244, 0, 12), (255, 0, 102), (240, 0, 160), (225, 0, 218), + (223, 0, 232), (221, 1, 247), (221, 0, 250), (221, 0, 254), + (229, 0, 241), (242, 0, 197), (255, 0, 154), (229, 0, 108), + (204, 0, 63), (171, 0, 33), (139, 0, 3), (131, 2, 2), + (124, 5, 1), (111, 10, 0), (117, 7, 0), (123, 4, 0), + (123, 4, 0), (123, 4, 0), (120, 7, 0), (118, 10, 0), + (119, 11, 0), (124, 6, 0), (129, 1, 0), (137, 0, 2), + (145, 0, 5), (144, 0, 2), (144, 0, 0), (134, 0, 1), + (127, 4, 0), (124, 5, 1), (124, 5, 0), (125, 6, 0), + (135, 3, 2), (145, 0, 5), (173, 0, 28), (202, 0, 52), + (254, 0, 117), (225, 0, 165), (197, 0, 214), (157, 0, 228), + (118, 0, 242), (115, 1, 248), (113, 2, 255), (114, 1, 255), + (118, 0, 242), (202, 0, 84), (173, 0, 50), (145, 0, 17), + (128, 7, 9), (112, 14, 1), (112, 14, 1), (112, 14, 1), + (130, 0, 0), (149, 0, 20), (169, 0, 41), (187, 0, 59), + (205, 0, 77), (229, 0, 99), (254, 0, 122), (245, 0, 215), + (241, 1, 224), (227, 0, 255), (221, 0, 240), (215, 0, 226), + (220, 0, 222), (225, 0, 218), (254, 0, 160), (246, 1, 81), + (244, 60, 10), (239, 48, 5), (235, 37, 0), (231, 33, 0), + (227, 29, 0), (231, 30, 0), (236, 31, 0), (239, 52, 1), + (252, 55, 21), (251, 13, 10), (247, 13, 5), (243, 13, 0), + (238, 10, 0), (234, 7, 0), (228, 22, 0), (228, 22, 0), + (233, 39, 1), (226, 49, 0), (220, 60, 0), (217, 69, 0), + (215, 78, 0), (220, 100, 37), (242, 77, 83), (255, 0, 130), + (255, 0, 174), (253, 0, 189), (253, 0, 150), (254, 0, 112), + (253, 0, 93), (252, 0, 75), (242, 0, 16), (231, 11, 0), + (131, 6, 0), (129, 3, 0), (128, 0, 0), (137, 2, 0), + (146, 4, 0), (156, 0, 3), (230, 0, 2), (236, 3, 0), + (233, 13, 0), (243, 18, 0), (242, 13, 0), (242, 8, 1), + (245, 1, 13), (238, 0, 23), (198, 0, 35), (147, 0, 8), + (124, 5, 1), (126, 2, 0), (128, 0, 0), (133, 0, 0), + (139, 1, 0), (151, 0, 9), (209, 0, 55), (220, 0, 102), + (203, 1, 209), (217, 0, 253), (217, 0, 253), (217, 0, 253), + (220, 0, 255), (221, 0, 254), (225, 0, 255), (224, 0, 254), + (217, 0, 255), (216, 0, 253), (215, 0, 252), (211, 0, 253), + (207, 0, 254), (206, 0, 255), (163, 0, 237), (119, 0, 244), + (110, 0, 247), (115, 1, 247), (129, 0, 239), (143, 0, 232), + (160, 0, 222), (162, 0, 225), (152, 0, 241), (116, 6, 255), + (91, 12, 254), (81, 17, 254), (71, 23, 255), (87, 14, 254), + (101, 4, 255), (119, 2, 254), (195, 4, 255), (206, 1, 254), + (217, 0, 255), (231, 0, 252), (233, 0, 241), (236, 0, 230), + (241, 0, 227), (255, 0, 180), (255, 0, 132), (254, 0, 124), + (254, 0, 174), (226, 0, 194), (199, 0, 215), (188, 1, 216), + (190, 0, 222), (194, 0, 223), (239, 1, 157), (205, 1, 90), + (202, 0, 52), (149, 1, 17), (140, 0, 11), (147, 0, 8), + (169, 0, 41), (203, 0, 60), (208, 0, 82), (255, 0, 130), + (246, 0, 221), (242, 0, 227), (238, 0, 233), (231, 0, 252), + (225, 0, 254), (220, 0, 254), (217, 0, 253), (214, 0, 254), + (207, 0, 255), (204, 0, 255), (137, 0, 254), (109, 9, 255), + (101, 13, 255), (97, 17, 255), (100, 12, 255), (103, 7, 254), + (106, 5, 255), (131, 0, 251), (196, 3, 254), (207, 0, 255), + (210, 0, 255), (215, 0, 254), (216, 1, 255), (210, 0, 255), + (204, 0, 255), (141, 0, 239), (116, 0, 255), (116, 0, 247), + (143, 0, 232), (187, 0, 229), (195, 0, 224), (220, 0, 222), + (254, 1, 172), (255, 0, 135), (255, 0, 118), (255, 0, 118), + (255, 0, 122), (255, 0, 120), (254, 0, 112), (255, 0, 107), + (255, 0, 106), (255, 0, 102), (252, 0, 75), (244, 0, 52), + (235, 0, 33), (239, 0, 41), (240, 0, 63), (255, 0, 102), + (255, 1, 161), (254, 0, 210), (246, 0, 223), (245, 0, 215), + (255, 0, 180), (255, 0, 128), (254, 31, 94), (212, 100, 86), + (221, 101, 38), (229, 84, 1), (217, 77, 0), (215, 35, 0), + (234, 1, 33), (250, 0, 100), (255, 0, 164), (237, 0, 228), + (233, 0, 250), (225, 0, 255), (215, 0, 252), (221, 0, 217), + (227, 0, 211), (255, 0, 130), (242, 0, 58), (234, 29, 0) + ), + +// 305 0t0507.jpg +((30, 61, 143), (2, 60, 157), (1, 49, 120), (1, 39, 84), + (15, 36, 82), (29, 33, 80), (44, 34, 108), (60, 35, 137), + (133, 77, 164), (107, 83, 178), (82, 89, 193), (69, 62, 164), + (56, 36, 135), (66, 39, 145), (77, 43, 155), (88, 54, 170), + (99, 65, 185), (144, 133, 193), (171, 181, 208), (198, 229, 223), + (202, 241, 215), (207, 253, 207), (200, 250, 201), (193, 247, 195), + (214, 228, 215), (207, 213, 209), (200, 199, 204), (197, 192, 204), + (195, 186, 205), (185, 183, 199), (175, 181, 193), (176, 181, 187), + (170, 177, 193), (165, 173, 186), (150, 173, 164), (135, 174, 143), + (111, 157, 134), (88, 141, 125), (59, 135, 155), (30, 129, 186), + (6, 95, 161), (3, 92, 147), (0, 89, 134), (7, 61, 100), + (14, 34, 67), (20, 26, 71), (27, 18, 75), (25, 22, 103), + (49, 33, 131), (35, 45, 142), (33, 36, 125), (32, 27, 109), + (19, 18, 87), (7, 9, 66), (7, 22, 81), (7, 36, 96), + (5, 61, 158), (49, 81, 167), (94, 102, 177), (118, 120, 177), + (143, 138, 178), (150, 162, 182), (157, 187, 187), (111, 198, 153), + (59, 254, 114), (37, 226, 98), (35, 165, 89), (34, 104, 80), + (46, 81, 91), (58, 59, 103), (52, 38, 136), (57, 56, 150), + (88, 97, 130), (110, 84, 154), (133, 71, 178), (136, 72, 194), + (140, 74, 210), (130, 70, 199), (120, 66, 188), (106, 58, 180), + (78, 40, 149), (35, 41, 65), (25, 47, 63), (16, 53, 61), + (9, 62, 59), (3, 71, 58), (6, 61, 42), (6, 52, 42), + (0, 42, 65), (1, 50, 110), (3, 59, 156), (4, 65, 157), + (5, 71, 158), (4, 82, 154), (16, 76, 138), (44, 53, 148), + (39, 77, 142), (24, 71, 65), (17, 77, 60), (11, 84, 55), + (10, 108, 57), (9, 133, 60), (39, 124, 83), (98, 123, 130), + (164, 120, 195), (189, 118, 207), (215, 117, 220), (218, 124, 222), + (222, 131, 224), (226, 128, 247), (217, 137, 255), (216, 121, 241), + (176, 107, 223), (50, 116, 190), (38, 121, 187), (26, 126, 185), + (22, 131, 187), (15, 110, 178), (9, 100, 170), (4, 98, 160), + (5, 109, 162), (17, 142, 124), (29, 176, 87), (38, 191, 98), + (48, 206, 109), (72, 202, 128), (100, 212, 140), (135, 199, 172), + (168, 197, 201), (217, 191, 216), (220, 177, 219), (223, 164, 222), + (236, 184, 223), (240, 181, 229), (244, 191, 243), (241, 221, 246), + (255, 235, 209), (228, 212, 217), (201, 189, 225), (195, 190, 224), + (189, 192, 223), (180, 204, 208), (165, 206, 198), (120, 203, 149), + (74, 191, 121), (19, 125, 175), (17, 128, 177), (16, 132, 179), + (12, 128, 175), (8, 111, 177), (5, 112, 156), (2, 103, 133), + (31, 77, 66), (25, 71, 64), (20, 66, 63), (15, 35, 59), + (15, 25, 61), (17, 15, 65), (30, 21, 76), (49, 38, 98), + (86, 46, 143), (141, 68, 185), (151, 76, 194), (162, 84, 204), + (140, 99, 177), (120, 114, 184), (60, 108, 193), (27, 114, 168), + (39, 74, 80), (34, 60, 78), (30, 47, 77), (45, 41, 92), + (52, 42, 102), (84, 76, 127), (83, 87, 112), (99, 116, 126), + (95, 112, 128), (40, 109, 184), (23, 139, 190), (25, 138, 194), + (33, 138, 195), (140, 156, 205), (163, 174, 236), (205, 175, 245), + (252, 180, 246), (246, 186, 238), (241, 193, 231), (199, 211, 199), + (185, 233, 183), (140, 217, 145), (106, 234, 147), (93, 234, 140), + (123, 204, 146), (129, 184, 152), (155, 138, 182), (160, 139, 198), + (180, 141, 198), (212, 162, 221), (210, 168, 234), (196, 182, 235), + (189, 164, 221), (169, 131, 218), (188, 147, 215), (198, 166, 205), + (189, 197, 208), (172, 231, 201), (93, 236, 148), (34, 244, 108), + (12, 214, 78), (21, 170, 76), (37, 120, 78), (78, 75, 120), + (61, 60, 162), (70, 90, 187), (57, 94, 183), (38, 90, 174), + (21, 101, 162), (4, 109, 141), (39, 101, 86), (35, 92, 77), + (18, 52, 54), (7, 14, 43), (5, 11, 45), (5, 6, 60), + (22, 12, 85), (36, 52, 140), (46, 82, 168), (78, 106, 190), + (134, 124, 210), (143, 137, 235), (217, 141, 255), (247, 151, 248), + (245, 154, 247), (246, 165, 232), (246, 165, 232), (240, 176, 226), + (227, 160, 213), (208, 124, 220), (173, 100, 208), (170, 90, 211), + (158, 119, 200), (171, 135, 181), (160, 137, 163), (171, 124, 170), + (167, 133, 193), (193, 134, 214), (221, 141, 240), (241, 144, 255), + (252, 169, 239), (244, 155, 249), (215, 141, 236), (174, 118, 217), + (143, 101, 165), (121, 131, 130), (59, 173, 101), (19, 189, 80) + ), + +// 306 0t0524.jpg +((69, 158, 156), (55, 60, 115), (40, 58, 106), (25, 57, 98), + (29, 77, 95), (33, 98, 92), (25, 100, 56), (18, 103, 20), + (95, 37, 26), (102, 28, 38), (109, 20, 50), (128, 34, 48), + (148, 48, 46), (125, 92, 105), (103, 137, 165), (101, 154, 169), + (100, 171, 173), (82, 162, 163), (61, 122, 143), (41, 83, 123), + (31, 62, 108), (21, 41, 94), (20, 31, 88), (20, 22, 83), + (30, 34, 81), (69, 45, 62), (109, 57, 44), (146, 53, 58), + (183, 49, 73), (213, 71, 120), (244, 94, 168), (241, 4, 108), + (213, 10, 99), (162, 18, 27), (136, 10, 35), (111, 2, 44), + (106, 1, 46), (102, 0, 48), (96, 4, 53), (91, 9, 58), + (44, 0, 59), (57, 14, 48), (71, 28, 38), (92, 24, 47), + (114, 20, 57), (117, 20, 45), (121, 20, 34), (151, 16, 23), + (187, 33, 25), (246, 67, 27), (241, 83, 27), (237, 100, 28), + (234, 83, 21), (231, 67, 14), (226, 63, 17), (222, 60, 21), + (234, 19, 0), (210, 26, 10), (186, 34, 20), (177, 17, 13), + (169, 0, 7), (168, 5, 5), (168, 11, 4), (148, 21, 6), + (112, 20, 0), (104, 15, 19), (83, 12, 17), (62, 9, 15), + (75, 7, 19), (88, 5, 23), (106, 1, 18), (88, 11, 29), + (46, 57, 59), (57, 49, 61), (69, 41, 64), (98, 51, 46), + (127, 61, 29), (158, 59, 22), (190, 57, 16), (210, 64, 5), + (219, 72, 18), (224, 80, 56), (233, 89, 52), (243, 99, 49), + (249, 94, 45), (255, 89, 41), (250, 107, 37), (255, 126, 40), + (210, 87, 53), (221, 89, 37), (233, 92, 21), (228, 78, 19), + (223, 65, 18), (236, 39, 46), (237, 45, 58), (239, 1, 76), + (239, 13, 53), (138, 30, 43), (104, 45, 50), (71, 60, 58), + (58, 55, 70), (45, 51, 83), (49, 53, 114), (69, 64, 118), + (143, 53, 45), (157, 51, 36), (172, 50, 27), (160, 38, 18), + (148, 27, 10), (117, 20, 13), (82, 4, 30), (56, 3, 33), + (65, 3, 52), (81, 5, 51), (78, 19, 43), (76, 34, 36), + (94, 41, 27), (119, 52, 23), (125, 51, 12), (122, 39, 31), + (90, 29, 34), (82, 29, 33), (75, 30, 33), (62, 52, 24), + (50, 74, 16), (66, 86, 1), (103, 63, 11), (148, 66, 10), + (198, 69, 11), (206, 36, 11), (185, 38, 5), (164, 41, 0), + (163, 35, 6), (142, 27, 0), (105, 29, 16), (70, 21, 27), + (33, 7, 36), (23, 13, 51), (13, 20, 66), (15, 17, 68), + (17, 14, 71), (24, 17, 68), (43, 12, 46), (57, 30, 73), + (67, 14, 66), (78, 23, 44), (80, 27, 46), (82, 31, 48), + (101, 38, 57), (115, 25, 50), (145, 29, 40), (155, 30, 12), + (160, 4, 15), (138, 7, 28), (116, 11, 41), (84, 23, 65), + (45, 40, 81), (40, 56, 89), (40, 38, 87), (69, 28, 42), + (87, 32, 37), (124, 44, 43), (132, 46, 32), (140, 49, 22), + (145, 42, 7), (121, 26, 6), (98, 30, 17), (76, 24, 36), + (35, 6, 50), (26, 8, 52), (17, 11, 55), (13, 21, 58), + (10, 30, 65), (16, 39, 70), (22, 39, 85), (17, 38, 91), + (24, 38, 85), (30, 42, 84), (34, 46, 88), (47, 65, 75), + (75, 78, 51), (97, 71, 36), (104, 69, 15), (124, 58, 8), + (152, 54, 19), (151, 49, 25), (151, 45, 32), (160, 46, 10), + (153, 32, 13), (168, 26, 22), (197, 26, 16), (224, 9, 25), + (204, 9, 17), (198, 10, 9), (172, 10, 7), (141, 7, 4), + (128, 5, 10), (116, 16, 14), (112, 18, 16), (106, 31, 35), + (89, 37, 60), (89, 48, 78), (116, 115, 120), (164, 188, 110), + (90, 161, 93), (70, 100, 108), (45, 67, 116), (30, 47, 93), + (15, 38, 92), (10, 42, 93), (22, 51, 95), (21, 59, 96), + (10, 89, 106), (1, 110, 115), (2, 125, 104), (1, 105, 114), + (2, 83, 112), (1, 65, 103), (14, 56, 96), (18, 71, 102), + (38, 81, 123), (32, 99, 126), (69, 115, 141), (87, 148, 153), + (118, 162, 163), (130, 163, 180), (187, 184, 203), (151, 200, 181), + (122, 181, 175), (72, 157, 154), (71, 146, 152), (15, 114, 120), + (15, 96, 100), (15, 81, 93), (20, 75, 96), (24, 76, 115), + (15, 81, 116), (7, 98, 117), (7, 124, 118), (9, 122, 120), + (33, 90, 97), (25, 64, 95), (9, 50, 94), (6, 40, 86), + (2, 33, 90), (13, 22, 81), (26, 17, 74), (27, 6, 65), + (35, 6, 52), (33, 23, 73), (30, 38, 85), (35, 44, 87), + (39, 60, 89), (48, 68, 95), (43, 99, 88), (33, 95, 94) + ), + +// 307 0t0533.jpg +((4, 32, 54), (54, 39, 108), (84, 99, 130), (115, 160, 153), + (138, 164, 165), (162, 169, 177), (164, 177, 183), (167, 186, 190), + (162, 224, 211), (189, 237, 233), (216, 251, 255), (228, 233, 238), + (241, 216, 222), (232, 174, 195), (223, 133, 168), (205, 133, 164), + (187, 134, 160), (176, 117, 227), (135, 98, 163), (94, 79, 100), + (75, 63, 69), (57, 47, 38), (47, 41, 39), (37, 36, 41), + (42, 50, 71), (62, 56, 71), (83, 63, 72), (109, 67, 76), + (135, 72, 80), (120, 64, 70), (105, 56, 60), (99, 48, 63), + (85, 88, 61), (108, 124, 87), (132, 114, 107), (157, 105, 128), + (151, 114, 141), (145, 124, 155), (154, 105, 171), (164, 86, 187), + (67, 38, 148), (33, 28, 112), (0, 19, 77), (6, 18, 49), + (12, 17, 21), (10, 18, 18), (8, 20, 16), (10, 27, 17), + (22, 49, 30), (62, 134, 70), (80, 162, 117), (98, 190, 165), + (115, 200, 180), (133, 211, 195), (139, 209, 196), (145, 208, 197), + (128, 222, 198), (122, 199, 181), (117, 177, 165), (123, 141, 153), + (130, 106, 142), (115, 100, 123), (100, 94, 104), (94, 71, 87), + (82, 70, 82), (47, 52, 58), (39, 60, 47), (31, 68, 37), + (35, 65, 36), (39, 62, 36), (51, 58, 64), (65, 79, 82), + (55, 55, 67), (39, 48, 55), (23, 41, 43), (14, 25, 57), + (6, 10, 71), (8, 15, 77), (11, 21, 83), (18, 28, 87), + (51, 27, 125), (35, 49, 62), (28, 50, 54), (21, 52, 47), + (11, 51, 49), (1, 51, 52), (7, 38, 32), (4, 14, 16), + (7, 9, 8), (12, 5, 10), (17, 1, 12), (15, 10, 14), + (14, 20, 16), (22, 35, 25), (36, 67, 36), (62, 94, 53), + (88, 117, 71), (122, 162, 100), (99, 135, 102), (76, 108, 105), + (78, 106, 104), (80, 104, 104), (78, 93, 98), (70, 88, 90), + (36, 103, 86), (38, 121, 98), (40, 139, 110), (26, 128, 97), + (12, 117, 84), (9, 117, 55), (9, 110, 52), (20, 110, 59), + (24, 119, 75), (77, 64, 92), (81, 69, 100), (85, 75, 109), + (86, 76, 100), (78, 87, 92), (71, 92, 95), (60, 90, 88), + (21, 81, 56), (17, 67, 41), (14, 54, 27), (10, 48, 31), + (7, 42, 35), (6, 43, 35), (3, 47, 30), (3, 75, 38), + (6, 83, 39), (18, 99, 56), (23, 109, 56), (29, 119, 57), + (55, 127, 64), (57, 133, 68), (69, 138, 73), (117, 136, 91), + (120, 151, 94), (101, 146, 86), (83, 142, 78), (73, 140, 75), + (63, 138, 73), (46, 117, 59), (19, 88, 41), (2, 66, 32), + (5, 42, 25), (3, 11, 13), (3, 5, 16), (4, 0, 19), + (1, 11, 12), (2, 17, 12), (5, 44, 23), (3, 79, 40), + (1, 113, 55), (8, 120, 58), (15, 128, 62), (21, 135, 65), + (13, 117, 56), (24, 95, 77), (47, 83, 79), (64, 62, 65), + (78, 60, 50), (83, 54, 72), (91, 53, 71), (100, 53, 71), + (113, 71, 83), (129, 77, 79), (143, 85, 109), (116, 81, 103), + (74, 85, 89), (67, 85, 87), (61, 85, 85), (36, 68, 65), + (18, 52, 54), (18, 58, 49), (18, 68, 56), (44, 70, 69), + (69, 90, 91), (69, 131, 116), (59, 147, 123), (57, 167, 138), + (81, 170, 148), (106, 167, 97), (115, 139, 91), (86, 118, 71), + (30, 41, 43), (27, 43, 35), (25, 46, 27), (6, 22, 22), + (9, 18, 17), (4, 29, 25), (6, 41, 34), (10, 58, 46), + (12, 75, 56), (12, 83, 41), (4, 98, 46), (3, 96, 49), + (9, 92, 66), (6, 82, 54), (4, 76, 52), (3, 70, 52), + (6, 63, 48), (9, 44, 38), (21, 36, 41), (22, 29, 35), + (32, 22, 31), (34, 19, 26), (36, 22, 21), (28, 23, 19), + (35, 32, 25), (38, 33, 30), (63, 36, 41), (70, 39, 44), + (76, 39, 46), (71, 35, 47), (45, 25, 34), (43, 20, 26), + (32, 19, 28), (19, 21, 20), (22, 17, 14), (15, 11, 12), + (13, 7, 9), (12, 10, 11), (26, 29, 22), (39, 39, 29), + (46, 37, 32), (65, 48, 41), (76, 40, 50), (66, 37, 42), + (55, 35, 37), (22, 32, 21), (15, 27, 17), (8, 10, 9), + (5, 7, 6), (4, 0, 3), (7, 7, 9), (10, 12, 11), + (6, 20, 20), (9, 38, 33), (1, 38, 57), (3, 66, 57), + (4, 72, 61), (4, 54, 53), (23, 49, 50), (40, 40, 40), + (58, 31, 40), (77, 49, 63), (65, 41, 75), (40, 55, 58), + (23, 70, 60), (28, 100, 76), (66, 108, 86), (85, 138, 130), + (107, 154, 148), (113, 166, 160), (126, 182, 171), (135, 161, 160) + ), + +// 308 0u0075.jpg +((74, 52, 215), (35, 11, 171), (24, 6, 160), (14, 2, 150), + (7, 2, 145), (0, 3, 140), (0, 1, 133), (0, 0, 126), + (0, 0, 126), (0, 0, 129), (0, 0, 132), (0, 0, 136), + (1, 0, 140), (2, 0, 130), (3, 0, 120), (2, 0, 106), + (2, 0, 93), (0, 0, 23), (0, 0, 11), (0, 0, 0), + (1, 0, 0), (3, 0, 0), (3, 0, 0), (3, 0, 0), + (0, 0, 0), (1, 0, 6), (3, 0, 13), (1, 0, 42), + (0, 0, 72), (0, 0, 90), (0, 1, 109), (0, 0, 120), + (0, 0, 122), (0, 0, 126), (0, 0, 132), (1, 0, 138), + (7, 0, 155), (13, 0, 172), (30, 0, 172), (48, 0, 172), + (98, 13, 166), (101, 7, 150), (104, 1, 134), (84, 0, 127), + (64, 0, 120), (51, 2, 130), (38, 4, 140), (24, 1, 151), + (23, 1, 164), (57, 4, 184), (74, 6, 179), (92, 9, 175), + (70, 4, 176), (49, 0, 177), (33, 0, 164), (17, 1, 151), + (0, 0, 98), (23, 0, 85), (47, 0, 72), (69, 5, 76), + (91, 11, 80), (91, 14, 94), (92, 17, 108), (104, 1, 132), + (106, 0, 162), (94, 6, 180), (95, 3, 179), (97, 0, 179), + (89, 0, 179), (81, 0, 180), (41, 2, 171), (21, 1, 160), + (1, 0, 125), (21, 5, 107), (42, 11, 89), (73, 5, 87), + (105, 0, 85), (110, 0, 97), (116, 0, 109), (131, 8, 174), + (137, 27, 212), (131, 44, 234), (121, 60, 232), (112, 77, 231), + (111, 84, 233), (110, 91, 235), (104, 74, 230), (106, 45, 201), + (106, 0, 110), (97, 0, 83), (88, 1, 56), (76, 0, 47), + (64, 0, 39), (43, 0, 27), (19, 0, 33), (0, 0, 56), + (0, 0, 86), (0, 1, 109), (25, 3, 79), (51, 6, 49), + (56, 8, 46), (62, 11, 44), (77, 8, 53), (94, 1, 54), + (105, 0, 105), (111, 0, 140), (117, 0, 175), (115, 0, 179), + (114, 0, 184), (110, 0, 193), (108, 5, 174), (110, 1, 168), + (121, 1, 148), (98, 2, 128), (82, 1, 119), (66, 0, 111), + (41, 0, 97), (1, 0, 115), (0, 0, 118), (0, 0, 122), + (0, 0, 112), (3, 2, 85), (7, 4, 59), (15, 7, 43), + (24, 11, 28), (37, 24, 33), (54, 9, 48), (81, 0, 77), + (81, 1, 122), (62, 27, 192), (66, 28, 194), (71, 30, 197), + (81, 11, 170), (74, 14, 128), (72, 6, 103), (82, 7, 92), + (79, 8, 48), (70, 6, 44), (62, 5, 40), (67, 3, 46), + (72, 2, 52), (62, 11, 103), (65, 1, 150), (51, 13, 184), + (59, 24, 204), (39, 0, 175), (33, 1, 166), (27, 2, 158), + (31, 1, 151), (24, 0, 150), (27, 0, 144), (37, 0, 142), + (52, 0, 113), (58, 0, 104), (64, 0, 96), (48, 1, 79), + (47, 0, 64), (33, 0, 25), (29, 0, 18), (42, 3, 32), + (67, 15, 53), (103, 0, 153), (104, 3, 166), (105, 7, 180), + (104, 24, 185), (76, 46, 204), (53, 49, 206), (17, 20, 183), + (11, 5, 175), (11, 3, 175), (11, 1, 176), (11, 1, 175), + (8, 1, 167), (0, 0, 148), (1, 0, 134), (23, 0, 130), + (54, 0, 156), (52, 0, 160), (65, 5, 165), (86, 0, 185), + (103, 10, 212), (116, 31, 222), (124, 45, 235), (143, 61, 249), + (135, 96, 247), (129, 99, 246), (124, 102, 245), (119, 94, 240), + (119, 84, 240), (104, 93, 232), (102, 80, 227), (92, 56, 216), + (106, 25, 166), (103, 7, 115), (91, 13, 61), (80, 2, 41), + (68, 1, 36), (54, 0, 13), (11, 0, 16), (1, 1, 3), + (0, 0, 2), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (1, 0, 6), (1, 1, 27), (0, 0, 56), + (0, 0, 90), (0, 0, 112), (0, 0, 124), (10, 0, 135), + (41, 1, 113), (41, 1, 100), (36, 0, 76), (8, 4, 41), + (0, 0, 7), (1, 1, 0), (0, 2, 0), (0, 2, 0), + (0, 1, 0), (0, 0, 0), (1, 0, 2), (5, 1, 2), + (2, 1, 7), (3, 0, 32), (0, 1, 49), (0, 0, 75), + (0, 0, 110), (0, 0, 120), (0, 2, 127), (0, 0, 152), + (1, 0, 166), (18, 0, 180), (42, 0, 188), (76, 28, 200), + (118, 22, 218), (125, 29, 224), (125, 35, 231), (133, 42, 235), + (139, 39, 233), (140, 45, 237), (134, 61, 239), (125, 89, 241), + (135, 91, 248), (137, 87, 248), (143, 51, 240), (131, 50, 240), + (114, 62, 233), (114, 67, 231), (104, 64, 223), (114, 47, 225), + (104, 2, 197), (97, 1, 163), (61, 0, 53), (76, 3, 95) + ), +// 309 0u0298.jpg +((58, 63, 7), (75, 43, 20), (85, 44, 38), (95, 45, 57), + (109, 48, 51), (123, 52, 46), (116, 56, 43), (109, 61, 41), + (87, 47, 37), (90, 38, 37), (93, 30, 38), (98, 30, 32), + (104, 30, 27), (114, 49, 41), (124, 68, 55), (125, 71, 73), + (127, 74, 92), (89, 69, 81), (71, 70, 61), (53, 72, 42), + (30, 63, 26), (7, 54, 10), (5, 48, 9), (3, 43, 9), + (7, 41, 14), (11, 38, 19), (16, 36, 25), (13, 29, 20), + (11, 22, 16), (14, 21, 14), (17, 20, 13), (20, 16, 7), + (4, 26, 5), (19, 52, 33), (22, 45, 57), (26, 39, 81), + (39, 37, 87), (53, 35, 93), (46, 40, 77), (39, 46, 62), + (35, 74, 27), (46, 65, 32), (57, 56, 38), (70, 49, 47), + (84, 43, 57), (84, 45, 59), (85, 47, 62), (72, 44, 58), + (68, 42, 55), (54, 28, 55), (54, 27, 67), (54, 27, 80), + (67, 37, 71), (81, 47, 63), (80, 51, 65), (79, 55, 68), + (109, 77, 92), (101, 72, 84), (93, 67, 76), (86, 53, 64), + (80, 39, 53), (80, 35, 52), (81, 32, 51), (67, 26, 40), + (84, 24, 34), (96, 29, 21), (121, 64, 38), (147, 100, 56), + (153, 107, 55), (160, 114, 55), (166, 128, 66), (191, 138, 72), + (164, 108, 59), (149, 90, 46), (134, 72, 33), (113, 48, 19), + (92, 24, 5), (86, 23, 11), (80, 22, 18), (85, 5, 18), + (98, 15, 25), (125, 16, 47), (124, 28, 51), (124, 40, 55), + (117, 45, 58), (110, 50, 62), (101, 41, 49), (98, 27, 41), + (67, 1, 49), (65, 8, 40), (63, 16, 32), (63, 8, 27), + (63, 0, 23), (65, 2, 11), (74, 20, 10), (89, 33, 0), + (100, 47, 7), (122, 43, 36), (120, 57, 31), (118, 71, 27), + (119, 70, 18), (121, 69, 9), (111, 52, 20), (100, 42, 20), + (124, 73, 44), (128, 85, 40), (133, 97, 37), (132, 89, 39), + (131, 82, 41), (117, 38, 23), (93, 18, 23), (72, 0, 16), + (62, 7, 2), (51, 13, 0), (37, 14, 0), (23, 16, 0), + (17, 12, 6), (9, 25, 14), (5, 34, 29), (9, 39, 31), + (24, 43, 24), (38, 37, 26), (52, 31, 28), (50, 27, 24), + (48, 24, 20), (46, 12, 29), (40, 11, 33), (35, 2, 21), + (44, 4, 15), (58, 0, 5), (58, 6, 4), (59, 12, 4), + (55, 12, 6), (41, 22, 7), (29, 40, 24), (26, 52, 27), + (18, 52, 25), (23, 46, 29), (29, 40, 34), (33, 41, 36), + (37, 43, 39), (46, 33, 42), (59, 26, 35), (60, 18, 28), + (68, 22, 22), (58, 17, 0), (57, 15, 3), (56, 13, 6), + (57, 20, 12), (58, 13, 18), (48, 11, 19), (55, 4, 13), + (68, 2, 6), (63, 5, 7), (58, 8, 9), (53, 8, 15), + (41, 19, 22), (44, 21, 31), (47, 25, 37), (56, 26, 36), + (60, 32, 46), (76, 31, 38), (70, 25, 31), (65, 20, 25), + (66, 16, 19), (46, 14, 19), (35, 22, 14), (26, 23, 14), + (24, 39, 8), (22, 38, 16), (20, 38, 24), (24, 25, 30), + (30, 11, 33), (35, 9, 56), (38, 31, 38), (35, 30, 34), + (34, 46, 24), (40, 48, 9), (63, 45, 21), (70, 60, 9), + (82, 49, 6), (90, 53, 11), (87, 53, 18), (84, 51, 20), + (81, 34, 16), (79, 28, 19), (77, 23, 23), (56, 35, 30), + (53, 35, 35), (31, 29, 30), (15, 27, 17), (13, 26, 9), + (22, 42, 5), (12, 49, 15), (21, 39, 23), (37, 32, 38), + (48, 36, 46), (57, 46, 42), (91, 51, 52), (117, 59, 48), + (127, 69, 57), (135, 81, 81), (168, 106, 85), (193, 133, 99), + (175, 130, 89), (160, 106, 68), (152, 109, 67), (159, 100, 58), + (150, 75, 70), (132, 86, 50), (137, 103, 32), (147, 94, 44), + (161, 107, 47), (170, 102, 57), (158, 84, 71), (147, 75, 79), + (143, 70, 79), (136, 55, 62), (149, 39, 84), (152, 45, 117), + (140, 66, 93), (185, 127, 125), (209, 126, 122), (174, 188, 129), + (146, 190, 157), (138, 180, 114), (128, 108, 120), (153, 80, 109), + (112, 80, 93), (84, 105, 66), (99, 131, 64), (117, 117, 63), + (114, 80, 52), (104, 64, 52), (97, 52, 46), (87, 54, 45), + (82, 60, 46), (48, 48, 40), (45, 46, 41), (28, 49, 30), + (19, 40, 35), (13, 34, 25), (16, 16, 14), (23, 4, 8), + (29, 10, 6), (55, 11, 10), (77, 7, 17), (97, 7, 16), + (100, 14, 25), (94, 14, 25), (92, 22, 32), (74, 6, 31), + (74, 6, 31), (79, 22, 37), (73, 45, 21), (81, 31, 20) + ), + +// 310 0u0298pp1.jpg +((63, 63, 151), (98, 26, 170), (91, 33, 149), (84, 40, 129), + (73, 50, 122), (63, 60, 115), (54, 51, 103), (45, 43, 92), + (43, 32, 46), (40, 29, 57), (38, 27, 69), (35, 22, 77), + (33, 18, 85), (37, 29, 113), (41, 40, 142), (58, 55, 150), + (75, 71, 158), (70, 90, 149), (57, 66, 122), (45, 42, 95), + (42, 32, 107), (40, 23, 119), (41, 23, 119), (43, 23, 120), + (88, 26, 133), (80, 13, 150), (72, 1, 167), (46, 14, 147), + (20, 28, 127), (23, 26, 112), (27, 25, 98), (34, 37, 90), + (46, 44, 91), (36, 58, 71), (36, 57, 63), (36, 56, 55), + (39, 53, 48), (43, 50, 42), (44, 64, 46), (45, 78, 51), + (59, 61, 86), (59, 58, 86), (60, 55, 87), (46, 36, 64), + (32, 18, 41), (27, 21, 30), (23, 25, 20), (20, 21, 15), + (26, 14, 14), (39, 8, 5), (29, 8, 12), (20, 8, 20), + (14, 10, 31), (8, 13, 42), (11, 12, 31), (15, 12, 21), + (42, 0, 20), (46, 10, 25), (50, 20, 30), (45, 13, 49), + (41, 7, 68), (38, 6, 63), (36, 6, 58), (23, 0, 60), + (12, 4, 41), (14, 6, 19), (10, 6, 16), (6, 6, 14), + (7, 8, 13), (9, 10, 12), (14, 4, 12), (18, 0, 0), + (25, 16, 1), (23, 15, 11), (21, 14, 21), (10, 11, 39), + (0, 9, 57), (0, 13, 72), (0, 17, 87), (9, 26, 104), + (0, 27, 118), (37, 22, 127), (56, 13, 128), (76, 4, 129), + (88, 14, 151), (100, 24, 174), (133, 65, 202), (159, 86, 229), + (136, 65, 207), (108, 63, 178), (81, 61, 150), (58, 46, 147), + (35, 31, 144), (30, 24, 110), (29, 18, 97), (33, 14, 80), + (62, 17, 76), (32, 8, 60), (25, 10, 58), (19, 13, 57), + (15, 13, 53), (11, 14, 49), (4, 15, 45), (0, 12, 54), + (0, 4, 65), (5, 17, 86), (11, 30, 107), (23, 29, 112), + (35, 29, 117), (55, 47, 132), (99, 105, 189), (159, 119, 252), + (180, 136, 247), (255, 191, 205), (255, 179, 204), (255, 168, 203), + (228, 166, 181), (195, 129, 139), (88, 109, 138), (54, 77, 93), + (0, 23, 51), (6, 23, 48), (13, 24, 46), (16, 22, 53), + (19, 21, 60), (24, 20, 79), (20, 7, 79), (10, 15, 83), + (7, 22, 65), (0, 38, 77), (4, 36, 94), (8, 34, 111), + (1, 15, 103), (0, 5, 89), (0, 3, 84), (14, 18, 89), + (29, 57, 81), (38, 63, 84), (47, 70, 88), (65, 71, 105), + (83, 73, 123), (100, 92, 90), (131, 113, 73), (112, 64, 50), + (95, 62, 43), (66, 54, 58), (61, 49, 53), (56, 45, 49), + (29, 31, 44), (18, 25, 43), (24, 26, 65), (34, 47, 82), + (77, 31, 140), (85, 27, 158), (94, 23, 177), (114, 36, 197), + (103, 56, 160), (95, 71, 157), (71, 82, 171), (34, 66, 153), + (26, 51, 118), (69, 87, 135), (68, 89, 146), (67, 92, 158), + (86, 93, 161), (110, 119, 178), (95, 102, 157), (82, 99, 151), + (65, 98, 129), (61, 88, 109), (58, 78, 89), (50, 97, 53), + (26, 94, 19), (25, 71, 42), (32, 35, 14), (38, 31, 23), + (36, 52, 68), (62, 79, 99), (86, 70, 145), (124, 112, 194), + (145, 111, 231), (144, 110, 231), (101, 73, 194), (113, 93, 165), + (117, 48, 191), (117, 44, 202), (118, 40, 214), (128, 59, 201), + (116, 40, 174), (99, 7, 118), (68, 1, 78), (72, 17, 56), + (48, 25, 35), (37, 25, 45), (36, 19, 61), (34, 5, 89), + (33, 5, 90), (29, 1, 104), (33, 1, 110), (46, 10, 106), + (34, 13, 104), (14, 14, 110), (12, 12, 100), (0, 0, 112), + (11, 0, 111), (21, 7, 142), (45, 15, 161), (86, 30, 191), + (129, 83, 217), (169, 122, 254), (170, 202, 255), (134, 189, 219), + (86, 171, 236), (142, 128, 203), (119, 102, 180), (117, 71, 135), + (74, 40, 127), (44, 38, 98), (56, 25, 67), (58, 21, 65), + (47, 28, 48), (21, 22, 40), (25, 23, 45), (24, 8, 71), + (18, 15, 82), (15, 29, 102), (14, 31, 103), (18, 38, 99), + (14, 76, 99), (0, 62, 77), (18, 37, 70), (16, 49, 66), + (25, 65, 67), (5, 80, 50), (33, 68, 48), (48, 47, 55), + (47, 42, 49), (36, 29, 73), (43, 33, 86), (42, 32, 93), + (36, 11, 92), (18, 3, 98), (16, 1, 94), (18, 0, 84), + (4, 3, 83), (0, 9, 63), (0, 6, 53), (7, 3, 30), + (0, 0, 20), (4, 2, 26), (1, 0, 48), (21, 0, 69), + (25, 12, 66), (16, 33, 49), (53, 116, 37), (32, 78, 50) + ), + +// 311 0u0303.jpg +((184, 12, 34), (160, 94, 36), (126, 88, 18), (93, 82, 0), + (107, 69, 14), (121, 56, 28), (132, 39, 26), (143, 23, 24), + (158, 1, 32), (137, 1, 53), (117, 1, 74), (106, 16, 60), + (95, 31, 47), (97, 41, 62), (100, 52, 78), (99, 68, 79), + (99, 84, 81), (36, 17, 96), (33, 20, 95), (30, 24, 94), + (53, 49, 77), (77, 75, 60), (98, 78, 75), (119, 82, 90), + (136, 66, 138), (156, 65, 146), (177, 64, 154), (158, 32, 157), + (140, 0, 160), (149, 8, 137), (159, 17, 115), (128, 30, 91), + (117, 43, 102), (155, 36, 130), (132, 28, 109), (110, 21, 89), + (87, 19, 107), (65, 17, 126), (57, 25, 145), (49, 33, 165), + (52, 75, 106), (72, 95, 87), (93, 115, 69), (94, 110, 53), + (95, 106, 37), (80, 111, 34), (65, 117, 32), (62, 109, 28), + (70, 56, 30), (116, 32, 22), (120, 27, 43), (124, 23, 65), + (107, 38, 71), (91, 53, 78), (80, 55, 69), (70, 58, 60), + (25, 54, 10), (31, 41, 5), (37, 28, 0), (59, 21, 0), + (81, 15, 0), (94, 7, 1), (107, 0, 2), (106, 8, 5), + (121, 30, 27), (88, 93, 27), (59, 111, 19), (30, 129, 12), + (40, 129, 20), (51, 129, 28), (72, 145, 38), (97, 127, 91), + (129, 59, 131), (112, 48, 136), (95, 38, 141), (111, 51, 153), + (127, 65, 166), (121, 62, 168), (116, 60, 171), (106, 89, 185), + (99, 113, 174), (23, 62, 131), (56, 47, 102), (89, 32, 73), + (112, 30, 50), (136, 28, 28), (160, 46, 20), (157, 26, 0), + (164, 57, 5), (139, 54, 14), (115, 51, 24), (92, 46, 16), + (70, 41, 9), (65, 24, 18), (64, 19, 24), (74, 16, 30), + (58, 38, 40), (54, 14, 49), (49, 44, 48), (45, 75, 47), + (33, 82, 58), (22, 90, 69), (14, 88, 99), (58, 111, 69), + (76, 151, 84), (95, 149, 73), (114, 148, 62), (117, 162, 63), + (120, 177, 64), (98, 159, 64), (66, 140, 91), (46, 130, 140), + (15, 112, 165), (0, 66, 160), (5, 49, 171), (11, 32, 183), + (8, 13, 139), (24, 40, 138), (86, 5, 146), (96, 13, 101), + (63, 66, 59), (45, 60, 80), (27, 55, 102), (14, 32, 114), + (2, 9, 126), (11, 5, 103), (72, 0, 70), (130, 10, 45), + (152, 29, 24), (161, 35, 36), (163, 25, 55), (165, 16, 74), + (177, 6, 58), (187, 0, 29), (205, 12, 29), (198, 28, 31), + (133, 21, 20), (107, 26, 10), (81, 32, 0), (69, 40, 0), + (58, 48, 0), (39, 59, 8), (48, 91, 38), (69, 114, 45), + (112, 141, 48), (158, 143, 52), (161, 128, 46), (164, 114, 41), + (148, 107, 41), (137, 109, 36), (113, 105, 30), (97, 98, 28), + (140, 138, 61), (155, 133, 53), (171, 129, 45), (190, 131, 53), + (173, 90, 84), (158, 51, 133), (162, 35, 106), (159, 56, 51), + (175, 96, 39), (212, 63, 31), (220, 51, 17), (229, 39, 3), + (239, 17, 12), (242, 6, 42), (206, 0, 48), (161, 0, 31), + (133, 28, 58), (131, 42, 60), (129, 56, 63), (100, 55, 52), + (124, 89, 61), (132, 148, 83), (121, 154, 85), (120, 183, 78), + (130, 175, 58), (155, 168, 50), (209, 150, 30), (212, 206, 82), + (255, 161, 111), (214, 154, 120), (161, 155, 71), (128, 138, 114), + (79, 131, 189), (61, 133, 196), (44, 136, 203), (38, 132, 170), + (60, 122, 137), (87, 121, 94), (66, 113, 58), (59, 68, 21), + (47, 38, 21), (60, 58, 20), (87, 65, 54), (97, 99, 59), + (128, 111, 59), (175, 130, 65), (191, 129, 46), (184, 97, 44), + (161, 80, 25), (141, 68, 35), (121, 90, 25), (107, 72, 32), + (80, 66, 27), (78, 60, 24), (101, 10, 25), (103, 0, 12), + (122, 0, 30), (135, 2, 57), (151, 20, 62), (162, 25, 77), + (182, 12, 108), (157, 5, 124), (135, 3, 87), (131, 26, 66), + (86, 43, 62), (76, 70, 44), (70, 82, 46), (73, 90, 48), + (47, 81, 56), (12, 90, 50), (44, 114, 44), (56, 123, 44), + (68, 147, 68), (100, 184, 72), (91, 174, 86), (78, 148, 96), + (69, 144, 85), (80, 127, 81), (89, 109, 100), (100, 44, 145), + (128, 42, 175), (137, 58, 173), (129, 81, 143), (136, 100, 126), + (163, 157, 183), (166, 90, 155), (133, 71, 154), (106, 58, 170), + (76, 64, 166), (14, 79, 147), (1, 66, 120), (37, 64, 133), + (76, 66, 129), (94, 63, 78), (109, 49, 83), (164, 25, 106), + (173, 28, 119), (186, 31, 125), (159, 45, 133), (137, 42, 110), + (111, 71, 98), (119, 112, 96), (118, 131, 103), (117, 125, 76) + ), + +// 312 0u0333.jpg +((113, 106, 52), (66, 73, 42), (52, 84, 52), (38, 95, 63), + (51, 94, 76), (65, 94, 90), (65, 83, 92), (65, 73, 94), + (27, 51, 75), (32, 46, 77), (38, 42, 79), (45, 37, 68), + (53, 33, 58), (65, 25, 57), (78, 18, 56), (76, 30, 54), + (74, 42, 53), (71, 97, 70), (55, 114, 71), (40, 131, 72), + (46, 118, 51), (52, 106, 31), (38, 94, 15), (24, 83, 0), + (17, 65, 13), (38, 58, 15), (60, 51, 18), (101, 51, 33), + (143, 52, 49), (162, 55, 58), (182, 58, 68), (204, 101, 102), + (189, 129, 95), (164, 91, 100), (145, 83, 86), (126, 75, 72), + (132, 69, 67), (138, 64, 63), (164, 62, 61), (190, 60, 60), + (188, 35, 38), (160, 52, 28), (132, 69, 18), (126, 68, 41), + (121, 67, 65), (120, 67, 67), (119, 67, 69), (118, 86, 61), + (114, 94, 59), (152, 106, 83), (184, 129, 101), (216, 153, 120), + (190, 132, 107), (164, 111, 95), (153, 95, 82), (143, 79, 69), + (169, 94, 91), (196, 118, 102), (224, 143, 114), (205, 135, 104), + (186, 127, 95), (160, 112, 92), (135, 98, 89), (125, 76, 71), + (111, 62, 47), (84, 30, 28), (65, 35, 37), (47, 40, 47), + (44, 46, 50), (42, 52, 54), (52, 43, 48), (79, 64, 43), + (98, 82, 46), (101, 65, 46), (104, 49, 46), (83, 28, 41), + (62, 7, 36), (51, 4, 29), (40, 2, 23), (38, 3, 10), + (40, 6, 5), (26, 8, 6), (25, 21, 8), (25, 35, 10), + (35, 40, 17), (46, 45, 24), (46, 65, 46), (25, 70, 50), + (59, 103, 78), (72, 98, 93), (85, 94, 109), (84, 100, 110), + (83, 106, 112), (42, 119, 147), (97, 151, 138), (104, 190, 165), + (118, 129, 113), (72, 107, 87), (47, 88, 74), (22, 69, 61), + (27, 57, 49), (32, 45, 38), (14, 40, 27), (39, 50, 34), + (63, 54, 57), (89, 61, 67), (116, 69, 77), (129, 75, 77), + (143, 82, 77), (167, 96, 76), (190, 123, 97), (207, 117, 117), + (185, 80, 110), (131, 76, 81), (124, 81, 72), (118, 86, 63), + (108, 83, 61), (101, 106, 26), (93, 128, 24), (87, 95, 22), + (86, 72, 35), (70, 64, 35), (55, 57, 35), (48, 62, 33), + (41, 67, 32), (30, 75, 18), (18, 51, 22), (14, 43, 13), + (20, 36, 9), (46, 19, 2), (50, 27, 15), (55, 35, 28), + (48, 47, 29), (51, 54, 37), (54, 63, 16), (81, 69, 9), + (70, 78, 19), (78, 98, 32), (86, 118, 45), (112, 122, 64), + (139, 126, 84), (162, 141, 112), (195, 144, 97), (205, 110, 90), + (203, 84, 44), (204, 57, 41), (195, 46, 31), (187, 35, 22), + (152, 16, 16), (128, 8, 9), (99, 21, 21), (60, 7, 15), + (35, 14, 23), (38, 22, 30), (41, 30, 38), (41, 34, 42), + (34, 49, 54), (18, 77, 81), (25, 112, 95), (20, 99, 70), + (25, 76, 77), (30, 38, 49), (27, 28, 37), (24, 19, 26), + (12, 4, 27), (0, 3, 26), (23, 10, 36), (30, 15, 34), + (51, 13, 36), (51, 13, 34), (52, 13, 32), (59, 25, 24), + (63, 43, 19), (55, 44, 12), (36, 41, 19), (38, 30, 9), + (44, 25, 10), (62, 40, 17), (79, 38, 34), (72, 49, 31), + (66, 79, 36), (59, 92, 39), (45, 103, 52), (21, 103, 55), + (31, 135, 160), (29, 140, 151), (27, 146, 142), (26, 164, 139), + (2, 150, 124), (23, 102, 73), (15, 68, 52), (27, 25, 39), + (19, 17, 20), (37, 18, 11), (37, 20, 4), (17, 8, 1), + (11, 1, 2), (31, 7, 3), (54, 18, 4), (101, 19, 41), + (133, 34, 37), (145, 45, 45), (136, 59, 65), (114, 67, 77), + (102, 50, 88), (78, 43, 85), (73, 45, 85), (81, 64, 70), + (82, 61, 44), (110, 49, 54), (117, 56, 61), (99, 23, 69), + (75, 27, 79), (58, 39, 69), (53, 45, 68), (62, 68, 68), + (92, 92, 68), (108, 97, 67), (107, 84, 78), (92, 64, 102), + (44, 50, 84), (44, 34, 71), (62, 26, 72), (79, 26, 80), + (97, 29, 102), (76, 1, 70), (76, 11, 53), (56, 1, 43), + (52, 31, 40), (70, 44, 55), (84, 62, 38), (93, 35, 34), + (111, 30, 36), (121, 27, 41), (113, 29, 44), (115, 53, 38), + (129, 52, 44), (134, 54, 65), (159, 52, 44), (178, 60, 46), + (167, 95, 37), (178, 95, 65), (228, 135, 102), (220, 153, 124), + (182, 170, 120), (161, 173, 101), (179, 173, 113), (197, 149, 129), + (163, 145, 141), (165, 129, 133), (145, 122, 140), (134, 107, 112), + (118, 115, 110), (101, 118, 86), (107, 143, 99), (55, 128, 135) + ), + +// 313 0u0752.jpg +((32, 38, 28), (64, 72, 25), (81, 84, 27), (99, 96, 29), + (90, 91, 40), (81, 87, 51), (77, 76, 49), (73, 66, 48), + (78, 66, 42), (89, 71, 44), (101, 76, 46), (108, 76, 39), + (115, 76, 33), (81, 63, 31), (48, 50, 29), (41, 48, 25), + (34, 47, 21), (32, 45, 27), (32, 50, 37), (33, 56, 48), + (48, 82, 60), (64, 108, 72), (78, 112, 81), (92, 116, 90), + (121, 146, 80), (117, 145, 73), (114, 145, 67), (105, 126, 69), + (96, 108, 72), (95, 103, 67), (94, 98, 63), (83, 92, 61), + (56, 79, 59), (40, 48, 35), (35, 44, 34), (30, 41, 33), + (29, 40, 37), (29, 40, 42), (29, 37, 40), (30, 35, 38), + (21, 31, 23), (22, 33, 31), (24, 35, 39), (26, 35, 41), + (29, 36, 44), (29, 39, 45), (29, 43, 46), (27, 43, 43), + (23, 42, 36), (10, 30, 37), (15, 31, 30), (20, 33, 23), + (23, 37, 18), (26, 42, 13), (33, 48, 17), (41, 55, 22), + (60, 67, 23), (65, 64, 31), (70, 62, 39), (73, 51, 35), + (77, 40, 32), (75, 43, 25), (73, 46, 19), (47, 45, 24), + (56, 57, 23), (91, 91, 41), (124, 105, 43), (157, 119, 46), + (160, 118, 54), (164, 117, 63), (154, 108, 58), (118, 103, 48), + (95, 102, 58), (99, 102, 49), (103, 103, 41), (121, 89, 43), + (139, 76, 45), (135, 77, 50), (131, 79, 55), (141, 84, 57), + (147, 112, 80), (88, 99, 57), (74, 94, 50), (60, 89, 43), + (59, 82, 32), (59, 76, 21), (57, 71, 36), (43, 63, 51), + (59, 106, 90), (97, 132, 103), (136, 159, 117), (151, 165, 124), + (166, 171, 131), (191, 169, 145), (137, 175, 160), (133, 174, 158), + (143, 159, 120), (112, 99, 67), (96, 81, 54), (81, 63, 41), + (71, 57, 39), (61, 52, 37), (38, 56, 34), (27, 53, 44), + (39, 60, 63), (50, 58, 62), (61, 56, 62), (69, 61, 53), + (78, 66, 44), (86, 69, 49), (82, 83, 51), (77, 91, 56), + (77, 96, 50), (67, 72, 49), (64, 73, 45), (61, 75, 42), + (57, 55, 34), (50, 54, 31), (43, 48, 26), (42, 46, 23), + (20, 32, 22), (21, 29, 24), (22, 26, 27), (22, 25, 28), + (22, 25, 30), (13, 18, 22), (19, 22, 15), (27, 31, 17), + (38, 41, 30), (46, 56, 29), (48, 60, 31), (51, 64, 34), + (45, 69, 45), (44, 93, 63), (56, 105, 83), (71, 111, 84), + (97, 124, 93), (114, 138, 103), (131, 152, 113), (140, 153, 107), + (150, 155, 101), (155, 152, 101), (148, 151, 106), (146, 156, 122), + (165, 172, 131), (169, 180, 114), (159, 181, 108), (149, 182, 103), + (139, 161, 96), (96, 150, 101), (81, 134, 90), (67, 103, 65), + (42, 58, 29), (37, 53, 29), (32, 49, 30), (30, 51, 32), + (37, 58, 49), (44, 69, 73), (53, 81, 82), (64, 78, 78), + (59, 79, 68), (51, 64, 36), (52, 61, 36), (54, 59, 37), + (62, 61, 41), (70, 68, 43), (73, 79, 51), (87, 98, 66), + (108, 92, 69), (111, 92, 65), (115, 92, 61), (103, 83, 56), + (89, 61, 49), (86, 53, 48), (90, 58, 35), (112, 66, 33), + (134, 88, 39), (149, 115, 41), (137, 125, 53), (116, 133, 91), + (69, 154, 112), (47, 107, 117), (45, 73, 85), (37, 62, 82), + (25, 28, 45), (23, 28, 41), (22, 29, 37), (27, 26, 24), + (56, 30, 15), (70, 49, 32), (88, 76, 52), (110, 107, 54), + (130, 141, 73), (144, 167, 89), (140, 157, 103), (135, 149, 100), + (114, 139, 107), (73, 122, 101), (53, 95, 85), (54, 73, 45), + (45, 52, 34), (37, 35, 49), (34, 45, 67), (37, 59, 83), + (33, 66, 97), (33, 66, 99), (33, 68, 98), (44, 70, 83), + (37, 96, 78), (39, 88, 67), (32, 75, 65), (30, 55, 49), + (27, 39, 29), (20, 28, 17), (17, 29, 7), (22, 24, 11), + (30, 24, 8), (31, 25, 11), (33, 27, 11), (33, 37, 14), + (35, 44, 15), (37, 46, 17), (43, 36, 20), (53, 31, 20), + (60, 40, 29), (80, 57, 25), (113, 76, 24), (118, 81, 28), + (94, 76, 30), (74, 68, 18), (48, 59, 19), (44, 48, 23), + (43, 27, 12), (40, 26, 15), (31, 34, 17), (27, 38, 22), + (28, 42, 27), (34, 47, 27), (46, 51, 28), (53, 62, 33), + (61, 85, 53), (91, 105, 79), (112, 122, 88), (152, 126, 91), + (155, 140, 109), (171, 146, 106), (158, 130, 91), (149, 120, 64), + (151, 123, 60), (163, 130, 53), (167, 134, 55), (183, 143, 91), + (197, 146, 93), (190, 160, 136), (166, 163, 96), (146, 138, 76) + ), + +// 314 0u0768.jpg +((61, 117, 166), (17, 102, 182), (25, 106, 174), (33, 110, 166), + (36, 103, 144), (40, 96, 123), (46, 63, 114), (53, 31, 106), + (107, 13, 89), (121, 28, 86), (135, 43, 84), (134, 50, 81), + (133, 58, 78), (131, 61, 59), (129, 65, 40), (131, 55, 42), + (133, 45, 44), (91, 60, 76), (84, 96, 80), (77, 133, 84), + (44, 153, 89), (11, 174, 95), (22, 177, 99), (33, 181, 103), + (27, 184, 141), (21, 178, 164), (16, 173, 188), (15, 162, 201), + (14, 152, 214), (19, 163, 210), (24, 174, 207), (29, 176, 184), + (28, 199, 165), (55, 175, 202), (50, 172, 211), (45, 169, 221), + (46, 156, 202), (47, 143, 183), (48, 136, 189), (49, 130, 196), + (106, 122, 184), (121, 142, 149), (137, 163, 115), (138, 132, 76), + (140, 102, 37), (148, 75, 29), (157, 49, 21), (163, 40, 6), + (162, 27, 7), (124, 21, 77), (109, 27, 123), (94, 33, 170), + (64, 71, 173), (35, 110, 177), (21, 115, 169), (7, 120, 162), + (16, 128, 139), (22, 91, 120), (28, 55, 102), (38, 30, 84), + (49, 5, 66), (53, 11, 60), (58, 18, 55), (105, 8, 28), + (153, 47, 31), (126, 80, 65), (107, 88, 106), (89, 96, 148), + (82, 90, 161), (75, 84, 175), (27, 121, 209), (23, 130, 224), + (79, 73, 159), (70, 62, 116), (61, 52, 73), (56, 39, 69), + (52, 26, 65), (50, 30, 71), (48, 35, 78), (55, 23, 99), + (83, 57, 104), (54, 125, 119), (39, 132, 137), (24, 140, 155), + (26, 135, 163), (28, 131, 172), (33, 129, 215), (28, 132, 231), + (20, 176, 217), (33, 174, 211), (46, 173, 206), (44, 177, 177), + (42, 181, 148), (29, 132, 131), (25, 128, 133), (46, 132, 123), + (76, 141, 83), (51, 109, 25), (91, 99, 35), (132, 89, 46), + (145, 68, 33), (158, 47, 20), (165, 28, 12), (166, 13, 0), + (149, 14, 0), (138, 14, 38), (127, 14, 76), (128, 25, 77), + (129, 37, 78), (162, 32, 68), (171, 43, 78), (164, 58, 68), + (152, 91, 28), (165, 60, 12), (167, 46, 10), (169, 33, 9), + (181, 12, 19), (170, 5, 12), (143, 13, 37), (109, 22, 67), + (125, 20, 115), (136, 30, 133), (147, 41, 152), (153, 44, 128), + (160, 48, 104), (152, 25, 80), (169, 26, 80), (169, 11, 108), + (142, 3, 144), (139, 48, 141), (135, 51, 115), (132, 55, 89), + (115, 33, 56), (101, 23, 62), (110, 17, 72), (115, 4, 80), + (131, 20, 151), (119, 22, 169), (107, 25, 187), (93, 17, 182), + (79, 10, 178), (82, 15, 144), (39, 37, 134), (45, 22, 112), + (79, 8, 88), (124, 30, 56), (136, 28, 36), (149, 27, 16), + (151, 23, 22), (131, 6, 40), (115, 12, 55), (101, 5, 102), + (31, 5, 130), (21, 16, 137), (11, 28, 144), (15, 61, 157), + (22, 92, 180), (42, 117, 208), (41, 73, 194), (78, 74, 194), + (133, 66, 181), (138, 51, 104), (119, 37, 98), (101, 24, 92), + (57, 10, 88), (6, 12, 110), (12, 31, 125), (18, 71, 147), + (31, 27, 150), (28, 22, 156), (26, 17, 162), (15, 20, 184), + (11, 21, 194), (10, 10, 192), (3, 6, 205), (7, 37, 229), + (10, 70, 216), (21, 53, 188), (14, 57, 172), (22, 50, 185), + (23, 24, 194), (25, 12, 206), (14, 18, 203), (22, 52, 200), + (51, 54, 195), (52, 49, 194), (53, 45, 193), (76, 32, 207), + (108, 16, 205), (74, 24, 219), (55, 20, 226), (36, 57, 200), + (34, 68, 227), (44, 82, 219), (56, 93, 225), (57, 99, 209), + (73, 100, 217), (96, 137, 181), (69, 128, 162), (49, 115, 149), + (17, 88, 144), (30, 85, 139), (18, 32, 103), (25, 17, 100), + (37, 24, 70), (50, 21, 69), (80, 31, 76), (84, 92, 94), + (84, 99, 106), (68, 131, 102), (35, 162, 119), (60, 173, 130), + (54, 155, 139), (89, 130, 158), (66, 113, 143), (41, 84, 152), + (26, 85, 145), (32, 95, 126), (21, 100, 141), (27, 100, 143), + (29, 95, 155), (58, 76, 150), (83, 49, 161), (85, 43, 153), + (71, 36, 156), (59, 41, 123), (47, 31, 67), (24, 46, 25), + (0, 13, 30), (29, 33, 78), (9, 80, 108), (11, 136, 130), + (10, 152, 140), (53, 138, 158), (55, 138, 152), (57, 108, 151), + (82, 77, 161), (99, 57, 183), (101, 45, 198), (65, 33, 194), + (41, 29, 177), (51, 57, 177), (29, 84, 151), (11, 97, 156), + (18, 108, 171), (4, 122, 170), (12, 125, 191), (13, 152, 207), + (37, 146, 211), (53, 160, 212), (46, 166, 227), (49, 177, 240), + (84, 158, 223), (106, 142, 192), (133, 84, 189), (85, 77, 134) + ), + +// 315 0u0795.jpg +((34, 103, 134), (41, 113, 138), (23, 112, 151), (6, 112, 164), + (9, 95, 149), (13, 78, 134), (14, 75, 130), (16, 73, 126), + (26, 31, 113), (42, 19, 106), (59, 8, 100), (67, 13, 70), + (76, 18, 40), (71, 11, 22), (66, 4, 5), (44, 4, 2), + (22, 4, 0), (16, 19, 2), (18, 13, 22), (21, 7, 43), + (43, 3, 70), (66, 0, 98), (76, 0, 98), (87, 1, 98), + (141, 15, 96), (120, 36, 88), (100, 58, 80), (70, 64, 89), + (41, 71, 99), (26, 66, 110), (12, 62, 121), (16, 55, 134), + (24, 50, 134), (18, 47, 127), (15, 38, 107), (13, 29, 88), + (31, 59, 103), (50, 89, 118), (49, 108, 132), (49, 127, 147), + (39, 194, 136), (23, 147, 152), (7, 100, 169), (17, 67, 144), + (28, 34, 120), (25, 28, 113), (22, 23, 106), (21, 20, 98), + (43, 13, 75), (71, 9, 32), (73, 5, 16), (75, 1, 0), + (79, 0, 9), (83, 0, 18), (95, 9, 30), (107, 19, 43), + (67, 21, 23), (49, 12, 25), (32, 4, 27), (43, 17, 35), + (55, 31, 44), (48, 51, 63), (41, 71, 82), (23, 88, 126), + (11, 115, 166), (32, 162, 186), (34, 126, 151), (36, 90, 116), + (42, 80, 101), (49, 70, 87), (63, 62, 60), (74, 36, 61), + (121, 11, 72), (114, 11, 88), (107, 12, 104), (80, 7, 102), + (53, 3, 100), (51, 4, 100), (50, 6, 101), (52, 5, 101), + (58, 2, 101), (58, 12, 77), (45, 20, 50), (32, 29, 24), + (23, 24, 28), (14, 20, 32), (8, 10, 31), (22, 13, 40), + (41, 2, 65), (50, 2, 72), (60, 3, 80), (69, 1, 83), + (79, 0, 86), (87, 1, 88), (104, 7, 88), (123, 20, 73), + (140, 23, 68), (138, 17, 96), (113, 9, 96), (89, 2, 96), + (86, 1, 86), (84, 0, 77), (100, 3, 72), (124, 24, 50), + (140, 60, 23), (151, 59, 46), (163, 59, 70), (168, 52, 74), + (173, 45, 78), (184, 67, 86), (189, 68, 83), (198, 67, 99), + (197, 61, 101), (195, 67, 92), (200, 74, 97), (205, 82, 103), + (200, 77, 98), (191, 75, 86), (188, 70, 86), (160, 87, 52), + (142, 83, 13), (124, 53, 9), (106, 23, 5), (123, 40, 4), + (140, 57, 3), (149, 90, 24), (169, 114, 49), (200, 109, 106), + (198, 131, 115), (99, 181, 145), (92, 146, 134), (85, 111, 124), + (66, 75, 130), (92, 83, 74), (121, 90, 72), (187, 71, 80), + (205, 84, 103), (196, 111, 105), (187, 138, 108), (164, 137, 101), + (142, 137, 95), (138, 113, 93), (110, 89, 36), (90, 71, 29), + (69, 46, 52), (22, 34, 92), (36, 41, 115), (51, 48, 139), + (47, 75, 148), (5, 107, 173), (24, 129, 161), (26, 97, 149), + (25, 47, 132), (29, 37, 125), (34, 28, 118), (43, 14, 107), + (68, 1, 98), (106, 5, 97), (144, 18, 100), (182, 40, 100), + (200, 73, 100), (200, 126, 113), (193, 144, 101), (186, 162, 90), + (210, 139, 31), (143, 128, 59), (122, 172, 49), (96, 174, 62), + (130, 147, 105), (103, 156, 124), (76, 165, 143), (51, 124, 175), + (25, 139, 173), (18, 155, 187), (9, 175, 217), (0, 144, 197), + (0, 144, 197), (12, 114, 178), (9, 111, 175), (22, 92, 162), + (23, 55, 138), (14, 22, 105), (2, 4, 65), (17, 10, 43), + (18, 3, 72), (25, 5, 81), (32, 7, 91), (43, 6, 102), + (42, 11, 104), (46, 12, 106), (49, 9, 105), (46, 9, 104), + (48, 3, 94), (23, 9, 88), (25, 18, 60), (31, 13, 55), + (56, 2, 62), (80, 1, 66), (75, 20, 49), (73, 32, 48), + (62, 31, 39), (32, 18, 51), (7, 20, 54), (11, 28, 82), + (18, 25, 105), (31, 25, 113), (34, 29, 121), (20, 45, 129), + (17, 66, 132), (11, 72, 137), (18, 83, 137), (9, 93, 163), + (23, 148, 178), (3, 148, 195), (18, 189, 206), (10, 199, 219), + (21, 193, 213), (33, 186, 202), (64, 189, 181), (65, 165, 153), + (65, 140, 135), (41, 108, 127), (54, 83, 143), (38, 50, 124), + (36, 23, 111), (43, 14, 107), (39, 13, 104), (34, 22, 98), + (58, 52, 98), (80, 28, 100), (116, 12, 101), (133, 14, 98), + (143, 26, 107), (156, 26, 90), (160, 26, 99), (168, 31, 99), + (185, 41, 102), (193, 56, 100), (189, 56, 99), (175, 43, 92), + (152, 30, 87), (136, 15, 95), (97, 30, 84), (88, 2, 89), + (79, 0, 94), (76, 20, 109), (88, 27, 96), (104, 8, 45), + (95, 5, 33), (159, 25, 24), (178, 26, 41), (172, 4, 56), + (148, 37, 53), (112, 72, 60), (89, 114, 93), (84, 119, 113) + ), + +// 316 1u0214.jpg +((77, 64, 9), (21, 12, 77), (21, 25, 80), (22, 39, 83), + (14, 43, 94), (6, 48, 106), (14, 52, 100), (23, 57, 95), + (5, 47, 45), (23, 35, 51), (41, 24, 58), (46, 12, 42), + (51, 1, 26), (60, 4, 27), (70, 8, 29), (71, 7, 38), + (73, 6, 47), (72, 23, 55), (88, 37, 82), (105, 51, 109), + (113, 53, 90), (122, 55, 72), (114, 44, 65), (107, 33, 58), + (117, 31, 30), (101, 43, 35), (85, 56, 40), (75, 64, 29), + (65, 72, 18), (57, 65, 23), (50, 59, 28), (43, 51, 36), + (25, 35, 47), (26, 5, 70), (19, 6, 52), (13, 7, 35), + (13, 12, 29), (13, 18, 24), (13, 18, 29), (13, 19, 35), + (41, 63, 50), (44, 82, 55), (47, 102, 60), (56, 91, 60), + (66, 81, 60), (76, 75, 52), (87, 69, 45), (93, 63, 37), + (97, 63, 38), (102, 36, 22), (110, 36, 23), (118, 36, 24), + (107, 55, 15), (97, 74, 6), (93, 69, 3), (90, 65, 1), + (70, 84, 25), (56, 71, 33), (42, 59, 41), (45, 44, 57), + (48, 29, 74), (36, 33, 79), (25, 37, 85), (27, 53, 68), + (28, 67, 72), (30, 80, 87), (27, 80, 69), (24, 80, 51), + (28, 76, 43), (33, 73, 36), (54, 61, 30), (56, 45, 13), + (62, 35, 28), (64, 37, 27), (66, 40, 27), (64, 30, 34), + (62, 20, 42), (64, 23, 47), (66, 26, 52), (78, 33, 56), + (72, 35, 52), (70, 48, 24), (79, 55, 16), (88, 63, 9), + (97, 51, 12), (106, 40, 16), (112, 37, 14), (118, 28, 4), + (101, 25, 25), (100, 34, 24), (100, 43, 24), (92, 47, 22), + (84, 51, 20), (78, 62, 13), (79, 69, 0), (76, 74, 0), + (72, 84, 10), (67, 78, 22), (56, 80, 27), (45, 83, 32), + (33, 84, 40), (22, 86, 49), (16, 87, 69), (8, 104, 76), + (78, 112, 85), (108, 111, 87), (138, 110, 89), (146, 119, 85), + (155, 128, 81), (153, 128, 74), (185, 155, 45), (150, 121, 17), + (117, 60, 15), (87, 21, 7), (93, 14, 8), (100, 8, 9), + (104, 15, 17), (110, 35, 12), (105, 43, 2), (104, 50, 6), + (130, 68, 0), (146, 78, 6), (162, 88, 13), (135, 86, 12), + (108, 84, 12), (100, 100, 26), (81, 94, 14), (54, 84, 10), + (44, 86, 14), (52, 107, 39), (41, 116, 35), (31, 126, 32), + (33, 111, 49), (49, 104, 49), (52, 77, 45), (70, 57, 38), + (98, 41, 34), (93, 31, 36), (89, 22, 39), (80, 18, 34), + (72, 14, 29), (47, 14, 21), (30, 11, 13), (21, 24, 13), + (8, 39, 34), (25, 74, 71), (32, 73, 60), (40, 72, 49), + (44, 65, 34), (65, 70, 16), (57, 80, 8), (14, 74, 0), + (13, 10, 5), (8, 13, 7), (3, 16, 9), (4, 41, 34), + (19, 77, 78), (8, 124, 89), (13, 140, 51), (36, 111, 55), + (67, 96, 66), (119, 128, 61), (144, 138, 55), (169, 149, 50), + (170, 133, 44), (80, 119, 38), (46, 81, 17), (19, 42, 13), + (15, 10, 17), (18, 5, 16), (21, 0, 15), (23, 5, 31), + (22, 12, 37), (36, 24, 34), (35, 25, 23), (42, 42, 32), + (53, 49, 40), (54, 40, 73), (49, 81, 80), (51, 78, 63), + (69, 61, 58), (87, 50, 67), (63, 36, 53), (54, 22, 63), + (38, 3, 67), (39, 4, 69), (41, 6, 72), (47, 21, 66), + (66, 33, 76), (64, 37, 56), (80, 27, 37), (82, 34, 20), + (89, 43, 20), (89, 58, 14), (92, 68, 24), (74, 79, 25), + (71, 76, 20), (72, 80, 7), (79, 71, 8), (85, 40, 11), + (95, 28, 22), (81, 27, 27), (66, 11, 50), (58, 29, 73), + (71, 21, 92), (78, 20, 79), (91, 30, 45), (115, 18, 38), + (120, 27, 38), (108, 29, 34), (89, 47, 33), (51, 48, 17), + (47, 55, 14), (41, 35, 11), (57, 18, 1), (86, 20, 0), + (124, 11, 5), (142, 5, 33), (134, 16, 32), (126, 18, 52), + (107, 3, 90), (100, 5, 89), (78, 25, 81), (85, 16, 63), + (92, 23, 44), (118, 32, 33), (127, 39, 38), (116, 72, 87), + (89, 86, 97), (52, 120, 141), (24, 98, 107), (39, 75, 73), + (66, 67, 71), (82, 63, 49), (93, 72, 51), (103, 77, 42), + (125, 103, 4), (169, 108, 1), (171, 115, 20), (179, 131, 23), + (195, 107, 57), (162, 101, 34), (154, 103, 46), (156, 97, 37), + (160, 81, 38), (151, 59, 12), (152, 39, 5), (153, 19, 28), + (160, 38, 17), (156, 69, 15), (138, 87, 42), (124, 78, 42), + (143, 85, 74), (125, 86, 81), (130, 102, 90), (76, 130, 117) + ), + +// 317 1u0215.jpg +((29, 35, 21), (22, 59, 41), (31, 59, 58), (40, 59, 76), + (68, 63, 113), (96, 67, 151), (87, 81, 133), (79, 96, 116), + (90, 120, 158), (65, 99, 136), (40, 78, 114), (72, 44, 100), + (105, 11, 87), (126, 12, 84), (148, 13, 82), (148, 26, 76), + (148, 39, 70), (131, 61, 53), (139, 60, 54), (148, 59, 55), + (150, 47, 49), (152, 35, 44), (166, 34, 42), (181, 34, 40), + (188, 12, 14), (168, 6, 7), (149, 1, 1), (136, 7, 1), + (124, 14, 1), (112, 18, 5), (100, 22, 10), (81, 38, 6), + (50, 45, 15), (104, 12, 53), (118, 14, 50), (132, 17, 48), + (123, 12, 48), (114, 8, 48), (92, 10, 41), (71, 13, 35), + (25, 22, 17), (22, 30, 10), (19, 39, 4), (55, 34, 11), + (91, 29, 18), (97, 23, 23), (104, 18, 29), (111, 11, 35), + (115, 8, 36), (71, 13, 54), (36, 25, 64), (2, 38, 74), + (3, 22, 64), (5, 6, 54), (6, 5, 49), (7, 5, 45), + (7, 30, 10), (22, 29, 11), (38, 29, 12), (64, 18, 8), + (91, 7, 5), (81, 18, 7), (72, 29, 10), (44, 33, 13), + (30, 30, 30), (41, 14, 29), (69, 19, 45), (97, 25, 62), + (99, 30, 57), (102, 35, 53), (116, 33, 27), (140, 44, 20), + (196, 40, 25), (192, 31, 20), (189, 22, 16), (187, 14, 13), + (186, 7, 10), (184, 4, 11), (182, 2, 13), (146, 1, 6), + (114, 19, 23), (12, 8, 31), (6, 14, 31), (0, 21, 32), + (2, 27, 21), (5, 33, 10), (4, 39, 9), (10, 39, 9), + (7, 65, 4), (9, 71, 29), (12, 77, 55), (24, 81, 56), + (36, 86, 57), (49, 100, 93), (52, 84, 125), (93, 104, 132), + (100, 101, 145), (110, 130, 102), (95, 133, 86), (80, 136, 71), + (71, 113, 68), (63, 91, 66), (43, 75, 51), (28, 72, 36), + (32, 45, 25), (17, 60, 17), (3, 75, 9), (3, 77, 9), + (4, 79, 10), (9, 83, 20), (4, 68, 44), (13, 33, 58), + (22, 20, 69), (62, 4, 80), (70, 22, 76), (78, 41, 72), + (77, 44, 53), (35, 36, 22), (26, 29, 18), (14, 23, 20), + (5, 11, 11), (8, 8, 8), (11, 5, 5), (11, 9, 3), + (12, 14, 1), (19, 27, 3), (46, 52, 4), (69, 51, 11), + (107, 61, 2), (126, 44, 30), (125, 59, 27), (125, 75, 24), + (119, 75, 26), (72, 60, 22), (34, 50, 21), (6, 34, 11), + (8, 2, 30), (26, 10, 31), (45, 18, 33), (58, 37, 43), + (71, 56, 53), (77, 49, 71), (101, 32, 113), (105, 71, 122), + (130, 48, 114), (156, 12, 71), (169, 7, 51), (183, 3, 32), + (196, 11, 29), (215, 5, 4), (198, 17, 6), (191, 20, 13), + (132, 33, 27), (121, 30, 26), (111, 27, 25), (94, 19, 24), + (61, 47, 38), (48, 85, 33), (50, 93, 50), (77, 91, 68), + (128, 75, 41), (165, 31, 2), (158, 18, 6), (151, 6, 11), + (155, 22, 25), (176, 6, 32), (155, 1, 51), (147, 12, 45), + (140, 14, 15), (140, 15, 14), (140, 16, 14), (135, 16, 12), + (136, 30, 6), (127, 14, 6), (128, 2, 14), (118, 8, 17), + (128, 19, 40), (115, 9, 58), (131, 21, 66), (141, 10, 76), + (144, 14, 78), (147, 14, 57), (158, 4, 68), (169, 8, 60), + (197, 39, 38), (193, 39, 39), (189, 39, 40), (148, 24, 24), + (104, 19, 38), (45, 18, 33), (23, 15, 56), (24, 17, 58), + (5, 30, 60), (0, 42, 41), (16, 47, 49), (59, 45, 58), + (71, 52, 71), (86, 42, 75), (101, 66, 62), (134, 51, 59), + (131, 47, 96), (77, 114, 120), (80, 120, 109), (43, 124, 92), + (32, 124, 39), (30, 110, 39), (9, 103, 76), (44, 111, 93), + (62, 107, 74), (57, 114, 61), (62, 105, 59), (50, 106, 45), + (59, 122, 52), (75, 98, 72), (117, 88, 46), (126, 72, 36), + (145, 51, 23), (163, 36, 30), (188, 18, 45), (199, 18, 49), + (211, 48, 29), (210, 55, 33), (225, 67, 2), (227, 57, 5), + (230, 22, 18), (198, 41, 26), (186, 44, 43), (152, 39, 83), + (121, 35, 96), (89, 35, 61), (60, 31, 49), (30, 20, 47), + (8, 34, 25), (5, 48, 18), (9, 54, 21), (25, 69, 36), + (30, 77, 31), (33, 88, 31), (40, 85, 44), (48, 79, 48), + (64, 79, 82), (57, 42, 71), (44, 6, 83), (42, 1, 93), + (65, 26, 107), (75, 49, 96), (43, 78, 110), (5, 118, 126), + (40, 155, 142), (36, 150, 117), (83, 136, 68), (143, 90, 40), + (167, 82, 27), (182, 44, 44), (177, 39, 39), (145, 50, 32) + ), + +// 318 1u0216.jpg +((85, 57, 217), (47, 123, 149), (59, 116, 132), (71, 110, 115), + (110, 106, 97), (150, 102, 80), (178, 95, 77), (206, 88, 74), + (170, 78, 125), (118, 75, 132), (67, 72, 140), (46, 53, 144), + (25, 35, 148), (26, 26, 147), (27, 18, 147), (29, 14, 161), + (31, 10, 175), (31, 32, 184), (19, 29, 169), (7, 26, 154), + (51, 23, 151), (95, 20, 149), (96, 34, 141), (98, 48, 133), + (70, 55, 122), (45, 52, 142), (20, 50, 162), (28, 50, 185), + (36, 50, 208), (48, 59, 208), (60, 69, 208), (70, 112, 232), + (105, 111, 209), (152, 179, 170), (181, 163, 172), (211, 147, 174), + (197, 128, 162), (184, 109, 150), (173, 102, 141), (162, 96, 132), + (84, 100, 113), (88, 104, 121), (92, 109, 129), (115, 96, 152), + (139, 84, 175), (142, 72, 173), (145, 61, 172), (157, 53, 150), + (156, 53, 142), (67, 9, 191), (51, 10, 198), (35, 12, 206), + (25, 12, 214), (15, 12, 223), (14, 12, 213), (14, 13, 203), + (2, 3, 155), (6, 7, 163), (11, 11, 171), (30, 29, 191), + (50, 48, 211), (55, 52, 212), (61, 57, 214), (69, 55, 210), + (74, 73, 209), (86, 93, 199), (131, 76, 195), (176, 59, 191), + (183, 54, 172), (191, 50, 154), (215, 62, 109), (237, 90, 80), + (229, 180, 85), (221, 163, 103), (214, 147, 121), (194, 117, 129), + (174, 88, 137), (163, 71, 131), (152, 55, 126), (143, 23, 121), + (135, 42, 148), (126, 40, 167), (119, 55, 183), (112, 71, 199), + (106, 67, 199), (100, 64, 200), (71, 70, 206), (24, 88, 188), + (2, 114, 164), (18, 135, 168), (35, 157, 172), (40, 147, 167), + (45, 137, 162), (101, 118, 187), (90, 98, 196), (106, 99, 177), + (134, 127, 169), (178, 114, 151), (176, 100, 144), (175, 87, 138), + (190, 74, 124), (206, 62, 111), (188, 44, 113), (175, 20, 121), + (168, 10, 131), (163, 7, 125), (158, 5, 119), (157, 3, 112), + (156, 1, 105), (146, 18, 113), (130, 13, 130), (102, 23, 142), + (56, 54, 164), (4, 42, 169), (2, 45, 161), (0, 48, 153), + (26, 47, 138), (45, 70, 137), (45, 73, 136), (48, 72, 182), + (52, 61, 218), (49, 50, 220), (47, 39, 223), (44, 32, 221), + (41, 25, 220), (29, 38, 201), (24, 46, 166), (51, 48, 139), + (131, 19, 147), (186, 29, 100), (193, 22, 89), (200, 16, 78), + (213, 19, 82), (213, 33, 98), (212, 32, 97), (187, 19, 96), + (126, 38, 98), (86, 74, 122), (47, 111, 147), (42, 107, 152), + (37, 104, 157), (16, 104, 178), (7, 86, 205), (6, 50, 201), + (32, 45, 211), (27, 15, 201), (25, 19, 186), (23, 23, 171), + (0, 24, 158), (4, 25, 178), (10, 28, 174), (38, 22, 193), + (75, 33, 227), (100, 31, 216), (126, 29, 206), (154, 27, 192), + (124, 17, 211), (84, 17, 236), (74, 23, 238), (88, 60, 233), + (108, 89, 207), (165, 108, 211), (168, 111, 216), (172, 115, 222), + (200, 117, 185), (209, 140, 184), (215, 154, 149), (213, 162, 143), + (203, 128, 122), (204, 120, 112), (205, 113, 102), (221, 96, 92), + (244, 100, 99), (232, 102, 88), (201, 129, 104), (199, 137, 114), + (184, 118, 128), (194, 89, 93), (188, 85, 102), (191, 118, 135), + (159, 165, 161), (138, 168, 160), (64, 171, 181), (44, 170, 159), + (111, 138, 93), (140, 111, 98), (169, 84, 103), (207, 61, 84), + (197, 37, 101), (178, 34, 93), (136, 30, 118), (61, 64, 133), + (40, 102, 151), (44, 131, 161), (22, 155, 160), (25, 162, 155), + (41, 159, 173), (49, 148, 153), (98, 111, 156), (167, 76, 143), + (168, 63, 130), (214, 60, 94), (220, 38, 61), (221, 13, 45), + (214, 23, 30), (210, 32, 32), (245, 33, 21), (209, 51, 16), + (209, 57, 16), (200, 69, 1), (175, 101, 30), (190, 69, 38), + (193, 64, 86), (149, 39, 110), (102, 49, 153), (79, 41, 180), + (62, 30, 217), (60, 29, 228), (50, 48, 235), (54, 45, 224), + (71, 53, 225), (146, 81, 201), (182, 73, 198), (208, 73, 193), + (197, 76, 169), (205, 68, 146), (215, 72, 100), (233, 90, 74), + (228, 88, 71), (235, 61, 71), (178, 36, 92), (130, 27, 118), + (54, 56, 139), (23, 59, 181), (28, 40, 204), (37, 27, 210), + (66, 20, 207), (82, 32, 191), (109, 40, 191), (124, 11, 161), + (156, 24, 136), (191, 44, 151), (231, 43, 104), (240, 59, 92), + (228, 89, 122), (208, 139, 110), (226, 171, 115), (218, 162, 129), + (198, 125, 136), (176, 109, 127), (114, 141, 98), (100, 130, 96), + (84, 115, 97), (57, 102, 133), (47, 71, 133), (42, 60, 136) + ), + +// 319 1u0216pp1.jpg +((39, 104, 80), (57, 122, 114), (67, 146, 129), (78, 171, 144), + (97, 186, 98), (116, 202, 53), (147, 203, 41), (178, 205, 30), + (185, 182, 77), (186, 161, 108), (188, 140, 140), (172, 136, 150), + (156, 133, 161), (129, 142, 143), (103, 151, 125), (98, 157, 131), + (93, 163, 137), (65, 173, 54), (62, 148, 60), (60, 123, 66), + (59, 138, 71), (59, 153, 77), (51, 163, 91), (44, 173, 106), + (79, 205, 131), (70, 187, 136), (61, 170, 141), (37, 162, 158), + (13, 155, 175), (16, 153, 175), (20, 152, 175), (46, 166, 156), + (55, 152, 143), (78, 160, 75), (126, 172, 56), (175, 185, 37), + (210, 190, 57), (245, 196, 77), (242, 183, 75), (240, 170, 74), + (214, 105, 82), (229, 125, 84), (244, 145, 86), (239, 175, 92), + (234, 206, 99), (227, 189, 99), (220, 172, 100), (217, 149, 100), + (227, 186, 94), (232, 195, 55), (212, 194, 61), (193, 194, 67), + (162, 150, 94), (131, 107, 121), (118, 115, 111), (105, 123, 101), + (83, 152, 98), (84, 179, 85), (85, 207, 72), (94, 228, 97), + (104, 249, 122), (113, 247, 127), (123, 246, 132), (153, 242, 114), + (160, 212, 114), (175, 193, 91), (193, 161, 90), (212, 129, 89), + (184, 133, 85), (157, 138, 82), (146, 127, 69), (107, 77, 77), + (143, 137, 87), (152, 150, 72), (162, 164, 57), (186, 200, 45), + (211, 236, 33), (203, 239, 44), (196, 242, 56), (221, 237, 79), + (228, 245, 71), (255, 218, 55), (248, 200, 50), (242, 183, 45), + (248, 166, 53), (255, 149, 61), (248, 135, 91), (247, 145, 60), + (247, 181, 58), (244, 201, 74), (242, 222, 91), (228, 218, 107), + (215, 214, 124), (209, 206, 125), (195, 177, 131), (131, 159, 119), + (83, 173, 147), (30, 142, 164), (33, 121, 154), (37, 100, 144), + (43, 102, 144), (49, 104, 145), (52, 110, 134), (54, 124, 136), + (39, 147, 157), (54, 141, 144), (70, 136, 132), (103, 130, 132), + (136, 125, 133), (151, 128, 148), (177, 160, 144), (197, 181, 122), + (130, 224, 112), (69, 222, 131), (61, 217, 144), (53, 212, 158), + (46, 201, 161), (74, 181, 165), (76, 194, 162), (76, 205, 174), + (95, 227, 152), (127, 180, 157), (159, 134, 163), (173, 134, 152), + (188, 135, 141), (210, 68, 124), (211, 72, 113), (217, 76, 111), + (225, 97, 98), (192, 184, 59), (182, 187, 41), (173, 190, 24), + (176, 210, 25), (158, 208, 73), (104, 204, 108), (78, 154, 126), + (40, 105, 145), (32, 111, 124), (25, 117, 104), (32, 130, 100), + (40, 143, 96), (54, 203, 121), (60, 233, 141), (60, 232, 172), + (32, 243, 224), (45, 236, 231), (37, 232, 229), (29, 229, 227), + (43, 207, 183), (34, 186, 163), (19, 181, 170), (50, 195, 240), + (87, 167, 194), (83, 178, 178), (79, 189, 162), (82, 201, 135), + (117, 201, 124), (155, 213, 90), (195, 239, 58), (235, 247, 43), + (244, 252, 45), (171, 226, 10), (171, 222, 25), (171, 218, 40), + (105, 217, 45), (102, 222, 73), (92, 196, 71), (105, 197, 52), + (172, 177, 25), (176, 196, 25), (180, 215, 25), (162, 243, 50), + (157, 244, 88), (131, 235, 114), (90, 246, 123), (62, 224, 112), + (64, 234, 135), (52, 227, 136), (47, 211, 140), (24, 219, 149), + (26, 202, 163), (28, 192, 158), (57, 214, 159), (107, 244, 154), + (195, 255, 100), (206, 237, 111), (217, 219, 122), (218, 218, 122), + (216, 212, 123), (200, 198, 121), (206, 165, 121), (168, 150, 112), + (107, 155, 115), (72, 146, 129), (56, 130, 143), (42, 136, 146), + (54, 124, 150), (129, 98, 129), (139, 114, 146), (93, 129, 189), + (44, 133, 189), (26, 115, 171), (18, 104, 181), (7, 151, 185), + (26, 170, 178), (39, 207, 236), (18, 220, 240), (34, 218, 230), + (35, 219, 227), (59, 203, 167), (88, 218, 158), (113, 231, 145), + (150, 226, 104), (211, 214, 65), (222, 203, 83), (222, 201, 82), + (212, 198, 73), (228, 187, 61), (226, 211, 60), (237, 232, 66), + (242, 235, 67), (252, 228, 78), (230, 231, 75), (238, 237, 84), + (244, 253, 110), (243, 255, 111), (250, 253, 104), (240, 244, 85), + (252, 228, 102), (235, 224, 108), (226, 214, 112), (216, 180, 102), + (199, 147, 125), (190, 146, 137), (184, 147, 139), (181, 148, 141), + (188, 156, 143), (209, 188, 123), (210, 217, 121), (153, 255, 103), + (103, 246, 132), (75, 251, 143), (63, 246, 163), (80, 242, 133), + (101, 231, 135), (128, 222, 112), (146, 224, 104), (160, 212, 76), + (168, 207, 64), (197, 206, 35), (193, 194, 56), (207, 180, 73), + (203, 169, 80), (199, 150, 109), (193, 194, 116), (202, 178, 116) + ), + +// 320 3m0001.jpg +((37, 166, 208), (26, 126, 214), (34, 125, 223), (43, 124, 232), + (84, 147, 221), (125, 170, 211), (102, 149, 180), (80, 128, 150), + (12, 35, 103), (24, 22, 112), (37, 9, 122), (72, 9, 106), + (108, 9, 91), (128, 8, 105), (148, 7, 119), (153, 7, 135), + (159, 7, 151), (246, 55, 133), (234, 69, 108), (222, 84, 84), + (220, 77, 73), (218, 71, 63), (224, 60, 80), (231, 49, 97), + (203, 32, 98), (208, 22, 108), (214, 13, 119), (206, 15, 127), + (199, 18, 135), (202, 15, 149), (206, 13, 164), (181, 21, 191), + (163, 8, 198), (96, 68, 230), (68, 127, 212), (40, 187, 195), + (48, 163, 136), (57, 139, 77), (87, 140, 93), (117, 142, 110), + (224, 121, 90), (239, 120, 97), (255, 120, 104), (220, 94, 113), + (185, 68, 123), (182, 62, 123), (179, 56, 123), (174, 29, 104), + (169, 6, 97), (183, 30, 94), (166, 53, 100), (150, 77, 106), + (117, 92, 119), (84, 108, 132), (105, 92, 135), (127, 77, 138), + (183, 29, 153), (164, 25, 142), (146, 22, 132), (129, 25, 139), + (113, 28, 147), (102, 34, 167), (92, 40, 187), (123, 59, 182), + (156, 45, 176), (166, 169, 240), (160, 196, 231), (154, 224, 222), + (144, 206, 212), (135, 188, 202), (151, 186, 205), (152, 141, 207), + (190, 125, 209), (182, 133, 179), (174, 141, 150), (179, 113, 143), + (184, 86, 137), (177, 76, 132), (171, 67, 128), (171, 62, 153), + (179, 50, 153), (209, 59, 123), (211, 49, 122), (213, 40, 122), + (212, 43, 116), (211, 47, 110), (222, 77, 84), (236, 100, 76), + (234, 139, 85), (234, 141, 61), (234, 143, 38), (229, 133, 41), + (224, 123, 45), (239, 118, 89), (244, 93, 102), (245, 77, 152), + (250, 86, 175), (192, 149, 192), (184, 168, 199), (176, 187, 207), + (193, 161, 212), (210, 135, 218), (235, 75, 233), (228, 41, 220), + (229, 6, 195), (207, 5, 194), (186, 5, 194), (185, 6, 194), + (184, 8, 195), (170, 4, 176), (185, 8, 174), (182, 46, 170), + (124, 115, 196), (13, 87, 196), (17, 104, 218), (21, 121, 241), + (38, 117, 246), (67, 43, 225), (59, 64, 164), (87, 43, 156), + (167, 45, 106), (178, 58, 76), (190, 71, 47), (192, 79, 47), + (195, 87, 48), (189, 81, 42), (174, 60, 50), (145, 11, 74), + (125, 14, 65), (119, 32, 111), (128, 33, 125), (137, 34, 139), + (149, 21, 140), (174, 23, 160), (191, 20, 174), (197, 45, 182), + (194, 89, 208), (143, 138, 206), (92, 187, 205), (89, 182, 191), + (86, 177, 178), (74, 148, 159), (57, 123, 173), (41, 112, 176), + (33, 121, 171), (29, 67, 148), (32, 54, 137), (35, 41, 127), + (45, 33, 143), (30, 7, 149), (0, 24, 165), (19, 25, 165), + (34, 44, 194), (36, 33, 205), (39, 22, 216), (45, 8, 186), + (68, 3, 159), (107, 9, 128), (111, 7, 130), (117, 5, 152), + (122, 18, 129), (169, 62, 134), (163, 70, 126), (157, 79, 118), + (183, 82, 138), (222, 88, 151), (223, 74, 158), (220, 49, 153), + (189, 44, 113), (178, 48, 114), (167, 53, 115), (112, 41, 107), + (77, 79, 136), (50, 95, 128), (76, 93, 171), (111, 69, 213), + (156, 50, 208), (194, 33, 191), (198, 48, 207), (217, 70, 184), + (213, 89, 177), (240, 91, 172), (240, 59, 140), (220, 45, 146), + (179, 43, 169), (153, 53, 160), (128, 64, 151), (79, 98, 166), + (117, 108, 151), (121, 79, 142), (145, 92, 98), (144, 103, 119), + (144, 176, 137), (127, 221, 143), (121, 230, 162), (90, 216, 202), + (80, 205, 211), (95, 220, 216), (98, 212, 202), (114, 211, 176), + (144, 167, 139), (146, 101, 144), (133, 58, 140), (139, 33, 141), + (140, 11, 155), (165, 7, 164), (192, 23, 176), (202, 35, 167), + (209, 32, 146), (202, 34, 122), (194, 30, 117), (188, 44, 105), + (186, 27, 93), (186, 12, 75), (190, 30, 102), (222, 29, 122), + (243, 28, 132), (229, 37, 138), (222, 27, 145), (230, 35, 153), + (243, 10, 154), (212, 11, 165), (218, 23, 177), (200, 28, 192), + (181, 66, 209), (149, 101, 213), (154, 127, 206), (98, 125, 214), + (85, 151, 247), (136, 119, 213), (151, 98, 216), (160, 74, 227), + (150, 66, 222), (175, 47, 222), (167, 25, 231), (184, 19, 201), + (201, 13, 172), (214, 24, 184), (197, 53, 210), (194, 86, 187), + (222, 109, 191), (178, 129, 158), (161, 135, 134), (187, 99, 150), + (207, 91, 138), (216, 92, 142), (225, 105, 133), (231, 113, 127), + (238, 102, 122), (231, 110, 93), (239, 126, 92), (238, 147, 90), + (234, 146, 100), (229, 201, 118), (235, 193, 145), (171, 188, 206) + ), + +// 321 3m0004.jpg +((24, 26, 38), (15, 20, 14), (32, 49, 9), (50, 78, 4), + (71, 71, 3), (93, 65, 2), (98, 58, 3), (103, 52, 5), + (88, 8, 19), (81, 11, 21), (74, 14, 24), (51, 20, 30), + (29, 26, 37), (14, 15, 36), (0, 4, 36), (6, 10, 41), + (13, 17, 46), (43, 36, 87), (59, 39, 88), (76, 43, 90), + (87, 32, 73), (99, 22, 56), (103, 13, 45), (108, 5, 35), + (179, 31, 45), (196, 31, 71), (214, 31, 97), (168, 26, 79), + (123, 22, 62), (114, 26, 58), (105, 31, 54), (74, 37, 21), + (89, 45, 20), (123, 117, 19), (128, 126, 9), (134, 135, 0), + (150, 133, 32), (166, 131, 65), (173, 114, 61), (180, 97, 57), + (142, 72, 72), (99, 90, 49), (57, 109, 27), (35, 132, 49), + (14, 156, 72), (38, 163, 89), (62, 171, 106), (123, 125, 104), + (108, 62, 72), (92, 34, 46), (84, 26, 42), (76, 19, 38), + (69, 31, 43), (62, 43, 49), (56, 53, 48), (51, 64, 47), + (11, 103, 36), (26, 150, 32), (41, 197, 28), (64, 175, 34), + (87, 154, 41), (76, 123, 23), (65, 93, 6), (102, 96, 10), + (107, 69, 6), (63, 53, 52), (74, 73, 52), (85, 93, 52), + (94, 86, 38), (104, 79, 25), (112, 66, 43), (105, 62, 30), + (105, 50, 20), (109, 35, 11), (113, 20, 2), (97, 16, 3), + (81, 13, 4), (74, 16, 3), (67, 20, 2), (69, 30, 1), + (65, 27, 14), (60, 59, 67), (39, 83, 92), (18, 108, 117), + (14, 111, 147), (10, 114, 177), (20, 108, 198), (35, 69, 130), + (30, 58, 61), (28, 45, 45), (26, 32, 30), (40, 39, 32), + (55, 47, 34), (61, 70, 23), (58, 83, 25), (73, 81, 42), + (81, 76, 38), (68, 52, 65), (83, 55, 74), (99, 59, 83), + (112, 69, 83), (126, 80, 83), (182, 126, 137), (143, 159, 156), + (61, 121, 131), (56, 81, 96), (51, 42, 61), (46, 35, 60), + (42, 29, 59), (38, 22, 49), (61, 20, 36), (83, 17, 29), + (85, 5, 14), (68, 22, 9), (58, 15, 9), (48, 8, 9), + (64, 27, 11), (109, 41, 20), (141, 74, 4), (162, 96, 9), + (175, 60, 15), (166, 37, 9), (157, 15, 3), (166, 14, 9), + (176, 13, 16), (178, 15, 16), (187, 19, 52), (218, 24, 61), + (205, 48, 55), (141, 34, 112), (143, 25, 127), (146, 17, 143), + (88, 4, 144), (63, 16, 130), (65, 42, 132), (50, 34, 143), + (28, 36, 119), (24, 41, 93), (20, 47, 68), (22, 66, 52), + (24, 86, 37), (52, 87, 7), (22, 73, 6), (26, 60, 25), + (41, 54, 47), (60, 7, 121), (75, 14, 118), (91, 22, 115), + (105, 42, 99), (124, 37, 72), (132, 46, 59), (144, 55, 41), + (209, 41, 32), (216, 31, 33), (224, 22, 34), (228, 59, 40), + (232, 100, 35), (243, 108, 27), (228, 110, 74), (241, 149, 48), + (226, 147, 44), (245, 167, 17), (239, 173, 16), (233, 180, 16), + (236, 168, 5), (224, 156, 21), (200, 160, 11), (189, 136, 22), + (104, 119, 78), (106, 128, 82), (109, 137, 86), (125, 160, 68), + (112, 182, 50), (133, 180, 52), (171, 161, 14), (176, 169, 19), + (212, 159, 27), (192, 126, 66), (221, 100, 89), (219, 102, 93), + (223, 132, 85), (212, 144, 71), (200, 139, 108), (199, 169, 119), + (248, 167, 120), (225, 156, 120), (203, 145, 121), (172, 75, 86), + (148, 52, 80), (123, 40, 56), (114, 33, 32), (114, 31, 23), + (113, 23, 14), (103, 13, 25), (91, 4, 12), (83, 11, 15), + (44, 15, 20), (26, 16, 14), (2, 11, 16), (10, 12, 11), + (21, 18, 1), (22, 24, 3), (13, 41, 3), (4, 44, 20), + (2, 50, 26), (17, 47, 11), (31, 19, 21), (83, 9, 44), + (147, 23, 57), (172, 52, 53), (200, 81, 85), (202, 104, 59), + (191, 126, 96), (197, 131, 117), (168, 114, 102), (118, 80, 77), + (94, 75, 60), (105, 65, 55), (123, 76, 68), (161, 77, 43), + (195, 66, 37), (231, 110, 6), (216, 128, 0), (233, 140, 9), + (217, 139, 15), (199, 135, 12), (184, 108, 32), (170, 119, 38), + (128, 103, 19), (83, 135, 27), (15, 168, 85), (1, 185, 133), + (23, 141, 143), (44, 129, 166), (41, 77, 200), (83, 59, 143), + (92, 60, 145), (94, 35, 145), (86, 35, 104), (119, 17, 91), + (142, 31, 82), (111, 26, 49), (87, 31, 40), (91, 42, 38), + (97, 37, 27), (101, 44, 37), (100, 53, 27), (110, 69, 25), + (107, 42, 40), (101, 45, 72), (109, 7, 91), (89, 19, 92), + (77, 30, 85), (55, 13, 95), (69, 11, 62), (37, 13, 65) + ), + +// 322 3m0005.jpg +((112, 35, 45), (85, 8, 40), (99, 30, 33), (113, 53, 27), + (118, 53, 34), (123, 53, 41), (143, 59, 46), (163, 65, 52), + (170, 9, 123), (124, 14, 116), (79, 20, 110), (55, 29, 105), + (31, 39, 101), (22, 31, 96), (13, 23, 92), (35, 28, 78), + (57, 33, 65), (120, 100, 135), (115, 130, 139), (110, 161, 144), + (122, 190, 165), (134, 219, 186), (133, 227, 184), (133, 236, 183), + (96, 214, 156), (106, 206, 133), (116, 199, 111), (108, 152, 84), + (100, 106, 58), (82, 89, 42), (64, 73, 26), (33, 54, 21), + (14, 45, 37), (2, 22, 83), (7, 23, 73), (13, 25, 63), + (13, 29, 51), (14, 33, 39), (15, 32, 37), (16, 31, 36), + (37, 48, 34), (81, 37, 25), (125, 27, 16), (140, 30, 11), + (155, 34, 7), (159, 37, 3), (163, 40, 0), (155, 59, 8), + (109, 60, 28), (33, 37, 12), (33, 26, 7), (33, 15, 3), + (16, 11, 7), (0, 7, 12), (0, 4, 6), (0, 1, 0), + (21, 3, 15), (32, 9, 9), (43, 15, 3), (50, 23, 21), + (57, 31, 40), (60, 46, 55), (63, 62, 70), (78, 107, 79), + (82, 110, 72), (46, 98, 23), (51, 92, 20), (56, 87, 17), + (42, 88, 27), (29, 89, 37), (16, 74, 33), (19, 68, 39), + (49, 56, 15), (61, 49, 27), (73, 42, 39), (85, 80, 65), + (98, 118, 91), (100, 149, 101), (103, 180, 112), (102, 233, 129), + (89, 213, 115), (54, 148, 95), (33, 105, 95), (13, 62, 95), + (6, 38, 96), (0, 14, 97), (17, 8, 63), (35, 17, 43), + (44, 33, 37), (36, 38, 45), (29, 43, 54), (32, 37, 63), + (36, 31, 72), (33, 30, 73), (18, 58, 70), (15, 91, 61), + (32, 86, 54), (37, 94, 41), (42, 76, 41), (47, 58, 41), + (51, 56, 40), (56, 54, 39), (61, 37, 51), (108, 44, 42), + (145, 23, 62), (128, 15, 40), (111, 7, 18), (84, 18, 19), + (58, 29, 21), (18, 32, 33), (2, 47, 24), (6, 53, 21), + (7, 80, 35), (14, 103, 39), (17, 97, 32), (21, 92, 26), + (36, 106, 17), (45, 113, 12), (40, 124, 36), (66, 120, 94), + (67, 152, 149), (66, 134, 116), (65, 116, 83), (69, 115, 86), + (74, 114, 90), (104, 133, 105), (130, 149, 94), (177, 182, 79), + (204, 197, 106), (246, 226, 155), (234, 212, 119), (222, 199, 83), + (228, 156, 72), (246, 93, 75), (181, 136, 81), (152, 143, 78), + (185, 140, 107), (175, 153, 120), (165, 166, 134), (170, 176, 136), + (175, 187, 139), (173, 188, 129), (148, 182, 98), (117, 174, 129), + (87, 154, 137), (39, 124, 95), (24, 122, 103), (10, 120, 111), + (11, 105, 87), (6, 97, 54), (15, 135, 27), (25, 129, 14), + (15, 67, 3), (15, 62, 12), (16, 58, 22), (14, 42, 46), + (22, 46, 50), (51, 27, 63), (70, 6, 90), (71, 24, 78), + (52, 45, 86), (57, 87, 27), (82, 112, 25), (107, 137, 23), + (167, 158, 27), (229, 175, 27), (255, 196, 33), (236, 162, 53), + (112, 126, 47), (101, 124, 43), (91, 123, 40), (100, 98, 50), + (106, 89, 63), (61, 72, 55), (94, 81, 49), (114, 67, 25), + (106, 59, 33), (81, 32, 38), (69, 45, 33), (77, 104, 49), + (105, 140, 48), (133, 161, 59), (162, 184, 76), (202, 204, 43), + (239, 143, 33), (206, 131, 39), (173, 119, 45), (175, 91, 57), + (169, 32, 60), (209, 9, 48), (212, 5, 11), (197, 19, 33), + (185, 22, 25), (125, 8, 34), (78, 9, 38), (76, 11, 67), + (116, 23, 104), (100, 28, 114), (76, 20, 127), (51, 67, 103), + (37, 75, 94), (32, 79, 73), (48, 119, 49), (84, 108, 48), + (97, 108, 16), (109, 95, 20), (113, 82, 2), (89, 44, 3), + (80, 29, 8), (55, 16, 9), (31, 10, 27), (9, 5, 22), + (11, 8, 25), (11, 20, 37), (13, 28, 35), (12, 12, 20), + (25, 23, 11), (24, 27, 18), (58, 54, 16), (96, 87, 28), + (149, 114, 56), (141, 148, 53), (119, 129, 92), (122, 159, 92), + (115, 152, 108), (113, 162, 107), (109, 163, 137), (170, 125, 182), + (158, 119, 122), (147, 106, 122), (132, 105, 112), (119, 79, 113), + (113, 101, 85), (60, 109, 77), (17, 114, 105), (22, 76, 120), + (17, 69, 90), (10, 68, 79), (17, 81, 80), (33, 76, 59), + (60, 69, 48), (98, 63, 25), (122, 103, 27), (144, 117, 26), + (157, 133, 47), (171, 109, 60), (229, 93, 79), (222, 81, 89), + (181, 86, 108), (189, 50, 107), (203, 16, 119), (211, 22, 80), + (210, 79, 59), (175, 97, 23), (108, 118, 19), (33, 128, 34) + ), + +// 323 3m0006.jpg +((13, 117, 206), (44, 114, 52), (26, 111, 30), (8, 108, 9), + (39, 57, 15), (70, 6, 22), (69, 5, 54), (69, 4, 86), + (38, 5, 118), (21, 12, 104), (5, 19, 90), (9, 21, 79), + (13, 24, 69), (29, 36, 73), (45, 49, 78), (48, 44, 76), + (51, 40, 74), (70, 19, 96), (85, 18, 95), (101, 17, 95), + (95, 18, 105), (89, 19, 115), (84, 20, 110), (79, 21, 106), + (64, 10, 130), (56, 29, 136), (49, 48, 142), (59, 53, 135), + (69, 59, 128), (78, 67, 114), (88, 75, 101), (136, 74, 85), + (143, 72, 70), (166, 105, 50), (171, 83, 35), (177, 61, 20), + (155, 55, 10), (133, 50, 0), (140, 49, 5), (148, 49, 10), + (202, 26, 72), (216, 34, 60), (231, 42, 49), (223, 86, 56), + (215, 130, 63), (220, 133, 60), (226, 136, 58), (218, 188, 102), + (205, 229, 69), (129, 172, 93), (93, 161, 90), (58, 150, 87), + (73, 145, 95), (88, 140, 104), (104, 128, 98), (121, 117, 92), + (138, 83, 80), (135, 73, 100), (132, 64, 121), (144, 101, 102), + (156, 139, 83), (154, 141, 82), (152, 144, 81), (113, 134, 65), + (127, 88, 83), (101, 32, 95), (121, 27, 103), (141, 22, 112), + (139, 28, 92), (137, 35, 72), (144, 56, 46), (143, 114, 48), + (148, 181, 94), (167, 181, 102), (186, 182, 111), (169, 190, 125), + (153, 198, 139), (137, 175, 145), (121, 153, 152), (104, 159, 190), + (71, 142, 230), (60, 166, 214), (102, 163, 186), (144, 160, 159), + (157, 159, 131), (170, 159, 103), (223, 152, 70), (237, 145, 42), + (199, 61, 58), (174, 44, 63), (150, 28, 69), (151, 23, 62), + (153, 19, 56), (129, 6, 61), (119, 3, 48), (114, 12, 36), + (80, 23, 32), (80, 3, 81), (84, 10, 88), (89, 18, 96), + (83, 13, 93), (77, 8, 91), (90, 39, 82), (94, 38, 77), + (129, 72, 29), (152, 79, 39), (176, 86, 49), (175, 93, 69), + (174, 100, 89), (164, 122, 132), (140, 100, 196), (54, 111, 178), + (43, 129, 176), (20, 139, 219), (29, 134, 227), (38, 129, 236), + (88, 203, 248), (164, 193, 237), (152, 178, 229), (131, 187, 178), + (59, 160, 142), (42, 144, 110), (25, 129, 78), (36, 125, 77), + (48, 121, 76), (74, 122, 82), (95, 108, 88), (153, 86, 67), + (147, 67, 56), (103, 82, 81), (104, 103, 97), (105, 125, 113), + (58, 150, 127), (33, 177, 150), (33, 175, 159), (36, 136, 170), + (81, 105, 73), (135, 114, 54), (189, 123, 36), (197, 127, 44), + (205, 132, 53), (205, 98, 52), (201, 74, 91), (196, 71, 127), + (215, 39, 138), (156, 13, 105), (151, 11, 105), (147, 9, 105), + (137, 20, 135), (104, 67, 119), (59, 109, 120), (29, 75, 127), + (80, 39, 81), (80, 51, 63), (81, 64, 46), (45, 93, 45), + (47, 69, 83), (42, 68, 127), (22, 75, 187), (16, 116, 230), + (41, 160, 244), (46, 201, 249), (48, 180, 216), (51, 160, 183), + (6, 155, 126), (31, 172, 60), (139, 162, 32), (185, 138, 24), + (207, 123, 37), (203, 105, 33), (200, 87, 29), (195, 25, 12), + (184, 24, 8), (177, 15, 10), (168, 3, 17), (136, 2, 35), + (101, 6, 74), (59, 5, 89), (21, 8, 88), (13, 5, 78), + (9, 0, 48), (33, 0, 49), (58, 14, 37), (46, 43, 86), + (0, 67, 116), (3, 100, 130), (6, 134, 145), (19, 145, 206), + (5, 205, 230), (21, 211, 243), (6, 203, 209), (48, 169, 188), + (27, 146, 178), (24, 139, 122), (61, 95, 97), (68, 85, 103), + (75, 64, 58), (75, 44, 75), (93, 39, 63), (129, 69, 45), + (123, 59, 34), (126, 53, 21), (124, 37, 7), (97, 22, 16), + (77, 35, 49), (79, 62, 34), (38, 52, 26), (37, 55, 13), + (58, 96, 19), (122, 61, 0), (129, 66, 12), (138, 127, 35), + (119, 163, 78), (147, 205, 82), (194, 226, 67), (193, 220, 45), + (188, 159, 42), (185, 116, 21), (166, 78, 38), (139, 72, 17), + (134, 123, 17), (146, 148, 3), (189, 152, 2), (193, 123, 11), + (185, 92, 15), (206, 54, 17), (184, 26, 23), (180, 9, 25), + (166, 19, 27), (150, 25, 21), (132, 11, 30), (153, 17, 37), + (166, 0, 42), (218, 28, 74), (218, 32, 82), (206, 26, 61), + (165, 27, 43), (147, 20, 13), (152, 3, 0), (169, 20, 0), + (171, 20, 11), (167, 21, 21), (178, 29, 9), (180, 52, 27), + (173, 113, 61), (158, 115, 83), (121, 92, 148), (54, 120, 170), + (58, 97, 152), (48, 64, 123), (56, 34, 81), (84, 34, 85), + (84, 30, 106), (120, 66, 98), (95, 132, 91), (129, 100, 102) + ), + +// 324 3m0007.jpg +((0, 213, 157), (12, 213, 221), (11, 217, 227), (11, 222, 233), + (43, 218, 202), (75, 214, 172), (119, 179, 159), (164, 144, 146), + (213, 142, 62), (212, 129, 64), (212, 116, 66), (167, 93, 95), + (123, 70, 124), (127, 57, 144), (132, 44, 164), (117, 49, 173), + (103, 54, 182), (64, 110, 125), (79, 126, 110), (95, 143, 95), + (97, 129, 83), (99, 116, 71), (103, 110, 93), (107, 105, 116), + (120, 100, 163), (146, 121, 140), (172, 142, 118), (164, 119, 122), + (156, 97, 127), (159, 87, 135), (162, 77, 144), (161, 66, 148), + (159, 75, 153), (134, 94, 165), (101, 105, 181), (69, 116, 198), + (74, 90, 169), (79, 65, 140), (82, 58, 134), (86, 52, 128), + (122, 56, 104), (133, 59, 120), (144, 62, 136), (147, 53, 134), + (150, 44, 132), (164, 28, 123), (178, 12, 114), (178, 7, 99), + (144, 37, 79), (129, 67, 70), (163, 83, 58), (197, 100, 47), + (220, 80, 54), (244, 60, 62), (243, 37, 67), (243, 14, 73), + (240, 37, 100), (227, 52, 88), (214, 67, 77), (168, 63, 81), + (123, 59, 85), (106, 58, 78), (90, 58, 71), (68, 50, 92), + (41, 81, 117), (48, 122, 161), (43, 100, 155), (39, 79, 149), + (35, 61, 156), (32, 44, 164), (43, 24, 168), (34, 12, 175), + (8, 44, 158), (11, 93, 158), (15, 142, 159), (10, 162, 174), + (6, 183, 189), (8, 178, 189), (10, 173, 190), (37, 164, 183), + (55, 115, 203), (43, 88, 155), (68, 75, 133), (94, 62, 112), + (107, 73, 109), (120, 85, 107), (108, 85, 93), (86, 139, 109), + (36, 117, 121), (30, 101, 129), (24, 86, 137), (21, 99, 127), + (18, 113, 117), (0, 108, 125), (3, 126, 131), (46, 128, 116), + (58, 118, 118), (97, 77, 112), (101, 74, 104), (105, 71, 96), + (99, 66, 99), (93, 61, 102), (68, 104, 78), (80, 158, 82), + (50, 142, 91), (35, 114, 101), (20, 86, 112), (15, 76, 118), + (11, 67, 124), (2, 55, 151), (1, 39, 162), (11, 43, 203), + (20, 73, 241), (20, 130, 191), (10, 126, 187), (0, 123, 183), + (5, 117, 180), (3, 113, 176), (2, 88, 165), (4, 52, 162), + (18, 21, 154), (32, 17, 152), (47, 13, 151), (39, 15, 141), + (32, 18, 132), (17, 21, 129), (33, 21, 121), (55, 23, 132), + (50, 2, 112), (71, 46, 103), (73, 47, 99), (75, 49, 96), + (83, 86, 79), (112, 151, 98), (176, 173, 120), (230, 171, 127), + (89, 145, 219), (45, 166, 200), (2, 187, 182), (4, 191, 178), + (6, 195, 175), (40, 207, 127), (56, 186, 80), (60, 214, 80), + (57, 223, 77), (74, 203, 139), (60, 174, 150), (46, 146, 162), + (16, 131, 138), (20, 149, 110), (60, 185, 85), (70, 188, 114), + (32, 184, 111), (23, 167, 105), (14, 150, 100), (34, 95, 100), + (46, 56, 125), (68, 38, 136), (71, 27, 162), (61, 16, 161), + (89, 9, 158), (111, 34, 164), (112, 37, 146), (113, 40, 129), + (101, 29, 129), (106, 6, 164), (95, 7, 179), (90, 49, 187), + (80, 63, 191), (99, 72, 184), (119, 82, 178), (160, 87, 158), + (224, 70, 184), (161, 88, 206), (94, 114, 229), (74, 131, 218), + (33, 157, 217), (13, 169, 191), (25, 192, 174), (91, 163, 160), + (151, 149, 124), (181, 156, 66), (225, 172, 102), (237, 146, 93), + (232, 71, 123), (220, 50, 111), (209, 29, 100), (178, 11, 117), + (144, 20, 230), (106, 27, 233), (23, 48, 236), (15, 115, 191), + (24, 115, 188), (20, 77, 164), (14, 52, 149), (5, 37, 140), + (1, 33, 120), (19, 37, 121), (22, 32, 129), (17, 64, 142), + (49, 48, 128), (64, 34, 132), (59, 23, 131), (58, 40, 148), + (28, 71, 139), (27, 85, 135), (31, 124, 106), (49, 117, 102), + (64, 84, 83), (62, 45, 99), (12, 47, 79), (5, 68, 85), + (12, 91, 124), (3, 117, 143), (2, 120, 170), (3, 121, 171), + (7, 139, 188), (7, 168, 188), (9, 163, 189), (2, 129, 174), + (3, 117, 171), (7, 107, 166), (13, 55, 165), (47, 42, 162), + (68, 38, 160), (73, 41, 168), (87, 24, 155), (95, 36, 128), + (125, 25, 124), (139, 12, 103), (130, 55, 94), (111, 36, 119), + (69, 52, 144), (17, 89, 165), (3, 116, 172), (12, 117, 146), + (14, 118, 129), (8, 76, 125), (0, 70, 129), (28, 38, 100), + (54, 33, 110), (89, 33, 124), (93, 4, 120), (97, 23, 100), + (89, 7, 73), (91, 33, 74), (118, 45, 90), (124, 82, 104), + (163, 120, 176), (171, 152, 207), (165, 187, 226), (166, 160, 222), + (188, 145, 201), (173, 106, 186), (136, 99, 140), (162, 82, 153) + ), + +// 325 3m0008.jpg +((206, 79, 156), (193, 35, 122), (190, 27, 122), (188, 19, 122), + (156, 15, 113), (125, 12, 104), (132, 33, 92), (140, 54, 81), + (163, 151, 153), (126, 176, 154), (89, 201, 155), (88, 194, 181), + (88, 187, 208), (97, 184, 196), (107, 181, 184), (115, 186, 187), + (124, 192, 191), (172, 178, 132), (193, 136, 99), (215, 94, 67), + (167, 93, 44), (120, 93, 22), (131, 80, 15), (143, 67, 9), + (137, 3, 2), (129, 22, 7), (121, 42, 12), (117, 51, 14), + (113, 60, 16), (99, 52, 20), (86, 45, 25), (39, 6, 13), + (26, 29, 44), (50, 74, 38), (68, 74, 36), (87, 75, 35), + (84, 102, 27), (82, 130, 20), (79, 135, 40), (76, 141, 61), + (41, 134, 79), (41, 128, 70), (41, 123, 61), (29, 88, 35), + (17, 54, 10), (12, 49, 10), (7, 44, 10), (24, 41, 22), + (30, 38, 15), (115, 19, 5), (91, 10, 7), (67, 2, 10), + (45, 6, 6), (24, 11, 3), (14, 6, 13), (4, 2, 23), + (13, 35, 93), (44, 32, 101), (76, 29, 109), (70, 65, 96), + (64, 101, 84), (71, 99, 64), (78, 98, 45), (48, 151, 59), + (26, 119, 39), (14, 126, 14), (29, 113, 11), (45, 100, 9), + (58, 96, 9), (71, 93, 10), (100, 57, 50), (134, 68, 54), + (160, 73, 46), (153, 56, 36), (147, 39, 27), (128, 32, 21), + (110, 26, 15), (122, 44, 25), (134, 63, 35), (139, 54, 77), + (129, 89, 98), (119, 180, 123), (140, 190, 128), (162, 201, 134), + (173, 198, 130), (184, 195, 126), (183, 194, 98), (146, 184, 73), + (109, 127, 85), (75, 127, 82), (41, 127, 80), (24, 121, 90), + (8, 116, 101), (16, 145, 127), (21, 150, 145), (27, 124, 175), + (67, 60, 137), (79, 14, 144), (103, 27, 144), (127, 40, 144), + (144, 30, 136), (161, 21, 128), (171, 28, 133), (222, 68, 138), + (222, 92, 156), (164, 107, 97), (107, 122, 39), (69, 126, 35), + (32, 130, 31), (19, 118, 38), (12, 126, 77), (19, 147, 99), + (29, 158, 154), (61, 208, 215), (66, 200, 196), (72, 193, 178), + (61, 161, 151), (36, 181, 80), (38, 169, 55), (72, 151, 8), + (64, 106, 6), (70, 81, 14), (77, 57, 22), (64, 52, 16), + (51, 47, 10), (37, 52, 9), (2, 108, 20), (2, 129, 40), + (1, 159, 66), (30, 107, 73), (39, 98, 83), (48, 89, 93), + (77, 56, 121), (85, 35, 120), (103, 30, 122), (112, 42, 112), + (130, 50, 101), (103, 52, 82), (76, 55, 64), (78, 60, 78), + (80, 66, 92), (87, 38, 119), (92, 58, 153), (143, 64, 171), + (185, 58, 145), (204, 102, 165), (199, 111, 169), (194, 121, 174), + (178, 88, 176), (139, 52, 156), (91, 26, 92), (30, 9, 52), + (8, 27, 5), (7, 22, 13), (7, 18, 22), (28, 24, 39), + (72, 44, 41), (93, 41, 30), (116, 22, 36), (110, 7, 36), + (115, 13, 52), (161, 33, 81), (160, 29, 89), (160, 26, 97), + (158, 32, 96), (167, 67, 119), (176, 94, 166), (144, 106, 189), + (116, 169, 149), (101, 165, 136), (87, 161, 124), (61, 117, 104), + (35, 74, 107), (20, 16, 101), (39, 6, 110), (74, 17, 124), + (61, 49, 123), (70, 93, 137), (75, 111, 143), (89, 156, 182), + (104, 180, 180), (77, 176, 171), (78, 158, 169), (62, 157, 151), + (17, 108, 93), (32, 102, 88), (48, 96, 84), (46, 94, 98), + (78, 100, 123), (97, 157, 158), (121, 188, 170), (188, 204, 193), + (145, 160, 179), (111, 96, 137), (121, 50, 108), (114, 30, 82), + (119, 10, 91), (96, 9, 78), (87, 3, 78), (74, 37, 55), + (55, 33, 46), (54, 40, 57), (26, 56, 66), (46, 7, 100), + (77, 25, 100), (78, 8, 97), (81, 4, 100), (95, 11, 109), + (83, 30, 102), (72, 51, 108), (85, 70, 99), (93, 113, 88), + (108, 184, 138), (64, 206, 156), (65, 216, 227), (80, 202, 205), + (124, 196, 195), (160, 165, 197), (166, 155, 198), (154, 125, 209), + (160, 78, 189), (177, 52, 190), (155, 38, 152), (151, 59, 110), + (118, 96, 59), (108, 75, 70), (67, 69, 55), (78, 39, 44), + (81, 34, 42), (68, 25, 44), (96, 6, 32), (102, 19, 37), + (105, 46, 38), (106, 59, 31), (107, 85, 44), (111, 107, 43), + (121, 122, 54), (110, 89, 68), (92, 79, 109), (33, 60, 113), + (5, 54, 130), (4, 30, 117), (52, 46, 110), (88, 78, 165), + (115, 87, 171), (115, 161, 184), (134, 145, 209), (116, 121, 221), + (95, 95, 217), (116, 97, 204), (167, 131, 169), (179, 131, 111), + (204, 192, 82), (197, 158, 81), (177, 120, 67), (97, 93, 20) + ), + +// 326 3m0009.jpg +((82, 69, 25), (111, 9, 33), (88, 15, 53), (65, 21, 74), + (53, 39, 81), (42, 57, 88), (38, 67, 109), (35, 78, 131), + (111, 196, 163), (125, 204, 162), (139, 213, 162), (148, 205, 162), + (158, 198, 163), (117, 165, 137), (77, 132, 111), (60, 119, 113), + (43, 106, 115), (5, 76, 166), (4, 80, 149), (4, 85, 132), + (33, 78, 118), (62, 71, 104), (76, 59, 89), (90, 47, 75), + (124, 20, 31), (102, 12, 29), (80, 5, 28), (53, 3, 16), + (27, 2, 5), (19, 4, 4), (11, 7, 4), (1, 5, 4), + (4, 16, 2), (10, 17, 9), (7, 22, 5), (4, 27, 1), + (7, 31, 3), (10, 35, 6), (9, 34, 8), (8, 33, 11), + (49, 41, 30), (72, 44, 18), (96, 47, 6), (106, 58, 21), + (116, 70, 37), (125, 69, 44), (135, 68, 52), (144, 122, 72), + (163, 218, 101), (148, 221, 142), (127, 178, 119), (107, 135, 97), + (83, 132, 78), (60, 130, 60), (57, 126, 68), (55, 123, 76), + (9, 128, 136), (7, 153, 172), (6, 179, 209), (11, 179, 210), + (17, 180, 211), (18, 177, 210), (20, 174, 210), (22, 156, 191), + (15, 114, 146), (3, 54, 146), (6, 47, 129), (10, 40, 112), + (7, 37, 91), (4, 34, 70), (22, 38, 25), (24, 52, 29), + (13, 132, 50), (38, 156, 104), (64, 180, 159), (40, 176, 155), + (16, 173, 152), (12, 152, 139), (9, 132, 127), (24, 110, 75), + (26, 109, 41), (40, 87, 15), (26, 77, 12), (12, 67, 10), + (12, 55, 8), (12, 44, 7), (17, 27, 19), (31, 28, 49), + (72, 115, 85), (111, 145, 111), (151, 176, 137), (159, 175, 140), + (167, 174, 143), (186, 168, 166), (177, 199, 161), (178, 220, 144), + (150, 185, 117), (67, 114, 104), (39, 97, 100), (12, 81, 96), + (16, 55, 102), (20, 29, 108), (15, 23, 98), (20, 25, 93), + (19, 27, 64), (36, 42, 62), (53, 58, 61), (52, 56, 56), + (52, 54, 51), (38, 28, 39), (65, 39, 42), (89, 36, 44), + (146, 30, 31), (190, 38, 15), (187, 36, 10), (185, 34, 5), + (150, 41, 8), (107, 13, 5), (56, 24, 1), (48, 19, 5), + (53, 7, 35), (39, 39, 48), (25, 71, 61), (40, 103, 62), + (56, 136, 63), (60, 159, 102), (38, 156, 130), (34, 143, 146), + (30, 129, 160), (8, 137, 143), (7, 130, 140), (7, 123, 138), + (4, 94, 120), (5, 104, 99), (30, 73, 79), (16, 69, 59), + (6, 45, 18), (13, 31, 15), (20, 17, 12), (22, 23, 9), + (24, 29, 7), (18, 31, 1), (8, 47, 0), (9, 36, 1), + (25, 29, 6), (46, 26, 0), (45, 24, 1), (44, 23, 2), + (23, 20, 13), (22, 27, 23), (33, 28, 32), (48, 15, 36), + (24, 2, 25), (30, 10, 19), (37, 18, 14), (50, 3, 9), + (58, 2, 3), (64, 14, 3), (65, 4, 12), (120, 6, 6), + (131, 24, 14), (84, 29, 24), (70, 23, 34), (56, 17, 44), + (46, 7, 60), (31, 11, 46), (15, 17, 40), (19, 23, 24), + (31, 1, 27), (40, 0, 29), (49, 0, 32), (44, 17, 34), + (54, 13, 29), (59, 15, 28), (71, 18, 48), (108, 16, 39), + (143, 33, 42), (141, 22, 18), (149, 30, 8), (136, 25, 16), + (106, 17, 11), (61, 24, 6), (56, 25, 5), (73, 31, 17), + (42, 40, 28), (37, 59, 23), (33, 78, 19), (28, 100, 60), + (78, 122, 86), (94, 119, 87), (117, 110, 56), (137, 58, 27), + (163, 29, 4), (185, 22, 23), (158, 15, 43), (135, 13, 50), + (91, 21, 83), (110, 53, 122), (156, 99, 140), (111, 103, 127), + (52, 82, 120), (32, 74, 114), (16, 28, 128), (20, 12, 131), + (14, 19, 123), (30, 16, 93), (16, 15, 47), (17, 19, 18), + (15, 26, 18), (12, 36, 14), (24, 39, 10), (38, 35, 16), + (79, 48, 27), (77, 108, 28), (109, 142, 11), (162, 103, 9), + (176, 80, 19), (139, 94, 97), (156, 125, 156), (172, 171, 187), + (145, 195, 184), (146, 187, 179), (135, 162, 145), (97, 149, 160), + (70, 134, 118), (26, 114, 118), (17, 107, 131), (34, 105, 135), + (25, 130, 136), (12, 132, 157), (7, 147, 206), (15, 155, 208), + (25, 148, 189), (13, 114, 144), (2, 91, 125), (14, 38, 100), + (7, 31, 77), (13, 22, 39), (21, 14, 48), (12, 9, 56), + (10, 6, 65), (1, 20, 99), (7, 11, 134), (16, 9, 139), + (5, 15, 112), (0, 7, 61), (5, 16, 48), (0, 8, 29), + (2, 9, 27), (9, 4, 34), (6, 18, 76), (4, 15, 81), + (15, 30, 87), (29, 16, 69), (39, 10, 2), (33, 13, 50) + ), + +// 327 3m0010.jpg +((244, 135, 96), (221, 130, 112), (231, 142, 128), (242, 155, 145), + (222, 157, 143), (202, 159, 142), (183, 162, 123), (164, 165, 105), + (54, 110, 39), (54, 85, 32), (55, 61, 25), (72, 63, 21), + (89, 65, 17), (77, 52, 13), (66, 39, 10), (55, 39, 16), + (45, 39, 23), (4, 82, 22), (12, 92, 34), (21, 102, 46), + (43, 100, 29), (65, 99, 13), (77, 101, 18), (90, 103, 23), + (104, 104, 14), (117, 89, 25), (130, 75, 36), (145, 94, 34), + (161, 114, 32), (162, 120, 34), (164, 127, 36), (188, 150, 67), + (217, 150, 63), (229, 189, 120), (203, 166, 118), (178, 144, 116), + (126, 113, 120), (74, 83, 124), (70, 56, 115), (66, 29, 107), + (49, 28, 87), (50, 55, 93), (51, 82, 100), (43, 83, 93), + (35, 85, 86), (33, 64, 71), (32, 44, 56), (34, 35, 55), + (31, 40, 35), (111, 103, 20), (140, 137, 45), (169, 171, 70), + (184, 190, 83), (200, 210, 97), (224, 194, 103), (248, 179, 110), + (191, 144, 152), (177, 164, 120), (164, 184, 89), (163, 195, 77), + (162, 207, 65), (154, 188, 64), (146, 169, 63), (170, 147, 41), + (172, 132, 63), (165, 131, 60), (144, 94, 52), (123, 57, 45), + (116, 51, 58), (109, 45, 71), (113, 29, 42), (117, 42, 37), + (127, 30, 47), (110, 28, 51), (93, 27, 55), (69, 27, 35), + (45, 27, 15), (44, 20, 9), (44, 14, 4), (27, 8, 4), + (22, 23, 5), (5, 15, 77), (16, 13, 82), (28, 12, 87), + (28, 11, 90), (29, 11, 93), (43, 2, 81), (62, 19, 73), + (106, 48, 60), (133, 41, 35), (160, 34, 11), (154, 41, 6), + (149, 48, 2), (146, 58, 18), (115, 72, 21), (101, 92, 15), + (101, 94, 16), (47, 82, 26), (24, 96, 71), (1, 110, 117), + (10, 94, 103), (19, 79, 89), (19, 28, 87), (29, 14, 83), + (75, 64, 81), (98, 99, 67), (121, 134, 54), (129, 116, 44), + (138, 99, 34), (131, 76, 19), (130, 66, 28), (126, 73, 19), + (119, 58, 4), (113, 60, 26), (109, 55, 26), (106, 50, 27), + (97, 50, 34), (100, 55, 16), (98, 40, 18), (115, 40, 17), + (141, 25, 10), (131, 32, 9), (122, 39, 9), (113, 53, 4), + (104, 67, 0), (112, 96, 9), (107, 119, 9), (139, 146, 17), + (142, 127, 24), (177, 160, 28), (179, 170, 49), (182, 180, 71), + (212, 205, 62), (225, 207, 99), (223, 223, 135), (195, 219, 123), + (186, 245, 75), (141, 226, 60), (96, 208, 46), (93, 198, 36), + (91, 189, 26), (67, 149, 127), (51, 150, 129), (18, 100, 158), + (37, 119, 169), (67, 168, 154), (82, 165, 169), (97, 162, 184), + (97, 105, 142), (164, 77, 96), (148, 43, 58), (139, 34, 38), + (149, 26, 54), (170, 39, 81), (191, 52, 109), (187, 80, 108), + (157, 100, 71), (145, 96, 79), (143, 96, 80), (108, 71, 89), + (81, 36, 77), (58, 32, 61), (51, 32, 54), (44, 33, 47), + (42, 24, 50), (36, 18, 42), (42, 19, 37), (46, 26, 37), + (87, 18, 37), (91, 12, 31), (96, 7, 25), (91, 2, 20), + (98, 14, 12), (83, 4, 0), (76, 12, 2), (78, 15, 8), + (75, 27, 5), (95, 28, 9), (110, 30, 23), (119, 32, 22), + (125, 43, 22), (125, 53, 31), (134, 66, 29), (149, 75, 12), + (110, 91, 15), (97, 83, 15), (85, 75, 16), (97, 54, 38), + (103, 32, 36), (119, 26, 21), (135, 19, 22), (152, 5, 47), + (155, 2, 46), (129, 4, 22), (102, 20, 9), (59, 38, 11), + (35, 29, 15), (18, 41, 13), (0, 53, 7), (22, 28, 18), + (17, 10, 44), (2, 15, 50), (6, 4, 53), (45, 4, 62), + (86, 1, 58), (115, 13, 60), (113, 4, 46), (89, 5, 28), + (82, 6, 18), (61, 4, 11), (35, 5, 29), (41, 2, 47), + (43, 13, 67), (54, 23, 83), (87, 18, 101), (97, 32, 100), + (142, 83, 77), (158, 117, 71), (167, 140, 97), (185, 124, 95), + (169, 96, 113), (180, 65, 156), (113, 90, 181), (99, 199, 225), + (108, 212, 221), (86, 196, 147), (61, 149, 125), (28, 140, 115), + (30, 83, 101), (11, 21, 72), (26, 21, 88), (6, 30, 126), + (35, 72, 127), (15, 109, 119), (18, 124, 112), (15, 118, 62), + (55, 72, 54), (58, 51, 32), (84, 32, 36), (83, 27, 10), + (86, 32, 4), (96, 42, 8), (93, 71, 14), (96, 109, 27), + (129, 169, 73), (107, 137, 77), (60, 96, 130), (49, 69, 128), + (60, 60, 88), (62, 56, 66), (95, 44, 41), (104, 52, 64), + (111, 53, 78), (142, 60, 72), (161, 27, 122), (132, 46, 107) + ), + +// 328 3m0011.jpg +((31, 61, 35), (8, 36, 40), (8, 47, 43), (9, 59, 47), + (11, 48, 55), (14, 38, 64), (13, 30, 57), (12, 23, 51), + (31, 15, 28), (26, 14, 46), (21, 13, 64), (27, 8, 129), + (33, 3, 195), (46, 8, 179), (59, 13, 164), (50, 11, 135), + (42, 10, 107), (50, 2, 44), (57, 13, 57), (64, 25, 70), + (109, 36, 85), (154, 47, 101), (184, 59, 101), (215, 72, 102), + (196, 147, 176), (164, 152, 168), (133, 157, 161), (145, 182, 147), + (157, 207, 134), (151, 192, 143), (145, 177, 153), (145, 145, 171), + (109, 182, 165), (78, 156, 222), (66, 184, 219), (55, 213, 216), + (62, 217, 223), (69, 222, 230), (87, 213, 237), (106, 205, 244), + (153, 156, 227), (127, 136, 222), (102, 117, 218), (95, 102, 186), + (88, 87, 155), (90, 83, 151), (92, 79, 148), (98, 36, 147), + (95, 33, 132), (104, 42, 125), (81, 47, 117), (58, 53, 109), + (43, 73, 110), (29, 94, 112), (30, 91, 108), (31, 88, 105), + (58, 124, 76), (29, 104, 77), (0, 84, 78), (16, 88, 101), + (32, 93, 124), (61, 89, 134), (91, 85, 145), (129, 120, 173), + (152, 117, 171), (94, 75, 157), (82, 54, 126), (70, 34, 95), + (68, 51, 89), (67, 69, 84), (49, 91, 103), (53, 128, 131), + (71, 121, 220), (71, 111, 174), (72, 102, 128), (57, 68, 106), + (43, 35, 84), (54, 31, 83), (66, 27, 82), (101, 40, 110), + (87, 32, 123), (80, 24, 151), (55, 41, 182), (30, 59, 213), + (34, 67, 204), (39, 75, 195), (66, 97, 164), (69, 122, 156), + (68, 152, 137), (67, 133, 103), (66, 115, 70), (48, 96, 53), + (30, 78, 36), (8, 43, 11), (0, 38, 1), (2, 14, 10), + (5, 27, 15), (47, 31, 6), (58, 73, 33), (69, 116, 61), + (57, 150, 80), (45, 185, 99), (141, 208, 141), (131, 212, 75), + (245, 234, 30), (212, 165, 35), (179, 97, 41), (207, 54, 53), + (235, 12, 66), (198, 56, 104), (143, 41, 78), (67, 24, 52), + (47, 27, 55), (19, 22, 27), (11, 17, 20), (3, 13, 14), + (4, 5, 7), (2, 0, 1), (1, 0, 0), (0, 13, 0), + (20, 34, 35), (41, 49, 49), (62, 64, 63), (77, 92, 79), + (93, 121, 96), (76, 129, 135), (83, 145, 184), (102, 155, 149), + (71, 126, 129), (16, 63, 31), (8, 40, 28), (0, 17, 25), + (0, 13, 17), (0, 5, 5), (0, 2, 1), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 3, 0), (0, 4, 4), (0, 3, 6), + (0, 0, 0), (0, 0, 9), (4, 3, 17), (8, 7, 25), + (27, 16, 50), (31, 33, 72), (28, 13, 98), (8, 24, 86), + (12, 1, 57), (13, 6, 54), (14, 12, 51), (31, 8, 26), + (68, 0, 29), (101, 43, 58), (120, 118, 70), (118, 166, 150), + (140, 221, 152), (112, 208, 220), (95, 173, 224), (79, 138, 228), + (86, 133, 213), (99, 114, 209), (97, 122, 204), (84, 153, 194), + (147, 222, 201), (159, 226, 198), (171, 231, 195), (188, 140, 242), + (189, 106, 198), (216, 97, 241), (240, 66, 223), (217, 22, 220), + (183, 65, 149), (139, 56, 138), (128, 25, 108), (82, 38, 87), + (86, 29, 84), (112, 18, 71), (149, 14, 116), (142, 39, 108), + (97, 32, 184), (100, 34, 194), (103, 37, 205), (168, 38, 174), + (152, 54, 141), (193, 67, 105), (167, 91, 59), (105, 117, 31), + (66, 64, 25), (54, 58, 21), (73, 37, 11), (84, 15, 20), + (61, 3, 25), (47, 28, 13), (34, 73, 18), (53, 111, 53), + (63, 123, 97), (56, 135, 130), (65, 117, 154), (60, 87, 174), + (27, 52, 179), (37, 52, 145), (20, 22, 107), (27, 16, 50), + (18, 10, 21), (2, 3, 7), (1, 0, 5), (8, 0, 3), + (13, 7, 9), (37, 0, 14), (39, 23, 10), (43, 46, 27), + (34, 57, 41), (22, 62, 51), (31, 51, 49), (18, 39, 68), + (0, 39, 78), (12, 40, 105), (29, 14, 109), (61, 18, 110), + (107, 24, 158), (205, 34, 200), (162, 47, 252), (108, 25, 241), + (54, 51, 246), (104, 77, 252), (112, 79, 255), (107, 104, 217), + (88, 110, 255), (79, 103, 239), (74, 127, 219), (72, 141, 172), + (55, 114, 128), (22, 80, 92), (21, 79, 67), (25, 49, 36), + (24, 30, 28), (27, 24, 35), (33, 20, 50), (40, 30, 55), + (66, 23, 50), (125, 27, 66), (129, 31, 69), (66, 49, 85), + (56, 51, 83), (49, 28, 67), (49, 46, 41), (43, 60, 52), + (35, 48, 57), (30, 36, 68), (51, 21, 81), (58, 22, 83) + ), + +// 329 3m0012.jpg +((20, 34, 73), (36, 22, 48), (36, 34, 72), (36, 46, 97), + (59, 53, 131), (82, 61, 166), (62, 56, 186), (42, 51, 206), + (41, 23, 105), (50, 40, 84), (59, 58, 64), (86, 51, 35), + (113, 45, 6), (150, 117, 19), (188, 189, 33), (214, 222, 84), + (240, 255, 136), (253, 220, 139), (243, 182, 110), (233, 145, 82), + (159, 81, 58), (86, 17, 35), (69, 8, 37), (53, 0, 40), + (9, 0, 12), (4, 2, 14), (0, 5, 17), (0, 10, 21), + (0, 16, 25), (1, 19, 21), (2, 23, 18), (7, 6, 11), + (22, 27, 4), (24, 62, 47), (76, 88, 71), (128, 115, 96), + (139, 129, 144), (151, 143, 192), (144, 140, 196), (137, 137, 201), + (91, 12, 241), (78, 24, 176), (65, 37, 111), (57, 18, 79), + (50, 0, 48), (44, 3, 36), (38, 7, 25), (14, 5, 0), + (8, 0, 2), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 1), (0, 0, 2), (5, 0, 6), + (11, 0, 11), (17, 0, 16), (24, 0, 22), (56, 17, 48), + (95, 20, 50), (214, 72, 122), (234, 94, 105), (255, 116, 89), + (238, 107, 95), (221, 98, 101), (189, 42, 96), (144, 16, 93), + (77, 8, 73), (77, 9, 81), (78, 11, 90), (88, 14, 86), + (98, 17, 83), (96, 16, 91), (95, 16, 99), (109, 29, 102), + (145, 27, 87), (133, 51, 113), (161, 57, 139), (189, 64, 166), + (205, 65, 196), (222, 66, 227), (189, 116, 250), (174, 165, 218), + (239, 131, 146), (201, 108, 114), (164, 86, 82), (124, 51, 59), + (84, 16, 37), (51, 4, 12), (37, 18, 11), (20, 0, 0), + (35, 0, 15), (57, 4, 46), (68, 2, 56), (79, 0, 66), + (66, 2, 71), (54, 4, 77), (64, 40, 92), (59, 72, 127), + (74, 180, 230), (115, 170, 230), (156, 160, 231), (159, 163, 224), + (163, 166, 217), (174, 124, 127), (164, 59, 162), (168, 47, 153), + (179, 30, 158), (135, 7, 128), (130, 19, 138), (125, 32, 149), + (111, 42, 159), (122, 87, 181), (125, 90, 144), (95, 36, 94), + (48, 9, 56), (38, 20, 45), (28, 32, 35), (32, 33, 36), + (36, 34, 37), (44, 53, 60), (80, 46, 71), (146, 81, 63), + (189, 129, 57), (175, 201, 42), (159, 202, 36), (144, 204, 31), + (117, 162, 103), (79, 143, 106), (83, 113, 167), (42, 110, 149), + (20, 23, 120), (21, 16, 94), (23, 9, 68), (21, 6, 49), + (20, 4, 31), (14, 2, 14), (7, 0, 0), (1, 0, 0), + (0, 0, 0), (0, 0, 2), (0, 0, 3), (0, 1, 4), + (1, 12, 14), (12, 27, 8), (19, 23, 9), (23, 20, 3), + (48, 55, 13), (63, 67, 7), (78, 79, 1), (82, 82, 22), + (114, 81, 10), (116, 99, 9), (94, 125, 22), (62, 105, 59), + (53, 82, 51), (64, 57, 73), (62, 75, 76), (60, 94, 80), + (87, 119, 104), (91, 162, 104), (86, 215, 71), (180, 202, 104), + (205, 249, 38), (198, 227, 34), (192, 205, 30), (202, 160, 78), + (228, 166, 129), (239, 205, 157), (252, 192, 228), (236, 190, 218), + (240, 172, 133), (255, 153, 70), (239, 84, 30), (192, 36, 57), + (102, 9, 54), (84, 46, 83), (64, 44, 93), (66, 56, 90), + (67, 54, 84), (99, 59, 83), (131, 64, 82), (138, 92, 120), + (105, 150, 171), (30, 189, 185), (23, 199, 248), (2, 146, 232), + (40, 78, 161), (96, 43, 149), (115, 38, 150), (146, 30, 157), + (147, 6, 144), (159, 1, 120), (169, 48, 119), (178, 58, 147), + (233, 42, 155), (219, 24, 162), (223, 13, 148), (215, 15, 163), + (205, 6, 157), (171, 5, 147), (93, 41, 126), (64, 75, 105), + (22, 57, 121), (23, 97, 96), (48, 66, 66), (29, 36, 46), + (15, 39, 85), (23, 28, 94), (60, 0, 81), (112, 24, 108), + (146, 34, 170), (173, 38, 254), (210, 2, 244), (227, 32, 250), + (242, 2, 211), (219, 13, 95), (203, 36, 79), (132, 23, 64), + (87, 20, 71), (76, 7, 62), (63, 4, 68), (51, 2, 67), + (42, 0, 46), (31, 4, 37), (15, 20, 24), (4, 21, 31), + (11, 16, 54), (27, 3, 87), (29, 20, 83), (47, 20, 87), + (84, 28, 91), (98, 34, 131), (129, 51, 197), (148, 59, 185), + (152, 68, 179), (164, 39, 193), (148, 21, 226), (203, 72, 238), + (162, 157, 224), (88, 198, 171), (90, 190, 164), (72, 226, 116), + (118, 157, 32), (130, 122, 21), (97, 105, 6), (59, 61, 0), + (56, 44, 28), (99, 20, 49), (178, 40, 76), (201, 76, 80) + ), + +// 330 3m0013.jpg +((10, 81, 49), (57, 81, 93), (41, 119, 130), (25, 158, 167), + (21, 189, 175), (17, 221, 184), (42, 214, 175), (68, 207, 166), + (91, 142, 161), (92, 136, 158), (93, 130, 156), (93, 122, 135), + (94, 114, 115), (90, 105, 101), (86, 96, 88), (82, 74, 73), + (78, 53, 59), (177, 61, 12), (158, 48, 13), (140, 35, 14), + (108, 26, 8), (76, 17, 3), (60, 15, 6), (45, 14, 9), + (5, 28, 36), (10, 59, 50), (16, 90, 65), (13, 111, 93), + (10, 132, 121), (24, 130, 127), (39, 128, 134), (33, 126, 118), + (16, 104, 82), (0, 69, 71), (16, 57, 86), (33, 46, 101), + (40, 60, 116), (48, 74, 131), (36, 85, 102), (24, 96, 74), + (7, 105, 66), (11, 100, 53), (15, 96, 40), (11, 61, 21), + (8, 26, 2), (4, 21, 1), (0, 16, 0), (14, 12, 0), + (25, 29, 14), (44, 79, 13), (48, 131, 19), (53, 184, 26), + (40, 149, 30), (27, 114, 35), (24, 87, 37), (21, 60, 39), + (21, 49, 34), (30, 48, 42), (40, 48, 51), (55, 59, 68), + (71, 70, 86), (79, 78, 93), (88, 86, 100), (79, 68, 74), + (71, 69, 30), (70, 31, 16), (95, 43, 15), (120, 55, 15), + (129, 69, 10), (139, 83, 6), (144, 104, 16), (186, 85, 31), + (143, 29, 19), (88, 25, 21), (34, 22, 24), (22, 15, 14), + (10, 9, 4), (11, 8, 2), (13, 7, 0), (16, 11, 0), + (21, 6, 1), (24, 15, 20), (28, 22, 21), (33, 30, 23), + (40, 44, 23), (47, 58, 24), (65, 75, 22), (109, 89, 38), + (130, 124, 10), (108, 133, 8), (86, 142, 7), (76, 143, 5), + (67, 144, 4), (72, 87, 2), (37, 64, 11), (39, 35, 0), + (49, 15, 5), (27, 13, 4), (23, 23, 2), (20, 34, 0), + (17, 33, 0), (15, 32, 0), (11, 54, 0), (16, 54, 5), + (38, 50, 10), (83, 70, 17), (129, 90, 25), (152, 117, 29), + (176, 144, 33), (190, 208, 10), (172, 205, 14), (126, 227, 35), + (77, 168, 28), (68, 109, 43), (50, 98, 25), (33, 88, 7), + (21, 127, 5), (19, 163, 3), (20, 155, 3), (11, 114, 7), + (16, 65, 10), (24, 59, 10), (33, 54, 11), (43, 50, 12), + (53, 47, 13), (88, 72, 12), (109, 122, 52), (126, 141, 36), + (121, 130, 47), (111, 85, 98), (98, 67, 108), (86, 49, 118), + (93, 59, 145), (79, 52, 145), (42, 50, 99), (19, 49, 75), + (14, 51, 44), (21, 59, 37), (29, 67, 30), (33, 62, 30), + (37, 57, 30), (32, 56, 40), (26, 58, 43), (3, 63, 53), + (18, 84, 57), (61, 123, 48), (94, 174, 43), (127, 226, 39), + (176, 200, 24), (197, 204, 13), (202, 167, 13), (189, 144, 29), + (195, 78, 35), (184, 51, 44), (173, 24, 53), (163, 9, 61), + (158, 27, 41), (129, 21, 37), (77, 49, 9), (58, 23, 29), + (63, 10, 54), (55, 27, 75), (53, 26, 67), (51, 25, 60), + (50, 11, 30), (69, 14, 11), (76, 6, 8), (77, 15, 0), + (79, 44, 14), (71, 60, 19), (63, 77, 24), (38, 78, 25), + (17, 102, 63), (14, 129, 62), (9, 189, 22), (44, 204, 36), + (46, 163, 30), (11, 122, 54), (24, 86, 47), (43, 58, 63), + (43, 45, 57), (51, 28, 74), (50, 35, 92), (69, 31, 82), + (59, 8, 67), (49, 5, 52), (40, 3, 37), (53, 8, 28), + (49, 14, 20), (56, 29, 36), (38, 25, 42), (38, 10, 58), + (32, 16, 79), (22, 44, 65), (26, 46, 47), (4, 22, 26), + (10, 20, 29), (33, 17, 28), (38, 7, 15), (50, 1, 7), + (53, 2, 0), (68, 15, 7), (62, 12, 13), (50, 16, 14), + (35, 41, 39), (43, 47, 30), (49, 47, 22), (44, 53, 24), + (35, 52, 42), (81, 43, 84), (111, 5, 80), (144, 17, 36), + (172, 77, 33), (181, 123, 0), (136, 195, 17), (124, 188, 32), + (103, 110, 103), (100, 92, 152), (85, 93, 165), (80, 123, 166), + (59, 118, 196), (47, 98, 151), (41, 125, 127), (29, 127, 86), + (19, 119, 57), (21, 125, 76), (39, 117, 101), (53, 123, 113), + (36, 145, 104), (42, 133, 89), (17, 108, 67), (15, 90, 67), + (13, 75, 70), (29, 60, 81), (37, 58, 75), (36, 64, 76), + (22, 85, 68), (9, 104, 72), (9, 99, 87), (0, 108, 108), + (5, 123, 101), (0, 165, 143), (1, 172, 156), (5, 181, 161), + (18, 197, 168), (29, 143, 179), (66, 179, 195), (60, 199, 160), + (56, 191, 151), (41, 171, 127), (85, 119, 103), (148, 121, 44), + (158, 117, 12), (144, 139, 45), (46, 121, 18), (108, 150, 22) + ), + +// 331 3m0014.jpg +((181, 71, 12), (111, 62, 58), (113, 78, 41), (115, 95, 24), + (157, 88, 22), (200, 82, 20), (209, 74, 22), (218, 67, 24), + (208, 66, 44), (162, 57, 53), (117, 49, 62), (80, 28, 55), + (44, 7, 48), (31, 6, 43), (19, 5, 38), (14, 7, 22), + (9, 9, 7), (22, 6, 7), (35, 7, 10), (48, 9, 14), + (26, 14, 17), (4, 20, 20), (5, 22, 23), (7, 25, 27), + (32, 19, 26), (33, 26, 50), (34, 33, 75), (37, 60, 94), + (41, 88, 114), (38, 93, 114), (35, 98, 115), (22, 99, 117), + (20, 116, 128), (38, 123, 130), (45, 116, 112), (52, 110, 95), + (39, 101, 100), (27, 93, 105), (16, 77, 97), (5, 62, 89), + (23, 95, 109), (33, 127, 104), (44, 159, 100), (57, 186, 104), + (70, 213, 108), (71, 205, 102), (72, 197, 97), (111, 177, 87), + (136, 154, 78), (127, 101, 52), (109, 85, 60), (91, 70, 69), + (88, 58, 63), (85, 47, 58), (89, 49, 59), (94, 51, 61), + (192, 70, 47), (187, 78, 58), (182, 87, 69), (141, 76, 70), + (100, 65, 72), (90, 54, 66), (81, 44, 61), (71, 26, 47), + (89, 18, 24), (91, 13, 11), (79, 22, 16), (68, 31, 22), + (58, 33, 20), (49, 36, 19), (55, 57, 43), (47, 36, 40), + (21, 38, 19), (22, 51, 21), (24, 65, 23), (48, 49, 35), + (72, 34, 47), (84, 38, 39), (96, 42, 32), (148, 10, 25), + (153, 3, 15), (95, 23, 24), (91, 40, 35), (87, 57, 46), + (102, 57, 52), (118, 58, 58), (139, 60, 55), (151, 44, 28), + (184, 24, 26), (173, 35, 27), (163, 46, 28), (156, 79, 35), + (150, 113, 42), (137, 133, 42), (84, 138, 42), (40, 112, 46), + (2, 93, 13), (128, 62, 2), (163, 34, 3), (199, 7, 4), + (200, 3, 2), (202, 0, 0), (164, 20, 9), (109, 20, 4), + (30, 7, 1), (42, 6, 11), (54, 6, 22), (61, 5, 20), + (68, 4, 18), (59, 13, 16), (54, 11, 20), (64, 24, 24), + (53, 27, 26), (33, 29, 4), (20, 27, 5), (7, 26, 7), + (22, 40, 14), (13, 43, 19), (4, 59, 1), (1, 83, 11), + (35, 52, 68), (39, 65, 62), (43, 78, 56), (48, 68, 61), + (54, 58, 67), (54, 50, 73), (40, 39, 70), (28, 37, 46), + (47, 15, 38), (76, 20, 29), (85, 13, 41), (94, 6, 54), + (120, 16, 27), (130, 6, 8), (172, 5, 13), (172, 20, 9), + (183, 24, 5), (167, 31, 17), (151, 38, 30), (145, 34, 27), + (139, 30, 25), (86, 63, 31), (58, 89, 48), (55, 96, 56), + (50, 85, 65), (84, 137, 59), (82, 143, 57), (80, 149, 56), + (103, 133, 43), (111, 95, 69), (89, 99, 26), (84, 94, 21), + (68, 53, 30), (74, 59, 29), (81, 65, 29), (91, 65, 50), + (127, 91, 41), (160, 91, 24), (185, 79, 17), (191, 75, 18), + (180, 52, 3), (187, 55, 34), (195, 58, 37), (204, 62, 40), + (194, 25, 18), (203, 15, 6), (212, 53, 14), (210, 83, 38), + (236, 145, 62), (202, 147, 76), (168, 149, 90), (130, 159, 131), + (106, 138, 89), (98, 108, 109), (97, 96, 94), (124, 102, 78), + (146, 133, 78), (145, 153, 80), (150, 161, 83), (122, 185, 71), + (100, 200, 86), (50, 165, 87), (19, 185, 85), (15, 155, 68), + (43, 138, 44), (39, 138, 62), (35, 139, 80), (76, 170, 84), + (114, 176, 75), (145, 183, 74), (180, 186, 114), (179, 202, 150), + (141, 201, 173), (150, 230, 131), (137, 179, 93), (126, 157, 64), + (122, 135, 47), (80, 101, 84), (74, 101, 86), (57, 63, 99), + (64, 50, 75), (60, 39, 58), (91, 25, 61), (98, 12, 57), + (105, 35, 59), (123, 48, 27), (127, 60, 43), (85, 68, 74), + (76, 80, 91), (69, 94, 91), (94, 73, 54), (133, 94, 37), + (172, 76, 16), (209, 83, 25), (205, 114, 44), (229, 148, 59), + (190, 148, 76), (188, 149, 94), (194, 162, 85), (205, 178, 99), + (214, 179, 97), (214, 193, 84), (219, 214, 94), (240, 218, 107), + (216, 208, 99), (197, 184, 105), (183, 186, 97), (173, 196, 80), + (167, 189, 78), (154, 154, 66), (122, 144, 46), (85, 150, 60), + (62, 176, 89), (42, 173, 107), (13, 133, 106), (7, 135, 48), + (10, 109, 18), (46, 111, 17), (123, 134, 30), (160, 152, 67), + (175, 175, 89), (204, 229, 99), (202, 233, 95), (165, 213, 103), + (155, 205, 74), (147, 164, 62), (109, 141, 68), (54, 131, 95), + (61, 143, 105), (79, 134, 129), (57, 176, 118), (89, 166, 130), + (147, 197, 124), (191, 190, 110), (188, 173, 166), (184, 169, 126) + ), + +// 332 3m0015.jpg +((95, 98, 19), (96, 92, 63), (100, 100, 73), (105, 109, 84), + (86, 130, 86), (67, 151, 89), (73, 131, 95), (79, 112, 101), + (85, 68, 60), (108, 69, 56), (132, 71, 53), (166, 103, 68), + (201, 135, 83), (201, 124, 87), (202, 114, 92), (195, 122, 109), + (189, 130, 126), (192, 91, 81), (161, 87, 70), (130, 84, 60), + (116, 82, 52), (103, 81, 44), (98, 92, 42), (94, 104, 41), + (98, 135, 83), (104, 144, 94), (110, 154, 105), (101, 129, 104), + (93, 105, 103), (96, 101, 100), (99, 97, 98), (113, 113, 77), + (111, 88, 46), (134, 88, 28), (136, 94, 50), (138, 101, 72), + (127, 125, 92), (116, 150, 113), (129, 153, 113), (142, 157, 114), + (203, 177, 120), (168, 139, 135), (133, 101, 150), (121, 82, 108), + (109, 63, 66), (106, 57, 55), (104, 51, 45), (115, 36, 41), + (114, 25, 47), (52, 14, 5), (47, 15, 15), (43, 16, 25), + (43, 12, 33), (43, 8, 41), (60, 12, 35), (77, 17, 29), + (117, 14, 57), (116, 24, 57), (116, 34, 57), (99, 63, 62), + (82, 92, 68), (75, 92, 81), (68, 92, 94), (63, 105, 85), + (43, 86, 69), (23, 79, 32), (26, 58, 28), (30, 38, 25), + (30, 29, 28), (30, 20, 31), (32, 5, 48), (26, 9, 53), + (18, 8, 32), (43, 26, 37), (68, 44, 42), (54, 49, 52), + (41, 54, 63), (35, 51, 58), (30, 49, 53), (15, 37, 51), + (18, 34, 49), (29, 38, 37), (32, 50, 51), (35, 63, 66), + (32, 67, 77), (30, 72, 88), (50, 84, 112), (38, 111, 102), + (69, 118, 114), (65, 104, 102), (61, 91, 91), (67, 82, 80), + (73, 74, 69), (73, 68, 62), (97, 72, 52), (93, 35, 47), + (99, 14, 55), (104, 39, 71), (111, 30, 68), (119, 22, 65), + (114, 20, 72), (109, 18, 79), (93, 16, 60), (72, 27, 56), + (107, 51, 138), (106, 31, 122), (105, 11, 107), (117, 15, 84), + (129, 20, 61), (130, 13, 29), (116, 23, 18), (128, 33, 1), + (108, 45, 30), (78, 12, 22), (69, 13, 25), (61, 15, 28), + (43, 30, 22), (26, 34, 10), (19, 45, 6), (0, 71, 14), + (14, 150, 128), (38, 145, 141), (63, 141, 154), (49, 153, 131), + (36, 165, 109), (5, 155, 68), (22, 124, 51), (52, 104, 38), + (76, 76, 50), (153, 95, 143), (162, 103, 154), (171, 111, 165), + (187, 147, 174), (203, 94, 185), (192, 44, 140), (144, 37, 109), + (198, 20, 78), (171, 17, 48), (145, 14, 19), (142, 25, 28), + (139, 36, 37), (144, 41, 24), (151, 53, 14), (115, 68, 24), + (83, 78, 22), (46, 115, 22), (31, 121, 30), (17, 127, 38), + (33, 139, 65), (44, 128, 94), (73, 156, 128), (19, 221, 173), + (117, 198, 215), (132, 187, 215), (148, 176, 215), (207, 159, 209), + (223, 147, 212), (252, 205, 175), (242, 173, 144), (201, 195, 135), + (191, 196, 138), (202, 156, 158), (194, 161, 146), (187, 167, 134), + (158, 115, 99), (136, 91, 86), (117, 80, 74), (91, 54, 48), + (38, 52, 17), (48, 59, 17), (58, 66, 17), (49, 79, 15), + (43, 83, 31), (50, 69, 63), (44, 82, 67), (63, 86, 76), + (49, 108, 50), (39, 99, 61), (11, 86, 82), (6, 83, 63), + (25, 112, 61), (28, 136, 51), (10, 172, 61), (15, 186, 46), + (65, 178, 88), (75, 171, 82), (85, 165, 76), (105, 147, 109), + (98, 128, 128), (86, 156, 166), (173, 141, 144), (189, 101, 89), + (208, 90, 62), (187, 39, 73), (135, 63, 51), (119, 52, 61), + (85, 58, 73), (65, 61, 75), (34, 69, 73), (47, 54, 72), + (85, 39, 86), (139, 66, 85), (152, 96, 79), (188, 108, 81), + (207, 99, 60), (180, 57, 23), (152, 36, 21), (137, 43, 5), + (96, 46, 9), (87, 58, 14), (80, 37, 47), (81, 31, 66), + (48, 18, 68), (38, 16, 65), (32, 12, 40), (23, 34, 18), + (33, 38, 8), (3, 48, 17), (4, 43, 24), (0, 38, 15), + (23, 24, 18), (1, 7, 5), (12, 12, 24), (7, 20, 29), + (1, 16, 35), (0, 24, 36), (7, 18, 50), (3, 19, 68), + (23, 42, 59), (47, 57, 66), (68, 52, 62), (83, 45, 58), + (85, 40, 37), (76, 26, 25), (42, 12, 14), (20, 17, 10), + (23, 32, 29), (23, 50, 57), (18, 70, 84), (24, 97, 90), + (20, 116, 102), (49, 102, 82), (51, 125, 74), (55, 109, 75), + (58, 100, 88), (56, 67, 73), (57, 55, 66), (78, 38, 38), + (69, 17, 19), (71, 13, 11), (70, 32, 11), (77, 29, 19), + (94, 50, 15), (129, 57, 17), (148, 71, 63), (152, 61, 42) + ), + +// 333 3m0016.jpg +((148, 85, 42), (51, 97, 50), (40, 66, 45), (30, 35, 41), + (17, 31, 29), (5, 28, 18), (6, 38, 10), (7, 49, 3), + (43, 97, 19), (40, 112, 20), (38, 127, 21), (36, 137, 15), + (34, 148, 9), (70, 145, 8), (106, 142, 8), (128, 136, 20), + (151, 131, 32), (183, 133, 44), (189, 153, 35), (195, 173, 27), + (198, 168, 36), (202, 163, 46), (200, 167, 71), (198, 172, 97), + (189, 155, 83), (201, 123, 50), (213, 91, 18), (176, 59, 21), + (139, 27, 25), (134, 20, 16), (129, 14, 7), (129, 17, 33), + (148, 29, 87), (195, 51, 74), (194, 66, 75), (194, 81, 77), + (202, 68, 72), (211, 55, 68), (211, 53, 52), (211, 51, 37), + (216, 87, 66), (228, 73, 51), (240, 60, 37), (227, 36, 22), + (215, 12, 8), (203, 20, 26), (191, 29, 44), (126, 29, 20), + (84, 37, 7), (53, 1, 5), (43, 14, 19), (34, 27, 34), + (17, 41, 51), (0, 55, 69), (1, 73, 87), (2, 91, 105), + (9, 95, 156), (6, 65, 179), (3, 36, 203), (70, 31, 193), + (137, 27, 184), (143, 26, 184), (150, 26, 184), (179, 33, 160), + (192, 35, 164), (206, 13, 154), (199, 24, 155), (193, 35, 156), + (193, 34, 154), (193, 34, 153), (193, 44, 134), (141, 57, 109), + (73, 28, 61), (66, 35, 57), (60, 43, 53), (64, 63, 76), + (68, 84, 99), (81, 89, 108), (94, 94, 118), (82, 129, 147), + (72, 167, 133), (55, 156, 152), (59, 134, 170), (63, 112, 189), + (57, 88, 187), (52, 64, 186), (42, 42, 138), (59, 50, 103), + (69, 43, 42), (69, 37, 30), (70, 32, 19), (83, 34, 20), + (96, 37, 21), (130, 57, 16), (149, 75, 64), (171, 74, 81), + (168, 60, 109), (118, 28, 89), (102, 25, 80), (86, 22, 72), + (71, 20, 71), (57, 18, 71), (36, 57, 78), (20, 85, 51), + (3, 97, 61), (27, 101, 76), (52, 106, 92), (61, 109, 114), + (70, 112, 137), (89, 104, 173), (72, 90, 166), (84, 36, 122), + (70, 21, 66), (117, 10, 80), (134, 13, 95), (151, 16, 111), + (191, 25, 151), (185, 31, 165), (160, 51, 176), (102, 46, 155), + (63, 33, 155), (39, 23, 150), (16, 13, 146), (29, 20, 127), + (43, 28, 109), (42, 23, 87), (60, 28, 67), (17, 57, 59), + (21, 85, 50), (41, 84, 75), (58, 89, 68), (75, 94, 62), + (109, 119, 23), (135, 116, 58), (171, 127, 102), (174, 116, 140), + (197, 75, 98), (203, 94, 75), (209, 113, 52), (197, 119, 47), + (186, 125, 42), (146, 121, 28), (123, 99, 35), (128, 85, 16), + (112, 63, 49), (125, 22, 105), (114, 17, 103), (103, 13, 101), + (73, 0, 141), (13, 18, 196), (19, 64, 207), (43, 118, 173), + (27, 73, 123), (33, 68, 118), (40, 63, 113), (45, 122, 148), + (58, 138, 149), (15, 133, 163), (36, 154, 132), (35, 149, 123), + (22, 151, 51), (16, 125, 44), (25, 114, 29), (34, 104, 15), + (40, 81, 37), (43, 83, 74), (56, 82, 105), (79, 94, 149), + (59, 87, 111), (56, 84, 94), (53, 82, 77), (42, 44, 43), + (48, 55, 22), (38, 65, 22), (34, 49, 20), (12, 36, 0), + (18, 17, 15), (21, 7, 22), (32, 23, 52), (43, 22, 81), + (56, 11, 130), (85, 41, 138), (144, 73, 129), (181, 61, 135), + (196, 84, 120), (212, 87, 98), (228, 90, 77), (217, 72, 77), + (213, 47, 97), (235, 43, 102), (202, 47, 139), (190, 45, 138), + (127, 46, 148), (85, 41, 154), (47, 34, 122), (15, 21, 109), + (0, 50, 76), (6, 61, 102), (16, 93, 121), (13, 132, 162), + (13, 146, 165), (11, 145, 174), (18, 133, 164), (59, 121, 132), + (108, 86, 109), (91, 94, 83), (115, 119, 68), (75, 144, 89), + (55, 128, 85), (32, 135, 92), (62, 135, 90), (132, 145, 76), + (171, 162, 85), (155, 145, 84), (112, 142, 118), (56, 137, 94), + (65, 107, 93), (53, 99, 63), (88, 62, 99), (123, 65, 115), + (166, 67, 111), (179, 80, 83), (187, 79, 95), (181, 79, 103), + (123, 87, 99), (113, 82, 97), (83, 62, 105), (19, 41, 98), + (12, 54, 76), (37, 39, 54), (55, 22, 43), (64, 3, 45), + (51, 17, 33), (44, 21, 7), (53, 25, 1), (55, 33, 9), + (54, 43, 11), (63, 62, 41), (84, 87, 78), (113, 106, 78), + (187, 98, 94), (196, 80, 117), (220, 88, 148), (206, 108, 169), + (212, 110, 123), (203, 118, 81), (196, 140, 43), (196, 131, 15), + (177, 129, 3), (174, 126, 2), (139, 123, 2), (101, 142, 22), + (75, 147, 21), (102, 110, 50), (149, 52, 168), (119, 79, 103) + ), + +// 334 3m0018.jpg +((21, 63, 181), (3, 76, 217), (3, 93, 208), (3, 111, 199), + (28, 128, 151), (54, 145, 104), (53, 154, 96), (52, 164, 88), + (62, 111, 105), (52, 85, 92), (42, 60, 80), (25, 50, 70), + (9, 40, 60), (10, 57, 73), (11, 75, 87), (22, 73, 81), + (34, 72, 75), (28, 78, 49), (23, 97, 33), (18, 116, 17), + (19, 119, 19), (20, 122, 22), (31, 123, 22), (43, 124, 22), + (142, 125, 21), (187, 156, 23), (233, 188, 25), (210, 159, 36), + (187, 131, 48), (180, 125, 47), (174, 120, 46), (199, 95, 94), + (147, 86, 85), (172, 141, 156), (202, 157, 128), (232, 174, 100), + (229, 160, 101), (227, 146, 103), (223, 126, 143), (219, 107, 183), + (160, 74, 123), (132, 45, 102), (105, 16, 82), (100, 26, 72), + (95, 37, 62), (108, 39, 54), (122, 41, 47), (160, 38, 51), + (145, 30, 73), (38, 8, 62), (27, 17, 91), (16, 26, 121), + (35, 53, 111), (54, 81, 102), (51, 90, 113), (48, 100, 124), + (19, 149, 162), (63, 149, 139), (108, 149, 117), (110, 159, 112), + (113, 169, 108), (112, 176, 101), (111, 184, 95), (117, 199, 91), + (127, 201, 86), (236, 189, 49), (212, 140, 32), (189, 91, 16), + (161, 70, 27), (134, 50, 39), (84, 36, 13), (58, 14, 13), + (60, 14, 17), (95, 26, 30), (130, 38, 43), (140, 31, 30), + (151, 24, 17), (141, 41, 33), (132, 58, 49), (127, 78, 35), + (106, 79, 49), (48, 88, 15), (50, 62, 35), (52, 37, 56), + (52, 61, 65), (53, 85, 74), (99, 117, 95), (105, 138, 109), + (150, 192, 90), (177, 193, 116), (204, 194, 143), (192, 186, 131), + (180, 178, 119), (161, 184, 114), (133, 182, 117), (103, 165, 118), + (77, 189, 117), (62, 171, 78), (58, 145, 67), (54, 120, 56), + (47, 117, 47), (40, 114, 39), (43, 119, 80), (63, 133, 97), + (71, 134, 55), (80, 149, 59), (90, 165, 64), (91, 176, 66), + (92, 187, 69), (87, 192, 74), (83, 165, 93), (125, 146, 69), + (115, 96, 54), (97, 67, 29), (94, 62, 40), (91, 58, 51), + (66, 78, 40), (48, 76, 28), (34, 84, 25), (34, 105, 45), + (95, 79, 82), (113, 85, 116), (131, 91, 151), (127, 104, 159), + (124, 117, 168), (120, 180, 154), (120, 182, 119), (125, 177, 128), + (113, 159, 157), (97, 88, 91), (104, 67, 108), (111, 47, 125), + (81, 62, 144), (47, 44, 113), (42, 72, 110), (40, 75, 129), + (83, 71, 95), (100, 89, 76), (117, 107, 58), (109, 111, 46), + (101, 116, 35), (146, 106, 11), (196, 120, 22), (195, 119, 35), + (138, 82, 33), (102, 31, 89), (97, 25, 89), (92, 19, 90), + (57, 10, 88), (24, 17, 120), (8, 21, 162), (14, 24, 156), + (17, 97, 106), (16, 110, 99), (16, 124, 92), (31, 116, 77), + (46, 95, 50), (82, 72, 37), (106, 53, 39), (155, 49, 1), + (221, 64, 11), (234, 178, 21), (233, 183, 40), (233, 188, 59), + (196, 191, 110), (162, 194, 93), (149, 181, 108), (123, 183, 158), + (74, 127, 177), (75, 100, 154), (77, 73, 132), (96, 31, 85), + (69, 31, 52), (32, 41, 38), (0, 37, 10), (0, 41, 5), + (0, 78, 2), (4, 67, 24), (25, 70, 15), (23, 95, 29), + (36, 104, 17), (37, 99, 13), (43, 78, 24), (70, 52, 16), + (186, 29, 14), (195, 29, 25), (204, 29, 36), (224, 105, 23), + (230, 153, 47), (235, 185, 70), (228, 166, 93), (165, 143, 119), + (111, 99, 121), (61, 90, 130), (54, 60, 146), (27, 25, 188), + (11, 16, 206), (4, 37, 228), (0, 23, 199), (20, 16, 152), + (87, 29, 141), (107, 31, 131), (102, 4, 141), (127, 4, 146), + (164, 40, 94), (168, 40, 39), (187, 19, 16), (199, 51, 37), + (151, 69, 57), (127, 138, 78), (114, 129, 96), (71, 138, 107), + (35, 118, 90), (3, 84, 87), (0, 73, 89), (2, 58, 95), + (24, 74, 85), (33, 107, 74), (17, 134, 53), (22, 144, 45), + (26, 127, 47), (25, 81, 36), (37, 55, 41), (37, 48, 54), + (40, 42, 54), (16, 38, 51), (23, 28, 47), (16, 10, 46), + (8, 21, 29), (4, 28, 12), (26, 18, 29), (24, 5, 11), + (46, 3, 20), (52, 11, 7), (53, 43, 8), (67, 26, 30), + (132, 31, 37), (150, 15, 9), (180, 12, 1), (208, 11, 3), + (208, 5, 27), (147, 20, 37), (73, 26, 42), (38, 23, 46), + (43, 11, 76), (87, 10, 90), (105, 34, 128), (157, 49, 151), + (132, 53, 230), (127, 90, 195), (131, 106, 187), (113, 137, 137), + (171, 174, 105), (180, 147, 54), (234, 160, 13), (232, 138, 24) + ), + +// 335 4u0002.jpg +((113, 196, 42), (78, 160, 16), (96, 132, 13), (115, 105, 10), + (100, 84, 5), (86, 63, 0), (84, 60, 3), (83, 57, 6), + (91, 89, 14), (119, 123, 10), (148, 157, 6), (142, 133, 9), + (137, 109, 12), (123, 104, 7), (110, 100, 3), (89, 92, 7), + (68, 84, 11), (32, 92, 32), (36, 103, 54), (40, 115, 76), + (38, 121, 76), (36, 128, 77), (40, 124, 74), (44, 120, 71), + (59, 76, 42), (63, 59, 25), (67, 43, 9), (71, 41, 29), + (76, 40, 50), (74, 40, 53), (73, 41, 56), (65, 35, 71), + (72, 46, 73), (80, 40, 92), (97, 33, 83), (115, 26, 74), + (109, 22, 58), (103, 19, 42), (100, 21, 40), (97, 23, 38), + (55, 19, 21), (47, 25, 43), (39, 32, 66), (33, 56, 60), + (28, 81, 55), (33, 96, 61), (38, 111, 68), (56, 96, 72), + (69, 85, 75), (159, 40, 96), (190, 35, 102), (221, 30, 108), + (189, 51, 76), (158, 73, 44), (134, 78, 36), (110, 83, 28), + (67, 140, 23), (48, 146, 41), (29, 153, 59), (30, 148, 72), + (31, 143, 85), (35, 134, 84), (39, 126, 84), (54, 109, 70), + (72, 110, 63), (90, 95, 73), (73, 97, 66), (57, 99, 59), + (60, 79, 60), (64, 60, 61), (50, 68, 56), (39, 85, 49), + (30, 117, 36), (42, 128, 25), (55, 139, 15), (49, 123, 9), + (44, 107, 3), (45, 93, 1), (47, 80, 0), (62, 76, 15), + (80, 60, 33), (76, 84, 7), (69, 111, 7), (63, 139, 7), + (58, 145, 14), (54, 151, 22), (59, 158, 29), (57, 148, 43), + (40, 105, 51), (42, 81, 40), (45, 58, 30), (55, 49, 25), + (65, 40, 20), (91, 32, 26), (99, 50, 20), (97, 48, 31), + (110, 43, 52), (141, 53, 52), (135, 65, 59), (130, 78, 67), + (123, 71, 53), (116, 64, 40), (125, 96, 20), (118, 105, 3), + (157, 136, 29), (167, 152, 20), (178, 169, 12), (176, 168, 8), + (175, 167, 4), (189, 182, 16), (199, 151, 75), (187, 132, 50), + (176, 96, 71), (176, 52, 60), (178, 55, 58), (181, 59, 56), + (174, 103, 51), (125, 124, 18), (89, 155, 32), (115, 194, 79), + (112, 208, 83), (77, 180, 70), (42, 152, 57), (28, 143, 65), + (15, 135, 73), (1, 144, 90), (12, 153, 75), (5, 150, 45), + (48, 164, 39), (91, 221, 99), (102, 205, 98), (114, 189, 98), + (85, 186, 90), (50, 112, 91), (35, 94, 72), (32, 62, 38), + (55, 34, 7), (67, 18, 14), (79, 2, 22), (82, 7, 18), + (85, 13, 14), (98, 13, 16), (88, 23, 27), (79, 43, 21), + (66, 63, 8), (36, 30, 6), (35, 44, 8), (34, 58, 10), + (15, 66, 23), (1, 76, 9), (14, 65, 6), (12, 48, 12), + (9, 10, 15), (18, 9, 11), (27, 9, 7), (29, 17, 0), + (26, 16, 17), (19, 10, 37), (33, 24, 27), (35, 46, 38), + (42, 37, 44), (118, 85, 76), (144, 94, 67), (171, 104, 59), + (153, 190, 24), (161, 218, 25), (129, 217, 43), (115, 213, 52), + (53, 115, 90), (52, 99, 85), (52, 84, 81), (26, 45, 60), + (3, 3, 57), (22, 17, 40), (8, 51, 41), (13, 88, 21), + (28, 79, 12), (29, 74, 15), (61, 65, 15), (85, 58, 13), + (121, 55, 29), (141, 31, 40), (150, 36, 44), (145, 45, 43), + (76, 150, 27), (62, 153, 29), (48, 157, 32), (19, 139, 42), + (28, 129, 49), (25, 121, 49), (19, 119, 47), (10, 129, 49), + (18, 133, 66), (4, 131, 86), (29, 129, 77), (22, 127, 70), + (23, 115, 50), (10, 120, 49), (5, 114, 47), (22, 97, 38), + (22, 68, 29), (41, 41, 33), (53, 19, 18), (45, 19, 20), + (33, 19, 19), (38, 28, 3), (57, 21, 5), (65, 8, 0), + (90, 16, 13), (107, 47, 0), (89, 60, 4), (84, 85, 27), + (99, 83, 58), (104, 101, 60), (80, 126, 53), (83, 108, 27), + (124, 110, 11), (168, 112, 38), (179, 102, 56), (144, 96, 56), + (110, 83, 40), (99, 81, 7), (106, 63, 12), (103, 53, 0), + (112, 49, 14), (117, 32, 29), (114, 18, 45), (135, 14, 47), + (164, 22, 78), (170, 13, 94), (187, 9, 93), (168, 10, 87), + (153, 30, 76), (131, 36, 58), (115, 33, 56), (116, 19, 60), + (132, 16, 51), (150, 43, 73), (146, 31, 96), (115, 31, 83), + (115, 48, 91), (134, 45, 101), (180, 27, 110), (202, 20, 97), + (195, 18, 88), (185, 24, 78), (184, 29, 69), (152, 16, 54), + (137, 14, 42), (136, 44, 65), (109, 74, 81), (96, 104, 63), + (74, 141, 38), (51, 152, 48), (10, 152, 78), (25, 148, 68) + ), + +// 336 4u0003.jpg +((67, 30, 73), (148, 55, 108), (148, 80, 73), (149, 106, 38), + (120, 79, 23), (91, 53, 8), (65, 61, 5), (40, 69, 3), + (54, 84, 30), (69, 95, 62), (85, 107, 94), (124, 98, 119), + (163, 90, 145), (140, 120, 170), (117, 151, 196), (121, 154, 202), + (125, 158, 209), (107, 188, 217), (93, 169, 177), (80, 151, 137), + (73, 151, 108), (66, 152, 79), (63, 141, 77), (60, 131, 75), + (9, 116, 22), (5, 99, 13), (1, 82, 5), (20, 59, 18), + (39, 36, 31), (55, 31, 41), (71, 27, 52), (84, 58, 87), + (76, 72, 89), (61, 89, 75), (51, 76, 49), (42, 63, 24), + (36, 63, 22), (30, 63, 20), (31, 66, 23), (32, 69, 26), + (5, 45, 45), (3, 26, 34), (1, 7, 23), (20, 17, 22), + (40, 27, 21), (40, 28, 19), (41, 29, 17), (69, 11, 25), + (112, 23, 43), (140, 51, 97), (134, 43, 110), (128, 35, 124), + (119, 38, 92), (110, 41, 60), (110, 32, 49), (110, 23, 39), + (67, 21, 5), (64, 30, 10), (62, 40, 16), (87, 35, 32), + (113, 30, 48), (113, 41, 59), (114, 53, 71), (109, 84, 64), + (169, 95, 82), (181, 219, 82), (137, 201, 96), (94, 184, 110), + (85, 174, 110), (77, 164, 111), (119, 108, 116), (123, 96, 139), + (142, 116, 189), (152, 109, 181), (163, 103, 173), (166, 96, 189), + (169, 90, 205), (177, 72, 201), (186, 55, 197), (163, 60, 165), + (146, 47, 153), (106, 9, 63), (111, 18, 57), (117, 27, 52), + (98, 35, 60), (79, 44, 68), (72, 82, 92), (67, 96, 130), + (36, 116, 139), (51, 141, 117), (67, 167, 95), (69, 164, 83), + (72, 162, 72), (59, 118, 62), (66, 89, 81), (71, 76, 79), + (82, 42, 30), (75, 10, 6), (81, 35, 44), (88, 60, 83), + (79, 70, 87), (71, 81, 91), (47, 109, 106), (35, 116, 107), + (11, 106, 98), (7, 91, 61), (4, 77, 24), (19, 73, 30), + (34, 69, 37), (46, 48, 43), (69, 26, 80), (88, 22, 112), + (86, 10, 110), (109, 0, 107), (99, 4, 92), (89, 9, 78), + (71, 8, 65), (61, 13, 75), (47, 2, 97), (11, 24, 94), + (1, 28, 49), (23, 34, 55), (45, 40, 62), (52, 27, 81), + (59, 15, 100), (67, 42, 100), (87, 73, 99), (113, 73, 97), + (130, 85, 114), (127, 67, 141), (122, 50, 139), (118, 33, 137), + (114, 33, 138), (109, 27, 101), (113, 18, 100), (97, 16, 93), + (107, 10, 87), (111, 7, 111), (116, 5, 136), (114, 10, 130), + (112, 16, 124), (94, 11, 99), (70, 16, 66), (39, 51, 37), + (10, 100, 2), (21, 62, 4), (36, 54, 14), (52, 46, 24), + (78, 14, 5), (92, 11, 26), (99, 5, 41), (86, 16, 44), + (65, 16, 48), (56, 16, 38), (47, 17, 29), (41, 14, 47), + (35, 23, 47), (57, 52, 49), (88, 68, 93), (133, 101, 104), + (189, 128, 109), (195, 182, 90), (199, 179, 99), (204, 177, 108), + (206, 146, 138), (156, 139, 132), (73, 142, 137), (58, 127, 156), + (57, 148, 130), (60, 151, 129), (64, 154, 128), (62, 152, 142), + (86, 171, 138), (94, 185, 118), (126, 145, 160), (130, 141, 163), + (73, 149, 136), (51, 133, 95), (29, 124, 82), (12, 110, 72), + (17, 115, 64), (19, 112, 67), (50, 63, 53), (57, 18, 47), + (80, 27, 73), (85, 29, 89), (91, 31, 105), (89, 28, 123), + (112, 65, 145), (116, 85, 116), (111, 120, 91), (81, 157, 82), + (77, 174, 61), (57, 159, 50), (43, 144, 50), (46, 144, 45), + (57, 117, 43), (43, 108, 54), (24, 83, 39), (8, 61, 43), + (9, 93, 43), (12, 89, 53), (4, 68, 68), (6, 70, 80), + (6, 86, 87), (10, 81, 99), (9, 70, 91), (29, 62, 105), + (62, 97, 116), (112, 104, 128), (178, 97, 116), (167, 89, 149), + (135, 73, 138), (132, 51, 154), (125, 34, 95), (107, 19, 61), + (87, 21, 69), (88, 36, 102), (101, 91, 125), (55, 122, 149), + (67, 152, 157), (117, 155, 191), (150, 140, 175), (157, 122, 186), + (154, 90, 168), (147, 86, 164), (104, 59, 152), (62, 87, 144), + (36, 129, 110), (45, 135, 84), (44, 138, 78), (32, 131, 66), + (23, 109, 44), (3, 85, 19), (2, 50, 8), (5, 21, 10), + (5, 3, 16), (30, 2, 25), (38, 29, 20), (34, 43, 24), + (27, 45, 7), (6, 42, 4), (14, 19, 15), (23, 22, 36), + (32, 4, 45), (28, 5, 61), (52, 15, 58), (64, 9, 66), + (80, 33, 85), (78, 64, 97), (78, 76, 98), (69, 81, 67), + (48, 112, 52), (27, 111, 51), (25, 111, 38), (28, 97, 34) + ), + +// 337 4u0004.jpg +((68, 10, 148), (17, 39, 114), (37, 62, 107), (57, 86, 100), + (63, 86, 97), (70, 87, 94), (74, 80, 94), (79, 74, 94), + (98, 51, 33), (141, 34, 16), (185, 18, 0), (202, 54, 29), + (220, 90, 58), (222, 137, 38), (225, 184, 18), (180, 191, 20), + (135, 198, 23), (68, 218, 33), (46, 209, 80), (25, 201, 128), + (25, 191, 144), (25, 182, 161), (30, 164, 130), (35, 147, 99), + (56, 148, 39), (41, 172, 20), (26, 196, 1), (13, 198, 15), + (1, 201, 30), (20, 202, 48), (39, 204, 66), (89, 216, 83), + (116, 248, 85), (103, 197, 173), (53, 153, 154), (4, 110, 136), + (25, 109, 113), (47, 108, 90), (73, 95, 82), (99, 82, 74), + (164, 35, 63), (162, 27, 53), (161, 19, 43), (125, 24, 84), + (89, 29, 125), (69, 23, 137), (49, 17, 150), (51, 18, 135), + (50, 39, 95), (152, 12, 75), (167, 27, 65), (182, 42, 55), + (156, 85, 49), (131, 129, 44), (115, 142, 46), (99, 156, 49), + (22, 169, 0), (26, 164, 7), (30, 159, 15), (31, 159, 50), + (33, 159, 86), (27, 159, 96), (22, 159, 107), (49, 155, 168), + (66, 148, 196), (141, 203, 224), (122, 146, 175), (104, 90, 126), + (96, 83, 121), (88, 76, 116), (62, 96, 121), (33, 111, 85), + (81, 166, 73), (57, 190, 60), (34, 215, 48), (21, 228, 37), + (8, 241, 27), (9, 220, 36), (10, 199, 45), (4, 183, 63), + (34, 168, 83), (53, 163, 216), (71, 192, 181), (90, 222, 146), + (106, 229, 116), (123, 236, 86), (137, 205, 94), (131, 192, 73), + (95, 154, 74), (94, 129, 53), (93, 105, 33), (114, 98, 29), + (136, 91, 26), (160, 103, 26), (189, 114, 33), (213, 112, 60), + (162, 92, 94), (136, 114, 93), (119, 132, 96), (102, 150, 100), + (85, 157, 96), (68, 164, 93), (77, 176, 67), (30, 172, 64), + (35, 174, 45), (30, 176, 58), (26, 179, 71), (27, 186, 82), + (29, 193, 94), (47, 223, 98), (29, 253, 128), (4, 245, 142), + (18, 228, 155), (25, 105, 220), (26, 87, 237), (28, 69, 255), + (23, 44, 233), (23, 15, 238), (12, 13, 181), (30, 10, 123), + (70, 24, 73), (35, 14, 70), (1, 5, 68), (4, 15, 65), + (8, 26, 62), (10, 26, 62), (26, 51, 56), (42, 38, 27), + (47, 14, 23), (39, 1, 0), (33, 14, 0), (27, 27, 1), + (16, 39, 13), (25, 51, 24), (6, 69, 12), (37, 90, 12), + (29, 90, 31), (26, 102, 26), (23, 114, 21), (32, 135, 12), + (42, 157, 4), (65, 185, 10), (64, 175, 10), (60, 140, 17), + (107, 110, 19), (169, 125, 18), (168, 149, 19), (168, 173, 21), + (189, 116, 5), (196, 111, 4), (175, 99, 15), (188, 111, 31), + (125, 94, 50), (133, 76, 49), (141, 59, 48), (142, 65, 37), + (146, 84, 45), (171, 81, 3), (187, 86, 18), (166, 85, 32), + (141, 76, 54), (53, 99, 125), (43, 107, 126), (34, 116, 128), + (32, 136, 125), (34, 148, 89), (73, 119, 70), (103, 82, 61), + (143, 35, 6), (135, 39, 6), (128, 44, 7), (87, 73, 24), + (39, 28, 22), (37, 9, 32), (48, 28, 39), (76, 31, 64), + (79, 46, 63), (47, 75, 17), (12, 71, 25), (4, 107, 86), + (1, 70, 103), (0, 106, 164), (31, 75, 226), (52, 45, 237), + (102, 1, 181), (92, 23, 163), (82, 46, 146), (108, 43, 107), + (69, 88, 92), (56, 113, 42), (53, 133, 20), (56, 113, 19), + (63, 106, 17), (83, 103, 40), (108, 82, 57), (129, 63, 41), + (132, 79, 48), (120, 115, 47), (81, 116, 32), (75, 137, 36), + (53, 135, 97), (77, 117, 119), (97, 73, 147), (77, 28, 180), + (113, 51, 150), (133, 81, 117), (142, 163, 84), (152, 162, 47), + (180, 126, 80), (183, 104, 123), (116, 87, 169), (92, 129, 210), + (87, 71, 242), (57, 68, 222), (66, 22, 207), (26, 35, 152), + (22, 62, 88), (61, 43, 59), (44, 46, 59), (16, 75, 69), + (52, 90, 103), (37, 109, 123), (5, 82, 134), (14, 14, 164), + (72, 9, 184), (74, 46, 183), (36, 112, 112), (9, 128, 38), + (7, 175, 56), (24, 184, 52), (17, 234, 33), (28, 237, 50), + (56, 201, 34), (60, 197, 29), (84, 200, 39), (88, 216, 15), + (67, 206, 1), (77, 180, 15), (85, 129, 32), (80, 79, 59), + (65, 85, 58), (58, 79, 48), (36, 92, 47), (46, 119, 37), + (76, 152, 44), (143, 202, 32), (189, 251, 18), (140, 214, 15), + (117, 220, 29), (115, 237, 50), (120, 238, 58), (91, 221, 69), + (105, 167, 66), (78, 155, 59), (52, 192, 41), (68, 173, 55) + ), + +// 338 4u0005.jpg +((63, 63, 89), (65, 108, 114), (74, 130, 111), (84, 153, 108), + (140, 156, 111), (197, 160, 115), (206, 135, 116), (215, 111, 118), + (198, 60, 179), (164, 32, 203), (131, 5, 227), (97, 15, 194), + (63, 25, 162), (73, 23, 126), (83, 22, 91), (70, 31, 72), + (58, 40, 54), (55, 84, 30), (44, 130, 76), (34, 177, 123), + (26, 201, 162), (18, 226, 202), (55, 216, 184), (92, 207, 166), + (83, 184, 52), (105, 200, 44), (127, 216, 36), (179, 199, 86), + (231, 183, 137), (228, 168, 149), (226, 153, 162), (213, 97, 172), + (178, 60, 209), (111, 5, 225), (75, 17, 208), (40, 30, 191), + (30, 68, 203), (21, 106, 215), (22, 96, 184), (24, 87, 154), + (36, 83, 113), (36, 103, 122), (36, 123, 132), (28, 140, 138), + (20, 158, 145), (18, 187, 141), (16, 217, 137), (2, 224, 137), + (1, 237, 127), (3, 177, 92), (36, 174, 60), (70, 171, 29), + (61, 134, 18), (53, 98, 7), (45, 92, 7), (38, 87, 8), + (8, 106, 67), (17, 97, 90), (26, 88, 113), (47, 95, 136), + (68, 103, 159), (86, 98, 179), (105, 94, 199), (163, 84, 211), + (186, 97, 227), (213, 99, 238), (214, 77, 225), (216, 55, 213), + (211, 47, 210), (206, 39, 207), (183, 56, 189), (134, 37, 178), + (170, 62, 112), (133, 108, 76), (96, 154, 41), (90, 189, 48), + (84, 224, 55), (74, 203, 79), (65, 182, 104), (38, 227, 137), + (34, 231, 152), (32, 197, 157), (49, 172, 134), (66, 148, 112), + (69, 158, 98), (73, 168, 84), (74, 167, 35), (67, 175, 29), + (111, 177, 25), (137, 173, 23), (164, 170, 22), (185, 186, 30), + (206, 203, 38), (197, 232, 18), (127, 240, 36), (93, 244, 67), + (69, 228, 74), (63, 195, 148), (76, 152, 145), (89, 109, 142), + (122, 89, 151), (155, 69, 160), (219, 69, 158), (219, 95, 168), + (176, 67, 210), (135, 90, 208), (94, 113, 207), (85, 127, 206), + (76, 141, 205), (71, 184, 192), (102, 193, 178), (107, 126, 220), + (206, 158, 220), (228, 99, 156), (231, 89, 153), (235, 79, 150), + (217, 55, 115), (192, 79, 61), (189, 56, 103), (193, 50, 112), + (250, 49, 141), (236, 103, 125), (223, 157, 109), (222, 172, 115), + (222, 187, 121), (182, 221, 106), (124, 223, 55), (117, 223, 52), + (102, 181, 40), (158, 112, 114), (177, 94, 113), (197, 77, 112), + (191, 58, 141), (144, 69, 138), (95, 35, 95), (95, 4, 81), + (73, 97, 9), (85, 107, 16), (98, 118, 23), (80, 106, 24), + (62, 95, 26), (57, 76, 12), (122, 97, 17), (141, 47, 35), + (187, 56, 72), (229, 9, 145), (218, 12, 150), (208, 16, 155), + (164, 25, 154), (120, 30, 117), (109, 19, 115), (110, 16, 140), + (140, 47, 198), (161, 39, 185), (183, 32, 173), (198, 8, 156), + (166, 4, 201), (144, 31, 225), (145, 36, 205), (158, 77, 205), + (143, 60, 200), (88, 98, 185), (72, 103, 174), (57, 108, 163), + (54, 144, 153), (55, 118, 169), (55, 96, 202), (46, 103, 216), + (63, 56, 185), (57, 61, 161), (52, 66, 137), (37, 85, 149), + (48, 93, 152), (43, 108, 128), (31, 83, 131), (36, 65, 125), + (47, 42, 108), (27, 36, 77), (17, 60, 41), (38, 66, 18), + (68, 118, 19), (99, 161, 2), (110, 166, 13), (123, 203, 18), + (109, 196, 31), (115, 177, 53), (121, 159, 76), (219, 185, 113), + (208, 116, 119), (182, 96, 145), (169, 73, 144), (134, 74, 126), + (119, 62, 167), (95, 68, 147), (59, 100, 146), (54, 100, 124), + (58, 84, 109), (39, 99, 97), (50, 117, 84), (77, 150, 69), + (112, 119, 51), (181, 110, 48), (211, 131, 44), (96, 151, 34), + (78, 166, 46), (77, 160, 68), (49, 166, 87), (28, 181, 65), + (8, 145, 77), (0, 116, 56), (23, 120, 77), (28, 81, 97), + (19, 76, 96), (7, 83, 109), (33, 95, 146), (17, 133, 180), + (26, 162, 186), (16, 214, 225), (9, 240, 222), (6, 244, 212), + (10, 236, 199), (14, 232, 205), (16, 227, 212), (41, 191, 189), + (58, 176, 186), (84, 108, 196), (97, 106, 199), (121, 64, 167), + (130, 65, 169), (113, 55, 178), (95, 18, 130), (90, 35, 103), + (63, 5, 89), (58, 17, 87), (48, 21, 88), (37, 75, 94), + (43, 93, 128), (24, 135, 154), (34, 180, 167), (13, 200, 169), + (15, 233, 159), (9, 225, 140), (17, 193, 112), (23, 129, 89), + (25, 69, 52), (12, 59, 4), (10, 41, 7), (6, 30, 17), + (9, 17, 38), (8, 37, 32), (0, 53, 70), (24, 66, 64), + (32, 77, 80), (30, 132, 108), (20, 185, 151), (15, 155, 116) + ), + +// 339 4u0006.jpg +((35, 159, 183), (61, 171, 142), (60, 185, 118), (60, 200, 95), + (81, 188, 90), (103, 176, 86), (124, 140, 55), (146, 105, 25), + (115, 33, 45), (128, 42, 31), (142, 52, 18), (172, 81, 13), + (202, 110, 9), (188, 123, 46), (174, 137, 84), (162, 151, 113), + (150, 165, 142), (96, 202, 200), (77, 205, 197), (58, 209, 194), + (41, 167, 184), (24, 126, 175), (29, 105, 172), (35, 85, 170), + (83, 72, 150), (68, 100, 162), (54, 128, 175), (67, 139, 157), + (80, 150, 139), (97, 148, 138), (114, 147, 138), (139, 150, 154), + (148, 184, 174), (105, 217, 203), (87, 219, 216), (70, 221, 230), + (75, 189, 209), (81, 157, 189), (91, 164, 188), (102, 171, 187), + (81, 184, 157), (80, 166, 156), (79, 148, 155), (78, 146, 132), + (77, 144, 109), (75, 137, 100), (74, 130, 91), (65, 88, 72), + (66, 53, 45), (89, 57, 36), (58, 86, 43), (27, 116, 50), + (40, 120, 67), (53, 125, 85), (56, 127, 79), (60, 129, 74), + (156, 116, 28), (192, 98, 31), (228, 80, 34), (236, 61, 49), + (245, 42, 64), (233, 31, 61), (221, 21, 58), (196, 10, 49), + (170, 15, 73), (106, 25, 42), (105, 49, 51), (105, 73, 60), + (90, 85, 62), (76, 97, 64), (48, 103, 64), (9, 126, 71), + (9, 154, 79), (7, 158, 95), (5, 162, 111), (41, 182, 128), + (78, 203, 145), (80, 199, 161), (83, 196, 178), (83, 219, 217), + (80, 225, 230), (94, 213, 207), (104, 193, 189), (115, 174, 172), + (133, 161, 144), (151, 148, 117), (167, 121, 88), (211, 68, 54), + (240, 38, 52), (202, 40, 44), (164, 42, 37), (132, 37, 40), + (100, 32, 43), (31, 56, 0), (2, 94, 21), (9, 135, 53), + (25, 181, 46), (18, 208, 76), (24, 180, 41), (30, 152, 7), + (21, 141, 5), (12, 131, 3), (1, 108, 26), (8, 134, 9), + (24, 184, 62), (26, 172, 81), (28, 160, 100), (38, 140, 99), + (49, 121, 99), (77, 116, 85), (160, 92, 133), (171, 59, 143), + (173, 47, 155), (133, 29, 124), (165, 22, 107), (197, 15, 90), + (201, 17, 87), (213, 25, 84), (218, 9, 75), (217, 23, 49), + (221, 63, 16), (227, 77, 23), (234, 92, 30), (220, 83, 49), + (207, 74, 69), (149, 78, 48), (151, 84, 57), (146, 84, 85), + (178, 97, 96), (158, 48, 75), (149, 59, 74), (141, 71, 73), + (95, 63, 74), (48, 37, 95), (104, 19, 112), (108, 6, 106), + (137, 36, 114), (122, 78, 126), (108, 121, 138), (103, 128, 150), + (98, 135, 162), (109, 102, 240), (119, 82, 195), (109, 21, 159), + (95, 56, 119), (62, 102, 65), (54, 126, 48), (46, 151, 32), + (41, 145, 8), (81, 151, 26), (125, 130, 12), (152, 103, 11), + (139, 39, 16), (118, 33, 11), (98, 27, 7), (129, 16, 12), + (154, 30, 40), (136, 32, 59), (129, 14, 83), (137, 21, 96), + (201, 6, 100), (224, 13, 84), (218, 6, 67), (212, 0, 51), + (197, 11, 22), (174, 5, 2), (229, 48, 5), (227, 57, 5), + (225, 72, 31), (197, 88, 37), (170, 104, 44), (110, 135, 44), + (47, 193, 22), (32, 171, 54), (46, 146, 84), (78, 124, 52), + (130, 121, 64), (133, 131, 82), (118, 116, 129), (114, 90, 122), + (108, 86, 161), (113, 90, 162), (128, 83, 138), (149, 54, 88), + (149, 117, 79), (132, 128, 96), (115, 139, 113), (99, 137, 122), + (48, 137, 119), (42, 159, 143), (10, 133, 167), (32, 111, 116), + (66, 84, 124), (54, 86, 97), (35, 52, 95), (44, 88, 89), + (42, 95, 101), (13, 134, 89), (13, 146, 83), (5, 149, 87), + (17, 138, 133), (18, 129, 184), (18, 108, 186), (60, 125, 215), + (44, 149, 181), (43, 182, 141), (18, 183, 88), (2, 171, 78), + (8, 169, 55), (15, 122, 52), (22, 108, 47), (16, 107, 76), + (41, 129, 104), (50, 163, 143), (38, 181, 175), (68, 193, 185), + (66, 221, 155), (66, 224, 150), (105, 184, 136), (141, 168, 151), + (141, 160, 154), (132, 146, 110), (138, 148, 87), (159, 91, 56), + (148, 81, 36), (127, 45, 24), (120, 56, 29), (114, 79, 75), + (80, 102, 55), (40, 125, 31), (24, 140, 13), (31, 120, 26), + (27, 98, 32), (48, 57, 10), (119, 43, 27), (166, 34, 32), + (169, 9, 47), (196, 5, 48), (215, 2, 34), (221, 9, 31), + (206, 23, 25), (221, 55, 31), (207, 57, 43), (183, 42, 85), + (147, 55, 122), (102, 48, 172), (56, 67, 221), (34, 25, 206), + (46, 2, 147), (90, 0, 138), (98, 1, 168), (112, 11, 139), + (102, 10, 97), (128, 47, 90), (195, 50, 67), (232, 60, 10) + ), + +// 340 4u0007.jpg +((12, 10, 57), (0, 23, 37), (13, 19, 20), (26, 16, 4), + (30, 32, 17), (35, 48, 31), (31, 70, 39), (27, 93, 47), + (35, 82, 66), (47, 79, 65), (60, 76, 65), (109, 74, 53), + (158, 73, 42), (178, 59, 39), (198, 45, 37), (211, 45, 37), + (224, 45, 38), (206, 96, 19), (204, 106, 18), (203, 117, 18), + (167, 101, 14), (132, 86, 11), (117, 69, 15), (103, 53, 20), + (78, 48, 58), (80, 49, 64), (83, 50, 71), (79, 28, 61), + (76, 7, 52), (64, 5, 51), (52, 3, 50), (32, 22, 49), + (13, 35, 59), (17, 59, 39), (34, 70, 43), (51, 81, 47), + (34, 63, 38), (18, 45, 30), (17, 37, 26), (16, 29, 22), + (14, 1, 31), (7, 8, 36), (0, 16, 42), (12, 9, 40), + (24, 2, 38), (22, 2, 36), (21, 2, 34), (23, 8, 31), + (16, 9, 16), (34, 36, 22), (47, 46, 33), (61, 57, 45), + (57, 76, 55), (53, 96, 66), (53, 102, 69), (53, 109, 72), + (66, 182, 107), (70, 193, 150), (75, 205, 193), (70, 170, 182), + (66, 136, 172), (63, 118, 148), (60, 100, 125), (50, 78, 82), + (52, 58, 90), (70, 53, 61), (108, 38, 38), (147, 24, 16), + (148, 18, 25), (150, 12, 35), (131, 17, 27), (84, 21, 29), + (59, 48, 44), (49, 47, 49), (39, 46, 54), (24, 45, 52), + (10, 45, 51), (7, 44, 45), (4, 43, 40), (1, 31, 3), + (12, 21, 2), (27, 1, 4), (15, 4, 8), (4, 7, 12), + (8, 12, 20), (13, 17, 28), (22, 35, 52), (32, 70, 71), + (4, 148, 139), (12, 144, 154), (20, 141, 170), (30, 123, 142), + (41, 105, 114), (61, 82, 83), (71, 73, 60), (70, 69, 38), + (118, 77, 15), (189, 118, 26), (142, 102, 56), (95, 86, 87), + (70, 92, 99), (46, 98, 111), (38, 139, 151), (27, 147, 172), + (15, 145, 194), (12, 163, 198), (9, 181, 203), (6, 176, 211), + (4, 172, 219), (3, 189, 238), (7, 195, 243), (25, 197, 243), + (66, 209, 217), (82, 198, 221), (80, 194, 207), (78, 190, 194), + (64, 147, 163), (42, 132, 140), (37, 94, 105), (38, 62, 72), + (41, 38, 81), (44, 45, 69), (47, 52, 58), (51, 40, 54), + (56, 28, 51), (57, 21, 23), (57, 18, 19), (68, 7, 2), + (62, 11, 7), (63, 30, 13), (77, 37, 17), (91, 45, 21), + (121, 74, 20), (166, 86, 25), (182, 81, 3), (198, 66, 1), + (245, 80, 24), (234, 68, 27), (223, 57, 31), (231, 65, 29), + (239, 74, 28), (226, 91, 10), (210, 79, 7), (196, 82, 22), + (194, 119, 26), (97, 109, 27), (103, 108, 57), (110, 107, 88), + (114, 95, 101), (129, 81, 81), (106, 76, 88), (99, 88, 68), + (118, 51, 32), (148, 47, 28), (179, 44, 25), (220, 6, 14), + (152, 16, 4), (106, 31, 26), (82, 36, 47), (68, 52, 53), + (55, 68, 61), (56, 67, 53), (57, 70, 61), (59, 74, 69), + (71, 70, 84), (64, 95, 98), (49, 126, 134), (55, 138, 152), + (30, 112, 90), (38, 99, 83), (46, 86, 77), (59, 75, 75), + (56, 66, 75), (49, 62, 81), (33, 63, 87), (34, 86, 99), + (27, 131, 132), (13, 130, 140), (29, 129, 144), (30, 113, 127), + (63, 83, 116), (79, 62, 80), (93, 71, 73), (91, 72, 76), + (92, 104, 102), (84, 112, 123), (76, 121, 144), (100, 145, 187), + (100, 176, 192), (95, 194, 233), (80, 193, 227), (78, 152, 201), + (57, 146, 186), (26, 121, 149), (0, 75, 96), (26, 41, 74), + (22, 25, 60), (25, 21, 58), (37, 39, 51), (25, 60, 66), + (18, 60, 74), (3, 85, 83), (2, 103, 71), (10, 103, 95), + (22, 112, 139), (54, 122, 169), (74, 89, 158), (77, 56, 115), + (130, 15, 146), (108, 41, 94), (141, 56, 79), (133, 66, 39), + (118, 56, 57), (88, 69, 65), (73, 78, 84), (67, 112, 109), + (54, 130, 128), (52, 169, 153), (56, 209, 191), (68, 194, 182), + (72, 143, 129), (100, 123, 139), (86, 117, 120), (78, 120, 116), + (64, 111, 131), (66, 97, 115), (63, 71, 90), (42, 59, 89), + (44, 66, 80), (38, 68, 58), (44, 62, 50), (20, 60, 52), + (9, 49, 25), (2, 48, 1), (27, 25, 2), (41, 23, 11), + (56, 28, 17), (47, 57, 23), (44, 52, 39), (48, 61, 67), + (47, 53, 77), (63, 39, 87), (65, 52, 80), (70, 46, 70), + (78, 20, 32), (47, 17, 9), (31, 14, 7), (19, 1, 13), + (14, 1, 18), (9, 1, 14), (12, 3, 20), (26, 6, 31), + (38, 9, 39), (67, 15, 53), (90, 8, 48), (109, 9, 73) + ), + +// 341 4u0008.jpg +((92, 215, 223), (92, 212, 226), (95, 215, 222), (98, 218, 219), + (104, 195, 203), (110, 172, 187), (128, 167, 180), (146, 163, 173), + (172, 101, 97), (144, 89, 81), (117, 77, 65), (93, 77, 77), + (70, 78, 89), (67, 92, 101), (64, 107, 114), (63, 103, 111), + (62, 99, 108), (7, 83, 119), (21, 115, 140), (35, 148, 162), + (32, 167, 190), (29, 186, 219), (42, 194, 228), (56, 203, 237), + (95, 198, 243), (108, 177, 218), (121, 157, 193), (133, 147, 172), + (146, 138, 151), (126, 122, 135), (107, 106, 120), (85, 87, 86), + (68, 58, 83), (60, 27, 48), (55, 23, 45), (51, 19, 42), + (68, 28, 48), (85, 38, 54), (89, 58, 56), (93, 78, 59), + (99, 90, 93), (95, 130, 129), (91, 170, 165), (87, 191, 192), + (84, 213, 219), (76, 218, 223), (68, 223, 227), (55, 220, 216), + (55, 209, 217), (82, 165, 207), (86, 155, 195), (90, 145, 184), + (88, 147, 183), (86, 149, 182), (82, 156, 187), (79, 164, 193), + (64, 150, 173), (53, 137, 153), (42, 125, 133), (35, 101, 121), + (28, 77, 109), (29, 76, 99), (30, 76, 89), (18, 81, 90), + (10, 69, 75), (35, 60, 91), (40, 52, 87), (46, 44, 83), + (36, 52, 84), (26, 60, 85), (30, 75, 94), (32, 114, 125), + (45, 153, 192), (64, 165, 206), (84, 177, 220), (85, 172, 217), + (87, 168, 215), (89, 154, 190), (91, 141, 166), (114, 116, 115), + (122, 83, 78), (152, 100, 102), (148, 132, 128), (144, 164, 155), + (114, 153, 157), (84, 143, 159), (67, 128, 149), (59, 121, 132), + (40, 78, 115), (32, 85, 137), (24, 93, 160), (27, 105, 165), + (30, 117, 170), (48, 146, 175), (63, 159, 181), (79, 160, 163), + (86, 154, 177), (16, 117, 147), (8, 91, 125), (0, 65, 103), + (1, 65, 102), (2, 66, 101), (3, 49, 82), (0, 38, 60), + (25, 0, 19), (76, 10, 24), (128, 21, 29), (154, 28, 39), + (181, 36, 49), (223, 70, 75), (241, 95, 70), (230, 40, 50), + (212, 32, 61), (136, 82, 96), (117, 91, 124), (98, 101, 152), + (63, 91, 175), (26, 125, 148), (36, 159, 138), (35, 132, 125), + (36, 99, 91), (39, 84, 86), (42, 70, 82), (39, 79, 90), + (36, 88, 99), (19, 119, 143), (30, 164, 165), (66, 165, 186), + (92, 169, 179), (168, 161, 145), (184, 142, 123), (200, 124, 101), + (175, 103, 81), (136, 80, 63), (114, 78, 64), (99, 76, 60), + (55, 62, 54), (54, 70, 64), (53, 78, 74), (68, 84, 78), + (83, 90, 83), (105, 96, 87), (155, 121, 112), (187, 117, 109), + (215, 103, 81), (160, 85, 66), (128, 81, 62), (96, 78, 58), + (84, 89, 82), (83, 90, 83), (57, 112, 91), (56, 101, 130), + (30, 119, 149), (31, 126, 150), (33, 134, 152), (53, 122, 153), + (63, 118, 148), (85, 114, 146), (71, 95, 105), (84, 91, 84), + (151, 89, 78), (207, 95, 73), (207, 97, 80), (207, 99, 87), + (178, 111, 120), (166, 157, 142), (109, 173, 157), (43, 184, 193), + (24, 183, 213), (27, 175, 216), (31, 168, 220), (60, 187, 206), + (89, 200, 193), (88, 205, 196), (91, 188, 233), (86, 198, 236), + (51, 207, 220), (28, 202, 226), (22, 199, 232), (20, 210, 236), + (22, 220, 219), (33, 229, 228), (32, 213, 234), (47, 213, 229), + (41, 205, 230), (32, 201, 227), (23, 198, 225), (6, 161, 215), + (16, 145, 200), (44, 157, 213), (39, 145, 195), (52, 146, 171), + (26, 113, 130), (21, 89, 110), (36, 73, 89), (29, 62, 81), + (25, 47, 60), (19, 29, 54), (14, 23, 28), (19, 50, 32), + (32, 43, 71), (40, 60, 61), (57, 67, 76), (77, 60, 78), + (103, 67, 69), (130, 30, 42), (170, 13, 24), (203, 14, 21), + (206, 15, 22), (214, 58, 18), (200, 28, 44), (149, 33, 42), + (130, 23, 41), (107, 3, 4), (100, 7, 2), (79, 2, 0), + (75, 52, 72), (72, 90, 128), (52, 132, 167), (46, 161, 180), + (49, 159, 194), (59, 147, 185), (85, 122, 193), (96, 128, 201), + (144, 122, 145), (156, 117, 135), (173, 108, 114), (157, 121, 135), + (147, 140, 158), (138, 176, 177), (111, 201, 191), (102, 205, 222), + (83, 208, 236), (75, 234, 255), (92, 233, 250), (87, 224, 242), + (101, 222, 231), (106, 228, 233), (100, 218, 228), (103, 217, 228), + (108, 222, 222), (114, 209, 213), (138, 184, 182), (166, 168, 155), + (198, 121, 111), (216, 101, 82), (225, 99, 84), (212, 115, 96), + (207, 128, 111), (184, 155, 137), (151, 174, 180), (121, 215, 214), + (105, 215, 204), (88, 210, 213), (57, 176, 208), (32, 157, 175) + ), + +// 342 4u0009.jpg +((56, 63, 229), (69, 13, 224), (103, 12, 227), (137, 12, 230), + (148, 20, 229), (160, 29, 229), (153, 33, 228), (146, 37, 227), + (152, 74, 246), (161, 87, 247), (170, 100, 248), (155, 105, 210), + (141, 111, 173), (174, 77, 155), (207, 43, 138), (184, 36, 147), + (162, 29, 156), (82, 58, 206), (69, 88, 198), (56, 118, 191), + (70, 134, 144), (84, 151, 98), (71, 173, 121), (59, 196, 144), + (0, 191, 201), (22, 206, 201), (45, 222, 202), (50, 185, 189), + (55, 149, 177), (77, 119, 160), (100, 90, 143), (79, 30, 119), + (109, 24, 53), (207, 110, 77), (202, 119, 97), (198, 128, 118), + (179, 80, 165), (160, 32, 213), (151, 33, 213), (142, 35, 213), + (128, 12, 222), (103, 8, 220), (79, 4, 219), (61, 5, 219), + (43, 7, 219), (35, 18, 220), (27, 30, 221), (47, 57, 217), + (41, 73, 234), (44, 84, 233), (44, 87, 235), (45, 91, 238), + (48, 90, 234), (51, 90, 230), (62, 95, 233), (74, 100, 236), + (101, 78, 220), (114, 68, 163), (127, 59, 106), (156, 104, 90), + (185, 149, 75), (152, 144, 94), (119, 139, 114), (77, 141, 125), + (58, 151, 141), (77, 150, 218), (99, 120, 219), (121, 91, 221), + (125, 79, 229), (130, 68, 237), (141, 65, 235), (149, 34, 223), + (183, 8, 223), (182, 13, 217), (182, 18, 211), (159, 74, 189), + (137, 131, 167), (144, 148, 171), (152, 166, 175), (183, 153, 153), + (167, 164, 147), (107, 177, 153), (98, 170, 171), (89, 163, 190), + (90, 162, 196), (92, 161, 203), (114, 181, 200), (157, 146, 225), + (142, 91, 232), (146, 98, 195), (150, 106, 159), (147, 117, 144), + (145, 129, 129), (146, 154, 113), (185, 150, 112), (176, 163, 93), + (128, 171, 102), (56, 203, 99), (62, 199, 76), (69, 196, 53), + (76, 210, 60), (83, 224, 67), (103, 211, 50), (169, 156, 2), + (222, 50, 40), (167, 38, 111), (112, 27, 182), (111, 36, 192), + (111, 46, 202), (60, 87, 216), (66, 128, 201), (89, 136, 214), + (103, 158, 188), (189, 148, 126), (195, 153, 131), (201, 159, 137), + (224, 157, 130), (215, 138, 118), (204, 132, 118), (223, 138, 97), + (220, 146, 37), (224, 109, 44), (228, 73, 51), (216, 77, 41), + (204, 82, 31), (146, 84, 87), (132, 79, 147), (106, 60, 169), + (104, 77, 220), (57, 99, 199), (61, 96, 196), (66, 94, 194), + (73, 80, 152), (78, 50, 135), (156, 19, 91), (191, 26, 105), + (236, 2, 115), (223, 11, 124), (211, 20, 133), (186, 17, 127), + (162, 15, 121), (165, 14, 109), (199, 11, 108), (194, 8, 119), + (164, 23, 135), (129, 6, 221), (113, 17, 224), (97, 29, 228), + (70, 22, 222), (71, 12, 218), (84, 27, 217), (102, 43, 219), + (197, 123, 112), (207, 127, 88), (218, 131, 64), (185, 174, 33), + (232, 151, 59), (227, 167, 105), (171, 177, 165), (107, 208, 202), + (98, 229, 239), (49, 228, 232), (48, 229, 227), (47, 231, 223), + (46, 229, 233), (49, 235, 234), (43, 242, 209), (29, 223, 223), + (20, 100, 241), (31, 99, 238), (42, 98, 235), (45, 81, 231), + (60, 68, 228), (67, 59, 220), (70, 34, 218), (52, 22, 204), + (60, 14, 226), (86, 36, 223), (79, 72, 228), (96, 102, 222), + (125, 134, 175), (150, 124, 127), (107, 76, 133), (134, 29, 113), + (164, 69, 137), (150, 89, 156), (136, 110, 175), (116, 129, 199), + (83, 160, 216), (86, 191, 212), (54, 201, 217), (57, 199, 209), + (48, 141, 175), (51, 119, 154), (38, 45, 133), (37, 10, 139), + (59, 59, 155), (70, 95, 187), (80, 137, 227), (77, 115, 226), + (58, 91, 222), (48, 91, 222), (54, 110, 219), (50, 120, 231), + (44, 146, 231), (47, 195, 231), (43, 216, 188), (45, 196, 179), + (74, 173, 129), (63, 131, 74), (87, 137, 74), (119, 93, 78), + (117, 90, 61), (102, 86, 73), (118, 105, 112), (83, 130, 136), + (109, 106, 223), (139, 99, 224), (137, 108, 226), (137, 123, 221), + (122, 144, 219), (94, 201, 209), (80, 215, 219), (60, 217, 236), + (45, 204, 236), (42, 196, 234), (60, 154, 218), (71, 108, 223), + (79, 47, 220), (102, 32, 218), (113, 55, 225), (134, 86, 206), + (173, 118, 137), (194, 137, 120), (203, 142, 137), (160, 135, 174), + (166, 156, 225), (145, 152, 222), (123, 105, 239), (93, 109, 230), + (97, 106, 235), (125, 103, 237), (140, 85, 231), (144, 84, 232), + (134, 74, 232), (147, 74, 241), (148, 76, 238), (147, 69, 231), + (130, 50, 223), (128, 39, 193), (150, 19, 151), (167, 21, 86), + (203, 48, 43), (171, 49, 0), (144, 84, 21), (45, 214, 61) + ), + +// 343 4u0009b.jpg +((28, 89, 30), (31, 44, 27), (27, 62, 21), (24, 80, 15), + (32, 85, 20), (41, 90, 25), (33, 87, 29), (25, 85, 33), + (19, 69, 6), (20, 71, 3), (21, 73, 1), (15, 79, 2), + (9, 86, 4), (5, 91, 14), (1, 97, 25), (6, 100, 26), + (11, 103, 28), (4, 88, 54), (21, 95, 57), (38, 103, 60), + (39, 107, 69), (40, 111, 79), (38, 114, 82), (37, 118, 86), + (41, 132, 115), (54, 137, 122), (68, 142, 129), (85, 146, 128), + (103, 151, 127), (116, 162, 137), (129, 173, 148), (150, 186, 158), + (155, 179, 155), (139, 169, 135), (124, 156, 129), (110, 143, 124), + (101, 142, 119), (92, 142, 115), (88, 141, 116), (85, 140, 117), + (57, 139, 127), (67, 153, 138), (77, 168, 150), (72, 160, 147), + (67, 153, 144), (63, 151, 142), (59, 149, 140), (52, 142, 130), + (42, 140, 127), (38, 117, 88), (42, 119, 90), (47, 122, 92), + (60, 132, 108), (74, 143, 125), (83, 153, 137), (92, 163, 149), + (155, 205, 194), (169, 212, 203), (184, 219, 213), (172, 226, 218), + (160, 233, 224), (154, 232, 223), (148, 231, 223), (178, 234, 223), + (204, 238, 240), (209, 228, 234), (190, 219, 221), (172, 211, 208), + (167, 204, 200), (162, 197, 193), (151, 182, 164), (149, 172, 146), + (114, 158, 122), (102, 147, 111), (90, 136, 100), (90, 136, 100), + (90, 136, 100), (88, 142, 100), (86, 148, 101), (86, 154, 97), + (88, 152, 92), (105, 143, 94), (104, 144, 104), (104, 145, 115), + (111, 150, 118), (119, 156, 122), (123, 160, 129), (108, 154, 128), + (83, 138, 115), (69, 138, 106), (56, 139, 97), (58, 129, 92), + (60, 119, 87), (46, 107, 74), (40, 103, 60), (35, 103, 54), + (34, 117, 49), (34, 131, 114), (47, 139, 126), (61, 148, 139), + (70, 157, 144), (79, 166, 149), (93, 176, 148), (107, 182, 149), + (120, 191, 159), (118, 189, 158), (116, 187, 157), (112, 185, 159), + (109, 184, 161), (104, 178, 145), (102, 174, 137), (104, 178, 141), + (113, 178, 146), (121, 163, 143), (123, 164, 143), (126, 165, 144), + (125, 164, 137), (110, 153, 125), (98, 149, 118), (94, 147, 127), + (116, 184, 147), (133, 199, 171), (150, 215, 195), (153, 221, 205), + (157, 227, 216), (147, 219, 207), (129, 202, 182), (133, 197, 162), + (125, 190, 150), (110, 168, 120), (104, 165, 114), (98, 163, 109), + (83, 156, 101), (82, 146, 96), (81, 148, 95), (73, 141, 80), + (37, 108, 42), (42, 105, 44), (47, 102, 47), (54, 108, 52), + (61, 114, 58), (61, 113, 65), (68, 120, 81), (79, 129, 94), + (76, 139, 110), (47, 123, 95), (37, 115, 83), (27, 107, 72), + (20, 102, 66), (22, 91, 60), (20, 92, 52), (46, 105, 57), + (79, 121, 73), (83, 122, 68), (88, 124, 63), (77, 136, 68), + (73, 132, 68), (66, 122, 51), (64, 123, 57), (63, 119, 80), + (52, 125, 96), (68, 144, 132), (77, 149, 141), (86, 155, 150), + (109, 164, 159), (119, 174, 177), (124, 175, 176), (130, 177, 169), + (124, 174, 171), (119, 174, 173), (115, 175, 175), (99, 167, 166), + (95, 164, 161), (80, 155, 150), (76, 149, 142), (63, 147, 134), + (51, 141, 129), (63, 137, 120), (75, 139, 104), (77, 139, 102), + (81, 131, 94), (83, 131, 81), (72, 121, 55), (48, 103, 48), + (57, 94, 25), (52, 97, 36), (48, 101, 47), (52, 114, 75), + (75, 129, 93), (83, 151, 104), (106, 164, 114), (123, 167, 150), + (140, 183, 176), (154, 196, 195), (165, 202, 208), (169, 210, 202), + (171, 214, 195), (175, 220, 197), (169, 211, 201), (151, 206, 177), + (134, 204, 178), (126, 199, 172), (126, 197, 167), (133, 194, 163), + (134, 181, 171), (133, 180, 174), (135, 180, 173), (137, 186, 165), + (153, 192, 163), (162, 192, 166), (170, 206, 178), (152, 189, 182), + (156, 195, 164), (154, 186, 162), (139, 174, 154), (140, 174, 149), + (135, 169, 144), (135, 167, 146), (126, 165, 144), (108, 167, 147), + (103, 170, 137), (100, 173, 144), (88, 159, 155), (84, 154, 146), + (78, 147, 126), (89, 142, 122), (84, 143, 115), (90, 146, 117), + (100, 149, 119), (104, 148, 133), (106, 163, 144), (115, 170, 164), + (120, 174, 174), (129, 179, 176), (133, 185, 183), (136, 195, 163), + (132, 193, 159), (134, 191, 158), (135, 178, 169), (133, 173, 162), + (121, 181, 153), (118, 186, 149), (118, 189, 157), (115, 191, 165), + (100, 191, 176), (103, 169, 167), (99, 165, 163), (86, 172, 147), + (87, 174, 140), (90, 168, 128), (94, 166, 116), (87, 151, 117), + (79, 136, 117), (56, 131, 111), (14, 107, 76), (28, 118, 93) + ), + +// 344 4u0010.jpg +((59, 175, 174), (32, 163, 173), (46, 171, 173), (61, 180, 174), + (117, 181, 159), (174, 182, 145), (165, 156, 98), (156, 131, 51), + (224, 97, 44), (205, 59, 59), (186, 22, 75), (180, 14, 84), + (174, 6, 94), (178, 28, 110), (182, 50, 126), (177, 60, 149), + (172, 71, 173), (95, 106, 185), (73, 89, 178), (52, 72, 171), + (65, 47, 124), (79, 22, 77), (82, 42, 87), (86, 62, 98), + (20, 103, 143), (18, 97, 160), (17, 91, 178), (11, 82, 179), + (5, 73, 180), (11, 65, 172), (17, 58, 164), (26, 45, 140), + (48, 51, 166), (47, 66, 168), (78, 93, 176), (109, 120, 184), + (143, 113, 184), (178, 107, 185), (160, 78, 174), (143, 50, 164), + (90, 54, 152), (67, 74, 163), (44, 95, 174), (31, 138, 163), + (18, 181, 152), (13, 197, 148), (8, 213, 144), (39, 144, 130), + (61, 103, 127), (50, 81, 187), (44, 111, 210), (38, 141, 234), + (42, 136, 232), (46, 132, 231), (44, 119, 208), (43, 106, 186), + (16, 97, 186), (22, 84, 181), (29, 72, 177), (35, 81, 180), + (42, 91, 183), (45, 96, 179), (48, 102, 176), (54, 106, 181), + (41, 105, 179), (12, 110, 207), (34, 108, 204), (56, 106, 201), + (75, 114, 205), (95, 122, 209), (147, 135, 199), (179, 151, 192), + (174, 147, 190), (146, 106, 196), (119, 65, 202), (103, 51, 202), + (88, 37, 202), (88, 25, 198), (88, 13, 194), (96, 6, 199), + (78, 7, 205), (97, 23, 204), (112, 21, 219), (128, 19, 234), + (147, 11, 237), (166, 3, 240), (189, 8, 247), (168, 32, 228), + (135, 69, 195), (116, 84, 195), (97, 100, 195), (98, 86, 194), + (100, 72, 193), (81, 53, 172), (68, 53, 170), (56, 41, 168), + (50, 52, 187), (50, 85, 201), (33, 79, 191), (16, 74, 181), + (24, 60, 181), (32, 46, 181), (45, 35, 157), (55, 41, 176), + (51, 114, 185), (45, 136, 185), (40, 158, 186), (48, 146, 179), + (56, 134, 173), (77, 91, 196), (67, 75, 174), (49, 62, 192), + (33, 51, 197), (75, 12, 241), (79, 21, 243), (83, 30, 245), + (103, 54, 242), (107, 22, 201), (106, 23, 177), (110, 8, 110), + (135, 6, 96), (173, 5, 89), (212, 5, 83), (215, 5, 84), + (219, 6, 86), (211, 10, 78), (201, 22, 90), (203, 25, 121), + (222, 52, 115), (206, 84, 135), (191, 99, 146), (176, 115, 157), + (176, 137, 194), (157, 125, 188), (130, 82, 182), (117, 46, 148), + (65, 4, 107), (104, 10, 89), (144, 17, 72), (150, 17, 75), + (157, 17, 78), (135, 56, 101), (121, 32, 114), (116, 24, 125), + (105, 41, 155), (103, 51, 162), (88, 59, 166), (74, 67, 171), + (52, 81, 181), (56, 87, 195), (40, 65, 183), (37, 79, 177), + (34, 86, 222), (40, 95, 233), (47, 104, 245), (69, 96, 239), + (76, 52, 200), (78, 18, 202), (93, 19, 194), (109, 24, 190), + (134, 24, 211), (189, 15, 148), (176, 16, 132), (164, 18, 117), + (130, 26, 147), (137, 30, 162), (109, 36, 187), (114, 62, 207), + (112, 80, 207), (111, 74, 201), (111, 69, 195), (125, 67, 188), + (167, 96, 190), (177, 100, 202), (161, 105, 202), (170, 112, 189), + (189, 96, 167), (156, 56, 116), (170, 20, 84), (168, 5, 96), + (172, 16, 99), (146, 23, 127), (115, 40, 143), (105, 55, 150), + (65, 48, 178), (56, 45, 189), (47, 43, 200), (52, 17, 207), + (70, 23, 199), (69, 33, 191), (83, 23, 181), (57, 8, 151), + (56, 18, 139), (86, 22, 142), (86, 52, 162), (48, 31, 169), + (18, 9, 186), (18, 19, 205), (17, 18, 194), (22, 33, 183), + (28, 56, 189), (15, 60, 187), (1, 67, 179), (13, 30, 134), + (49, 33, 142), (92, 30, 129), (158, 30, 127), (201, 85, 134), + (220, 145, 105), (227, 166, 83), (225, 163, 90), (176, 171, 175), + (133, 184, 153), (90, 140, 189), (58, 146, 196), (57, 123, 209), + (58, 89, 197), (30, 95, 187), (30, 91, 182), (32, 61, 191), + (14, 75, 200), (26, 73, 251), (14, 26, 234), (46, 58, 206), + (82, 96, 203), (86, 102, 200), (61, 147, 180), (69, 166, 182), + (73, 149, 175), (83, 138, 192), (127, 116, 192), (157, 101, 200), + (134, 91, 206), (126, 101, 205), (102, 103, 196), (92, 117, 197), + (114, 132, 198), (135, 157, 198), (98, 158, 159), (60, 167, 137), + (97, 134, 142), (113, 70, 159), (144, 79, 61), (218, 113, 58), + (234, 127, 33), (218, 124, 60), (207, 143, 55), (217, 159, 60), + (228, 148, 77), (193, 70, 114), (178, 31, 111), (149, 81, 130), + (136, 119, 112), (91, 195, 108), (74, 230, 133), (13, 202, 134) + ), + +// 345 4u0011.jpg +((21, 14, 144), (4, 49, 130), (7, 53, 131), (10, 58, 132), + (16, 44, 143), (23, 31, 155), (23, 38, 151), (24, 46, 148), + (20, 66, 116), (22, 79, 97), (25, 93, 78), (62, 107, 67), + (100, 122, 57), (132, 101, 35), (164, 81, 13), (163, 79, 14), + (162, 78, 16), (147, 42, 13), (138, 29, 8), (130, 17, 3), + (109, 21, 22), (88, 25, 42), (82, 28, 46), (76, 31, 51), + (51, 20, 36), (68, 28, 30), (86, 36, 25), (121, 39, 15), + (157, 43, 6), (164, 44, 9), (172, 45, 12), (171, 64, 22), + (150, 52, 15), (73, 20, 16), (41, 33, 10), (9, 46, 5), + (20, 56, 9), (32, 67, 13), (56, 53, 13), (80, 40, 14), + (112, 51, 20), (119, 90, 33), (126, 130, 46), (105, 130, 36), + (85, 130, 27), (65, 109, 29), (45, 88, 32), (50, 111, 78), + (28, 97, 79), (35, 108, 97), (27, 97, 128), (19, 87, 160), + (20, 63, 168), (22, 40, 176), (23, 37, 174), (25, 34, 173), + (7, 71, 145), (12, 84, 107), (18, 98, 69), (26, 92, 57), + (35, 86, 45), (43, 89, 26), (51, 93, 7), (83, 122, 3), + (50, 160, 27), (66, 152, 15), (70, 150, 10), (74, 149, 5), + (100, 179, 15), (126, 210, 26), (151, 196, 69), (162, 207, 80), + (110, 105, 101), (94, 90, 111), (78, 75, 122), (78, 72, 117), + (78, 69, 112), (80, 60, 115), (82, 51, 119), (66, 44, 119), + (59, 39, 138), (42, 39, 152), (33, 32, 161), (24, 26, 171), + (22, 21, 168), (20, 16, 165), (11, 28, 158), (21, 24, 155), + (17, 9, 130), (30, 7, 115), (43, 6, 101), (50, 3, 85), + (57, 0, 69), (40, 2, 41), (29, 17, 31), (35, 28, 44), + (65, 24, 40), (40, 25, 90), (39, 28, 113), (38, 31, 137), + (73, 19, 134), (109, 7, 132), (139, 21, 117), (199, 29, 58), + (201, 26, 31), (187, 34, 23), (174, 43, 15), (172, 42, 17), + (170, 41, 19), (131, 36, 44), (98, 70, 58), (81, 70, 100), + (62, 60, 107), (14, 25, 133), (12, 16, 132), (10, 8, 131), + (0, 5, 155), (15, 13, 184), (19, 26, 176), (24, 34, 157), + (52, 51, 111), (70, 44, 73), (88, 37, 36), (103, 41, 28), + (119, 45, 20), (170, 51, 17), (170, 50, 13), (183, 53, 3), + (200, 59, 13), (182, 72, 21), (176, 75, 13), (170, 79, 6), + (142, 110, 7), (101, 150, 7), (132, 170, 5), (131, 152, 13), + (174, 106, 25), (189, 90, 28), (205, 74, 32), (201, 59, 20), + (197, 45, 8), (173, 0, 2), (191, 22, 3), (204, 41, 6), + (199, 50, 7), (218, 147, 21), (196, 141, 27), (175, 136, 33), + (172, 172, 22), (144, 143, 17), (134, 105, 47), (130, 88, 90), + (170, 11, 140), (156, 14, 141), (143, 17, 143), (126, 25, 147), + (118, 28, 128), (96, 39, 94), (74, 41, 52), (75, 41, 39), + (53, 43, 16), (39, 45, 11), (32, 36, 12), (25, 27, 14), + (19, 30, 32), (24, 13, 30), (22, 6, 81), (8, 36, 86), + (17, 58, 148), (13, 58, 151), (9, 59, 154), (17, 101, 147), + (40, 126, 113), (84, 167, 33), (136, 159, 17), (168, 200, 57), + (185, 150, 34), (167, 110, 39), (164, 73, 16), (149, 38, 21), + (130, 16, 6), (107, 29, 25), (93, 37, 36), (90, 54, 42), + (73, 37, 98), (58, 30, 95), (44, 24, 93), (20, 17, 104), + (24, 27, 120), (30, 29, 123), (18, 31, 135), (35, 44, 135), + (34, 30, 150), (24, 30, 150), (29, 10, 136), (29, 17, 129), + (49, 34, 137), (61, 9, 143), (83, 24, 144), (114, 44, 116), + (136, 36, 48), (102, 40, 43), (101, 41, 41), (98, 33, 57), + (78, 37, 67), (58, 13, 80), (50, 5, 106), (37, 12, 96), + (48, 3, 86), (63, 6, 74), (56, 15, 83), (61, 26, 92), + (70, 36, 110), (55, 42, 114), (42, 58, 136), (35, 69, 132), + (43, 75, 152), (23, 89, 176), (7, 100, 195), (22, 77, 170), + (23, 58, 162), (16, 52, 162), (32, 52, 164), (40, 42, 155), + (60, 55, 149), (106, 23, 131), (128, 59, 150), (139, 59, 144), + (127, 89, 80), (132, 55, 25), (119, 50, 19), (107, 40, 34), + (83, 24, 52), (58, 30, 89), (49, 56, 108), (24, 64, 89), + (17, 49, 110), (25, 30, 96), (25, 10, 111), (20, 1, 126), + (21, 2, 128), (32, 16, 148), (22, 30, 154), (17, 47, 133), + (11, 45, 109), (10, 44, 72), (43, 32, 62), (53, 39, 54), + (46, 38, 77), (29, 60, 115), (25, 75, 110), (19, 77, 150), + (18, 111, 170), (19, 114, 182), (13, 103, 166), (18, 80, 157) + ), + +// 346 4u0012.jpg +((69, 55, 153), (50, 63, 141), (26, 70, 140), (3, 77, 140), + (13, 69, 146), (24, 61, 152), (35, 54, 158), (47, 48, 164), + (94, 44, 131), (83, 29, 115), (73, 15, 99), (56, 13, 97), + (40, 12, 96), (44, 24, 77), (48, 36, 58), (56, 31, 68), + (65, 27, 78), (80, 21, 77), (96, 16, 79), (113, 12, 82), + (111, 15, 110), (109, 18, 139), (102, 15, 147), (96, 13, 155), + (108, 31, 187), (108, 35, 170), (108, 40, 153), (107, 43, 185), + (106, 47, 217), (107, 59, 223), (108, 71, 229), (102, 70, 213), + (69, 69, 219), (63, 35, 207), (65, 32, 201), (67, 30, 195), + (58, 36, 192), (50, 42, 189), (57, 44, 187), (64, 47, 185), + (37, 40, 153), (54, 31, 142), (71, 22, 131), (79, 12, 127), + (87, 3, 124), (86, 3, 128), (86, 4, 132), (63, 17, 149), + (46, 10, 134), (65, 10, 101), (74, 6, 90), (84, 3, 79), + (79, 35, 72), (75, 67, 65), (64, 56, 67), (53, 45, 69), + (17, 58, 124), (25, 81, 149), (34, 104, 174), (73, 110, 199), + (112, 116, 224), (117, 123, 217), (122, 131, 210), (110, 117, 198), + (101, 96, 180), (66, 44, 181), (60, 29, 183), (54, 15, 186), + (56, 11, 188), (58, 8, 191), (60, 18, 166), (52, 19, 136), + (30, 16, 77), (25, 11, 70), (20, 7, 63), (17, 11, 63), + (15, 16, 64), (16, 17, 71), (17, 19, 78), (31, 38, 67), + (31, 55, 67), (12, 66, 113), (13, 60, 125), (14, 55, 137), + (18, 55, 150), (23, 56, 163), (48, 93, 186), (55, 113, 220), + (36, 114, 212), (33, 105, 217), (31, 96, 222), (30, 82, 219), + (29, 69, 216), (59, 26, 203), (64, 26, 199), (63, 19, 192), + (52, 40, 186), (24, 86, 161), (23, 100, 161), (23, 115, 162), + (31, 131, 184), (39, 148, 207), (72, 161, 221), (104, 173, 215), + (78, 148, 234), (64, 132, 216), (51, 116, 198), (39, 113, 176), + (28, 111, 155), (22, 104, 142), (6, 130, 182), (10, 140, 216), + (16, 135, 227), (44, 151, 223), (55, 138, 221), (66, 125, 219), + (71, 89, 171), (98, 63, 147), (100, 60, 113), (88, 44, 103), + (38, 45, 125), (29, 36, 127), (20, 28, 129), (10, 33, 124), + (0, 38, 120), (0, 16, 119), (0, 20, 111), (4, 33, 109), + (7, 47, 132), (16, 118, 133), (15, 112, 127), (14, 106, 121), + (27, 82, 138), (38, 62, 168), (50, 66, 164), (55, 90, 194), + (33, 108, 209), (18, 111, 184), (3, 114, 159), (6, 103, 150), + (10, 92, 142), (4, 58, 120), (4, 38, 109), (12, 30, 106), + (27, 22, 114), (60, 3, 160), (66, 6, 173), (73, 10, 187), + (56, 8, 182), (41, 16, 136), (31, 9, 107), (17, 8, 101), + (19, 14, 117), (17, 14, 114), (15, 15, 111), (7, 17, 102), + (11, 18, 99), (5, 2, 91), (3, 30, 77), (11, 28, 84), + (15, 34, 103), (23, 53, 143), (22, 58, 161), (22, 63, 179), + (50, 47, 186), (50, 49, 185), (65, 70, 174), (77, 43, 153), + (67, 18, 99), (69, 14, 88), (72, 10, 77), (75, 10, 74), + (63, 10, 66), (65, 24, 80), (34, 19, 100), (21, 24, 105), + (17, 24, 105), (27, 28, 92), (33, 22, 91), (25, 16, 83), + (16, 8, 91), (26, 12, 100), (36, 17, 96), (37, 23, 108), + (60, 21, 138), (53, 27, 143), (47, 34, 148), (34, 34, 134), + (20, 16, 136), (21, 49, 148), (10, 96, 145), (4, 112, 158), + (31, 137, 215), (68, 160, 235), (75, 147, 221), (63, 117, 217), + (97, 79, 225), (96, 107, 231), (109, 119, 240), (115, 138, 214), + (112, 140, 214), (114, 153, 210), (115, 160, 219), (109, 160, 203), + (109, 173, 211), (109, 170, 214), (110, 151, 207), (105, 147, 195), + (109, 128, 197), (119, 107, 193), (118, 58, 192), (110, 50, 164), + (95, 57, 160), (68, 76, 149), (49, 88, 165), (12, 95, 149), + (3, 95, 146), (11, 94, 144), (12, 56, 151), (22, 30, 175), + (53, 15, 180), (70, 16, 188), (89, 29, 213), (106, 26, 209), + (104, 11, 206), (101, 11, 205), (82, 21, 236), (83, 6, 234), + (70, 3, 223), (69, 16, 210), (86, 7, 186), (94, 6, 178), + (76, 14, 157), (114, 7, 147), (113, 14, 140), (94, 10, 88), + (62, 4, 65), (66, 2, 52), (59, 5, 54), (54, 12, 62), + (64, 7, 75), (72, 12, 108), (98, 7, 128), (110, 16, 140), + (89, 34, 138), (76, 43, 148), (53, 53, 151), (34, 44, 141), + (23, 53, 125), (30, 37, 125), (32, 42, 131), (34, 48, 153), + (47, 67, 164), (81, 81, 167), (111, 118, 208), (113, 105, 208) + ), + +// 347 4u0013.jpg +((123, 95, 81), (157, 143, 46), (173, 172, 56), (189, 201, 67), + (179, 195, 99), (170, 190, 131), (166, 190, 108), (163, 190, 85), + (176, 180, 43), (180, 173, 35), (184, 167, 27), (178, 157, 20), + (172, 148, 14), (165, 135, 20), (158, 122, 26), (158, 111, 30), + (158, 101, 34), (117, 85, 74), (97, 55, 72), (78, 25, 71), + (59, 15, 83), (41, 6, 96), (24, 26, 95), (8, 46, 95), + (44, 104, 105), (55, 109, 100), (66, 115, 96), (97, 101, 82), + (128, 87, 69), (135, 84, 75), (142, 82, 81), (129, 103, 76), + (117, 118, 86), (129, 154, 99), (141, 136, 90), (153, 119, 82), + (138, 98, 63), (123, 78, 45), (118, 77, 39), (114, 77, 33), + (84, 67, 24), (96, 73, 25), (109, 79, 27), (112, 83, 37), + (116, 88, 48), (124, 92, 39), (132, 97, 31), (154, 103, 37), + (158, 100, 37), (155, 110, 9), (158, 126, 19), (162, 142, 29), + (168, 154, 39), (174, 167, 50), (176, 170, 49), (178, 174, 48), + (187, 181, 45), (188, 185, 43), (190, 190, 42), (192, 196, 54), + (195, 203, 66), (197, 198, 73), (200, 194, 80), (188, 217, 91), + (175, 210, 110), (163, 226, 112), (166, 224, 104), (170, 222, 96), + (186, 223, 94), (202, 225, 93), (208, 221, 79), (208, 219, 78), + (198, 199, 59), (195, 191, 47), (193, 183, 36), (183, 161, 36), + (174, 139, 37), (167, 128, 38), (160, 117, 39), (147, 106, 60), + (132, 83, 50), (137, 67, 41), (139, 70, 51), (142, 74, 61), + (145, 75, 56), (148, 76, 52), (143, 78, 46), (140, 85, 31), + (134, 82, 0), (129, 86, 0), (125, 91, 0), (122, 87, 0), + (119, 83, 0), (113, 76, 5), (121, 65, 6), (134, 78, 3), + (141, 99, 13), (173, 145, 2), (178, 156, 11), (183, 167, 20), + (174, 165, 22), (165, 164, 24), (175, 149, 26), (173, 148, 29), + (148, 121, 4), (135, 108, 4), (123, 96, 5), (123, 91, 16), + (123, 87, 27), (115, 82, 37), (127, 81, 22), (148, 101, 31), + (160, 128, 25), (188, 178, 44), (191, 185, 46), (195, 192, 49), + (194, 207, 65), (195, 214, 72), (202, 211, 70), (201, 204, 65), + (216, 206, 72), (205, 211, 77), (194, 216, 82), (176, 210, 86), + (158, 205, 91), (132, 194, 109), (109, 173, 138), (66, 159, 149), + (71, 171, 99), (96, 134, 93), (85, 135, 78), (74, 136, 63), + (102, 117, 36), (112, 112, 26), (124, 96, 22), (151, 109, 11), + (171, 134, 2), (175, 145, 8), (180, 157, 15), (173, 157, 24), + (167, 157, 33), (166, 164, 55), (160, 172, 64), (150, 173, 65), + (136, 166, 70), (124, 154, 64), (133, 163, 68), (143, 173, 73), + (168, 196, 75), (157, 209, 85), (162, 217, 87), (158, 217, 89), + (158, 211, 97), (150, 197, 93), (143, 184, 90), (129, 160, 90), + (125, 132, 65), (133, 106, 27), (144, 105, 30), (144, 111, 40), + (152, 99, 45), (159, 123, 39), (151, 131, 35), (143, 139, 32), + (116, 125, 42), (124, 112, 36), (106, 96, 34), (77, 89, 27), + (95, 59, 11), (92, 59, 5), (89, 59, 0), (98, 66, 0), + (119, 56, 0), (124, 76, 14), (126, 83, 15), (105, 76, 16), + (70, 53, 9), (61, 20, 24), (71, 26, 67), (36, 36, 98), + (3, 50, 104), (22, 83, 78), (50, 50, 26), (66, 62, 25), + (82, 82, 20), (97, 86, 22), (112, 91, 24), (126, 98, 24), + (120, 110, 23), (105, 118, 36), (98, 116, 40), (102, 128, 63), + (107, 128, 53), (128, 139, 37), (124, 130, 22), (145, 116, 24), + (149, 108, 18), (142, 104, 21), (130, 96, 32), (112, 98, 59), + (71, 81, 70), (54, 104, 92), (56, 124, 73), (45, 116, 102), + (35, 110, 90), (4, 77, 96), (3, 46, 91), (11, 40, 80), + (43, 11, 74), (35, 41, 37), (12, 58, 47), (9, 23, 23), + (43, 13, 13), (48, 42, 10), (59, 58, 1), (63, 57, 21), + (86, 56, 32), (98, 64, 37), (104, 76, 26), (106, 86, 25), + (100, 113, 7), (100, 124, 2), (132, 167, 21), (159, 174, 47), + (181, 201, 68), (168, 215, 85), (166, 218, 94), (168, 220, 96), + (166, 217, 86), (182, 203, 74), (189, 203, 64), (185, 188, 55), + (174, 168, 30), (177, 140, 10), (160, 110, 11), (146, 96, 23), + (131, 72, 38), (125, 56, 41), (109, 68, 48), (121, 74, 46), + (123, 72, 45), (135, 83, 70), (123, 103, 79), (108, 122, 86), + (112, 147, 83), (131, 165, 81), (140, 171, 95), (145, 193, 94), + (134, 220, 109), (130, 184, 108), (112, 192, 95), (110, 163, 107), + (121, 157, 87), (132, 159, 88), (191, 140, 61), (160, 152, 71) + ), + +// 348 4u0019.jpg +((147, 37, 36), (156, 76, 15), (148, 97, 14), (141, 118, 14), + (134, 89, 7), (127, 61, 0), (134, 67, 2), (142, 73, 4), + (140, 115, 31), (117, 134, 66), (94, 154, 102), (84, 156, 107), + (75, 158, 112), (81, 155, 116), (88, 153, 121), (88, 153, 120), + (89, 153, 119), (158, 80, 67), (157, 73, 48), (157, 67, 30), + (136, 95, 45), (115, 124, 61), (107, 130, 64), (99, 136, 67), + (111, 145, 95), (137, 137, 67), (164, 130, 40), (165, 96, 24), + (166, 62, 9), (171, 64, 11), (177, 67, 14), (180, 85, 27), + (162, 102, 52), (123, 128, 87), (112, 115, 104), (101, 102, 122), + (74, 90, 127), (48, 79, 133), (40, 74, 140), (32, 69, 147), + (23, 123, 159), (26, 135, 165), (29, 148, 172), (43, 154, 185), + (57, 161, 198), (64, 141, 180), (72, 121, 162), (91, 115, 125), + (101, 92, 93), (147, 21, 24), (146, 13, 19), (146, 6, 15), + (144, 14, 9), (143, 22, 3), (141, 28, 2), (139, 34, 2), + (126, 26, 24), (128, 23, 21), (130, 20, 19), (133, 20, 11), + (136, 21, 3), (140, 23, 2), (145, 25, 1), (138, 23, 0), + (124, 24, 1), (136, 43, 12), (147, 45, 9), (159, 47, 7), + (153, 40, 5), (147, 34, 4), (146, 31, 4), (138, 23, 4), + (105, 3, 16), (89, 4, 18), (74, 6, 21), (40, 3, 22), + (6, 1, 24), (3, 0, 27), (0, 0, 30), (2, 26, 28), + (29, 38, 47), (51, 50, 45), (37, 40, 35), (24, 30, 26), + (22, 23, 28), (21, 17, 31), (3, 14, 32), (13, 22, 21), + (87, 42, 37), (115, 57, 28), (144, 73, 19), (150, 80, 19), + (156, 87, 20), (149, 92, 5), (149, 94, 3), (136, 77, 7), + (150, 71, 12), (158, 85, 6), (157, 76, 10), (157, 67, 15), + (160, 59, 13), (164, 52, 12), (145, 43, 28), (129, 43, 26), + (91, 43, 59), (71, 55, 85), (51, 68, 111), (55, 63, 105), + (60, 59, 99), (86, 58, 83), (103, 70, 65), (128, 69, 53), + (139, 58, 57), (144, 65, 34), (132, 72, 35), (121, 79, 37), + (96, 68, 21), (115, 81, 33), (107, 71, 73), (107, 96, 92), + (150, 94, 67), (168, 81, 55), (187, 68, 44), (182, 61, 41), + (177, 54, 38), (165, 55, 18), (156, 49, 13), (131, 55, 3), + (100, 43, 23), (20, 14, 52), (18, 12, 54), (17, 11, 57), + (24, 12, 58), (22, 23, 69), (37, 30, 71), (67, 67, 79), + (62, 141, 110), (89, 131, 98), (117, 121, 86), (112, 109, 81), + (108, 97, 77), (108, 77, 57), (102, 55, 47), (73, 37, 49), + (57, 36, 93), (29, 33, 96), (26, 36, 90), (23, 40, 84), + (22, 30, 77), (70, 49, 64), (97, 63, 53), (117, 40, 46), + (141, 46, 26), (141, 50, 28), (142, 54, 30), (140, 53, 26), + (145, 60, 6), (139, 55, 9), (135, 48, 20), (138, 41, 24), + (127, 50, 30), (112, 37, 41), (116, 38, 38), (121, 40, 36), + (124, 42, 21), (122, 26, 27), (129, 5, 15), (119, 7, 19), + (81, 14, 6), (64, 15, 6), (47, 17, 6), (57, 38, 23), + (67, 34, 15), (90, 46, 21), (112, 56, 0), (133, 56, 2), + (139, 49, 0), (142, 50, 1), (154, 33, 6), (150, 25, 7), + (142, 18, 8), (137, 17, 16), (136, 19, 25), (139, 17, 32), + (117, 59, 107), (100, 76, 103), (84, 93, 100), (72, 142, 118), + (46, 122, 146), (6, 86, 159), (19, 82, 135), (28, 71, 88), + (22, 62, 87), (31, 41, 68), (39, 57, 71), (51, 65, 78), + (64, 74, 99), (61, 96, 116), (58, 112, 124), (85, 103, 115), + (121, 97, 85), (155, 93, 56), (161, 46, 41), (169, 59, 22), + (184, 47, 13), (203, 25, 11), (161, 31, 9), (155, 42, 12), + (135, 31, 38), (117, 40, 56), (81, 65, 65), (81, 79, 90), + (60, 111, 115), (57, 115, 155), (28, 93, 135), (25, 40, 131), + (37, 37, 127), (88, 40, 116), (110, 45, 49), (108, 26, 30), + (105, 14, 21), (96, 9, 28), (84, 7, 25), (78, 18, 17), + (70, 22, 48), (49, 22, 63), (14, 31, 57), (12, 41, 83), + (11, 66, 105), (0, 138, 135), (5, 135, 185), (5, 134, 192), + (25, 146, 157), (3, 156, 135), (25, 159, 152), (36, 116, 167), + (55, 94, 159), (63, 70, 99), (68, 70, 69), (81, 62, 29), + (56, 39, 21), (25, 9, 9), (15, 21, 11), (44, 35, 6), + (78, 36, 0), (120, 27, 9), (147, 18, 22), (159, 20, 27), + (161, 4, 15), (147, 2, 9), (144, 16, 17), (138, 32, 10), + (135, 51, 7), (138, 66, 18), (143, 97, 37), (145, 92, 24) + ), + +// 349 4u0022.jpg +((112, 56, 57), (71, 75, 52), (84, 91, 62), (97, 107, 73), + (104, 87, 67), (112, 67, 61), (105, 56, 62), (99, 46, 64), + (75, 21, 34), (56, 25, 24), (38, 29, 14), (23, 34, 10), + (8, 39, 7), (25, 40, 3), (42, 41, 0), (53, 42, 7), + (64, 43, 14), (92, 34, 33), (103, 24, 27), (114, 14, 22), + (117, 30, 31), (120, 47, 41), (113, 54, 50), (107, 62, 59), + (115, 83, 70), (118, 111, 82), (121, 140, 95), (120, 112, 103), + (119, 85, 112), (123, 86, 115), (127, 88, 119), (150, 71, 92), + (182, 85, 104), (199, 104, 100), (182, 87, 89), (165, 70, 78), + (162, 57, 65), (160, 44, 53), (152, 33, 43), (145, 23, 34), + (75, 4, 2), (75, 9, 8), (76, 14, 15), (88, 24, 23), + (100, 35, 31), (105, 48, 25), (110, 61, 20), (119, 27, 28), + (122, 15, 33), (153, 15, 40), (143, 28, 48), (133, 42, 57), + (122, 62, 49), (112, 83, 41), (106, 81, 36), (100, 79, 32), + (77, 47, 9), (66, 54, 14), (55, 62, 20), (68, 68, 15), + (82, 74, 11), (95, 78, 30), (109, 83, 50), (139, 70, 63), + (159, 59, 71), (185, 32, 62), (176, 35, 72), (168, 38, 82), + (164, 38, 81), (161, 39, 80), (166, 46, 71), (154, 46, 59), + (113, 70, 28), (82, 71, 20), (52, 72, 13), (57, 78, 29), + (63, 84, 45), (67, 79, 48), (72, 74, 52), (101, 76, 54), + (129, 78, 61), (157, 66, 81), (167, 90, 86), (177, 115, 92), + (181, 152, 107), (186, 189, 122), (174, 218, 123), (160, 154, 96), + (168, 99, 84), (156, 88, 68), (144, 78, 52), (136, 58, 53), + (129, 38, 55), (116, 39, 49), (107, 22, 29), (115, 6, 12), + (114, 2, 16), (99, 4, 28), (94, 4, 29), (89, 5, 31), + (97, 6, 39), (105, 7, 48), (107, 12, 42), (114, 5, 37), + (123, 9, 9), (130, 16, 8), (137, 24, 8), (136, 18, 14), + (136, 12, 20), (138, 14, 24), (137, 13, 23), (131, 14, 23), + (132, 16, 25), (119, 11, 37), (127, 8, 42), (136, 5, 47), + (140, 10, 44), (129, 33, 71), (150, 40, 75), (134, 50, 65), + (116, 45, 77), (115, 26, 69), (114, 7, 61), (109, 5, 58), + (104, 4, 56), (97, 15, 51), (94, 15, 44), (86, 23, 40), + (93, 33, 41), (96, 48, 48), (88, 52, 42), (81, 56, 36), + (50, 61, 29), (27, 58, 17), (19, 64, 5), (6, 73, 4), + (24, 47, 29), (27, 26, 37), (31, 6, 45), (27, 8, 40), + (23, 11, 35), (14, 18, 19), (18, 21, 26), (49, 32, 22), + (69, 24, 18), (99, 8, 13), (101, 9, 10), (104, 10, 8), + (107, 6, 10), (127, 16, 22), (141, 14, 35), (153, 35, 49), + (147, 74, 67), (147, 88, 74), (147, 102, 81), (129, 152, 72), + (131, 141, 68), (116, 98, 62), (137, 76, 73), (149, 77, 81), + (161, 96, 78), (155, 89, 73), (143, 81, 81), (132, 74, 89), + (117, 45, 82), (78, 63, 68), (58, 63, 40), (39, 21, 33), + (11, 8, 17), (7, 5, 16), (3, 2, 16), (7, 10, 19), + (19, 5, 20), (33, 21, 21), (45, 17, 31), (73, 8, 40), + (74, 7, 40), (66, 7, 37), (70, 22, 34), (72, 46, 55), + (82, 48, 36), (109, 37, 51), (112, 33, 62), (115, 17, 58), + (91, 13, 37), (84, 16, 39), (78, 19, 41), (59, 18, 34), + (50, 33, 25), (26, 62, 24), (12, 83, 43), (22, 70, 54), + (8, 40, 55), (35, 23, 45), (41, 15, 42), (33, 16, 50), + (43, 10, 67), (33, 3, 55), (46, 6, 43), (64, 6, 21), + (64, 7, 13), (65, 5, 17), (71, 5, 33), (75, 3, 43), + (72, 2, 54), (74, 15, 47), (72, 28, 45), (80, 36, 49), + (70, 33, 85), (67, 53, 88), (83, 87, 90), (76, 58, 82), + (94, 25, 82), (123, 17, 55), (125, 4, 58), (125, 5, 50), + (116, 10, 50), (112, 16, 44), (105, 23, 27), (103, 21, 25), + (94, 18, 28), (86, 17, 20), (88, 18, 16), (87, 29, 9), + (87, 30, 10), (81, 34, 4), (68, 35, 2), (60, 28, 13), + (52, 16, 4), (44, 24, 15), (36, 39, 10), (26, 41, 22), + (25, 33, 22), (50, 33, 26), (74, 20, 36), (87, 26, 44), + (94, 23, 55), (100, 16, 50), (97, 16, 33), (77, 15, 30), + (73, 26, 20), (77, 32, 11), (86, 48, 29), (122, 58, 48), + (128, 76, 55), (139, 74, 68), (126, 64, 53), (118, 48, 46), + (124, 31, 14), (114, 17, 0), (104, 15, 1), (104, 26, 14), + (100, 34, 22), (87, 39, 1), (70, 58, 0), (78, 47, 3) + ), + +// 350 k2u0217.jpg +((62, 139, 107), (12, 96, 96), (16, 109, 112), (20, 123, 128), + (77, 126, 147), (134, 130, 167), (187, 125, 178), (240, 121, 189), + (234, 89, 190), (174, 69, 198), (114, 50, 207), (96, 29, 157), + (79, 9, 108), (91, 10, 94), (103, 12, 81), (115, 12, 92), + (127, 12, 103), (233, 70, 117), (233, 68, 87), (234, 66, 57), + (233, 70, 68), (233, 74, 79), (201, 75, 91), (170, 76, 103), + (64, 24, 33), (37, 21, 16), (11, 18, 0), (5, 18, 1), + (0, 18, 2), (0, 16, 7), (0, 15, 12), (0, 2, 21), + (6, 6, 32), (42, 10, 93), (80, 12, 101), (118, 14, 109), + (170, 57, 138), (223, 100, 167), (231, 107, 176), (239, 115, 185), + (243, 144, 164), (241, 133, 148), (240, 123, 132), (235, 86, 85), + (231, 49, 38), (230, 48, 35), (230, 47, 33), (228, 44, 32), + (228, 20, 20), (77, 11, 38), (55, 5, 29), (34, 0, 21), + (24, 9, 11), (14, 18, 1), (8, 27, 2), (2, 37, 4), + (35, 138, 57), (92, 142, 101), (150, 146, 145), (195, 133, 160), + (240, 121, 175), (240, 120, 182), (241, 120, 189), (240, 108, 194), + (238, 99, 182), (233, 66, 156), (211, 45, 162), (190, 24, 168), + (170, 21, 155), (151, 18, 143), (115, 36, 128), (75, 32, 150), + (122, 122, 192), (176, 128, 217), (231, 135, 243), (240, 169, 241), + (250, 204, 240), (250, 205, 240), (250, 206, 241), (249, 205, 240), + (247, 189, 230), (242, 151, 212), (237, 94, 202), (233, 38, 192), + (231, 38, 193), (230, 39, 194), (202, 25, 194), (193, 28, 193), + (134, 16, 130), (110, 13, 106), (87, 10, 82), (75, 9, 75), + (63, 9, 69), (53, 9, 58), (65, 4, 63), (68, 14, 66), + (73, 10, 67), (88, 7, 63), (105, 14, 82), (123, 22, 102), + (142, 19, 119), (162, 17, 136), (220, 72, 124), (237, 98, 95), + (231, 65, 103), (232, 52, 122), (234, 39, 141), (232, 33, 144), + (231, 27, 148), (230, 28, 150), (231, 26, 155), (230, 28, 150), + (230, 29, 145), (233, 53, 186), (232, 60, 178), (232, 67, 171), + (235, 71, 166), (234, 76, 161), (248, 74, 145), (238, 93, 90), + (235, 86, 82), (203, 156, 72), (172, 227, 63), (165, 219, 51), + (158, 212, 40), (56, 117, 37), (84, 95, 55), (91, 12, 67), + (124, 11, 101), (200, 43, 174), (219, 70, 182), (239, 98, 190), + (242, 140, 203), (246, 166, 219), (248, 187, 229), (249, 192, 233), + (245, 171, 220), (244, 166, 205), (244, 161, 191), (245, 160, 190), + (246, 160, 189), (245, 159, 184), (247, 158, 186), (245, 156, 210), + (246, 179, 223), (244, 161, 215), (242, 150, 207), (241, 140, 200), + (234, 86, 180), (205, 43, 180), (159, 24, 144), (121, 14, 110), + (44, 17, 124), (39, 21, 101), (35, 26, 79), (43, 40, 51), + (42, 88, 42), (34, 103, 40), (32, 66, 42), (34, 22, 24), + (14, 22, 1), (5, 29, 29), (2, 27, 37), (0, 26, 46), + (2, 21, 79), (19, 11, 122), (14, 47, 142), (40, 27, 167), + (12, 84, 184), (20, 110, 196), (29, 136, 208), (16, 123, 179), + (35, 84, 142), (104, 32, 116), (132, 47, 150), (184, 21, 162), + (198, 21, 171), (230, 27, 168), (228, 34, 157), (230, 36, 159), + (232, 43, 172), (233, 56, 188), (238, 70, 215), (194, 71, 237), + (200, 33, 173), (184, 25, 159), (168, 17, 146), (127, 16, 108), + (122, 15, 97), (125, 11, 99), (126, 14, 114), (160, 26, 149), + (215, 52, 179), (239, 119, 193), (245, 167, 209), (248, 185, 228), + (244, 174, 224), (242, 151, 210), (238, 101, 183), (186, 47, 172), + (130, 37, 107), (73, 14, 60), (47, 7, 41), (34, 5, 35), + (35, 8, 25), (47, 33, 30), (36, 78, 12), (59, 87, 47), + (66, 43, 72), (66, 19, 71), (68, 19, 74), (102, 63, 110), + (67, 109, 97), (26, 74, 86), (4, 59, 79), (9, 60, 87), + (38, 12, 121), (48, 0, 106), (100, 21, 128), (159, 29, 151), + (199, 51, 171), (230, 100, 174), (240, 123, 191), (242, 142, 202), + (242, 153, 209), (242, 144, 203), (241, 124, 195), (238, 102, 178), + (235, 80, 174), (236, 79, 170), (236, 75, 169), (233, 71, 174), + (236, 67, 166), (234, 59, 152), (232, 55, 146), (233, 29, 160), + (218, 36, 155), (188, 21, 163), (127, 14, 118), (81, 11, 110), + (44, 20, 144), (21, 25, 148), (16, 46, 156), (16, 55, 150), + (31, 17, 114), (8, 28, 65), (10, 2, 17), (10, 0, 9), + (35, 1, 36), (47, 0, 60), (39, 13, 84), (37, 11, 72), + (5, 8, 59), (2, 13, 41), (11, 31, 56), (3, 86, 68) + ), + +// 351 ku0213.jpg +((50, 142, 0), (53, 168, 13), (108, 173, 6), (163, 179, 0), + (191, 158, 4), (219, 137, 9), (207, 134, 24), (195, 132, 39), + (184, 47, 127), (132, 51, 163), (81, 56, 200), (75, 61, 205), + (70, 67, 210), (62, 70, 203), (54, 74, 197), (64, 79, 171), + (75, 85, 146), (113, 71, 75), (97, 43, 104), (81, 16, 134), + (53, 8, 169), (25, 0, 204), (18, 0, 215), (12, 1, 227), + (57, 1, 184), (80, 8, 156), (104, 16, 128), (92, 20, 122), + (80, 25, 116), (78, 50, 118), (77, 76, 120), (39, 163, 137), + (63, 196, 105), (13, 226, 120), (6, 162, 165), (0, 99, 210), + (15, 100, 200), (30, 101, 191), (48, 94, 171), (67, 88, 151), + (108, 115, 47), (84, 82, 32), (60, 49, 17), (61, 50, 15), + (63, 51, 13), (92, 38, 16), (122, 25, 19), (171, 36, 43), + (182, 58, 56), (243, 14, 71), (249, 44, 53), (255, 74, 36), + (252, 116, 18), (249, 158, 0), (252, 139, 4), (255, 121, 9), + (238, 13, 0), (223, 24, 0), (209, 36, 0), (170, 45, 16), + (132, 54, 32), (122, 35, 51), (113, 16, 70), (107, 21, 30), + (83, 0, 29), (48, 0, 25), (43, 22, 27), (38, 45, 29), + (54, 49, 53), (71, 53, 77), (64, 41, 184), (71, 30, 228), + (56, 6, 243), (44, 3, 240), (33, 0, 238), (46, 15, 229), + (60, 31, 220), (66, 55, 225), (73, 80, 230), (29, 162, 218), + (106, 216, 207), (138, 201, 174), (138, 149, 182), (139, 98, 190), + (131, 89, 180), (123, 80, 170), (160, 83, 101), (178, 134, 87), + (189, 103, 80), (146, 87, 109), (103, 71, 138), (94, 62, 147), + (86, 53, 157), (58, 49, 194), (99, 63, 213), (121, 21, 239), + (127, 76, 207), (91, 36, 138), (78, 28, 111), (65, 21, 84), + (64, 17, 72), (63, 14, 61), (98, 4, 92), (130, 6, 76), + (174, 61, 67), (204, 113, 72), (235, 165, 77), (245, 185, 60), + (255, 206, 44), (234, 224, 49), (255, 253, 39), (235, 253, 9), + (240, 218, 34), (254, 181, 26), (253, 158, 23), (252, 135, 21), + (255, 75, 27), (251, 72, 32), (255, 46, 41), (248, 34, 36), + (206, 71, 67), (227, 47, 52), (248, 23, 37), (250, 13, 18), + (252, 3, 0), (254, 0, 8), (255, 4, 74), (243, 2, 81), + (209, 32, 112), (145, 100, 201), (127, 108, 216), (110, 117, 231), + (44, 184, 217), (32, 203, 187), (41, 254, 136), (66, 255, 129), + (74, 126, 209), (50, 92, 175), (26, 58, 141), (17, 51, 131), + (8, 44, 122), (4, 148, 157), (18, 234, 151), (1, 254, 145), + (1, 250, 160), (8, 192, 254), (4, 180, 251), (1, 168, 249), + (3, 198, 228), (1, 251, 162), (0, 255, 129), (11, 255, 134), + (38, 224, 97), (49, 235, 77), (61, 247, 58), (56, 253, 77), + (36, 234, 115), (52, 235, 142), (77, 218, 139), (122, 195, 106), + (118, 179, 135), (202, 74, 157), (197, 73, 134), (193, 73, 111), + (223, 76, 86), (218, 136, 80), (228, 137, 66), (220, 186, 50), + (193, 126, 81), (158, 95, 68), (123, 64, 56), (80, 21, 75), + (16, 0, 77), (1, 3, 86), (0, 10, 66), (13, 2, 6), + (31, 16, 23), (46, 33, 63), (0, 16, 117), (0, 0, 122), + (20, 11, 136), (44, 9, 151), (55, 6, 124), (59, 0, 78), + (138, 17, 88), (167, 28, 101), (197, 39, 114), (134, 43, 122), + (101, 81, 153), (70, 109, 200), (55, 103, 203), (32, 159, 255), + (12, 160, 248), (0, 182, 246), (27, 211, 219), (21, 214, 147), + (8, 180, 108), (28, 141, 95), (0, 80, 79), (0, 59, 105), + (0, 41, 116), (0, 0, 149), (8, 13, 191), (29, 27, 196), + (40, 94, 216), (47, 121, 252), (27, 160, 239), (29, 201, 187), + (13, 206, 115), (13, 191, 107), (30, 212, 68), (81, 244, 43), + (50, 224, 13), (30, 209, 4), (32, 202, 43), (79, 157, 81), + (129, 155, 84), (149, 206, 99), (176, 180, 95), (247, 213, 64), + (247, 188, 22), (243, 171, 25), (241, 112, 70), (223, 98, 66), + (255, 91, 74), (255, 66, 97), (244, 41, 123), (235, 2, 127), + (223, 0, 107), (154, 0, 172), (74, 7, 175), (52, 0, 189), + (42, 6, 168), (22, 0, 115), (25, 2, 74), (39, 9, 35), + (95, 7, 65), (168, 6, 92), (221, 34, 89), (180, 0, 183), + (172, 6, 254), (149, 19, 255), (150, 80, 205), (153, 140, 184), + (155, 207, 135), (143, 211, 108), (158, 160, 77), (91, 123, 16), + (59, 59, 33), (38, 6, 73), (10, 3, 107), (49, 35, 149), + (39, 47, 154), (45, 38, 131), (4, 55, 74), (27, 102, 11) + ), + +// 352 ku0215.jpg +((48, 23, 27), (38, 9, 27), (59, 18, 33), (80, 28, 40), + (81, 46, 72), (83, 65, 105), (74, 47, 109), (65, 30, 114), + (87, 60, 141), (117, 38, 116), (147, 16, 92), (104, 10, 69), + (62, 5, 46), (54, 11, 43), (47, 17, 41), (49, 23, 45), + (51, 30, 49), (71, 55, 84), (52, 63, 93), (33, 72, 103), + (44, 79, 87), (55, 87, 72), (45, 83, 63), (35, 79, 54), + (22, 67, 38), (37, 65, 48), (53, 64, 58), (51, 37, 78), + (50, 10, 98), (44, 9, 99), (38, 9, 101), (40, 7, 96), + (22, 27, 57), (32, 41, 14), (26, 37, 14), (20, 33, 15), + (12, 22, 16), (5, 12, 18), (2, 13, 19), (0, 15, 20), + (21, 19, 66), (13, 21, 66), (6, 23, 67), (21, 31, 54), + (36, 40, 41), (51, 44, 37), (66, 49, 33), (77, 49, 46), + (102, 45, 36), (169, 46, 31), (186, 38, 18), (204, 30, 5), + (204, 37, 9), (205, 45, 13), (205, 39, 26), (206, 33, 39), + (228, 61, 45), (219, 37, 24), (210, 13, 4), (192, 12, 8), + (175, 11, 12), (167, 12, 11), (159, 14, 11), (134, 10, 12), + (124, 14, 13), (117, 17, 2), (108, 22, 3), (100, 28, 4), + (97, 27, 7), (94, 27, 10), (93, 28, 10), (90, 29, 24), + (106, 38, 49), (117, 49, 54), (129, 61, 60), (145, 53, 46), + (162, 46, 33), (167, 43, 35), (173, 41, 37), (187, 34, 37), + (187, 24, 51), (133, 11, 60), (103, 26, 43), (74, 41, 26), + (60, 44, 23), (47, 47, 21), (10, 51, 7), (25, 99, 12), + (5, 51, 5), (20, 32, 9), (35, 14, 13), (48, 7, 6), + (62, 0, 0), (63, 33, 9), (67, 27, 15), (94, 14, 27), + (103, 19, 32), (109, 17, 38), (117, 8, 31), (126, 0, 24), + (133, 1, 14), (141, 2, 5), (158, 8, 0), (177, 6, 0), + (200, 13, 30), (186, 10, 22), (173, 8, 14), (159, 14, 11), + (146, 20, 8), (129, 12, 5), (127, 2, 0), (99, 0, 0), + (96, 18, 14), (99, 20, 25), (102, 17, 22), (106, 15, 20), + (118, 29, 15), (150, 28, 5), (156, 22, 13), (157, 24, 15), + (149, 67, 19), (137, 47, 20), (126, 27, 22), (122, 25, 24), + (118, 23, 27), (101, 24, 42), (67, 20, 30), (50, 5, 36), + (22, 18, 33), (10, 30, 54), (18, 30, 52), (26, 31, 51), + (46, 19, 36), (89, 27, 32), (128, 37, 36), (153, 49, 48), + (206, 26, 37), (206, 26, 35), (207, 26, 33), (200, 30, 34), + (193, 35, 36), (192, 31, 37), (176, 19, 50), (146, 37, 58), + (147, 41, 53), (159, 30, 9), (174, 29, 4), (189, 28, 0), + (189, 29, 37), (178, 43, 40), (149, 18, 49), (111, 10, 52), + (103, 15, 55), (84, 16, 70), (65, 18, 86), (70, 31, 110), + (91, 17, 102), (98, 20, 96), (109, 17, 54), (119, 21, 62), + (124, 23, 65), (131, 45, 120), (131, 52, 136), (131, 60, 152), + (127, 63, 149), (133, 63, 135), (163, 52, 95), (122, 61, 66), + (83, 82, 64), (76, 86, 68), (69, 90, 73), (73, 79, 75), + (68, 56, 68), (39, 21, 33), (23, 11, 21), (25, 15, 14), + (24, 0, 3), (14, 8, 12), (12, 22, 23), (6, 35, 43), + (16, 34, 48), (16, 50, 51), (19, 55, 41), (16, 68, 29), + (13, 50, 43), (10, 48, 42), (7, 46, 41), (1, 29, 33), + (3, 22, 20), (6, 32, 5), (1, 22, 3), (8, 17, 16), + (4, 7, 12), (11, 10, 6), (38, 35, 0), (53, 61, 24), + (84, 97, 44), (79, 113, 62), (40, 110, 82), (71, 107, 71), + (96, 103, 72), (86, 132, 83), (63, 135, 71), (41, 132, 62), + (16, 110, 58), (19, 97, 81), (48, 85, 104), (53, 125, 113), + (136, 159, 149), (84, 83, 88), (52, 72, 81), (29, 59, 67), + (24, 65, 49), (6, 83, 41), (19, 86, 55), (9, 94, 63), + (16, 86, 62), (53, 71, 75), (93, 65, 53), (101, 21, 48), + (117, 13, 36), (148, 17, 33), (158, 19, 14), (155, 16, 9), + (135, 4, 12), (132, 10, 23), (119, 0, 36), (117, 7, 42), + (117, 8, 39), (90, 20, 30), (50, 22, 36), (25, 40, 43), + (19, 45, 42), (24, 61, 43), (29, 63, 38), (62, 75, 47), + (83, 68, 49), (106, 76, 14), (163, 74, 44), (167, 85, 47), + (168, 76, 27), (194, 40, 30), (173, 35, 9), (141, 31, 18), + (119, 36, 28), (80, 37, 18), (42, 12, 24), (38, 16, 29), + (38, 24, 39), (49, 53, 26), (103, 44, 30), (134, 46, 26), + (151, 53, 50), (134, 79, 48), (85, 78, 112), (104, 91, 83) + ), + +// 353 s00026.jpg +((65, 0, 180), (27, 0, 97), (34, 0, 80), (42, 0, 64), + (59, 5, 36), (76, 11, 9), (94, 10, 12), (113, 9, 16), + (167, 44, 3), (204, 50, 2), (241, 56, 2), (208, 38, 5), + (175, 21, 9), (154, 11, 93), (134, 1, 178), (145, 1, 192), + (157, 1, 206), (203, 5, 248), (196, 3, 224), (189, 1, 200), + (176, 8, 109), (164, 15, 19), (173, 33, 11), (182, 52, 3), + (255, 121, 31), (246, 145, 41), (238, 169, 52), (221, 150, 49), + (204, 132, 47), (187, 118, 44), (170, 105, 41), (188, 56, 7), + (215, 62, 2), (202, 121, 30), (187, 107, 29), (173, 94, 28), + (161, 84, 25), (150, 74, 22), (138, 73, 25), (126, 72, 28), + (126, 28, 1), (118, 25, 1), (111, 23, 1), (119, 27, 0), + (127, 32, 0), (131, 48, 9), (136, 65, 19), (157, 95, 36), + (161, 102, 42), (219, 163, 54), (207, 148, 52), (196, 134, 51), + (182, 119, 46), (169, 105, 41), (165, 95, 34), (161, 85, 27), + (115, 25, 0), (109, 13, 2), (104, 1, 4), (102, 0, 67), + (101, 0, 130), (96, 0, 146), (91, 0, 163), (15, 0, 215), + (10, 0, 226), (27, 1, 90), (45, 5, 49), (63, 9, 9), + (61, 10, 6), (59, 12, 4), (48, 11, 3), (43, 9, 8), + (17, 7, 6), (12, 4, 9), (8, 2, 12), (13, 1, 15), + (18, 1, 19), (18, 1, 30), (19, 1, 41), (35, 0, 61), + (51, 1, 74), (106, 0, 134), (115, 0, 159), (124, 0, 184), + (115, 1, 206), (107, 2, 229), (38, 0, 245), (37, 0, 185), + (124, 33, 110), (183, 82, 71), (243, 131, 33), (249, 148, 33), + (255, 165, 34), (255, 184, 50), (243, 214, 58), (246, 252, 68), + (216, 229, 79), (209, 160, 55), (188, 134, 48), (168, 109, 41), + (157, 101, 40), (146, 93, 39), (124, 121, 18), (137, 90, 38), + (97, 51, 17), (85, 47, 15), (73, 44, 14), (58, 23, 27), + (43, 3, 40), (32, 1, 61), (20, 10, 70), (0, 1, 52), + (7, 1, 37), (21, 6, 11), (30, 8, 8), (40, 11, 5), + (74, 22, 1), (78, 22, 0), (90, 18, 3), (76, 19, 0), + (28, 4, 28), (18, 2, 40), (9, 1, 52), (8, 1, 62), + (7, 1, 73), (31, 1, 75), (42, 0, 76), (67, 0, 132), + (122, 0, 145), (211, 191, 158), (233, 214, 125), (255, 238, 93), + (248, 248, 76), (243, 253, 79), (221, 235, 77), (242, 199, 61), + (213, 151, 52), (165, 108, 37), (118, 65, 23), (94, 51, 12), + (71, 37, 2), (54, 17, 1), (33, 20, 3), (11, 8, 1), + (6, 7, 2), (0, 4, 3), (0, 3, 7), (0, 3, 12), + (1, 3, 18), (16, 3, 29), (36, 0, 62), (59, 0, 82), + (144, 0, 184), (167, 0, 196), (190, 1, 209), (146, 2, 214), + (139, 0, 187), (138, 0, 155), (155, 13, 39), (134, 37, 2), + (124, 62, 23), (114, 62, 22), (107, 58, 20), (100, 54, 18), + (111, 57, 19), (110, 75, 33), (83, 77, 25), (69, 73, 38), + (48, 36, 12), (32, 28, 8), (16, 20, 5), (17, 18, 2), + (8, 10, 7), (5, 11, 11), (0, 19, 13), (0, 13, 3), + (2, 10, 0), (4, 7, 0), (2, 7, 1), (1, 6, 0), + (0, 4, 7), (0, 4, 16), (12, 4, 28), (27, 0, 53), + (66, 0, 87), (77, 0, 99), (88, 0, 112), (94, 0, 125), + (83, 0, 104), (64, 4, 40), (76, 28, 5), (76, 24, 2), + (52, 14, 1), (37, 10, 3), (16, 9, 3), (6, 6, 8), + (1, 4, 13), (1, 3, 18), (2, 2, 30), (8, 1, 45), + (6, 0, 60), (9, 0, 81), (24, 0, 110), (17, 1, 152), + (14, 0, 150), (5, 0, 125), (1, 0, 94), (0, 0, 72), + (3, 2, 46), (1, 2, 20), (0, 4, 16), (0, 2, 14), + (1, 3, 15), (0, 3, 18), (0, 2, 27), (0, 1, 32), + (1, 1, 35), (9, 0, 43), (40, 0, 63), (52, 0, 74), + (86, 0, 107), (101, 0, 122), (144, 8, 72), (161, 82, 26), + (167, 85, 29), (151, 92, 36), (128, 76, 29), (80, 57, 0), + (53, 17, 1), (19, 15, 0), (7, 13, 1), (6, 11, 4), + (6, 8, 5), (5, 7, 2), (7, 6, 4), (8, 4, 1), + (14, 7, 1), (27, 13, 0), (43, 13, 2), (60, 15, 12), + (43, 0, 46), (45, 0, 65), (57, 0, 95), (53, 0, 130), + (42, 0, 128), (21, 0, 131), (22, 0, 126), (6, 0, 102), + (7, 0, 77), (6, 0, 77), (3, 0, 69), (5, 0, 67), + (1, 1, 61), (8, 2, 40), (17, 32, 13), (6, 4, 26) + ), + +// 354 s00043.jpg +((49, 72, 90), (59, 99, 109), (64, 115, 120), (70, 131, 132), + (73, 134, 141), (76, 138, 151), (97, 146, 146), (118, 154, 142), + (171, 185, 134), (167, 177, 121), (164, 170, 108), (122, 165, 132), + (81, 160, 157), (101, 175, 178), (121, 191, 199), (114, 171, 178), + (108, 151, 158), (147, 130, 84), (138, 96, 65), (129, 62, 46), + (129, 55, 31), (129, 49, 16), (129, 52, 12), (130, 56, 9), + (132, 63, 8), (128, 89, 30), (124, 116, 53), (137, 127, 65), + (150, 138, 78), (152, 141, 80), (154, 144, 82), (161, 157, 93), + (168, 167, 100), (160, 165, 101), (137, 158, 109), (114, 151, 117), + (91, 139, 123), (68, 128, 129), (70, 132, 106), (72, 136, 84), + (133, 127, 65), (140, 124, 52), (147, 122, 40), (145, 134, 43), + (144, 146, 47), (148, 141, 58), (152, 137, 70), (145, 133, 81), + (143, 137, 105), (118, 102, 89), (101, 115, 75), (84, 129, 62), + (64, 82, 52), (45, 35, 43), (42, 32, 41), (40, 30, 39), + (37, 22, 29), (40, 30, 37), (43, 38, 45), (44, 46, 55), + (46, 54, 65), (48, 61, 74), (50, 69, 83), (115, 85, 74), + (130, 78, 91), (129, 85, 56), (136, 96, 45), (144, 108, 34), + (141, 110, 32), (139, 112, 31), (134, 127, 37), (133, 131, 18), + (130, 128, 9), (125, 118, 6), (120, 109, 3), (113, 99, 6), + (106, 89, 9), (110, 78, 8), (114, 68, 8), (113, 65, 1), + (121, 56, 2), (102, 52, 1), (87, 75, 7), (73, 98, 14), + (61, 81, 19), (50, 65, 24), (48, 71, 85), (52, 84, 99), + (74, 134, 145), (101, 139, 130), (129, 144, 115), (141, 150, 108), + (153, 156, 101), (157, 158, 98), (151, 139, 79), (154, 131, 61), + (139, 110, 32), (114, 70, 7), (93, 62, 9), (72, 55, 12), + (71, 57, 11), (71, 59, 11), (67, 79, 7), (85, 87, 0), + (125, 131, 67), (125, 132, 88), (125, 133, 110), (117, 115, 100), + (110, 97, 91), (57, 84, 79), (44, 60, 73), (46, 52, 64), + (44, 44, 54), (47, 57, 69), (49, 68, 81), (51, 79, 93), + (65, 125, 125), (69, 153, 137), (72, 153, 138), (73, 157, 142), + (82, 147, 151), (105, 140, 127), (128, 133, 103), (133, 134, 96), + (139, 135, 90), (155, 142, 74), (149, 119, 46), (143, 98, 33), + (132, 65, 23), (85, 40, 0), (77, 37, 0), (70, 34, 0), + (56, 28, 4), (48, 23, 18), (39, 26, 33), (37, 35, 49), + (43, 59, 84), (46, 65, 83), (50, 72, 83), (82, 71, 71), + (115, 71, 60), (129, 68, 37), (134, 56, 17), (125, 43, 3), + (111, 42, 0), (90, 33, 4), (81, 32, 5), (72, 32, 6), + (72, 55, 3), (89, 64, 7), (78, 73, 5), (70, 64, 4), + (56, 60, 1), (51, 46, 0), (47, 33, 0), (36, 21, 16), + (39, 24, 29), (37, 39, 54), (42, 51, 68), (48, 74, 89), + (57, 112, 72), (97, 94, 17), (100, 83, 12), (104, 73, 8), + (88, 53, 13), (78, 39, 22), (60, 31, 25), (44, 34, 42), + (38, 30, 43), (36, 26, 38), (35, 23, 33), (38, 22, 25), + (54, 23, 18), (63, 27, 13), (70, 27, 8), (77, 29, 6), + (76, 30, 4), (66, 30, 4), (58, 25, 10), (39, 21, 19), + (35, 19, 19), (35, 20, 17), (37, 23, 12), (49, 37, 0), + (37, 54, 2), (43, 45, 1), (49, 36, 1), (47, 23, 19), + (45, 34, 40), (53, 48, 54), (50, 72, 83), (59, 124, 81), + (58, 127, 83), (65, 123, 124), (62, 110, 112), (53, 85, 98), + (50, 76, 89), (50, 59, 64), (54, 45, 46), (56, 26, 18), + (56, 26, 16), (41, 30, 38), (43, 38, 45), (44, 41, 50), + (44, 42, 53), (42, 39, 50), (41, 31, 40), (39, 23, 26), + (35, 21, 21), (36, 22, 13), (50, 29, 0), (69, 36, 3), + (73, 51, 1), (92, 65, 38), (123, 101, 44), (148, 132, 73), + (158, 149, 80), (166, 157, 88), (162, 158, 87), (158, 150, 78), + (152, 148, 51), (138, 118, 32), (124, 95, 19), (120, 69, 14), + (113, 44, 11), (99, 40, 0), (100, 64, 2), (111, 82, 2), + (101, 84, 0), (98, 90, 0), (104, 84, 11), (124, 95, 19), + (137, 110, 29), (153, 130, 50), (159, 146, 67), (158, 151, 63), + (164, 158, 82), (165, 159, 81), (160, 159, 69), (165, 159, 81), + (166, 160, 82), (163, 160, 89), (164, 160, 89), (168, 164, 90), + (169, 169, 95), (166, 172, 108), (165, 171, 107), (166, 166, 96), + (158, 150, 78), (155, 137, 65), (144, 119, 37), (126, 101, 21), + (140, 83, 30), (138, 82, 33), (143, 110, 57), (141, 92, 36) + ), + +// 355 s00118.jpg +((209, 120, 106), (219, 128, 109), (213, 128, 107), (207, 129, 106), + (190, 115, 96), (174, 101, 86), (164, 91, 74), (154, 81, 62), + (141, 77, 68), (142, 81, 71), (144, 86, 74), (157, 89, 80), + (170, 93, 87), (189, 107, 95), (208, 121, 104), (199, 114, 117), + (190, 108, 131), (161, 113, 155), (155, 123, 170), (150, 133, 185), + (142, 145, 190), (135, 157, 196), (137, 154, 196), (140, 151, 196), + (160, 133, 186), (178, 126, 172), (197, 119, 158), (197, 113, 135), + (198, 107, 112), (193, 104, 110), (189, 102, 108), (150, 83, 100), + (134, 77, 94), (114, 74, 98), (119, 70, 83), (125, 66, 68), + (119, 67, 65), (113, 68, 62), (106, 71, 66), (99, 74, 70), + (30, 82, 103), (27, 83, 103), (24, 85, 103), (59, 94, 106), + (95, 104, 109), (105, 100, 116), (115, 97, 123), (126, 104, 143), + (136, 124, 174), (177, 182, 202), (179, 198, 207), (182, 214, 213), + (217, 212, 199), (252, 210, 186), (244, 215, 177), (237, 220, 168), + (255, 208, 141), (234, 175, 127), (214, 143, 113), (206, 127, 107), + (199, 112, 102), (193, 107, 99), (187, 102, 97), (164, 86, 86), + (148, 78, 86), (144, 82, 103), (120, 94, 109), (96, 106, 115), + (64, 93, 108), (33, 81, 101), (8, 72, 82), (9, 21, 47), + (17, 15, 18), (10, 11, 18), (3, 7, 18), (1, 18, 51), + (0, 30, 85), (1, 38, 85), (2, 46, 85), (15, 70, 75), + (34, 73, 90), (94, 92, 116), (136, 99, 120), (178, 107, 125), + (201, 115, 127), (224, 123, 129), (245, 145, 145), (250, 146, 145), + (248, 204, 193), (240, 219, 216), (232, 235, 240), (209, 223, 228), + (187, 212, 217), (191, 209, 197), (138, 169, 190), (104, 131, 160), + (81, 108, 115), (9, 109, 99), (7, 94, 76), (5, 79, 54), + (7, 66, 40), (10, 54, 27), (13, 48, 6), (62, 50, 36), + (104, 53, 60), (91, 64, 79), (78, 76, 98), (82, 86, 115), + (86, 96, 132), (77, 96, 138), (103, 101, 140), (135, 122, 139), + (152, 167, 124), (190, 130, 106), (185, 116, 109), (180, 103, 113), + (146, 88, 113), (134, 80, 103), (111, 77, 104), (116, 78, 103), + (194, 104, 116), (215, 121, 124), (236, 139, 132), (237, 148, 127), + (238, 158, 123), (241, 181, 121), (238, 196, 124), (244, 206, 123), + (233, 194, 153), (214, 170, 141), (225, 163, 143), (236, 156, 145), + (238, 154, 120), (223, 139, 111), (223, 132, 111), (228, 138, 112), + (235, 133, 128), (205, 124, 145), (175, 116, 162), (158, 115, 161), + (142, 115, 160), (106, 140, 177), (86, 141, 148), (35, 129, 95), + (11, 101, 63), (48, 50, 36), (56, 61, 46), (65, 72, 56), + (111, 107, 72), (148, 91, 80), (175, 108, 91), (197, 120, 100), + (216, 134, 110), (216, 131, 109), (217, 129, 109), (210, 116, 114), + (205, 119, 118), (183, 111, 148), (140, 113, 158), (76, 126, 161), + (28, 112, 122), (10, 124, 124), (11, 107, 113), (12, 90, 102), + (10, 87, 105), (23, 78, 134), (36, 125, 139), (91, 147, 164), + (170, 127, 207), (182, 129, 194), (195, 131, 181), (200, 120, 157), + (201, 117, 150), (193, 108, 129), (202, 113, 115), (177, 101, 127), + (143, 102, 142), (101, 89, 125), (72, 95, 137), (47, 93, 145), + (25, 60, 141), (11, 89, 127), (19, 123, 136), (19, 131, 132), + (102, 145, 179), (114, 154, 184), (127, 164, 190), (183, 185, 135), + (221, 155, 121), (212, 147, 115), (206, 134, 109), (206, 118, 104), + (191, 109, 95), (184, 105, 92), (177, 105, 90), (154, 98, 83), + (159, 93, 81), (160, 90, 82), (173, 95, 91), (199, 101, 102), + (203, 112, 107), (199, 109, 108), (188, 102, 105), (175, 93, 95), + (145, 81, 97), (136, 78, 93), (140, 75, 81), (132, 70, 71), + (127, 67, 66), (128, 71, 64), (126, 68, 64), (127, 65, 66), + (130, 69, 68), (134, 76, 72), (139, 79, 69), (132, 73, 67), + (127, 67, 66), (126, 69, 62), (125, 67, 63), (124, 66, 62), + (119, 63, 64), (114, 61, 67), (111, 60, 56), (109, 58, 57), + (82, 65, 55), (50, 93, 39), (41, 102, 42), (44, 115, 47), + (48, 83, 77), (27, 71, 84), (10, 62, 73), (16, 25, 42), + (27, 27, 39), (57, 35, 38), (94, 52, 56), (112, 62, 71), + (113, 69, 86), (124, 70, 84), (128, 67, 72), (124, 65, 69), + (111, 59, 63), (88, 46, 47), (68, 36, 37), (39, 25, 25), + (12, 20, 9), (1, 23, 0), (20, 22, 11), (29, 30, 14), + (63, 33, 31), (69, 50, 44), (59, 51, 64), (68, 60, 73), + (80, 65, 84), (90, 75, 94), (103, 68, 92), (140, 82, 94) + ), + +// 356 s00138.jpg +((247, 164, 0), (176, 98, 76), (170, 92, 66), (164, 87, 57), + (158, 82, 58), (153, 78, 59), (154, 78, 62), (155, 79, 65), + (139, 66, 59), (133, 63, 59), (128, 60, 59), (144, 63, 46), + (160, 67, 33), (178, 77, 28), (197, 87, 24), (206, 96, 23), + (216, 105, 23), (147, 188, 48), (149, 138, 68), (152, 88, 88), + (163, 91, 78), (175, 95, 68), (186, 97, 50), (197, 100, 32), + (234, 118, 15), (236, 121, 10), (239, 124, 5), (229, 131, 2), + (219, 139, 0), (192, 168, 18), (166, 198, 37), (122, 226, 27), + (64, 219, 19), (164, 222, 23), (184, 218, 22), (204, 214, 21), + (226, 206, 16), (248, 199, 11), (247, 196, 8), (247, 193, 5), + (249, 191, 6), (252, 186, 11), (255, 182, 16), (253, 179, 10), + (252, 176, 5), (251, 178, 4), (251, 180, 4), (250, 179, 1), + (250, 184, 2), (254, 180, 5), (253, 175, 4), (253, 170, 4), + (246, 163, 8), (239, 157, 13), (232, 139, 24), (225, 121, 36), + (197, 100, 55), (214, 108, 41), (231, 117, 28), (230, 115, 18), + (230, 113, 8), (228, 111, 6), (227, 110, 5), (223, 107, 0), + (222, 105, 10), (179, 82, 27), (164, 72, 33), (149, 63, 40), + (139, 59, 43), (129, 55, 46), (112, 48, 49), (111, 46, 50), + (131, 55, 42), (152, 63, 34), (173, 72, 26), (193, 96, 16), + (214, 120, 6), (227, 132, 6), (241, 145, 7), (251, 156, 4), + (251, 156, 2), (237, 122, 5), (200, 96, 19), (164, 70, 34), + (146, 62, 39), (128, 54, 45), (102, 45, 54), (83, 38, 59), + (69, 34, 67), (67, 33, 67), (66, 32, 67), (63, 31, 69), + (61, 30, 71), (56, 29, 72), (52, 29, 75), (56, 29, 72), + (55, 27, 68), (56, 29, 74), (48, 26, 76), (40, 23, 78), + (41, 23, 78), (43, 24, 79), (45, 27, 79), (53, 29, 77), + (64, 30, 65), (76, 35, 61), (89, 41, 57), (99, 44, 54), + (109, 47, 52), (127, 50, 34), (152, 58, 22), (171, 80, 0), + (213, 116, 0), (248, 186, 5), (246, 192, 11), (245, 199, 18), + (227, 211, 14), (192, 206, 9), (211, 201, 8), (238, 179, 0), + (250, 169, 0), (250, 160, 0), (250, 152, 1), (248, 148, 1), + (247, 145, 1), (242, 130, 4), (233, 121, 11), (227, 117, 4), + (227, 117, 2), (226, 124, 0), (230, 127, 1), (235, 130, 2), + (245, 140, 0), (248, 143, 2), (252, 150, 6), (253, 153, 7), + (255, 169, 4), (255, 171, 8), (255, 173, 12), (255, 172, 9), + (255, 171, 6), (253, 165, 3), (250, 151, 21), (246, 136, 25), + (218, 108, 23), (137, 49, 9), (129, 45, 17), (121, 42, 25), + (113, 46, 38), (103, 43, 45), (99, 40, 46), (99, 43, 54), + (100, 44, 55), (101, 46, 58), (102, 48, 62), (105, 45, 55), + (107, 46, 53), (112, 48, 49), (115, 50, 48), (122, 51, 47), + (126, 53, 46), (129, 55, 44), (129, 54, 43), (130, 53, 43), + (132, 51, 32), (134, 52, 30), (136, 57, 42), (138, 56, 32), + (149, 62, 35), (155, 64, 34), (161, 67, 33), (175, 74, 28), + (189, 83, 25), (220, 102, 14), (221, 104, 11), (223, 107, 8), + (219, 104, 11), (192, 86, 34), (154, 74, 49), (126, 53, 46), + (125, 52, 46), (131, 54, 44), (145, 60, 39), (156, 62, 26), + (215, 99, 14), (221, 104, 12), (228, 110, 10), (241, 129, 3), + (247, 140, 0), (246, 138, 3), (239, 131, 5), (229, 112, 7), + (218, 104, 5), (182, 74, 12), (163, 62, 16), (155, 62, 5), + (164, 65, 0), (181, 75, 0), (211, 103, 0), (232, 128, 0), + (242, 137, 9), (247, 145, 1), (237, 134, 5), (228, 124, 0), + (219, 108, 0), (203, 93, 14), (167, 72, 18), (139, 58, 39), + (120, 52, 49), (101, 44, 53), (92, 41, 58), (89, 40, 59), + (89, 40, 59), (89, 40, 59), (87, 40, 60), (86, 37, 56), + (84, 39, 60), (80, 37, 64), (71, 34, 65), (77, 37, 63), + (79, 34, 55), (91, 40, 59), (106, 45, 52), (118, 48, 40), + (149, 59, 32), (164, 92, 0), (211, 128, 0), (239, 154, 12), + (252, 153, 34), (253, 159, 37), (255, 163, 60), (236, 138, 51), + (182, 98, 70), (141, 74, 68), (108, 49, 55), (97, 43, 56), + (88, 41, 61), (79, 42, 75), (59, 32, 77), (57, 30, 75), + (63, 31, 70), (67, 33, 68), (72, 33, 64), (83, 32, 49), + (69, 21, 37), (54, 11, 38), (83, 10, 0), (87, 19, 6), + (96, 34, 37), (91, 40, 55), (97, 43, 57), (99, 43, 54), + (109, 47, 52), (125, 57, 54), (139, 68, 48), (168, 95, 62) + ), + +// 357 s00149.jpg +((145, 15, 25), (124, 27, 21), (102, 17, 21), (80, 8, 22), + (57, 4, 25), (35, 1, 28), (26, 3, 30), (18, 5, 33), + (0, 23, 29), (3, 27, 33), (6, 31, 38), (8, 36, 36), + (11, 42, 34), (20, 35, 32), (30, 28, 31), (23, 24, 30), + (17, 20, 29), (3, 4, 24), (2, 2, 23), (2, 0, 22), + (3, 0, 22), (4, 0, 23), (4, 0, 23), (5, 0, 23), + (26, 3, 32), (47, 3, 28), (69, 4, 24), (113, 13, 56), + (158, 22, 88), (170, 25, 99), (182, 29, 111), (230, 13, 100), + (249, 6, 90), (253, 2, 82), (247, 3, 79), (241, 4, 76), + (236, 7, 87), (231, 11, 98), (229, 14, 104), (228, 17, 110), + (187, 46, 142), (175, 48, 141), (163, 50, 140), (111, 29, 93), + (60, 8, 46), (55, 6, 41), (51, 4, 36), (36, 0, 28), + (34, 0, 25), (34, 23, 27), (27, 32, 36), (20, 41, 46), + (21, 56, 44), (23, 72, 42), (22, 73, 42), (21, 75, 43), + (9, 61, 39), (4, 43, 32), (0, 26, 25), (0, 15, 24), + (1, 4, 23), (1, 2, 23), (2, 0, 24), (0, 0, 24), + (0, 5, 27), (5, 17, 39), (4, 28, 50), (4, 40, 62), + (7, 40, 64), (11, 41, 67), (18, 41, 72), (13, 30, 56), + (10, 14, 41), (17, 13, 36), (25, 12, 32), (23, 7, 27), + (22, 3, 23), (18, 1, 23), (15, 0, 23), (6, 1, 24), + (1, 9, 28), (3, 26, 34), (2, 38, 37), (1, 51, 40), + (0, 55, 45), (0, 60, 50), (0, 47, 63), (7, 43, 67), + (36, 44, 83), (26, 51, 86), (17, 58, 90), (15, 56, 86), + (13, 54, 82), (26, 31, 61), (44, 17, 52), (57, 7, 42), + (52, 5, 25), (53, 18, 24), (69, 20, 24), (85, 23, 24), + (103, 27, 58), (121, 31, 93), (181, 26, 104), (225, 24, 120), + (243, 15, 113), (235, 15, 111), (227, 16, 109), (222, 15, 103), + (217, 15, 97), (185, 1, 51), (128, 1, 31), (77, 0, 32), + (47, 4, 23), (7, 1, 27), (5, 3, 26), (4, 5, 25), + (2, 5, 24), (3, 4, 24), (15, 5, 32), (27, 2, 31), + (22, 6, 33), (18, 10, 36), (14, 14, 40), (19, 20, 49), + (24, 27, 58), (49, 23, 62), (50, 24, 61), (55, 27, 67), + (93, 51, 115), (192, 25, 105), (201, 15, 89), (211, 6, 73), + (221, 14, 30), (216, 10, 30), (197, 15, 27), (138, 41, 22), + (86, 10, 22), (70, 5, 23), (55, 1, 25), (48, 4, 24), + (42, 8, 24), (21, 7, 30), (7, 13, 37), (2, 29, 46), + (13, 45, 44), (1, 49, 59), (1, 41, 56), (2, 33, 53), + (1, 30, 44), (2, 19, 39), (4, 10, 34), (1, 9, 30), + (16, 2, 25), (24, 1, 24), (32, 0, 23), (47, 2, 23), + (65, 1, 28), (81, 0, 33), (129, 6, 26), (194, 6, 31), + (242, 33, 26), (249, 92, 23), (247, 93, 23), (246, 95, 24), + (227, 89, 26), (206, 76, 14), (177, 69, 30), (152, 65, 35), + (127, 30, 24), (126, 29, 23), (125, 28, 22), (124, 30, 22), + (103, 21, 23), (74, 8, 46), (56, 14, 52), (22, 22, 50), + (11, 23, 37), (4, 22, 36), (8, 16, 39), (5, 19, 32), + (5, 17, 29), (19, 13, 25), (37, 14, 24), (63, 18, 23), + (164, 60, 23), (199, 58, 23), (235, 56, 23), (248, 70, 22), + (250, 62, 24), (218, 20, 107), (221, 24, 116), (188, 45, 137), + (173, 25, 101), (141, 5, 53), (174, 0, 37), (172, 5, 61), + (133, 23, 84), (115, 31, 91), (38, 86, 64), (38, 62, 46), + (28, 49, 42), (24, 37, 27), (29, 31, 26), (39, 28, 24), + (57, 21, 21), (76, 25, 22), (101, 28, 22), (142, 51, 24), + (204, 45, 41), (223, 19, 28), (233, 19, 29), (241, 2, 44), + (244, 0, 54), (249, 0, 68), (254, 0, 72), (248, 0, 63), + (243, 2, 71), (240, 1, 68), (187, 1, 50), (177, 0, 42), + (98, 3, 27), (70, 12, 52), (52, 39, 83), (30, 44, 79), + (0, 63, 80), (2, 83, 110), (25, 109, 173), (69, 133, 230), + (36, 125, 205), (22, 84, 131), (4, 81, 107), (1, 52, 69), + (0, 34, 48), (0, 21, 35), (1, 9, 30), (6, 1, 23), + (14, 0, 23), (16, 0, 24), (28, 0, 25), (34, 0, 24), + (36, 1, 25), (38, 5, 22), (58, 10, 24), (83, 16, 23), + (120, 15, 22), (176, 0, 36), (208, 19, 26), (222, 18, 27), + (223, 17, 27), (219, 15, 27), (195, 0, 40), (144, 1, 44), + (105, 3, 27), (68, 12, 21), (0, 30, 32), (33, 19, 19) + ), +// 358 vchira_0001.jpg +((157, 75, 51), (218, 60, 206), (229, 48, 230), (241, 37, 255), + (244, 28, 248), (248, 20, 241), (243, 21, 232), (239, 22, 223), + (192, 66, 251), (120, 114, 248), (48, 163, 246), (33, 182, 244), + (18, 201, 243), (20, 204, 244), (22, 208, 246), (18, 226, 250), + (15, 245, 255), (18, 244, 224), (38, 230, 213), (58, 216, 202), + (90, 223, 199), (122, 230, 196), (122, 240, 177), (123, 250, 159), + (96, 250, 154), (85, 251, 174), (74, 253, 195), (46, 236, 225), + (18, 220, 255), (26, 219, 250), (35, 219, 245), (74, 238, 201), + (94, 250, 185), (158, 221, 174), (142, 238, 162), (127, 255, 151), + (144, 225, 144), (162, 195, 138), (191, 195, 151), (220, 195, 164), + (236, 166, 117), (242, 188, 93), (248, 211, 70), (250, 233, 35), + (253, 255, 0), (253, 242, 11), (254, 229, 23), (248, 207, 19), + (241, 200, 46), (226, 199, 94), (209, 191, 101), (193, 184, 109), + (133, 197, 149), (74, 210, 190), (41, 219, 205), (8, 229, 220), + (22, 209, 182), (79, 212, 183), (136, 215, 184), (165, 186, 191), + (195, 157, 198), (220, 149, 199), (246, 141, 200), (242, 139, 158), + (215, 138, 190), (194, 136, 184), (219, 100, 216), (244, 64, 249), + (240, 59, 243), (237, 55, 238), (233, 21, 227), (208, 13, 229), + (123, 13, 164), (137, 6, 158), (151, 0, 153), (170, 26, 150), + (190, 52, 147), (204, 85, 147), (219, 119, 147), (202, 132, 96), + (190, 91, 52), (166, 57, 136), (185, 73, 172), (205, 90, 209), + (213, 94, 196), (222, 98, 184), (232, 126, 128), (248, 146, 82), + (249, 190, 52), (251, 160, 88), (254, 131, 124), (251, 91, 142), + (248, 52, 160), (241, 40, 208), (232, 15, 207), (208, 16, 215), + (197, 0, 154), (113, 11, 74), (120, 48, 37), (128, 85, 0), + (132, 105, 0), (137, 125, 0), (164, 181, 4), (175, 179, 6), + (204, 236, 11), (220, 232, 7), (236, 229, 3), (233, 212, 4), + (231, 196, 6), (240, 187, 19), (241, 185, 50), (221, 215, 55), + (212, 220, 101), (166, 182, 135), (144, 155, 140), (122, 129, 145), + (111, 78, 61), (79, 22, 57), (64, 0, 92), (100, 17, 107), + (151, 17, 86), (152, 14, 100), (154, 12, 114), (159, 22, 122), + (164, 32, 131), (210, 27, 141), (220, 20, 217), (209, 7, 217), + (228, 6, 227), (220, 9, 228), (215, 20, 203), (211, 31, 178), + (198, 28, 99), (138, 43, 51), (136, 93, 0), (118, 97, 16), + (72, 102, 48), (58, 91, 24), (45, 80, 0), (40, 81, 4), + (36, 82, 9), (39, 55, 0), (19, 49, 0), (13, 49, 23), + (0, 63, 50), (37, 145, 218), (35, 152, 222), (34, 159, 226), + (4, 170, 208), (3, 125, 176), (10, 42, 127), (29, 59, 123), + (114, 18, 167), (133, 32, 204), (153, 47, 241), (191, 8, 223), + (203, 6, 236), (210, 21, 238), (177, 72, 200), (161, 59, 221), + (138, 62, 212), (64, 60, 147), (61, 52, 125), (59, 44, 103), + (1, 68, 35), (31, 45, 9), (21, 10, 18), (18, 9, 14), + (5, 7, 0), (4, 3, 11), (3, 0, 22), (15, 21, 45), + (30, 20, 70), (37, 35, 46), (63, 4, 0), (68, 0, 5), + (86, 10, 36), (124, 18, 67), (146, 53, 142), (95, 130, 184), + (104, 208, 171), (99, 232, 187), (88, 216, 245), (47, 193, 252), + (111, 172, 237), (141, 133, 238), (172, 94, 240), (207, 50, 243), + (229, 29, 242), (172, 38, 247), (143, 43, 251), (99, 92, 234), + (76, 171, 229), (41, 178, 214), (36, 187, 146), (87, 193, 95), + (154, 188, 6), (181, 187, 3), (191, 185, 1), (212, 165, 23), + (237, 113, 77), (231, 79, 104), (234, 57, 135), (238, 14, 175), + (232, 42, 166), (241, 93, 125), (255, 189, 83), (233, 239, 55), + (231, 248, 46), (215, 231, 96), (199, 227, 127), (201, 235, 141), + (162, 218, 145), (151, 251, 127), (179, 245, 113), (173, 239, 89), + (155, 202, 12), (172, 144, 19), (139, 96, 2), (149, 114, 10), + (185, 149, 11), (251, 199, 35), (228, 236, 75), (206, 245, 128), + (164, 203, 159), (138, 216, 200), (105, 181, 241), (120, 176, 235), + (156, 200, 201), (199, 216, 200), (200, 222, 173), (172, 203, 195), + (168, 135, 216), (145, 93, 240), (146, 51, 195), (105, 20, 165), + (118, 0, 140), (71, 0, 96), (63, 0, 101), (49, 24, 63), + (30, 24, 58), (41, 0, 17), (60, 39, 0), (69, 35, 0), + (92, 78, 0), (96, 115, 7), (96, 187, 68), (92, 226, 115), + (40, 194, 134), (75, 104, 110), (111, 61, 62), (107, 0, 92), + (106, 0, 81), (126, 19, 9), (108, 21, 14), (66, 0, 19) + ), + +// 359 vchira_0003.jpg +((85, 39, 189), (141, 23, 195), (149, 11, 167), (158, 0, 139), + (147, 0, 134), (137, 0, 130), (131, 2, 134), (126, 4, 138), + (90, 12, 148), (99, 9, 142), (109, 6, 137), (111, 3, 132), + (113, 1, 127), (123, 3, 111), (133, 6, 95), (141, 19, 77), + (149, 32, 59), (154, 81, 12), (155, 90, 11), (157, 100, 10), + (144, 105, 7), (131, 110, 5), (131, 110, 2), (132, 111, 0), + (156, 143, 3), (168, 161, 21), (180, 179, 39), (217, 202, 35), + (255, 225, 32), (255, 228, 29), (255, 232, 27), (255, 231, 20), + (245, 218, 7), (191, 174, 6), (178, 155, 5), (165, 137, 4), + (155, 130, 8), (146, 124, 13), (136, 111, 8), (127, 98, 4), + (147, 45, 33), (128, 24, 81), (110, 4, 130), (103, 15, 155), + (97, 26, 180), (94, 26, 173), (91, 27, 167), (95, 8, 113), + (129, 37, 52), (162, 92, 30), (168, 110, 22), (175, 128, 14), + (186, 146, 13), (198, 164, 13), (199, 168, 21), (200, 172, 29), + (183, 126, 21), (188, 85, 57), (193, 45, 93), (192, 31, 113), + (191, 18, 134), (191, 24, 122), (191, 30, 110), (183, 34, 98), + (193, 36, 87), (196, 34, 91), (195, 32, 98), (195, 30, 106), + (188, 25, 112), (181, 21, 119), (168, 0, 131), (135, 9, 152), + (97, 14, 154), (100, 7, 136), (104, 1, 119), (105, 1, 111), + (107, 2, 103), (110, 1, 104), (114, 0, 106), (125, 4, 109), + (148, 12, 88), (137, 28, 49), (134, 41, 39), (131, 55, 29), + (125, 61, 29), (119, 67, 30), (111, 52, 22), (109, 43, 17), + (77, 13, 4), (78, 29, 4), (79, 46, 5), (88, 56, 7), + (98, 66, 9), (107, 75, 0), (127, 100, 0), (140, 134, 0), + (174, 158, 3), (242, 123, 83), (232, 108, 80), (223, 93, 77), + (208, 77, 69), (194, 61, 62), (175, 57, 53), (174, 43, 61), + (193, 66, 77), (208, 73, 80), (224, 81, 83), (204, 62, 79), + (185, 44, 76), (177, 33, 86), (165, 52, 56), (148, 71, 19), + (126, 71, 7), (116, 92, 2), (115, 93, 3), (115, 94, 5), + (115, 96, 4), (120, 94, 0), (150, 95, 31), (161, 55, 65), + (165, 13, 96), (169, 25, 101), (173, 38, 107), (173, 38, 97), + (174, 38, 88), (177, 66, 47), (189, 104, 21), (218, 147, 23), + (232, 154, 30), (214, 184, 10), (213, 194, 10), (212, 205, 11), + (237, 203, 18), (248, 208, 14), (244, 191, 27), (237, 141, 54), + (233, 132, 50), (220, 135, 38), (208, 138, 27), (195, 130, 18), + (183, 123, 9), (156, 104, 21), (118, 72, 22), (121, 65, 6), + (119, 48, 0), (118, 0, 69), (118, 0, 75), (118, 0, 82), + (125, 0, 87), (125, 4, 97), (138, 2, 104), (147, 5, 113), + (159, 27, 103), (162, 36, 93), (165, 46, 84), (161, 58, 51), + (162, 94, 33), (167, 110, 23), (172, 121, 6), (172, 119, 17), + (178, 112, 25), (162, 68, 34), (165, 58, 45), (169, 48, 57), + (164, 41, 62), (158, 25, 88), (123, 15, 127), (93, 29, 167), + (70, 82, 218), (62, 99, 220), (55, 116, 223), (125, 72, 224), + (143, 17, 179), (158, 0, 139), (173, 5, 126), (210, 42, 101), + (220, 66, 102), (235, 118, 83), (219, 151, 54), (244, 201, 34), + (255, 220, 34), (255, 249, 34), (255, 243, 21), (249, 214, 28), + (239, 153, 40), (232, 143, 44), (226, 134, 49), (208, 100, 51), + (187, 79, 43), (171, 45, 69), (154, 22, 71), (138, 0, 88), + (136, 0, 103), (131, 9, 118), (126, 4, 123), (148, 1, 118), + (162, 8, 120), (161, 5, 114), (143, 7, 105), (141, 2, 103), + (143, 7, 91), (155, 14, 82), (149, 21, 54), (149, 27, 50), + (152, 36, 39), (140, 67, 34), (139, 79, 19), (130, 100, 0), + (136, 99, 0), (153, 104, 2), (161, 94, 3), (151, 92, 0), + (137, 73, 12), (124, 66, 28), (114, 48, 32), (130, 17, 60), + (115, 0, 93), (114, 0, 97), (98, 0, 104), (95, 0, 128), + (81, 3, 139), (82, 11, 143), (89, 0, 137), (114, 4, 139), + (128, 10, 120), (140, 3, 119), (140, 5, 123), (150, 0, 128), + (159, 6, 130), (149, 10, 173), (145, 19, 191), (129, 14, 193), + (108, 22, 195), (125, 39, 200), (111, 50, 187), (97, 43, 201), + (87, 43, 190), (113, 9, 156), (147, 15, 99), (142, 38, 47), + (158, 76, 29), (161, 102, 12), (154, 118, 0), (140, 111, 9), + (140, 125, 6), (156, 132, 6), (161, 126, 8), (172, 132, 1), + (188, 144, 0), (198, 149, 12), (220, 166, 8), (250, 206, 23), + (254, 209, 32), (249, 209, 36), (226, 182, 34), (223, 159, 23) + ), + +// 360 vchira_0012.jpg +((211, 48, 91), (113, 23, 0), (78, 32, 0), (43, 41, 0), + (31, 30, 16), (20, 20, 32), (28, 12, 37), (36, 4, 43), + (118, 2, 49), (145, 11, 68), (172, 21, 88), (171, 31, 83), + (170, 41, 79), (212, 82, 105), (255, 124, 132), (250, 136, 129), + (245, 149, 127), (198, 200, 179), (219, 169, 195), (240, 138, 212), + (218, 100, 147), (196, 63, 82), (165, 43, 78), (134, 23, 74), + (100, 18, 40), (56, 9, 21), (13, 0, 2), (11, 0, 4), + (9, 0, 6), (4, 9, 15), (0, 19, 25), (20, 8, 58), + (53, 0, 56), (56, 15, 19), (63, 19, 15), (70, 24, 11), + (112, 60, 15), (155, 96, 20), (171, 136, 10), (188, 176, 0), + (210, 255, 80), (203, 224, 93), (197, 193, 106), (164, 152, 90), + (131, 111, 74), (137, 80, 57), (144, 50, 40), (127, 46, 1), + (169, 98, 34), (170, 209, 118), (145, 231, 110), (120, 253, 102), + (99, 246, 114), (78, 239, 127), (60, 217, 121), (43, 196, 116), + (26, 101, 168), (41, 64, 151), (57, 28, 134), (67, 23, 123), + (77, 18, 112), (110, 9, 112), (144, 0, 113), (148, 8, 113), + (101, 15, 50), (35, 50, 9), (17, 45, 26), (0, 41, 44), + (0, 53, 35), (0, 66, 26), (36, 101, 81), (54, 146, 121), + (53, 231, 121), (59, 233, 130), (65, 236, 140), (73, 239, 132), + (81, 243, 124), (99, 241, 121), (117, 239, 118), (158, 253, 107), + (189, 218, 108), (212, 208, 147), (198, 214, 151), (185, 220, 156), + (169, 210, 144), (153, 200, 132), (99, 166, 95), (99, 143, 118), + (13, 67, 101), (6, 76, 118), (0, 86, 136), (0, 112, 147), + (0, 138, 159), (12, 132, 148), (0, 114, 117), (40, 154, 120), + (42, 194, 109), (46, 212, 110), (71, 226, 115), (97, 241, 120), + (105, 246, 114), (114, 251, 109), (137, 235, 100), (151, 254, 101), + (144, 255, 96), (131, 255, 98), (118, 255, 101), (108, 255, 102), + (98, 255, 104), (98, 252, 132), (98, 254, 145), (107, 252, 159), + (105, 251, 142), (135, 235, 119), (134, 231, 115), (133, 228, 112), + (149, 255, 107), (128, 250, 90), (119, 252, 101), (102, 246, 99), + (49, 202, 86), (49, 166, 94), (50, 130, 103), (37, 133, 107), + (25, 137, 112), (8, 149, 83), (50, 161, 67), (63, 188, 52), + (120, 201, 98), (184, 208, 134), (219, 198, 128), (255, 189, 123), + (253, 125, 116), (218, 94, 66), (187, 161, 24), (219, 232, 0), + (253, 255, 36), (244, 252, 42), (235, 249, 48), (245, 237, 68), + (255, 225, 89), (214, 249, 95), (195, 237, 89), (158, 252, 102), + (167, 255, 107), (193, 230, 125), (200, 238, 131), (208, 247, 138), + (228, 231, 144), (197, 234, 129), (154, 248, 136), (118, 255, 132), + (117, 240, 133), (132, 242, 136), (147, 244, 139), (165, 246, 153), + (159, 243, 147), (134, 231, 136), (88, 159, 99), (38, 109, 105), + (9, 62, 93), (40, 33, 75), (49, 16, 73), (59, 0, 72), + (64, 0, 83), (65, 1, 87), (57, 13, 100), (120, 43, 137), + (178, 18, 180), (195, 86, 163), (213, 154, 146), (218, 226, 44), + (233, 222, 18), (187, 138, 35), (179, 89, 36), (177, 49, 74), + (120, 40, 79), (71, 4, 55), (41, 11, 85), (48, 16, 113), + (68, 19, 136), (136, 92, 145), (169, 182, 128), (191, 222, 162), + (153, 225, 187), (168, 234, 177), (183, 244, 167), (191, 205, 188), + (193, 234, 204), (202, 217, 222), (183, 160, 242), (178, 91, 248), + (150, 169, 165), (131, 165, 104), (106, 189, 121), (62, 227, 148), + (56, 237, 160), (35, 233, 145), (30, 242, 184), (59, 236, 220), + (116, 197, 227), (148, 226, 186), (131, 245, 173), (145, 246, 166), + (132, 249, 135), (168, 246, 127), (176, 222, 150), (169, 187, 137), + (170, 155, 148), (117, 57, 117), (97, 41, 68), (81, 15, 51), + (50, 34, 44), (50, 54, 19), (56, 45, 15), (69, 45, 35), + (102, 67, 9), (116, 71, 16), (74, 128, 0), (69, 137, 14), + (49, 119, 56), (73, 191, 53), (127, 204, 102), (174, 233, 139), + (193, 224, 144), (215, 200, 157), (219, 200, 134), (223, 201, 99), + (177, 176, 96), (176, 67, 62), (149, 62, 68), (148, 24, 52), + (130, 27, 46), (146, 47, 42), (174, 57, 40), (171, 113, 16), + (141, 205, 56), (85, 234, 90), (90, 248, 125), (75, 255, 158), + (72, 231, 199), (121, 233, 195), (145, 245, 195), (168, 242, 215), + (180, 221, 207), (165, 222, 203), (149, 186, 212), (100, 200, 255), + (51, 206, 252), (88, 111, 223), (41, 153, 203), (19, 218, 163), + (83, 255, 167), (143, 219, 193), (165, 197, 186), (255, 145, 163) + ), + +// 361 vchira_0013.jpg +((180, 215, 243), (103, 96, 234), (93, 75, 206), (84, 54, 178), + (89, 45, 160), (94, 37, 142), (93, 30, 142), (93, 24, 143), + (64, 31, 174), (59, 43, 174), (55, 55, 175), (69, 56, 188), + (83, 58, 201), (95, 55, 211), (108, 52, 221), (111, 68, 230), + (115, 84, 240), (114, 111, 216), (92, 103, 201), (70, 95, 187), + (65, 94, 191), (60, 93, 196), (57, 90, 195), (54, 88, 195), + (75, 77, 214), (101, 65, 226), (128, 54, 239), (105, 56, 224), + (83, 59, 209), (78, 60, 204), (74, 62, 200), (64, 55, 198), + (50, 61, 177), (85, 91, 211), (94, 89, 224), (103, 87, 237), + (125, 67, 233), (148, 47, 229), (162, 45, 236), (176, 43, 244), + (179, 63, 236), (171, 66, 241), (164, 69, 247), (172, 73, 238), + (180, 77, 230), (175, 89, 217), (170, 102, 205), (151, 82, 191), + (92, 44, 153), (41, 13, 53), (30, 6, 35), (19, 0, 17), + (15, 0, 18), (12, 0, 20), (18, 0, 24), (25, 0, 29), + (32, 20, 92), (57, 15, 117), (82, 11, 143), (109, 8, 164), + (137, 5, 185), (142, 10, 191), (148, 16, 198), (146, 47, 216), + (146, 102, 251), (119, 122, 255), (115, 110, 236), (112, 99, 217), + (122, 114, 211), (132, 130, 205), (214, 173, 169), (237, 209, 255), + (148, 112, 248), (140, 138, 248), (132, 164, 249), (108, 159, 231), + (84, 154, 214), (80, 153, 220), (76, 152, 227), (89, 135, 229), + (88, 103, 228), (64, 78, 200), (63, 60, 188), (63, 43, 176), + (62, 38, 176), (61, 34, 177), (69, 29, 164), (67, 10, 149), + (52, 12, 108), (38, 6, 84), (25, 1, 61), (25, 2, 59), + (26, 3, 57), (28, 2, 49), (27, 4, 33), (11, 13, 26), + (6, 7, 37), (9, 13, 61), (23, 12, 71), (38, 11, 82), + (42, 9, 80), (47, 7, 78), (48, 2, 75), (54, 0, 87), + (43, 23, 112), (43, 28, 120), (44, 33, 129), (38, 44, 139), + (32, 55, 149), (27, 68, 150), (17, 62, 127), (20, 27, 108), + (17, 25, 87), (11, 10, 44), (15, 5, 48), (20, 0, 53), + (31, 3, 54), (52, 5, 73), (58, 3, 96), (77, 6, 136), + (116, 27, 193), (122, 35, 205), (128, 44, 217), (122, 36, 207), + (116, 28, 198), (103, 28, 193), (83, 33, 180), (64, 61, 168), + (63, 79, 166), (109, 76, 215), (118, 78, 214), (128, 81, 213), + (131, 61, 196), (115, 46, 201), (109, 26, 180), (94, 9, 139), + (68, 0, 86), (85, 0, 111), (103, 0, 136), (115, 8, 159), + (127, 16, 183), (158, 30, 213), (172, 74, 223), (176, 87, 255), + (185, 90, 252), (180, 108, 242), (172, 103, 242), (164, 99, 243), + (162, 68, 252), (149, 32, 234), (143, 23, 219), (137, 24, 204), + (67, 41, 168), (62, 45, 155), (57, 50, 143), (36, 43, 134), + (41, 32, 115), (33, 44, 98), (39, 28, 84), (41, 19, 84), + (54, 16, 117), (98, 10, 146), (105, 12, 152), (113, 14, 159), + (102, 28, 177), (83, 44, 187), (82, 59, 199), (89, 72, 213), + (79, 84, 202), (75, 73, 201), (71, 63, 200), (71, 63, 184), + (55, 58, 173), (42, 53, 159), (42, 44, 155), (37, 59, 160), + (34, 76, 160), (26, 83, 152), (32, 89, 170), (39, 96, 186), + (22, 116, 180), (35, 107, 192), (48, 129, 210), (41, 99, 198), + (42, 62, 177), (45, 52, 164), (48, 42, 152), (59, 30, 138), + (85, 27, 137), (92, 38, 150), (112, 45, 187), (112, 70, 196), + (131, 104, 197), (126, 70, 231), (135, 56, 223), (130, 24, 192), + (114, 32, 179), (110, 39, 179), (94, 40, 180), (65, 54, 159), + (51, 55, 144), (33, 86, 136), (33, 61, 124), (43, 53, 124), + (40, 48, 120), (45, 37, 114), (84, 66, 114), (90, 65, 159), + (96, 81, 186), (91, 67, 187), (81, 58, 174), (84, 42, 170), + (83, 17, 153), (66, 5, 134), (69, 15, 129), (50, 12, 123), + (42, 19, 133), (63, 32, 151), (87, 23, 172), (90, 13, 181), + (88, 34, 192), (90, 42, 190), (75, 65, 200), (54, 88, 211), + (49, 107, 207), (46, 98, 208), (37, 91, 191), (50, 71, 180), + (61, 62, 170), (73, 48, 139), (77, 22, 126), (52, 29, 120), + (32, 28, 112), (26, 27, 94), (23, 3, 102), (23, 0, 83), + (33, 5, 92), (43, 8, 90), (45, 17, 104), (40, 31, 120), + (30, 36, 134), (22, 59, 130), (18, 49, 93), (6, 24, 88), + (4, 15, 77), (0, 9, 42), (4, 8, 19), (8, 0, 15), + (14, 1, 11), (5, 3, 17), (7, 19, 19), (7, 30, 46), + (0, 33, 49), (6, 24, 60), (0, 33, 80), (9, 34, 65) + ), + +// 362 vchira_0014.jpg +((45, 230, 126), (110, 183, 68), (100, 173, 62), (91, 164, 56), + (81, 152, 60), (72, 140, 65), (51, 132, 84), (31, 124, 103), + (12, 94, 45), (7, 71, 31), (2, 49, 17), (14, 57, 17), + (27, 65, 18), (40, 86, 27), (54, 107, 37), (54, 101, 45), + (55, 96, 54), (93, 147, 113), (56, 137, 113), (19, 127, 114), + (9, 121, 105), (0, 115, 97), (0, 103, 79), (0, 91, 61), + (69, 116, 20), (116, 119, 41), (164, 122, 62), (127, 96, 34), + (91, 70, 7), (74, 59, 3), (57, 48, 0), (35, 49, 16), + (30, 55, 25), (25, 38, 44), (24, 34, 49), (24, 30, 54), + (30, 38, 45), (37, 47, 36), (46, 71, 32), (55, 96, 28), + (99, 119, 0), (114, 123, 21), (129, 127, 42), (111, 84, 61), + (93, 41, 80), (79, 32, 71), (65, 23, 63), (61, 13, 53), + (58, 10, 32), (43, 28, 0), (59, 31, 22), (75, 35, 44), + (136, 65, 54), (198, 95, 64), (184, 136, 53), (171, 177, 43), + (147, 204, 99), (173, 206, 81), (199, 208, 63), (222, 214, 77), + (245, 220, 91), (236, 233, 80), (228, 247, 69), (225, 245, 132), + (222, 229, 177), (146, 208, 183), (191, 200, 197), (237, 192, 212), + (237, 195, 187), (237, 199, 162), (202, 184, 136), (151, 161, 124), + (83, 100, 64), (70, 77, 60), (57, 55, 56), (34, 37, 46), + (12, 19, 37), (6, 16, 25), (0, 13, 14), (0, 31, 13), + (0, 36, 0), (15, 82, 28), (28, 95, 61), (42, 108, 94), + (51, 142, 125), (60, 176, 157), (79, 222, 216), (90, 238, 202), + (14, 191, 173), (10, 150, 137), (6, 110, 101), (3, 84, 84), + (0, 59, 68), (14, 22, 45), (3, 6, 23), (0, 10, 12), + (0, 17, 3), (0, 34, 0), (16, 59, 17), (32, 84, 35), + (53, 97, 56), (74, 111, 78), (121, 163, 81), (132, 186, 126), + (131, 162, 182), (127, 180, 209), (123, 198, 237), (110, 217, 224), + (97, 237, 211), (80, 250, 214), (34, 251, 230), (0, 241, 252), + (61, 236, 229), (103, 210, 218), (119, 178, 213), (136, 146, 208), + (146, 135, 201), (147, 145, 159), (132, 114, 126), (124, 124, 114), + (85, 117, 116), (86, 101, 106), (88, 85, 96), (94, 83, 96), + (100, 82, 96), (145, 89, 126), (138, 70, 119), (97, 8, 136), + (60, 5, 106), (18, 75, 60), (19, 82, 50), (20, 90, 40), + (26, 91, 33), (43, 72, 8), (50, 65, 0), (47, 60, 0), + (36, 44, 7), (20, 50, 3), (4, 57, 0), (2, 52, 0), + (0, 48, 0), (0, 47, 0), (36, 46, 0), (7, 39, 0), + (0, 40, 19), (15, 69, 45), (18, 74, 45), (22, 79, 46), + (39, 64, 61), (81, 53, 101), (140, 28, 201), (188, 44, 191), + (185, 67, 143), (142, 70, 120), (99, 73, 98), (70, 56, 47), + (47, 26, 31), (29, 24, 31), (25, 34, 13), (18, 18, 0), + (4, 13, 0), (0, 24, 2), (1, 25, 1), (3, 27, 0), + (15, 35, 8), (36, 44, 33), (42, 40, 53), (38, 33, 56), + (30, 50, 77), (22, 51, 66), (14, 52, 55), (25, 51, 26), + (36, 42, 16), (42, 31, 9), (45, 5, 13), (36, 11, 14), + (22, 23, 18), (0, 40, 26), (2, 49, 59), (13, 43, 71), + (17, 47, 73), (16, 36, 73), (15, 16, 44), (15, 9, 19), + (0, 33, 0), (14, 44, 5), (29, 56, 11), (60, 78, 18), + (138, 136, 33), (183, 160, 4), (212, 201, 33), (169, 187, 39), + (123, 197, 40), (158, 170, 72), (161, 176, 91), (154, 176, 127), + (162, 167, 135), (163, 147, 173), (184, 104, 163), (135, 84, 143), + (138, 146, 185), (92, 139, 183), (93, 149, 200), (115, 185, 183), + (125, 186, 181), (119, 149, 139), (115, 139, 107), (94, 143, 113), + (106, 164, 116), (145, 175, 167), (146, 229, 187), (204, 236, 173), + (205, 240, 158), (183, 198, 129), (186, 159, 129), (167, 167, 113), + (118, 138, 66), (107, 92, 59), (76, 72, 34), (32, 62, 38), + (20, 92, 46), (59, 96, 65), (134, 137, 92), (152, 203, 144), + (136, 200, 176), (122, 242, 170), (94, 245, 176), (85, 241, 180), + (75, 255, 147), (123, 219, 83), (194, 214, 41), (248, 245, 0), + (210, 236, 41), (207, 219, 85), (218, 213, 111), (190, 201, 122), + (177, 197, 134), (132, 200, 179), (112, 190, 210), (74, 191, 198), + (40, 180, 181), (0, 95, 134), (43, 67, 91), (18, 34, 86), + (18, 23, 53), (0, 3, 37), (12, 11, 42), (58, 3, 60), + (86, 0, 84), (106, 0, 134), (117, 10, 148), (196, 35, 177), + (182, 52, 202), (135, 34, 192), (89, 6, 136), (19, 33, 59) + ), + +// 363 vchira_0015.jpg +((104, 83, 122), (0, 48, 110), (0, 32, 101), (0, 17, 92), + (37, 40, 98), (74, 63, 105), (98, 55, 108), (123, 47, 112), + (125, 61, 121), (128, 63, 125), (132, 66, 130), (154, 113, 147), + (177, 161, 164), (201, 197, 201), (226, 233, 239), (235, 244, 240), + (245, 255, 242), (255, 240, 190), (215, 225, 199), (175, 211, 209), + (106, 156, 173), (37, 101, 137), (26, 83, 134), (15, 66, 132), + (18, 14, 91), (26, 8, 82), (35, 2, 73), (56, 31, 85), + (78, 60, 98), (85, 60, 104), (93, 61, 110), (73, 31, 117), + (59, 21, 98), (44, 0, 60), (53, 24, 61), (62, 48, 63), + (69, 60, 106), (76, 72, 149), (100, 80, 164), (125, 89, 179), + (170, 67, 200), (148, 91, 206), (127, 116, 212), (125, 128, 189), + (123, 140, 166), (128, 154, 196), (133, 168, 226), (151, 193, 253), + (197, 174, 242), (205, 224, 228), (219, 236, 207), (233, 249, 186), + (244, 252, 179), (255, 255, 172), (255, 255, 161), (255, 255, 150), + (247, 218, 20), (251, 220, 96), (255, 223, 172), (245, 218, 199), + (235, 213, 226), (232, 206, 240), (229, 199, 255), (255, 210, 255), + (255, 195, 255), (241, 188, 230), (245, 164, 197), (250, 140, 165), + (242, 142, 169), (235, 145, 173), (179, 98, 139), (157, 124, 151), + (143, 173, 123), (117, 192, 114), (92, 212, 106), (83, 148, 109), + (74, 85, 113), (81, 83, 113), (88, 81, 114), (99, 96, 105), + (150, 130, 119), (217, 205, 153), (220, 193, 172), (223, 181, 191), + (223, 170, 162), (224, 160, 133), (250, 177, 98), (241, 142, 75), + (118, 87, 93), (163, 116, 130), (209, 146, 167), (214, 155, 167), + (220, 164, 167), (193, 178, 175), (179, 178, 158), (116, 142, 159), + (89, 108, 122), (77, 50, 65), (71, 44, 60), (65, 38, 55), + (80, 44, 73), (95, 50, 91), (115, 58, 101), (94, 47, 101), + (33, 24, 55), (50, 36, 65), (67, 49, 75), (82, 65, 94), + (97, 82, 113), (120, 130, 157), (134, 159, 166), (174, 200, 215), + (202, 200, 222), (255, 245, 255), (255, 236, 254), (255, 228, 254), + (203, 206, 225), (180, 202, 226), (167, 140, 217), (108, 115, 170), + (75, 48, 163), (62, 54, 168), (50, 60, 173), (40, 66, 160), + (31, 73, 147), (41, 95, 157), (28, 98, 184), (12, 106, 194), + (33, 103, 189), (96, 140, 211), (114, 148, 217), (132, 157, 224), + (159, 155, 239), (134, 148, 211), (88, 150, 201), (101, 192, 193), + (85, 191, 142), (113, 153, 115), (142, 115, 88), (177, 130, 81), + (212, 145, 75), (234, 169, 51), (249, 182, 29), (255, 201, 85), + (243, 209, 138), (209, 225, 176), (208, 206, 195), (207, 187, 214), + (188, 200, 224), (195, 211, 227), (188, 200, 224), (168, 203, 225), + (111, 125, 170), (89, 113, 163), (67, 102, 156), (49, 70, 135), + (0, 47, 142), (7, 28, 119), (28, 22, 128), (102, 20, 193), + (144, 7, 199), (199, 8, 235), (198, 7, 237), (197, 7, 239), + (148, 27, 230), (123, 41, 239), (139, 79, 237), (149, 59, 193), + (60, 10, 73), (58, 8, 48), (57, 6, 23), (52, 13, 0), + (49, 16, 1), (38, 0, 0), (23, 0, 17), (18, 0, 59), + (14, 25, 55), (32, 30, 79), (43, 56, 91), (47, 50, 93), + (40, 23, 119), (60, 0, 93), (51, 1, 72), (66, 0, 38), + (53, 19, 0), (51, 26, 0), (50, 33, 0), (56, 35, 34), + (54, 39, 70), (57, 64, 74), (82, 49, 120), (128, 29, 148), + (124, 11, 161), (86, 25, 162), (53, 113, 165), (89, 140, 206), + (125, 155, 207), (151, 193, 233), (179, 236, 255), (207, 252, 249), + (247, 255, 255), (255, 236, 229), (224, 189, 219), (186, 163, 215), + (134, 117, 161), (104, 109, 138), (80, 83, 118), (38, 63, 117), + (8, 36, 83), (0, 31, 60), (9, 13, 86), (11, 1, 74), + (0, 16, 68), (0, 2, 61), (31, 8, 60), (64, 8, 35), + (147, 32, 45), (186, 18, 53), (208, 59, 26), (206, 108, 7), + (185, 103, 4), (195, 80, 25), (127, 68, 26), (116, 32, 0), + (96, 20, 0), (82, 4, 0), (76, 0, 0), (30, 0, 2), + (2, 6, 41), (1, 16, 49), (17, 14, 45), (65, 28, 0), + (110, 43, 37), (150, 62, 60), (174, 67, 59), (183, 117, 65), + (170, 143, 52), (207, 120, 27), (233, 84, 41), (233, 84, 41), + (234, 72, 51), (207, 84, 86), (182, 95, 103), (146, 90, 99), + (120, 55, 75), (108, 45, 74), (86, 48, 61), (71, 46, 42), + (67, 32, 64), (125, 10, 65), (158, 5, 85), (152, 32, 57), + (200, 45, 41), (182, 68, 0), (152, 42, 17), (119, 7, 0) + ), + +// 364 vchira_17.jpg +((23, 59, 55), (8, 128, 67), (20, 155, 77), (33, 182, 88), + (38, 184, 83), (43, 186, 78), (33, 178, 85), (23, 171, 93), + (0, 130, 106), (9, 112, 112), (19, 95, 118), (9, 89, 142), + (0, 83, 167), (16, 74, 151), (32, 65, 136), (42, 53, 140), + (53, 42, 144), (117, 10, 186), (127, 8, 150), (137, 7, 115), + (116, 4, 102), (95, 1, 89), (71, 11, 91), (48, 22, 93), + (0, 101, 98), (9, 100, 124), (18, 100, 150), (36, 84, 165), + (55, 68, 180), (65, 65, 191), (76, 63, 203), (104, 51, 204), + (123, 32, 198), (163, 5, 203), (175, 9, 201), (188, 14, 200), + (176, 22, 209), (164, 31, 218), (135, 69, 233), (106, 107, 249), + (19, 135, 134), (32, 165, 111), (46, 196, 88), (47, 205, 100), + (49, 215, 113), (47, 223, 125), (46, 231, 137), (41, 235, 149), + (28, 225, 153), (23, 207, 133), (12, 187, 117), (2, 167, 101), + (15, 160, 109), (29, 153, 117), (18, 157, 133), (7, 161, 149), + (21, 151, 201), (58, 108, 212), (95, 65, 223), (145, 47, 230), + (196, 30, 238), (221, 31, 231), (247, 33, 225), (242, 64, 140), + (186, 82, 91), (112, 0, 119), (90, 44, 163), (68, 89, 208), + (57, 99, 205), (46, 109, 202), (22, 152, 188), (29, 169, 122), + (21, 167, 82), (32, 174, 79), (44, 181, 77), (46, 190, 81), + (48, 199, 86), (49, 199, 85), (51, 199, 85), (58, 211, 97), + (55, 219, 106), (58, 220, 108), (63, 224, 107), (69, 229, 107), + (67, 224, 100), (65, 220, 93), (61, 210, 84), (58, 211, 94), + (51, 211, 101), (37, 196, 100), (24, 181, 100), (12, 170, 103), + (0, 159, 106), (13, 123, 120), (17, 87, 112), (23, 51, 101), + (53, 46, 116), (66, 10, 119), (70, 15, 146), (75, 20, 174), + (74, 21, 177), (74, 23, 180), (85, 19, 155), (80, 37, 168), + (58, 66, 193), (52, 79, 192), (47, 93, 191), (38, 108, 192), + (30, 124, 194), (6, 127, 172), (0, 164, 153), (0, 135, 144), + (3, 136, 131), (0, 116, 122), (4, 88, 111), (9, 61, 100), + (0, 34, 80), (4, 34, 32), (0, 29, 13), (19, 72, 18), + (0, 130, 98), (16, 167, 103), (33, 204, 108), (38, 210, 113), + (43, 217, 119), (43, 223, 136), (18, 211, 164), (1, 215, 187), + (6, 186, 223), (48, 182, 255), (48, 159, 240), (48, 136, 226), + (40, 106, 200), (13, 77, 149), (16, 57, 109), (23, 20, 89), + (130, 0, 86), (129, 15, 86), (129, 30, 87), (119, 25, 115), + (109, 21, 144), (118, 44, 199), (81, 80, 220), (67, 83, 178), + (28, 122, 134), (3, 112, 106), (17, 96, 92), (31, 81, 78), + (35, 79, 78), (11, 111, 85), (11, 132, 97), (16, 156, 95), + (12, 182, 120), (13, 185, 126), (14, 189, 132), (4, 184, 159), + (6, 165, 169), (12, 171, 193), (20, 169, 193), (42, 145, 222), + (65, 140, 242), (47, 158, 240), (32, 177, 219), (17, 197, 198), + (22, 222, 175), (35, 236, 158), (48, 242, 155), (51, 244, 155), + (48, 242, 155), (46, 241, 154), (44, 240, 154), (32, 233, 157), + (21, 222, 167), (18, 211, 182), (40, 163, 231), (100, 132, 241), + (156, 56, 242), (220, 20, 253), (239, 21, 239), (230, 2, 235), + (226, 0, 224), (193, 1, 174), (157, 44, 98), (126, 29, 82), + (36, 0, 40), (22, 6, 47), (9, 12, 55), (11, 23, 95), + (25, 29, 116), (70, 35, 127), (62, 25, 157), (54, 44, 166), + (66, 38, 151), (79, 14, 114), (49, 14, 82), (63, 0, 73), + (70, 0, 65), (98, 0, 73), (100, 3, 70), (122, 16, 64), + (122, 57, 29), (45, 129, 31), (35, 149, 53), (13, 138, 60), + (20, 134, 64), (30, 156, 72), (24, 165, 86), (27, 183, 99), + (32, 208, 123), (43, 231, 137), (44, 233, 141), (44, 236, 150), + (49, 242, 153), (55, 240, 139), (58, 240, 139), (56, 236, 136), + (59, 239, 132), (63, 232, 117), (61, 223, 101), (55, 212, 95), + (54, 212, 99), (54, 218, 106), (56, 227, 113), (42, 231, 139), + (36, 233, 153), (32, 233, 155), (36, 234, 155), (36, 234, 157), + (31, 231, 158), (28, 222, 149), (18, 208, 146), (25, 157, 117), + (2, 126, 102), (0, 64, 91), (36, 5, 46), (68, 9, 29), + (31, 1, 37), (18, 2, 28), (20, 67, 13), (23, 106, 26), + (35, 135, 45), (45, 144, 79), (22, 159, 81), (23, 174, 93), + (25, 196, 118), (38, 211, 121), (36, 228, 143), (39, 236, 154), + (42, 239, 157), (40, 237, 157), (38, 235, 153), (34, 232, 155), + (23, 217, 147), (22, 203, 132), (32, 187, 96), (47, 185, 73) + ), + +// 365 vchira_18pp1.jpg +((74, 7, 183), (102, 15, 208), (108, 66, 231), (115, 117, 254), + (128, 116, 254), (142, 115, 254), (141, 111, 252), (140, 108, 251), + (197, 52, 179), (198, 54, 176), (200, 57, 173), (183, 78, 205), + (166, 99, 238), (152, 130, 246), (139, 162, 255), (130, 165, 250), + (122, 168, 246), (106, 119, 247), (125, 115, 248), (145, 111, 250), + (162, 99, 240), (180, 87, 230), (192, 81, 213), (204, 76, 197), + (242, 106, 178), (225, 76, 166), (208, 46, 155), (194, 31, 146), + (181, 17, 138), (183, 17, 137), (185, 17, 136), (185, 17, 136), + (193, 32, 146), (226, 104, 151), (239, 119, 152), (252, 135, 153), + (253, 167, 173), (255, 199, 194), (253, 211, 198), (251, 223, 202), + (250, 253, 242), (252, 251, 248), (254, 249, 255), (245, 248, 250), + (236, 248, 246), (190, 235, 241), (144, 223, 236), (120, 202, 216), + (145, 162, 255), (255, 167, 255), (251, 171, 234), (248, 176, 214), + (241, 149, 204), (234, 122, 194), (220, 87, 182), (206, 53, 170), + (139, 10, 172), (132, 16, 183), (125, 23, 195), (125, 29, 205), + (126, 35, 216), (132, 40, 219), (139, 46, 222), (143, 72, 230), + (150, 92, 255), (156, 133, 255), (173, 155, 255), (190, 178, 255), + (181, 155, 248), (172, 133, 242), (157, 109, 247), (161, 64, 219), + (169, 14, 142), (158, 9, 114), (148, 5, 87), (127, 4, 91), + (106, 3, 95), (117, 1, 97), (129, 0, 100), (142, 1, 116), + (148, 3, 130), (166, 10, 145), (175, 13, 140), (184, 16, 135), + (184, 15, 132), (184, 15, 130), (185, 13, 125), (186, 15, 130), + (191, 27, 140), (205, 45, 150), (219, 63, 160), (234, 75, 144), + (249, 88, 129), (253, 76, 102), (233, 44, 112), (221, 23, 100), + (206, 23, 105), (157, 4, 87), (165, 3, 94), (174, 2, 102), + (180, 6, 111), (187, 11, 120), (184, 12, 122), (191, 17, 128), + (245, 72, 102), (236, 67, 120), (227, 62, 139), (220, 56, 133), + (213, 51, 127), (215, 41, 138), (193, 20, 128), (186, 12, 123), + (199, 11, 106), (184, 12, 120), (178, 6, 115), (173, 1, 111), + (140, 0, 120), (136, 3, 144), (125, 9, 158), (130, 2, 147), + (152, 7, 148), (160, 10, 147), (169, 13, 146), (169, 17, 153), + (170, 22, 160), (202, 45, 162), (196, 65, 169), (204, 71, 190), + (216, 102, 215), (248, 135, 197), (238, 135, 206), (228, 135, 215), + (232, 170, 233), (189, 189, 255), (178, 219, 241), (245, 191, 217), + (254, 192, 197), (242, 170, 167), (230, 148, 137), (242, 131, 120), + (255, 114, 104), (255, 90, 133), (248, 93, 151), (231, 87, 156), + (215, 50, 155), (172, 8, 129), (164, 6, 132), (156, 5, 136), + (129, 0, 124), (116, 0, 135), (65, 18, 124), (76, 4, 166), + (66, 5, 168), (67, 2, 173), (68, 0, 179), (59, 2, 192), + (74, 0, 199), (96, 18, 215), (112, 74, 247), (137, 92, 247), + (155, 79, 231), (171, 34, 182), (172, 31, 173), (174, 28, 165), + (168, 21, 163), (155, 18, 170), (130, 45, 166), (123, 58, 210), + (113, 112, 231), (140, 106, 235), (167, 100, 239), (218, 114, 225), + (246, 128, 204), (250, 143, 185), (244, 152, 203), (243, 155, 203), + (187, 144, 213), (116, 170, 244), (68, 149, 231), (85, 192, 212), + (126, 231, 224), (207, 255, 226), (245, 255, 244), (238, 245, 253), + (255, 239, 255), (245, 230, 255), (236, 222, 255), (240, 199, 243), + (217, 155, 238), (150, 112, 251), (84, 72, 240), (77, 0, 196), + (72, 0, 204), (27, 1, 222), (55, 89, 213), (47, 153, 201), + (60, 165, 212), (36, 159, 192), (28, 150, 191), (43, 119, 229), + (86, 88, 248), (112, 18, 192), (117, 7, 182), (137, 13, 173), + (163, 21, 167), (167, 38, 165), (160, 111, 193), (118, 159, 238), + (109, 169, 242), (119, 165, 250), (142, 144, 255), (135, 96, 241), + (153, 51, 212), (141, 26, 192), (153, 14, 165), (164, 12, 147), + (179, 17, 139), (184, 20, 143), (168, 22, 157), (146, 15, 173), + (139, 26, 194), (138, 29, 198), (126, 23, 190), (137, 15, 178), + (158, 14, 164), (173, 27, 164), (175, 21, 155), (188, 30, 153), + (212, 50, 161), (223, 81, 165), (236, 103, 158), (255, 135, 172), + (251, 143, 175), (242, 169, 189), (249, 222, 192), (255, 227, 218), + (253, 237, 237), (255, 240, 255), (246, 228, 228), (255, 215, 223), + (233, 185, 245), (168, 115, 245), (151, 77, 234), (133, 39, 215), + (117, 12, 192), (114, 10, 181), (102, 5, 183), (101, 10, 176), + (113, 10, 154), (114, 0, 161), (100, 5, 185), (97, 17, 214), + (81, 81, 239), (44, 121, 229), (75, 177, 217), (52, 169, 202) + ), + +// 366 vchira_19.jpg +((225, 128, 161), (246, 212, 86), (231, 233, 65), (216, 254, 44), + (158, 206, 23), (101, 158, 3), (102, 126, 1), (104, 95, 0), + (189, 151, 6), (206, 193, 8), (224, 235, 11), (213, 245, 24), + (203, 255, 37), (155, 249, 56), (107, 243, 75), (98, 244, 98), + (90, 246, 121), (207, 243, 91), (200, 230, 116), (193, 217, 141), + (173, 228, 146), (154, 240, 151), (121, 242, 138), (89, 244, 126), + (13, 244, 212), (7, 190, 176), (1, 136, 140), (1, 93, 108), + (1, 51, 76), (9, 37, 62), (17, 23, 49), (7, 23, 23), + (3, 12, 17), (6, 45, 0), (27, 62, 2), (49, 79, 5), + (90, 116, 8), (131, 154, 11), (137, 192, 34), (144, 230, 57), + (173, 225, 127), (93, 168, 109), (13, 112, 92), (12, 88, 70), + (12, 65, 49), (7, 59, 58), (2, 54, 67), (19, 54, 94), + (35, 46, 110), (13, 38, 95), (37, 51, 52), (62, 65, 10), + (63, 66, 11), (65, 68, 13), (43, 66, 10), (21, 64, 8), + (2, 41, 10), (35, 43, 5), (69, 45, 0), (104, 70, 0), + (139, 95, 0), (160, 122, 0), (182, 149, 0), (226, 229, 0), + (248, 239, 12), (241, 250, 0), (247, 251, 0), (253, 252, 1), + (250, 251, 5), (247, 250, 9), (245, 255, 11), (229, 249, 30), + (241, 233, 44), (248, 168, 93), (255, 103, 143), (250, 83, 147), + (246, 64, 151), (246, 100, 142), (246, 137, 134), (255, 160, 98), + (251, 157, 57), (171, 149, 1), (125, 111, 0), (80, 74, 0), + (55, 91, 16), (30, 108, 32), (10, 137, 86), (0, 159, 131), + (59, 253, 190), (89, 221, 180), (120, 189, 170), (135, 192, 165), + (150, 196, 160), (101, 134, 165), (45, 146, 106), (74, 96, 50), + (37, 73, 11), (0, 37, 29), (0, 36, 28), (0, 35, 28), + (1, 35, 42), (3, 35, 56), (5, 42, 68), (24, 17, 85), + (38, 11, 82), (31, 5, 51), (25, 0, 21), (28, 3, 24), + (31, 6, 27), (33, 1, 50), (56, 0, 65), (89, 1, 79), + (106, 0, 110), (146, 0, 134), (168, 1, 150), (191, 2, 166), + (238, 60, 148), (238, 108, 82), (229, 142, 39), (233, 203, 0), + (180, 122, 25), (148, 92, 12), (116, 63, 0), (93, 50, 0), + (70, 38, 0), (42, 8, 0), (28, 1, 0), (29, 10, 12), + (41, 10, 8), (87, 0, 33), (119, 6, 62), (151, 13, 91), + (192, 10, 129), (201, 2, 179), (213, 7, 177), (210, 11, 192), + (144, 22, 209), (72, 81, 164), (1, 140, 119), (1, 129, 109), + (2, 118, 99), (7, 106, 62), (5, 68, 41), (2, 50, 26), + (10, 40, 14), (1, 90, 62), (1, 101, 80), (1, 113, 99), + (6, 136, 90), (9, 152, 99), (0, 173, 138), (15, 224, 167), + (46, 169, 102), (43, 157, 64), (40, 145, 27), (48, 85, 7), + (58, 99, 3), (56, 145, 1), (52, 144, 35), (70, 176, 28), + (54, 182, 61), (122, 217, 65), (83, 176, 52), (45, 135, 39), + (26, 61, 7), (22, 16, 0), (11, 8, 0), (0, 18, 0), + (8, 3, 7), (8, 3, 3), (8, 3, 0), (2, 1, 9), + (3, 3, 13), (2, 1, 6), (3, 0, 4), (8, 0, 0), + (4, 2, 7), (6, 0, 11), (15, 0, 21), (29, 6, 26), + (43, 0, 28), (75, 0, 61), (99, 1, 86), (110, 0, 93), + (70, 3, 80), (55, 1, 74), (41, 0, 69), (28, 4, 54), + (59, 1, 23), (74, 20, 18), (98, 23, 28), (142, 46, 34), + (148, 65, 21), (163, 79, 68), (202, 73, 91), (153, 15, 64), + (138, 20, 52), (135, 21, 57), (132, 8, 58), (113, 23, 48), + (86, 3, 55), (55, 9, 11), (53, 5, 5), (55, 22, 5), + (75, 42, 9), (56, 63, 12), (47, 32, 9), (29, 42, 0), + (32, 39, 0), (100, 71, 3), (156, 90, 16), (200, 117, 15), + (236, 197, 14), (248, 242, 32), (255, 251, 34), (248, 252, 15), + (235, 255, 12), (233, 252, 20), (197, 226, 40), (164, 190, 7), + (107, 126, 1), (89, 89, 0), (65, 138, 0), (59, 148, 0), + (96, 159, 10), (117, 175, 13), (139, 187, 0), (194, 216, 19), + (181, 174, 21), (183, 73, 58), (200, 44, 92), (250, 38, 184), + (216, 3, 189), (216, 5, 195), (229, 7, 216), (253, 27, 222), + (229, 143, 180), (234, 178, 129), (235, 185, 98), (223, 211, 65), + (177, 255, 71), (225, 229, 54), (233, 225, 38), (242, 185, 20), + (196, 110, 25), (119, 65, 18), (71, 43, 19), (51, 19, 22), + (36, 30, 56), (31, 30, 108), (106, 0, 110), (144, 4, 175), + (172, 12, 182), (149, 9, 168), (113, 61, 109), (9, 65, 114) + ), + +// 367 vchira_28.jpg +((0, 2, 44), (0, 71, 177), (12, 101, 195), (24, 131, 213), + (13, 117, 214), (3, 103, 215), (5, 91, 190), (8, 80, 165), + (26, 68, 108), (29, 55, 79), (33, 42, 51), (60, 51, 45), + (88, 61, 40), (75, 69, 60), (63, 77, 80), (47, 65, 78), + (31, 53, 76), (25, 35, 47), (38, 20, 26), (52, 6, 6), + (54, 12, 8), (56, 19, 11), (63, 26, 10), (70, 34, 10), + (114, 41, 6), (79, 38, 14), (45, 35, 23), (43, 24, 12), + (42, 14, 2), (27, 10, 3), (12, 7, 4), (3, 2, 0), + (4, 1, 10), (13, 3, 4), (54, 16, 18), (96, 30, 32), + (130, 62, 31), (164, 95, 30), (178, 97, 27), (192, 100, 25), + (166, 124, 74), (172, 144, 111), (178, 165, 149), (210, 170, 104), + (242, 175, 60), (248, 199, 43), (255, 223, 26), (252, 233, 69), + (254, 242, 122), (221, 225, 250), (188, 184, 193), (156, 143, 137), + (115, 112, 113), (74, 81, 89), (71, 67, 83), (68, 54, 77), + (40, 44, 56), (55, 74, 97), (70, 104, 139), (122, 147, 172), + (174, 190, 205), (183, 198, 211), (193, 207, 218), (193, 199, 231), + (173, 194, 215), (101, 137, 161), (82, 84, 145), (63, 31, 130), + (64, 15, 85), (65, 0, 40), (50, 3, 19), (72, 6, 16), + (105, 12, 23), (109, 15, 20), (114, 19, 17), (99, 12, 22), + (84, 6, 28), (88, 5, 37), (93, 5, 47), (133, 5, 53), + (165, 26, 19), (153, 22, 27), (103, 49, 68), (54, 77, 109), + (49, 80, 131), (45, 83, 154), (24, 83, 163), (52, 94, 168), + (3, 67, 191), (17, 58, 193), (32, 50, 196), (54, 38, 208), + (76, 26, 221), (88, 39, 208), (151, 23, 208), (203, 1, 209), + (137, 6, 180), (110, 35, 187), (78, 60, 195), (46, 85, 204), + (26, 71, 192), (7, 57, 180), (0, 40, 130), (11, 43, 84), + (12, 9, 76), (17, 10, 87), (22, 12, 99), (19, 20, 121), + (17, 28, 143), (2, 51, 172), (11, 52, 180), (16, 46, 178), + (61, 11, 162), (51, 6, 75), (34, 4, 56), (18, 2, 38), + (7, 14, 22), (0, 6, 22), (1, 11, 36), (0, 10, 37), + (0, 9, 70), (6, 7, 71), (12, 5, 72), (15, 3, 57), + (18, 1, 43), (35, 0, 49), (60, 8, 12), (115, 26, 0), + (171, 53, 3), (199, 97, 35), (182, 112, 59), (165, 128, 84), + (192, 156, 158), (203, 193, 201), (218, 203, 198), (220, 212, 201), + (223, 206, 160), (220, 200, 160), (218, 195, 161), (211, 185, 148), + (204, 176, 136), (187, 139, 77), (220, 149, 57), (213, 125, 15), + (221, 94, 23), (221, 36, 112), (199, 22, 120), (177, 9, 128), + (159, 2, 143), (165, 1, 192), (208, 10, 181), (255, 48, 198), + (218, 145, 162), (207, 150, 166), (196, 155, 171), (200, 113, 147), + (223, 35, 129), (179, 5, 152), (151, 1, 135), (108, 2, 172), + (87, 0, 85), (16, 6, 30), (10, 3, 22), (4, 0, 14), + (5, 6, 10), (34, 12, 1), (56, 29, 10), (98, 38, 2), + (186, 44, 34), (189, 30, 48), (193, 17, 63), (205, 45, 73), + (222, 17, 112), (188, 40, 114), (157, 119, 80), (126, 107, 153), + (71, 113, 153), (64, 115, 162), (36, 130, 204), (48, 120, 204), + (87, 72, 213), (77, 20, 185), (78, 25, 129), (104, 12, 59), + (138, 72, 12), (148, 74, 7), (158, 76, 3), (183, 82, 2), + (203, 104, 2), (219, 102, 0), (226, 116, 1), (208, 116, 7), + (209, 117, 16), (192, 105, 34), (167, 105, 54), (85, 92, 98), + (85, 89, 90), (57, 60, 49), (43, 39, 38), (67, 35, 12), + (111, 54, 11), (176, 90, 15), (222, 96, 55), (237, 172, 68), + (222, 170, 86), (179, 125, 63), (144, 100, 55), (134, 83, 52), + (75, 56, 39), (27, 34, 40), (16, 29, 45), (1, 10, 51), + (7, 27, 77), (1, 21, 84), (10, 50, 99), (0, 33, 114), + (2, 32, 122), (1, 56, 147), (17, 94, 172), (71, 147, 196), + (105, 168, 211), (154, 186, 211), (199, 213, 216), (220, 218, 219), + (223, 224, 226), (222, 217, 211), (194, 209, 216), (134, 214, 247), + (121, 164, 217), (94, 177, 227), (77, 148, 214), (78, 159, 214), + (56, 181, 235), (27, 150, 228), (61, 144, 212), (62, 81, 222), + (62, 36, 189), (91, 2, 152), (101, 1, 89), (95, 1, 75), + (52, 2, 51), (84, 3, 44), (145, 9, 55), (196, 18, 104), + (219, 36, 119), (211, 19, 154), (224, 1, 212), (213, 5, 215), + (185, 1, 175), (113, 34, 141), (125, 0, 82), (123, 18, 61), + (129, 103, 76), (174, 141, 126), (232, 222, 212), (217, 189, 168) + ), + +// 368 vchira_2pp1.jpg +((179, 181, 0), (231, 161, 3), (239, 153, 1), (248, 146, 0), + (210, 116, 0), (173, 87, 0), (165, 82, 0), (157, 78, 0), + (133, 20, 26), (108, 15, 59), (84, 11, 92), (65, 29, 94), + (46, 48, 97), (23, 39, 162), (1, 31, 227), (4, 40, 240), + (7, 50, 253), (12, 165, 199), (17, 158, 160), (23, 152, 121), + (28, 147, 84), (33, 143, 48), (39, 151, 43), (46, 160, 38), + (16, 90, 93), (9, 68, 140), (2, 47, 188), (22, 38, 211), + (42, 30, 234), (51, 15, 208), (60, 0, 183), (92, 21, 141), + (122, 33, 61), (235, 140, 0), (223, 191, 2), (212, 242, 4), + (157, 242, 9), (103, 243, 14), (78, 243, 21), (53, 244, 29), + (17, 236, 118), (39, 187, 115), (61, 139, 113), (54, 135, 84), + (48, 132, 55), (31, 131, 77), (15, 130, 99), (15, 66, 113), + (3, 71, 144), (2, 141, 122), (8, 100, 116), (14, 60, 110), + (46, 35, 106), (79, 10, 103), (84, 10, 100), (90, 10, 97), + (56, 41, 100), (47, 87, 65), (39, 134, 30), (21, 185, 30), + (4, 237, 31), (9, 240, 31), (15, 243, 32), (39, 250, 25), + (40, 248, 15), (86, 197, 33), (105, 169, 16), (124, 141, 0), + (86, 140, 0), (48, 139, 0), (0, 135, 0), (26, 203, 24), + (117, 234, 44), (180, 213, 60), (244, 193, 76), (244, 192, 66), + (244, 192, 56), (248, 198, 50), (252, 204, 44), (225, 247, 24), + (230, 255, 32), (254, 227, 0), (249, 179, 0), (244, 132, 0), + (249, 103, 0), (255, 75, 1), (253, 43, 10), (255, 23, 12), + (247, 3, 75), (152, 2, 130), (58, 2, 185), (36, 9, 195), + (15, 16, 205), (8, 12, 221), (19, 9, 230), (10, 16, 252), + (7, 33, 254), (6, 85, 203), (15, 88, 196), (24, 92, 189), + (14, 88, 213), (5, 84, 237), (21, 74, 238), (33, 58, 213), + (172, 146, 111), (126, 194, 84), (80, 243, 58), (48, 238, 61), + (17, 234, 65), (22, 234, 87), (22, 209, 128), (3, 176, 133), + (39, 139, 189), (23, 8, 211), (69, 10, 188), (115, 12, 165), + (188, 2, 113), (226, 1, 67), (213, 8, 51), (228, 22, 24), + (227, 51, 62), (178, 30, 93), (130, 9, 125), (98, 5, 145), + (66, 1, 165), (55, 6, 194), (30, 2, 200), (47, 3, 162), + (75, 2, 119), (110, 13, 80), (128, 14, 71), (146, 16, 62), + (155, 5, 76), (154, 15, 57), (195, 29, 29), (252, 46, 9), + (243, 77, 3), (218, 67, 11), (193, 57, 19), (175, 63, 23), + (157, 70, 27), (133, 68, 40), (128, 41, 58), (111, 77, 39), + (45, 142, 47), (46, 200, 70), (56, 213, 58), (67, 226, 46), + (80, 249, 6), (128, 238, 3), (205, 219, 8), (233, 211, 29), + (192, 106, 0), (185, 90, 0), (179, 75, 0), (162, 69, 51), + (102, 76, 113), (51, 86, 92), (45, 140, 56), (37, 198, 69), + (21, 226, 25), (27, 227, 7), (35, 234, 15), (43, 241, 24), + (73, 240, 10), (78, 225, 12), (56, 207, 32), (66, 214, 66), + (68, 206, 252), (49, 144, 241), (31, 83, 231), (30, 48, 246), + (1, 22, 251), (1, 11, 230), (3, 19, 236), (21, 23, 248), + (11, 38, 239), (0, 43, 213), (0, 33, 206), (9, 23, 171), + (6, 48, 146), (7, 47, 134), (11, 46, 127), (13, 25, 123), + (83, 66, 59), (85, 89, 32), (87, 113, 6), (148, 132, 0), + (176, 134, 0), (193, 160, 0), (188, 170, 0), (199, 188, 0), + (207, 180, 3), (224, 150, 27), (222, 142, 45), (222, 119, 86), + (255, 168, 71), (242, 146, 59), (237, 85, 46), (243, 61, 11), + (220, 70, 9), (197, 91, 15), (143, 74, 7), (33, 82, 3), + (47, 140, 7), (59, 198, 9), (124, 227, 0), (199, 247, 3), + (215, 231, 11), (226, 228, 7), (240, 182, 13), (234, 154, 15), + (221, 167, 9), (164, 181, 43), (152, 188, 18), (118, 209, 7), + (168, 196, 0), (159, 163, 14), (165, 133, 0), (143, 139, 3), + (139, 158, 0), (89, 195, 1), (63, 211, 0), (61, 219, 0), + (119, 235, 4), (164, 244, 5), (215, 234, 18), (237, 235, 12), + (255, 195, 40), (253, 142, 8), (245, 112, 7), (221, 128, 7), + (156, 142, 0), (120, 200, 5), (70, 204, 19), (28, 241, 35), + (11, 252, 49), (66, 228, 46), (128, 242, 9), (178, 229, 4), + (218, 208, 32), (241, 180, 14), (240, 147, 7), (232, 118, 4), + (249, 52, 7), (250, 23, 14), (223, 1, 24), (193, 11, 34), + (207, 5, 21), (218, 0, 14), (227, 12, 7), (254, 34, 8), + (246, 75, 3), (228, 107, 2), (186, 201, 76), (193, 125, 24) + ), + +// 369 00017 +((86, 162, 180), (79, 164, 187), (79, 163, 189), (80, 162, 191), + (86, 163, 190), (93, 164, 189), (96, 164, 188), (100, 164, 188), + (105, 163, 185), (102, 167, 183), (100, 171, 182), (97, 176, 180), + (94, 182, 179), (90, 190, 178), (87, 198, 177), (87, 202, 176), + (88, 206, 175), (95, 223, 178), (102, 226, 178), (109, 230, 178), + (117, 231, 175), (125, 233, 173), (128, 232, 171), (131, 231, 170), + (145, 226, 164), (149, 223, 164), (153, 220, 164), (157, 217, 164), + (162, 215, 164), (161, 214, 163), (160, 214, 163), (161, 210, 162), + (163, 206, 164), (166, 196, 172), (167, 190, 175), (168, 185, 179), + (169, 178, 181), (171, 172, 184), (173, 168, 183), (176, 165, 183), + (189, 149, 180), (192, 139, 181), (195, 130, 183), (195, 123, 186), + (196, 117, 189), (193, 114, 191), (190, 111, 193), (184, 106, 197), + (177, 103, 202), (163, 101, 209), (156, 103, 211), (149, 106, 214), + (142, 108, 213), (135, 110, 213), (133, 112, 211), (132, 114, 209), + (131, 122, 200), (135, 122, 199), (140, 123, 198), (142, 120, 196), + (145, 118, 194), (144, 116, 192), (144, 114, 191), (141, 110, 186), + (139, 105, 180), (136, 103, 170), (133, 102, 169), (131, 101, 169), + (129, 100, 169), (127, 100, 169), (127, 98, 170), (127, 98, 170), + (125, 99, 171), (126, 103, 169), (127, 107, 168), (127, 108, 170), + (127, 109, 172), (126, 109, 172), (126, 109, 172), (125, 107, 170), + (125, 106, 167), (128, 107, 166), (126, 107, 169), (124, 108, 173), + (123, 107, 176), (123, 107, 179), (121, 106, 183), (117, 103, 188), + (108, 98, 189), (104, 103, 189), (100, 108, 190), (98, 111, 192), + (96, 114, 194), (91, 121, 200), (87, 128, 202), (83, 134, 203), + (78, 142, 204), (69, 158, 197), (62, 161, 190), (55, 165, 183), + (55, 167, 179), (55, 169, 176), (57, 175, 172), (58, 183, 168), + (57, 190, 160), (55, 191, 157), (53, 192, 155), (51, 191, 155), + (50, 191, 155), (50, 191, 150), (54, 191, 145), (61, 191, 141), + (68, 191, 140), (82, 189, 136), (84, 188, 135), (86, 187, 135), + (92, 181, 129), (102, 178, 125), (112, 179, 120), (123, 182, 115), + (140, 187, 106), (146, 184, 102), (152, 181, 98), (152, 178, 98), + (153, 175, 98), (156, 169, 98), (163, 164, 98), (169, 160, 103), + (175, 157, 108), (182, 154, 126), (181, 151, 129), (181, 148, 133), + (183, 139, 139), (187, 129, 142), (195, 121, 147), (203, 115, 151), + (221, 108, 158), (226, 102, 162), (231, 96, 166), (231, 92, 168), + (232, 88, 170), (232, 82, 174), (231, 78, 178), (230, 75, 179), + (229, 74, 178), (228, 78, 177), (227, 79, 176), (227, 81, 175), + (226, 81, 171), (226, 79, 171), (227, 76, 173), (227, 71, 177), + (229, 64, 182), (226, 63, 181), (224, 62, 180), (218, 62, 178), + (212, 61, 176), (204, 61, 174), (197, 62, 172), (190, 63, 173), + (184, 62, 172), (171, 65, 164), (167, 66, 159), (163, 67, 155), + (154, 70, 145), (148, 72, 139), (144, 73, 135), (141, 72, 134), + (142, 71, 132), (141, 71, 131), (141, 71, 131), (143, 71, 132), + (145, 67, 132), (145, 64, 131), (145, 60, 136), (144, 53, 144), + (145, 45, 152), (145, 38, 162), (145, 32, 167), (143, 29, 165), + (141, 29, 164), (140, 30, 162), (138, 32, 160), (139, 36, 158), + (147, 36, 149), (148, 36, 148), (150, 36, 147), (153, 32, 145), + (155, 29, 144), (157, 28, 144), (157, 27, 145), (158, 26, 143), + (162, 26, 146), (170, 28, 150), (175, 29, 153), (179, 29, 153), + (182, 28, 154), (181, 27, 152), (177, 30, 149), (172, 32, 145), + (166, 36, 138), (159, 40, 131), (151, 43, 123), (144, 46, 121), + (137, 52, 121), (128, 58, 123), (118, 62, 121), (109, 65, 120), + (105, 70, 120), (102, 75, 122), (99, 79, 124), (98, 83, 130), + (98, 85, 136), (96, 88, 143), (93, 92, 152), (91, 96, 159), + (92, 101, 164), (92, 104, 165), (94, 105, 167), (97, 107, 172), + (99, 109, 178), (98, 109, 184), (94, 107, 187), (92, 106, 190), + (91, 107, 192), (90, 109, 196), (91, 114, 202), (95, 121, 205), + (101, 127, 207), (105, 134, 210), (108, 140, 211), (112, 145, 210), + (114, 149, 208), (113, 149, 205), (112, 152, 203), (113, 156, 202), + (114, 160, 201), (115, 159, 201), (116, 155, 201), (119, 151, 201), + (121, 145, 200), (126, 137, 200), (129, 130, 199), (134, 123, 194), + (137, 117, 190), (135, 114, 186), (134, 113, 181), (131, 115, 178), + (127, 116, 175), (121, 120, 174), (113, 126, 173), (109, 136, 174), + (105, 143, 175), (101, 149, 176), (97, 154, 177), (90, 159, 179) + ), + +// 370 040208-115 +((88, 175, 222), (100, 187, 234), (106, 192, 238), (113, 197, 242), + (108, 187, 227), (103, 178, 212), (98, 177, 207), (94, 176, 203), + (133, 142, 168), (143, 146, 166), (153, 151, 165), (141, 157, 164), + (129, 163, 163), (111, 142, 134), (94, 122, 105), (89, 123, 109), + (84, 124, 114), (51, 103, 100), (40, 66, 82), (29, 29, 65), + (58, 26, 89), (87, 23, 113), (102, 30, 128), (117, 37, 144), + (78, 72, 130), (80, 126, 166), (83, 181, 203), (68, 167, 204), + (54, 153, 206), (53, 152, 203), (53, 152, 201), (48, 152, 200), + (59, 148, 193), (54, 146, 192), (46, 141, 185), (39, 137, 179), + (35, 120, 161), (31, 104, 144), (28, 97, 120), (26, 91, 97), + (10, 36, 43), (11, 28, 31), (13, 21, 19), (6, 11, 10), + (0, 2, 1), (0, 1, 1), (0, 0, 1), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 3, 3), (0, 6, 7), (6, 13, 16), (13, 21, 26), + (28, 24, 29), (24, 22, 36), (20, 21, 43), (35, 38, 52), + (51, 56, 62), (56, 62, 66), (62, 68, 70), (64, 94, 88), + (129, 103, 110), (170, 125, 134), (174, 145, 154), (179, 166, 174), + (181, 169, 180), (184, 173, 187), (179, 178, 200), (187, 203, 225), + (181, 195, 238), (182, 205, 244), (184, 216, 250), (178, 220, 244), + (173, 224, 238), (167, 213, 231), (162, 202, 225), (157, 180, 215), + (157, 177, 212), (160, 163, 190), (150, 176, 198), (141, 189, 206), + (135, 189, 207), (130, 189, 209), (125, 184, 223), (119, 197, 238), + (119, 192, 244), (129, 205, 245), (140, 219, 247), (145, 233, 250), + (151, 247, 253), (149, 252, 255), (151, 254, 255), (160, 238, 255), + (176, 238, 255), (178, 235, 241), (164, 208, 220), (151, 182, 200), + (149, 184, 193), (148, 186, 187), (136, 188, 190), (119, 169, 176), + (138, 176, 190), (133, 174, 195), (129, 173, 200), (130, 165, 196), + (132, 158, 192), (91, 97, 179), (103, 92, 187), (131, 110, 189), + (182, 133, 187), (153, 141, 168), (156, 143, 161), (160, 146, 155), + (160, 130, 136), (162, 125, 126), (163, 101, 100), (170, 78, 78), + (190, 67, 83), (212, 55, 71), (234, 43, 59), (218, 52, 71), + (203, 62, 83), (204, 81, 97), (206, 84, 106), (225, 88, 129), + (222, 56, 72), (215, 94, 118), (221, 96, 127), (227, 99, 137), + (212, 97, 116), (225, 95, 117), (234, 100, 116), (231, 113, 131), + (219, 151, 169), (208, 146, 169), (198, 141, 169), (191, 139, 158), + (185, 138, 148), (163, 106, 112), (163, 84, 89), (160, 61, 69), + (160, 51, 69), (125, 50, 74), (114, 38, 63), (103, 26, 53), + (27, 13, 51), (2, 11, 35), (5, 0, 7), (1, 0, 2), + (28, 0, 35), (35, 3, 43), (42, 7, 51), (80, 12, 95), + (100, 40, 93), (110, 31, 60), (143, 32, 52), (125, 44, 37), + (118, 35, 58), (100, 10, 103), (105, 13, 104), (110, 16, 105), + (141, 35, 132), (170, 86, 162), (181, 100, 157), (151, 118, 157), + (140, 97, 108), (136, 92, 102), (132, 88, 97), (129, 100, 106), + (129, 116, 126), (99, 112, 122), (65, 94, 125), (61, 87, 116), + (67, 71, 103), (130, 70, 98), (138, 53, 50), (141, 51, 52), + (146, 40, 57), (151, 32, 48), (144, 45, 53), (160, 51, 58), + (160, 42, 44), (166, 48, 52), (173, 54, 60), (187, 62, 85), + (189, 67, 85), (187, 64, 82), (179, 67, 71), (176, 62, 66), + (170, 67, 68), (174, 61, 65), (170, 64, 66), (165, 65, 64), + (162, 65, 70), (166, 83, 88), (166, 88, 93), (163, 89, 91), + (157, 102, 97), (157, 106, 116), (160, 95, 97), (154, 96, 94), + (152, 114, 113), (144, 124, 128), (134, 129, 140), (118, 123, 135), + (119, 143, 136), (114, 148, 137), (116, 155, 145), (108, 158, 170), + (103, 164, 166), (102, 211, 182), (116, 247, 234), (118, 249, 247), + (129, 248, 250), (135, 250, 247), (149, 250, 247), (141, 246, 245), + (141, 249, 240), (146, 247, 247), (146, 211, 236), (148, 203, 228), + (144, 226, 228), (136, 199, 233), (135, 174, 222), (148, 193, 225), + (166, 192, 219), (182, 208, 244), (197, 219, 250), (214, 222, 252), + (215, 219, 250), (193, 216, 252), (173, 223, 253), (160, 222, 253), + (144, 221, 244), (129, 206, 236), (125, 203, 233), (102, 239, 230), + (99, 204, 199), (84, 169, 197), (70, 137, 149), (21, 119, 101), + (24, 99, 91), (24, 62, 56), (23, 46, 40), (26, 26, 27), + (26, 32, 30), (34, 46, 42), (35, 92, 67), (48, 101, 113), + (62, 107, 119), (62, 139, 160), (62, 150, 184), (72, 171, 220) + ), + +// 371 040221-00 +((112, 84, 74), (97, 83, 80), (96, 83, 80), (95, 84, 81), + (92, 77, 73), (90, 71, 66), (86, 67, 62), (82, 63, 58), + (67, 43, 40), (65, 36, 33), (64, 30, 27), (68, 26, 21), + (73, 22, 16), (80, 19, 12), (87, 17, 9), (90, 16, 8), + (93, 16, 7), (111, 21, 7), (121, 25, 9), (131, 29, 12), + (137, 32, 13), (143, 36, 14), (144, 35, 13), (146, 35, 13), + (148, 37, 13), (149, 39, 14), (151, 42, 15), (144, 45, 18), + (138, 48, 21), (132, 46, 21), (127, 45, 22), (112, 41, 22), + (96, 35, 20), (69, 23, 13), (61, 20, 11), (54, 17, 10), + (52, 16, 9), (50, 15, 9), (49, 14, 9), (48, 14, 9), + (49, 12, 11), (54, 16, 14), (59, 21, 18), (70, 30, 26), + (81, 39, 34), (88, 43, 38), (95, 48, 42), (110, 59, 49), + (123, 68, 57), (141, 85, 73), (149, 94, 82), (157, 103, 92), + (161, 108, 97), (166, 113, 102), (169, 114, 101), (172, 115, 100), + (170, 106, 89), (164, 97, 80), (158, 88, 72), (149, 78, 65), + (140, 69, 58), (138, 64, 53), (137, 60, 49), (132, 52, 39), + (135, 52, 39), (136, 50, 36), (131, 51, 39), (126, 52, 42), + (124, 53, 44), (123, 55, 46), (111, 49, 42), (109, 52, 48), + (115, 61, 53), (115, 66, 58), (115, 71, 63), (111, 75, 67), + (108, 79, 72), (103, 77, 72), (98, 76, 72), (95, 76, 70), + (98, 75, 66), (117, 78, 60), (132, 90, 71), (147, 103, 83), + (153, 110, 90), (159, 117, 97), (170, 131, 114), (176, 141, 125), + (185, 148, 130), (190, 152, 134), (195, 157, 139), (199, 162, 143), + (203, 167, 148), (214, 182, 166), (221, 196, 183), (226, 206, 198), + (226, 213, 207), (220, 214, 211), (220, 215, 211), (221, 216, 212), + (223, 219, 215), (226, 222, 218), (234, 228, 224), (243, 236, 231), + (244, 239, 238), (237, 233, 232), (231, 227, 226), (226, 222, 220), + (222, 218, 215), (210, 206, 203), (202, 196, 192), (191, 184, 181), + (181, 173, 171), (170, 165, 165), (169, 164, 164), (169, 164, 163), + (169, 165, 164), (172, 169, 168), (176, 172, 172), (178, 175, 175), + (183, 182, 183), (182, 182, 182), (181, 183, 182), (180, 183, 182), + (180, 183, 182), (179, 180, 180), (177, 177, 174), (174, 168, 166), + (173, 161, 156), (169, 142, 129), (168, 138, 123), (168, 135, 117), + (168, 126, 105), (170, 123, 98), (172, 119, 92), (175, 117, 91), + (190, 118, 87), (198, 119, 85), (207, 120, 84), (210, 119, 83), + (213, 118, 83), (216, 117, 79), (210, 111, 78), (201, 104, 71), + (190, 96, 65), (178, 85, 52), (178, 82, 48), (178, 79, 45), + (180, 76, 38), (180, 73, 33), (179, 72, 28), (175, 72, 25), + (176, 74, 28), (180, 76, 30), (185, 79, 32), (196, 85, 39), + (208, 90, 46), (217, 99, 51), (223, 105, 54), (226, 109, 58), + (227, 109, 59), (223, 99, 56), (222, 93, 54), (221, 87, 52), + (215, 81, 49), (209, 75, 44), (202, 72, 39), (195, 69, 33), + (192, 69, 26), (192, 67, 26), (192, 66, 26), (191, 63, 27), + (189, 59, 28), (185, 58, 29), (177, 58, 30), (172, 63, 35), + (168, 70, 42), (170, 79, 49), (172, 84, 58), (174, 86, 64), + (174, 86, 67), (167, 82, 66), (154, 76, 63), (139, 69, 58), + (114, 60, 49), (110, 58, 48), (106, 56, 47), (103, 52, 44), + (105, 49, 41), (111, 46, 36), (115, 44, 32), (120, 48, 29), + (125, 51, 28), (133, 55, 30), (141, 61, 31), (151, 68, 35), + (162, 74, 41), (174, 80, 47), (184, 86, 51), (190, 91, 54), + (193, 91, 55), (192, 90, 55), (188, 89, 53), (184, 90, 54), + (182, 88, 55), (182, 87, 55), (181, 86, 53), (177, 81, 49), + (175, 76, 44), (171, 70, 36), (169, 67, 35), (168, 65, 36), + (172, 69, 40), (178, 75, 45), (180, 83, 54), (183, 91, 60), + (185, 97, 65), (188, 101, 72), (189, 105, 77), (192, 111, 87), + (194, 117, 95), (197, 123, 105), (197, 130, 113), (190, 136, 121), + (182, 137, 125), (175, 135, 122), (169, 130, 117), (160, 123, 110), + (151, 111, 100), (142, 101, 90), (130, 94, 82), (115, 85, 77), + (101, 77, 68), (91, 68, 59), (85, 62, 51), (81, 53, 43), + (81, 46, 34), (84, 40, 28), (90, 37, 25), (94, 34, 23), + (98, 35, 23), (106, 38, 28), (115, 42, 29), (126, 43, 29), + (135, 44, 28), (146, 48, 28), (153, 48, 27), (154, 51, 28), + (155, 54, 36), (154, 61, 43), (153, 67, 52), (149, 72, 59), + (147, 80, 68), (142, 83, 71), (134, 84, 70), (122, 83, 72) + ), + +// 372 040221-11 +((31, 15, 114), (40, 21, 136), (45, 23, 145), (51, 26, 154), + (55, 27, 159), (59, 29, 165), (60, 30, 167), (61, 31, 170), + (65, 33, 178), (67, 34, 182), (70, 36, 186), (73, 37, 191), + (76, 38, 197), (81, 40, 204), (87, 43, 211), (91, 44, 216), + (95, 46, 221), (112, 53, 243), (120, 55, 249), (129, 57, 255), + (138, 58, 255), (147, 60, 255), (151, 60, 255), (155, 61, 255), + (170, 66, 255), (174, 67, 255), (178, 68, 255), (178, 68, 255), + (178, 68, 255), (177, 67, 255), (177, 67, 255), (172, 66, 255), + (164, 64, 255), (136, 55, 234), (120, 49, 219), (104, 44, 204), + (90, 38, 187), (77, 32, 171), (71, 30, 163), (65, 28, 156), + (45, 20, 132), (41, 18, 127), (38, 16, 122), (42, 18, 128), + (46, 21, 134), (50, 22, 139), (55, 23, 145), (64, 27, 158), + (72, 31, 171), (89, 39, 199), (96, 44, 215), (104, 49, 232), + (107, 51, 240), (111, 54, 249), (110, 54, 248), (110, 54, 248), + (98, 48, 229), (89, 45, 217), (81, 42, 206), (75, 39, 198), + (70, 37, 190), (68, 35, 186), (66, 34, 183), (62, 33, 177), + (60, 31, 171), (59, 31, 171), (62, 32, 176), (66, 34, 182), + (67, 35, 184), (68, 36, 186), (68, 36, 184), (67, 34, 182), + (62, 32, 176), (60, 32, 174), (59, 32, 173), (56, 30, 169), + (53, 29, 165), (50, 28, 162), (48, 27, 160), (44, 26, 156), + (42, 27, 156), (45, 29, 168), (50, 32, 177), (56, 36, 187), + (59, 37, 192), (62, 38, 197), (70, 42, 209), (77, 46, 222), + (95, 55, 253), (102, 58, 254), (110, 61, 255), (112, 62, 255), + (115, 64, 255), (118, 64, 255), (121, 64, 255), (123, 65, 255), + (126, 65, 255), (129, 65, 255), (129, 65, 255), (129, 65, 255), + (129, 65, 255), (129, 65, 255), (128, 65, 255), (126, 65, 255), + (123, 65, 255), (119, 64, 255), (116, 64, 255), (113, 62, 255), + (110, 61, 255), (103, 59, 255), (93, 55, 250), (83, 50, 234), + (73, 45, 216), (51, 33, 173), (46, 29, 162), (42, 26, 151), + (32, 20, 128), (21, 12, 106), (12, 7, 88), (6, 3, 73), + (1, 0, 59), (3, 0, 60), (5, 0, 61), (7, 0, 63), + (9, 1, 66), (14, 4, 76), (20, 6, 87), (26, 11, 101), + (31, 15, 114), (40, 21, 136), (42, 22, 140), (45, 23, 145), + (51, 26, 154), (55, 28, 160), (59, 29, 165), (61, 31, 170), + (65, 33, 178), (67, 34, 182), (70, 36, 186), (71, 36, 188), + (72, 37, 190), (76, 38, 197), (81, 40, 203), (87, 43, 211), + (95, 46, 221), (112, 53, 243), (117, 54, 248), (122, 55, 253), + (129, 57, 255), (138, 57, 255), (147, 60, 255), (155, 61, 255), + (170, 66, 255), (172, 66, 255), (175, 67, 255), (178, 68, 255), + (178, 68, 255), (178, 68, 255), (177, 67, 255), (172, 66, 255), + (164, 64, 255), (136, 55, 234), (128, 52, 226), (120, 50, 218), + (104, 44, 204), (89, 38, 187), (77, 32, 171), (65, 28, 156), + (45, 20, 132), (42, 18, 128), (40, 17, 125), (38, 16, 122), + (40, 17, 126), (46, 21, 134), (55, 23, 145), (64, 27, 158), + (72, 31, 171), (81, 36, 184), (89, 39, 199), (96, 44, 215), + (104, 49, 232), (110, 53, 243), (111, 54, 249), (110, 54, 248), + (98, 48, 229), (93, 46, 222), (89, 44, 216), (81, 42, 206), + (75, 39, 198), (70, 37, 190), (66, 34, 183), (62, 33, 177), + (60, 31, 171), (59, 31, 168), (59, 31, 171), (62, 33, 176), + (66, 34, 182), (68, 36, 186), (68, 36, 184), (67, 34, 182), + (65, 33, 178), (62, 32, 176), (61, 32, 176), (59, 32, 173), + (56, 31, 170), (53, 29, 165), (48, 27, 160), (44, 26, 156), + (42, 27, 156), (43, 28, 161), (45, 29, 168), (50, 33, 177), + (56, 36, 187), (62, 38, 197), (70, 42, 209), (77, 46, 222), + (86, 50, 237), (95, 55, 253), (103, 59, 255), (110, 61, 255), + (115, 64, 255), (118, 64, 255), (121, 64, 255), (123, 65, 255), + (126, 65, 255), (128, 65, 255), (129, 65, 255), (129, 65, 255), + (129, 65, 255), (129, 65, 255), (128, 65, 255), (126, 65, 255), + (125, 65, 255), (123, 65, 255), (120, 65, 255), (116, 64, 255), + (110, 61, 255), (103, 59, 255), (93, 55, 250), (83, 50, 234), + (73, 45, 216), (62, 39, 197), (51, 33, 173), (42, 26, 151), + (32, 20, 128), (21, 12, 106), (12, 7, 88), (6, 3, 73), + (3, 1, 65), (1, 0, 59), (1, 0, 57), (5, 0, 61), + (9, 1, 66), (14, 4, 76), (20, 6, 87), (26, 11, 101) + ), + +// 373 040221-12 +((97, 81, 35), (82, 94, 46), (81, 97, 49), (80, 100, 53), + (83, 101, 54), (86, 102, 55), (94, 104, 55), (103, 106, 56), + (138, 114, 59), (147, 116, 63), (157, 119, 67), (161, 118, 66), + (165, 117, 65), (173, 113, 58), (181, 110, 52), (189, 107, 47), + (197, 104, 43), (219, 99, 37), (216, 98, 38), (214, 97, 39), + (204, 96, 38), (194, 95, 37), (191, 93, 34), (189, 91, 31), + (186, 81, 19), (182, 78, 17), (178, 75, 16), (169, 75, 17), + (161, 76, 19), (156, 77, 20), (151, 79, 21), (140, 83, 24), + (127, 84, 24), (111, 77, 21), (104, 73, 20), (98, 70, 19), + (92, 70, 20), (86, 70, 22), (80, 71, 23), (75, 72, 24), + (60, 76, 31), (57, 76, 31), (54, 76, 32), (54, 74, 32), + (54, 73, 32), (53, 72, 32), (53, 71, 32), (54, 72, 34), + (54, 72, 34), (57, 75, 35), (58, 77, 34), (60, 79, 34), + (62, 80, 34), (64, 81, 35), (64, 81, 35), (65, 81, 36), + (70, 85, 39), (77, 87, 39), (85, 89, 39), (99, 90, 37), + (114, 92, 35), (122, 93, 35), (130, 95, 35), (145, 97, 34), + (160, 102, 36), (185, 103, 36), (196, 100, 32), (207, 97, 29), + (211, 95, 26), (215, 93, 24), (222, 88, 18), (224, 84, 14), + (213, 74, 9), (202, 69, 8), (191, 64, 8), (174, 60, 7), + (158, 56, 6), (150, 55, 6), (143, 55, 6), (128, 52, 7), + (114, 48, 7), (90, 38, 6), (75, 34, 5), (61, 30, 5), + (54, 29, 6), (48, 28, 7), (39, 29, 8), (32, 30, 8), + (33, 32, 8), (37, 34, 7), (41, 36, 7), (43, 36, 8), + (45, 37, 10), (53, 41, 10), (62, 46, 11), (77, 53, 11), + (97, 58, 9), (133, 73, 8), (150, 76, 8), (167, 80, 9), + (172, 81, 10), (178, 83, 11), (190, 84, 11), (202, 85, 9), + (215, 81, 6), (210, 77, 4), (205, 74, 3), (198, 71, 3), + (191, 68, 3), (175, 62, 4), (158, 57, 3), (142, 54, 5), + (131, 52, 8), (109, 54, 15), (104, 55, 17), (100, 57, 20), + (94, 60, 26), (90, 63, 29), (89, 66, 32), (94, 66, 34), + (117, 73, 34), (133, 84, 34), (149, 95, 35), (157, 101, 39), + (165, 108, 43), (180, 122, 54), (190, 130, 63), (197, 138, 71), + (205, 145, 78), (221, 162, 89), (223, 167, 93), (226, 173, 98), + (229, 186, 111), (227, 193, 122), (223, 197, 132), (216, 193, 134), + (213, 175, 124), (216, 167, 114), (219, 160, 104), (220, 155, 99), + (221, 151, 95), (224, 142, 89), (222, 129, 80), (218, 115, 63), + (217, 102, 47), (225, 87, 19), (226, 86, 15), (228, 85, 11), + (234, 86, 8), (237, 86, 8), (239, 88, 8), (238, 87, 9), + (238, 87, 10), (237, 88, 10), (236, 90, 11), (231, 95, 16), + (226, 101, 24), (221, 109, 33), (217, 116, 44), (211, 121, 54), + (205, 124, 65), (190, 126, 72), (184, 126, 73), (178, 126, 75), + (163, 125, 78), (153, 121, 77), (142, 118, 77), (134, 114, 78), + (120, 106, 70), (116, 103, 67), (113, 100, 65), (104, 95, 59), + (99, 86, 51), (98, 76, 41), (103, 67, 31), (110, 58, 24), + (117, 53, 18), (124, 50, 15), (126, 53, 15), (125, 57, 16), + (123, 59, 19), (122, 59, 19), (122, 56, 17), (121, 54, 16), + (118, 53, 18), (116, 55, 19), (114, 58, 20), (112, 65, 25), + (110, 73, 32), (111, 81, 38), (113, 89, 46), (114, 98, 52), + (123, 106, 55), (132, 115, 55), (142, 120, 54), (152, 123, 53), + (165, 126, 50), (175, 131, 50), (177, 131, 54), (182, 131, 56), + (186, 134, 57), (185, 132, 56), (178, 127, 51), (173, 121, 44), + (167, 117, 38), (159, 112, 38), (151, 106, 40), (145, 106, 44), + (143, 109, 52), (138, 114, 60), (135, 116, 65), (132, 120, 68), + (132, 125, 70), (136, 127, 71), (140, 125, 69), (152, 123, 65), + (162, 121, 62), (171, 118, 59), (173, 114, 56), (172, 115, 55), + (171, 116, 56), (169, 114, 55), (172, 110, 52), (178, 104, 44), + (187, 97, 37), (195, 88, 30), (203, 84, 23), (207, 82, 20), + (209, 82, 19), (210, 84, 21), (210, 84, 21), (211, 83, 20), + (214, 79, 19), (217, 76, 16), (220, 70, 12), (223, 66, 8), + (224, 65, 8), (225, 65, 6), (223, 65, 5), (223, 64, 5), + (221, 62, 4), (218, 60, 5), (215, 56, 5), (212, 54, 5), + (211, 51, 5), (207, 51, 5), (200, 52, 4), (190, 54, 6), + (180, 59, 9), (169, 61, 11), (151, 58, 10), (137, 56, 11), + (127, 56, 13), (118, 58, 15), (106, 61, 19), (99, 71, 26) + ), + +// 374 040221-13 +((73, 127, 125), (87, 141, 136), (88, 141, 139), (89, 142, 142), + (81, 134, 138), (74, 126, 135), (69, 120, 131), (65, 115, 128), + (46, 92, 107), (35, 80, 94), (24, 69, 82), (18, 53, 75), + (13, 38, 69), (17, 24, 69), (22, 11, 69), (25, 8, 70), + (29, 6, 71), (33, 21, 78), (38, 30, 86), (44, 39, 94), + (56, 47, 107), (68, 55, 121), (72, 61, 126), (77, 67, 131), + (77, 101, 144), (73, 113, 143), (69, 125, 142), (67, 127, 137), + (66, 130, 133), (65, 129, 131), (64, 129, 129), (62, 124, 122), + (57, 115, 117), (37, 92, 90), (27, 80, 75), (18, 68, 61), + (12, 57, 51), (6, 47, 41), (3, 40, 37), (1, 33, 34), + (0, 20, 21), (0, 20, 19), (0, 21, 18), (0, 28, 23), + (0, 36, 29), (7, 43, 36), (14, 51, 44), (32, 64, 61), + (50, 73, 82), (86, 96, 119), (99, 101, 128), (113, 106, 137), + (118, 110, 144), (124, 114, 151), (122, 111, 151), (120, 108, 151), + (104, 91, 136), (92, 84, 120), (81, 77, 104), (64, 70, 89), + (47, 63, 75), (38, 59, 68), (30, 56, 62), (14, 48, 51), + (5, 40, 37), (0, 43, 20), (3, 47, 24), (6, 52, 28), + (10, 55, 32), (14, 59, 36), (20, 67, 44), (26, 72, 53), + (38, 94, 71), (48, 103, 84), (58, 112, 98), (72, 121, 112), + (86, 130, 126), (95, 134, 132), (104, 138, 139), (118, 144, 150), + (129, 148, 159), (148, 153, 174), (152, 153, 176), (156, 153, 178), + (158, 152, 178), (160, 152, 179), (159, 149, 177), (159, 144, 176), + (159, 119, 169), (154, 105, 165), (150, 92, 162), (145, 90, 161), + (140, 88, 160), (129, 91, 156), (119, 89, 152), (112, 88, 149), + (104, 80, 144), (88, 68, 134), (78, 78, 128), (69, 88, 122), + (65, 95, 121), (62, 102, 120), (59, 113, 120), (59, 120, 122), + (67, 129, 130), (77, 136, 133), (87, 143, 136), (92, 146, 138), + (97, 149, 141), (105, 155, 148), (110, 158, 156), (110, 160, 162), + (112, 162, 164), (105, 162, 161), (101, 159, 161), (98, 157, 161), + (90, 154, 159), (80, 149, 157), (71, 144, 154), (70, 144, 152), + (70, 142, 152), (74, 142, 155), (79, 143, 158), (82, 142, 159), + (85, 142, 160), (94, 143, 162), (102, 147, 163), (109, 150, 168), + (113, 153, 172), (123, 157, 177), (125, 157, 177), (128, 157, 178), + (132, 158, 177), (136, 160, 179), (137, 161, 181), (140, 162, 184), + (152, 166, 189), (156, 167, 189), (160, 168, 189), (160, 169, 189), + (160, 170, 189), (160, 172, 191), (161, 173, 193), (160, 173, 195), + (158, 172, 194), (148, 168, 187), (143, 166, 183), (138, 165, 179), + (127, 161, 171), (113, 153, 163), (98, 141, 153), (84, 132, 141), + (62, 109, 113), (57, 103, 104), (52, 98, 95), (41, 87, 80), + (28, 70, 64), (16, 57, 50), (6, 49, 40), (1, 42, 34), + (1, 41, 28), (0, 41, 19), (0, 38, 16), (0, 36, 14), + (0, 32, 9), (0, 28, 9), (0, 25, 11), (0, 26, 15), + (0, 25, 15), (0, 22, 12), (0, 20, 10), (0, 14, 9), + (0, 8, 11), (0, 5, 19), (0, 3, 33), (0, 0, 46), + (15, 0, 54), (33, 0, 61), (46, 3, 71), (55, 17, 82), + (62, 29, 95), (67, 39, 109), (70, 43, 117), (74, 43, 122), + (74, 47, 121), (70, 54, 120), (67, 62, 120), (58, 75, 123), + (47, 87, 123), (37, 93, 125), (34, 95, 125), (33, 94, 123), + (37, 100, 123), (43, 106, 126), (48, 114, 130), (51, 121, 136), + (56, 127, 141), (61, 129, 144), (67, 134, 145), (73, 137, 141), + (78, 139, 141), (80, 137, 143), (85, 134, 146), (91, 125, 147), + (97, 117, 147), (102, 105, 143), (100, 89, 133), (87, 71, 119), + (76, 59, 106), (66, 47, 97), (59, 44, 90), (59, 43, 91), + (62, 43, 94), (56, 45, 94), (51, 46, 94), (46, 51, 94), + (43, 66, 95), (49, 84, 101), (60, 103, 115), (73, 123, 129), + (84, 136, 141), (94, 142, 148), (103, 149, 154), (109, 152, 157), + (114, 155, 159), (119, 157, 160), (122, 159, 162), (123, 162, 165), + (126, 163, 167), (130, 163, 170), (136, 160, 173), (144, 154, 177), + (149, 144, 179), (151, 139, 181), (148, 139, 183), (144, 140, 183), + (140, 143, 183), (138, 144, 185), (136, 139, 183), (133, 132, 178), + (124, 127, 173), (111, 125, 165), (96, 128, 155), (82, 134, 145), + (71, 137, 137), (61, 133, 128), (54, 126, 121), (49, 120, 114), + (47, 115, 108), (44, 115, 101), (47, 117, 98), (49, 120, 96), + (51, 119, 101), (55, 119, 105), (59, 118, 113), (64, 122, 119) + ), + +// 375 040221-14 +((141, 124, 150), (148, 124, 134), (140, 127, 129), (132, 131, 124), + (116, 137, 127), (100, 143, 131), (89, 145, 134), (79, 148, 138), + (78, 155, 146), (80, 162, 154), (82, 169, 163), (88, 174, 166), + (94, 180, 170), (100, 185, 178), (107, 190, 187), (109, 190, 189), + (111, 191, 191), (106, 201, 205), (99, 204, 206), (92, 208, 208), + (97, 212, 211), (102, 217, 214), (109, 219, 214), (117, 222, 215), + (136, 225, 217), (121, 218, 207), (107, 212, 198), (83, 193, 182), + (59, 174, 166), (52, 165, 157), (45, 157, 148), (38, 142, 137), + (42, 129, 124), (50, 120, 101), (52, 112, 87), (54, 105, 74), + (59, 99, 59), (65, 94, 44), (73, 95, 44), (81, 96, 45), + (114, 115, 61), (125, 130, 73), (137, 145, 85), (145, 155, 86), + (154, 166, 87), (156, 169, 86), (159, 173, 85), (169, 172, 83), + (179, 169, 81), (188, 153, 88), (189, 144, 87), (191, 136, 86), + (189, 126, 75), (188, 116, 65), (191, 111, 57), (194, 106, 49), + (207, 71, 23), (215, 58, 18), (223, 46, 13), (228, 38, 14), + (234, 30, 15), (232, 30, 14), (230, 31, 13), (214, 34, 13), + (196, 33, 13), (158, 32, 16), (141, 33, 22), (125, 34, 29), + (121, 34, 32), (117, 34, 35), (99, 41, 44), (82, 49, 52), + (61, 75, 67), (58, 91, 75), (55, 107, 83), (65, 117, 88), + (75, 128, 94), (77, 130, 97), (80, 133, 100), (81, 139, 104), + (82, 143, 105), (83, 151, 110), (82, 154, 111), (82, 157, 113), + (80, 155, 113), (79, 154, 114), (70, 148, 117), (59, 141, 113), + (35, 124, 113), (24, 118, 110), (14, 112, 108), (13, 110, 105), + (12, 108, 103), (15, 105, 98), (18, 102, 92), (22, 100, 87), + (25, 100, 83), (21, 94, 79), (22, 93, 74), (24, 92, 70), + (27, 91, 67), (31, 91, 64), (47, 82, 54), (63, 77, 44), + (89, 68, 36), (98, 65, 35), (107, 62, 35), (110, 64, 36), + (113, 67, 38), (125, 62, 37), (138, 55, 33), (149, 48, 26), + (160, 40, 22), (151, 32, 18), (146, 34, 20), (141, 37, 23), + (131, 43, 28), (124, 49, 36), (120, 62, 47), (129, 67, 59), + (131, 67, 79), (135, 64, 82), (139, 62, 85), (138, 61, 87), + (137, 61, 90), (140, 76, 102), (158, 88, 114), (173, 108, 124), + (190, 112, 137), (224, 106, 122), (226, 96, 115), (229, 87, 108), + (232, 77, 95), (231, 69, 82), (216, 80, 73), (200, 86, 75), + (159, 84, 59), (141, 72, 47), (124, 61, 35), (119, 54, 30), + (115, 48, 26), (103, 48, 20), (95, 55, 23), (83, 64, 31), + (75, 74, 38), (59, 90, 52), (57, 90, 56), (56, 91, 60), + (57, 93, 66), (59, 99, 71), (58, 105, 77), (62, 113, 82), + (75, 127, 85), (75, 127, 84), (76, 127, 83), (75, 126, 78), + (75, 125, 74), (70, 122, 71), (65, 119, 71), (65, 121, 74), + (69, 128, 79), (74, 138, 86), (75, 140, 87), (77, 142, 88), + (80, 147, 89), (80, 148, 89), (79, 147, 92), (82, 147, 94), + (86, 149, 100), (85, 147, 99), (85, 146, 99), (85, 144, 97), + (85, 139, 86), (81, 132, 77), (80, 124, 67), (79, 116, 59), + (75, 107, 51), (69, 95, 43), (62, 87, 41), (60, 82, 35), + (58, 79, 27), (66, 75, 24), (78, 73, 20), (88, 72, 19), + (109, 64, 16), (114, 62, 16), (119, 60, 17), (119, 67, 16), + (127, 77, 25), (137, 90, 39), (147, 108, 57), (162, 126, 74), + (178, 141, 87), (194, 145, 98), (193, 151, 99), (189, 158, 100), + (179, 162, 104), (161, 167, 111), (147, 172, 119), (137, 177, 123), + (143, 182, 130), (146, 183, 131), (150, 181, 122), (150, 177, 108), + (141, 170, 94), (135, 162, 83), (127, 150, 66), (134, 142, 54), + (145, 134, 49), (162, 127, 42), (177, 125, 37), (182, 120, 33), + (187, 118, 32), (176, 117, 31), (171, 121, 31), (170, 124, 36), + (178, 130, 46), (190, 138, 57), (198, 147, 69), (208, 152, 82), + (204, 160, 99), (195, 174, 116), (183, 186, 131), (174, 202, 151), + (169, 215, 166), (169, 227, 183), (177, 231, 197), (189, 236, 211), + (196, 238, 221), (199, 235, 226), (200, 236, 234), (195, 237, 233), + (193, 235, 230), (186, 226, 224), (187, 215, 218), (192, 199, 208), + (198, 178, 192), (205, 160, 184), (208, 146, 174), (209, 133, 170), + (206, 126, 165), (200, 124, 165), (192, 126, 169), (188, 122, 165), + (192, 120, 162), (198, 115, 161), (197, 105, 168), (204, 101, 172), + (209, 99, 172), (211, 101, 172), (207, 106, 173), (193, 116, 170), + (183, 125, 164), (163, 127, 161), (154, 130, 161), (144, 129, 159) + ), + +// 376 040221-19 +((35, 145, 173), (44, 138, 178), (43, 138, 179), (42, 138, 180), + (35, 140, 179), (29, 143, 178), (28, 151, 168), (27, 160, 159), + (47, 172, 129), (64, 174, 121), (82, 177, 113), (98, 183, 114), + (114, 189, 116), (128, 196, 104), (143, 203, 92), (148, 204, 86), + (153, 205, 81), (171, 205, 69), (181, 200, 76), (192, 195, 83), + (194, 190, 87), (197, 186, 92), (194, 182, 91), (192, 178, 90), + (174, 170, 90), (171, 173, 94), (169, 176, 99), (174, 184, 111), + (179, 192, 123), (181, 195, 130), (184, 199, 137), (182, 203, 155), + (181, 203, 171), (172, 208, 194), (174, 213, 199), (177, 218, 205), + (177, 224, 211), (177, 230, 218), (176, 228, 223), (175, 227, 228), + (155, 209, 241), (146, 198, 241), (138, 188, 242), (134, 185, 233), + (131, 182, 224), (130, 181, 216), (130, 180, 208), (124, 175, 190), + (119, 163, 177), (97, 126, 144), (86, 106, 130), (75, 87, 116), + (67, 77, 96), (59, 67, 76), (56, 64, 68), (53, 62, 60), + (39, 57, 36), (31, 54, 34), (24, 51, 33), (18, 48, 32), + (12, 45, 31), (11, 44, 30), (10, 44, 30), (7, 45, 31), + (8, 48, 34), (13, 63, 42), (22, 67, 43), (32, 72, 44), + (37, 74, 46), (43, 76, 49), (53, 78, 59), (66, 76, 72), + (83, 76, 103), (93, 81, 116), (103, 87, 130), (108, 103, 142), + (114, 119, 154), (119, 127, 161), (125, 136, 169), (138, 150, 182), + (145, 163, 192), (161, 179, 198), (157, 188, 193), (154, 197, 189), + (150, 204, 190), (146, 212, 191), (136, 223, 197), (131, 234, 201), + (135, 245, 191), (146, 246, 178), (158, 247, 165), (164, 247, 158), + (171, 248, 152), (175, 242, 145), (179, 238, 144), (179, 231, 139), + (179, 224, 137), (185, 218, 125), (187, 218, 117), (190, 219, 110), + (191, 218, 110), (193, 217, 111), (190, 208, 114), (187, 199, 122), + (172, 169, 140), (155, 154, 154), (138, 140, 169), (131, 137, 175), + (125, 135, 182), (109, 129, 196), (100, 127, 204), (93, 127, 200), + (93, 121, 197), (82, 107, 180), (82, 105, 173), (82, 103, 166), + (87, 101, 155), (100, 106, 145), (113, 119, 134), (125, 129, 130), + (144, 150, 129), (143, 149, 130), (143, 149, 132), (143, 147, 133), + (144, 145, 135), (150, 147, 141), (147, 144, 153), (143, 143, 159), + (139, 142, 169), (109, 145, 185), (98, 146, 187), (88, 148, 189), + (77, 154, 193), (65, 157, 200), (56, 159, 199), (51, 159, 192), + (53, 149, 162), (51, 149, 144), (49, 150, 127), (49, 151, 125), + (49, 152, 123), (47, 149, 125), (46, 147, 126), (47, 136, 123), + (55, 132, 119), (66, 134, 107), (65, 138, 109), (64, 143, 111), + (62, 147, 121), (55, 151, 134), (42, 150, 148), (35, 149, 155), + (31, 149, 161), (32, 152, 160), (33, 155, 159), (40, 157, 156), + (49, 162, 155), (52, 160, 155), (51, 153, 146), (47, 141, 135), + (38, 122, 121), (25, 85, 84), (24, 79, 76), (24, 73, 68), + (29, 64, 59), (31, 63, 51), (35, 70, 49), (37, 76, 51), + (36, 87, 58), (35, 89, 59), (34, 92, 60), (37, 95, 63), + (37, 93, 65), (34, 93, 67), (35, 95, 70), (35, 96, 75), + (34, 100, 78), (35, 105, 81), (42, 112, 83), (53, 118, 86), + (59, 122, 89), (75, 127, 93), (86, 128, 103), (92, 127, 112), + (89, 122, 124), (88, 121, 124), (87, 121, 124), (78, 119, 124), + (81, 118, 116), (85, 116, 112), (90, 113, 105), (87, 105, 105), + (83, 97, 100), (72, 85, 93), (51, 69, 84), (34, 53, 68), + (20, 38, 51), (11, 27, 34), (3, 19, 26), (2, 16, 22), + (5, 21, 21), (8, 31, 27), (15, 46, 36), (25, 60, 45), + (34, 72, 54), (42, 83, 62), (47, 90, 68), (51, 95, 69), + (50, 100, 72), (51, 107, 79), (55, 119, 87), (62, 130, 101), + (73, 147, 118), (90, 162, 129), (104, 172, 132), (115, 177, 131), + (123, 179, 129), (122, 179, 124), (119, 177, 127), (114, 182, 135), + (113, 184, 142), (112, 184, 144), (110, 182, 144), (112, 178, 137), + (108, 168, 123), (97, 152, 110), (85, 139, 101), (70, 124, 94), + (53, 109, 88), (37, 93, 84), (25, 80, 76), (17, 65, 67), + (8, 51, 58), (4, 41, 49), (2, 32, 41), (0, 27, 35), + (0, 24, 31), (0, 20, 28), (0, 19, 25), (0, 18, 25), + (1, 19, 23), (1, 19, 20), (3, 19, 20), (3, 19, 22), + (3, 20, 27), (3, 24, 33), (2, 30, 42), (5, 40, 52), + (12, 58, 63), (22, 75, 71), (31, 80, 91), (39, 89, 109), + (40, 103, 129), (36, 115, 148), (32, 120, 165), (34, 130, 178) + ), + +// 377 040221-2 +((46, 16, 16), (47, 16, 16), (48, 17, 17), (50, 18, 18), + (51, 18, 18), (53, 19, 19), (54, 19, 19), (56, 20, 20), + (59, 30, 21), (57, 31, 20), (56, 33, 20), (54, 32, 19), + (52, 31, 18), (48, 30, 16), (44, 30, 15), (42, 32, 14), + (41, 34, 14), (36, 44, 15), (37, 49, 17), (39, 54, 19), + (41, 59, 21), (43, 65, 23), (43, 66, 23), (44, 68, 24), + (43, 71, 25), (42, 70, 24), (42, 69, 24), (39, 63, 22), + (36, 57, 20), (34, 55, 19), (33, 53, 19), (26, 46, 16), + (19, 41, 14), (10, 28, 10), (8, 24, 8), (7, 20, 7), + (6, 18, 6), (5, 16, 5), (5, 15, 5), (5, 15, 5), + (4, 12, 4), (4, 12, 4), (4, 13, 4), (12, 19, 6), + (21, 25, 9), (26, 27, 10), (31, 29, 11), (43, 39, 15), + (54, 49, 19), (74, 71, 26), (78, 76, 27), (83, 82, 29), + (82, 84, 30), (82, 86, 31), (80, 86, 31), (79, 87, 31), + (84, 96, 34), (88, 101, 36), (93, 106, 38), (95, 107, 38), + (97, 109, 39), (98, 110, 39), (99, 111, 40), (102, 112, 40), + (110, 120, 43), (104, 112, 40), (96, 104, 37), (88, 96, 34), + (83, 91, 32), (78, 86, 31), (67, 77, 27), (59, 71, 25), + (46, 60, 21), (44, 58, 20), (42, 56, 20), (49, 61, 21), + (57, 66, 23), (63, 71, 25), (69, 77, 27), (80, 86, 31), + (90, 93, 33), (111, 111, 40), (119, 119, 42), (127, 127, 45), + (129, 130, 46), (132, 133, 48), (134, 136, 49), (132, 136, 49), + (131, 137, 49), (129, 136, 49), (128, 136, 49), (127, 135, 48), + (127, 134, 48), (127, 133, 48), (126, 130, 46), (124, 127, 45), + (124, 126, 45), (120, 121, 43), (113, 117, 42), (106, 114, 41), + (100, 109, 39), (95, 105, 37), (85, 99, 35), (75, 94, 33), + (54, 81, 29), (43, 71, 25), (32, 62, 22), (26, 57, 20), + (20, 52, 18), (14, 41, 14), (12, 34, 12), (9, 26, 9), + (7, 22, 7), (6, 17, 6), (6, 18, 6), (6, 19, 6), + (8, 23, 8), (14, 34, 12), (27, 47, 16), (41, 60, 21), + (69, 90, 32), (81, 102, 36), (94, 114, 41), (99, 117, 42), + (104, 121, 43), (110, 124, 44), (114, 126, 45), (116, 123, 44), + (118, 120, 43), (123, 117, 44), (127, 120, 45), (131, 123, 47), + (139, 129, 50), (148, 135, 53), (155, 143, 56), (161, 149, 58), + (170, 161, 61), (173, 166, 62), (176, 171, 63), (178, 173, 64), + (180, 176, 65), (185, 181, 66), (186, 182, 67), (183, 181, 66), + (182, 178, 65), (168, 164, 60), (164, 159, 58), (160, 154, 57), + (154, 145, 55), (143, 135, 51), (134, 129, 48), (128, 125, 46), + (120, 123, 44), (118, 123, 44), (117, 123, 44), (115, 121, 43), + (111, 120, 43), (107, 115, 41), (103, 109, 39), (102, 105, 37), + (103, 105, 37), (114, 113, 41), (117, 115, 42), (121, 118, 43), + (127, 123, 45), (131, 126, 47), (133, 127, 48), (133, 129, 48), + (139, 136, 50), (139, 138, 50), (139, 140, 50), (141, 145, 52), + (142, 146, 52), (143, 151, 54), (145, 155, 56), (147, 158, 57), + (148, 161, 58), (150, 163, 58), (154, 165, 59), (161, 170, 61), + (167, 177, 63), (177, 186, 67), (188, 197, 71), (195, 207, 74), + (199, 217, 78), (199, 218, 78), (200, 219, 79), (199, 219, 79), + (197, 217, 78), (195, 217, 78), (191, 214, 77), (187, 210, 75), + (184, 207, 74), (178, 202, 73), (173, 198, 71), (170, 194, 70), + (169, 189, 68), (167, 183, 66), (164, 177, 63), (161, 167, 60), + (157, 158, 57), (158, 152, 57), (157, 148, 56), (151, 142, 54), + (143, 133, 51), (137, 129, 49), (130, 122, 46), (123, 116, 44), + (117, 110, 42), (112, 106, 40), (111, 102, 40), (105, 97, 37), + (97, 89, 35), (89, 79, 32), (80, 67, 28), (75, 56, 27), + (68, 45, 24), (59, 35, 21), (54, 29, 19), (53, 27, 19), + (52, 29, 18), (52, 31, 18), (52, 33, 18), (52, 39, 18), + (50, 43, 18), (47, 46, 16), (47, 54, 19), (49, 60, 21), + (51, 65, 23), (54, 68, 24), (53, 71, 25), (53, 72, 26), + (52, 74, 26), (51, 74, 26), (50, 74, 26), (49, 72, 26), + (52, 71, 25), (52, 68, 24), (53, 66, 23), (55, 66, 23), + (56, 68, 24), (57, 68, 24), (58, 68, 24), (59, 68, 24), + (58, 66, 23), (57, 63, 22), (56, 59, 21), (53, 54, 19), + (50, 50, 18), (50, 46, 18), (50, 42, 18), (46, 36, 16), + (43, 29, 15), (41, 24, 14), (43, 20, 15), (44, 15, 15) + ), + +// 378 040221-21 +((138, 101, 87), (142, 105, 101), (142, 107, 103), (143, 110, 105), + (145, 112, 105), (147, 115, 106), (148, 116, 107), (150, 117, 108), + (144, 111, 105), (137, 105, 100), (131, 99, 95), (124, 92, 88), + (117, 86, 82), (114, 81, 75), (111, 76, 68), (110, 74, 66), + (110, 72, 64), (105, 63, 59), (101, 59, 56), (97, 55, 54), + (97, 55, 53), (97, 55, 52), (98, 56, 52), (100, 57, 53), + (107, 63, 53), (106, 62, 51), (105, 62, 49), (101, 60, 47), + (98, 59, 46), (98, 59, 45), (98, 60, 45), (103, 60, 45), + (106, 62, 46), (109, 64, 40), (105, 62, 35), (101, 60, 31), + (99, 60, 29), (98, 60, 28), (98, 60, 28), (98, 60, 29), + (102, 63, 31), (99, 62, 28), (97, 62, 26), (92, 59, 22), + (88, 57, 19), (85, 55, 17), (82, 54, 16), (80, 53, 15), + (79, 53, 17), (80, 55, 19), (83, 57, 22), (86, 59, 25), + (89, 61, 29), (93, 63, 34), (94, 63, 36), (95, 63, 39), + (94, 62, 43), (92, 61, 44), (90, 61, 46), (91, 63, 48), + (92, 65, 50), (92, 65, 51), (93, 66, 52), (92, 64, 54), + (89, 62, 53), (79, 54, 48), (75, 51, 44), (72, 49, 40), + (72, 49, 39), (72, 49, 38), (72, 49, 38), (73, 49, 38), + (81, 54, 45), (87, 58, 50), (93, 62, 56), (99, 66, 62), + (105, 71, 68), (106, 73, 71), (108, 76, 74), (113, 81, 80), + (119, 88, 88), (136, 103, 102), (143, 108, 106), (151, 114, 110), + (152, 115, 110), (154, 117, 110), (152, 115, 110), (146, 113, 108), + (132, 104, 104), (126, 98, 98), (121, 92, 92), (118, 89, 88), + (116, 86, 84), (110, 78, 77), (103, 70, 70), (93, 62, 63), + (83, 54, 57), (67, 38, 46), (63, 35, 40), (60, 33, 34), + (59, 32, 32), (59, 32, 31), (60, 32, 28), (60, 33, 27), + (63, 35, 29), (65, 38, 29), (67, 42, 30), (68, 44, 30), + (69, 47, 31), (73, 53, 34), (79, 58, 36), (86, 64, 40), + (92, 69, 45), (106, 78, 55), (110, 81, 58), (114, 85, 61), + (121, 92, 69), (131, 102, 80), (145, 118, 97), (160, 134, 113), + (184, 161, 145), (194, 173, 158), (204, 185, 172), (206, 188, 177), + (209, 191, 182), (219, 204, 197), (228, 216, 212), (236, 228, 225), + (243, 237, 237), (247, 239, 235), (244, 235, 229), (241, 232, 223), + (233, 222, 212), (226, 212, 202), (217, 201, 191), (212, 196, 188), + (196, 174, 166), (186, 162, 150), (176, 151, 135), (169, 144, 126), + (163, 138, 118), (149, 122, 100), (137, 113, 91), (127, 103, 84), + (118, 95, 78), (108, 83, 63), (105, 81, 59), (103, 79, 56), + (97, 75, 49), (90, 70, 42), (85, 65, 37), (82, 61, 33), + (85, 60, 30), (87, 61, 30), (90, 62, 31), (96, 66, 34), + (102, 70, 37), (107, 74, 42), (112, 78, 47), (118, 81, 51), + (124, 86, 56), (140, 96, 62), (142, 98, 64), (145, 100, 67), + (149, 104, 71), (150, 106, 75), (149, 106, 79), (147, 107, 85), + (147, 109, 90), (146, 109, 91), (145, 109, 92), (146, 110, 94), + (146, 111, 94), (146, 111, 95), (143, 110, 99), (143, 110, 104), + (145, 113, 112), (153, 124, 125), (162, 136, 139), (172, 149, 152), + (180, 158, 155), (184, 161, 156), (184, 161, 157), (176, 150, 151), + (159, 142, 146), (156, 141, 148), (154, 141, 150), (149, 140, 145), + (144, 134, 136), (137, 128, 126), (126, 110, 110), (110, 94, 92), + (95, 76, 73), (83, 65, 62), (74, 57, 53), (67, 51, 43), + (65, 48, 36), (67, 46, 32), (70, 47, 30), (75, 50, 30), + (82, 55, 33), (90, 63, 37), (98, 71, 41), (108, 79, 48), + (118, 87, 55), (126, 95, 62), (135, 104, 70), (144, 112, 79), + (151, 119, 86), (154, 123, 92), (153, 123, 95), (151, 122, 97), + (145, 116, 97), (139, 111, 96), (134, 105, 95), (127, 99, 91), + (120, 93, 88), (112, 86, 82), (102, 78, 76), (92, 69, 68), + (84, 62, 63), (81, 56, 59), (81, 55, 55), (83, 56, 55), + (88, 59, 55), (93, 63, 57), (96, 67, 59), (96, 69, 61), + (98, 71, 63), (103, 76, 66), (110, 82, 68), (115, 88, 70), + (120, 94, 71), (124, 98, 73), (122, 98, 73), (117, 96, 70), + (112, 92, 67), (109, 88, 61), (105, 85, 56), (103, 83, 50), + (102, 81, 44), (103, 81, 41), (101, 79, 37), (100, 77, 33), + (99, 75, 31), (98, 75, 30), (100, 75, 31), (101, 74, 34), + (103, 74, 37), (103, 73, 41), (104, 72, 42), (107, 73, 45), + (112, 77, 50), (118, 83, 56), (124, 87, 65), (132, 94, 76) + ), + +// 379 040221-22 +((91, 108, 100), (93, 109, 98), (89, 105, 92), (86, 101, 87), + (83, 98, 85), (81, 95, 84), (78, 92, 82), (76, 89, 81), + (63, 74, 71), (56, 66, 65), (50, 59, 60), (43, 52, 56), + (37, 45, 52), (34, 40, 49), (31, 36, 47), (31, 36, 46), + (31, 36, 45), (33, 38, 43), (33, 38, 44), (34, 39, 45), + (35, 40, 45), (36, 41, 45), (37, 43, 45), (39, 45, 45), + (46, 56, 54), (55, 65, 62), (64, 74, 71), (82, 91, 84), + (101, 109, 98), (109, 116, 104), (117, 123, 110), (128, 135, 119), + (139, 145, 128), (152, 157, 136), (152, 155, 135), (152, 153, 134), + (140, 144, 125), (129, 135, 116), (123, 130, 112), (118, 126, 108), + (101, 110, 94), (96, 106, 91), (91, 102, 88), (90, 101, 87), + (89, 100, 87), (90, 100, 88), (91, 101, 89), (92, 101, 92), + (95, 103, 96), (99, 108, 100), (100, 110, 100), (102, 112, 101), + (101, 112, 101), (100, 112, 101), (99, 111, 99), (99, 110, 98), + (96, 103, 90), (90, 98, 85), (85, 93, 80), (78, 85, 74), + (71, 78, 68), (67, 72, 65), (64, 67, 63), (56, 58, 56), + (49, 52, 52), (36, 42, 44), (32, 37, 42), (28, 33, 41), + (27, 32, 40), (26, 31, 40), (25, 30, 40), (26, 31, 40), + (27, 32, 43), (27, 32, 44), (27, 33, 45), (27, 33, 45), + (27, 33, 45), (27, 33, 45), (27, 34, 45), (28, 34, 46), + (28, 35, 47), (30, 37, 49), (33, 40, 49), (36, 44, 50), + (37, 46, 51), (39, 48, 52), (41, 49, 51), (43, 48, 51), + (48, 53, 50), (52, 58, 53), (56, 64, 56), (57, 65, 59), + (59, 67, 62), (63, 71, 67), (69, 78, 75), (75, 87, 83), + (82, 95, 89), (92, 106, 99), (96, 111, 102), (101, 116, 106), + (103, 117, 107), (106, 119, 108), (107, 120, 107), (106, 119, 106), + (109, 123, 107), (113, 126, 110), (118, 130, 114), (118, 130, 115), + (118, 130, 116), (117, 130, 117), (113, 128, 116), (111, 127, 115), + (110, 126, 111), (103, 113, 99), (98, 107, 94), (94, 101, 90), + (84, 90, 82), (73, 79, 72), (65, 71, 66), (58, 62, 60), + (47, 48, 51), (40, 42, 48), (34, 37, 46), (32, 35, 45), + (30, 34, 45), (27, 31, 45), (26, 30, 44), (26, 31, 44), + (26, 31, 44), (29, 33, 47), (30, 34, 47), (32, 36, 48), + (37, 41, 51), (41, 47, 54), (45, 54, 57), (49, 59, 61), + (59, 70, 66), (63, 75, 68), (67, 80, 71), (68, 81, 72), + (69, 83, 74), (70, 85, 74), (71, 85, 74), (72, 86, 74), + (73, 86, 75), (77, 89, 81), (79, 91, 84), (82, 94, 88), + (89, 102, 96), (96, 111, 104), (103, 120, 113), (110, 126, 120), + (119, 135, 131), (121, 136, 132), (123, 138, 133), (125, 142, 133), + (129, 144, 133), (131, 146, 131), (132, 143, 129), (132, 141, 125), + (130, 138, 120), (128, 135, 114), (128, 134, 113), (128, 134, 113), + (128, 134, 113), (125, 132, 112), (123, 129, 110), (118, 124, 107), + (103, 111, 95), (99, 107, 92), (95, 103, 89), (88, 96, 83), + (80, 88, 79), (71, 78, 74), (63, 70, 68), (54, 61, 63), + (48, 55, 57), (43, 49, 53), (38, 43, 51), (34, 39, 49), + (31, 36, 49), (30, 34, 48), (30, 34, 47), (31, 34, 46), + (31, 36, 46), (32, 37, 46), (34, 39, 46), (37, 43, 47), + (42, 48, 49), (46, 53, 53), (50, 58, 57), (55, 64, 61), + (61, 70, 66), (66, 77, 69), (71, 81, 73), (73, 83, 74), + (73, 84, 74), (73, 84, 75), (73, 84, 76), (75, 85, 77), + (77, 88, 78), (80, 93, 80), (84, 97, 84), (90, 105, 91), + (100, 113, 99), (110, 122, 106), (117, 128, 111), (120, 130, 114), + (120, 132, 115), (121, 131, 114), (121, 129, 113), (119, 124, 109), + (111, 116, 101), (100, 105, 92), (88, 94, 83), (76, 83, 75), + (68, 73, 70), (60, 65, 65), (54, 59, 62), (49, 55, 58), + (44, 50, 56), (40, 46, 56), (41, 46, 55), (44, 46, 55), + (49, 49, 56), (54, 52, 57), (58, 54, 59), (62, 60, 61), + (69, 66, 63), (77, 71, 66), (83, 76, 69), (87, 80, 72), + (89, 84, 75), (91, 89, 78), (95, 94, 81), (100, 97, 85), + (103, 99, 88), (105, 101, 89), (105, 102, 90), (103, 103, 89), + (103, 102, 89), (101, 100, 88), (98, 97, 86), (95, 94, 84), + (89, 92, 80), (85, 90, 77), (81, 88, 75), (79, 87, 75), + (78, 88, 76), (80, 91, 80), (84, 96, 86), (85, 99, 90), + (86, 100, 89), (86, 101, 90), (85, 100, 90), (88, 104, 93) + ), + +// 380 040221-23 +((109, 35, 30), (87, 22, 31), (81, 31, 29), (75, 40, 27), + (73, 49, 23), (71, 58, 19), (73, 59, 20), (75, 60, 22), + (87, 79, 33), (100, 82, 41), (114, 86, 50), (124, 71, 58), + (134, 57, 67), (137, 55, 67), (140, 53, 68), (140, 51, 67), + (141, 50, 67), (131, 31, 62), (126, 28, 52), (122, 25, 42), + (114, 29, 31), (107, 33, 21), (104, 32, 18), (102, 32, 16), + (102, 32, 16), (99, 34, 17), (97, 37, 18), (89, 43, 23), + (81, 50, 28), (80, 55, 33), (79, 60, 38), (79, 73, 43), + (81, 89, 46), (57, 115, 50), (49, 130, 64), (42, 145, 78), + (39, 161, 79), (36, 178, 81), (30, 181, 77), (24, 184, 73), + (16, 163, 76), (13, 153, 74), (11, 143, 72), (10, 132, 61), + (10, 122, 50), (11, 113, 51), (12, 105, 52), (15, 90, 60), + (13, 88, 74), (17, 110, 85), (18, 106, 88), (20, 102, 92), + (21, 99, 100), (23, 96, 109), (28, 99, 106), (33, 102, 104), + (62, 87, 76), (77, 73, 70), (93, 59, 64), (111, 50, 63), + (130, 42, 62), (141, 40, 61), (152, 39, 61), (169, 43, 62), + (182, 51, 73), (181, 45, 100), (182, 43, 105), (183, 42, 110), + (186, 43, 109), (189, 44, 109), (189, 44, 110), (186, 37, 110), + (181, 28, 104), (186, 23, 97), (192, 18, 91), (192, 11, 84), + (193, 5, 78), (191, 4, 73), (190, 4, 69), (188, 4, 60), + (185, 3, 54), (167, 6, 40), (154, 7, 32), (141, 9, 24), + (137, 7, 20), (134, 5, 16), (127, 4, 11), (118, 4, 6), + (96, 5, 5), (91, 5, 6), (87, 5, 7), (84, 9, 7), + (82, 14, 8), (72, 33, 11), (66, 54, 14), (68, 71, 20), + (74, 70, 21), (84, 66, 18), (85, 71, 16), (86, 77, 15), + (87, 73, 15), (89, 69, 16), (96, 52, 12), (96, 32, 10), + (80, 8, 0), (68, 4, 0), (56, 1, 0), (51, 0, 0), + (47, 0, 0), (40, 0, 2), (37, 0, 3), (34, 1, 4), + (35, 2, 4), (39, 2, 4), (40, 2, 3), (42, 2, 3), + (45, 2, 4), (47, 2, 4), (46, 3, 4), (40, 2, 6), + (26, 2, 8), (22, 5, 7), (19, 8, 7), (17, 8, 8), + (15, 8, 9), (15, 9, 10), (16, 7, 11), (21, 11, 8), + (33, 14, 6), (58, 16, 4), (64, 13, 3), (70, 11, 3), + (81, 8, 3), (94, 8, 2), (107, 9, 2), (119, 8, 4), + (136, 3, 10), (141, 2, 13), (146, 1, 17), (146, 1, 18), + (146, 2, 20), (140, 2, 20), (135, 2, 21), (131, 2, 20), + (128, 1, 20), (111, 1, 15), (104, 1, 14), (98, 1, 13), + (87, 2, 9), (79, 1, 6), (72, 1, 4), (66, 1, 2), + (47, 5, 5), (43, 6, 6), (40, 8, 8), (34, 12, 11), + (35, 14, 16), (40, 16, 19), (49, 18, 23), (60, 21, 28), + (74, 20, 27), (105, 24, 26), (114, 22, 24), (123, 21, 23), + (141, 22, 21), (160, 15, 23), (173, 11, 27), (180, 14, 30), + (173, 17, 23), (166, 20, 21), (159, 23, 20), (142, 32, 26), + (121, 50, 35), (104, 66, 51), (84, 76, 62), (65, 81, 60), + (46, 83, 57), (27, 85, 54), (20, 88, 51), (17, 83, 54), + (22, 76, 51), (35, 65, 49), (47, 56, 47), (64, 51, 41), + (90, 47, 35), (90, 48, 35), (90, 50, 35), (89, 51, 38), + (87, 54, 46), (87, 58, 51), (89, 53, 52), (77, 50, 51), + (69, 42, 43), (59, 31, 40), (54, 29, 36), (60, 26, 33), + (68, 28, 34), (80, 31, 34), (92, 27, 41), (99, 21, 50), + (105, 20, 60), (115, 26, 67), (125, 40, 70), (139, 52, 73), + (143, 56, 75), (140, 50, 80), (136, 45, 77), (131, 43, 70), + (130, 44, 57), (130, 48, 44), (129, 43, 36), (125, 36, 28), + (119, 27, 23), (110, 17, 17), (102, 11, 14), (96, 7, 10), + (89, 6, 6), (85, 7, 4), (82, 9, 2), (83, 14, 3), + (88, 17, 5), (94, 21, 6), (98, 26, 11), (105, 27, 22), + (108, 28, 36), (116, 25, 51), (123, 21, 61), (125, 21, 61), + (128, 17, 60), (127, 14, 60), (128, 11, 67), (133, 5, 79), + (137, 3, 83), (139, 3, 81), (147, 2, 73), (153, 2, 66), + (159, 7, 66), (165, 15, 70), (166, 24, 76), (167, 33, 80), + (168, 36, 79), (169, 41, 75), (170, 45, 73), (169, 54, 74), + (170, 65, 76), (172, 71, 77), (170, 75, 76), (172, 73, 73), + (170, 73, 73), (168, 73, 71), (166, 70, 68), (155, 69, 64), + (151, 60, 58), (145, 54, 52), (135, 49, 44), (126, 39, 35) + ), + +// 381 040221-24 +((96, 87, 69), (102, 93, 75), (102, 95, 78), (103, 97, 81), + (100, 97, 83), (97, 98, 86), (95, 98, 88), (94, 99, 90), + (108, 114, 102), (114, 122, 108), (121, 130, 114), (126, 134, 117), + (132, 139, 121), (133, 140, 121), (134, 141, 122), (134, 140, 121), + (134, 140, 121), (134, 135, 114), (133, 133, 113), (133, 132, 112), + (137, 133, 114), (141, 135, 116), (142, 137, 118), (144, 140, 120), + (152, 149, 130), (156, 151, 133), (160, 154, 137), (161, 155, 137), + (163, 157, 138), (162, 156, 139), (162, 156, 141), (160, 157, 143), + (156, 154, 144), (142, 147, 137), (131, 137, 127), (121, 128, 118), + (107, 114, 106), (94, 100, 94), (87, 93, 88), (81, 87, 83), + (57, 63, 65), (46, 53, 56), (36, 43, 48), (29, 36, 40), + (22, 30, 33), (20, 28, 31), (19, 26, 30), (19, 27, 32), + (20, 30, 37), (30, 44, 54), (39, 53, 62), (49, 62, 70), + (58, 70, 76), (67, 79, 82), (71, 83, 85), (76, 88, 88), + (93, 105, 102), (103, 113, 109), (113, 122, 117), (122, 130, 124), + (132, 139, 131), (136, 142, 133), (141, 146, 135), (150, 153, 138), + (157, 159, 141), (167, 163, 141), (168, 162, 138), (170, 161, 136), + (171, 160, 133), (172, 159, 131), (173, 156, 127), (172, 153, 122), + (170, 151, 117), (167, 150, 114), (164, 149, 111), (164, 148, 110), + (164, 148, 110), (164, 148, 111), (165, 149, 112), (166, 149, 114), + (168, 155, 118), (177, 164, 130), (177, 168, 134), (178, 172, 139), + (178, 172, 140), (178, 173, 142), (175, 173, 143), (171, 170, 142), + (161, 159, 136), (154, 152, 130), (148, 146, 125), (145, 142, 122), + (142, 139, 119), (139, 134, 112), (135, 127, 103), (133, 122, 95), + (131, 117, 87), (124, 107, 77), (120, 104, 76), (117, 102, 75), + (117, 103, 77), (117, 105, 79), (118, 108, 85), (124, 116, 92), + (145, 136, 109), (153, 144, 116), (161, 152, 123), (163, 153, 125), + (165, 155, 128), (166, 157, 131), (161, 154, 134), (155, 150, 133), + (149, 146, 133), (132, 133, 122), (127, 129, 119), (122, 125, 116), + (114, 117, 108), (107, 109, 99), (99, 99, 91), (90, 90, 81), + (76, 74, 68), (75, 68, 60), (75, 63, 52), (76, 61, 49), + (77, 59, 46), (81, 55, 41), (86, 51, 36), (91, 50, 31), + (100, 51, 32), (112, 62, 43), (118, 67, 46), (125, 73, 50), + (138, 84, 59), (151, 98, 72), (165, 111, 84), (176, 125, 95), + (195, 145, 119), (196, 154, 130), (198, 164, 142), (198, 168, 146), + (198, 172, 150), (197, 178, 159), (195, 183, 165), (190, 185, 167), + (183, 183, 165), (162, 166, 152), (155, 160, 146), (149, 154, 141), + (137, 143, 131), (125, 131, 120), (114, 118, 110), (106, 109, 101), + (93, 96, 85), (90, 93, 82), (87, 91, 79), (84, 85, 74), + (82, 83, 70), (84, 84, 69), (89, 85, 67), (96, 87, 67), + (103, 91, 67), (123, 102, 69), (127, 104, 69), (131, 106, 69), + (135, 108, 72), (138, 113, 75), (144, 117, 77), (148, 118, 81), + (153, 121, 86), (154, 122, 87), (156, 123, 88), (157, 124, 87), + (155, 121, 89), (147, 120, 89), (141, 117, 90), (133, 114, 93), + (126, 114, 98), (124, 117, 103), (127, 122, 110), (133, 128, 115), + (139, 134, 122), (143, 138, 126), (143, 140, 127), (138, 138, 124), + (118, 123, 114), (113, 118, 110), (108, 114, 107), (99, 108, 102), + (94, 103, 100), (90, 100, 99), (86, 99, 100), (82, 101, 105), + (77, 102, 111), (74, 101, 111), (68, 96, 108), (60, 91, 104), + (58, 86, 100), (58, 81, 93), (55, 75, 87), (52, 72, 82), + (50, 71, 84), (49, 70, 84), (49, 70, 83), (46, 69, 83), + (46, 69, 84), (49, 67, 82), (48, 65, 79), (47, 63, 77), + (43, 63, 80), (39, 60, 79), (35, 56, 76), (30, 52, 74), + (26, 50, 72), (25, 48, 73), (26, 49, 72), (32, 52, 73), + (40, 60, 81), (51, 69, 87), (62, 78, 90), (71, 84, 91), + (80, 88, 91), (85, 88, 87), (89, 83, 80), (90, 74, 67), + (88, 68, 59), (85, 63, 53), (83, 61, 49), (81, 59, 43), + (79, 56, 40), (73, 55, 37), (68, 51, 35), (60, 44, 32), + (50, 36, 30), (39, 29, 27), (28, 20, 24), (20, 13, 19), + (14, 7, 15), (9, 6, 13), (7, 8, 14), (8, 11, 15), + (12, 15, 21), (18, 21, 27), (24, 28, 34), (32, 35, 41), + (41, 42, 47), (53, 48, 51), (64, 55, 54), (74, 64, 55), + (85, 70, 58), (85, 71, 58), (85, 72, 57), (83, 73, 59), + (81, 73, 59), (81, 74, 60), (83, 74, 61), (84, 78, 63) + ), + +// 382 040221-25 +((173, 218, 4), (187, 194, 5), (203, 186, 5), (219, 178, 6), + (218, 173, 6), (218, 169, 6), (207, 164, 5), (196, 159, 5), + (158, 136, 6), (145, 133, 4), (132, 131, 3), (117, 134, 4), + (102, 137, 6), (95, 142, 6), (89, 148, 7), (92, 152, 9), + (95, 156, 12), (115, 180, 34), (135, 187, 56), (156, 195, 79), + (170, 182, 80), (185, 169, 82), (189, 166, 75), (193, 163, 68), + (212, 178, 80), (215, 163, 75), (218, 149, 71), (212, 129, 46), + (207, 110, 22), (206, 105, 16), (206, 101, 10), (207, 100, 7), + (209, 89, 7), (209, 62, 5), (210, 44, 5), (211, 26, 5), + (217, 15, 4), (223, 5, 4), (224, 4, 3), (226, 4, 3), + (225, 4, 5), (227, 5, 4), (229, 6, 4), (235, 10, 4), + (241, 15, 4), (242, 19, 4), (243, 24, 5), (244, 35, 6), + (245, 41, 5), (250, 43, 3), (251, 42, 3), (252, 41, 4), + (251, 40, 3), (250, 39, 3), (249, 35, 3), (248, 32, 3), + (232, 15, 3), (221, 17, 3), (211, 20, 3), (200, 31, 3), + (190, 42, 3), (183, 48, 3), (177, 55, 4), (168, 76, 10), + (160, 98, 21), (169, 146, 69), (178, 154, 88), (188, 163, 107), + (188, 166, 106), (188, 170, 105), (183, 180, 91), (179, 190, 90), + (178, 184, 100), (168, 175, 78), (158, 166, 56), (138, 166, 33), + (118, 167, 10), (113, 167, 9), (109, 168, 8), (105, 173, 13), + (109, 182, 14), (139, 196, 13), (155, 203, 13), (171, 210, 13), + (175, 217, 13), (179, 224, 14), (197, 231, 13), (215, 238, 11), + (235, 232, 5), (220, 225, 5), (205, 219, 5), (197, 215, 5), + (190, 211, 6), (178, 202, 4), (163, 193, 3), (145, 183, 3), + (124, 172, 3), (95, 158, 6), (89, 156, 5), (84, 155, 5), + (82, 154, 5), (80, 153, 5), (79, 150, 5), (82, 148, 6), + (86, 141, 6), (94, 125, 5), (103, 110, 5), (110, 102, 4), + (117, 94, 4), (130, 77, 4), (140, 67, 3), (152, 52, 3), + (159, 35, 3), (164, 14, 6), (163, 18, 5), (163, 23, 5), + (164, 36, 4), (160, 54, 2), (156, 70, 4), (152, 84, 5), + (160, 112, 5), (165, 110, 4), (170, 109, 3), (172, 103, 3), + (175, 97, 3), (179, 88, 3), (191, 79, 4), (195, 67, 5), + (191, 53, 5), (161, 43, 6), (154, 43, 5), (148, 44, 4), + (141, 41, 6), (139, 36, 5), (144, 37, 6), (143, 40, 6), + (157, 38, 4), (172, 26, 4), (188, 15, 4), (194, 10, 4), + (201, 6, 4), (209, 8, 6), (214, 15, 5), (209, 26, 7), + (200, 40, 7), (168, 65, 8), (161, 72, 7), (155, 80, 7), + (142, 97, 8), (134, 113, 8), (125, 131, 8), (118, 143, 8), + (121, 162, 5), (124, 164, 4), (128, 167, 4), (133, 169, 6), + (133, 170, 8), (131, 165, 9), (132, 162, 8), (134, 157, 7), + (136, 150, 7), (123, 141, 11), (119, 140, 11), (115, 139, 12), + (110, 137, 10), (109, 133, 8), (108, 134, 6), (104, 134, 7), + (95, 141, 8), (95, 142, 8), (95, 143, 8), (96, 148, 7), + (97, 156, 8), (99, 166, 7), (101, 177, 7), (105, 184, 7), + (111, 187, 9), (115, 187, 14), (120, 192, 16), (133, 199, 15), + (148, 209, 10), (167, 216, 9), (181, 214, 10), (183, 209, 13), + (197, 189, 9), (203, 186, 7), (209, 183, 6), (224, 177, 4), + (229, 170, 5), (229, 160, 6), (229, 141, 6), (229, 119, 6), + (233, 95, 6), (240, 76, 7), (243, 64, 7), (247, 57, 7), + (250, 55, 6), (251, 53, 6), (252, 54, 7), (251, 55, 8), + (250, 60, 7), (252, 68, 7), (251, 75, 7), (251, 82, 6), + (250, 83, 7), (249, 78, 7), (251, 69, 7), (249, 60, 7), + (246, 48, 6), (242, 40, 7), (236, 35, 8), (235, 38, 8), + (233, 52, 9), (235, 71, 10), (235, 89, 18), (231, 113, 30), + (232, 133, 43), (227, 152, 58), (227, 177, 59), (222, 186, 61), + (218, 198, 57), (218, 195, 55), (219, 181, 61), (225, 166, 55), + (220, 137, 50), (216, 116, 35), (210, 95, 20), (206, 81, 12), + (208, 74, 6), (203, 70, 6), (204, 71, 6), (204, 69, 5), + (208, 70, 5), (208, 75, 5), (202, 89, 6), (202, 105, 6), + (202, 121, 6), (204, 131, 7), (200, 133, 7), (187, 132, 7), + (169, 128, 7), (151, 128, 6), (140, 131, 7), (129, 135, 6), + (119, 134, 5), (111, 134, 5), (101, 131, 3), (99, 134, 3), + (101, 146, 3), (104, 157, 5), (108, 167, 4), (110, 170, 4), + (116, 175, 4), (130, 185, 2), (147, 200, 5), (161, 215, 5) + ), + +// 383 040221-26 +((157, 81, 83), (137, 70, 91), (125, 64, 91), (113, 59, 92), + (107, 55, 91), (101, 52, 90), (101, 52, 89), (101, 52, 88), + (120, 62, 95), (130, 67, 96), (140, 73, 97), (147, 77, 96), + (155, 82, 95), (161, 86, 96), (167, 90, 98), (168, 91, 99), + (169, 93, 100), (172, 93, 106), (171, 95, 114), (170, 98, 122), + (170, 101, 132), (170, 105, 143), (168, 108, 148), (167, 111, 153), + (163, 113, 157), (163, 112, 154), (164, 111, 152), (174, 117, 153), + (184, 124, 154), (190, 131, 157), (196, 138, 161), (209, 152, 163), + (218, 163, 165), (221, 164, 152), (221, 159, 141), (222, 154, 130), + (219, 147, 124), (217, 140, 119), (214, 138, 117), (212, 136, 115), + (191, 123, 113), (178, 113, 111), (165, 104, 110), (152, 91, 112), + (140, 78, 114), (135, 73, 112), (130, 68, 111), (120, 61, 107), + (110, 56, 107), (94, 53, 105), (92, 52, 108), (90, 52, 111), + (97, 53, 110), (104, 55, 110), (109, 56, 109), (115, 58, 108), + (136, 68, 98), (145, 71, 92), (155, 75, 86), (163, 75, 80), + (171, 75, 75), (173, 74, 73), (176, 74, 71), (178, 74, 68), + (177, 74, 68), (166, 75, 76), (160, 73, 77), (154, 71, 78), + (151, 68, 77), (148, 66, 76), (144, 63, 73), (139, 61, 69), + (121, 56, 77), (115, 56, 84), (109, 56, 91), (112, 59, 96), + (116, 63, 101), (123, 67, 100), (131, 72, 99), (146, 86, 102), + (159, 98, 107), (174, 121, 123), (174, 128, 134), (174, 135, 145), + (177, 136, 147), (180, 138, 149), (184, 143, 150), (186, 144, 150), + (184, 144, 147), (173, 139, 147), (162, 134, 148), (157, 129, 147), + (153, 124, 147), (146, 116, 140), (142, 105, 133), (143, 98, 126), + (144, 93, 119), (149, 95, 111), (155, 105, 114), (161, 115, 118), + (164, 119, 121), (168, 124, 125), (179, 132, 133), (188, 139, 143), + (205, 150, 162), (212, 157, 171), (219, 165, 181), (218, 169, 186), + (218, 174, 191), (218, 183, 197), (219, 189, 201), (222, 190, 204), + (221, 191, 207), (224, 193, 207), (223, 192, 205), (222, 192, 203), + (216, 191, 200), (211, 187, 195), (203, 177, 187), (194, 166, 176), + (179, 149, 163), (172, 141, 157), (166, 133, 152), (165, 131, 150), + (165, 129, 149), (162, 121, 143), (158, 109, 134), (155, 98, 127), + (154, 90, 121), (156, 82, 108), (161, 84, 106), (166, 86, 104), + (176, 93, 102), (186, 100, 102), (197, 109, 104), (203, 119, 108), + (207, 129, 122), (201, 126, 128), (195, 124, 134), (189, 120, 136), + (184, 116, 138), (176, 110, 140), (167, 107, 140), (164, 106, 139), + (166, 108, 138), (174, 117, 139), (175, 118, 140), (176, 120, 141), + (177, 120, 140), (176, 121, 141), (178, 122, 137), (183, 122, 130), + (200, 126, 117), (201, 126, 116), (203, 126, 115), (201, 127, 114), + (192, 126, 117), (182, 125, 121), (171, 120, 123), (162, 112, 121), + (157, 103, 114), (148, 80, 96), (147, 75, 92), (146, 71, 88), + (145, 66, 83), (144, 64, 80), (147, 63, 80), (154, 67, 78), + (175, 79, 75), (181, 82, 74), (188, 86, 73), (202, 94, 73), + (213, 101, 73), (223, 106, 77), (228, 112, 81), (231, 120, 87), + (230, 126, 95), (223, 130, 106), (215, 132, 116), (209, 133, 120), + (200, 128, 123), (188, 121, 124), (176, 114, 125), (168, 108, 122), + (151, 95, 120), (151, 94, 119), (151, 94, 118), (154, 91, 115), + (155, 87, 110), (155, 81, 105), (155, 78, 98), (154, 71, 87), + (150, 65, 80), (148, 62, 74), (148, 60, 69), (148, 60, 65), + (151, 59, 61), (153, 59, 59), (154, 58, 59), (152, 55, 57), + (150, 54, 55), (150, 52, 54), (149, 52, 55), (150, 54, 56), + (154, 57, 57), (161, 63, 60), (169, 68, 62), (177, 73, 63), + (187, 76, 63), (196, 79, 64), (202, 81, 65), (207, 81, 66), + (210, 82, 66), (211, 84, 66), (208, 83, 67), (206, 82, 66), + (204, 80, 66), (201, 77, 64), (196, 72, 63), (188, 66, 61), + (179, 62, 59), (168, 59, 60), (157, 57, 64), (148, 55, 68), + (143, 56, 72), (143, 59, 75), (145, 62, 76), (151, 65, 77), + (156, 71, 79), (159, 77, 83), (161, 82, 90), (165, 88, 96), + (171, 92, 100), (179, 97, 101), (190, 98, 101), (204, 101, 97), + (217, 106, 93), (228, 110, 94), (235, 114, 96), (239, 120, 100), + (240, 128, 105), (241, 134, 110), (243, 137, 111), (244, 137, 109), + (245, 138, 107), (245, 135, 104), (243, 132, 100), (241, 131, 99), + (239, 134, 100), (236, 136, 103), (233, 136, 104), (223, 130, 100), + (212, 122, 96), (200, 112, 90), (186, 100, 86), (172, 88, 82) + ), + +// 384 040221-27 +((200, 139, 100), (180, 128, 94), (175, 123, 93), (170, 119, 92), + (167, 116, 89), (165, 113, 87), (162, 108, 87), (159, 104, 87), + (147, 89, 80), (146, 86, 73), (145, 84, 67), (149, 90, 63), + (154, 96, 60), (167, 107, 59), (180, 119, 58), (185, 124, 59), + (191, 130, 61), (210, 146, 65), (215, 149, 66), (220, 152, 68), + (223, 155, 70), (226, 158, 72), (229, 162, 73), (232, 166, 74), + (242, 183, 85), (246, 189, 89), (250, 196, 93), (252, 198, 94), + (254, 201, 96), (252, 199, 95), (250, 197, 94), (245, 191, 91), + (239, 181, 87), (218, 155, 76), (207, 142, 69), (196, 129, 63), + (185, 116, 57), (175, 104, 51), (169, 99, 47), (164, 94, 44), + (145, 73, 37), (135, 63, 33), (126, 53, 29), (121, 46, 27), + (116, 40, 25), (115, 39, 25), (115, 39, 26), (117, 41, 26), + (121, 45, 32), (132, 54, 49), (136, 62, 58), (141, 70, 68), + (147, 78, 74), (153, 87, 81), (156, 91, 83), (159, 95, 85), + (162, 104, 91), (164, 105, 92), (166, 107, 93), (165, 108, 94), + (165, 109, 96), (165, 110, 97), (165, 112, 98), (169, 117, 100), + (173, 126, 103), (183, 141, 112), (187, 145, 111), (192, 149, 110), + (194, 150, 110), (197, 152, 110), (202, 155, 107), (209, 161, 104), + (226, 175, 107), (233, 182, 111), (240, 190, 116), (245, 196, 117), + (251, 202, 118), (252, 203, 116), (254, 204, 115), (254, 204, 110), + (254, 204, 105), (254, 202, 96), (254, 197, 93), (254, 193, 90), + (254, 189, 89), (254, 186, 88), (253, 182, 90), (253, 180, 92), + (253, 179, 96), (253, 181, 97), (253, 183, 98), (253, 184, 98), + (253, 186, 98), (254, 183, 94), (254, 181, 94), (253, 180, 95), + (253, 179, 96), (252, 179, 102), (251, 182, 107), (250, 186, 112), + (250, 186, 112), (250, 186, 113), (249, 185, 112), (247, 183, 110), + (242, 174, 106), (238, 170, 102), (234, 166, 98), (231, 164, 97), + (229, 162, 96), (228, 156, 95), (229, 150, 94), (228, 145, 93), + (226, 140, 91), (214, 125, 85), (209, 121, 82), (205, 117, 79), + (193, 111, 74), (184, 106, 70), (181, 103, 70), (184, 104, 73), + (192, 113, 89), (197, 117, 99), (202, 122, 110), (202, 123, 114), + (202, 125, 119), (200, 130, 125), (198, 133, 126), (202, 139, 127), + (207, 146, 129), (224, 166, 132), (229, 171, 133), (234, 177, 135), + (242, 186, 138), (248, 194, 140), (251, 197, 138), (253, 200, 133), + (254, 202, 120), (254, 202, 113), (254, 203, 106), (254, 203, 103), + (254, 203, 100), (254, 203, 97), (254, 203, 95), (254, 203, 94), + (253, 202, 93), (252, 193, 94), (251, 191, 95), (250, 189, 97), + (249, 187, 103), (249, 187, 109), (250, 188, 118), (250, 191, 126), + (251, 198, 139), (250, 198, 139), (250, 199, 140), (250, 196, 139), + (249, 195, 139), (249, 193, 137), (248, 191, 138), (248, 188, 138), + (244, 188, 138), (228, 178, 127), (222, 172, 121), (216, 166, 116), + (204, 153, 104), (192, 138, 88), (181, 124, 74), (172, 108, 62), + (162, 89, 46), (158, 84, 43), (155, 79, 40), (144, 68, 32), + (133, 57, 26), (121, 47, 18), (110, 36, 12), (99, 25, 8), + (90, 20, 5), (90, 21, 9), (96, 23, 15), (101, 29, 19), + (109, 37, 26), (119, 49, 34), (130, 61, 43), (141, 71, 50), + (152, 94, 63), (156, 99, 67), (161, 105, 72), (169, 117, 84), + (178, 128, 95), (189, 141, 106), (201, 154, 118), (216, 165, 127), + (227, 177, 132), (237, 188, 134), (244, 196, 135), (249, 204, 135), + (252, 209, 133), (253, 208, 129), (249, 203, 125), (244, 193, 120), + (236, 183, 112), (228, 173, 102), (219, 163, 92), (214, 154, 84), + (207, 150, 78), (206, 146, 73), (204, 143, 71), (202, 136, 67), + (198, 131, 67), (195, 126, 64), (186, 120, 63), (179, 113, 63), + (168, 106, 63), (162, 104, 63), (159, 103, 66), (158, 102, 67), + (159, 103, 70), (162, 103, 72), (165, 107, 75), (168, 112, 80), + (171, 113, 86), (175, 118, 92), (179, 124, 96), (183, 128, 98), + (186, 133, 99), (191, 136, 98), (195, 137, 98), (198, 142, 99), + (201, 145, 103), (205, 149, 109), (208, 153, 113), (212, 156, 117), + (218, 162, 120), (225, 168, 121), (230, 172, 121), (232, 176, 118), + (232, 178, 115), (233, 179, 114), (231, 179, 112), (230, 177, 110), + (229, 176, 108), (230, 176, 106), (234, 179, 105), (238, 183, 103), + (243, 187, 102), (248, 192, 102), (251, 196, 101), (253, 200, 101), + (255, 202, 99), (255, 202, 97), (253, 199, 97), (251, 193, 98), + (243, 183, 100), (234, 173, 101), (223, 161, 101), (211, 149, 101) + ), + +// 385 040221-28 +((0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (3, 5, 4), (6, 9, 9), (9, 14, 15), (12, 18, 19), + (15, 23, 23), (16, 26, 26), (17, 29, 30), (18, 32, 32), + (20, 35, 35), (27, 39, 40), (25, 37, 39), (24, 36, 38), + (21, 33, 35), (18, 30, 32), (16, 27, 30), (15, 25, 28), + (17, 24, 24), (17, 27, 28), (18, 30, 32), (26, 42, 43), + (34, 54, 54), (36, 59, 59), (38, 64, 65), (48, 85, 85), + (71, 107, 105), (92, 165, 160), (107, 180, 175), (122, 195, 190), + (98, 157, 155), (75, 120, 120), (72, 119, 118), (70, 118, 117), + (33, 58, 56), (29, 49, 48), (25, 40, 40), (22, 37, 37), + (20, 35, 35), (19, 32, 33), (18, 30, 32), (14, 27, 28), + (14, 27, 28), (13, 25, 27), (11, 22, 24), (9, 19, 22), + (8, 18, 20), (7, 17, 19), (8, 17, 18), (9, 17, 17), + (9, 17, 17), (9, 17, 17), (10, 18, 18), (12, 20, 20), + (14, 22, 22), (14, 22, 22), (14, 22, 22), (12, 23, 22), + (10, 22, 20), (7, 17, 19), (7, 17, 19), (7, 17, 19), + (7, 15, 16), (7, 14, 14), (5, 13, 13), (5, 13, 13), + (2, 14, 15), (3, 14, 16), (5, 15, 18), (6, 14, 16), + (7, 14, 14), (6, 13, 13), (5, 13, 13), (4, 12, 12), + (2, 12, 14), (4, 24, 24), (8, 31, 31), (12, 38, 39), + (15, 39, 40), (19, 41, 41), (23, 40, 41), (24, 41, 41), + (23, 40, 40), (20, 37, 37), (18, 35, 35), (16, 33, 33), + (14, 32, 32), (14, 27, 28), (18, 33, 33), (23, 40, 40), + (27, 51, 53), (48, 77, 77), (54, 87, 87), (61, 98, 98), + (63, 101, 100), (65, 105, 103), (60, 98, 101), (66, 92, 94), + (55, 95, 94), (51, 86, 87), (48, 77, 80), (44, 71, 73), + (40, 66, 67), (40, 65, 64), (38, 63, 64), (36, 54, 54), + (29, 53, 48), (22, 36, 36), (20, 30, 30), (18, 25, 25), + (12, 19, 19), (7, 12, 13), (3, 8, 9), (2, 4, 3), + (2, 2, 2), (1, 2, 1), (0, 2, 1), (0, 1, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 7, 9), (1, 8, 9), (3, 10, 10), + (9, 17, 17), (12, 22, 24), (13, 25, 27), (15, 30, 30), + (22, 36, 36), (22, 37, 37), (23, 38, 38), (21, 38, 38), + (20, 38, 38), (19, 36, 36), (20, 35, 35), (22, 36, 36), + (22, 39, 39), (24, 39, 39), (24, 39, 39), (24, 39, 39), + (23, 40, 40), (22, 41, 41), (18, 45, 43), (22, 46, 44), + (28, 53, 51), (28, 53, 50), (29, 53, 50), (33, 53, 53), + (36, 54, 54), (32, 54, 54), (29, 49, 48), (30, 44, 46), + (25, 40, 40), (17, 32, 32), (15, 29, 30), (14, 27, 28), + (13, 25, 27), (14, 24, 27), (17, 27, 30), (22, 32, 34), + (25, 45, 44), (25, 45, 44), (25, 45, 44), (29, 51, 51), + (32, 54, 54), (30, 53, 53), (29, 49, 49), (27, 46, 46), + (25, 45, 45), (25, 43, 44), (24, 41, 43), (25, 43, 44), + (25, 45, 45), (30, 53, 53), (30, 55, 54), (35, 60, 59), + (43, 67, 69), (43, 70, 71), (44, 74, 74), (49, 81, 82), + (53, 87, 89), (46, 79, 77), (45, 77, 79), (43, 72, 72), + (36, 64, 61), (35, 60, 59), (33, 55, 58), (29, 51, 51), + (28, 45, 45), (28, 46, 43), (25, 43, 44), (24, 44, 43), + (24, 39, 39), (19, 34, 34), (14, 27, 28), (12, 22, 24), + (9, 14, 18), (5, 10, 12), (4, 5, 8), (3, 4, 7), + (2, 7, 8), (3, 10, 10), (4, 9, 10), (5, 10, 9), + (5, 10, 12), (7, 12, 13), (7, 14, 14), (7, 14, 14), + (9, 17, 17), (9, 19, 22), (7, 22, 22), (10, 23, 24), + (12, 22, 24), (12, 22, 24), (14, 24, 27), (13, 25, 27), + (18, 28, 30), (18, 30, 32), (18, 33, 33), (20, 38, 38), + (23, 40, 41), (24, 41, 43), (25, 48, 48), (29, 51, 51), + (30, 53, 53), (32, 54, 54), (30, 56, 58), (32, 58, 59), + (32, 58, 59), (39, 64, 63), (40, 65, 64), (43, 75, 74), + (45, 77, 76), (45, 75, 75), (44, 70, 71), (39, 64, 63), + (38, 63, 64), (33, 63, 63), (33, 58, 56), (32, 56, 55), + (33, 58, 59), (38, 67, 67), (43, 72, 72), (48, 77, 77), + (53, 90, 90), (54, 98, 98), (75, 129, 131), (60, 102, 103) + ), + +// 386 040221-29 +((44, 40, 28), (53, 50, 35), (53, 49, 36), (53, 49, 37), + (47, 47, 34), (42, 46, 32), (40, 41, 29), (39, 36, 27), + (35, 35, 25), (33, 31, 22), (31, 28, 19), (28, 27, 15), + (25, 26, 12), (23, 24, 14), (21, 22, 17), (21, 21, 15), + (21, 21, 13), (22, 20, 7), (21, 17, 5), (21, 15, 3), + (17, 13, 2), (14, 11, 2), (15, 12, 3), (16, 13, 4), + (19, 19, 11), (22, 20, 12), (25, 22, 13), (27, 26, 18), + (29, 30, 24), (31, 31, 26), (33, 32, 28), (39, 35, 26), + (41, 39, 26), (54, 51, 32), (61, 58, 36), (68, 66, 41), + (86, 79, 48), (105, 93, 55), (110, 98, 58), (115, 103, 61), + (111, 105, 73), (107, 102, 75), (104, 99, 77), (100, 93, 62), + (96, 87, 48), (90, 81, 41), (85, 76, 35), (65, 58, 30), + (55, 49, 25), (44, 38, 16), (41, 34, 14), (38, 31, 12), + (30, 27, 11), (23, 24, 10), (21, 22, 10), (20, 20, 10), + (17, 16, 11), (18, 16, 12), (20, 16, 13), (19, 17, 12), + (19, 19, 11), (18, 19, 11), (18, 19, 11), (19, 18, 13), + (21, 17, 14), (16, 17, 12), (14, 15, 9), (13, 14, 6), + (9, 12, 5), (6, 11, 4), (13, 14, 9), (14, 15, 9), + (17, 16, 11), (17, 17, 8), (18, 18, 6), (23, 20, 5), + (28, 23, 4), (31, 24, 2), (35, 25, 0), (40, 30, 3), + (31, 24, 6), (32, 29, 14), (34, 31, 16), (37, 34, 19), + (38, 34, 17), (40, 35, 16), (45, 34, 14), (43, 38, 19), + (33, 34, 18), (28, 29, 17), (24, 25, 17), (23, 23, 17), + (23, 22, 17), (23, 20, 15), (25, 23, 11), (30, 27, 10), + (31, 32, 14), (39, 40, 24), (41, 40, 24), (44, 41, 24), + (45, 43, 24), (47, 45, 24), (50, 44, 22), (53, 45, 26), + (58, 52, 28), (58, 52, 28), (58, 52, 28), (58, 53, 26), + (59, 54, 25), (61, 52, 21), (62, 57, 25), (58, 54, 29), + (58, 53, 31), (64, 60, 35), (68, 61, 37), (73, 62, 40), + (87, 78, 47), (110, 101, 68), (126, 115, 83), (136, 123, 88), + (139, 128, 98), (130, 122, 91), (122, 116, 84), (113, 107, 80), + (104, 99, 77), (85, 82, 63), (75, 69, 53), (63, 60, 45), + (52, 50, 37), (31, 28, 23), (29, 26, 19), (27, 24, 15), + (26, 23, 14), (25, 23, 11), (27, 23, 11), (31, 25, 13), + (36, 31, 11), (40, 34, 13), (44, 38, 16), (46, 40, 18), + (48, 42, 20), (50, 45, 25), (54, 49, 30), (60, 54, 38), + (59, 57, 44), (65, 53, 31), (65, 55, 31), (65, 58, 32), + (69, 59, 34), (76, 65, 43), (98, 86, 46), (115, 104, 74), + (154, 145, 106), (167, 160, 111), (180, 175, 117), (193, 183, 124), + (183, 172, 126), (180, 163, 117), (158, 148, 112), (134, 130, 101), + (104, 97, 81), (75, 70, 48), (74, 66, 42), (73, 63, 36), + (75, 67, 31), (88, 82, 32), (108, 94, 49), (123, 110, 65), + (166, 154, 94), (164, 153, 98), (162, 152, 103), (165, 153, 113), + (160, 151, 120), (162, 155, 113), (156, 145, 100), (143, 136, 90), + (121, 113, 76), (102, 93, 62), (83, 74, 43), (76, 68, 32), + (71, 65, 33), (74, 67, 38), (80, 77, 46), (98, 91, 65), + (96, 96, 72), (95, 96, 71), (94, 97, 70), (83, 81, 60), + (77, 75, 50), (76, 73, 42), (72, 68, 43), (69, 67, 46), + (74, 72, 51), (78, 76, 55), (86, 80, 54), (97, 91, 65), + (97, 91, 59), (105, 94, 49), (88, 79, 46), (81, 67, 38), + (67, 63, 36), (63, 57, 35), (56, 55, 34), (52, 45, 26), + (45, 39, 25), (46, 43, 26), (49, 46, 29), (49, 47, 35), + (62, 56, 40), (81, 74, 48), (104, 93, 65), (121, 111, 84), + (137, 125, 83), (151, 135, 86), (128, 119, 80), (105, 94, 66), + (81, 76, 44), (67, 60, 31), (57, 51, 25), (51, 45, 23), + (46, 41, 19), (45, 39, 23), (44, 43, 23), (48, 43, 24), + (49, 43, 17), (53, 49, 20), (56, 50, 16), (59, 51, 14), + (59, 55, 20), (60, 51, 18), (56, 45, 23), (50, 43, 25), + (47, 44, 25), (41, 40, 22), (34, 32, 19), (31, 29, 16), + (24, 24, 14), (20, 22, 11), (21, 21, 11), (27, 24, 9), + (31, 28, 11), (37, 32, 12), (44, 37, 18), (59, 50, 21), + (73, 66, 38), (108, 94, 65), (137, 127, 100), (185, 175, 140), + (221, 214, 172), (233, 224, 185), (196, 183, 141), (152, 143, 110), + (128, 118, 82), (113, 104, 65), (83, 78, 49), (76, 66, 39) + ), + +// 387 040221-30 +((84, 36, 31), (82, 62, 55), (90, 62, 56), (98, 63, 58), + (115, 55, 48), (132, 47, 38), (136, 41, 32), (141, 35, 27), + (146, 15, 6), (132, 10, 3), (119, 6, 0), (104, 15, 10), + (90, 24, 21), (85, 35, 28), (80, 47, 35), (77, 52, 40), + (74, 57, 46), (75, 63, 43), (78, 63, 38), (81, 64, 34), + (86, 68, 39), (91, 72, 44), (95, 76, 49), (100, 81, 55), + (125, 77, 55), (133, 68, 49), (141, 59, 43), (154, 48, 27), + (168, 38, 11), (166, 32, 8), (164, 27, 5), (156, 28, 3), + (144, 23, 2), (108, 22, 10), (88, 23, 14), (68, 24, 19), + (57, 35, 25), (47, 47, 32), (52, 42, 31), (57, 38, 31), + (82, 25, 19), (102, 16, 12), (123, 7, 6), (121, 5, 3), + (120, 4, 0), (119, 13, 3), (118, 23, 7), (115, 43, 27), + (120, 52, 45), (135, 113, 95), (144, 121, 109), (153, 130, 124), + (146, 130, 125), (139, 131, 126), (132, 123, 117), (126, 115, 109), + (111, 69, 62), (98, 49, 45), (86, 30, 28), (73, 16, 15), + (60, 3, 2), (52, 2, 1), (45, 2, 1), (30, 0, 0), + (15, 2, 0), (3, 0, 0), (2, 0, 0), (2, 0, 0), + (2, 0, 0), (2, 0, 0), (3, 1, 1), (7, 5, 4), + (19, 21, 17), (28, 31, 26), (37, 42, 35), (50, 57, 48), + (63, 73, 62), (69, 79, 68), (76, 85, 74), (93, 104, 92), + (102, 112, 97), (100, 111, 95), (93, 102, 87), (87, 93, 79), + (85, 94, 79), (83, 95, 79), (85, 90, 77), (92, 87, 79), + (127, 117, 104), (145, 128, 111), (163, 140, 119), (164, 149, 127), + (165, 159, 136), (173, 163, 139), (170, 161, 143), (155, 158, 143), + (140, 140, 132), (110, 100, 95), (98, 73, 69), (87, 47, 44), + (82, 39, 37), (77, 32, 31), (65, 21, 17), (57, 12, 5), + (41, 12, 2), (30, 12, 1), (20, 13, 1), (18, 11, 0), + (16, 9, 0), (12, 5, 0), (10, 5, 0), (11, 2, 0), + (19, 0, 0), (47, 0, 0), (52, 0, 0), (57, 0, 0), + (64, 12, 4), (68, 24, 11), (73, 20, 13), (79, 24, 15), + (103, 35, 19), (100, 38, 17), (97, 42, 15), (98, 39, 12), + (100, 37, 9), (77, 42, 10), (50, 43, 10), (37, 29, 7), + (29, 22, 6), (10, 9, 4), (8, 6, 2), (6, 4, 1), + (4, 3, 0), (2, 2, 0), (1, 0, 0), (0, 0, 0), + (0, 1, 0), (3, 3, 2), (7, 6, 5), (8, 8, 6), + (10, 10, 8), (16, 20, 17), (23, 27, 24), (28, 31, 26), + (32, 39, 31), (42, 36, 28), (44, 33, 25), (46, 31, 22), + (50, 27, 17), (52, 20, 12), (50, 15, 6), (45, 10, 1), + (28, 6, 1), (23, 4, 0), (18, 3, 0), (11, 0, 0), + (6, 0, 0), (6, 2, 2), (8, 6, 4), (14, 11, 8), + (27, 12, 8), (52, 11, 8), (59, 10, 7), (67, 10, 6), + (78, 3, 2), (86, 0, 0), (89, 0, 0), (86, 2, 2), + (70, 24, 17), (69, 28, 22), (68, 33, 28), (69, 54, 44), + (70, 73, 59), (82, 85, 78), (98, 100, 96), (110, 118, 109), + (126, 133, 123), (135, 141, 134), (141, 151, 140), (145, 151, 140), + (144, 142, 137), (139, 137, 132), (133, 125, 124), (122, 110, 116), + (109, 105, 105), (109, 105, 104), (109, 105, 104), (109, 105, 106), + (112, 111, 110), (119, 123, 115), (124, 128, 117), (133, 129, 114), + (141, 131, 111), (137, 130, 111), (137, 129, 106), (138, 125, 99), + (129, 115, 99), (118, 107, 98), (111, 99, 89), (103, 86, 74), + (96, 72, 60), (91, 61, 53), (86, 56, 51), (89, 63, 54), + (89, 71, 61), (90, 77, 72), (96, 90, 86), (97, 99, 92), + (98, 102, 91), (99, 105, 92), (105, 111, 96), (109, 116, 103), + (110, 123, 109), (114, 128, 111), (114, 123, 111), (109, 119, 108), + (96, 111, 97), (83, 90, 76), (72, 73, 59), (60, 56, 42), + (57, 37, 23), (57, 21, 13), (62, 14, 5), (72, 7, 0), + (81, 1, 0), (89, 1, 1), (95, 1, 1), (100, 1, 1), + (100, 1, 1), (99, 2, 2), (99, 2, 1), (98, 0, 0), + (93, 1, 0), (82, 3, 1), (66, 3, 0), (55, 3, 0), + (40, 4, 0), (21, 4, 0), (13, 6, 0), (10, 7, 2), + (12, 11, 6), (18, 20, 13), (25, 26, 18), (39, 34, 21), + (60, 40, 26), (83, 36, 30), (106, 41, 30), (120, 49, 35), + (125, 49, 40), (127, 52, 44), (125, 51, 43), (114, 41, 35), + (98, 36, 29), (94, 24, 21), (94, 15, 17), (88, 26, 24) + ), + +// 388 040221-31 +((46, 43, 27), (52, 49, 31), (51, 48, 32), (50, 47, 33), + (46, 44, 32), (42, 42, 32), (41, 42, 31), (40, 42, 31), + (46, 46, 36), (52, 51, 37), (58, 56, 38), (63, 59, 36), + (69, 62, 34), (70, 62, 35), (71, 63, 37), (71, 64, 36), + (72, 65, 35), (68, 59, 29), (64, 57, 29), (60, 55, 30), + (59, 52, 25), (58, 49, 21), (57, 48, 19), (57, 47, 18), + (52, 44, 16), (48, 39, 14), (44, 35, 12), (39, 32, 13), + (34, 29, 15), (31, 27, 15), (29, 26, 15), (25, 23, 15), + (23, 21, 15), (23, 23, 17), (27, 26, 18), (32, 30, 20), + (42, 39, 27), (52, 48, 35), (59, 55, 41), (66, 62, 47), + (95, 88, 68), (99, 91, 71), (104, 95, 75), (101, 93, 72), + (98, 91, 70), (94, 86, 64), (90, 81, 58), (76, 66, 46), + (62, 54, 33), (42, 37, 19), (39, 33, 16), (37, 30, 14), + (36, 31, 15), (36, 33, 17), (37, 34, 18), (39, 35, 20), + (44, 40, 25), (45, 41, 25), (47, 42, 26), (46, 40, 24), + (46, 39, 23), (45, 38, 21), (44, 37, 19), (40, 34, 16), + (36, 31, 12), (29, 23, 7), (26, 21, 6), (23, 20, 6), + (22, 19, 6), (21, 19, 7), (20, 19, 7), (19, 18, 8), + (16, 16, 9), (15, 15, 8), (14, 14, 7), (13, 12, 5), + (12, 11, 4), (11, 10, 3), (11, 10, 3), (10, 9, 2), + (8, 7, 1), (7, 4, 0), (7, 3, 0), (8, 3, 0), + (8, 3, 0), (9, 3, 0), (11, 4, 0), (12, 6, 0), + (16, 10, 2), (16, 12, 3), (17, 14, 5), (18, 15, 6), + (20, 17, 8), (23, 20, 11), (27, 24, 14), (31, 27, 16), + (36, 33, 18), (46, 42, 23), (49, 44, 22), (52, 46, 22), + (53, 46, 21), (54, 47, 21), (53, 46, 21), (50, 43, 20), + (45, 38, 14), (42, 36, 12), (40, 34, 10), (38, 32, 9), + (36, 31, 9), (34, 29, 8), (32, 27, 5), (32, 26, 4), + (32, 26, 3), (37, 28, 4), (38, 29, 5), (40, 31, 7), + (45, 35, 10), (50, 41, 14), (55, 44, 17), (57, 48, 22), + (58, 53, 33), (60, 55, 37), (63, 57, 41), (63, 59, 42), + (64, 61, 44), (70, 67, 48), (76, 73, 52), (86, 77, 56), + (89, 84, 59), (94, 89, 59), (94, 87, 58), (95, 86, 58), + (91, 84, 60), (84, 80, 57), (79, 77, 58), (82, 78, 60), + (96, 91, 77), (106, 99, 82), (116, 108, 88), (121, 113, 90), + (127, 119, 93), (138, 130, 99), (146, 136, 103), (153, 143, 106), + (157, 146, 107), (156, 149, 108), (153, 147, 108), (151, 145, 109), + (145, 139, 106), (139, 134, 104), (124, 124, 97), (108, 110, 89), + (81, 81, 64), (73, 75, 59), (66, 69, 54), (55, 58, 44), + (45, 48, 35), (41, 40, 28), (37, 35, 23), (34, 32, 19), + (31, 29, 16), (29, 28, 15), (28, 27, 15), (28, 27, 15), + (28, 28, 16), (29, 28, 16), (31, 30, 17), (32, 31, 19), + (35, 34, 23), (35, 34, 23), (36, 35, 23), (38, 36, 24), + (41, 38, 25), (44, 42, 27), (49, 46, 27), (58, 54, 30), + (69, 64, 37), (82, 77, 45), (93, 87, 52), (105, 100, 59), + (116, 109, 68), (126, 118, 76), (128, 119, 78), (124, 117, 74), + (113, 105, 65), (109, 102, 62), (106, 99, 60), (101, 91, 54), + (100, 92, 53), (104, 96, 58), (113, 108, 68), (131, 123, 84), + (159, 149, 97), (181, 171, 118), (196, 189, 136), (207, 199, 156), + (219, 211, 161), (216, 207, 158), (201, 192, 146), (177, 170, 136), + (158, 152, 121), (135, 130, 103), (113, 106, 82), (93, 87, 64), + (82, 77, 52), (76, 72, 47), (72, 69, 46), (68, 67, 45), + (67, 65, 43), (65, 62, 39), (62, 59, 34), (56, 54, 28), + (50, 49, 22), (44, 42, 16), (39, 35, 12), (33, 29, 6), + (29, 24, 2), (24, 21, 1), (21, 19, 2), (20, 18, 3), + (21, 18, 4), (22, 19, 5), (24, 21, 7), (26, 25, 9), + (32, 30, 14), (40, 38, 17), (52, 47, 22), (65, 59, 29), + (80, 73, 39), (95, 87, 46), (109, 101, 53), (123, 112, 61), + (134, 120, 69), (139, 125, 74), (135, 123, 75), (126, 116, 72), + (114, 104, 67), (101, 91, 61), (85, 78, 53), (69, 63, 44), + (55, 50, 33), (44, 39, 25), (35, 33, 19), (29, 28, 16), + (25, 25, 13), (22, 22, 12), (20, 20, 11), (18, 18, 10), + (17, 17, 9), (17, 16, 9), (17, 16, 10), (20, 19, 11), + (21, 20, 11), (31, 28, 15), (38, 34, 19), (48, 43, 26) + ), + +// 389 040221-32 +((206, 195, 184), (218, 208, 198), (220, 210, 199), (222, 212, 201), + (226, 217, 206), (231, 222, 212), (233, 223, 212), (235, 225, 213), + (234, 223, 211), (229, 218, 206), (225, 214, 201), (220, 208, 195), + (215, 203, 190), (212, 200, 188), (209, 198, 187), (209, 198, 187), + (210, 199, 187), (214, 205, 195), (219, 210, 200), (224, 215, 205), + (231, 222, 212), (238, 230, 220), (239, 231, 221), (241, 233, 223), + (235, 226, 216), (223, 214, 203), (211, 202, 191), (192, 182, 169), + (174, 162, 148), (164, 150, 134), (154, 138, 121), (133, 110, 89), + (119, 94, 72), (99, 68, 41), (97, 68, 43), (96, 69, 46), + (99, 73, 51), (102, 77, 56), (102, 77, 56), (102, 77, 56), + (92, 68, 48), (88, 62, 40), (84, 56, 33), (83, 56, 34), + (82, 57, 36), (83, 59, 39), (85, 62, 43), (93, 70, 49), + (103, 78, 54), (117, 94, 74), (121, 96, 73), (126, 99, 73), + (120, 95, 72), (115, 92, 71), (107, 85, 65), (100, 78, 59), + (80, 57, 37), (76, 53, 34), (72, 50, 32), (84, 57, 33), + (97, 65, 35), (103, 72, 44), (110, 80, 53), (123, 95, 69), + (136, 109, 82), (155, 138, 120), (160, 145, 129), (165, 152, 139), + (165, 152, 139), (165, 152, 140), (165, 152, 140), (165, 151, 139), + (169, 150, 130), (174, 155, 133), (180, 160, 137), (188, 166, 140), + (196, 172, 143), (197, 174, 145), (198, 176, 148), (200, 178, 152), + (202, 181, 155), (205, 185, 159), (203, 186, 163), (202, 187, 167), + (201, 186, 166), (201, 186, 166), (197, 183, 166), (190, 179, 165), + (185, 170, 155), (178, 162, 148), (171, 155, 141), (168, 151, 136), + (165, 148, 132), (158, 141, 126), (152, 137, 121), (151, 135, 120), + (153, 137, 122), (166, 154, 141), (177, 164, 149), (188, 174, 158), + (192, 178, 162), (196, 182, 166), (201, 187, 168), (206, 190, 167), + (205, 186, 161), (203, 182, 156), (201, 179, 152), (198, 177, 152), + (195, 176, 152), (191, 174, 154), (190, 174, 156), (187, 174, 160), + (185, 175, 164), (185, 175, 165), (184, 174, 163), (183, 173, 162), + (181, 169, 158), (175, 162, 149), (166, 152, 136), (155, 138, 120), + (128, 108, 88), (117, 94, 73), (106, 81, 58), (103, 77, 54), + (100, 74, 51), (98, 71, 47), (99, 71, 48), (107, 77, 50), + (118, 86, 55), (130, 104, 81), (135, 109, 85), (140, 115, 90), + (143, 122, 101), (144, 126, 107), (149, 129, 107), (150, 130, 108), + (153, 133, 111), (156, 138, 118), (159, 143, 126), (159, 145, 130), + (160, 147, 134), (163, 151, 139), (169, 158, 147), (175, 164, 155), + (179, 168, 158), (193, 180, 165), (197, 183, 167), (201, 187, 170), + (205, 190, 172), (209, 193, 174), (207, 192, 173), (201, 185, 166), + (178, 162, 146), (172, 154, 137), (167, 147, 128), (155, 131, 108), + (140, 116, 93), (131, 103, 77), (121, 90, 61), (105, 76, 49), + (89, 62, 39), (69, 46, 26), (63, 42, 23), (58, 38, 21), + (63, 41, 23), (79, 54, 33), (92, 71, 52), (111, 91, 74), + (157, 140, 123), (165, 151, 136), (174, 162, 149), (189, 178, 166), + (203, 193, 182), (214, 205, 195), (224, 214, 205), (229, 220, 211), + (232, 222, 211), (233, 223, 210), (232, 221, 208), (230, 218, 202), + (227, 214, 195), (224, 210, 191), (221, 208, 189), (218, 206, 188), + (217, 206, 191), (217, 207, 193), (217, 209, 196), (218, 209, 199), + (221, 212, 202), (223, 215, 204), (223, 215, 204), (222, 213, 202), + (218, 209, 198), (214, 205, 194), (208, 199, 188), (199, 189, 178), + (190, 180, 169), (182, 171, 158), (177, 163, 146), (176, 159, 140), + (175, 158, 138), (176, 157, 135), (180, 160, 138), (181, 164, 146), + (181, 166, 150), (179, 166, 153), (178, 167, 156), (179, 167, 156), + (178, 167, 156), (178, 168, 159), (179, 169, 159), (180, 170, 160), + (181, 171, 162), (183, 173, 163), (185, 175, 164), (186, 176, 166), + (188, 179, 168), (193, 182, 170), (199, 186, 171), (204, 190, 174), + (208, 194, 177), (212, 197, 179), (214, 200, 183), (216, 202, 186), + (218, 204, 187), (218, 205, 191), (220, 208, 194), (224, 211, 195), + (225, 213, 198), (225, 215, 202), (226, 215, 202), (224, 215, 202), + (220, 212, 201), (217, 208, 197), (213, 204, 193), (210, 200, 188), + (208, 197, 185), (205, 195, 183), (206, 195, 183), (208, 198, 186), + (211, 202, 191), (217, 208, 198), (225, 215, 206), (231, 222, 212), + (236, 227, 218), (239, 230, 221), (239, 231, 222), (237, 228, 219), + (233, 225, 216), (230, 221, 213), (224, 216, 206), (220, 211, 201), + (213, 203, 193), (208, 198, 187), (211, 201, 191), (209, 199, 188) + ), + +// 390 040221-33 +((135, 92, 121), (124, 76, 110), (117, 68, 105), (110, 61, 101), + (106, 59, 100), (102, 58, 99), (99, 59, 100), (96, 60, 101), + (92, 70, 124), (94, 79, 137), (97, 88, 151), (104, 99, 161), + (111, 110, 172), (118, 119, 176), (125, 128, 181), (124, 130, 182), + (124, 132, 184), (119, 127, 182), (118, 126, 181), (117, 126, 181), + (120, 123, 177), (124, 120, 173), (128, 120, 170), (133, 120, 167), + (146, 118, 154), (149, 111, 146), (153, 105, 139), (151, 97, 132), + (150, 90, 125), (148, 86, 120), (147, 82, 115), (147, 75, 107), + (144, 71, 105), (138, 69, 104), (138, 70, 106), (139, 72, 109), + (142, 73, 109), (145, 75, 110), (148, 77, 110), (152, 80, 110), + (156, 87, 115), (156, 92, 121), (156, 98, 128), (157, 104, 136), + (158, 110, 145), (159, 112, 148), (160, 115, 151), (166, 120, 153), + (171, 121, 151), (173, 117, 144), (171, 116, 141), (170, 116, 139), + (163, 114, 136), (156, 112, 134), (154, 110, 132), (153, 109, 131), + (152, 102, 119), (154, 100, 117), (156, 99, 115), (159, 104, 119), + (163, 110, 123), (162, 112, 125), (161, 114, 127), (162, 118, 133), + (160, 123, 137), (161, 123, 141), (161, 122, 142), (161, 121, 143), + (164, 125, 146), (168, 130, 149), (172, 136, 152), (178, 145, 162), + (175, 158, 174), (164, 153, 171), (153, 149, 169), (139, 139, 164), + (125, 129, 160), (119, 123, 155), (113, 118, 151), (102, 110, 146), + (97, 106, 141), (91, 103, 134), (83, 105, 132), (76, 108, 130), + (71, 109, 131), (66, 110, 133), (57, 107, 130), (49, 100, 129), + (42, 85, 121), (42, 77, 113), (42, 69, 105), (42, 66, 98), + (43, 64, 91), (44, 65, 82), (48, 67, 77), (53, 70, 81), + (56, 75, 89), (67, 87, 107), (71, 83, 110), (75, 79, 113), + (75, 78, 112), (75, 77, 112), (76, 75, 108), (76, 72, 105), + (70, 73, 107), (68, 80, 110), (66, 87, 113), (64, 89, 115), + (62, 92, 117), (56, 98, 121), (50, 104, 120), (48, 104, 118), + (47, 103, 116), (58, 118, 125), (64, 123, 126), (70, 128, 128), + (84, 142, 136), (98, 155, 144), (110, 168, 153), (123, 180, 164), + (145, 195, 181), (159, 203, 191), (173, 212, 202), (181, 216, 207), + (190, 220, 213), (207, 229, 223), (224, 237, 233), (235, 240, 240), + (242, 241, 242), (241, 234, 241), (238, 231, 239), (236, 228, 237), + (228, 222, 233), (218, 217, 227), (216, 217, 226), (212, 211, 222), + (208, 207, 219), (210, 207, 219), (213, 208, 220), (214, 207, 220), + (215, 206, 221), (210, 207, 220), (212, 212, 223), (215, 216, 226), + (214, 217, 225), (223, 228, 233), (225, 230, 234), (227, 233, 235), + (231, 235, 237), (224, 236, 236), (216, 232, 233), (211, 224, 228), + (198, 200, 207), (196, 197, 203), (195, 195, 199), (188, 190, 188), + (182, 185, 178), (168, 179, 165), (149, 168, 152), (130, 153, 137), + (111, 132, 122), (83, 95, 91), (78, 88, 85), (73, 81, 79), + (71, 77, 72), (68, 80, 67), (61, 84, 64), (52, 87, 61), + (37, 74, 54), (36, 69, 52), (35, 65, 51), (40, 55, 50), + (50, 55, 55), (62, 64, 65), (76, 78, 79), (92, 98, 98), + (109, 116, 114), (124, 133, 130), (137, 148, 143), (152, 157, 154), + (169, 163, 162), (184, 172, 174), (199, 181, 184), (213, 195, 200), + (238, 224, 227), (241, 230, 232), (244, 236, 238), (248, 246, 247), + (252, 252, 251), (255, 255, 255), (255, 255, 255), (255, 255, 255), + (252, 251, 251), (248, 242, 244), (243, 231, 234), (234, 217, 225), + (225, 203, 214), (214, 188, 204), (204, 174, 193), (195, 163, 186), + (186, 153, 178), (177, 141, 169), (171, 129, 156), (164, 116, 145), + (156, 103, 130), (146, 91, 118), (138, 79, 104), (131, 74, 96), + (124, 76, 95), (120, 81, 99), (123, 90, 105), (130, 99, 114), + (142, 113, 124), (151, 127, 135), (163, 136, 141), (174, 142, 144), + (179, 149, 144), (181, 151, 144), (180, 152, 144), (174, 147, 141), + (173, 144, 140), (169, 144, 142), (167, 141, 142), (168, 134, 141), + (168, 130, 134), (167, 124, 128), (164, 117, 117), (153, 102, 104), + (143, 88, 90), (132, 77, 79), (120, 68, 69), (108, 59, 63), + (100, 53, 60), (98, 52, 60), (100, 53, 63), (105, 56, 69), + (113, 65, 80), (122, 75, 91), (131, 85, 101), (136, 94, 111), + (141, 102, 121), (145, 111, 129), (150, 118, 137), (155, 120, 144), + (162, 130, 154), (169, 138, 163), (176, 143, 169), (175, 144, 173), + (179, 146, 178), (175, 146, 175), (170, 143, 168), (162, 133, 158), + (155, 125, 149), (149, 119, 142), (147, 112, 133), (137, 101, 123) + ), + +// 391 040221-34 +((158, 126, 83), (176, 149, 109), (171, 152, 120), (167, 155, 132), + (181, 169, 150), (195, 183, 168), (205, 194, 180), (216, 206, 193), + (244, 240, 234), (248, 246, 242), (252, 252, 251), (251, 247, 242), + (251, 243, 234), (245, 229, 216), (239, 215, 199), (232, 206, 189), + (226, 197, 180), (181, 157, 152), (155, 137, 137), (130, 118, 123), + (113, 101, 112), (96, 85, 101), (91, 80, 97), (86, 75, 94), + (96, 77, 87), (112, 80, 87), (128, 84, 87), (144, 84, 80), + (161, 84, 73), (167, 84, 68), (173, 84, 64), (177, 81, 61), + (168, 79, 59), (144, 65, 48), (129, 58, 46), (114, 52, 45), + (112, 58, 48), (111, 65, 52), (117, 74, 56), (124, 83, 60), + (156, 127, 100), (176, 147, 123), (196, 168, 146), (214, 187, 163), + (233, 207, 180), (238, 213, 184), (243, 220, 188), (244, 220, 187), + (238, 209, 184), (227, 172, 162), (229, 165, 145), (231, 159, 128), + (225, 153, 113), (219, 147, 99), (217, 142, 96), (216, 137, 93), + (219, 136, 88), (211, 137, 84), (204, 138, 80), (193, 129, 72), + (183, 120, 65), (177, 113, 60), (172, 107, 55), (161, 94, 50), + (149, 76, 40), (135, 55, 28), (140, 62, 32), (145, 69, 36), + (150, 76, 41), (155, 83, 47), (169, 100, 60), (179, 116, 83), + (197, 154, 130), (207, 169, 139), (218, 185, 149), (213, 183, 149), + (208, 182, 149), (199, 174, 146), (190, 167, 144), (164, 153, 147), + (141, 138, 139), (98, 107, 116), (86, 87, 97), (74, 68, 79), + (68, 63, 75), (63, 58, 72), (59, 54, 69), (55, 52, 71), + (83, 43, 52), (98, 43, 43), (113, 44, 34), (115, 43, 32), + (118, 43, 31), (117, 46, 28), (115, 52, 31), (113, 65, 42), + (100, 76, 50), (73, 75, 66), (61, 77, 77), (50, 79, 89), + (42, 84, 95), (35, 89, 101), (21, 88, 111), (11, 81, 117), + (7, 56, 115), (12, 53, 106), (17, 51, 98), (23, 47, 91), + (29, 44, 85), (40, 41, 74), (46, 37, 64), (54, 34, 53), + (57, 35, 43), (83, 32, 26), (88, 34, 26), (94, 36, 26), + (108, 40, 31), (116, 54, 42), (125, 69, 51), (137, 81, 58), + (155, 89, 59), (152, 88, 60), (149, 87, 61), (142, 85, 61), + (136, 84, 62), (118, 79, 57), (104, 70, 48), (94, 60, 43), + (88, 52, 40), (93, 63, 50), (97, 70, 57), (102, 78, 65), + (115, 99, 85), (138, 120, 108), (161, 141, 132), (186, 165, 150), + (216, 188, 162), (211, 182, 159), (207, 177, 157), (199, 170, 154), + (191, 164, 151), (178, 144, 133), (167, 123, 110), (156, 103, 87), + (144, 85, 65), (120, 61, 52), (121, 61, 51), (122, 61, 51), + (135, 73, 53), (149, 88, 55), (161, 101, 62), (171, 114, 71), + (197, 143, 88), (205, 151, 91), (213, 160, 95), (225, 173, 102), + (231, 182, 107), (231, 184, 112), (231, 186, 115), (232, 187, 119), + (233, 189, 123), (236, 193, 130), (236, 196, 135), (237, 199, 141), + (238, 206, 156), (240, 214, 172), (242, 220, 187), (245, 224, 195), + (249, 237, 221), (249, 240, 228), (250, 244, 236), (251, 250, 248), + (253, 253, 253), (254, 254, 254), (255, 255, 255), (255, 255, 255), + (254, 255, 255), (254, 255, 255), (254, 255, 255), (254, 255, 255), + (255, 255, 255), (254, 255, 255), (254, 255, 255), (254, 255, 255), + (254, 254, 254), (253, 253, 253), (252, 252, 252), (249, 247, 246), + (244, 237, 230), (234, 220, 212), (219, 200, 189), (199, 178, 166), + (171, 153, 146), (145, 133, 121), (120, 113, 99), (98, 101, 80), + (78, 91, 61), (59, 85, 54), (49, 75, 46), (45, 69, 45), + (53, 73, 47), (69, 82, 48), (92, 106, 56), (116, 119, 63), + (140, 129, 71), (161, 134, 79), (179, 135, 81), (197, 148, 86), + (210, 160, 93), (221, 173, 102), (227, 182, 109), (227, 184, 113), + (228, 186, 114), (228, 185, 115), (229, 185, 116), (230, 186, 118), + (233, 188, 116), (234, 189, 113), (238, 189, 106), (238, 188, 102), + (237, 187, 102), (238, 186, 102), (232, 180, 102), (226, 171, 92), + (212, 155, 83), (195, 138, 73), (181, 123, 69), (165, 108, 67), + (150, 96, 63), (133, 80, 54), (115, 64, 45), (97, 51, 39), + (81, 44, 40), (67, 41, 47), (54, 39, 51), (46, 38, 52), + (39, 32, 47), (32, 30, 43), (35, 29, 43), (33, 26, 43), + (29, 28, 43), (24, 22, 38), (17, 22, 36), (20, 28, 37), + (30, 33, 36), (40, 43, 42), (54, 52, 45), (67, 65, 57), + (85, 85, 71), (106, 103, 79), (126, 121, 89), (149, 131, 94), + (170, 141, 97), (166, 134, 92), (163, 129, 85), (159, 128, 81) + ), + +// 392 040221-35 +((186, 160, 182), (190, 133, 166), (189, 121, 158), (188, 110, 151), + (194, 104, 151), (201, 99, 152), (202, 102, 153), (204, 105, 155), + (202, 133, 169), (208, 148, 180), (214, 164, 192), (210, 174, 194), + (207, 185, 196), (200, 193, 196), (193, 202, 196), (195, 205, 199), + (198, 209, 203), (198, 206, 203), (191, 198, 195), (185, 190, 188), + (187, 189, 190), (189, 189, 192), (193, 187, 194), (197, 186, 197), + (211, 197, 209), (217, 205, 216), (224, 214, 224), (224, 212, 223), + (224, 210, 222), (220, 208, 218), (217, 207, 215), (206, 203, 207), + (194, 198, 198), (165, 168, 168), (150, 156, 154), (135, 144, 140), + (128, 139, 134), (122, 135, 128), (122, 134, 127), (122, 134, 127), + (129, 137, 137), (127, 143, 143), (125, 150, 150), (120, 147, 152), + (116, 144, 155), (112, 139, 153), (108, 134, 151), (96, 118, 144), + (84, 102, 131), (70, 71, 109), (68, 57, 99), (67, 44, 90), + (69, 34, 80), (72, 25, 70), (75, 27, 70), (78, 29, 71), + (96, 55, 86), (102, 67, 97), (108, 80, 108), (105, 94, 117), + (102, 108, 127), (100, 112, 129), (99, 116, 131), (94, 116, 131), + (85, 111, 128), (79, 92, 115), (86, 78, 105), (93, 64, 96), + (93, 57, 91), (94, 50, 87), (90, 40, 80), (88, 40, 80), + (93, 56, 94), (94, 60, 96), (96, 64, 98), (88, 74, 96), + (80, 84, 95), (75, 91, 99), (70, 98, 104), (62, 105, 113), + (58, 108, 117), (56, 107, 110), (59, 101, 111), (62, 96, 112), + (63, 90, 113), (64, 85, 115), (63, 73, 117), (59, 65, 113), + (50, 50, 92), (47, 40, 82), (45, 30, 73), (44, 26, 70), + (44, 23, 67), (44, 18, 68), (42, 15, 66), (44, 18, 67), + (49, 26, 76), (75, 49, 102), (91, 56, 119), (108, 63, 137), + (114, 69, 144), (120, 75, 151), (131, 91, 158), (137, 108, 163), + (152, 130, 175), (155, 134, 176), (158, 139, 178), (156, 138, 176), + (155, 137, 175), (154, 128, 168), (154, 122, 162), (154, 115, 155), + (156, 106, 147), (147, 76, 137), (144, 70, 135), (141, 64, 134), + (139, 55, 133), (139, 54, 131), (139, 61, 129), (135, 62, 127), + (128, 67, 127), (129, 73, 130), (131, 80, 133), (131, 84, 133), + (132, 88, 133), (131, 98, 131), (128, 101, 126), (127, 101, 122), + (124, 93, 115), (110, 70, 101), (104, 64, 94), (98, 58, 88), + (86, 51, 78), (71, 41, 64), (61, 29, 55), (54, 19, 47), + (56, 6, 36), (56, 12, 37), (57, 19, 39), (58, 25, 43), + (60, 32, 48), (63, 42, 54), (77, 55, 68), (93, 62, 81), + (103, 76, 96), (117, 107, 118), (120, 115, 123), (123, 123, 129), + (130, 132, 136), (138, 138, 143), (144, 145, 150), (148, 148, 153), + (153, 155, 159), (154, 156, 159), (155, 157, 160), (154, 157, 162), + (152, 156, 161), (147, 154, 160), (140, 152, 161), (134, 149, 160), + (129, 147, 159), (129, 141, 153), (129, 138, 151), (130, 136, 150), + (134, 126, 149), (135, 116, 147), (138, 101, 137), (142, 85, 126), + (150, 65, 110), (151, 65, 111), (153, 66, 113), (155, 65, 114), + (150, 60, 108), (141, 49, 98), (122, 46, 89), (108, 51, 83), + (96, 63, 82), (83, 73, 78), (74, 70, 68), (57, 65, 59), + (45, 62, 50), (40, 64, 49), (44, 75, 56), (57, 85, 64), + (89, 111, 94), (101, 120, 105), (113, 130, 117), (138, 152, 144), + (162, 170, 167), (180, 184, 184), (189, 191, 192), (194, 196, 200), + (192, 198, 204), (185, 197, 204), (172, 190, 201), (153, 177, 191), + (136, 163, 182), (118, 152, 174), (104, 144, 168), (94, 140, 165), + (84, 138, 163), (81, 135, 162), (81, 136, 164), (81, 137, 165), + (81, 135, 165), (78, 131, 159), (75, 116, 151), (75, 100, 143), + (76, 87, 136), (75, 76, 133), (71, 77, 128), (68, 75, 126), + (68, 72, 128), (78, 76, 131), (94, 82, 140), (109, 101, 148), + (122, 122, 157), (136, 142, 174), (153, 167, 189), (175, 186, 205), + (195, 202, 218), (206, 216, 221), (209, 217, 220), (203, 215, 212), + (192, 205, 200), (178, 185, 184), (157, 167, 167), (132, 142, 145), + (107, 118, 119), (84, 98, 99), (67, 70, 79), (57, 50, 73), + (53, 37, 75), (57, 32, 77), (67, 39, 84), (76, 49, 88), + (81, 58, 99), (86, 71, 113), (88, 81, 128), (91, 92, 139), + (88, 99, 145), (81, 104, 145), (77, 111, 145), (74, 113, 144), + (77, 119, 142), (82, 118, 145), (90, 123, 148), (101, 132, 156), + (119, 142, 163), (139, 160, 172), (157, 172, 181), (169, 179, 185), + (173, 181, 186), (173, 178, 182), (174, 175, 182), (179, 170, 184) + ), + +// 393 040221-36 +((8, 4, 11), (9, 4, 13), (9, 4, 14), (10, 5, 15), + (11, 6, 18), (12, 7, 21), (14, 8, 24), (16, 10, 27), + (29, 23, 47), (37, 28, 55), (45, 33, 64), (48, 35, 66), + (52, 37, 69), (52, 36, 68), (52, 36, 68), (51, 36, 68), + (51, 36, 68), (49, 38, 71), (49, 37, 70), (50, 36, 69), + (47, 33, 63), (44, 31, 57), (41, 28, 51), (38, 26, 46), + (23, 13, 26), (16, 9, 20), (9, 5, 15), (8, 5, 15), + (8, 5, 15), (10, 7, 17), (13, 9, 20), (20, 16, 29), + (29, 23, 39), (50, 41, 63), (60, 48, 73), (70, 56, 83), + (77, 62, 90), (85, 68, 98), (87, 71, 101), (90, 74, 105), + (96, 79, 112), (95, 79, 113), (95, 79, 114), (92, 76, 109), + (90, 73, 105), (87, 70, 101), (84, 67, 97), (76, 62, 87), + (67, 55, 76), (47, 39, 53), (36, 30, 42), (26, 22, 32), + (18, 15, 24), (11, 8, 16), (8, 6, 13), (6, 4, 10), + (2, 0, 4), (1, 0, 3), (0, 0, 2), (0, 0, 2), + (0, 0, 2), (0, 0, 2), (0, 0, 2), (0, 0, 2), + (0, 0, 2), (0, 0, 2), (0, 0, 2), (0, 0, 2), + (0, 0, 2), (0, 0, 3), (0, 0, 3), (1, 0, 4), + (4, 2, 11), (8, 5, 18), (12, 9, 26), (20, 16, 37), + (29, 24, 48), (34, 28, 53), (40, 33, 59), (50, 41, 70), + (58, 48, 76), (69, 57, 87), (70, 57, 89), (71, 58, 91), + (71, 57, 92), (71, 57, 93), (73, 58, 92), (74, 58, 92), + (73, 57, 87), (70, 54, 80), (67, 51, 73), (64, 48, 70), + (61, 46, 67), (54, 41, 62), (51, 36, 59), (50, 35, 60), + (49, 35, 62), (55, 40, 73), (61, 44, 78), (68, 48, 84), + (71, 50, 87), (75, 53, 90), (85, 57, 95), (93, 64, 105), + (106, 78, 126), (110, 83, 135), (114, 89, 145), (115, 90, 147), + (116, 92, 150), (115, 92, 152), (115, 90, 149), (114, 88, 145), + (111, 84, 139), (99, 74, 124), (94, 71, 120), (90, 69, 117), + (81, 64, 111), (71, 57, 105), (62, 51, 97), (54, 45, 89), + (46, 36, 73), (47, 34, 68), (48, 32, 63), (50, 33, 62), + (53, 34, 62), (61, 38, 62), (68, 42, 64), (75, 48, 69), + (83, 55, 75), (100, 70, 87), (105, 73, 90), (110, 76, 94), + (121, 84, 102), (133, 92, 111), (144, 100, 118), (154, 108, 127), + (165, 119, 145), (163, 120, 149), (161, 122, 153), (159, 121, 154), + (158, 121, 155), (156, 120, 157), (152, 116, 155), (148, 112, 151), + (142, 105, 146), (123, 93, 135), (116, 88, 131), (110, 84, 127), + (98, 76, 119), (88, 68, 111), (77, 62, 102), (70, 55, 93), + (57, 41, 73), (54, 38, 68), (51, 36, 64), (45, 31, 57), + (41, 28, 51), (42, 27, 47), (47, 30, 47), (53, 35, 50), + (60, 37, 52), (70, 41, 55), (70, 41, 56), (71, 41, 57), + (69, 40, 56), (67, 39, 55), (66, 38, 54), (68, 40, 55), + (71, 42, 55), (71, 41, 54), (71, 41, 53), (68, 38, 50), + (59, 33, 44), (48, 25, 36), (35, 17, 28), (24, 11, 20), + (16, 6, 14), (9, 3, 9), (5, 1, 6), (3, 0, 5), + (2, 0, 4), (2, 0, 4), (1, 0, 4), (1, 0, 4), + (1, 0, 3), (1, 0, 3), (1, 0, 3), (1, 0, 2), + (1, 0, 2), (1, 0, 2), (1, 0, 3), (1, 0, 3), + (1, 0, 5), (1, 0, 6), (2, 0, 8), (3, 0, 9), + (4, 1, 10), (5, 1, 11), (6, 1, 12), (7, 1, 12), + (7, 1, 12), (7, 1, 13), (7, 1, 14), (8, 1, 15), + (8, 1, 15), (8, 1, 16), (8, 1, 16), (8, 1, 15), + (8, 1, 14), (8, 1, 13), (7, 2, 13), (7, 2, 13), + (9, 4, 17), (11, 6, 22), (15, 12, 31), (23, 18, 42), + (33, 26, 53), (44, 35, 63), (55, 44, 73), (66, 52, 81), + (77, 62, 89), (87, 69, 97), (96, 77, 107), (106, 86, 117), + (117, 94, 130), (127, 103, 141), (137, 112, 151), (147, 118, 157), + (155, 125, 161), (162, 128, 162), (166, 131, 161), (169, 133, 159), + (170, 132, 158), (168, 130, 159), (163, 128, 159), (157, 123, 157), + (149, 118, 152), (140, 110, 145), (129, 102, 135), (119, 93, 123), + (110, 85, 111), (100, 77, 99), (91, 69, 91), (81, 61, 83), + (70, 53, 75), (59, 45, 67), (48, 37, 60), (40, 31, 53), + (32, 25, 43), (24, 18, 33), (19, 13, 25), (15, 9, 19), + (12, 7, 15), (10, 5, 12), (6, 1, 9), (8, 3, 11) + ), + +// 394 040221-37 +((128, 92, 57), (118, 83, 51), (108, 76, 46), (98, 69, 41), + (81, 56, 36), (64, 43, 32), (59, 39, 32), (55, 35, 32), + (45, 32, 32), (42, 32, 32), (40, 32, 32), (39, 32, 32), + (39, 32, 32), (38, 32, 32), (37, 32, 32), (37, 32, 32), + (38, 32, 32), (39, 32, 32), (40, 32, 32), (41, 32, 32), + (41, 32, 32), (41, 32, 32), (40, 32, 32), (40, 32, 32), + (38, 32, 32), (35, 32, 32), (33, 32, 32), (32, 32, 32), + (32, 32, 32), (32, 32, 32), (32, 32, 32), (32, 32, 32), + (32, 32, 32), (32, 32, 32), (33, 32, 32), (35, 32, 32), + (39, 32, 32), (44, 32, 32), (47, 33, 32), (50, 34, 33), + (63, 44, 41), (72, 51, 43), (82, 58, 46), (91, 65, 48), + (101, 73, 50), (105, 76, 51), (109, 80, 53), (113, 82, 56), + (115, 83, 57), (113, 82, 56), (110, 79, 54), (107, 76, 52), + (103, 73, 51), (99, 71, 50), (95, 69, 48), (92, 67, 47), + (77, 58, 41), (72, 54, 39), (68, 50, 37), (66, 47, 35), + (65, 45, 34), (66, 45, 34), (67, 45, 35), (68, 46, 35), + (70, 47, 37), (80, 55, 41), (84, 57, 43), (89, 59, 45), + (91, 60, 45), (94, 62, 46), (98, 63, 49), (100, 64, 50), + (106, 69, 50), (110, 72, 50), (115, 75, 50), (119, 80, 52), + (124, 85, 55), (124, 86, 57), (125, 87, 59), (127, 89, 62), + (127, 92, 64), (127, 93, 65), (124, 92, 63), (122, 92, 62), + (119, 90, 62), (117, 89, 62), (110, 85, 61), (99, 79, 61), + (81, 64, 58), (71, 57, 53), (62, 50, 49), (57, 46, 45), + (53, 43, 41), (45, 37, 35), (35, 32, 32), (32, 32, 32), + (32, 32, 32), (32, 32, 32), (32, 32, 32), (32, 32, 32), + (32, 32, 32), (32, 32, 32), (32, 32, 32), (32, 32, 32), + (32, 32, 32), (32, 32, 32), (32, 32, 32), (32, 32, 32), + (32, 32, 32), (34, 32, 32), (37, 32, 32), (39, 32, 32), + (43, 32, 32), (47, 32, 32), (48, 33, 32), (50, 34, 32), + (55, 37, 32), (59, 41, 34), (68, 50, 39), (79, 57, 46), + (101, 76, 63), (114, 88, 74), (128, 101, 85), (132, 105, 88), + (137, 110, 92), (142, 117, 100), (148, 122, 107), (152, 125, 110), + (153, 125, 111), (154, 128, 115), (154, 127, 113), (154, 127, 112), + (149, 122, 109), (143, 117, 105), (135, 110, 98), (125, 100, 88), + (104, 80, 68), (96, 71, 59), (89, 63, 50), (86, 60, 46), + (83, 58, 43), (79, 53, 39), (77, 52, 37), (77, 53, 35), + (76, 53, 34), (71, 50, 32), (69, 48, 32), (68, 47, 32), + (65, 45, 32), (63, 44, 32), (63, 46, 32), (64, 49, 32), + (73, 55, 38), (74, 56, 39), (76, 58, 40), (80, 62, 44), + (82, 64, 49), (86, 68, 53), (89, 71, 58), (94, 76, 64), + (98, 79, 70), (107, 88, 79), (109, 88, 79), (111, 89, 80), + (112, 89, 80), (115, 89, 80), (115, 91, 79), (112, 87, 80), + (105, 82, 81), (103, 80, 81), (101, 79, 81), (103, 80, 82), + (109, 85, 86), (122, 97, 93), (137, 111, 104), (153, 127, 112), + (164, 136, 118), (172, 142, 124), (175, 145, 125), (175, 145, 127), + (177, 147, 131), (179, 151, 140), (188, 160, 147), (189, 160, 145), + (181, 151, 130), (173, 143, 121), (165, 135, 113), (146, 117, 95), + (124, 99, 83), (109, 87, 77), (93, 74, 69), (86, 65, 63), + (79, 59, 53), (74, 53, 45), (71, 51, 37), (73, 52, 33), + (75, 55, 32), (80, 58, 34), (87, 63, 39), (92, 68, 44), + (98, 71, 49), (103, 76, 55), (110, 83, 61), (118, 91, 65), + (129, 98, 67), (140, 106, 71), (151, 113, 75), (161, 122, 81), + (169, 130, 88), (176, 137, 98), (181, 143, 104), (187, 148, 107), + (189, 153, 110), (189, 152, 109), (189, 151, 109), (188, 149, 109), + (185, 148, 110), (181, 145, 110), (177, 141, 109), (171, 137, 107), + (160, 128, 104), (151, 118, 98), (140, 109, 92), (130, 100, 87), + (122, 92, 80), (115, 85, 74), (109, 79, 69), (103, 71, 64), + (95, 65, 61), (89, 61, 57), (85, 57, 55), (82, 56, 53), + (82, 56, 52), (82, 57, 52), (82, 58, 51), (83, 59, 55), + (85, 62, 58), (86, 65, 61), (88, 68, 62), (92, 69, 59), + (94, 73, 59), (97, 74, 57), (98, 75, 55), (101, 76, 55), + (105, 80, 56), (110, 83, 58), (117, 87, 59), (124, 93, 62), + (139, 103, 69), (143, 106, 69), (141, 103, 65), (139, 99, 63), + (133, 97, 62), (130, 94, 61), (121, 87, 53), (125, 91, 57) + ), + +// 395 040221-38 +((197, 85, 22), (191, 80, 20), (192, 79, 19), (193, 78, 18), + (197, 80, 19), (201, 83, 20), (202, 84, 22), (204, 86, 25), + (204, 100, 41), (208, 111, 52), (213, 123, 64), (219, 135, 78), + (225, 148, 92), (230, 162, 106), (236, 177, 120), (238, 182, 125), + (241, 187, 131), (246, 202, 145), (245, 203, 146), (245, 204, 148), + (237, 200, 145), (230, 196, 143), (225, 191, 140), (221, 187, 137), + (204, 167, 117), (196, 158, 109), (189, 150, 101), (177, 141, 95), + (166, 132, 89), (160, 127, 86), (155, 123, 83), (145, 115, 77), + (137, 109, 74), (130, 104, 70), (128, 100, 67), (126, 97, 64), + (124, 91, 58), (123, 86, 53), (122, 83, 50), (122, 81, 48), + (117, 77, 45), (116, 76, 44), (115, 76, 43), (118, 73, 39), + (121, 70, 35), (123, 69, 33), (125, 69, 31), (126, 67, 30), + (123, 66, 30), (111, 67, 34), (107, 65, 33), (104, 63, 32), + (102, 61, 30), (101, 59, 28), (99, 58, 28), (98, 58, 29), + (86, 58, 33), (81, 58, 35), (76, 59, 38), (78, 60, 38), + (81, 62, 39), (83, 63, 39), (85, 64, 40), (90, 66, 40), + (95, 68, 40), (107, 70, 40), (113, 71, 39), (120, 72, 39), + (122, 73, 38), (125, 74, 38), (131, 75, 36), (135, 75, 35), + (145, 75, 33), (148, 76, 34), (152, 78, 35), (155, 80, 36), + (159, 83, 37), (160, 84, 37), (161, 85, 38), (164, 86, 37), + (164, 85, 37), (161, 84, 37), (158, 82, 36), (156, 80, 35), + (155, 78, 33), (154, 77, 32), (152, 73, 29), (150, 70, 27), + (149, 65, 22), (150, 66, 22), (152, 67, 23), (154, 70, 25), + (156, 73, 28), (161, 81, 35), (165, 91, 45), (170, 99, 53), + (173, 104, 58), (182, 112, 62), (184, 115, 64), (187, 119, 66), + (188, 120, 67), (189, 122, 69), (187, 123, 72), (185, 121, 71), + (183, 119, 68), (186, 121, 70), (189, 124, 73), (191, 128, 77), + (194, 132, 82), (199, 138, 89), (201, 144, 95), (202, 149, 101), + (200, 149, 101), (196, 145, 99), (195, 143, 97), (195, 142, 96), + (189, 136, 92), (179, 130, 88), (166, 120, 80), (150, 106, 69), + (122, 80, 47), (111, 72, 41), (100, 64, 36), (95, 62, 35), + (91, 61, 35), (83, 59, 36), (76, 57, 36), (77, 56, 34), + (83, 54, 30), (98, 53, 24), (103, 53, 23), (108, 54, 22), + (115, 56, 22), (126, 58, 21), (140, 60, 18), (151, 61, 16), + (167, 60, 8), (170, 60, 7), (173, 60, 7), (176, 62, 7), + (179, 64, 7), (186, 67, 9), (189, 71, 11), (193, 76, 14), + (194, 79, 17), (197, 84, 22), (199, 85, 23), (201, 87, 24), + (204, 87, 25), (205, 88, 26), (203, 89, 26), (201, 88, 26), + (192, 84, 26), (189, 81, 25), (187, 79, 24), (179, 74, 23), + (170, 71, 23), (163, 72, 25), (156, 74, 29), (151, 78, 36), + (150, 84, 42), (150, 94, 54), (151, 97, 58), (152, 101, 62), + (153, 108, 69), (155, 115, 75), (161, 123, 83), (167, 131, 89), + (188, 149, 100), (193, 153, 102), (198, 157, 104), (206, 162, 106), + (213, 169, 109), (218, 174, 111), (221, 178, 117), (225, 184, 121), + (230, 189, 124), (231, 188, 124), (229, 186, 121), (226, 180, 114), + (219, 171, 108), (212, 163, 104), (204, 158, 102), (197, 150, 100), + (180, 135, 89), (177, 130, 84), (174, 126, 79), (172, 115, 68), + (172, 108, 59), (176, 104, 52), (177, 103, 51), (177, 104, 52), + (175, 108, 55), (178, 111, 58), (183, 115, 61), (192, 121, 64), + (200, 127, 68), (205, 130, 73), (203, 132, 75), (199, 131, 76), + (196, 129, 76), (194, 127, 74), (195, 127, 73), (196, 124, 70), + (194, 119, 67), (190, 113, 62), (186, 106, 56), (180, 99, 49), + (174, 96, 46), (168, 94, 45), (163, 94, 47), (160, 94, 49), + (158, 95, 51), (159, 95, 51), (158, 94, 50), (159, 94, 49), + (158, 92, 48), (156, 90, 47), (155, 89, 46), (157, 90, 46), + (156, 90, 45), (156, 89, 44), (156, 88, 43), (152, 87, 44), + (147, 86, 45), (142, 87, 48), (135, 88, 52), (130, 90, 55), + (125, 92, 58), (122, 93, 61), (119, 93, 61), (120, 94, 62), + (123, 93, 60), (130, 94, 58), (139, 97, 57), (149, 101, 55), + (158, 104, 55), (165, 111, 60), (172, 118, 66), (181, 126, 74), + (190, 135, 81), (201, 142, 84), (209, 143, 84), (211, 143, 81), + (210, 140, 79), (207, 137, 77), (203, 133, 78), (202, 133, 77), + (203, 129, 74), (201, 123, 67), (197, 115, 59), (194, 106, 48), + (192, 97, 39), (193, 92, 31), (196, 89, 26), (198, 86, 22) + ), + +// 396 040221-39 +((44, 41, 38), (39, 39, 48), (36, 45, 59), (33, 51, 71), + (37, 59, 87), (41, 68, 104), (44, 74, 112), (47, 81, 120), + (52, 102, 154), (46, 104, 165), (41, 106, 176), (33, 99, 175), + (25, 93, 175), (24, 86, 164), (24, 80, 153), (25, 77, 146), + (27, 75, 140), (40, 70, 124), (44, 66, 114), (49, 63, 105), + (57, 61, 94), (65, 59, 83), (70, 60, 78), (76, 62, 74), + (109, 83, 79), (129, 99, 88), (149, 115, 97), (164, 134, 111), + (180, 153, 126), (185, 161, 133), (190, 170, 140), (199, 186, 153), + (209, 199, 168), (229, 219, 184), (234, 225, 188), (240, 231, 192), + (239, 230, 189), (239, 230, 186), (238, 228, 183), (238, 227, 180), + (232, 217, 161), (223, 205, 152), (214, 193, 143), (199, 177, 132), + (185, 162, 122), (177, 153, 115), (170, 145, 109), (157, 129, 95), + (150, 116, 78), (142, 99, 55), (146, 100, 54), (150, 101, 54), + (150, 104, 64), (151, 108, 74), (153, 110, 77), (156, 113, 80), + (158, 127, 96), (160, 135, 105), (163, 143, 114), (165, 152, 126), + (168, 162, 139), (170, 166, 144), (172, 170, 150), (172, 177, 164), + (173, 182, 170), (166, 179, 174), (157, 169, 167), (149, 159, 161), + (142, 152, 154), (136, 145, 148), (127, 132, 138), (124, 121, 123), + (117, 107, 98), (109, 101, 89), (102, 95, 80), (92, 88, 73), + (83, 82, 67), (79, 79, 68), (75, 77, 70), (63, 74, 79), + (59, 76, 89), (51, 94, 116), (51, 103, 122), (51, 113, 129), + (53, 117, 130), (56, 122, 132), (56, 126, 139), (60, 130, 141), + (62, 138, 151), (65, 142, 153), (69, 146, 156), (75, 148, 152), + (81, 150, 149), (93, 153, 146), (106, 155, 139), (113, 152, 129), + (122, 153, 124), (135, 154, 128), (144, 156, 131), (153, 158, 135), + (159, 161, 137), (165, 164, 140), (174, 167, 142), (184, 171, 143), + (188, 171, 141), (179, 162, 134), (171, 153, 128), (164, 146, 124), + (158, 139, 121), (140, 123, 115), (129, 113, 111), (123, 106, 105), + (123, 107, 105), (126, 109, 104), (127, 110, 104), (129, 111, 105), + (126, 108, 107), (122, 107, 114), (118, 108, 117), (120, 118, 125), + (144, 148, 140), (161, 165, 148), (179, 182, 157), (185, 187, 161), + (191, 192, 165), (195, 195, 170), (189, 201, 176), (181, 204, 177), + (174, 206, 175), (163, 199, 165), (163, 195, 161), (163, 192, 158), + (166, 181, 151), (163, 172, 146), (153, 159, 137), (140, 148, 127), + (109, 114, 99), (99, 96, 83), (89, 79, 68), (87, 72, 62), + (85, 66, 57), (82, 54, 49), (81, 48, 44), (80, 43, 42), + (77, 40, 39), (69, 33, 35), (65, 33, 35), (62, 34, 35), + (55, 37, 42), (52, 43, 53), (52, 48, 63), (54, 58, 73), + (72, 75, 91), (77, 81, 94), (83, 87, 97), (94, 101, 105), + (103, 114, 116), (116, 124, 123), (128, 137, 128), (138, 145, 131), + (155, 150, 131), (177, 153, 115), (178, 152, 112), (179, 151, 110), + (189, 154, 105), (203, 158, 95), (211, 159, 85), (217, 156, 77), + (233, 154, 51), (225, 145, 48), (218, 136, 45), (200, 124, 41), + (183, 111, 35), (162, 101, 29), (142, 92, 28), (135, 94, 27), + (133, 99, 23), (123, 92, 23), (105, 85, 27), (88, 73, 28), + (69, 62, 26), (51, 51, 26), (34, 44, 29), (25, 43, 32), + (32, 51, 43), (36, 53, 46), (41, 56, 50), (53, 61, 56), + (67, 64, 60), (78, 69, 63), (87, 74, 69), (100, 82, 75), + (114, 93, 85), (128, 106, 97), (143, 123, 112), (159, 138, 126), + (171, 155, 139), (175, 170, 153), (174, 182, 166), (173, 191, 174), + (174, 198, 180), (175, 207, 187), (182, 213, 193), (191, 219, 198), + (199, 226, 204), (198, 231, 215), (193, 235, 220), (183, 235, 225), + (171, 234, 227), (160, 227, 228), (158, 223, 229), (158, 221, 227), + (153, 219, 231), (145, 216, 233), (132, 204, 235), (115, 191, 226), + (93, 167, 210), (76, 146, 195), (63, 127, 176), (53, 112, 156), + (45, 101, 138), (39, 89, 127), (33, 77, 114), (26, 60, 95), + (21, 43, 78), (23, 28, 61), (29, 19, 44), (37, 17, 32), + (45, 21, 28), (55, 27, 30), (62, 33, 33), (68, 39, 38), + (72, 47, 47), (76, 57, 56), (86, 67, 65), (98, 79, 76), + (113, 94, 88), (128, 112, 103), (146, 128, 117), (160, 144, 132), + (166, 159, 144), (174, 169, 151), (179, 174, 157), (180, 174, 156), + (178, 172, 153), (174, 167, 147), (170, 159, 141), (160, 150, 133), + (148, 140, 123), (134, 128, 112), (118, 112, 99), (103, 94, 82), + (85, 79, 68), (69, 65, 56), (58, 53, 48), (51, 45, 41) + ), + +// 397 040221-40 +((111, 54, 43), (93, 45, 37), (95, 49, 39), (98, 53, 42), + (103, 60, 54), (108, 68, 66), (103, 69, 69), (98, 70, 73), + (80, 78, 86), (75, 78, 87), (70, 78, 88), (52, 70, 82), + (35, 62, 77), (24, 50, 67), (14, 38, 58), (14, 32, 52), + (15, 27, 47), (20, 18, 24), (24, 14, 19), (28, 11, 15), + (31, 7, 15), (34, 3, 16), (35, 5, 18), (37, 8, 20), + (45, 33, 47), (53, 46, 65), (62, 59, 84), (66, 69, 96), + (71, 80, 108), (70, 84, 113), (70, 89, 119), (76, 91, 123), + (79, 91, 122), (81, 75, 94), (70, 62, 79), (59, 49, 64), + (48, 35, 49), (38, 21, 34), (34, 17, 30), (30, 14, 26), + (17, 14, 26), (12, 12, 25), (8, 11, 25), (5, 12, 25), + (3, 13, 26), (3, 13, 26), (3, 14, 26), (6, 14, 24), + (11, 12, 19), (23, 8, 10), (28, 8, 8), (34, 8, 6), + (40, 9, 6), (46, 11, 6), (49, 11, 6), (53, 12, 7), + (65, 15, 12), (70, 18, 15), (76, 21, 18), (81, 23, 21), + (86, 26, 24), (87, 26, 26), (89, 26, 28), (94, 23, 33), + (99, 30, 44), (115, 51, 71), (119, 58, 82), (124, 66, 94), + (121, 69, 98), (118, 73, 103), (105, 76, 112), (96, 82, 119), + (86, 94, 127), (74, 87, 116), (62, 81, 106), (51, 68, 89), + (41, 56, 72), (41, 53, 66), (41, 50, 61), (40, 44, 54), + (42, 36, 41), (50, 21, 19), (54, 19, 15), (58, 17, 12), + (59, 17, 12), (61, 18, 13), (64, 21, 15), (68, 27, 21), + (100, 54, 42), (120, 65, 51), (140, 77, 60), (142, 79, 61), + (145, 81, 63), (155, 84, 65), (160, 85, 63), (168, 85, 62), + (182, 83, 59), (183, 83, 60), (166, 76, 60), (150, 70, 61), + (144, 62, 57), (138, 54, 54), (127, 41, 44), (124, 39, 41), + (102, 42, 49), (85, 32, 43), (68, 22, 38), (61, 16, 30), + (55, 10, 22), (47, 4, 11), (38, 4, 5), (33, 5, 3), + (30, 5, 5), (35, 4, 10), (38, 5, 10), (42, 7, 10), + (49, 10, 11), (55, 10, 12), (62, 8, 13), (70, 8, 15), + (99, 18, 18), (118, 26, 21), (137, 35, 25), (145, 41, 29), + (153, 48, 34), (160, 59, 45), (168, 71, 54), (178, 77, 57), + (179, 81, 55), (160, 80, 57), (149, 78, 57), (139, 76, 57), + (120, 66, 54), (99, 53, 45), (73, 42, 35), (53, 28, 26), + (32, 9, 13), (33, 7, 11), (34, 5, 10), (35, 5, 10), + (37, 6, 10), (40, 6, 8), (44, 6, 6), (48, 6, 5), + (51, 6, 4), (50, 6, 4), (48, 6, 3), (46, 6, 3), + (40, 5, 3), (33, 4, 1), (25, 4, 1), (20, 2, 1), + (11, 1, 0), (9, 1, 0), (8, 1, 1), (6, 2, 2), + (5, 5, 9), (6, 11, 19), (7, 18, 29), (7, 21, 37), + (8, 21, 37), (6, 19, 33), (6, 20, 34), (6, 21, 36), + (5, 22, 38), (5, 20, 35), (3, 15, 26), (2, 8, 14), + (7, 1, 2), (9, 0, 1), (12, 0, 1), (18, 0, 0), + (24, 1, 0), (30, 1, 0), (34, 1, 0), (36, 0, 0), + (39, 1, 0), (40, 1, 0), (42, 1, 0), (43, 1, 0), + (44, 0, 0), (46, 0, 0), (46, 0, 0), (48, 1, 1), + (55, 4, 2), (57, 5, 3), (59, 7, 4), (64, 12, 8), + (68, 22, 21), (77, 36, 39), (86, 52, 59), (102, 71, 77), + (122, 85, 85), (137, 101, 96), (159, 116, 111), (170, 135, 137), + (184, 156, 163), (200, 172, 179), (210, 185, 188), (225, 189, 189), + (228, 193, 196), (224, 194, 202), (217, 191, 202), (207, 187, 196), + (194, 169, 174), (180, 154, 154), (164, 133, 134), (145, 111, 111), + (133, 97, 92), (115, 74, 66), (98, 58, 44), (81, 49, 32), + (66, 43, 31), (64, 50, 45), (66, 59, 62), (73, 68, 77), + (79, 82, 90), (86, 96, 107), (98, 110, 125), (110, 128, 148), + (126, 143, 170), (136, 160, 189), (149, 174, 202), (162, 183, 211), + (171, 193, 219), (187, 199, 221), (191, 205, 229), (198, 211, 232), + (205, 213, 234), (205, 215, 236), (205, 213, 231), (197, 206, 227), + (186, 198, 217), (173, 186, 206), (158, 170, 192), (141, 153, 176), + (125, 132, 158), (110, 112, 137), (98, 94, 117), (85, 78, 96), + (77, 62, 76), (74, 46, 57), (73, 32, 40), (78, 22, 27), + (79, 20, 19), (81, 20, 16), (83, 21, 14), (91, 23, 12), + (105, 29, 16), (116, 38, 22), (122, 49, 33), (117, 51, 39), + (110, 47, 36), (109, 48, 36), (110, 46, 32), (113, 53, 38) + ), + +// 398 040221-41 +((26, 82, 100), (26, 68, 89), (22, 64, 84), (19, 60, 80), + (15, 58, 74), (12, 57, 68), (10, 57, 65), (9, 57, 62), + (16, 67, 66), (18, 64, 61), (20, 62, 56), (19, 57, 49), + (18, 52, 43), (16, 50, 39), (15, 49, 36), (15, 49, 35), + (15, 49, 35), (17, 49, 37), (16, 44, 34), (16, 40, 31), + (14, 32, 27), (12, 25, 23), (11, 23, 21), (10, 22, 19), + (11, 25, 19), (17, 33, 26), (24, 42, 34), (30, 51, 43), + (37, 61, 52), (38, 64, 57), (39, 67, 63), (41, 72, 73), + (39, 76, 82), (36, 84, 100), (37, 89, 108), (39, 94, 116), + (39, 97, 121), (40, 100, 127), (39, 100, 129), (39, 101, 132), + (31, 93, 127), (23, 83, 120), (16, 74, 114), (11, 64, 102), + (7, 55, 90), (6, 51, 84), (5, 47, 79), (3, 41, 71), + (3, 36, 61), (4, 32, 47), (4, 30, 40), (4, 29, 34), + (4, 30, 29), (5, 31, 24), (4, 32, 23), (4, 34, 22), + (3, 42, 22), (5, 47, 28), (8, 52, 34), (11, 59, 44), + (14, 66, 54), (16, 70, 61), (18, 75, 68), (24, 85, 79), + (32, 97, 89), (46, 121, 105), (53, 126, 111), (60, 131, 117), + (62, 132, 120), (65, 133, 123), (66, 131, 130), (66, 129, 137), + (65, 128, 152), (63, 127, 154), (61, 127, 156), (60, 126, 155), + (60, 126, 155), (57, 124, 155), (55, 122, 155), (48, 116, 154), + (41, 110, 152), (26, 94, 138), (19, 84, 128), (12, 74, 118), + (10, 71, 114), (9, 68, 110), (7, 64, 106), (6, 61, 103), + (4, 60, 107), (3, 60, 106), (2, 61, 106), (2, 60, 104), + (2, 59, 102), (1, 54, 93), (1, 50, 84), (0, 44, 74), + (0, 41, 69), (1, 37, 67), (1, 37, 68), (1, 37, 69), + (1, 36, 68), (1, 35, 67), (1, 35, 65), (1, 33, 62), + (2, 33, 61), (7, 37, 64), (12, 41, 67), (16, 45, 70), + (20, 49, 74), (29, 57, 80), (37, 66, 86), (44, 75, 91), + (47, 82, 95), (48, 91, 103), (47, 91, 104), (47, 91, 105), + (46, 90, 107), (47, 89, 105), (48, 87, 100), (51, 84, 94), + (48, 73, 72), (41, 64, 61), (35, 56, 50), (31, 50, 45), + (27, 45, 41), (19, 35, 33), (12, 27, 29), (8, 21, 28), + (3, 17, 29), (1, 17, 35), (1, 18, 35), (1, 19, 36), + (1, 18, 37), (1, 17, 35), (1, 17, 34), (2, 16, 33), + (2, 17, 34), (2, 18, 35), (3, 19, 36), (2, 18, 35), + (2, 18, 34), (2, 16, 31), (2, 17, 29), (2, 17, 29), + (2, 20, 32), (4, 28, 46), (5, 31, 51), (6, 35, 56), + (8, 42, 66), (12, 48, 75), (15, 56, 80), (20, 64, 84), + (26, 77, 94), (26, 79, 96), (27, 81, 99), (27, 81, 101), + (27, 80, 101), (27, 77, 100), (24, 71, 93), (25, 67, 85), + (27, 63, 75), (25, 55, 56), (24, 53, 53), (23, 52, 51), + (22, 51, 47), (24, 51, 49), (25, 53, 52), (29, 58, 57), + (45, 73, 69), (49, 76, 72), (53, 79, 75), (58, 86, 80), + (60, 91, 83), (60, 94, 85), (59, 94, 85), (57, 92, 85), + (58, 94, 85), (59, 95, 85), (60, 91, 82), (61, 87, 78), + (58, 80, 72), (52, 73, 63), (44, 64, 53), (33, 55, 44), + (15, 48, 32), (11, 48, 31), (8, 49, 30), (5, 50, 30), + (6, 56, 35), (11, 66, 43), (18, 75, 50), (24, 84, 58), + (30, 93, 67), (34, 101, 74), (39, 111, 83), (45, 120, 93), + (48, 127, 104), (55, 137, 117), (61, 142, 128), (69, 146, 137), + (74, 149, 147), (77, 147, 152), (79, 146, 157), (80, 144, 160), + (79, 140, 162), (79, 138, 166), (80, 137, 170), (83, 139, 175), + (87, 143, 182), (90, 146, 185), (92, 149, 186), (94, 150, 185), + (93, 150, 182), (88, 148, 180), (84, 144, 178), (79, 141, 177), + (75, 137, 177), (71, 133, 173), (67, 128, 167), (64, 121, 157), + (61, 112, 144), (55, 104, 130), (48, 94, 117), (42, 84, 105), + (35, 75, 100), (27, 69, 98), (20, 66, 102), (16, 64, 104), + (15, 63, 106), (16, 63, 106), (17, 63, 105), (19, 64, 103), + (24, 66, 104), (28, 70, 107), (31, 76, 117), (34, 84, 129), + (36, 92, 142), (38, 99, 153), (39, 104, 163), (37, 107, 165), + (37, 107, 160), (35, 106, 152), (33, 105, 143), (32, 105, 136), + (32, 105, 129), (33, 107, 125), (35, 108, 129), (37, 109, 133), + (39, 110, 133), (36, 103, 123), (31, 97, 115), (26, 92, 109), + (24, 88, 103), (21, 86, 95), (20, 83, 92), (21, 80, 92) + ), + +// 399 040221-42 +((147, 160, 181), (166, 171, 186), (170, 173, 187), (174, 176, 188), + (174, 175, 186), (174, 174, 185), (174, 171, 182), (174, 168, 179), + (159, 157, 169), (144, 151, 167), (129, 145, 166), (115, 138, 165), + (101, 132, 164), (87, 126, 162), (74, 121, 160), (67, 118, 160), + (61, 116, 161), (49, 108, 164), (48, 108, 165), (48, 108, 166), + (54, 111, 166), (60, 115, 167), (67, 119, 169), (75, 123, 172), + (109, 143, 185), (123, 155, 193), (138, 168, 201), (156, 180, 206), + (175, 193, 212), (184, 197, 213), (193, 201, 214), (197, 204, 213), + (197, 203, 210), (191, 193, 200), (180, 184, 190), (170, 175, 181), + (153, 163, 173), (136, 151, 165), (127, 145, 163), (119, 139, 161), + (89, 116, 146), (78, 107, 137), (68, 98, 128), (60, 91, 124), + (52, 84, 121), (50, 81, 118), (48, 78, 116), (46, 75, 109), + (47, 72, 103), (62, 82, 108), (71, 89, 113), (81, 97, 119), + (85, 101, 123), (90, 106, 128), (90, 107, 129), (91, 109, 130), + (87, 104, 126), (79, 98, 123), (71, 92, 120), (60, 85, 116), + (49, 79, 113), (45, 76, 112), (41, 74, 111), (36, 72, 113), + (33, 72, 119), (31, 74, 127), (31, 73, 125), (32, 73, 124), + (32, 73, 124), (33, 74, 125), (36, 76, 127), (37, 77, 127), + (39, 77, 124), (39, 78, 126), (39, 79, 128), (42, 83, 133), + (46, 88, 138), (48, 91, 142), (51, 94, 147), (53, 99, 156), + (55, 103, 164), (53, 103, 168), (53, 103, 168), (53, 103, 169), + (53, 103, 169), (53, 103, 170), (53, 103, 171), (53, 104, 170), + (55, 105, 167), (64, 109, 167), (74, 114, 167), (81, 119, 168), + (88, 124, 170), (105, 135, 175), (118, 145, 181), (130, 152, 183), + (143, 159, 185), (161, 169, 185), (160, 166, 179), (159, 164, 174), + (155, 159, 169), (152, 154, 164), (140, 144, 156), (128, 134, 149), + (109, 120, 135), (102, 113, 129), (95, 107, 123), (92, 106, 124), + (90, 105, 125), (86, 105, 130), (81, 106, 138), (73, 109, 144), + (65, 109, 145), (50, 100, 140), (47, 96, 137), (44, 92, 135), + (38, 87, 133), (32, 86, 132), (29, 89, 136), (29, 89, 138), + (39, 85, 134), (50, 90, 133), (62, 95, 133), (69, 98, 134), + (77, 102, 136), (82, 106, 139), (84, 106, 140), (83, 105, 137), + (84, 104, 132), (92, 101, 121), (91, 100, 120), (90, 99, 120), + (86, 99, 121), (83, 100, 125), (86, 101, 125), (92, 104, 127), + (103, 113, 132), (110, 118, 135), (117, 124, 139), (120, 126, 140), + (124, 128, 141), (131, 133, 143), (137, 139, 148), (141, 142, 153), + (143, 147, 156), (150, 153, 163), (152, 156, 165), (154, 159, 168), + (159, 163, 174), (164, 168, 179), (168, 173, 183), (173, 176, 185), + (175, 179, 189), (174, 179, 188), (174, 179, 187), (172, 177, 185), + (173, 177, 181), (174, 177, 181), (175, 176, 182), (175, 178, 181), + (175, 180, 183), (188, 193, 195), (192, 196, 199), (196, 200, 204), + (201, 207, 213), (203, 210, 219), (202, 211, 221), (200, 209, 220), + (182, 195, 211), (174, 188, 207), (167, 182, 203), (145, 163, 193), + (123, 144, 180), (102, 125, 165), (82, 110, 152), (69, 101, 142), + (59, 94, 141), (49, 90, 142), (44, 86, 144), (40, 85, 145), + (39, 87, 145), (43, 92, 149), (47, 98, 154), (51, 102, 159), + (57, 104, 162), (60, 105, 161), (64, 107, 161), (73, 112, 164), + (85, 120, 166), (97, 130, 173), (110, 140, 182), (125, 151, 187), + (141, 161, 193), (157, 171, 196), (171, 180, 198), (180, 186, 205), + (187, 191, 206), (191, 191, 205), (190, 188, 200), (184, 182, 190), + (175, 174, 182), (159, 162, 176), (144, 148, 167), (126, 132, 159), + (108, 120, 150), (94, 114, 145), (80, 109, 145), (69, 105, 146), + (61, 97, 144), (55, 86, 135), (51, 82, 124), (50, 81, 118), + (53, 83, 119), (56, 86, 122), (61, 85, 121), (64, 85, 117), + (68, 85, 112), (75, 87, 111), (79, 92, 114), (85, 96, 119), + (89, 102, 124), (94, 108, 129), (102, 114, 131), (109, 119, 134), + (116, 123, 136), (121, 128, 139), (125, 133, 144), (129, 138, 147), + (134, 142, 151), (136, 143, 152), (135, 143, 152), (129, 140, 152), + (119, 134, 151), (109, 127, 146), (97, 117, 138), (85, 106, 129), + (75, 96, 120), (63, 87, 113), (58, 78, 105), (56, 73, 99), + (52, 70, 96), (54, 70, 99), (53, 74, 107), (55, 78, 116), + (63, 84, 123), (65, 89, 128), (68, 94, 136), (67, 98, 145), + (67, 102, 152), (74, 108, 157), (81, 114, 160), (91, 121, 164), + (103, 129, 166), (113, 136, 170), (124, 144, 172), (136, 153, 176) + ), + +// 400 040221-43 +((53, 75, 76), (58, 80, 82), (57, 80, 80), (57, 81, 79), + (53, 78, 77), (50, 75, 76), (48, 74, 76), (46, 73, 77), + (41, 71, 80), (39, 67, 77), (37, 64, 74), (35, 60, 70), + (34, 56, 66), (35, 53, 62), (37, 51, 58), (38, 51, 57), + (40, 51, 56), (48, 54, 57), (51, 56, 58), (55, 59, 60), + (56, 59, 59), (57, 59, 59), (57, 59, 59), (57, 59, 59), + (60, 60, 56), (66, 64, 59), (72, 68, 62), (79, 73, 67), + (86, 79, 72), (88, 80, 73), (90, 81, 75), (91, 82, 76), + (89, 80, 74), (88, 76, 69), (89, 76, 67), (91, 76, 66), + (92, 75, 65), (93, 74, 64), (92, 73, 63), (91, 72, 62), + (84, 63, 56), (78, 59, 52), (72, 56, 49), (70, 57, 49), + (68, 58, 50), (66, 59, 51), (65, 60, 52), (63, 61, 57), + (61, 62, 59), (57, 60, 60), (56, 59, 58), (56, 59, 56), + (55, 58, 55), (55, 58, 54), (54, 58, 54), (54, 58, 54), + (49, 53, 51), (46, 49, 49), (43, 46, 47), (42, 43, 44), + (41, 41, 42), (42, 41, 42), (43, 42, 42), (44, 43, 43), + (47, 47, 46), (47, 60, 64), (47, 68, 74), (48, 76, 84), + (49, 80, 89), (50, 84, 95), (55, 96, 108), (61, 104, 115), + (72, 113, 121), (73, 116, 124), (74, 119, 128), (73, 121, 131), + (72, 123, 134), (71, 122, 133), (71, 121, 133), (72, 117, 129), + (72, 113, 120), (71, 101, 102), (70, 93, 90), (70, 85, 79), + (70, 82, 75), (70, 79, 71), (68, 71, 65), (66, 67, 59), + (65, 60, 48), (69, 59, 45), (73, 59, 43), (75, 60, 44), + (78, 62, 45), (82, 64, 47), (83, 66, 52), (82, 67, 56), + (78, 68, 59), (72, 67, 60), (69, 66, 62), (66, 66, 64), + (65, 66, 65), (64, 67, 67), (61, 67, 71), (57, 67, 73), + (48, 63, 72), (41, 58, 67), (35, 54, 63), (32, 51, 60), + (30, 48, 57), (25, 42, 53), (23, 40, 51), (23, 40, 51), + (27, 42, 53), (37, 55, 60), (40, 58, 62), (43, 61, 65), + (48, 68, 70), (52, 72, 73), (56, 76, 75), (63, 78, 76), + (83, 86, 78), (92, 91, 80), (102, 97, 83), (105, 98, 83), + (108, 99, 84), (112, 103, 86), (114, 105, 87), (118, 107, 86), + (123, 107, 87), (142, 117, 93), (144, 119, 95), (147, 122, 98), + (152, 127, 104), (153, 130, 110), (152, 133, 112), (148, 134, 116), + (157, 143, 126), (159, 145, 128), (161, 148, 131), (161, 146, 129), + (161, 145, 127), (157, 139, 119), (148, 130, 110), (140, 121, 102), + (133, 114, 96), (122, 106, 91), (120, 105, 90), (119, 104, 89), + (114, 99, 83), (108, 91, 75), (101, 85, 69), (92, 79, 64), + (77, 72, 64), (74, 71, 65), (71, 70, 67), (66, 69, 70), + (61, 66, 70), (57, 64, 69), (53, 61, 66), (50, 57, 63), + (47, 54, 59), (42, 51, 56), (41, 50, 56), (40, 49, 57), + (39, 49, 58), (39, 49, 59), (40, 52, 60), (42, 55, 61), + (46, 62, 65), (46, 63, 66), (47, 64, 67), (46, 65, 68), + (44, 63, 69), (41, 63, 69), (40, 63, 69), (39, 63, 70), + (39, 63, 69), (40, 64, 68), (43, 64, 66), (44, 62, 63), + (45, 58, 58), (45, 54, 52), (47, 51, 47), (48, 49, 43), + (54, 49, 41), (55, 49, 41), (57, 50, 41), (60, 51, 42), + (64, 54, 43), (68, 56, 44), (70, 57, 44), (72, 59, 46), + (73, 60, 46), (74, 59, 46), (72, 59, 49), (70, 61, 52), + (68, 63, 57), (66, 66, 62), (66, 70, 69), (68, 77, 77), + (73, 84, 82), (79, 91, 88), (85, 97, 94), (90, 101, 98), + (90, 104, 101), (89, 103, 103), (88, 103, 104), (86, 103, 104), + (86, 104, 103), (88, 104, 101), (90, 103, 99), (88, 101, 94), + (83, 95, 90), (77, 90, 86), (71, 85, 84), (63, 82, 82), + (57, 79, 81), (52, 76, 80), (48, 75, 77), (45, 71, 75), + (40, 67, 73), (39, 65, 73), (37, 65, 72), (36, 64, 71), + (34, 62, 72), (33, 62, 70), (33, 59, 65), (32, 54, 58), + (33, 48, 51), (35, 44, 44), (39, 40, 37), (41, 37, 33), + (43, 37, 32), (46, 39, 31), (46, 39, 31), (48, 39, 31), + (50, 40, 31), (52, 39, 28), (54, 37, 25), (53, 35, 24), + (53, 34, 24), (51, 34, 25), (48, 34, 27), (44, 35, 30), + (40, 35, 33), (37, 36, 33), (33, 34, 34), (32, 34, 36), + (33, 36, 38), (39, 41, 42), (43, 46, 46), (46, 50, 50), + (48, 57, 54), (50, 62, 59), (50, 65, 65), (50, 69, 69) + ), + +// 401 040221-44 +((56, 32, 15), (81, 40, 17), (91, 41, 20), (101, 43, 23), + (104, 42, 23), (108, 42, 23), (105, 40, 20), (102, 39, 17), + (86, 28, 13), (81, 26, 12), (77, 24, 11), (75, 24, 10), + (73, 25, 9), (78, 26, 9), (83, 28, 9), (87, 29, 9), + (91, 30, 10), (102, 31, 13), (102, 28, 11), (103, 26, 9), + (100, 22, 7), (98, 18, 6), (94, 16, 5), (90, 15, 5), + (68, 12, 5), (62, 13, 7), (57, 14, 10), (55, 17, 14), + (54, 21, 19), (54, 23, 19), (55, 26, 20), (61, 30, 25), + (72, 37, 25), (104, 54, 39), (115, 64, 44), (127, 74, 49), + (137, 76, 47), (147, 79, 46), (150, 76, 43), (154, 74, 41), + (152, 75, 41), (141, 69, 39), (130, 64, 38), (116, 51, 29), + (103, 39, 21), (95, 34, 18), (88, 30, 15), (76, 22, 12), + (69, 22, 13), (54, 30, 11), (45, 29, 9), (36, 28, 7), + (33, 27, 6), (31, 27, 5), (31, 28, 5), (32, 29, 6), + (27, 26, 5), (26, 20, 4), (25, 14, 4), (32, 13, 4), + (40, 13, 5), (48, 14, 5), (56, 15, 6), (72, 22, 5), + (89, 31, 7), (123, 46, 20), (143, 62, 34), (163, 79, 48), + (173, 91, 59), (184, 104, 71), (196, 130, 86), (212, 145, 94), + (215, 145, 86), (210, 144, 93), (206, 144, 101), (194, 130, 87), + (183, 116, 73), (176, 107, 61), (169, 99, 49), (153, 77, 34), + (142, 62, 30), (139, 47, 26), (142, 58, 37), (146, 69, 48), + (151, 79, 56), (156, 90, 64), (171, 106, 77), (183, 116, 80), + (200, 121, 85), (199, 123, 87), (198, 126, 90), (194, 122, 84), + (191, 118, 78), (188, 108, 65), (183, 88, 52), (178, 74, 38), + (172, 65, 32), (156, 55, 19), (156, 53, 17), (156, 52, 16), + (156, 51, 15), (156, 51, 14), (159, 52, 13), (153, 52, 11), + (141, 48, 6), (136, 43, 4), (132, 38, 2), (129, 35, 1), + (126, 32, 1), (121, 29, 1), (116, 27, 1), (111, 26, 1), + (107, 25, 1), (93, 22, 3), (89, 21, 3), (86, 21, 4), + (80, 21, 7), (74, 19, 7), (71, 17, 8), (67, 16, 9), + (67, 16, 10), (72, 16, 9), (78, 16, 9), (82, 17, 9), + (86, 18, 10), (95, 22, 9), (105, 26, 10), (114, 31, 13), + (124, 33, 14), (133, 35, 14), (131, 34, 13), (130, 34, 12), + (126, 35, 12), (119, 33, 13), (112, 32, 12), (105, 30, 11), + (90, 24, 3), (86, 22, 2), (83, 20, 2), (82, 19, 3), + (81, 19, 5), (82, 15, 5), (81, 13, 4), (80, 12, 5), + (79, 12, 4), (76, 7, 6), (75, 5, 5), (74, 4, 4), + (67, 2, 3), (58, 4, 3), (48, 5, 3), (39, 4, 3), + (28, 2, 1), (25, 2, 0), (23, 2, 0), (19, 3, 1), + (17, 4, 1), (17, 3, 1), (19, 4, 1), (22, 4, 0), + (23, 6, 1), (24, 8, 3), (24, 8, 3), (25, 9, 4), + (26, 9, 4), (25, 9, 4), (21, 10, 4), (18, 10, 4), + (12, 10, 4), (11, 9, 4), (11, 9, 4), (10, 9, 4), + (9, 9, 3), (9, 10, 3), (10, 12, 6), (13, 17, 12), + (13, 25, 17), (21, 33, 22), (31, 39, 26), (46, 44, 29), + (67, 48, 34), (79, 56, 39), (98, 68, 44), (113, 80, 45), + (150, 89, 38), (155, 88, 36), (160, 88, 35), (170, 89, 36), + (175, 94, 33), (172, 98, 33), (171, 96, 31), (164, 90, 25), + (157, 78, 26), (151, 69, 25), (140, 64, 23), (132, 57, 24), + (123, 53, 25), (110, 42, 31), (98, 32, 32), (83, 23, 28), + (68, 16, 23), (57, 15, 17), (46, 14, 20), (36, 12, 19), + (27, 9, 18), (18, 5, 13), (14, 4, 7), (12, 7, 6), + (15, 9, 9), (21, 13, 11), (32, 15, 13), (49, 16, 17), + (67, 19, 21), (83, 23, 27), (96, 28, 31), (105, 34, 30), + (115, 36, 30), (127, 36, 29), (132, 35, 26), (130, 34, 24), + (123, 33, 19), (110, 32, 16), (99, 28, 13), (85, 23, 10), + (70, 17, 6), (57, 13, 3), (45, 9, 2), (35, 7, 2), + (26, 5, 2), (18, 4, 2), (11, 3, 1), (6, 2, 0), + (4, 2, 0), (3, 1, 0), (2, 1, 0), (2, 1, 0), + (1, 0, 0), (0, 0, 1), (0, 0, 0), (1, 0, 0), + (1, 0, 0), (3, 0, 1), (4, 0, 1), (5, 0, 1), + (5, 0, 1), (5, 0, 0), (5, 1, 1), (6, 1, 0), + (6, 2, 0), (5, 2, 0), (5, 3, 0), (5, 5, 1), + (8, 7, 1), (17, 11, 2), (28, 17, 8), (42, 24, 11) + ), + +// 402 040221-45 +((78, 97, 108), (74, 87, 90), (61, 74, 76), (48, 61, 63), + (52, 67, 70), (57, 73, 77), (64, 81, 85), (71, 89, 94), + (92, 120, 129), (95, 133, 148), (98, 146, 167), (95, 151, 175), + (93, 157, 183), (85, 158, 182), (78, 160, 182), (71, 157, 180), + (65, 155, 178), (44, 144, 172), (42, 141, 166), (41, 138, 161), + (41, 128, 151), (41, 118, 142), (39, 111, 136), (38, 104, 130), + (35, 73, 106), (36, 61, 93), (37, 49, 80), (32, 38, 72), + (28, 27, 65), (24, 23, 63), (20, 19, 61), (15, 14, 53), + (13, 10, 48), (12, 11, 49), (11, 15, 54), (11, 20, 59), + (13, 27, 62), (16, 35, 66), (19, 40, 69), (22, 46, 73), + (30, 67, 99), (33, 73, 104), (36, 79, 109), (34, 78, 106), + (33, 78, 103), (32, 75, 101), (31, 72, 100), (28, 66, 91), + (24, 57, 83), (11, 42, 66), (9, 37, 64), (8, 32, 63), + (9, 30, 58), (10, 28, 53), (8, 27, 51), (7, 27, 49), + (11, 30, 53), (14, 30, 49), (17, 30, 45), (18, 29, 42), + (19, 29, 40), (19, 32, 43), (19, 36, 47), (21, 45, 58), + (21, 55, 69), (25, 78, 99), (28, 93, 118), (32, 108, 138), + (36, 115, 145), (40, 122, 153), (51, 136, 168), (65, 147, 176), + (86, 161, 188), (95, 161, 189), (105, 162, 190), (110, 160, 187), + (116, 159, 184), (113, 157, 182), (111, 155, 181), (102, 148, 177), + (90, 142, 173), (66, 134, 165), (55, 132, 161), (44, 130, 158), + (39, 129, 159), (34, 129, 160), (28, 131, 162), (24, 135, 164), + (28, 138, 170), (35, 139, 171), (42, 140, 173), (46, 141, 174), + (50, 142, 175), (55, 148, 178), (59, 153, 187), (65, 157, 191), + (73, 156, 191), (90, 149, 184), (91, 152, 184), (92, 156, 184), + (92, 157, 182), (92, 159, 180), (90, 156, 175), (90, 145, 164), + (83, 119, 139), (73, 109, 121), (63, 100, 103), (56, 95, 99), + (50, 91, 95), (46, 79, 91), (42, 70, 94), (37, 68, 94), + (32, 67, 94), (21, 80, 107), (22, 84, 114), (23, 89, 122), + (24, 100, 136), (25, 110, 148), (23, 120, 156), (22, 127, 159), + (24, 125, 156), (24, 120, 153), (25, 115, 151), (26, 113, 149), + (27, 111, 148), (29, 105, 146), (30, 103, 144), (31, 104, 144), + (30, 107, 147), (31, 113, 152), (32, 113, 151), (33, 114, 151), + (35, 117, 149), (35, 118, 143), (35, 118, 139), (29, 115, 135), + (22, 106, 129), (23, 103, 126), (25, 100, 123), (24, 100, 123), + (23, 101, 124), (18, 100, 125), (13, 104, 132), (11, 108, 136), + (11, 112, 141), (13, 114, 148), (14, 112, 147), (15, 111, 146), + (18, 104, 141), (22, 99, 135), (25, 95, 130), (29, 94, 130), + (46, 93, 130), (50, 94, 130), (54, 96, 131), (60, 99, 131), + (63, 106, 135), (62, 112, 140), (63, 117, 146), (65, 124, 149), + (72, 132, 154), (88, 144, 165), (91, 146, 169), (94, 148, 174), + (101, 151, 178), (113, 158, 183), (122, 162, 188), (132, 164, 191), + (136, 164, 191), (135, 162, 189), (134, 160, 187), (127, 152, 178), + (118, 142, 173), (107, 135, 167), (99, 128, 160), (94, 125, 158), + (92, 121, 152), (87, 116, 148), (82, 115, 146), (79, 110, 143), + (74, 108, 140), (71, 101, 133), (66, 88, 120), (57, 78, 103), + (39, 54, 72), (34, 48, 64), (29, 43, 57), (21, 28, 42), + (13, 15, 31), (9, 7, 29), (9, 9, 34), (10, 16, 44), + (15, 25, 53), (20, 36, 65), (24, 45, 83), (27, 61, 102), + (29, 76, 122), (30, 91, 136), (35, 103, 143), (41, 111, 150), + (48, 119, 156), (56, 128, 163), (65, 138, 169), (74, 145, 174), + (85, 153, 179), (98, 157, 185), (111, 163, 190), (125, 170, 194), + (139, 176, 198), (149, 185, 203), (157, 188, 207), (163, 194, 213), + (166, 197, 216), (170, 202, 220), (170, 207, 224), (170, 206, 224), + (173, 208, 225), (173, 205, 223), (173, 204, 221), (169, 203, 221), + (160, 198, 217), (153, 192, 210), (143, 179, 195), (130, 161, 176), + (116, 142, 154), (101, 121, 132), (88, 103, 111), (76, 86, 89), + (59, 67, 71), (42, 52, 56), (28, 39, 49), (25, 35, 50), + (26, 37, 53), (32, 43, 62), (40, 53, 73), (43, 66, 89), + (51, 81, 110), (60, 93, 126), (72, 107, 141), (87, 120, 152), + (99, 132, 160), (109, 145, 171), (117, 152, 177), (122, 158, 182), + (124, 162, 183), (126, 163, 183), (124, 165, 185), (123, 167, 189), + (125, 169, 194), (128, 172, 196), (130, 175, 197), (134, 179, 200), + (135, 181, 201), (116, 157, 179), (101, 135, 156), (86, 111, 129) + ), + +// 403 040221-46 +((76, 81, 83), (85, 89, 95), (92, 97, 106), (100, 105, 118), + (110, 114, 129), (120, 124, 140), (124, 128, 146), (129, 133, 153), + (136, 140, 165), (133, 137, 163), (131, 135, 161), (125, 129, 157), + (119, 124, 153), (112, 113, 141), (105, 103, 130), (100, 98, 123), + (96, 93, 117), (79, 80, 105), (82, 80, 97), (85, 81, 89), + (88, 82, 86), (92, 84, 84), (92, 86, 86), (93, 88, 88), + (109, 101, 93), (115, 106, 96), (122, 112, 99), (124, 114, 101), + (127, 116, 103), (127, 116, 104), (128, 117, 106), (128, 119, 112), + (126, 120, 119), (120, 119, 126), (116, 117, 127), (112, 116, 129), + (106, 112, 130), (100, 108, 132), (96, 104, 132), (93, 101, 132), + (79, 87, 130), (72, 80, 127), (65, 74, 124), (58, 67, 120), + (51, 60, 116), (49, 58, 114), (48, 56, 113), (48, 56, 111), + (49, 56, 112), (50, 59, 112), (53, 62, 115), (57, 66, 119), + (61, 71, 123), (66, 76, 128), (68, 78, 129), (70, 81, 130), + (87, 93, 133), (101, 100, 136), (115, 108, 139), (123, 113, 137), + (132, 118, 135), (133, 118, 131), (134, 118, 127), (135, 115, 124), + (134, 112, 120), (124, 103, 118), (108, 94, 114), (92, 85, 111), + (83, 79, 108), (75, 73, 105), (59, 63, 99), (49, 54, 96), + (38, 49, 96), (38, 49, 95), (39, 50, 95), (43, 52, 94), + (47, 55, 94), (48, 56, 94), (50, 58, 94), (54, 63, 94), + (56, 65, 91), (59, 66, 86), (58, 65, 85), (58, 65, 85), + (58, 65, 84), (59, 66, 83), (56, 64, 82), (56, 63, 81), + (56, 64, 91), (59, 68, 98), (62, 72, 105), (63, 72, 107), + (65, 73, 109), (64, 75, 115), (63, 73, 120), (61, 71, 122), + (58, 69, 124), (55, 66, 122), (53, 64, 119), (52, 62, 116), + (52, 62, 115), (52, 62, 114), (57, 64, 113), (63, 70, 114), + (91, 89, 119), (108, 100, 125), (125, 111, 131), (130, 115, 134), + (135, 119, 138), (143, 129, 142), (149, 135, 145), (155, 141, 148), + (160, 144, 149), (153, 142, 157), (150, 142, 159), (147, 142, 162), + (138, 142, 172), (135, 143, 177), (132, 141, 179), (128, 138, 178), + (122, 134, 175), (121, 132, 169), (120, 131, 164), (118, 127, 159), + (116, 124, 155), (119, 115, 143), (117, 109, 136), (119, 107, 130), + (126, 114, 130), (146, 135, 149), (151, 140, 157), (156, 146, 165), + (163, 157, 176), (174, 167, 181), (182, 182, 183), (195, 189, 185), + (203, 203, 200), (201, 199, 197), (199, 196, 194), (197, 190, 188), + (195, 185, 182), (189, 175, 176), (177, 167, 171), (163, 155, 165), + (150, 144, 162), (122, 123, 147), (115, 118, 143), (108, 113, 140), + (96, 105, 134), (88, 96, 131), (82, 92, 129), (80, 90, 129), + (87, 96, 136), (92, 100, 141), (98, 105, 146), (112, 118, 158), + (132, 136, 170), (150, 155, 181), (169, 172, 193), (187, 190, 204), + (203, 203, 218), (231, 229, 231), (233, 231, 231), (236, 233, 231), + (233, 231, 223), (222, 219, 218), (204, 204, 209), (190, 189, 197), + (161, 160, 166), (155, 153, 159), (149, 147, 152), (137, 136, 145), + (130, 131, 142), (128, 131, 146), (128, 131, 145), (130, 133, 145), + (134, 136, 148), (135, 138, 155), (137, 143, 167), (135, 144, 176), + (130, 140, 177), (124, 134, 174), (115, 125, 168), (110, 120, 164), + (109, 117, 161), (111, 118, 158), (113, 119, 156), (119, 120, 148), + (128, 120, 141), (137, 125, 138), (149, 131, 139), (158, 136, 141), + (169, 144, 144), (180, 149, 145), (192, 156, 150), (204, 170, 157), + (212, 178, 168), (218, 190, 182), (223, 201, 193), (228, 208, 201), + (234, 223, 207), (241, 232, 214), (245, 240, 225), (240, 243, 237), + (233, 240, 243), (220, 231, 239), (204, 216, 228), (193, 202, 213), + (173, 182, 201), (153, 165, 192), (130, 143, 179), (106, 119, 162), + (89, 99, 138), (73, 81, 117), (63, 70, 99), (58, 66, 88), + (54, 62, 84), (54, 61, 79), (54, 61, 79), (56, 62, 80), + (62, 68, 84), (66, 74, 89), (73, 80, 93), (78, 85, 99), + (81, 88, 106), (84, 89, 112), (83, 89, 118), (83, 89, 122), + (84, 89, 124), (88, 94, 127), (92, 97, 130), (95, 100, 133), + (94, 99, 136), (87, 93, 136), (83, 89, 134), (79, 86, 132), + (75, 82, 129), (70, 78, 125), (62, 71, 119), (54, 62, 114), + (47, 55, 111), (44, 51, 109), (42, 49, 112), (42, 51, 112), + (45, 54, 113), (49, 57, 116), (54, 61, 117), (59, 66, 119), + (65, 73, 118), (71, 78, 115), (74, 80, 109), (74, 78, 100), + (74, 77, 94), (73, 76, 88), (72, 77, 85), (74, 80, 85) + ), + +// 404 040221-47 +((141, 128, 93), (130, 114, 87), (117, 102, 81), (105, 91, 76), + (89, 83, 74), (74, 75, 73), (75, 75, 74), (76, 75, 75), + (78, 78, 76), (77, 75, 72), (77, 72, 68), (73, 65, 61), + (70, 59, 55), (68, 56, 53), (67, 53, 51), (67, 53, 50), + (68, 54, 50), (76, 60, 51), (85, 62, 50), (95, 65, 49), + (101, 65, 49), (108, 66, 49), (107, 67, 49), (107, 68, 49), + (98, 69, 52), (90, 67, 52), (82, 66, 53), (73, 62, 52), + (65, 59, 52), (59, 56, 51), (53, 54, 51), (40, 49, 51), + (26, 44, 50), (5, 40, 51), (2, 39, 50), (0, 38, 50), + (0, 37, 50), (0, 36, 50), (0, 35, 49), (0, 35, 49), + (0, 35, 49), (0, 35, 49), (0, 35, 50), (0, 35, 50), + (0, 36, 50), (0, 36, 50), (0, 36, 51), (0, 36, 51), + (0, 37, 52), (1, 38, 53), (8, 42, 55), (16, 47, 57), + (33, 58, 63), (50, 70, 69), (60, 78, 73), (71, 86, 78), + (107, 114, 89), (119, 121, 92), (132, 129, 95), (142, 130, 92), + (152, 132, 89), (158, 133, 90), (164, 135, 91), (171, 137, 91), + (177, 138, 89), (175, 133, 84), (166, 121, 73), (158, 109, 63), + (153, 101, 59), (149, 94, 56), (139, 82, 50), (130, 71, 45), + (121, 62, 41), (119, 61, 39), (118, 60, 38), (111, 58, 38), + (104, 57, 39), (99, 55, 39), (94, 54, 40), (85, 53, 41), + (76, 52, 45), (63, 50, 46), (54, 48, 46), (46, 47, 47), + (41, 46, 47), (36, 45, 48), (24, 43, 47), (14, 40, 48), + (1, 35, 48), (0, 34, 48), (0, 34, 48), (0, 33, 48), + (0, 33, 48), (0, 34, 48), (0, 34, 48), (0, 35, 48), + (0, 36, 48), (1, 37, 49), (1, 37, 49), (1, 37, 50), + (1, 37, 50), (1, 37, 51), (1, 38, 51), (1, 39, 52), + (2, 41, 52), (3, 40, 52), (4, 40, 53), (6, 39, 52), + (8, 39, 52), (13, 39, 51), (20, 39, 50), (27, 41, 48), + (35, 44, 45), (47, 47, 44), (50, 47, 43), (53, 48, 43), + (58, 51, 43), (65, 54, 47), (75, 59, 49), (91, 69, 52), + (126, 95, 67), (138, 105, 71), (151, 116, 76), (153, 118, 78), + (155, 121, 80), (151, 120, 83), (144, 117, 83), (137, 117, 81), + (131, 114, 84), (121, 112, 85), (118, 111, 84), (116, 111, 84), + (105, 103, 82), (88, 92, 77), (71, 78, 67), (53, 63, 58), + (25, 39, 44), (23, 35, 39), (22, 31, 35), (22, 30, 34), + (23, 30, 34), (23, 29, 34), (23, 27, 33), (23, 24, 33), + (20, 23, 32), (22, 23, 29), (22, 23, 28), (23, 23, 28), + (22, 25, 31), (20, 26, 33), (17, 26, 37), (11, 26, 41), + (3, 27, 47), (2, 27, 47), (1, 28, 48), (1, 28, 48), + (1, 27, 46), (2, 26, 43), (3, 25, 39), (4, 24, 37), + (6, 24, 34), (5, 26, 36), (4, 26, 36), (4, 26, 37), + (6, 25, 37), (7, 25, 34), (13, 25, 31), (22, 27, 27), + (38, 33, 27), (41, 34, 28), (44, 36, 29), (49, 37, 32), + (47, 39, 36), (44, 39, 38), (43, 40, 38), (42, 40, 39), + (43, 41, 40), (44, 42, 40), (46, 42, 40), (43, 41, 43), + (36, 40, 45), (28, 39, 47), (19, 37, 49), (11, 36, 51), + (1, 34, 52), (1, 34, 52), (1, 34, 52), (1, 34, 51), + (1, 34, 51), (0, 35, 51), (0, 35, 51), (0, 36, 51), + (0, 37, 51), (0, 37, 50), (0, 38, 50), (0, 39, 50), + (0, 40, 49), (0, 41, 49), (0, 41, 49), (0, 41, 48), + (0, 41, 49), (0, 41, 49), (0, 41, 49), (0, 41, 49), + (0, 41, 49), (0, 41, 49), (0, 41, 49), (0, 40, 49), + (0, 40, 49), (0, 40, 49), (0, 40, 49), (0, 40, 50), + (0, 39, 50), (0, 39, 50), (0, 39, 50), (0, 39, 49), + (0, 39, 49), (0, 39, 49), (0, 38, 48), (0, 38, 48), + (0, 37, 48), (1, 36, 49), (4, 34, 47), (9, 34, 45), + (16, 35, 43), (25, 38, 42), (36, 44, 43), (52, 56, 46), + (68, 69, 52), (84, 80, 57), (100, 91, 61), (113, 97, 62), + (123, 100, 63), (126, 101, 65), (130, 104, 66), (131, 107, 68), + (127, 110, 72), (122, 113, 76), (117, 112, 76), (111, 106, 73), + (104, 98, 71), (98, 89, 68), (97, 84, 64), (95, 82, 63), + (98, 86, 66), (105, 94, 70), (110, 101, 72), (119, 106, 74), + (128, 110, 75), (135, 110, 72), (133, 107, 69), (132, 106, 68), + (131, 108, 70), (130, 113, 74), (129, 118, 81), (131, 125, 91) + ), + +// 405 040221-48 +((100, 70, 92), (101, 71, 93), (107, 78, 100), (114, 85, 108), + (118, 89, 112), (122, 94, 116), (123, 96, 117), (124, 98, 118), + (124, 99, 119), (125, 100, 120), (127, 102, 121), (126, 103, 124), + (126, 105, 127), (130, 110, 131), (135, 115, 135), (136, 118, 137), + (138, 121, 139), (139, 130, 137), (133, 129, 132), (127, 129, 128), + (118, 121, 119), (109, 114, 110), (104, 108, 106), (99, 103, 102), + (87, 78, 84), (83, 67, 77), (79, 57, 71), (74, 52, 65), + (70, 47, 60), (68, 45, 57), (66, 43, 55), (62, 44, 54), + (60, 44, 52), (50, 40, 45), (43, 36, 38), (37, 33, 32), + (29, 27, 26), (22, 22, 21), (20, 20, 19), (18, 19, 18), + (22, 21, 22), (28, 27, 30), (34, 33, 38), (41, 38, 43), + (48, 43, 48), (50, 45, 51), (53, 48, 54), (55, 49, 53), + (55, 48, 49), (47, 45, 45), (44, 42, 42), (41, 40, 39), + (42, 40, 40), (43, 40, 41), (47, 43, 45), (51, 46, 49), + (79, 69, 71), (91, 82, 82), (103, 96, 93), (108, 101, 96), + (114, 107, 99), (112, 104, 98), (111, 101, 98), (105, 91, 94), + (96, 81, 86), (82, 62, 75), (79, 59, 74), (77, 56, 73), + (79, 56, 75), (82, 57, 77), (90, 62, 85), (97, 69, 95), + (109, 85, 110), (109, 87, 110), (109, 89, 111), (104, 87, 105), + (100, 86, 99), (96, 84, 93), (92, 82, 88), (87, 78, 82), + (84, 76, 78), (85, 70, 75), (89, 70, 82), (94, 71, 90), + (97, 73, 93), (101, 76, 96), (111, 84, 107), (120, 95, 116), + (135, 113, 136), (145, 124, 144), (156, 136, 153), (158, 138, 157), + (161, 140, 161), (166, 145, 166), (176, 155, 175), (183, 161, 182), + (180, 158, 179), (179, 160, 179), (172, 156, 170), (165, 152, 161), + (162, 149, 156), (160, 147, 152), (152, 140, 146), (149, 138, 146), + (154, 136, 149), (155, 134, 152), (156, 133, 156), (158, 133, 157), + (160, 133, 158), (157, 128, 157), (152, 124, 149), (149, 121, 140), + (143, 117, 133), (130, 114, 119), (124, 111, 114), (119, 108, 110), + (107, 103, 102), (96, 99, 94), (87, 91, 85), (76, 83, 75), + (56, 69, 57), (51, 62, 51), (46, 56, 46), (44, 53, 45), + (42, 50, 45), (40, 45, 44), (45, 45, 48), (58, 51, 59), + (69, 58, 69), (99, 77, 96), (106, 82, 103), (113, 87, 111), + (121, 97, 121), (130, 103, 127), (132, 103, 128), (126, 99, 120), + (115, 85, 100), (102, 75, 87), (89, 66, 74), (85, 62, 71), + (81, 59, 69), (73, 54, 64), (66, 51, 60), (62, 49, 57), + (63, 51, 60), (74, 65, 74), (77, 71, 78), (81, 77, 82), + (94, 88, 93), (103, 98, 103), (109, 110, 107), (115, 117, 111), + (113, 111, 107), (111, 107, 102), (109, 103, 97), (105, 98, 93), + (103, 92, 91), (103, 88, 88), (106, 89, 91), (111, 97, 100), + (119, 105, 114), (135, 117, 135), (138, 119, 138), (141, 122, 141), + (148, 128, 149), (150, 134, 150), (151, 138, 147), (152, 141, 144), + (146, 147, 137), (145, 146, 135), (144, 145, 133), (143, 141, 128), + (139, 139, 128), (136, 138, 128), (134, 132, 125), (128, 123, 119), + (120, 121, 114), (111, 116, 107), (106, 105, 99), (104, 103, 98), + (102, 103, 97), (104, 100, 95), (105, 97, 99), (104, 95, 100), + (95, 85, 94), (91, 81, 89), (87, 78, 85), (78, 72, 75), + (73, 64, 68), (69, 59, 62), (64, 55, 57), (63, 52, 57), + (65, 49, 58), (66, 50, 60), (68, 50, 61), (69, 49, 61), + (71, 50, 61), (70, 50, 61), (69, 50, 63), (73, 52, 66), + (78, 57, 71), (83, 66, 80), (92, 71, 91), (102, 81, 99), + (108, 92, 105), (114, 98, 110), (113, 101, 111), (110, 99, 107), + (108, 92, 102), (102, 84, 97), (95, 76, 93), (93, 68, 90), + (92, 65, 90), (93, 69, 91), (99, 75, 95), (106, 85, 102), + (114, 95, 108), (122, 104, 116), (129, 109, 125), (134, 112, 129), + (131, 112, 128), (126, 107, 126), (119, 98, 120), (106, 88, 107), + (93, 82, 97), (81, 74, 84), (68, 66, 71), (66, 68, 67), + (64, 69, 65), (65, 65, 65), (73, 69, 67), (80, 71, 71), + (84, 66, 73), (89, 68, 73), (94, 70, 74), (100, 71, 78), + (101, 79, 83), (104, 85, 91), (112, 91, 100), (115, 99, 106), + (119, 102, 110), (124, 104, 114), (124, 109, 114), (126, 111, 112), + (128, 113, 113), (129, 117, 114), (128, 120, 112), (126, 119, 111), + (125, 119, 110), (123, 114, 107), (119, 107, 105), (115, 100, 103), + (109, 92, 102), (107, 82, 101), (100, 74, 95), (95, 70, 89) + ), + +// 406 040221-49 +((129, 121, 95), (110, 101, 78), (98, 89, 68), (86, 78, 59), + (75, 67, 49), (64, 56, 40), (61, 54, 38), (59, 52, 37), + (52, 42, 29), (49, 38, 25), (47, 35, 22), (48, 36, 22), + (50, 38, 22), (57, 46, 28), (65, 54, 35), (70, 59, 39), + (76, 65, 44), (97, 86, 62), (109, 97, 71), (121, 109, 80), + (129, 117, 86), (137, 125, 92), (140, 128, 93), (143, 131, 95), + (151, 134, 96), (154, 135, 93), (158, 136, 91), (159, 135, 89), + (161, 135, 87), (160, 133, 84), (160, 132, 82), (155, 126, 76), + (147, 117, 68), (126, 96, 48), (116, 85, 41), (106, 75, 34), + (100, 71, 32), (94, 67, 30), (92, 66, 30), (90, 65, 31), + (84, 66, 35), (81, 64, 36), (78, 62, 38), (77, 61, 37), + (76, 61, 37), (77, 61, 37), (78, 62, 37), (82, 64, 38), + (90, 71, 41), (109, 87, 52), (118, 96, 59), (128, 106, 66), + (137, 115, 75), (146, 124, 84), (150, 128, 89), (154, 132, 94), + (172, 151, 113), (180, 160, 122), (189, 170, 132), (195, 178, 141), + (201, 186, 150), (202, 188, 152), (203, 190, 155), (202, 192, 158), + (200, 188, 157), (191, 176, 141), (184, 167, 131), (178, 159, 121), + (173, 154, 115), (169, 150, 110), (157, 138, 99), (144, 124, 85), + (117, 96, 58), (105, 83, 46), (93, 71, 35), (86, 65, 30), + (79, 59, 26), (76, 57, 25), (73, 55, 25), (70, 55, 27), + (69, 55, 28), (72, 61, 37), (78, 67, 42), (85, 73, 48), + (88, 76, 50), (91, 80, 53), (98, 87, 58), (108, 93, 61), + (124, 106, 68), (132, 111, 71), (140, 117, 74), (142, 119, 75), + (145, 121, 77), (146, 124, 80), (146, 125, 81), (143, 123, 80), + (140, 121, 79), (138, 118, 76), (140, 121, 79), (143, 124, 82), + (145, 127, 86), (147, 130, 90), (152, 138, 99), (155, 145, 109), + (161, 152, 117), (162, 151, 114), (164, 150, 112), (164, 148, 109), + (165, 147, 106), (166, 147, 103), (166, 145, 102), (165, 143, 100), + (162, 140, 98), (152, 130, 89), (150, 126, 85), (148, 123, 81), + (144, 118, 73), (142, 115, 70), (144, 115, 72), (147, 120, 77), + (157, 132, 91), (164, 140, 97), (172, 148, 104), (176, 152, 108), + (181, 157, 112), (190, 166, 120), (199, 176, 130), (206, 184, 140), + (211, 191, 149), (221, 200, 152), (221, 200, 150), (221, 200, 148), + (219, 197, 142), (215, 190, 134), (208, 182, 127), (197, 173, 121), + (176, 152, 104), (163, 140, 94), (150, 129, 84), (144, 122, 78), + (138, 116, 73), (125, 103, 61), (112, 91, 53), (101, 81, 45), + (93, 72, 41), (77, 61, 35), (74, 59, 34), (72, 57, 33), + (69, 54, 32), (66, 52, 32), (66, 52, 33), (68, 54, 33), + (76, 59, 34), (77, 60, 34), (79, 62, 34), (79, 62, 33), + (81, 62, 32), (81, 61, 31), (81, 62, 32), (84, 65, 35), + (89, 69, 38), (103, 84, 46), (107, 87, 47), (112, 90, 49), + (119, 95, 51), (125, 99, 52), (128, 101, 54), (131, 104, 58), + (137, 113, 68), (139, 116, 70), (141, 119, 73), (145, 124, 79), + (149, 128, 83), (151, 130, 85), (150, 130, 87), (146, 128, 89), + (143, 127, 91), (139, 126, 92), (136, 126, 95), (135, 128, 100), + (136, 131, 104), (139, 134, 107), (143, 138, 110), (150, 143, 112), + (159, 150, 114), (160, 150, 114), (161, 151, 115), (160, 151, 116), + (161, 151, 115), (159, 149, 114), (159, 148, 111), (158, 146, 108), + (159, 144, 102), (158, 140, 96), (156, 135, 91), (153, 131, 85), + (148, 125, 81), (145, 120, 75), (139, 114, 70), (134, 108, 65), + (130, 104, 61), (126, 101, 59), (125, 99, 57), (125, 100, 58), + (128, 104, 62), (132, 108, 67), (136, 114, 74), (141, 121, 83), + (146, 129, 92), (151, 135, 100), (155, 142, 109), (164, 151, 118), + (171, 159, 125), (180, 167, 131), (190, 176, 136), (197, 182, 140), + (202, 185, 140), (202, 183, 136), (202, 180, 131), (198, 174, 124), + (193, 167, 115), (189, 160, 109), (184, 157, 105), (181, 153, 103), + (177, 150, 100), (174, 147, 97), (170, 144, 94), (166, 138, 89), + (162, 133, 85), (157, 129, 81), (153, 125, 81), (149, 122, 79), + (143, 117, 75), (136, 113, 73), (128, 105, 67), (119, 98, 61), + (109, 88, 53), (100, 79, 47), (92, 73, 43), (87, 68, 37), + (83, 65, 34), (81, 63, 33), (81, 63, 35), (80, 65, 39), + (80, 69, 44), (84, 74, 53), (91, 83, 62), (101, 93, 70), + (114, 106, 80), (127, 117, 89), (133, 125, 94), (138, 129, 98), + (140, 132, 101), (139, 131, 103), (136, 128, 100), (132, 125, 98) + ), + +// 407 040221-50 +((100, 53, 51), (104, 58, 56), (102, 56, 53), (101, 55, 51), + (97, 51, 48), (93, 47, 45), (92, 46, 45), (92, 45, 45), + (99, 49, 48), (99, 48, 48), (99, 47, 49), (99, 46, 48), + (100, 45, 48), (95, 43, 45), (91, 41, 43), (88, 39, 42), + (85, 37, 42), (80, 36, 40), (81, 37, 41), (82, 39, 42), + (88, 43, 46), (95, 48, 50), (100, 52, 53), (105, 56, 57), + (125, 67, 68), (128, 69, 69), (131, 71, 71), (129, 68, 70), + (127, 66, 70), (124, 63, 68), (121, 61, 67), (110, 57, 61), + (103, 54, 55), (90, 44, 50), (88, 44, 48), (87, 44, 46), + (86, 42, 44), (85, 41, 43), (84, 40, 42), (84, 39, 42), + (82, 36, 39), (82, 37, 40), (83, 38, 41), (89, 40, 43), + (95, 43, 45), (100, 45, 47), (105, 48, 50), (116, 57, 57), + (128, 69, 67), (153, 90, 90), (162, 96, 99), (172, 103, 109), + (169, 104, 111), (167, 106, 114), (164, 104, 113), (162, 103, 112), + (140, 84, 90), (126, 74, 78), (112, 64, 67), (100, 55, 55), + (89, 47, 44), (84, 44, 41), (80, 41, 38), (74, 37, 34), + (70, 33, 32), (66, 29, 30), (65, 29, 29), (64, 29, 28), + (64, 29, 28), (65, 30, 29), (65, 30, 29), (66, 31, 29), + (68, 32, 30), (68, 32, 30), (68, 33, 30), (67, 33, 30), + (67, 33, 31), (66, 33, 31), (66, 34, 31), (67, 34, 31), + (66, 34, 31), (67, 34, 31), (66, 33, 31), (66, 33, 31), + (66, 33, 30), (67, 33, 30), (67, 32, 30), (68, 32, 30), + (72, 35, 34), (78, 38, 37), (85, 42, 40), (89, 44, 43), + (94, 47, 46), (102, 51, 53), (108, 56, 59), (115, 60, 62), + (124, 65, 67), (138, 76, 80), (143, 81, 83), (149, 86, 87), + (153, 91, 90), (158, 96, 94), (168, 106, 105), (177, 113, 110), + (177, 111, 108), (174, 109, 107), (172, 107, 107), (168, 102, 104), + (164, 97, 101), (157, 89, 92), (150, 82, 87), (145, 78, 84), + (141, 75, 84), (145, 80, 89), (146, 83, 90), (147, 87, 92), + (149, 91, 96), (152, 97, 98), (154, 99, 100), (154, 98, 98), + (139, 85, 82), (129, 77, 73), (119, 70, 65), (113, 64, 59), + (108, 58, 53), (96, 47, 42), (84, 41, 36), (74, 38, 32), + (68, 34, 28), (64, 30, 24), (64, 30, 24), (65, 30, 25), + (67, 32, 27), (72, 33, 29), (79, 37, 33), (87, 44, 41), + (113, 62, 59), (128, 72, 69), (144, 82, 79), (152, 88, 85), + (161, 95, 92), (180, 111, 106), (200, 131, 124), (210, 141, 136), + (220, 145, 145), (238, 147, 159), (236, 147, 159), (234, 147, 160), + (231, 141, 159), (223, 122, 147), (219, 110, 140), (202, 102, 127), + (168, 80, 96), (160, 76, 90), (153, 73, 84), (134, 66, 73), + (118, 58, 58), (108, 51, 49), (101, 50, 47), (100, 50, 49), + (101, 51, 51), (109, 54, 57), (111, 55, 57), (113, 56, 58), + (113, 56, 60), (108, 55, 59), (103, 52, 56), (97, 49, 50), + (79, 39, 39), (74, 36, 36), (69, 34, 34), (62, 30, 28), + (57, 27, 24), (54, 26, 22), (53, 25, 21), (53, 24, 21), + (53, 24, 21), (54, 26, 22), (57, 27, 23), (60, 30, 25), + (64, 32, 28), (68, 35, 31), (72, 37, 33), (75, 39, 36), + (80, 41, 39), (81, 41, 39), (82, 42, 39), (82, 43, 38), + (80, 41, 39), (77, 39, 37), (75, 38, 35), (71, 37, 32), + (67, 34, 31), (63, 31, 29), (60, 29, 27), (57, 28, 25), + (56, 26, 24), (55, 25, 23), (54, 24, 23), (54, 24, 23), + (55, 24, 23), (56, 25, 23), (57, 25, 24), (58, 26, 25), + (59, 27, 26), (61, 28, 27), (63, 30, 28), (64, 31, 29), + (66, 32, 31), (67, 33, 32), (68, 34, 33), (69, 33, 33), + (70, 33, 33), (69, 33, 32), (68, 32, 31), (67, 30, 31), + (66, 28, 29), (64, 27, 27), (62, 26, 25), (60, 26, 24), + (59, 25, 23), (58, 25, 22), (57, 25, 22), (57, 26, 22), + (57, 27, 22), (57, 28, 23), (58, 28, 24), (59, 29, 26), + (61, 30, 28), (63, 31, 29), (65, 32, 30), (68, 33, 31), + (72, 34, 33), (75, 35, 35), (76, 36, 37), (77, 36, 37), + (78, 37, 36), (79, 37, 38), (79, 37, 39), (77, 36, 41), + (76, 36, 41), (75, 37, 41), (77, 37, 41), (79, 40, 43), + (85, 45, 48), (91, 52, 54), (100, 60, 61), (106, 65, 66), + (110, 71, 70), (113, 72, 70), (115, 73, 71), (112, 68, 68), + (106, 63, 64), (107, 64, 65), (110, 66, 65), (109, 63, 61) + ), + +// 408 040221-51 +((106, 94, 87), (105, 92, 84), (102, 88, 80), (100, 85, 77), + (93, 78, 70), (86, 72, 63), (87, 73, 64), (88, 75, 65), + (91, 78, 67), (93, 79, 67), (95, 80, 68), (99, 82, 69), + (103, 85, 71), (109, 92, 77), (116, 100, 84), (120, 103, 88), + (124, 107, 92), (137, 122, 107), (144, 128, 113), (151, 135, 120), + (156, 141, 127), (162, 148, 134), (164, 150, 135), (167, 152, 137), + (168, 153, 139), (164, 149, 136), (160, 146, 134), (156, 142, 129), + (152, 138, 125), (151, 136, 122), (150, 135, 120), (147, 132, 116), + (147, 131, 113), (146, 131, 111), (146, 131, 112), (147, 132, 113), + (147, 132, 113), (147, 133, 114), (147, 132, 113), (147, 132, 113), + (147, 131, 110), (145, 130, 110), (144, 130, 110), (140, 127, 109), + (137, 124, 108), (135, 122, 107), (134, 121, 106), (131, 117, 100), + (127, 111, 94), (119, 103, 85), (114, 99, 82), (110, 95, 79), + (109, 94, 78), (108, 94, 78), (107, 93, 77), (107, 93, 77), + (109, 95, 76), (106, 94, 75), (104, 93, 74), (101, 90, 73), + (98, 87, 72), (97, 87, 71), (97, 87, 71), (100, 89, 71), + (105, 92, 74), (121, 109, 88), (129, 117, 97), (137, 125, 106), + (139, 128, 109), (141, 131, 112), (145, 134, 114), (143, 133, 113), + (142, 131, 110), (138, 128, 108), (135, 126, 107), (131, 122, 104), + (128, 119, 102), (123, 115, 99), (119, 111, 96), (109, 102, 88), + (100, 92, 79), (80, 73, 62), (74, 66, 57), (69, 59, 53), + (67, 57, 51), (65, 55, 49), (61, 51, 47), (59, 48, 45), + (56, 45, 43), (56, 44, 43), (56, 43, 43), (56, 43, 43), + (56, 43, 43), (56, 42, 43), (56, 42, 42), (56, 43, 40), + (56, 43, 40), (57, 44, 40), (58, 45, 41), (60, 46, 42), + (61, 46, 42), (62, 47, 43), (64, 49, 43), (66, 50, 45), + (68, 52, 46), (68, 52, 46), (68, 52, 47), (67, 52, 46), + (67, 52, 46), (65, 50, 44), (62, 47, 41), (60, 44, 39), + (55, 40, 35), (49, 33, 29), (48, 33, 28), (47, 33, 27), + (46, 31, 25), (42, 30, 24), (41, 28, 22), (39, 26, 20), + (35, 22, 16), (36, 23, 17), (37, 25, 19), (38, 26, 20), + (39, 28, 22), (41, 31, 25), (43, 32, 27), (45, 33, 29), + (45, 34, 30), (47, 36, 31), (48, 37, 31), (49, 38, 32), + (51, 42, 35), (54, 44, 38), (57, 46, 41), (60, 48, 43), + (63, 51, 45), (65, 53, 46), (68, 56, 47), (70, 57, 47), + (72, 59, 48), (75, 62, 50), (78, 65, 52), (79, 66, 54), + (79, 67, 55), (79, 67, 54), (79, 66, 53), (79, 66, 53), + (79, 65, 52), (79, 65, 51), (79, 64, 49), (77, 63, 47), + (75, 61, 44), (74, 60, 44), (74, 60, 44), (74, 59, 44), + (74, 59, 45), (74, 59, 45), (74, 59, 45), (73, 58, 45), + (72, 58, 44), (71, 56, 44), (71, 56, 44), (71, 56, 45), + (72, 57, 47), (74, 59, 49), (76, 61, 53), (79, 64, 55), + (89, 74, 65), (93, 78, 69), (98, 83, 74), (107, 92, 83), + (117, 101, 91), (126, 111, 101), (135, 119, 109), (142, 127, 117), + (148, 134, 122), (156, 142, 128), (163, 149, 136), (171, 157, 144), + (178, 164, 151), (184, 170, 157), (187, 174, 162), (189, 175, 165), + (189, 175, 163), (189, 175, 163), (189, 176, 163), (190, 176, 164), + (195, 182, 169), (200, 187, 175), (204, 191, 180), (205, 193, 180), + (205, 193, 181), (206, 193, 181), (201, 189, 176), (202, 189, 176), + (204, 193, 180), (205, 193, 181), (203, 191, 178), (200, 188, 173), + (194, 182, 167), (183, 170, 154), (171, 157, 140), (160, 146, 130), + (152, 137, 123), (143, 128, 115), (134, 119, 107), (125, 110, 98), + (116, 102, 89), (107, 93, 79), (98, 85, 71), (93, 79, 64), + (89, 75, 60), (88, 73, 59), (88, 74, 59), (90, 75, 61), + (92, 77, 60), (95, 80, 62), (98, 84, 65), (102, 88, 67), + (107, 93, 70), (114, 100, 78), (124, 109, 88), (133, 117, 96), + (141, 125, 105), (148, 132, 113), (153, 138, 120), (158, 144, 125), + (161, 147, 130), (166, 153, 137), (172, 159, 144), (177, 164, 151), + (182, 169, 157), (187, 174, 163), (190, 178, 166), (191, 178, 167), + (191, 179, 167), (191, 179, 168), (191, 179, 167), (190, 178, 167), + (188, 176, 165), (183, 172, 160), (177, 166, 154), (171, 159, 148), + (163, 152, 141), (156, 145, 135), (152, 140, 130), (149, 137, 128), + (151, 139, 129), (148, 136, 127), (139, 126, 118), (129, 116, 107), + (119, 105, 97), (111, 96, 89), (101, 87, 80), (101, 89, 81) + ), + +// 409 040221-52 +((94, 102, 103), (98, 107, 121), (102, 111, 129), (106, 115, 137), + (110, 120, 146), (115, 125, 156), (116, 127, 159), (118, 129, 163), + (120, 132, 176), (115, 128, 175), (111, 125, 174), (104, 119, 167), + (98, 114, 161), (92, 108, 153), (86, 103, 146), (83, 101, 141), + (81, 99, 137), (74, 91, 118), (71, 87, 106), (69, 83, 95), + (68, 80, 88), (67, 78, 82), (67, 78, 82), (68, 79, 83), + (77, 87, 93), (83, 93, 101), (90, 99, 109), (98, 105, 115), + (107, 112, 122), (110, 115, 126), (113, 118, 130), (121, 125, 140), + (128, 132, 150), (141, 144, 171), (143, 147, 180), (145, 151, 189), + (145, 151, 193), (146, 152, 198), (146, 152, 198), (147, 153, 199), + (151, 157, 199), (153, 158, 199), (156, 160, 199), (155, 160, 199), + (154, 160, 199), (152, 159, 199), (151, 158, 200), (148, 156, 201), + (146, 153, 202), (145, 154, 202), (145, 154, 202), (145, 154, 202), + (143, 152, 197), (141, 150, 192), (138, 147, 188), (135, 144, 184), + (119, 129, 166), (111, 121, 156), (104, 114, 147), (95, 106, 139), + (87, 99, 131), (84, 96, 126), (81, 94, 121), (76, 89, 110), + (72, 85, 100), (65, 78, 84), (64, 77, 83), (64, 76, 82), + (64, 76, 85), (65, 77, 88), (68, 81, 95), (74, 86, 104), + (88, 99, 118), (96, 106, 127), (104, 114, 136), (112, 121, 146), + (120, 129, 157), (124, 132, 162), (128, 136, 168), (137, 144, 179), + (144, 151, 189), (158, 162, 200), (163, 166, 203), (169, 171, 206), + (170, 172, 207), (172, 174, 208), (176, 177, 209), (179, 179, 210), + (182, 181, 212), (180, 179, 211), (178, 178, 211), (175, 176, 210), + (173, 174, 210), (166, 169, 206), (159, 164, 201), (151, 156, 194), + (143, 149, 186), (128, 137, 168), (122, 131, 159), (117, 126, 151), + (114, 123, 146), (111, 121, 142), (106, 117, 135), (100, 112, 131), + (92, 106, 130), (91, 106, 131), (91, 107, 132), (93, 108, 133), + (95, 110, 135), (102, 115, 138), (110, 122, 141), (118, 128, 146), + (125, 134, 153), (138, 146, 172), (140, 148, 177), (143, 150, 182), + (147, 155, 192), (153, 161, 201), (160, 166, 206), (165, 170, 208), + (173, 175, 207), (173, 175, 204), (174, 175, 201), (171, 172, 198), + (169, 170, 196), (164, 166, 192), (158, 161, 189), (155, 158, 187), + (152, 156, 185), (150, 154, 185), (151, 155, 184), (153, 157, 184), + (152, 155, 182), (149, 153, 180), (145, 150, 177), (141, 147, 176), + (137, 143, 174), (139, 145, 177), (141, 147, 180), (144, 149, 182), + (148, 152, 184), (154, 157, 187), (158, 160, 190), (161, 163, 194), + (162, 164, 195), (156, 159, 193), (153, 157, 191), (151, 155, 190), + (146, 151, 185), (140, 145, 178), (133, 139, 169), (127, 134, 160), + (116, 123, 139), (112, 119, 134), (108, 115, 130), (99, 107, 120), + (91, 100, 110), (82, 91, 100), (73, 83, 89), (64, 75, 78), + (57, 68, 67), (47, 58, 47), (45, 56, 43), (44, 55, 40), + (43, 54, 35), (42, 53, 33), (42, 53, 32), (43, 54, 33), + (45, 57, 37), (46, 57, 38), (47, 58, 40), (48, 60, 46), + (51, 64, 54), (57, 70, 63), (64, 76, 73), (73, 84, 84), + (81, 92, 96), (89, 99, 107), (96, 106, 118), (101, 110, 129), + (103, 115, 140), (107, 120, 152), (111, 124, 163), (115, 129, 173), + (121, 136, 185), (122, 137, 184), (124, 138, 183), (124, 137, 178), + (120, 133, 170), (114, 127, 160), (106, 121, 150), (98, 114, 142), + (90, 106, 133), (82, 99, 126), (76, 93, 117), (71, 88, 109), + (66, 82, 99), (62, 78, 88), (60, 75, 77), (60, 73, 69), + (60, 72, 63), (59, 72, 60), (59, 70, 59), (59, 71, 62), + (59, 71, 65), (59, 72, 71), (61, 75, 78), (64, 78, 86), + (67, 81, 92), (71, 86, 98), (75, 89, 102), (78, 93, 106), + (80, 95, 111), (80, 95, 116), (81, 97, 125), (81, 99, 136), + (82, 101, 145), (82, 102, 151), (81, 102, 156), (80, 100, 155), + (79, 100, 151), (76, 96, 142), (74, 93, 134), (73, 91, 128), + (73, 91, 123), (74, 91, 118), (74, 90, 114), (74, 89, 109), + (73, 88, 102), (70, 85, 92), (67, 81, 79), (65, 77, 68), + (63, 75, 59), (62, 74, 52), (61, 74, 48), (63, 74, 46), + (64, 75, 45), (64, 76, 44), (64, 76, 43), (65, 76, 42), + (65, 77, 41), (66, 78, 40), (66, 78, 40), (65, 78, 39), + (65, 77, 40), (64, 77, 41), (63, 76, 43), (62, 75, 46), + (61, 74, 51), (63, 76, 51), (66, 78, 53), (72, 82, 55), + (77, 86, 62), (82, 90, 70), (87, 95, 79), (92, 99, 88) + ), + +// 410 040221-53 +((44, 119, 111), (47, 122, 116), (43, 128, 117), (40, 134, 119), + (41, 136, 123), (42, 139, 127), (46, 139, 132), (51, 140, 138), + (58, 152, 158), (65, 158, 168), (73, 164, 179), (83, 164, 186), + (94, 164, 194), (98, 166, 197), (102, 168, 201), (103, 170, 203), + (105, 172, 205), (111, 180, 216), (121, 185, 217), (132, 190, 218), + (143, 199, 222), (154, 208, 227), (150, 211, 231), (147, 215, 235), + (144, 213, 234), (149, 211, 231), (154, 209, 228), (141, 206, 227), + (128, 204, 226), (120, 198, 222), (112, 193, 218), (99, 181, 209), + (97, 169, 200), (84, 153, 180), (75, 144, 168), (67, 136, 156), + (60, 126, 142), (53, 117, 128), (51, 112, 121), (49, 107, 114), + (43, 84, 98), (43, 81, 98), (44, 79, 99), (50, 85, 104), + (57, 92, 110), (62, 94, 115), (67, 97, 121), (78, 97, 137), + (84, 98, 148), (88, 106, 152), (89, 106, 151), (91, 106, 151), + (91, 101, 151), (91, 97, 152), (87, 96, 151), (84, 96, 151), + (70, 100, 138), (65, 95, 134), (61, 90, 131), (58, 88, 131), + (55, 87, 132), (54, 86, 129), (53, 86, 127), (42, 84, 117), + (38, 79, 108), (37, 74, 103), (38, 76, 103), (40, 79, 104), + (41, 84, 106), (42, 90, 109), (45, 101, 117), (50, 114, 128), + (65, 129, 149), (72, 136, 158), (79, 144, 168), (84, 150, 177), + (90, 156, 186), (92, 157, 188), (95, 159, 191), (98, 160, 194), + (100, 161, 195), (100, 161, 195), (99, 159, 193), (98, 158, 191), + (97, 157, 189), (96, 156, 188), (92, 154, 184), (89, 153, 181), + (81, 146, 171), (73, 140, 162), (66, 134, 154), (61, 131, 149), + (57, 129, 144), (47, 123, 135), (42, 118, 127), (37, 114, 120), + (34, 109, 115), (31, 108, 113), (37, 113, 120), (43, 118, 127), + (47, 121, 132), (52, 124, 137), (64, 133, 150), (73, 142, 163), + (94, 159, 189), (99, 164, 196), (105, 170, 204), (105, 171, 205), + (106, 173, 207), (107, 174, 209), (106, 175, 209), (104, 174, 207), + (100, 170, 202), (87, 159, 185), (85, 156, 181), (83, 153, 178), + (78, 149, 172), (78, 143, 171), (78, 139, 171), (82, 132, 171), + (82, 122, 163), (79, 116, 158), (76, 110, 153), (75, 107, 151), + (75, 105, 149), (75, 102, 145), (72, 100, 138), (69, 102, 135), + (62, 106, 133), (59, 118, 134), (60, 121, 136), (62, 124, 139), + (68, 131, 148), (73, 143, 161), (79, 152, 173), (85, 159, 183), + (94, 165, 193), (95, 165, 195), (97, 166, 197), (97, 166, 196), + (98, 166, 196), (97, 165, 195), (98, 163, 194), (97, 163, 194), + (97, 162, 194), (97, 161, 192), (97, 160, 192), (98, 160, 192), + (97, 159, 191), (97, 158, 189), (93, 155, 185), (89, 150, 178), + (74, 134, 154), (70, 128, 147), (66, 122, 140), (56, 112, 128), + (49, 103, 116), (43, 99, 110), (42, 97, 107), (41, 98, 107), + (43, 101, 112), (53, 114, 128), (58, 118, 135), (64, 123, 142), + (75, 136, 156), (90, 142, 173), (99, 145, 184), (107, 146, 190), + (108, 141, 173), (109, 139, 168), (110, 137, 164), (110, 129, 147), + (109, 121, 137), (104, 111, 132), (97, 109, 123), (91, 114, 125), + (91, 121, 124), (91, 128, 126), (94, 133, 138), (95, 137, 150), + (96, 145, 168), (99, 155, 186), (100, 165, 196), (103, 173, 200), + (97, 171, 194), (94, 168, 190), (92, 165, 187), (86, 156, 181), + (79, 152, 171), (74, 147, 162), (68, 143, 155), (64, 136, 148), + (61, 130, 145), (56, 125, 141), (51, 123, 136), (43, 123, 133), + (37, 120, 127), (32, 116, 121), (31, 109, 112), (26, 100, 99), + (19, 95, 90), (12, 91, 80), (4, 87, 74), (3, 83, 68), + (8, 75, 62), (14, 71, 58), (19, 70, 55), (23, 69, 54), + (28, 73, 56), (33, 74, 59), (43, 77, 65), (52, 80, 73), + (60, 80, 81), (67, 86, 90), (69, 94, 101), (72, 103, 111), + (74, 111, 123), (75, 114, 131), (74, 117, 139), (68, 119, 145), + (58, 118, 142), (51, 116, 136), (43, 107, 124), (37, 96, 110), + (28, 85, 100), (18, 71, 88), (11, 61, 80), (10, 52, 74), + (13, 49, 68), (18, 47, 69), (24, 47, 73), (29, 47, 77), + (36, 53, 85), (39, 61, 92), (41, 71, 98), (44, 81, 104), + (45, 85, 107), (46, 90, 108), (44, 94, 108), (37, 95, 106), + (30, 95, 101), (25, 93, 96), (23, 92, 94), (22, 93, 95), + (17, 96, 96), (14, 98, 99), (10, 101, 99), (7, 103, 99), + (8, 107, 102), (12, 111, 107), (16, 115, 114), (21, 120, 120), + (25, 122, 126), (31, 124, 124), (36, 123, 120), (41, 120, 115) + ), + +// 411 040221-54 +((187, 125, 54), (191, 123, 49), (193, 132, 52), (195, 141, 56), + (197, 147, 57), (199, 153, 59), (199, 156, 60), (199, 160, 61), + (192, 156, 68), (182, 156, 75), (173, 157, 83), (162, 155, 91), + (151, 153, 99), (132, 141, 101), (113, 129, 104), (101, 120, 103), + (89, 112, 103), (47, 68, 93), (38, 58, 88), (30, 48, 83), + (31, 46, 79), (32, 45, 75), (36, 45, 72), (40, 46, 69), + (63, 54, 54), (77, 63, 52), (92, 72, 50), (107, 90, 58), + (123, 108, 67), (132, 115, 71), (141, 122, 75), (159, 136, 77), + (178, 143, 78), (203, 152, 57), (206, 152, 54), (209, 152, 52), + (205, 146, 51), (201, 140, 51), (197, 133, 48), (193, 127, 45), + (183, 114, 32), (176, 109, 30), (169, 105, 28), (151, 95, 27), + (133, 85, 27), (122, 79, 27), (111, 74, 27), (93, 67, 28), + (80, 60, 31), (63, 51, 31), (59, 50, 29), (55, 49, 27), + (54, 49, 25), (54, 49, 24), (55, 51, 26), (57, 53, 29), + (75, 69, 42), (98, 86, 52), (121, 103, 63), (141, 121, 71), + (162, 140, 80), (166, 145, 85), (171, 151, 90), (175, 160, 101), + (178, 167, 116), (174, 155, 119), (163, 143, 109), (152, 132, 100), + (142, 125, 95), (132, 118, 90), (112, 103, 85), (92, 89, 83), + (54, 50, 78), (38, 36, 75), (22, 22, 72), (15, 18, 77), + (8, 15, 82), (7, 16, 87), (6, 17, 93), (6, 23, 109), + (10, 31, 121), (20, 38, 129), (22, 39, 125), (24, 41, 122), + (23, 41, 118), (23, 41, 115), (23, 42, 107), (22, 41, 98), + (24, 33, 67), (21, 26, 51), (18, 20, 35), (15, 16, 29), + (13, 13, 23), (8, 7, 16), (4, 4, 13), (4, 3, 15), + (5, 5, 21), (4, 7, 33), (3, 6, 34), (3, 5, 35), + (4, 5, 34), (6, 5, 34), (12, 8, 38), (22, 14, 40), + (48, 23, 41), (57, 28, 39), (66, 33, 37), (69, 36, 37), + (72, 39, 37), (80, 51, 42), (85, 58, 43), (93, 65, 48), + (99, 69, 54), (105, 78, 72), (104, 82, 80), (104, 87, 88), + (96, 94, 103), (92, 101, 118), (90, 104, 128), (89, 108, 139), + (101, 114, 153), (100, 116, 157), (100, 118, 161), (98, 117, 162), + (96, 116, 163), (92, 114, 164), (89, 113, 159), (94, 111, 153), + (99, 112, 144), (107, 116, 133), (109, 117, 133), (111, 118, 133), + (113, 122, 135), (114, 126, 137), (124, 134, 139), (139, 147, 137), + (170, 171, 147), (169, 175, 155), (169, 180, 163), (162, 177, 168), + (156, 175, 174), (140, 169, 180), (130, 162, 182), (120, 150, 182), + (115, 143, 179), (90, 112, 163), (82, 105, 160), (74, 99, 157), + (61, 86, 147), (51, 74, 138), (53, 69, 129), (54, 68, 117), + (71, 67, 91), (76, 66, 82), (82, 66, 74), (91, 67, 60), + (102, 67, 48), (111, 68, 39), (119, 78, 32), (128, 87, 31), + (139, 94, 30), (146, 106, 43), (147, 106, 48), (149, 106, 53), + (151, 113, 61), (150, 120, 72), (149, 125, 80), (144, 130, 89), + (125, 132, 116), (121, 132, 120), (118, 132, 125), (112, 132, 133), + (108, 129, 134), (102, 123, 133), (95, 119, 134), (88, 112, 137), + (82, 110, 140), (85, 114, 143), (92, 123, 147), (100, 132, 150), + (109, 140, 160), (114, 145, 172), (116, 150, 179), (122, 157, 185), + (140, 177, 181), (145, 181, 178), (150, 186, 176), (155, 187, 174), + (150, 180, 166), (138, 167, 157), (127, 152, 146), (115, 139, 135), + (104, 127, 128), (96, 117, 125), (80, 103, 127), (62, 88, 128), + (46, 71, 128), (30, 55, 123), (18, 40, 119), (14, 32, 113), + (11, 28, 108), (9, 25, 102), (12, 26, 96), (20, 28, 87), + (34, 31, 76), (51, 36, 65), (70, 47, 58), (86, 58, 55), + (96, 72, 57), (109, 85, 63), (118, 98, 74), (124, 102, 84), + (131, 109, 97), (131, 113, 113), (123, 114, 131), (115, 113, 144), + (105, 114, 157), (93, 107, 159), (83, 100, 151), (74, 91, 142), + (62, 79, 130), (51, 64, 115), (46, 56, 102), (41, 49, 91), + (42, 47, 80), (49, 52, 74), (56, 60, 74), (63, 66, 76), + (70, 74, 80), (75, 82, 90), (78, 90, 102), (83, 99, 116), + (85, 110, 137), (93, 123, 160), (103, 139, 178), (114, 150, 193), + (124, 163, 204), (136, 174, 205), (141, 180, 207), (148, 184, 209), + (153, 189, 212), (159, 190, 214), (161, 191, 214), (168, 194, 205), + (177, 198, 195), (186, 199, 178), (195, 199, 164), (205, 198, 150), + (207, 190, 139), (205, 176, 125), (203, 170, 114), (205, 167, 103), + (203, 159, 92), (202, 157, 82), (199, 152, 74), (194, 139, 64) + ), + +// 412 040221-55 +((111, 80, 54), (113, 78, 51), (112, 77, 49), (111, 76, 48), + (107, 71, 44), (103, 66, 40), (105, 68, 42), (107, 71, 44), + (108, 77, 49), (106, 78, 51), (105, 80, 54), (107, 84, 58), + (110, 88, 63), (112, 93, 66), (115, 99, 69), (119, 101, 71), + (124, 104, 74), (132, 109, 75), (135, 111, 78), (139, 113, 82), + (141, 119, 85), (144, 126, 89), (148, 127, 92), (152, 129, 96), + (162, 136, 98), (162, 132, 97), (163, 129, 96), (163, 134, 101), + (163, 139, 107), (166, 142, 111), (169, 145, 116), (174, 154, 125), + (181, 163, 131), (182, 161, 125), (171, 153, 116), (161, 145, 107), + (148, 132, 97), (136, 119, 88), (130, 112, 82), (125, 105, 77), + (102, 79, 55), (87, 66, 43), (72, 53, 31), (58, 41, 21), + (44, 29, 12), (37, 24, 8), (31, 19, 4), (22, 11, 2), + (16, 6, 0), (13, 1, 1), (15, 2, 1), (17, 4, 1), + (22, 6, 1), (27, 8, 2), (30, 9, 2), (34, 10, 2), + (42, 15, 5), (44, 18, 5), (47, 22, 6), (50, 24, 6), + (53, 27, 6), (56, 27, 5), (59, 28, 5), (63, 27, 5), + (68, 27, 5), (72, 30, 6), (73, 34, 8), (74, 39, 10), + (76, 43, 13), (79, 48, 17), (87, 56, 25), (101, 65, 35), + (127, 81, 53), (132, 85, 55), (138, 90, 57), (135, 91, 57), + (133, 92, 57), (132, 92, 56), (132, 93, 56), (131, 93, 59), + (131, 91, 58), (127, 80, 52), (114, 69, 43), (102, 59, 34), + (94, 53, 28), (87, 48, 23), (74, 37, 15), (65, 26, 7), + (61, 14, 1), (62, 13, 0), (63, 12, 0), (63, 12, 0), + (63, 12, 0), (62, 12, 0), (60, 12, 0), (58, 11, 0), + (58, 11, 1), (64, 13, 3), (70, 18, 5), (77, 24, 8), + (79, 28, 11), (82, 33, 15), (88, 41, 22), (90, 47, 29), + (85, 50, 38), (80, 49, 37), (76, 48, 36), (73, 47, 36), + (71, 47, 37), (70, 47, 37), (69, 47, 38), (69, 48, 38), + (65, 45, 39), (48, 32, 29), (42, 28, 25), (37, 25, 22), + (28, 19, 16), (22, 14, 11), (22, 12, 8), (21, 11, 6), + (19, 9, 6), (17, 8, 5), (15, 8, 4), (13, 9, 4), + (12, 10, 4), (14, 11, 4), (16, 12, 4), (20, 14, 5), + (27, 15, 6), (46, 19, 6), (51, 23, 9), (57, 27, 12), + (74, 39, 20), (90, 54, 32), (108, 74, 50), (126, 94, 70), + (161, 128, 99), (176, 141, 111), (192, 154, 124), (195, 157, 128), + (198, 160, 132), (204, 170, 143), (205, 177, 157), (204, 183, 167), + (197, 184, 170), (193, 182, 168), (189, 176, 164), (186, 171, 160), + (176, 160, 148), (162, 143, 134), (148, 127, 120), (127, 108, 104), + (101, 82, 78), (97, 77, 72), (94, 72, 66), (88, 66, 57), + (81, 58, 48), (74, 51, 39), (63, 41, 30), (50, 30, 22), + (40, 20, 14), (29, 9, 3), (28, 8, 2), (27, 7, 1), + (27, 8, 0), (27, 8, 0), (29, 9, 0), (32, 10, 0), + (41, 17, 2), (44, 19, 3), (48, 21, 4), (53, 26, 6), + (56, 31, 10), (59, 34, 12), (59, 36, 15), (58, 37, 15), + (58, 39, 14), (58, 39, 14), (60, 39, 13), (61, 40, 14), + (62, 41, 15), (62, 42, 18), (59, 43, 22), (56, 45, 25), + (49, 43, 27), (47, 41, 25), (46, 40, 24), (43, 36, 21), + (42, 32, 18), (39, 29, 17), (38, 29, 17), (38, 28, 19), + (37, 29, 20), (38, 29, 21), (39, 29, 20), (41, 29, 17), + (44, 31, 16), (47, 35, 17), (51, 39, 22), (56, 45, 29), + (63, 51, 38), (70, 57, 45), (74, 61, 48), (77, 62, 49), + (78, 63, 48), (77, 63, 48), (76, 63, 47), (74, 62, 48), + (73, 59, 48), (71, 55, 47), (70, 49, 43), (71, 42, 36), + (70, 35, 28), (70, 28, 20), (71, 23, 13), (74, 19, 8), + (77, 17, 5), (81, 16, 5), (85, 17, 3), (90, 18, 3), + (95, 21, 3), (101, 28, 6), (105, 36, 13), (107, 43, 19), + (108, 49, 25), (107, 56, 32), (104, 58, 38), (99, 57, 41), + (96, 61, 44), (95, 68, 51), (98, 76, 59), (106, 86, 69), + (118, 101, 82), (130, 116, 97), (139, 127, 111), (146, 135, 121), + (148, 140, 127), (148, 142, 130), (147, 140, 130), (151, 141, 129), + (156, 141, 124), (157, 140, 120), (158, 138, 115), (152, 132, 109), + (141, 122, 99), (124, 109, 90), (112, 95, 79), (103, 82, 67), + (95, 74, 56), (96, 69, 51), (89, 58, 39), (87, 54, 32), + (86, 54, 32), (88, 56, 34), (93, 58, 37), (95, 65, 42) + ), + +// 413 040221-56 +((0, 0, 0), (0, 0, 0), (1, 1, 1), (2, 2, 2), + (4, 4, 4), (6, 6, 7), (8, 7, 9), (10, 9, 11), + (25, 20, 24), (32, 26, 33), (40, 33, 42), (53, 40, 52), + (66, 47, 63), (72, 54, 69), (79, 61, 75), (80, 62, 77), + (82, 63, 79), (77, 61, 72), (65, 53, 61), (54, 46, 50), + (44, 36, 40), (34, 26, 30), (28, 21, 25), (23, 17, 20), + (9, 7, 10), (6, 4, 7), (4, 2, 5), (3, 2, 4), + (2, 2, 4), (1, 1, 3), (1, 1, 3), (1, 1, 1), + (1, 1, 1), (0, 0, 0), (2, 1, 1), (5, 2, 3), + (10, 7, 8), (16, 13, 14), (21, 17, 19), (26, 21, 24), + (53, 47, 52), (69, 59, 66), (85, 71, 80), (98, 80, 93), + (112, 90, 106), (118, 95, 109), (124, 101, 112), (132, 102, 118), + (136, 103, 120), (137, 104, 116), (125, 99, 110), (114, 94, 105), + (103, 84, 97), (92, 74, 90), (86, 70, 87), (80, 67, 85), + (74, 58, 75), (76, 59, 78), (79, 60, 81), (88, 70, 88), + (98, 80, 95), (106, 85, 101), (114, 91, 108), (137, 107, 121), + (156, 127, 141), (202, 173, 185), (214, 186, 194), (227, 200, 203), + (223, 197, 205), (219, 195, 207), (211, 188, 194), (196, 171, 174), + (148, 128, 146), (136, 117, 133), (125, 107, 121), (116, 99, 113), + (108, 91, 106), (105, 87, 102), (102, 83, 99), (96, 82, 92), + (89, 77, 84), (74, 60, 71), (65, 54, 64), (56, 49, 58), + (54, 46, 56), (53, 43, 55), (51, 39, 57), (51, 39, 57), + (56, 40, 59), (56, 40, 59), (57, 40, 59), (56, 39, 56), + (56, 38, 53), (52, 34, 45), (45, 30, 42), (38, 26, 36), + (34, 21, 27), (21, 8, 19), (19, 6, 16), (17, 4, 13), + (16, 4, 12), (15, 5, 12), (17, 9, 13), (24, 14, 18), + (45, 32, 34), (56, 40, 43), (67, 48, 52), (72, 51, 57), + (77, 55, 62), (85, 61, 73), (88, 65, 76), (91, 71, 81), + (98, 78, 90), (111, 92, 109), (115, 97, 114), (119, 102, 119), + (128, 113, 130), (138, 121, 137), (143, 124, 142), (147, 128, 145), + (155, 131, 144), (155, 130, 144), (156, 130, 144), (163, 132, 143), + (170, 134, 143), (184, 150, 152), (188, 158, 167), (197, 160, 168), + (201, 164, 160), (177, 145, 147), (166, 135, 134), (155, 125, 122), + (132, 102, 96), (111, 86, 86), (97, 75, 74), (77, 58, 67), + (66, 55, 67), (65, 53, 67), (64, 51, 68), (66, 51, 68), + (68, 52, 69), (74, 55, 70), (78, 56, 72), (74, 53, 67), + (70, 50, 62), (48, 38, 45), (42, 33, 39), (36, 28, 34), + (25, 21, 24), (16, 15, 17), (10, 9, 11), (6, 6, 6), + (1, 1, 2), (0, 1, 1), (0, 1, 1), (0, 0, 1), + (1, 1, 2), (3, 3, 3), (5, 5, 5), (9, 9, 9), + (14, 13, 14), (25, 21, 28), (28, 23, 31), (32, 25, 34), + (37, 29, 41), (39, 31, 45), (40, 30, 44), (40, 28, 46), + (30, 21, 34), (28, 17, 31), (26, 13, 29), (20, 8, 21), + (14, 5, 14), (12, 2, 8), (8, 1, 4), (5, 1, 3), + (4, 0, 1), (3, 1, 1), (1, 1, 1), (1, 1, 1), + (1, 1, 1), (1, 1, 1), (2, 2, 2), (4, 3, 4), + (11, 7, 10), (13, 9, 12), (16, 11, 14), (26, 15, 19), + (36, 23, 29), (43, 29, 38), (51, 33, 45), (59, 42, 56), + (63, 48, 60), (62, 48, 60), (58, 46, 60), (55, 44, 56), + (48, 40, 48), (39, 32, 39), (29, 24, 32), (22, 18, 24), + (15, 13, 16), (8, 8, 10), (4, 4, 5), (2, 2, 2), + (1, 1, 1), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 1, 1), (1, 2, 2), (4, 3, 5), + (8, 8, 10), (14, 13, 15), (20, 16, 23), (28, 21, 32), + (40, 29, 42), (51, 36, 52), (59, 43, 63), (70, 52, 76), + (82, 61, 84), (88, 66, 89), (90, 73, 95), (93, 76, 95), + (89, 71, 90), (80, 64, 83), (70, 58, 72), (56, 46, 59), + (43, 34, 48), (33, 24, 34), (22, 15, 21), (13, 10, 14), + (8, 5, 7), (5, 2, 3), (2, 2, 2), (1, 0, 1), + (1, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0) + ), + +// 414 040221-57 +((22, 26, 25), (21, 24, 24), (16, 18, 18), (12, 12, 12), + (8, 7, 7), (4, 3, 3), (2, 1, 2), (1, 0, 1), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (1, 0, 0), (3, 1, 0), (3, 1, 0), + (4, 1, 0), (17, 1, 2), (27, 2, 6), (38, 4, 10), + (41, 11, 14), (44, 19, 19), (46, 23, 19), (48, 27, 20), + (60, 47, 29), (55, 51, 36), (51, 55, 43), (52, 58, 41), + (53, 62, 40), (52, 59, 42), (52, 57, 44), (48, 47, 47), + (43, 43, 43), (33, 33, 33), (28, 28, 28), (24, 24, 23), + (19, 20, 18), (15, 16, 14), (13, 14, 13), (12, 12, 12), + (8, 6, 7), (5, 4, 5), (3, 2, 3), (2, 1, 2), + (2, 0, 1), (1, 0, 0), (1, 0, 0), (1, 0, 0), + (0, 1, 0), (0, 2, 0), (0, 2, 1), (0, 2, 2), + (1, 3, 5), (2, 5, 9), (4, 6, 10), (6, 8, 12), + (15, 16, 20), (22, 22, 26), (29, 29, 33), (36, 36, 37), + (43, 44, 42), (45, 46, 44), (47, 48, 46), (52, 51, 49), + (54, 55, 53), (59, 60, 60), (63, 67, 66), (67, 75, 73), + (70, 81, 77), (74, 87, 81), (87, 100, 82), (104, 110, 81), + (126, 131, 82), (126, 133, 87), (127, 136, 92), (131, 131, 88), + (135, 126, 84), (130, 124, 86), (126, 122, 89), (121, 126, 109), + (122, 133, 125), (154, 159, 151), (160, 161, 153), (166, 163, 155), + (173, 165, 152), (181, 168, 150), (184, 172, 150), (177, 164, 144), + (142, 121, 111), (125, 108, 97), (108, 96, 83), (98, 91, 80), + (88, 86, 78), (72, 73, 70), (57, 58, 57), (44, 47, 46), + (36, 38, 37), (23, 25, 24), (20, 22, 21), (18, 19, 18), + (18, 19, 18), (19, 19, 19), (23, 23, 23), (30, 30, 30), + (52, 53, 52), (78, 72, 61), (104, 91, 71), (119, 102, 75), + (135, 114, 80), (154, 132, 98), (170, 149, 109), (179, 161, 108), + (177, 172, 101), (147, 149, 104), (138, 140, 99), (130, 131, 95), + (101, 119, 80), (74, 98, 65), (55, 75, 59), (52, 57, 54), + (47, 47, 47), (51, 48, 47), (56, 50, 47), (66, 54, 49), + (77, 59, 52), (104, 68, 62), (123, 72, 85), (126, 68, 91), + (128, 70, 91), (133, 80, 94), (125, 77, 95), (117, 75, 97), + (95, 71, 93), (79, 70, 76), (74, 76, 73), (72, 81, 74), + (69, 84, 77), (73, 81, 76), (78, 79, 75), (78, 77, 74), + (78, 76, 73), (69, 71, 70), (62, 64, 63), (55, 57, 56), + (52, 51, 51), (42, 42, 41), (40, 40, 39), (38, 38, 37), + (33, 34, 32), (30, 30, 29), (26, 26, 26), (21, 22, 22), + (11, 14, 14), (10, 12, 12), (9, 10, 11), (6, 7, 8), + (4, 6, 6), (2, 3, 4), (1, 1, 2), (0, 0, 1), + (0, 0, 1), (2, 2, 2), (3, 3, 2), (4, 4, 3), + (4, 10, 2), (7, 13, 5), (9, 15, 8), (13, 15, 13), + (17, 23, 13), (17, 23, 14), (18, 23, 15), (18, 19, 18), + (16, 19, 18), (16, 17, 15), (15, 15, 13), (12, 12, 10), + (10, 9, 8), (8, 7, 6), (8, 5, 4), (7, 3, 2), + (7, 2, 1), (6, 1, 3), (8, 0, 5), (8, 1, 6), + (5, 2, 5), (5, 2, 6), (6, 2, 7), (6, 2, 8), + (4, 3, 7), (2, 3, 4), (1, 3, 3), (2, 3, 4), + (3, 5, 5), (5, 7, 6), (8, 10, 7), (12, 12, 10), + (20, 12, 11), (25, 13, 10), (26, 13, 10), (22, 14, 10), + (24, 12, 11), (25, 11, 8), (20, 9, 9), (12, 10, 8), + (6, 8, 9), (4, 8, 7), (3, 8, 9), (4, 10, 11), + (5, 12, 12), (7, 14, 12), (8, 17, 15), (10, 22, 23), + (13, 24, 27), (19, 26, 29), (24, 32, 30), (35, 43, 33), + (44, 46, 32), (61, 44, 32), (73, 35, 26), (94, 40, 21), + (106, 43, 13), (121, 56, 21), (117, 54, 33), (116, 56, 40), + (107, 51, 39), (103, 63, 43), (87, 67, 52), (70, 67, 58), + (54, 57, 56), (45, 51, 49), (38, 43, 42), (33, 37, 36), + (30, 33, 32), (31, 27, 30), (37, 23, 32), (44, 18, 40), + (55, 23, 52), (76, 28, 61), (101, 39, 69), (118, 45, 69), + (121, 53, 77), (122, 58, 81), (120, 64, 82), (117, 67, 71), + (101, 65, 60), (78, 57, 51), (55, 46, 45), (37, 36, 36), + (26, 27, 28), (19, 21, 21), (15, 18, 17), (13, 17, 16), + (15, 18, 17), (19, 24, 23), (22, 27, 26), (22, 28, 27) + ), + +// 415 040221-58 +((72, 172, 134), (74, 175, 141), (69, 174, 143), (64, 173, 146), + (63, 183, 154), (63, 193, 163), (64, 198, 163), (66, 204, 164), + (65, 210, 166), (59, 204, 162), (53, 198, 158), (48, 189, 155), + (44, 181, 152), (43, 172, 153), (43, 163, 154), (42, 156, 153), + (42, 149, 153), (31, 130, 147), (26, 117, 138), (22, 104, 130), + (23, 87, 122), (24, 71, 115), (24, 64, 114), (24, 57, 113), + (30, 46, 103), (35, 46, 98), (41, 47, 93), (52, 47, 90), + (63, 47, 88), (67, 48, 87), (71, 50, 86), (78, 53, 85), + (84, 55, 84), (93, 72, 83), (95, 79, 82), (98, 86, 81), + (94, 94, 82), (91, 103, 84), (88, 108, 85), (85, 114, 87), + (76, 133, 94), (75, 136, 95), (74, 139, 96), (72, 135, 95), + (70, 131, 94), (68, 127, 95), (67, 124, 97), (66, 118, 99), + (65, 109, 98), (67, 94, 91), (68, 84, 86), (70, 74, 82), + (68, 64, 81), (66, 54, 81), (64, 50, 81), (63, 46, 81), + (54, 40, 80), (52, 40, 78), (50, 40, 76), (46, 39, 73), + (42, 38, 71), (39, 38, 70), (37, 38, 70), (32, 38, 70), + (26, 36, 70), (22, 40, 70), (20, 41, 70), (18, 43, 71), + (18, 45, 71), (18, 47, 72), (18, 47, 75), (19, 49, 80), + (24, 52, 90), (25, 53, 92), (26, 55, 95), (27, 55, 95), + (28, 55, 95), (28, 54, 94), (28, 53, 94), (28, 50, 91), + (26, 46, 87), (23, 40, 73), (20, 38, 68), (18, 36, 63), + (17, 34, 61), (17, 33, 59), (13, 27, 57), (11, 22, 52), + (7, 15, 47), (9, 16, 48), (11, 17, 50), (12, 17, 52), + (14, 17, 55), (17, 17, 59), (19, 17, 62), (21, 18, 64), + (23, 21, 67), (37, 30, 69), (51, 37, 70), (65, 44, 72), + (72, 52, 74), (80, 61, 76), (92, 79, 84), (101, 102, 97), + (117, 144, 128), (129, 160, 139), (141, 177, 150), (148, 185, 155), + (155, 193, 160), (164, 212, 175), (167, 230, 189), (164, 243, 205), + (157, 244, 211), (136, 226, 205), (131, 216, 199), (126, 206, 193), + (115, 186, 178), (105, 167, 167), (95, 148, 152), (82, 132, 140), + (69, 96, 111), (66, 79, 96), (64, 62, 82), (65, 56, 76), + (67, 50, 71), (69, 43, 66), (74, 43, 63), (82, 44, 61), + (91, 47, 64), (104, 63, 67), (105, 68, 68), (106, 73, 69), + (109, 85, 72), (109, 97, 73), (107, 106, 78), (107, 112, 83), + (96, 138, 102), (95, 154, 112), (95, 170, 122), (94, 177, 127), + (94, 185, 133), (96, 194, 142), (99, 202, 152), (95, 208, 160), + (94, 215, 168), (82, 222, 180), (79, 222, 180), (76, 223, 180), + (72, 221, 179), (68, 212, 175), (65, 200, 166), (57, 185, 158), + (36, 144, 133), (31, 136, 126), (26, 128, 119), (20, 112, 107), + (18, 96, 93), (15, 82, 85), (15, 70, 80), (13, 61, 76), + (13, 60, 76), (27, 69, 75), (31, 69, 74), (35, 69, 74), + (44, 70, 77), (49, 70, 77), (53, 73, 84), (57, 76, 91), + (64, 84, 106), (65, 83, 106), (67, 83, 107), (67, 76, 103), + (65, 67, 100), (61, 59, 94), (56, 54, 95), (53, 54, 95), + (52, 54, 93), (53, 55, 91), (57, 56, 87), (61, 56, 78), + (65, 54, 74), (70, 54, 71), (74, 55, 69), (80, 59, 68), + (86, 71, 68), (86, 74, 69), (86, 78, 70), (84, 83, 77), + (79, 87, 84), (74, 89, 89), (70, 91, 91), (63, 89, 93), + (60, 88, 93), (57, 84, 94), (54, 78, 97), (54, 73, 100), + (55, 67, 99), (51, 60, 97), (50, 55, 93), (50, 50, 87), + (51, 44, 84), (58, 41, 82), (65, 40, 79), (72, 42, 76), + (79, 45, 73), (85, 50, 71), (90, 56, 69), (100, 63, 70), + (115, 71, 77), (129, 85, 81), (142, 98, 86), (154, 112, 91), + (163, 125, 93), (171, 136, 95), (183, 143, 103), (194, 154, 112), + (204, 170, 123), (209, 187, 141), (211, 202, 157), (207, 216, 168), + (203, 222, 176), (200, 218, 175), (202, 211, 166), (195, 199, 161), + (187, 186, 159), (178, 174, 158), (166, 166, 162), (155, 160, 158), + (149, 156, 146), (141, 154, 139), (133, 151, 133), (129, 149, 130), + (123, 150, 139), (123, 155, 147), (118, 162, 149), (112, 171, 154), + (103, 176, 158), (98, 174, 157), (93, 170, 159), (95, 161, 156), + (96, 150, 147), (92, 138, 136), (79, 126, 127), (69, 110, 120), + (60, 95, 113), (56, 82, 107), (57, 77, 102), (61, 79, 96), + (60, 86, 92), (61, 97, 92), (64, 107, 94), (61, 102, 97), + (56, 104, 104), (58, 115, 110), (59, 129, 117), (60, 145, 126) + ), + +// 416 040221-59 +((87, 129, 157), (98, 136, 164), (100, 139, 166), (102, 142, 168), + (101, 142, 169), (101, 142, 170), (106, 147, 175), (112, 152, 180), + (131, 169, 199), (137, 174, 203), (143, 180, 207), (145, 182, 209), + (147, 185, 212), (148, 186, 213), (150, 187, 214), (150, 187, 215), + (151, 188, 216), (153, 190, 220), (154, 191, 221), (155, 193, 223), + (157, 194, 223), (159, 195, 224), (160, 195, 224), (161, 195, 224), + (159, 192, 221), (156, 188, 217), (154, 184, 213), (147, 178, 206), + (141, 172, 200), (138, 168, 196), (135, 165, 193), (128, 159, 186), + (121, 151, 177), (111, 136, 162), (104, 128, 153), (98, 121, 145), + (90, 112, 137), (83, 104, 129), (79, 99, 125), (75, 95, 121), + (64, 80, 106), (60, 74, 100), (57, 68, 94), (53, 62, 88), + (50, 56, 83), (48, 54, 82), (47, 52, 81), (44, 49, 79), + (42, 46, 78), (38, 44, 77), (37, 45, 77), (37, 46, 78), + (38, 48, 80), (40, 51, 82), (41, 52, 84), (43, 54, 86), + (48, 59, 91), (48, 60, 92), (48, 62, 94), (46, 61, 91), + (45, 61, 89), (43, 59, 87), (42, 58, 85), (39, 54, 81), + (36, 48, 77), (27, 38, 68), (25, 35, 66), (23, 33, 65), + (22, 32, 64), (22, 31, 64), (22, 31, 63), (23, 30, 62), + (26, 34, 65), (31, 40, 70), (36, 46, 76), (46, 57, 87), + (56, 68, 99), (61, 74, 104), (67, 80, 110), (77, 90, 120), + (85, 98, 127), (89, 103, 127), (86, 102, 126), (84, 101, 125), + (82, 99, 123), (81, 98, 122), (76, 94, 119), (73, 92, 117), + (67, 82, 109), (62, 78, 104), (58, 74, 99), (55, 71, 97), + (53, 69, 95), (48, 64, 93), (43, 64, 91), (42, 64, 91), + (42, 64, 90), (47, 66, 94), (47, 67, 96), (48, 69, 98), + (46, 70, 98), (45, 71, 98), (42, 71, 97), (39, 70, 95), + (38, 63, 89), (38, 60, 86), (38, 58, 84), (38, 58, 84), + (39, 58, 85), (39, 58, 85), (41, 61, 87), (44, 65, 91), + (51, 71, 98), (69, 87, 116), (74, 93, 123), (79, 99, 131), + (88, 109, 143), (94, 118, 151), (99, 123, 155), (100, 124, 156), + (99, 124, 151), (98, 123, 151), (97, 123, 151), (95, 122, 150), + (94, 122, 150), (93, 120, 148), (90, 115, 144), (85, 110, 137), + (79, 105, 129), (75, 98, 120), (75, 97, 119), (75, 97, 119), + (76, 96, 118), (76, 95, 119), (77, 94, 117), (74, 93, 116), + (67, 91, 115), (66, 92, 115), (65, 93, 115), (65, 93, 115), + (66, 94, 115), (70, 95, 115), (74, 97, 117), (76, 98, 119), + (78, 99, 122), (78, 102, 127), (77, 103, 127), (77, 104, 128), + (77, 104, 130), (80, 105, 131), (84, 106, 132), (89, 105, 134), + (90, 103, 134), (88, 101, 132), (86, 99, 130), (79, 92, 123), + (70, 82, 114), (61, 72, 103), (51, 61, 93), (42, 52, 83), + (35, 44, 74), (24, 30, 61), (21, 27, 58), (18, 25, 55), + (14, 20, 50), (11, 15, 47), (8, 11, 44), (6, 9, 42), + (2, 8, 41), (2, 8, 41), (2, 9, 42), (3, 10, 42), + (4, 12, 44), (6, 14, 47), (9, 16, 51), (12, 20, 54), + (16, 23, 57), (17, 26, 60), (19, 28, 60), (19, 29, 61), + (19, 30, 61), (20, 30, 62), (20, 30, 64), (23, 31, 66), + (27, 33, 68), (27, 33, 67), (27, 33, 67), (27, 32, 64), + (26, 31, 62), (24, 29, 61), (24, 30, 62), (25, 32, 64), + (28, 36, 68), (33, 42, 73), (39, 51, 79), (47, 60, 87), + (53, 69, 94), (60, 78, 103), (66, 86, 111), (73, 93, 118), + (79, 98, 123), (81, 102, 126), (85, 106, 129), (88, 109, 132), + (91, 111, 134), (92, 114, 136), (94, 116, 139), (97, 117, 141), + (95, 118, 143), (95, 119, 144), (93, 120, 144), (93, 120, 145), + (91, 121, 147), (89, 123, 148), (88, 124, 149), (85, 125, 151), + (82, 127, 153), (79, 127, 152), (77, 124, 151), (74, 120, 148), + (71, 115, 143), (67, 106, 134), (61, 95, 124), (53, 86, 116), + (45, 76, 106), (39, 67, 96), (35, 61, 88), (33, 59, 84), + (34, 58, 83), (37, 57, 85), (41, 62, 90), (46, 68, 97), + (52, 75, 104), (60, 83, 111), (66, 93, 119), (75, 106, 130), + (83, 116, 141), (92, 128, 153), (101, 139, 165), (110, 148, 175), + (117, 154, 184), (120, 158, 189), (121, 161, 191), (118, 160, 190), + (113, 158, 188), (109, 154, 184), (107, 152, 180), (107, 150, 178), + (109, 151, 180), (109, 151, 179), (99, 141, 169), (89, 133, 162), + (79, 125, 154), (72, 120, 148), (68, 115, 143), (72, 117, 145) + ), + +// 417 040221-60 +((75, 85, 97), (43, 46, 51), (39, 42, 47), (36, 39, 44), + (34, 36, 38), (33, 34, 33), (32, 32, 32), (31, 31, 31), + (27, 28, 28), (25, 26, 25), (23, 24, 23), (18, 20, 19), + (14, 16, 16), (11, 12, 12), (8, 9, 8), (7, 8, 7), + (6, 7, 7), (10, 11, 13), (16, 18, 19), (23, 26, 26), + (32, 35, 35), (42, 44, 44), (46, 48, 47), (50, 53, 51), + (63, 65, 63), (65, 67, 66), (67, 69, 69), (66, 68, 69), + (65, 68, 69), (65, 68, 69), (66, 68, 70), (67, 69, 71), + (67, 71, 76), (69, 74, 82), (67, 73, 83), (65, 72, 85), + (60, 68, 82), (55, 65, 79), (52, 63, 76), (50, 61, 74), + (54, 58, 65), (58, 62, 67), (63, 67, 70), (70, 73, 74), + (78, 79, 78), (79, 81, 80), (81, 83, 83), (84, 85, 86), + (88, 89, 89), (96, 98, 100), (102, 105, 105), (109, 112, 111), + (113, 116, 116), (118, 121, 122), (119, 122, 122), (120, 123, 123), + (117, 120, 119), (114, 116, 115), (111, 113, 111), (107, 109, 107), + (103, 105, 104), (100, 102, 101), (98, 100, 99), (94, 95, 95), + (87, 89, 89), (71, 73, 72), (63, 65, 64), (55, 57, 57), + (52, 54, 54), (50, 52, 51), (49, 51, 50), (50, 51, 50), + (65, 66, 65), (77, 78, 77), (90, 91, 90), (103, 105, 104), + (117, 119, 118), (124, 126, 124), (131, 133, 131), (139, 142, 140), + (149, 154, 154), (160, 166, 171), (157, 164, 168), (154, 162, 165), + (151, 159, 164), (148, 156, 163), (142, 150, 152), (134, 138, 137), + (123, 127, 128), (116, 119, 120), (109, 111, 112), (104, 106, 107), + (100, 102, 103), (88, 89, 89), (73, 74, 74), (60, 60, 62), + (46, 48, 51), (25, 30, 37), (24, 31, 39), (24, 32, 41), + (23, 32, 43), (23, 33, 46), (22, 35, 49), (30, 39, 47), + (27, 33, 41), (27, 31, 35), (28, 29, 29), (28, 28, 28), + (28, 28, 28), (29, 30, 29), (31, 33, 31), (35, 37, 36), + (40, 42, 42), (47, 48, 49), (47, 48, 49), (47, 49, 49), + (45, 47, 48), (44, 45, 45), (41, 42, 42), (37, 38, 37), + (29, 31, 30), (26, 28, 27), (24, 25, 24), (22, 23, 22), + (20, 22, 21), (17, 19, 18), (14, 14, 14), (11, 11, 11), + (8, 9, 10), (4, 5, 12), (5, 6, 12), (7, 8, 13), + (6, 7, 15), (7, 7, 15), (9, 9, 13), (10, 10, 13), + (10, 11, 15), (12, 13, 18), (14, 16, 22), (16, 18, 24), + (19, 21, 27), (25, 28, 32), (32, 35, 39), (41, 45, 49), + (51, 57, 62), (86, 91, 98), (96, 103, 113), (107, 115, 128), + (134, 142, 152), (168, 175, 181), (185, 194, 205), (188, 198, 208), + (197, 203, 207), (184, 191, 197), (171, 179, 187), (157, 166, 176), + (150, 156, 161), (145, 150, 155), (144, 151, 158), (153, 159, 162), + (165, 167, 167), (171, 179, 185), (168, 176, 183), (166, 174, 182), + (152, 162, 170), (137, 148, 157), (123, 131, 140), (106, 112, 119), + (84, 85, 85), (78, 79, 79), (73, 74, 74), (65, 66, 66), + (61, 63, 62), (59, 60, 60), (58, 59, 59), (59, 61, 61), + (62, 63, 64), (64, 66, 66), (66, 68, 68), (68, 70, 70), + (69, 71, 73), (70, 73, 74), (73, 75, 75), (73, 76, 77), + (76, 79, 80), (76, 79, 80), (77, 79, 80), (77, 81, 82), + (78, 82, 81), (78, 80, 79), (77, 79, 77), (74, 77, 75), + (71, 72, 71), (67, 68, 67), (63, 64, 64), (59, 60, 60), + (53, 55, 54), (47, 49, 48), (44, 45, 44), (38, 40, 37), + (31, 32, 30), (26, 28, 25), (21, 23, 20), (15, 16, 14), + (9, 11, 10), (6, 7, 6), (3, 4, 3), (0, 2, 2), + (1, 2, 2), (3, 3, 3), (6, 6, 7), (9, 9, 11), + (12, 13, 14), (15, 16, 16), (18, 18, 19), (19, 20, 21), + (21, 21, 21), (21, 22, 22), (21, 22, 24), (21, 22, 24), + (19, 20, 22), (18, 19, 21), (15, 15, 17), (10, 11, 13), + (8, 9, 10), (6, 6, 6), (4, 5, 5), (5, 6, 8), + (7, 8, 11), (9, 9, 11), (11, 12, 13), (11, 12, 14), + (9, 9, 10), (7, 8, 7), (5, 6, 5), (4, 4, 4), + (5, 6, 5), (10, 11, 10), (16, 17, 16), (26, 27, 26), + (38, 40, 38), (51, 53, 51), (62, 64, 62), (73, 75, 74), + (82, 85, 85), (83, 89, 92), (85, 92, 96), (88, 96, 104), + (87, 96, 105), (88, 96, 102), (93, 101, 107), (97, 104, 112), + (102, 109, 117), (105, 113, 121), (90, 98, 104), (77, 84, 93) + ), + +// 418 040221-61 +((180, 138, 160), (170, 104, 140), (171, 86, 137), (173, 68, 134), + (158, 75, 133), (144, 82, 132), (138, 87, 130), (133, 92, 128), + (105, 93, 109), (80, 89, 100), (55, 85, 91), (39, 86, 82), + (24, 88, 74), (23, 88, 68), (23, 88, 63), (27, 85, 64), + (32, 82, 65), (59, 70, 74), (76, 63, 72), (93, 57, 71), + (114, 45, 74), (136, 34, 77), (148, 28, 80), (161, 23, 84), + (199, 13, 94), (205, 10, 96), (212, 7, 98), (211, 8, 105), + (210, 10, 112), (207, 13, 115), (204, 16, 118), (198, 20, 120), + (185, 23, 115), (159, 29, 103), (148, 31, 99), (138, 34, 95), + (124, 37, 94), (111, 41, 93), (105, 43, 90), (99, 46, 88), + (77, 61, 78), (73, 67, 81), (70, 73, 84), (81, 85, 93), + (93, 98, 103), (100, 103, 107), (107, 108, 111), (124, 123, 123), + (140, 133, 139), (184, 160, 161), (187, 162, 164), (190, 165, 168), + (182, 158, 167), (174, 151, 166), (172, 146, 165), (171, 141, 165), + (152, 102, 142), (133, 88, 128), (115, 74, 115), (103, 58, 110), + (92, 43, 105), (88, 38, 104), (85, 33, 104), (79, 36, 99), + (68, 43, 88), (37, 59, 67), (29, 61, 65), (22, 63, 64), + (22, 62, 62), (22, 62, 61), (18, 61, 57), (18, 62, 55), + (18, 58, 63), (17, 53, 71), (16, 48, 80), (14, 47, 84), + (13, 47, 88), (12, 50, 89), (11, 53, 91), (11, 60, 91), + (10, 69, 91), (11, 86, 87), (11, 96, 89), (11, 106, 92), + (12, 111, 94), (13, 117, 96), (15, 125, 96), (18, 130, 93), + (24, 127, 83), (27, 124, 82), (31, 121, 82), (33, 118, 79), + (36, 116, 77), (39, 108, 67), (44, 100, 55), (44, 94, 46), + (44, 90, 42), (47, 92, 47), (48, 100, 52), (50, 109, 57), + (50, 117, 58), (51, 125, 60), (52, 135, 68), (54, 148, 79), + (61, 141, 96), (64, 133, 97), (68, 126, 99), (72, 124, 100), + (77, 122, 102), (92, 108, 99), (107, 86, 100), (118, 61, 97), + (131, 39, 95), (154, 20, 91), (160, 18, 89), (166, 16, 88), + (174, 12, 84), (177, 9, 79), (174, 11, 73), (160, 17, 68), + (137, 28, 61), (133, 28, 57), (130, 29, 53), (127, 30, 51), + (125, 31, 49), (119, 34, 47), (121, 34, 49), (126, 34, 52), + (138, 31, 57), (153, 27, 65), (154, 28, 65), (155, 29, 66), + (154, 40, 65), (155, 55, 67), (144, 69, 76), (128, 80, 81), + (98, 83, 87), (100, 84, 82), (103, 86, 78), (102, 86, 75), + (101, 86, 73), (91, 79, 70), (78, 74, 69), (76, 68, 68), + (78, 66, 62), (74, 71, 53), (70, 76, 53), (66, 81, 53), + (54, 88, 57), (46, 97, 56), (41, 103, 53), (40, 105, 53), + (45, 99, 58), (45, 95, 59), (45, 91, 61), (46, 82, 60), + (45, 74, 60), (40, 65, 61), (39, 59, 63), (34, 52, 70), + (29, 50, 72), (23, 49, 78), (24, 48, 79), (25, 48, 81), + (34, 47, 90), (47, 47, 96), (61, 48, 100), (71, 49, 104), + (85, 49, 114), (88, 47, 117), (92, 46, 121), (97, 45, 124), + (101, 46, 124), (100, 52, 114), (97, 66, 108), (90, 77, 101), + (81, 85, 95), (76, 86, 92), (74, 82, 81), (82, 84, 73), + (88, 81, 63), (89, 82, 59), (85, 78, 60), (75, 71, 62), + (74, 56, 66), (73, 54, 66), (73, 53, 67), (72, 51, 66), + (68, 54, 65), (69, 60, 62), (74, 67, 58), (80, 68, 56), + (87, 66, 56), (93, 62, 61), (106, 56, 61), (117, 56, 61), + (126, 55, 63), (129, 54, 68), (122, 59, 78), (114, 62, 83), + (106, 71, 86), (94, 81, 89), (84, 87, 91), (74, 102, 100), + (63, 116, 104), (58, 130, 105), (55, 138, 108), (62, 131, 106), + (79, 120, 107), (94, 108, 106), (103, 97, 100), (105, 88, 91), + (109, 78, 81), (116, 68, 70), (124, 62, 61), (121, 59, 54), + (108, 62, 47), (90, 67, 47), (74, 74, 45), (67, 84, 49), + (61, 87, 58), (62, 88, 65), (63, 86, 79), (63, 80, 87), + (63, 81, 92), (62, 76, 96), (63, 70, 95), (66, 65, 101), + (68, 59, 105), (63, 61, 106), (57, 63, 106), (48, 66, 100), + (42, 69, 95), (38, 71, 91), (31, 72, 89), (29, 73, 88), + (25, 74, 87), (26, 76, 86), (25, 78, 83), (20, 80, 82), + (21, 85, 84), (24, 88, 88), (34, 96, 95), (54, 107, 101), + (71, 122, 117), (95, 144, 136), (121, 161, 154), (141, 178, 172), + (170, 191, 182), (192, 204, 196), (201, 214, 205), (200, 221, 205), + (196, 203, 203), (193, 180, 188), (196, 160, 178), (193, 132, 171) + ), + +// 419 040221-62 +((110, 59, 34), (88, 44, 25), (79, 35, 26), (70, 27, 28), + (65, 26, 30), (60, 26, 33), (58, 26, 34), (56, 27, 36), + (52, 21, 43), (54, 24, 45), (56, 28, 48), (62, 33, 50), + (68, 38, 53), (80, 45, 51), (93, 53, 50), (98, 57, 49), + (103, 61, 49), (127, 80, 43), (129, 79, 38), (132, 79, 33), + (130, 75, 27), (128, 72, 22), (124, 70, 22), (121, 68, 22), + (104, 53, 20), (100, 49, 22), (97, 46, 25), (95, 47, 28), + (93, 49, 31), (94, 49, 33), (95, 50, 35), (96, 51, 39), + (97, 49, 43), (98, 57, 50), (103, 65, 56), (109, 74, 62), + (117, 81, 66), (125, 89, 71), (128, 93, 71), (132, 98, 71), + (150, 115, 69), (156, 117, 68), (163, 119, 67), (168, 120, 63), + (174, 122, 60), (176, 124, 60), (179, 127, 61), (182, 131, 66), + (180, 131, 71), (168, 125, 81), (164, 119, 79), (161, 114, 78), + (152, 105, 75), (143, 96, 72), (139, 92, 68), (135, 88, 65), + (117, 65, 52), (107, 56, 47), (98, 48, 43), (88, 41, 41), + (78, 35, 40), (74, 33, 40), (70, 31, 40), (64, 28, 37), + (61, 28, 35), (61, 31, 36), (63, 31, 37), (65, 32, 38), + (67, 32, 38), (70, 33, 39), (75, 36, 41), (81, 39, 42), + (92, 45, 43), (96, 48, 43), (100, 52, 44), (101, 55, 45), + (102, 58, 46), (102, 57, 45), (102, 57, 44), (98, 54, 43), + (94, 49, 42), (80, 35, 32), (74, 30, 30), (69, 25, 28), + (67, 23, 27), (65, 22, 27), (64, 21, 24), (63, 20, 23), + (71, 30, 28), (82, 38, 29), (93, 46, 31), (97, 50, 32), + (102, 54, 33), (112, 62, 36), (119, 69, 41), (128, 74, 48), + (133, 79, 52), (133, 85, 56), (128, 82, 58), (124, 80, 61), + (122, 77, 59), (120, 75, 58), (115, 71, 51), (111, 66, 44), + (101, 58, 39), (100, 53, 38), (99, 49, 37), (98, 47, 38), + (97, 46, 39), (89, 44, 42), (82, 40, 45), (76, 39, 47), + (72, 35, 49), (70, 33, 51), (72, 35, 53), (74, 37, 55), + (79, 42, 60), (88, 49, 63), (103, 60, 69), (116, 70, 76), + (125, 78, 79), (126, 80, 78), (127, 82, 77), (128, 81, 73), + (130, 81, 70), (130, 79, 64), (133, 81, 62), (136, 87, 65), + (148, 98, 72), (178, 132, 101), (181, 138, 106), (185, 145, 111), + (191, 152, 122), (195, 161, 131), (199, 170, 141), (197, 173, 144), + (178, 150, 131), (168, 142, 120), (159, 134, 110), (152, 127, 103), + (146, 120, 96), (128, 100, 80), (114, 82, 62), (100, 68, 48), + (92, 55, 37), (77, 34, 24), (74, 32, 22), (71, 31, 21), + (70, 28, 25), (75, 35, 33), (80, 40, 40), (83, 46, 45), + (83, 50, 51), (83, 50, 50), (83, 51, 49), (81, 46, 43), + (78, 39, 36), (74, 36, 32), (72, 36, 31), (71, 36, 31), + (75, 37, 36), (99, 65, 57), (108, 77, 65), (118, 89, 74), + (141, 112, 100), (169, 141, 120), (192, 166, 138), (203, 184, 148), + (210, 193, 164), (211, 193, 164), (213, 193, 165), (208, 190, 161), + (205, 182, 156), (197, 174, 155), (196, 171, 154), (194, 170, 151), + (199, 171, 148), (196, 170, 144), (192, 167, 141), (186, 159, 134), + (184, 153, 120), (182, 146, 106), (176, 142, 97), (172, 136, 96), + (188, 149, 104), (196, 158, 109), (205, 167, 115), (217, 180, 127), + (222, 187, 136), (223, 190, 144), (227, 192, 144), (227, 189, 135), + (223, 178, 117), (212, 166, 105), (194, 146, 87), (172, 123, 68), + (151, 100, 49), (134, 84, 41), (116, 70, 35), (95, 55, 30), + (76, 40, 27), (63, 32, 26), (54, 27, 26), (49, 22, 25), + (47, 17, 22), (52, 17, 21), (54, 18, 23), (56, 21, 27), + (56, 20, 29), (63, 21, 31), (68, 25, 34), (73, 33, 43), + (77, 43, 52), (85, 55, 61), (94, 63, 63), (104, 69, 67), + (110, 74, 69), (112, 79, 72), (114, 79, 70), (114, 77, 68), + (113, 71, 64), (109, 67, 61), (106, 62, 59), (105, 60, 59), + (107, 62, 60), (113, 67, 60), (123, 73, 60), (134, 80, 61), + (143, 88, 61), (148, 92, 62), (154, 95, 63), (157, 99, 63), + (161, 101, 64), (161, 102, 69), (160, 102, 77), (158, 105, 84), + (160, 110, 91), (158, 115, 97), (156, 118, 101), (154, 120, 104), + (156, 123, 105), (151, 119, 98), (141, 111, 86), (130, 98, 76), + (121, 87, 67), (114, 73, 56), (108, 62, 45), (106, 54, 39), + (106, 52, 36), (109, 52, 35), (112, 55, 34), (119, 59, 36), + (129, 70, 38), (126, 68, 36), (117, 63, 32), (107, 54, 31) + ), + +// 420 040221-63 +((85, 103, 82), (86, 117, 97), (88, 122, 104), (90, 127, 111), + (88, 126, 111), (86, 126, 112), (92, 134, 119), (99, 143, 127), + (127, 168, 149), (137, 171, 152), (147, 174, 155), (146, 167, 150), + (145, 161, 146), (139, 150, 136), (133, 139, 127), (127, 132, 121), + (122, 125, 115), (105, 95, 86), (90, 77, 68), (76, 60, 51), + (62, 45, 38), (49, 31, 25), (41, 25, 20), (34, 19, 15), + (17, 8, 6), (11, 6, 3), (6, 4, 1), (5, 6, 1), + (4, 8, 2), (4, 9, 2), (5, 10, 3), (7, 12, 6), + (10, 14, 7), (13, 17, 7), (14, 17, 7), (15, 17, 7), + (14, 17, 7), (14, 18, 7), (14, 17, 7), (15, 17, 8), + (15, 20, 9), (16, 23, 12), (18, 26, 16), (19, 33, 20), + (21, 40, 25), (23, 43, 27), (25, 47, 30), (30, 54, 36), + (37, 63, 43), (61, 84, 64), (74, 99, 80), (88, 115, 96), + (101, 130, 111), (114, 146, 126), (116, 152, 131), (119, 158, 136), + (129, 169, 148), (131, 170, 152), (134, 171, 157), (134, 169, 154), + (135, 167, 152), (132, 164, 148), (129, 162, 145), (120, 154, 137), + (110, 142, 125), (88, 114, 98), (80, 101, 85), (73, 89, 73), + (69, 84, 67), (66, 80, 62), (63, 75, 57), (63, 74, 55), + (63, 79, 61), (64, 84, 67), (66, 90, 74), (67, 98, 82), + (69, 106, 90), (71, 111, 95), (74, 117, 100), (81, 131, 113), + (89, 145, 127), (104, 168, 150), (106, 173, 156), (108, 178, 162), + (108, 179, 163), (109, 180, 164), (110, 182, 165), (111, 183, 166), + (113, 186, 169), (114, 188, 171), (115, 190, 173), (115, 191, 174), + (116, 192, 176), (116, 194, 178), (117, 197, 179), (120, 199, 181), + (124, 202, 184), (127, 205, 187), (122, 204, 185), (117, 203, 183), + (113, 200, 179), (109, 197, 175), (102, 188, 163), (97, 177, 150), + (83, 151, 125), (73, 135, 111), (64, 120, 98), (56, 111, 91), + (49, 102, 84), (36, 85, 67), (24, 67, 49), (14, 51, 34), + (9, 39, 23), (10, 24, 13), (11, 25, 15), (13, 26, 18), + (19, 34, 27), (29, 44, 37), (39, 56, 48), (53, 69, 61), + (78, 96, 86), (87, 112, 100), (97, 128, 115), (103, 136, 123), + (109, 145, 132), (116, 163, 148), (127, 178, 164), (140, 191, 176), + (149, 202, 188), (160, 217, 204), (162, 220, 207), (164, 223, 211), + (165, 228, 218), (167, 232, 223), (174, 235, 227), (182, 237, 230), + (199, 241, 237), (204, 243, 239), (209, 245, 242), (209, 245, 242), + (209, 246, 243), (211, 246, 243), (211, 246, 244), (212, 245, 242), + (213, 244, 240), (214, 235, 231), (212, 231, 226), (211, 228, 222), + (205, 220, 211), (198, 212, 202), (188, 205, 194), (176, 201, 186), + (162, 192, 174), (158, 189, 171), (155, 187, 169), (150, 180, 160), + (145, 173, 153), (139, 168, 149), (132, 170, 148), (128, 173, 149), + (126, 177, 154), (121, 178, 156), (120, 175, 153), (120, 173, 151), + (119, 163, 144), (116, 154, 134), (112, 145, 125), (111, 138, 118), + (123, 127, 105), (128, 126, 104), (133, 125, 104), (142, 121, 103), + (151, 119, 100), (154, 117, 97), (154, 116, 96), (149, 113, 94), + (147, 111, 88), (148, 112, 91), (146, 118, 96), (149, 126, 104), + (151, 137, 113), (149, 146, 123), (139, 150, 128), (126, 146, 123), + (97, 127, 104), (90, 121, 98), (83, 115, 93), (71, 106, 83), + (62, 99, 78), (53, 95, 76), (47, 93, 74), (44, 91, 71), + (44, 92, 72), (51, 94, 76), (59, 98, 81), (70, 106, 88), + (82, 117, 102), (97, 129, 117), (110, 143, 131), (124, 158, 148), + (138, 174, 164), (151, 189, 179), (164, 205, 193), (175, 219, 208), + (189, 231, 221), (201, 240, 232), (211, 246, 240), (218, 250, 246), + (220, 251, 249), (219, 251, 247), (213, 249, 245), (206, 247, 241), + (202, 244, 236), (198, 239, 229), (195, 234, 222), (188, 226, 214), + (179, 213, 199), (164, 198, 184), (146, 182, 167), (130, 165, 150), + (115, 148, 132), (103, 135, 117), (92, 123, 104), (84, 113, 91), + (77, 105, 83), (69, 100, 78), (65, 97, 76), (64, 94, 76), + (67, 94, 78), (68, 95, 79), (69, 97, 79), (70, 96, 79), + (69, 95, 77), (66, 93, 75), (63, 90, 73), (63, 88, 73), + (61, 85, 71), (61, 81, 67), (59, 75, 61), (56, 67, 53), + (52, 58, 42), (47, 49, 33), (45, 41, 25), (42, 36, 20), + (44, 34, 19), (51, 38, 23), (58, 47, 30), (67, 56, 39), + (81, 75, 57), (94, 87, 69), (90, 84, 66), (83, 80, 63), + (81, 76, 61), (76, 75, 59), (68, 71, 53), (70, 80, 63) + ), + +// 421 040221-64 +((54, 109, 89), (32, 97, 71), (21, 80, 59), (11, 64, 47), + (19, 75, 44), (28, 87, 41), (38, 95, 42), (48, 104, 43), + (79, 124, 50), (84, 121, 52), (89, 118, 55), (90, 113, 53), + (91, 108, 51), (84, 96, 45), (77, 85, 39), (73, 78, 35), + (69, 72, 32), (53, 47, 19), (55, 47, 17), (57, 47, 16), + (69, 53, 13), (81, 60, 10), (84, 59, 7), (87, 59, 5), + (78, 56, 6), (74, 54, 8), (71, 53, 11), (59, 44, 12), + (47, 36, 13), (37, 31, 13), (27, 26, 14), (14, 21, 17), + (5, 20, 21), (1, 26, 31), (2, 28, 32), (3, 31, 33), + (3, 37, 29), (3, 44, 26), (3, 48, 25), (3, 52, 24), + (4, 64, 25), (10, 69, 33), (17, 75, 42), (30, 86, 57), + (44, 97, 73), (50, 102, 80), (57, 108, 88), (64, 113, 100), + (67, 109, 108), (70, 93, 115), (66, 87, 109), (63, 81, 104), + (51, 69, 88), (40, 58, 72), (34, 52, 62), (28, 46, 53), + (18, 33, 25), (22, 31, 19), (27, 29, 13), (32, 32, 11), + (38, 36, 10), (42, 39, 8), (46, 42, 7), (52, 48, 5), + (59, 48, 4), (73, 52, 7), (78, 57, 9), (83, 62, 12), + (82, 63, 13), (81, 64, 14), (82, 65, 16), (75, 68, 21), + (61, 65, 24), (52, 60, 21), (44, 56, 19), (34, 57, 19), + (24, 59, 19), (20, 59, 19), (17, 59, 19), (11, 58, 19), + (11, 56, 17), (12, 54, 22), (12, 51, 25), (12, 48, 28), + (12, 45, 30), (12, 42, 32), (10, 36, 37), (9, 33, 43), + (11, 33, 46), (13, 38, 50), (16, 43, 55), (21, 50, 61), + (26, 58, 67), (41, 71, 72), (54, 81, 71), (68, 90, 70), + (71, 90, 67), (73, 99, 67), (70, 99, 58), (68, 99, 50), + (64, 96, 46), (61, 94, 43), (51, 91, 42), (42, 89, 42), + (35, 85, 50), (39, 89, 64), (43, 94, 78), (43, 95, 83), + (44, 97, 88), (51, 94, 96), (53, 87, 101), (60, 82, 109), + (69, 82, 116), (88, 93, 114), (93, 96, 111), (99, 99, 109), + (109, 105, 104), (116, 113, 103), (126, 111, 99), (138, 113, 89), + (165, 117, 71), (164, 110, 66), (163, 103, 61), (160, 100, 59), + (157, 97, 57), (153, 93, 53), (153, 100, 53), (156, 108, 52), + (160, 111, 58), (169, 132, 81), (168, 139, 92), (168, 147, 103), + (169, 163, 123), (174, 172, 139), (171, 171, 145), (179, 172, 142), + (166, 153, 136), (151, 141, 128), (136, 130, 121), (129, 124, 110), + (123, 119, 100), (110, 110, 78), (98, 103, 67), (97, 97, 61), + (96, 101, 75), (116, 123, 107), (122, 134, 113), (129, 145, 119), + (147, 156, 130), (164, 165, 136), (172, 169, 144), (182, 168, 146), + (187, 170, 126), (185, 165, 115), (184, 161, 105), (169, 151, 85), + (148, 135, 70), (124, 120, 54), (101, 110, 46), (82, 99, 43), + (70, 93, 38), (45, 87, 43), (39, 85, 43), (34, 84, 44), + (23, 77, 49), (17, 68, 51), (12, 65, 53), (8, 60, 55), + (4, 58, 55), (6, 58, 57), (8, 59, 60), (13, 70, 71), + (12, 83, 85), (11, 96, 101), (8, 111, 110), (9, 124, 115), + (16, 137, 114), (22, 145, 116), (25, 146, 120), (20, 146, 119), + (16, 142, 120), (13, 138, 107), (16, 134, 94), (23, 126, 84), + (23, 116, 80), (21, 111, 84), (19, 107, 88), (17, 102, 89), + (18, 96, 89), (22, 100, 92), (25, 106, 90), (25, 100, 97), + (25, 89, 94), (22, 75, 88), (19, 61, 81), (17, 57, 73), + (13, 51, 70), (12, 44, 67), (10, 38, 64), (6, 28, 60), + (4, 22, 59), (4, 19, 61), (8, 22, 62), (19, 32, 63), + (31, 41, 61), (45, 50, 55), (62, 62, 52), (78, 79, 53), + (102, 104, 59), (125, 126, 69), (152, 145, 79), (167, 157, 80), + (172, 166, 87), (165, 175, 92), (149, 173, 90), (143, 168, 95), + (131, 153, 84), (121, 136, 79), (101, 118, 71), (71, 95, 56), + (46, 74, 46), (29, 52, 35), (21, 38, 34), (21, 30, 37), + (20, 27, 43), (19, 27, 49), (21, 30, 56), (20, 33, 66), + (23, 41, 74), (22, 45, 77), (23, 49, 77), (24, 55, 75), + (23, 52, 73), (23, 50, 70), (19, 43, 64), (14, 35, 57), + (9, 31, 52), (5, 28, 45), (2, 25, 41), (6, 20, 34), + (15, 14, 28), (25, 10, 24), (41, 16, 18), (49, 24, 16), + (56, 32, 16), (59, 38, 21), (61, 38, 33), (72, 45, 44), + (81, 56, 60), (90, 76, 71), (93, 104, 86), (88, 120, 104), + (73, 114, 111), (63, 102, 114), (57, 88, 106), (51, 92, 94) + ), +// 422 040221-71 +((211, 208, 193), (203, 195, 204), (204, 193, 210), (206, 191, 216), + (206, 191, 220), (207, 191, 225), (203, 190, 227), (199, 190, 229), + (187, 189, 241), (178, 185, 240), (170, 181, 239), (165, 180, 234), + (161, 180, 230), (162, 177, 218), (163, 174, 206), (163, 171, 195), + (164, 169, 185), (167, 143, 149), (158, 132, 143), (150, 122, 138), + (142, 115, 134), (134, 109, 131), (130, 104, 128), (126, 100, 126), + (115, 88, 119), (108, 91, 124), (102, 95, 130), (89, 97, 133), + (77, 100, 137), (73, 97, 135), (70, 94, 134), (63, 85, 131), + (64, 79, 125), (82, 76, 98), (87, 76, 82), (93, 77, 67), + (92, 66, 60), (92, 56, 54), (92, 52, 55), (92, 49, 56), + (103, 46, 68), (116, 55, 76), (129, 64, 84), (145, 78, 101), + (161, 92, 118), (165, 101, 128), (170, 111, 139), (182, 129, 159), + (194, 146, 180), (216, 178, 204), (223, 192, 213), (231, 207, 223), + (231, 217, 229), (231, 227, 235), (230, 230, 237), (230, 233, 240), + (220, 237, 244), (215, 235, 244), (210, 234, 245), (205, 230, 244), + (201, 226, 244), (199, 223, 241), (198, 220, 238), (191, 213, 227), + (182, 203, 210), (172, 185, 175), (174, 180, 157), (176, 176, 140), + (179, 173, 130), (182, 171, 121), (184, 164, 99), (183, 153, 77), + (166, 126, 40), (169, 126, 34), (173, 126, 29), (186, 131, 38), + (199, 136, 47), (202, 136, 54), (205, 137, 62), (203, 135, 79), + (201, 138, 90), (197, 153, 110), (207, 161, 113), (218, 169, 117), + (221, 168, 118), (224, 168, 120), (220, 158, 124), (211, 151, 126), + (180, 147, 127), (167, 148, 126), (154, 149, 125), (148, 147, 126), + (143, 145, 128), (136, 140, 137), (127, 139, 151), (113, 136, 170), + (103, 135, 188), (93, 146, 213), (95, 153, 222), (97, 161, 232), + (96, 163, 235), (95, 165, 239), (95, 165, 244), (89, 163, 245), + (107, 152, 244), (124, 151, 240), (141, 150, 236), (148, 147, 232), + (155, 145, 228), (160, 149, 218), (168, 147, 211), (179, 144, 196), + (198, 138, 185), (223, 116, 158), (227, 114, 152), (232, 113, 146), + (236, 112, 138), (237, 115, 123), (238, 116, 109), (239, 119, 91), + (226, 95, 80), (219, 88, 86), (212, 81, 93), (210, 83, 92), + (209, 86, 92), (211, 100, 78), (216, 104, 63), (217, 108, 53), + (216, 110, 52), (210, 99, 78), (206, 100, 83), (202, 102, 88), + (196, 105, 93), (188, 108, 90), (171, 111, 87), (156, 108, 92), + (125, 94, 116), (116, 99, 136), (108, 104, 157), (102, 108, 164), + (97, 112, 171), (92, 122, 181), (86, 129, 187), (83, 133, 192), + (85, 142, 202), (114, 175, 226), (124, 185, 231), (134, 195, 236), + (154, 212, 246), (172, 221, 250), (184, 228, 251), (194, 230, 251), + (208, 224, 247), (213, 221, 246), (219, 219, 245), (230, 220, 242), + (238, 223, 241), (243, 226, 241), (243, 230, 242), (237, 225, 243), + (225, 210, 241), (194, 192, 235), (186, 187, 233), (178, 183, 232), + (158, 181, 231), (145, 185, 234), (133, 182, 237), (126, 180, 239), + (125, 176, 240), (123, 174, 240), (122, 172, 240), (124, 171, 236), + (125, 171, 235), (125, 172, 233), (124, 176, 235), (127, 176, 236), + (126, 177, 241), (122, 176, 242), (116, 173, 240), (107, 172, 235), + (97, 169, 229), (89, 162, 222), (85, 160, 217), (86, 162, 216), + (98, 162, 212), (102, 165, 213), (106, 169, 215), (116, 169, 216), + (127, 171, 217), (138, 180, 218), (155, 188, 220), (167, 192, 219), + (177, 202, 225), (187, 207, 231), (196, 210, 236), (200, 217, 241), + (207, 226, 244), (212, 230, 241), (216, 237, 240), (220, 243, 237), + (227, 245, 234), (230, 247, 230), (232, 246, 227), (233, 242, 224), + (229, 237, 221), (222, 235, 218), (213, 229, 219), (203, 226, 219), + (190, 221, 217), (186, 215, 214), (182, 208, 209), (180, 208, 201), + (176, 205, 197), (176, 206, 194), (170, 206, 193), (169, 208, 195), + (171, 206, 200), (174, 208, 200), (178, 209, 201), (182, 211, 197), + (187, 209, 191), (197, 212, 175), (206, 212, 163), (213, 211, 156), + (217, 214, 161), (215, 218, 167), (212, 218, 176), (214, 219, 173), + (218, 223, 167), (225, 222, 161), (229, 225, 165), (231, 231, 176), + (227, 235, 195), (224, 236, 214), (220, 239, 226), (220, 238, 230), + (219, 235, 233), (218, 235, 234), (217, 234, 234), (216, 232, 234), + (212, 230, 233), (211, 228, 229), (209, 225, 224), (205, 223, 217), + (205, 224, 211), (207, 225, 205), (209, 226, 206), (212, 228, 206), + (213, 229, 206), (209, 226, 202), (206, 223, 196), (207, 224, 192), + (210, 225, 192), (213, 225, 191), (217, 223, 192), (217, 220, 194) + ), + +// 423 040221-74 +((142, 43, 16), (162, 53, 31), (171, 64, 43), (180, 76, 56), + (180, 86, 68), (180, 97, 80), (177, 101, 84), (175, 106, 88), + (176, 117, 102), (186, 128, 114), (196, 139, 127), (208, 154, 143), + (220, 170, 160), (226, 182, 172), (233, 194, 184), (234, 195, 186), + (236, 197, 189), (237, 197, 189), (234, 192, 185), (232, 188, 182), + (221, 181, 174), (211, 175, 167), (206, 170, 161), (202, 166, 155), + (187, 144, 128), (181, 128, 112), (176, 113, 96), (164, 94, 77), + (153, 76, 59), (145, 67, 49), (137, 59, 40), (123, 45, 26), + (111, 35, 16), (100, 26, 10), (98, 25, 10), (96, 25, 10), + (90, 26, 12), (85, 27, 14), (81, 28, 14), (78, 30, 15), + (61, 39, 21), (55, 43, 22), (50, 48, 23), (49, 49, 23), + (49, 50, 24), (49, 49, 23), (50, 49, 23), (51, 47, 21), + (50, 47, 21), (52, 44, 18), (57, 41, 17), (62, 38, 17), + (74, 33, 14), (87, 29, 12), (94, 27, 11), (102, 25, 10), + (132, 16, 5), (143, 13, 5), (154, 10, 5), (160, 11, 4), + (167, 13, 4), (169, 14, 3), (171, 15, 3), (176, 17, 2), + (180, 19, 1), (186, 19, 3), (179, 20, 5), (173, 22, 8), + (167, 24, 9), (161, 27, 10), (151, 34, 12), (141, 42, 17), + (134, 58, 27), (141, 67, 38), (149, 76, 49), (155, 88, 62), + (162, 100, 76), (166, 108, 85), (170, 116, 94), (175, 129, 109), + (181, 148, 126), (206, 176, 158), (216, 188, 173), (226, 201, 189), + (230, 206, 196), (235, 212, 203), (241, 218, 211), (241, 223, 213), + (231, 208, 199), (228, 194, 184), (225, 181, 169), (224, 173, 162), + (224, 165, 156), (226, 148, 141), (227, 135, 126), (229, 123, 110), + (225, 111, 98), (217, 95, 78), (219, 95, 82), (222, 95, 86), + (224, 99, 91), (226, 103, 96), (236, 114, 107), (240, 124, 117), + (221, 135, 130), (205, 135, 134), (189, 135, 138), (180, 134, 140), + (171, 134, 142), (156, 132, 143), (146, 128, 140), (134, 124, 132), + (124, 114, 120), (95, 85, 91), (89, 79, 84), (84, 73, 77), + (76, 65, 68), (78, 65, 66), (85, 71, 68), (100, 81, 73), + (126, 101, 88), (135, 104, 89), (145, 107, 91), (148, 107, 89), + (152, 107, 88), (156, 106, 86), (161, 104, 84), (163, 103, 82), + (161, 102, 83), (157, 88, 76), (154, 83, 70), (151, 78, 65), + (145, 67, 51), (140, 54, 38), (136, 43, 23), (132, 36, 13), + (135, 38, 10), (140, 48, 18), (145, 58, 27), (149, 64, 33), + (153, 70, 40), (161, 80, 52), (166, 82, 61), (167, 84, 63), + (166, 82, 63), (150, 83, 65), (146, 85, 66), (142, 88, 68), + (131, 98, 73), (119, 98, 81), (107, 100, 84), (95, 96, 81), + (65, 70, 66), (58, 63, 60), (51, 57, 54), (41, 51, 42), + (35, 45, 35), (32, 42, 31), (30, 42, 27), (26, 41, 27), + (27, 36, 27), (28, 26, 28), (30, 23, 26), (33, 21, 25), + (43, 16, 21), (57, 15, 15), (68, 17, 12), (83, 20, 8), + (108, 29, 18), (112, 32, 21), (116, 36, 25), (127, 43, 32), + (139, 48, 36), (150, 52, 38), (160, 57, 34), (172, 57, 30), + (181, 58, 27), (189, 60, 26), (195, 64, 27), (199, 65, 28), + (200, 64, 30), (199, 63, 28), (199, 59, 23), (199, 52, 17), + (200, 43, 6), (199, 42, 4), (199, 41, 3), (196, 38, 1), + (191, 36, 0), (182, 32, 0), (170, 29, 0), (158, 20, 0), + (145, 17, 0), (132, 15, 1), (119, 13, 1), (108, 15, 3), + (95, 17, 5), (81, 22, 7), (71, 24, 10), (62, 23, 11), + (60, 23, 12), (62, 22, 11), (69, 20, 10), (83, 17, 11), + (96, 18, 11), (113, 21, 12), (128, 22, 13), (143, 22, 13), + (158, 23, 12), (169, 22, 10), (178, 18, 9), (185, 16, 10), + (189, 16, 18), (189, 18, 27), (188, 20, 30), (188, 24, 32), + (187, 28, 31), (181, 30, 28), (174, 32, 22), (162, 32, 22), + (145, 33, 27), (131, 35, 31), (121, 36, 35), (122, 42, 40), + (130, 50, 44), (144, 61, 46), (158, 73, 51), (167, 84, 61), + (173, 96, 77), (176, 106, 92), (178, 116, 106), (184, 126, 118), + (194, 136, 129), (205, 143, 137), (211, 144, 138), (211, 144, 137), + (204, 140, 135), (190, 133, 129), (171, 123, 121), (152, 118, 114), + (137, 114, 108), (121, 107, 98), (102, 97, 87), (88, 86, 76), + (76, 75, 63), (68, 60, 48), (63, 50, 37), (65, 48, 32), + (75, 49, 29), (81, 52, 28), (98, 55, 31), (110, 57, 32), + (122, 53, 29), (130, 48, 24), (135, 43, 21), (141, 40, 18) + ), + +// 424 040221-78 +((152, 87, 41), (157, 79, 29), (147, 70, 22), (138, 62, 16), + (118, 50, 14), (99, 39, 13), (96, 38, 12), (93, 37, 11), + (90, 32, 7), (94, 31, 5), (98, 31, 3), (104, 33, 3), + (110, 35, 3), (115, 38, 3), (120, 42, 4), (122, 43, 3), + (124, 44, 3), (137, 49, 3), (145, 51, 4), (154, 54, 5), + (162, 58, 7), (171, 62, 9), (172, 62, 10), (174, 63, 11), + (165, 60, 11), (150, 56, 12), (136, 52, 13), (123, 50, 15), + (111, 48, 18), (107, 47, 20), (103, 47, 22), (100, 47, 25), + (98, 47, 26), (99, 48, 26), (102, 51, 27), (105, 54, 28), + (109, 56, 30), (114, 59, 33), (116, 60, 34), (119, 62, 35), + (128, 64, 36), (129, 64, 35), (130, 65, 35), (127, 63, 35), + (125, 61, 36), (124, 61, 36), (124, 62, 37), (124, 65, 39), + (125, 67, 41), (125, 70, 43), (119, 68, 43), (113, 66, 43), + (107, 63, 41), (102, 61, 40), (99, 60, 40), (97, 59, 40), + (95, 61, 42), (89, 58, 39), (83, 55, 37), (74, 47, 31), + (65, 39, 26), (58, 35, 24), (52, 31, 22), (42, 26, 19), + (37, 23, 18), (28, 18, 14), (29, 17, 13), (30, 16, 12), + (30, 16, 11), (31, 16, 11), (32, 17, 11), (34, 20, 14), + (46, 30, 23), (57, 36, 25), (68, 43, 28), (79, 48, 30), + (90, 54, 33), (94, 56, 33), (98, 58, 34), (102, 62, 38), + (105, 65, 41), (113, 70, 41), (116, 70, 38), (119, 71, 36), + (120, 70, 34), (121, 69, 33), (120, 68, 32), (117, 65, 33), + (112, 61, 33), (110, 59, 31), (108, 58, 30), (106, 57, 30), + (105, 57, 30), (102, 57, 30), (99, 56, 30), (94, 54, 30), + (91, 53, 32), (87, 50, 31), (86, 48, 29), (86, 46, 27), + (87, 45, 26), (88, 44, 25), (88, 40, 22), (86, 36, 19), + (82, 31, 13), (84, 31, 12), (87, 31, 11), (91, 32, 11), + (95, 34, 11), (107, 38, 14), (120, 41, 17), (132, 48, 21), + (143, 55, 25), (161, 66, 30), (165, 70, 31), (170, 75, 32), + (179, 84, 36), (188, 91, 38), (196, 96, 40), (198, 101, 43), + (192, 97, 41), (184, 92, 38), (177, 87, 35), (171, 85, 34), + (166, 83, 33), (156, 78, 29), (146, 74, 29), (136, 73, 29), + (127, 67, 28), (112, 56, 25), (109, 53, 24), (106, 51, 24), + (101, 47, 22), (97, 43, 21), (93, 44, 22), (91, 44, 23), + (86, 42, 23), (83, 41, 22), (80, 40, 21), (78, 39, 20), + (77, 38, 19), (75, 37, 18), (73, 37, 18), (72, 37, 19), + (72, 37, 20), (70, 38, 23), (69, 38, 23), (69, 38, 23), + (68, 38, 23), (68, 38, 24), (68, 39, 25), (70, 40, 25), + (69, 40, 25), (67, 39, 24), (66, 38, 24), (60, 35, 22), + (54, 32, 20), (48, 29, 18), (42, 25, 17), (38, 24, 16), + (38, 24, 16), (43, 28, 18), (45, 30, 18), (47, 32, 19), + (54, 37, 20), (64, 42, 21), (75, 48, 22), (87, 54, 25), + (112, 66, 30), (116, 67, 30), (121, 69, 31), (127, 74, 31), + (134, 77, 29), (143, 80, 28), (150, 82, 27), (156, 83, 28), + (161, 81, 29), (164, 77, 28), (162, 73, 28), (160, 71, 23), + (163, 69, 19), (168, 71, 15), (176, 76, 13), (184, 82, 15), + (195, 91, 23), (194, 90, 24), (194, 90, 25), (196, 89, 26), + (194, 87, 27), (193, 85, 24), (192, 86, 23), (192, 88, 22), + (188, 86, 21), (179, 82, 21), (172, 77, 22), (164, 71, 22), + (158, 61, 20), (154, 55, 18), (156, 54, 19), (159, 57, 19), + (163, 62, 20), (168, 69, 25), (174, 83, 37), (181, 91, 44), + (187, 98, 45), (192, 104, 51), (193, 106, 55), (195, 110, 56), + (194, 109, 54), (192, 115, 62), (188, 115, 69), (185, 117, 66), + (181, 113, 66), (176, 103, 63), (173, 94, 56), (171, 78, 43), + (169, 66, 33), (165, 54, 29), (160, 48, 23), (155, 41, 20), + (150, 33, 16), (142, 30, 13), (138, 26, 10), (133, 23, 8), + (131, 20, 8), (125, 22, 7), (119, 22, 9), (112, 21, 10), + (102, 24, 11), (94, 26, 11), (87, 27, 10), (83, 27, 10), + (80, 27, 9), (76, 30, 10), (74, 30, 11), (75, 31, 11), + (76, 32, 11), (77, 34, 11), (80, 35, 11), (83, 34, 12), + (85, 35, 12), (84, 36, 15), (83, 37, 18), (84, 39, 22), + (84, 45, 26), (88, 52, 32), (94, 59, 40), (104, 67, 45), + (117, 77, 48), (130, 86, 48), (130, 85, 48), (129, 85, 47), + (129, 83, 45), (127, 83, 46), (129, 80, 46), (132, 81, 46) + ), + +// 425 040221-80 +((59, 60, 92), (51, 53, 84), (50, 51, 83), (49, 50, 83), + (46, 47, 81), (44, 45, 80), (43, 45, 79), (43, 45, 78), + (44, 45, 75), (45, 45, 76), (46, 46, 78), (46, 46, 80), + (47, 47, 83), (45, 46, 82), (44, 45, 82), (43, 44, 79), + (42, 43, 77), (36, 37, 68), (33, 34, 65), (30, 31, 62), + (30, 30, 61), (31, 30, 60), (32, 31, 61), (33, 33, 62), + (45, 45, 71), (51, 51, 79), (57, 58, 87), (64, 65, 96), + (72, 72, 105), (75, 76, 109), (79, 80, 114), (85, 86, 121), + (94, 95, 130), (108, 109, 144), (110, 111, 147), (112, 114, 151), + (108, 110, 149), (104, 106, 147), (101, 102, 144), (98, 99, 141), + (85, 85, 125), (77, 77, 116), (70, 70, 108), (62, 62, 98), + (54, 55, 89), (50, 50, 84), (46, 46, 80), (38, 38, 72), + (31, 31, 64), (26, 25, 56), (29, 27, 55), (32, 30, 55), + (38, 37, 59), (45, 44, 64), (48, 47, 68), (51, 50, 72), + (66, 66, 90), (75, 75, 100), (84, 84, 110), (93, 93, 118), + (103, 102, 127), (105, 104, 129), (108, 107, 132), (111, 110, 137), + (114, 113, 140), (124, 123, 151), (132, 131, 158), (140, 140, 165), + (143, 143, 168), (147, 147, 171), (154, 154, 176), (157, 158, 180), + (162, 162, 182), (161, 161, 181), (160, 161, 181), (156, 158, 179), + (153, 156, 177), (149, 152, 174), (146, 149, 171), (136, 139, 160), + (127, 128, 148), (104, 104, 121), (90, 90, 107), (76, 77, 93), + (69, 70, 85), (63, 64, 78), (51, 51, 63), (41, 41, 49), + (28, 27, 29), (25, 24, 23), (22, 21, 17), (21, 20, 16), + (21, 20, 16), (21, 21, 19), (21, 22, 23), (21, 22, 27), + (22, 22, 31), (22, 22, 34), (21, 20, 33), (20, 19, 32), + (19, 18, 32), (19, 18, 32), (19, 18, 33), (19, 18, 34), + (22, 21, 38), (25, 24, 41), (29, 28, 44), (31, 30, 46), + (34, 32, 49), (40, 37, 56), (47, 43, 62), (53, 49, 68), + (57, 54, 74), (63, 60, 86), (63, 61, 88), (64, 62, 91), + (64, 62, 96), (64, 62, 98), (64, 60, 96), (60, 58, 90), + (52, 50, 77), (46, 44, 68), (40, 39, 60), (36, 36, 56), + (33, 34, 53), (28, 28, 45), (25, 24, 37), (23, 22, 34), + (24, 23, 35), (29, 29, 42), (30, 31, 46), (32, 33, 51), + (36, 37, 59), (40, 41, 66), (42, 44, 72), (47, 49, 81), + (61, 63, 100), (71, 73, 112), (81, 84, 125), (87, 90, 131), + (94, 97, 138), (105, 108, 146), (116, 119, 155), (126, 129, 161), + (135, 137, 166), (151, 154, 177), (156, 159, 180), (161, 165, 184), + (172, 176, 192), (180, 184, 198), (186, 189, 204), (189, 191, 207), + (186, 189, 205), (182, 185, 202), (178, 181, 200), (172, 175, 198), + (164, 167, 192), (154, 158, 187), (143, 146, 179), (131, 133, 167), + (118, 120, 155), (88, 88, 124), (81, 81, 116), (74, 74, 108), + (61, 61, 95), (49, 49, 83), (37, 38, 70), (29, 28, 58), + (15, 15, 36), (13, 12, 31), (11, 10, 26), (8, 7, 20), + (7, 6, 15), (6, 5, 11), (6, 5, 10), (6, 6, 9), + (6, 6, 8), (7, 7, 8), (9, 8, 8), (10, 10, 8), + (11, 11, 8), (11, 11, 8), (10, 11, 9), (10, 11, 8), + (10, 11, 8), (10, 10, 8), (10, 10, 8), (10, 10, 8), + (9, 9, 7), (8, 9, 7), (7, 8, 6), (6, 7, 5), + (6, 7, 4), (5, 6, 3), (5, 6, 3), (5, 6, 2), + (5, 6, 2), (4, 5, 2), (4, 5, 2), (3, 4, 3), + (3, 4, 4), (3, 4, 6), (4, 4, 7), (4, 5, 10), + (5, 5, 12), (5, 6, 14), (5, 5, 16), (5, 5, 18), + (5, 6, 20), (5, 6, 21), (5, 6, 22), (6, 6, 23), + (6, 6, 25), (6, 6, 25), (5, 5, 24), (5, 5, 24), + (6, 6, 24), (7, 7, 25), (9, 9, 28), (13, 13, 33), + (18, 18, 39), (22, 23, 46), (27, 28, 53), (30, 31, 59), + (33, 34, 62), (34, 35, 63), (35, 36, 63), (36, 37, 62), + (37, 38, 61), (38, 39, 61), (39, 41, 61), (40, 42, 60), + (41, 42, 60), (43, 43, 61), (47, 48, 64), (54, 54, 68), + (63, 63, 75), (74, 74, 84), (84, 86, 93), (94, 95, 103), + (103, 104, 111), (110, 110, 121), (114, 114, 129), (119, 120, 138), + (124, 125, 146), (127, 129, 152), (128, 131, 156), (129, 132, 155), + (128, 130, 156), (122, 124, 152), (114, 116, 146), (103, 106, 138), + (92, 95, 128), (81, 84, 119), (70, 73, 107), (63, 65, 99) + ), + +// 426 040221-81 +((168, 37, 1), (168, 35, 1), (168, 30, 1), (169, 25, 1), + (166, 20, 2), (163, 15, 3), (161, 14, 3), (160, 14, 3), + (160, 22, 8), (167, 32, 15), (174, 43, 22), (179, 53, 30), + (185, 64, 39), (187, 71, 41), (190, 78, 44), (192, 80, 44), + (195, 82, 44), (208, 93, 46), (213, 98, 51), (218, 103, 57), + (220, 103, 58), (222, 103, 59), (220, 99, 56), (219, 96, 54), + (205, 76, 43), (189, 70, 42), (174, 65, 41), (165, 63, 41), + (156, 61, 41), (152, 59, 39), (149, 58, 38), (148, 51, 31), + (142, 47, 23), (128, 48, 12), (134, 52, 10), (141, 56, 9), + (158, 60, 8), (175, 64, 7), (182, 65, 7), (189, 67, 7), + (204, 75, 12), (205, 76, 15), (207, 78, 19), (197, 73, 19), + (187, 69, 20), (178, 65, 20), (169, 62, 20), (150, 54, 19), + (130, 47, 20), (116, 34, 18), (109, 28, 15), (103, 23, 12), + (98, 20, 9), (94, 17, 6), (92, 17, 6), (90, 18, 6), + (112, 16, 5), (125, 16, 5), (139, 17, 6), (145, 22, 5), + (152, 28, 4), (153, 29, 5), (154, 31, 7), (154, 33, 7), + (154, 32, 8), (148, 28, 9), (136, 30, 10), (125, 33, 12), + (119, 34, 13), (113, 35, 14), (107, 39, 20), (109, 46, 29), + (127, 67, 48), (131, 79, 57), (136, 91, 66), (138, 100, 71), + (141, 110, 76), (149, 113, 75), (157, 117, 75), (174, 123, 72), + (189, 126, 70), (201, 125, 59), (198, 119, 52), (196, 114, 45), + (196, 112, 41), (196, 110, 37), (197, 108, 32), (202, 111, 33), + (206, 119, 46), (209, 126, 58), (213, 134, 70), (215, 139, 74), + (218, 144, 79), (224, 153, 88), (233, 164, 97), (239, 170, 103), + (242, 173, 108), (244, 174, 115), (246, 173, 116), (248, 172, 118), + (249, 173, 119), (250, 175, 120), (252, 178, 124), (252, 184, 132), + (252, 195, 143), (251, 194, 144), (251, 194, 146), (251, 192, 145), + (251, 190, 144), (248, 186, 143), (245, 181, 138), (242, 176, 133), + (242, 166, 124), (242, 147, 108), (242, 144, 103), (242, 141, 98), + (241, 134, 88), (238, 130, 83), (238, 122, 77), (240, 118, 75), + (241, 110, 73), (240, 115, 73), (239, 120, 73), (238, 121, 72), + (238, 123, 71), (236, 125, 68), (235, 120, 66), (232, 110, 57), + (228, 98, 49), (218, 80, 35), (216, 77, 31), (214, 75, 27), + (211, 74, 27), (209, 71, 25), (207, 68, 23), (206, 65, 25), + (212, 67, 41), (215, 79, 52), (218, 92, 64), (220, 100, 70), + (222, 108, 76), (226, 126, 88), (231, 144, 101), (238, 155, 116), + (244, 169, 127), (252, 192, 140), (252, 195, 139), (253, 199, 139), + (253, 201, 133), (252, 196, 125), (250, 185, 114), (249, 174, 101), + (243, 152, 74), (241, 148, 67), (240, 144, 61), (236, 136, 49), + (229, 125, 36), (222, 114, 25), (213, 98, 15), (206, 85, 8), + (201, 77, 4), (195, 72, 2), (195, 72, 2), (195, 73, 2), + (195, 72, 2), (192, 66, 3), (190, 59, 2), (188, 53, 2), + (184, 43, 3), (185, 43, 3), (186, 43, 3), (183, 42, 3), + (178, 40, 3), (171, 36, 3), (156, 32, 6), (138, 29, 9), + (125, 29, 14), (121, 32, 20), (120, 37, 23), (130, 45, 28), + (138, 56, 37), (144, 66, 47), (146, 80, 58), (155, 95, 73), + (176, 117, 85), (185, 121, 88), (195, 126, 91), (212, 128, 94), + (222, 129, 93), (230, 130, 93), (232, 131, 91), (231, 133, 84), + (231, 135, 78), (231, 134, 74), (228, 130, 68), (224, 117, 61), + (215, 105, 53), (197, 96, 46), (179, 89, 38), (162, 85, 35), + (146, 86, 36), (140, 81, 39), (140, 72, 38), (137, 66, 38), + (137, 61, 38), (139, 59, 40), (137, 69, 49), (144, 81, 62), + (159, 94, 72), (174, 107, 80), (192, 119, 89), (212, 130, 98), + (224, 143, 108), (235, 157, 121), (242, 172, 133), (244, 184, 141), + (245, 190, 144), (245, 194, 147), (244, 192, 146), (245, 188, 142), + (245, 185, 137), (246, 180, 129), (246, 173, 120), (245, 167, 108), + (244, 161, 97), (241, 153, 86), (236, 145, 74), (232, 138, 59), + (228, 128, 50), (226, 118, 39), (226, 110, 33), (226, 106, 32), + (225, 107, 33), (222, 111, 32), (219, 114, 33), (215, 111, 30), + (211, 101, 27), (206, 89, 27), (203, 78, 26), (200, 72, 30), + (194, 69, 31), (188, 68, 27), (181, 61, 21), (174, 50, 16), + (165, 36, 7), (157, 25, 4), (151, 17, 3), (148, 16, 3), + (146, 17, 1), (148, 24, 1), (152, 33, 0), (154, 32, 0), + (157, 32, 1), (161, 32, 2), (163, 29, 1), (164, 27, 1) + ), + +// 427 040221-84 +((129, 81, 52), (116, 71, 50), (101, 62, 46), (87, 53, 43), + (83, 49, 38), (79, 46, 34), (82, 44, 33), (85, 43, 32), + (96, 43, 28), (99, 43, 27), (103, 43, 27), (106, 43, 25), + (109, 43, 24), (109, 43, 24), (110, 44, 25), (110, 43, 25), + (111, 43, 25), (116, 43, 25), (119, 44, 23), (122, 45, 22), + (127, 47, 21), (133, 50, 21), (136, 53, 23), (140, 56, 26), + (151, 63, 30), (155, 64, 28), (160, 65, 27), (162, 66, 28), + (165, 67, 29), (165, 68, 30), (165, 70, 32), (158, 72, 34), + (152, 72, 36), (128, 65, 35), (116, 62, 36), (104, 60, 38), + (91, 62, 39), (79, 65, 41), (74, 65, 40), (69, 65, 40), + (45, 65, 40), (42, 62, 40), (39, 60, 41), (45, 60, 40), + (52, 60, 39), (53, 59, 39), (54, 59, 40), (53, 60, 40), + (54, 59, 42), (53, 59, 43), (53, 60, 43), (54, 62, 44), + (48, 64, 49), (43, 67, 55), (40, 69, 58), (38, 71, 61), + (29, 81, 69), (29, 91, 76), (29, 101, 84), (30, 104, 86), + (31, 107, 88), (31, 107, 88), (31, 108, 89), (32, 101, 82), + (39, 101, 80), (52, 102, 77), (57, 97, 70), (63, 93, 63), + (71, 86, 58), (79, 79, 54), (82, 63, 44), (87, 55, 39), + (92, 45, 31), (89, 45, 32), (86, 46, 33), (80, 51, 36), + (75, 56, 40), (72, 60, 42), (70, 64, 45), (57, 71, 49), + (48, 73, 52), (37, 74, 60), (33, 74, 62), (29, 75, 64), + (28, 74, 64), (27, 74, 64), (26, 72, 61), (27, 69, 58), + (29, 58, 52), (29, 55, 50), (30, 53, 48), (29, 52, 47), + (29, 51, 46), (29, 51, 46), (29, 51, 46), (30, 52, 47), + (30, 55, 48), (31, 62, 54), (31, 64, 57), (31, 67, 61), + (32, 67, 60), (33, 68, 60), (36, 68, 61), (38, 68, 61), + (42, 72, 60), (40, 73, 60), (39, 75, 61), (38, 75, 61), + (38, 75, 61), (37, 74, 62), (37, 75, 60), (37, 75, 60), + (35, 75, 60), (30, 75, 59), (28, 73, 59), (27, 72, 59), + (26, 71, 58), (26, 69, 56), (25, 67, 56), (26, 65, 54), + (27, 62, 53), (27, 61, 53), (27, 60, 54), (27, 60, 54), + (28, 60, 54), (28, 60, 55), (28, 61, 55), (28, 62, 54), + (28, 63, 54), (28, 65, 56), (27, 65, 57), (27, 66, 59), + (27, 67, 61), (26, 68, 61), (26, 69, 60), (26, 69, 60), + (26, 68, 59), (26, 66, 60), (27, 65, 61), (27, 64, 59), + (28, 64, 57), (29, 61, 55), (32, 59, 51), (36, 57, 45), + (43, 57, 39), (69, 55, 34), (73, 56, 33), (77, 57, 32), + (82, 58, 31), (87, 57, 32), (87, 58, 33), (87, 63, 36), + (96, 80, 44), (97, 83, 45), (98, 86, 47), (101, 86, 48), + (99, 84, 46), (91, 77, 46), (86, 75, 46), (85, 74, 46), + (84, 73, 45), (88, 63, 40), (87, 59, 37), (86, 55, 34), + (81, 48, 29), (78, 42, 27), (74, 41, 26), (73, 39, 26), + (75, 38, 26), (75, 37, 26), (75, 36, 27), (75, 38, 28), + (73, 38, 29), (69, 40, 30), (66, 42, 31), (65, 42, 32), + (66, 43, 31), (70, 44, 31), (74, 44, 30), (75, 43, 30), + (72, 42, 30), (66, 42, 31), (61, 43, 32), (58, 43, 32), + (69, 42, 28), (72, 41, 27), (76, 41, 26), (79, 41, 26), + (82, 40, 27), (82, 39, 28), (83, 40, 27), (85, 39, 28), + (87, 40, 27), (87, 40, 27), (84, 42, 28), (80, 43, 29), + (75, 45, 31), (71, 45, 34), (66, 47, 35), (61, 46, 34), + (56, 45, 34), (52, 48, 34), (52, 48, 34), (56, 47, 33), + (62, 49, 33), (72, 48, 32), (82, 48, 30), (93, 47, 27), + (104, 46, 25), (116, 47, 23), (124, 48, 21), (133, 52, 19), + (139, 55, 19), (140, 56, 20), (138, 58, 21), (133, 58, 24), + (123, 58, 27), (113, 57, 29), (106, 59, 30), (99, 57, 31), + (95, 54, 31), (93, 55, 32), (90, 54, 34), (87, 52, 35), + (89, 51, 34), (94, 49, 31), (101, 47, 27), (111, 48, 25), + (119, 48, 23), (126, 51, 25), (131, 58, 29), (136, 65, 37), + (144, 65, 40), (147, 65, 43), (149, 63, 40), (149, 60, 39), + (150, 58, 37), (145, 64, 40), (147, 63, 43), (145, 62, 46), + (143, 58, 44), (140, 53, 41), (138, 46, 33), (131, 46, 28), + (126, 45, 28), (121, 47, 29), (120, 51, 31), (123, 56, 34), + (129, 64, 37), (141, 77, 42), (153, 81, 48), (140, 82, 51), + (131, 80, 52), (122, 82, 53), (111, 77, 52), (110, 82, 50) + ), + +// 428 040221-85 +((13, 33, 5), (13, 29, 6), (13, 27, 6), (14, 26, 6), + (14, 26, 5), (15, 26, 5), (14, 25, 5), (14, 25, 6), + (19, 30, 12), (25, 35, 12), (32, 40, 13), (38, 52, 13), + (45, 64, 14), (47, 79, 12), (50, 95, 10), (49, 101, 11), + (48, 108, 13), (52, 112, 12), (53, 111, 12), (54, 111, 12), + (53, 111, 9), (52, 112, 6), (49, 112, 6), (46, 113, 6), + (37, 101, 2), (31, 86, 2), (26, 71, 2), (22, 57, 2), + (19, 43, 2), (18, 40, 2), (17, 37, 3), (17, 36, 3), + (18, 39, 2), (27, 61, 2), (30, 69, 1), (34, 78, 1), + (34, 79, 1), (35, 81, 2), (34, 79, 2), (33, 77, 3), + (33, 79, 4), (34, 82, 3), (36, 85, 3), (34, 82, 2), + (33, 79, 2), (31, 73, 2), (29, 68, 3), (24, 55, 3), + (20, 44, 6), (20, 36, 14), (27, 43, 19), (34, 51, 24), + (45, 63, 36), (56, 76, 48), (64, 83, 55), (72, 90, 63), + (101, 120, 89), (111, 127, 91), (122, 135, 94), (125, 136, 91), + (129, 138, 89), (130, 139, 92), (132, 141, 96), (131, 148, 103), + (132, 152, 113), (125, 153, 120), (115, 141, 103), (106, 130, 87), + (98, 122, 79), (91, 115, 71), (76, 104, 59), (63, 96, 52), + (47, 96, 53), (43, 92, 51), (39, 88, 50), (35, 80, 40), + (31, 72, 31), (29, 68, 26), (27, 64, 22), (23, 58, 15), + (20, 54, 7), (14, 45, 9), (13, 41, 10), (12, 37, 12), + (12, 34, 13), (13, 32, 15), (13, 28, 18), (14, 29, 20), + (22, 47, 35), (34, 64, 47), (46, 82, 59), (56, 90, 68), + (66, 99, 78), (84, 113, 97), (104, 128, 113), (122, 143, 133), + (140, 158, 149), (167, 194, 177), (179, 208, 184), (191, 223, 191), + (193, 225, 191), (195, 227, 191), (193, 221, 189), (187, 209, 181), + (160, 177, 159), (145, 163, 141), (130, 150, 123), (122, 143, 114), + (114, 137, 106), (97, 123, 91), (78, 109, 77), (60, 96, 66), + (48, 85, 61), (47, 80, 61), (50, 82, 62), (53, 84, 63), + (62, 90, 69), (71, 97, 78), (73, 100, 82), (73, 101, 86), + (74, 105, 91), (75, 104, 88), (76, 104, 85), (78, 104, 84), + (80, 105, 83), (78, 102, 76), (72, 95, 68), (64, 84, 59), + (54, 77, 49), (34, 59, 27), (31, 56, 23), (28, 54, 20), + (22, 52, 13), (19, 52, 8), (19, 50, 5), (18, 50, 4), + (20, 53, 5), (22, 54, 10), (25, 56, 15), (27, 60, 19), + (30, 65, 24), (40, 75, 35), (50, 85, 47), (62, 98, 58), + (74, 109, 69), (93, 125, 86), (94, 130, 88), (96, 135, 90), + (100, 145, 89), (102, 154, 90), (102, 160, 88), (103, 161, 84), + (99, 148, 76), (94, 142, 73), (90, 137, 71), (80, 125, 58), + (69, 116, 46), (57, 106, 33), (46, 95, 20), (36, 81, 13), + (29, 68, 7), (19, 41, 7), (17, 37, 7), (16, 33, 7), + (15, 29, 7), (14, 27, 7), (14, 27, 8), (15, 28, 9), + (16, 30, 13), (16, 31, 14), (17, 32, 16), (17, 34, 17), + (18, 36, 19), (18, 37, 20), (18, 38, 21), (20, 38, 23), + (20, 39, 25), (20, 42, 28), (20, 44, 30), (19, 46, 35), + (19, 49, 38), (20, 51, 41), (23, 55, 45), (30, 59, 52), + (57, 82, 74), (65, 90, 83), (73, 98, 92), (91, 115, 109), + (109, 131, 126), (123, 146, 140), (138, 158, 154), (153, 170, 166), + (168, 182, 177), (181, 195, 188), (193, 206, 199), (201, 214, 208), + (203, 221, 216), (202, 227, 225), (201, 231, 228), (195, 231, 230), + (185, 227, 226), (176, 222, 220), (167, 216, 213), (156, 205, 202), + (144, 195, 193), (136, 187, 184), (127, 180, 178), (118, 170, 168), + (107, 160, 157), (99, 151, 146), (91, 140, 132), (80, 125, 118), + (73, 116, 106), (67, 112, 104), (65, 107, 101), (62, 103, 98), + (58, 103, 97), (60, 106, 98), (64, 107, 99), (69, 110, 99), + (76, 118, 105), (83, 122, 114), (90, 126, 120), (90, 132, 127), + (93, 136, 131), (96, 138, 131), (98, 139, 130), (100, 142, 128), + (101, 143, 128), (104, 145, 125), (103, 147, 117), (102, 154, 107), + (98, 153, 93), (94, 152, 84), (91, 154, 80), (91, 154, 81), + (95, 157, 90), (104, 160, 100), (119, 176, 113), (131, 185, 115), + (144, 191, 108), (150, 197, 98), (151, 196, 88), (143, 186, 82), + (133, 171, 81), (126, 163, 85), (118, 153, 89), (114, 142, 86), + (109, 133, 78), (104, 126, 66), (90, 116, 48), (74, 101, 30), + (57, 85, 15), (40, 69, 8), (26, 54, 6), (17, 42, 5) + ), + +// 429 040221-86 +((134, 121, 111), (121, 114, 111), (114, 110, 106), (107, 107, 101), + (114, 114, 103), (121, 122, 106), (127, 126, 105), (133, 130, 105), + (148, 145, 99), (150, 148, 97), (153, 152, 95), (146, 144, 95), + (140, 137, 95), (131, 129, 97), (122, 121, 100), (120, 120, 101), + (118, 119, 103), (109, 112, 104), (109, 111, 103), (109, 111, 103), + (114, 110, 100), (120, 109, 98), (121, 106, 94), (123, 104, 91), + (117, 98, 77), (113, 95, 75), (110, 93, 74), (107, 85, 73), + (104, 77, 72), (102, 76, 72), (101, 75, 72), (104, 78, 75), + (112, 88, 77), (141, 109, 78), (157, 119, 82), (173, 129, 86), + (190, 141, 88), (208, 154, 91), (213, 158, 88), (218, 162, 86), + (217, 172, 91), (215, 176, 102), (214, 180, 113), (211, 177, 110), + (208, 174, 108), (204, 170, 104), (201, 167, 101), (200, 161, 99), + (199, 157, 100), (200, 144, 93), (197, 132, 81), (195, 120, 70), + (196, 119, 68), (197, 118, 66), (198, 119, 68), (199, 121, 71), + (193, 125, 79), (187, 131, 87), (182, 138, 95), (173, 140, 105), + (165, 142, 115), (160, 140, 118), (155, 138, 122), (147, 135, 125), + (145, 136, 123), (151, 134, 118), (155, 132, 119), (159, 131, 121), + (164, 134, 121), (170, 138, 122), (181, 145, 127), (193, 156, 131), + (194, 166, 142), (186, 163, 146), (179, 160, 150), (176, 164, 156), + (173, 168, 163), (173, 172, 168), (173, 176, 173), (171, 175, 176), + (169, 173, 176), (174, 174, 170), (181, 182, 172), (188, 190, 175), + (190, 191, 174), (192, 192, 173), (189, 188, 165), (185, 182, 153), + (174, 165, 134), (171, 155, 120), (169, 145, 106), (165, 139, 97), + (162, 133, 89), (156, 121, 75), (149, 107, 65), (145, 93, 53), + (142, 80, 42), (127, 57, 22), (120, 50, 16), (114, 43, 11), + (114, 43, 11), (115, 44, 12), (120, 47, 11), (124, 54, 15), + (134, 65, 21), (140, 73, 24), (146, 81, 28), (148, 84, 29), + (151, 88, 30), (155, 91, 30), (159, 91, 32), (160, 91, 33), + (162, 90, 35), (159, 91, 38), (156, 91, 41), (153, 91, 44), + (142, 89, 51), (132, 84, 57), (125, 82, 63), (118, 79, 65), + (98, 79, 76), (96, 79, 81), (95, 79, 86), (98, 78, 84), + (101, 78, 82), (105, 78, 74), (111, 77, 69), (114, 73, 64), + (125, 74, 63), (143, 78, 53), (146, 78, 50), (149, 79, 48), + (150, 77, 43), (156, 78, 43), (163, 88, 45), (168, 96, 46), + (172, 103, 47), (175, 104, 50), (178, 105, 53), (180, 107, 55), + (182, 110, 57), (186, 116, 61), (183, 119, 61), (177, 119, 61), + (170, 115, 63), (167, 108, 61), (167, 108, 60), (167, 108, 59), + (169, 115, 59), (171, 121, 66), (170, 125, 70), (170, 128, 75), + (162, 125, 83), (159, 124, 87), (157, 124, 92), (150, 120, 98), + (141, 118, 103), (129, 115, 104), (123, 110, 98), (119, 104, 92), + (116, 93, 86), (107, 73, 68), (104, 69, 63), (101, 66, 59), + (98, 62, 52), (96, 61, 51), (93, 63, 51), (91, 60, 49), + (71, 53, 50), (66, 51, 50), (61, 49, 50), (50, 48, 52), + (45, 42, 46), (40, 38, 40), (37, 34, 35), (35, 32, 32), + (37, 34, 35), (38, 35, 37), (38, 36, 40), (43, 39, 46), + (47, 44, 52), (57, 54, 62), (70, 70, 71), (83, 84, 78), + (109, 106, 87), (115, 109, 88), (121, 112, 89), (135, 121, 88), + (149, 129, 88), (161, 134, 83), (173, 137, 78), (179, 136, 74), + (181, 135, 71), (180, 131, 68), (174, 125, 63), (170, 115, 54), + (163, 103, 45), (148, 91, 40), (135, 83, 36), (123, 74, 31), + (117, 67, 25), (121, 63, 17), (120, 60, 15), (120, 65, 18), + (125, 71, 20), (134, 80, 24), (151, 95, 26), (168, 109, 33), + (180, 123, 44), (186, 137, 58), (193, 148, 76), (198, 160, 90), + (200, 167, 100), (202, 170, 108), (197, 171, 113), (195, 168, 118), + (194, 167, 122), (192, 165, 124), (191, 161, 121), (187, 157, 114), + (183, 146, 102), (178, 134, 88), (172, 124, 77), (159, 112, 72), + (146, 106, 72), (135, 100, 72), (126, 95, 70), (127, 95, 64), + (124, 91, 58), (121, 88, 54), (119, 86, 54), (116, 85, 54), + (121, 89, 53), (128, 92, 49), (127, 90, 48), (122, 84, 44), + (113, 75, 42), (102, 66, 41), (95, 63, 37), (82, 57, 39), + (71, 52, 42), (59, 50, 47), (54, 47, 51), (57, 51, 56), + (61, 56, 61), (72, 65, 66), (83, 77, 73), (97, 87, 76), + (113, 99, 82), (126, 108, 90), (142, 123, 98), (157, 137, 108), + (155, 135, 107), (149, 131, 105), (140, 122, 103), (129, 114, 102) + ), + +// 430 040221-88 +((71, 61, 35), (62, 67, 39), (60, 73, 48), (58, 79, 57), + (54, 84, 66), (51, 89, 75), (55, 93, 80), (60, 98, 85), + (70, 115, 92), (73, 122, 98), (76, 129, 104), (83, 134, 110), + (91, 139, 117), (103, 142, 124), (116, 145, 131), (121, 147, 133), + (126, 150, 135), (139, 156, 141), (138, 158, 139), (137, 161, 138), + (133, 162, 135), (130, 164, 133), (128, 164, 133), (127, 165, 133), + (125, 159, 130), (119, 152, 126), (113, 146, 123), (105, 138, 113), + (97, 130, 104), (92, 126, 99), (88, 122, 95), (83, 118, 90), + (85, 115, 86), (87, 111, 88), (87, 107, 87), (88, 104, 87), + (86, 98, 83), (84, 93, 79), (84, 90, 77), (85, 88, 75), + (85, 82, 68), (87, 78, 66), (89, 74, 65), (98, 67, 58), + (107, 61, 52), (110, 59, 52), (114, 58, 52), (117, 59, 55), + (124, 61, 58), (133, 79, 77), (144, 87, 87), (156, 95, 97), + (163, 101, 101), (170, 107, 106), (170, 108, 107), (170, 109, 109), + (151, 114, 104), (141, 115, 106), (132, 116, 108), (126, 112, 101), + (120, 108, 94), (115, 102, 90), (110, 97, 86), (98, 81, 71), + (83, 65, 53), (58, 40, 31), (51, 34, 26), (45, 28, 21), + (43, 25, 20), (41, 23, 19), (37, 18, 17), (33, 13, 14), + (27, 9, 11), (24, 8, 11), (21, 8, 11), (19, 8, 10), + (17, 9, 10), (17, 9, 9), (18, 10, 9), (20, 11, 9), + (24, 12, 7), (33, 12, 4), (36, 13, 3), (40, 14, 3), + (41, 13, 2), (42, 13, 2), (43, 13, 2), (44, 13, 3), + (49, 12, 6), (53, 12, 7), (57, 12, 9), (59, 12, 8), + (62, 12, 8), (65, 12, 7), (67, 11, 7), (69, 10, 5), + (68, 9, 7), (64, 8, 10), (64, 8, 9), (64, 8, 9), + (63, 8, 8), (62, 9, 8), (61, 10, 5), (60, 9, 4), + (54, 7, 4), (50, 5, 4), (47, 4, 4), (44, 4, 4), + (42, 5, 4), (37, 8, 3), (33, 8, 3), (32, 10, 4), + (32, 12, 5), (32, 16, 6), (32, 17, 7), (33, 19, 8), + (35, 23, 9), (38, 29, 12), (40, 37, 14), (45, 46, 16), + (58, 60, 23), (60, 61, 24), (62, 63, 26), (63, 63, 26), + (65, 63, 27), (63, 61, 27), (64, 63, 26), (66, 65, 25), + (72, 65, 26), (82, 58, 25), (85, 54, 24), (89, 51, 23), + (92, 43, 23), (93, 39, 25), (94, 41, 27), (96, 45, 32), + (100, 53, 46), (105, 53, 48), (110, 54, 50), (109, 54, 50), + (109, 55, 51), (112, 57, 51), (114, 63, 54), (115, 68, 63), + (116, 78, 73), (125, 96, 89), (124, 98, 91), (123, 101, 93), + (120, 104, 93), (118, 106, 90), (117, 108, 90), (116, 111, 92), + (124, 122, 100), (127, 123, 102), (130, 125, 104), (134, 126, 106), + (140, 121, 100), (144, 113, 91), (149, 104, 83), (146, 93, 73), + (142, 83, 63), (131, 65, 49), (128, 61, 45), (125, 57, 42), + (120, 48, 33), (121, 40, 28), (116, 35, 24), (106, 34, 27), + (85, 49, 42), (79, 57, 50), (74, 66, 59), (63, 81, 74), + (60, 91, 84), (64, 99, 90), (68, 109, 102), (78, 119, 110), + (82, 123, 115), (89, 134, 126), (92, 145, 135), (91, 146, 139), + (92, 142, 131), (90, 135, 125), (91, 127, 114), (87, 110, 96), + (81, 87, 71), (76, 80, 66), (72, 74, 62), (62, 62, 50), + (50, 49, 42), (39, 40, 33), (31, 31, 23), (26, 23, 16), + (24, 19, 11), (25, 15, 7), (28, 13, 3), (33, 10, 3), + (37, 9, 4), (41, 10, 4), (43, 11, 5), (43, 12, 6), + (43, 14, 7), (43, 18, 8), (44, 19, 8), (46, 21, 9), + (47, 23, 11), (49, 26, 13), (48, 29, 16), (48, 33, 20), + (46, 38, 24), (44, 41, 30), (46, 46, 34), (51, 52, 40), + (57, 60, 48), (64, 68, 55), (72, 75, 59), (79, 83, 63), + (83, 87, 67), (87, 90, 70), (92, 94, 72), (97, 98, 76), + (100, 100, 81), (105, 104, 81), (109, 106, 82), (108, 106, 79), + (106, 101, 75), (106, 96, 70), (106, 88, 63), (106, 79, 58), + (108, 72, 51), (112, 64, 46), (111, 58, 40), (109, 51, 34), + (107, 46, 29), (104, 39, 24), (98, 33, 18), (93, 29, 13), + (89, 23, 9), (84, 19, 4), (79, 16, 2), (75, 17, 3), + (71, 19, 5), (66, 24, 9), (62, 30, 14), (59, 36, 18), + (55, 43, 22), (52, 49, 25), (51, 50, 26), (54, 48, 25), + (60, 47, 24), (70, 47, 24), (70, 45, 24), (69, 47, 25), + (68, 51, 30), (67, 55, 32), (64, 55, 34), (62, 57, 34) + ), + +// 431 040221-89 +((25, 36, 53), (32, 40, 69), (33, 41, 74), (34, 42, 79), + (35, 43, 79), (37, 44, 80), (36, 48, 86), (35, 52, 92), + (32, 68, 120), (34, 74, 131), (37, 81, 143), (41, 84, 147), + (46, 87, 151), (49, 89, 152), (52, 92, 154), (53, 93, 155), + (55, 94, 157), (62, 106, 160), (69, 109, 163), (76, 113, 166), + (81, 115, 168), (87, 117, 171), (90, 116, 172), (94, 116, 173), + (101, 116, 171), (106, 115, 169), (111, 115, 168), (110, 115, 167), + (110, 116, 167), (108, 116, 166), (107, 116, 165), (101, 111, 163), + (95, 103, 155), (82, 82, 127), (74, 74, 117), (67, 66, 107), + (60, 68, 107), (54, 71, 108), (52, 72, 110), (50, 74, 113), + (55, 91, 130), (67, 101, 139), (79, 111, 149), (94, 126, 161), + (110, 142, 173), (116, 150, 179), (123, 158, 186), (140, 174, 199), + (154, 190, 214), (178, 202, 223), (185, 200, 218), (192, 199, 214), + (188, 186, 198), (184, 174, 183), (178, 168, 175), (173, 163, 168), + (141, 129, 135), (122, 112, 119), (103, 96, 103), (84, 78, 88), + (65, 61, 73), (58, 54, 67), (51, 48, 62), (43, 42, 56), + (42, 39, 54), (51, 56, 65), (65, 72, 80), (80, 89, 95), + (88, 97, 103), (97, 106, 112), (112, 125, 130), (128, 140, 147), + (157, 168, 175), (165, 173, 181), (174, 178, 187), (173, 174, 183), + (173, 171, 180), (169, 166, 175), (165, 161, 171), (158, 153, 159), + (144, 141, 146), (111, 110, 118), (93, 91, 100), (76, 72, 83), + (67, 62, 73), (58, 53, 64), (45, 39, 47), (34, 29, 33), + (21, 20, 20), (19, 19, 19), (18, 18, 18), (17, 18, 17), + (17, 18, 17), (18, 18, 17), (18, 18, 17), (18, 18, 16), + (17, 17, 16), (16, 18, 15), (15, 17, 15), (14, 17, 15), + (13, 16, 14), (13, 16, 13), (12, 15, 12), (12, 14, 11), + (13, 14, 12), (14, 15, 14), (16, 17, 16), (16, 17, 18), + (17, 18, 21), (19, 22, 28), (21, 28, 38), (26, 36, 51), + (32, 47, 69), (44, 71, 104), (47, 76, 112), (50, 82, 121), + (52, 88, 134), (50, 91, 141), (46, 90, 142), (45, 90, 141), + (41, 87, 136), (44, 88, 134), (47, 89, 132), (46, 90, 133), + (46, 91, 134), (42, 89, 133), (40, 87, 129), (40, 87, 127), + (45, 90, 126), (81, 109, 132), (91, 117, 137), (102, 126, 143), + (122, 144, 160), (139, 161, 177), (153, 177, 195), (163, 193, 211), + (192, 216, 236), (195, 218, 238), (199, 221, 241), (197, 219, 239), + (196, 217, 237), (187, 207, 228), (168, 192, 216), (152, 178, 200), + (137, 161, 185), (102, 127, 151), (92, 119, 143), (83, 111, 136), + (65, 93, 117), (48, 75, 100), (33, 61, 82), (24, 48, 67), + (16, 30, 42), (16, 27, 38), (16, 25, 35), (19, 22, 31), + (23, 25, 33), (30, 31, 39), (39, 38, 48), (50, 47, 61), + (60, 57, 75), (80, 74, 98), (83, 78, 102), (87, 82, 107), + (90, 88, 115), (94, 94, 120), (98, 97, 125), (99, 102, 131), + (102, 112, 145), (102, 114, 147), (102, 116, 149), (99, 118, 153), + (95, 116, 154), (89, 110, 150), (83, 102, 145), (74, 92, 138), + (70, 87, 135), (67, 82, 133), (63, 81, 134), (63, 81, 138), + (64, 80, 142), (66, 78, 143), (64, 74, 142), (63, 70, 135), + (53, 58, 115), (50, 55, 110), (48, 52, 105), (44, 48, 96), + (41, 43, 88), (39, 41, 82), (37, 40, 75), (36, 39, 69), + (35, 38, 64), (32, 37, 61), (31, 38, 59), (32, 36, 59), + (33, 35, 62), (34, 36, 65), (36, 38, 70), (43, 42, 76), + (47, 47, 86), (54, 57, 95), (65, 68, 109), (80, 85, 126), + (97, 103, 144), (112, 120, 160), (129, 134, 173), (144, 147, 184), + (156, 158, 194), (165, 164, 200), (167, 171, 204), (170, 177, 208), + (169, 181, 211), (167, 184, 212), (167, 187, 212), (169, 187, 210), + (164, 176, 205), (152, 163, 197), (137, 146, 184), (118, 129, 169), + (95, 110, 151), (74, 95, 133), (62, 84, 115), (53, 73, 101), + (49, 64, 91), (46, 56, 84), (44, 51, 79), (40, 46, 75), + (32, 45, 74), (27, 48, 75), (23, 53, 79), (21, 59, 85), + (20, 62, 92), (19, 66, 98), (20, 66, 101), (19, 65, 101), + (18, 64, 100), (16, 62, 99), (15, 60, 98), (13, 58, 96), + (11, 57, 93), (10, 52, 85), (10, 45, 74), (9, 38, 61), + (9, 30, 48), (9, 23, 37), (11, 17, 30), (14, 18, 30), + (15, 24, 37), (18, 28, 43), (21, 29, 43), (22, 30, 42), + (22, 30, 42), (21, 30, 40), (25, 28, 37), (24, 30, 41) + ), + +// 432 040221-90 +((2, 0, 1), (0, 0, 1), (0, 0, 1), (1, 0, 2), + (1, 0, 1), (2, 0, 0), (3, 0, 0), (4, 0, 0), + (8, 4, 1), (13, 9, 4), (18, 14, 7), (24, 20, 13), + (31, 27, 19), (35, 31, 23), (40, 36, 27), (40, 37, 28), + (41, 38, 30), (38, 34, 28), (32, 28, 22), (26, 23, 17), + (20, 18, 12), (15, 13, 8), (13, 11, 6), (12, 9, 4), + (14, 12, 6), (20, 17, 11), (27, 23, 17), (36, 32, 25), + (45, 41, 33), (50, 46, 37), (56, 51, 41), (62, 57, 47), + (64, 61, 49), (68, 60, 44), (65, 59, 43), (63, 58, 42), + (66, 60, 44), (70, 63, 47), (73, 66, 51), (76, 70, 55), + (92, 86, 70), (95, 90, 75), (99, 95, 80), (96, 93, 80), + (94, 91, 80), (91, 87, 76), (88, 84, 73), (81, 78, 66), + (74, 71, 59), (60, 56, 47), (58, 53, 44), (56, 51, 42), + (59, 53, 43), (62, 56, 45), (67, 60, 46), (72, 65, 47), + (104, 96, 61), (126, 115, 75), (148, 135, 89), (172, 159, 109), + (196, 184, 130), (196, 185, 139), (197, 186, 148), (188, 180, 136), + (180, 174, 126), (137, 132, 93), (133, 123, 80), (129, 114, 67), + (132, 120, 69), (135, 126, 72), (151, 141, 84), (166, 152, 98), + (168, 163, 120), (154, 149, 113), (141, 135, 106), (122, 117, 93), + (103, 99, 81), (93, 89, 70), (83, 79, 60), (70, 65, 44), + (58, 55, 31), (36, 34, 16), (31, 28, 10), (26, 23, 4), + (24, 21, 4), (22, 20, 4), (21, 18, 2), (21, 18, 1), + (22, 19, 5), (22, 19, 8), (23, 20, 11), (23, 20, 12), + (23, 21, 14), (24, 20, 16), (21, 17, 17), (19, 17, 16), + (18, 16, 15), (10, 8, 8), (9, 9, 6), (8, 11, 4), + (8, 10, 4), (9, 9, 4), (12, 13, 5), (19, 19, 6), + (43, 38, 21), (50, 46, 27), (58, 55, 33), (57, 53, 31), + (57, 52, 30), (58, 54, 40), (49, 46, 34), (36, 32, 20), + (28, 24, 15), (23, 18, 10), (22, 18, 10), (22, 18, 10), + (25, 19, 10), (28, 25, 12), (30, 28, 16), (32, 28, 18), + (33, 29, 20), (33, 28, 19), (33, 28, 19), (33, 27, 18), + (33, 27, 17), (35, 30, 15), (38, 36, 17), (43, 39, 19), + (45, 41, 20), (50, 47, 31), (50, 46, 32), (50, 46, 33), + (49, 45, 36), (49, 44, 38), (50, 45, 39), (49, 45, 37), + (52, 49, 35), (52, 49, 34), (53, 50, 33), (53, 50, 33), + (53, 51, 33), (53, 51, 35), (54, 51, 37), (55, 50, 37), + (55, 50, 35), (55, 48, 35), (54, 47, 34), (54, 47, 33), + (50, 44, 30), (47, 39, 26), (42, 37, 24), (39, 34, 22), + (39, 32, 20), (40, 33, 21), (42, 35, 23), (49, 41, 28), + (58, 51, 32), (71, 65, 39), (88, 82, 51), (108, 101, 62), + (127, 118, 76), (140, 131, 90), (139, 130, 92), (139, 130, 94), + (135, 126, 96), (117, 109, 85), (103, 99, 76), (97, 91, 71), + (85, 77, 59), (83, 75, 59), (81, 74, 59), (81, 74, 59), + (82, 75, 58), (83, 76, 61), (85, 80, 64), (89, 83, 66), + (91, 84, 68), (90, 84, 70), (89, 83, 69), (88, 81, 69), + (87, 79, 68), (83, 77, 63), (80, 73, 59), (76, 69, 53), + (59, 55, 36), (55, 50, 34), (51, 46, 32), (41, 37, 25), + (32, 28, 18), (26, 21, 18), (23, 17, 16), (21, 15, 14), + (21, 16, 14), (25, 20, 17), (31, 27, 21), (39, 34, 26), + (48, 44, 35), (56, 54, 44), (65, 62, 52), (73, 68, 58), + (76, 72, 59), (78, 74, 56), (80, 71, 54), (78, 66, 50), + (74, 66, 45), (73, 65, 42), (70, 62, 41), (66, 60, 40), + (63, 60, 37), (59, 56, 35), (54, 51, 32), (49, 43, 26), + (42, 37, 23), (37, 33, 22), (33, 28, 20), (30, 24, 20), + (29, 25, 21), (27, 24, 19), (28, 23, 19), (29, 25, 18), + (29, 26, 15), (28, 24, 12), (27, 24, 12), (26, 23, 9), + (24, 19, 6), (21, 16, 5), (16, 13, 3), (12, 9, 0), + (9, 8, 0), (5, 6, 0), (2, 3, 0), (1, 3, 0), + (2, 2, 0), (2, 1, 0), (3, 0, 0), (4, 0, 0), + (4, 0, 0), (4, 0, 0), (4, 0, 0), (5, 0, 0), + (6, 1, 0), (7, 2, 2), (8, 2, 3), (9, 4, 4), + (11, 5, 7), (12, 5, 8), (13, 8, 5), (13, 8, 5), + (12, 8, 4), (10, 9, 1), (8, 7, 0), (7, 5, 0), + (4, 3, 0), (3, 1, 0), (3, 0, 0), (2, 0, 0) + ), + +// 433 040221-91 +((118, 89, 90), (111, 85, 88), (100, 81, 83), (90, 77, 78), + (79, 75, 74), (69, 74, 70), (64, 73, 68), (59, 72, 67), + (41, 65, 61), (37, 62, 58), (33, 60, 56), (28, 59, 55), + (24, 58, 54), (20, 58, 56), (17, 59, 59), (17, 59, 59), + (17, 59, 60), (17, 62, 63), (17, 64, 67), (18, 67, 71), + (19, 65, 70), (21, 63, 69), (23, 62, 67), (25, 61, 65), + (29, 57, 58), (27, 52, 51), (25, 47, 44), (23, 40, 36), + (21, 33, 28), (21, 31, 26), (21, 30, 24), (19, 28, 20), + (17, 29, 21), (8, 28, 23), (5, 27, 23), (3, 27, 23), + (3, 27, 24), (3, 28, 25), (3, 28, 25), (4, 28, 26), + (10, 30, 29), (12, 32, 30), (15, 34, 32), (18, 39, 36), + (21, 44, 41), (24, 47, 44), (28, 51, 48), (31, 58, 56), + (36, 64, 63), (56, 82, 81), (71, 90, 88), (86, 98, 96), + (92, 98, 96), (98, 99, 96), (100, 98, 94), (102, 98, 93), + (104, 92, 88), (95, 87, 83), (86, 83, 79), (71, 74, 70), + (56, 65, 61), (48, 61, 57), (41, 57, 54), (28, 52, 50), + (17, 48, 46), (5, 38, 36), (5, 36, 33), (5, 35, 31), + (5, 35, 31), (6, 36, 31), (10, 38, 34), (16, 41, 36), + (30, 46, 43), (38, 52, 50), (46, 59, 58), (60, 67, 68), + (75, 75, 79), (81, 79, 83), (87, 84, 88), (95, 89, 91), + (96, 91, 93), (91, 92, 91), (87, 92, 90), (84, 93, 90), + (81, 91, 88), (78, 90, 86), (70, 87, 80), (64, 83, 75), + (69, 88, 81), (85, 96, 90), (101, 105, 99), (110, 111, 104), + (120, 117, 109), (140, 127, 119), (156, 138, 129), (171, 144, 138), + (182, 146, 143), (177, 141, 138), (162, 133, 128), (148, 125, 119), + (139, 118, 112), (130, 111, 106), (109, 97, 94), (85, 83, 82), + (47, 63, 59), (36, 57, 53), (25, 52, 48), (22, 50, 47), + (19, 49, 46), (17, 49, 46), (19, 49, 46), (24, 49, 47), + (32, 50, 48), (53, 59, 56), (57, 61, 58), (61, 64, 60), + (71, 67, 63), (78, 68, 62), (85, 69, 64), (89, 71, 64), + (90, 72, 66), (87, 69, 62), (85, 67, 59), (83, 65, 57), + (82, 64, 56), (75, 62, 52), (71, 61, 52), (68, 62, 51), + (67, 63, 50), (65, 65, 52), (63, 66, 53), (62, 68, 55), + (58, 72, 59), (54, 76, 61), (52, 78, 62), (50, 77, 62), + (42, 74, 62), (41, 73, 60), (41, 72, 59), (42, 70, 57), + (43, 69, 56), (45, 65, 55), (46, 61, 52), (48, 55, 47), + (49, 52, 43), (47, 46, 37), (45, 45, 37), (43, 44, 38), + (39, 42, 39), (34, 40, 40), (29, 40, 38), (26, 40, 38), + (25, 46, 46), (28, 49, 50), (31, 53, 55), (43, 64, 67), + (57, 75, 75), (76, 85, 84), (95, 95, 94), (114, 105, 103), + (135, 116, 112), (159, 124, 122), (164, 127, 125), (170, 130, 128), + (182, 134, 135), (195, 144, 142), (205, 150, 149), (210, 153, 153), + (217, 163, 167), (219, 167, 170), (221, 171, 173), (226, 178, 181), + (231, 183, 186), (237, 191, 193), (242, 198, 199), (244, 204, 203), + (244, 205, 204), (238, 201, 198), (232, 195, 192), (224, 188, 185), + (216, 181, 175), (206, 171, 165), (187, 156, 150), (166, 136, 131), + (113, 96, 91), (102, 88, 83), (92, 81, 76), (72, 68, 64), + (58, 58, 56), (48, 52, 51), (46, 52, 51), (56, 57, 56), + (70, 62, 64), (84, 71, 74), (99, 80, 83), (111, 91, 94), + (124, 106, 107), (140, 115, 118), (153, 122, 126), (162, 125, 129), + (163, 124, 128), (160, 127, 130), (154, 127, 128), (147, 124, 124), + (142, 117, 117), (133, 108, 107), (125, 99, 100), (111, 91, 92), + (97, 83, 83), (81, 76, 75), (66, 68, 68), (54, 62, 63), + (42, 58, 60), (33, 55, 58), (26, 54, 57), (22, 54, 57), + (20, 55, 57), (17, 56, 58), (13, 54, 58), (12, 52, 57), + (11, 52, 56), (12, 53, 55), (12, 54, 55), (11, 53, 55), + (12, 50, 53), (13, 50, 54), (18, 54, 56), (28, 60, 60), + (42, 69, 68), (60, 77, 76), (75, 84, 85), (90, 93, 93), + (105, 104, 104), (123, 116, 116), (145, 129, 129), (164, 137, 139), + (179, 141, 145), (186, 143, 148), (189, 143, 148), (191, 143, 148), + (186, 140, 144), (177, 133, 136), (167, 123, 126), (152, 112, 112), + (138, 101, 101), (122, 92, 89), (107, 85, 79), (94, 78, 71), + (86, 76, 67), (84, 76, 67), (92, 78, 71), (98, 81, 75), + (107, 82, 78), (114, 82, 80), (113, 84, 82), (120, 86, 87) + ), + +// 434 040221-92 +((60, 43, 7), (55, 41, 9), (50, 37, 9), (46, 34, 10), + (38, 31, 9), (31, 28, 8), (31, 28, 6), (32, 29, 5), + (35, 27, 4), (32, 24, 5), (29, 21, 7), (25, 17, 9), + (22, 14, 11), (19, 12, 11), (17, 10, 12), (16, 9, 13), + (16, 8, 14), (13, 6, 16), (10, 6, 17), (7, 6, 18), + (4, 6, 17), (2, 6, 16), (2, 5, 15), (2, 5, 14), + (5, 3, 9), (8, 3, 7), (11, 3, 6), (13, 4, 5), + (16, 6, 4), (17, 6, 3), (18, 7, 2), (20, 8, 1), + (24, 8, 0), (31, 8, 0), (35, 8, 1), (39, 8, 2), + (43, 9, 5), (47, 11, 8), (47, 12, 9), (48, 14, 10), + (51, 19, 12), (49, 17, 12), (47, 16, 13), (47, 13, 15), + (47, 11, 17), (46, 10, 17), (46, 10, 17), (47, 9, 18), + (48, 11, 16), (53, 12, 12), (52, 11, 10), (51, 10, 8), + (50, 8, 7), (49, 7, 6), (48, 7, 4), (48, 8, 3), + (54, 14, 2), (60, 18, 2), (66, 23, 2), (71, 26, 2), + (76, 29, 2), (78, 30, 2), (80, 32, 2), (83, 36, 4), + (87, 41, 6), (103, 53, 13), (111, 57, 14), (119, 61, 15), + (122, 60, 14), (125, 59, 13), (129, 58, 13), (128, 56, 11), + (122, 57, 11), (114, 57, 12), (106, 57, 13), (96, 52, 12), + (87, 47, 11), (82, 43, 11), (77, 40, 12), (68, 36, 12), + (68, 38, 19), (76, 48, 28), (80, 51, 27), (84, 55, 26), + (85, 54, 26), (87, 53, 26), (85, 50, 21), (83, 48, 24), + (94, 51, 31), (99, 57, 30), (105, 64, 30), (106, 65, 29), + (108, 67, 28), (104, 66, 19), (93, 63, 12), (81, 58, 9), + (70, 54, 7), (48, 52, 7), (41, 52, 10), (35, 53, 13), + (32, 52, 13), (30, 52, 13), (25, 49, 12), (23, 44, 11), + (13, 36, 6), (10, 35, 8), (7, 34, 11), (5, 34, 13), + (4, 34, 15), (5, 33, 18), (10, 31, 20), (16, 30, 21), + (22, 31, 19), (37, 34, 17), (39, 36, 18), (41, 38, 20), + (51, 44, 26), (63, 52, 31), (77, 61, 35), (90, 72, 38), + (122, 92, 44), (136, 98, 43), (150, 105, 43), (155, 107, 43), + (160, 110, 43), (171, 113, 44), (179, 117, 39), (179, 124, 42), + (180, 126, 40), (173, 122, 34), (168, 117, 31), (163, 113, 29), + (154, 103, 26), (146, 90, 19), (131, 80, 13), (117, 68, 8), + (85, 48, 6), (70, 39, 4), (55, 31, 3), (50, 27, 4), + (45, 23, 5), (36, 16, 9), (32, 12, 13), (27, 7, 26), + (23, 5, 41), (17, 3, 47), (15, 2, 46), (14, 2, 46), + (11, 3, 45), (11, 5, 39), (9, 7, 37), (8, 11, 48), + (14, 24, 55), (16, 26, 55), (18, 28, 55), (23, 32, 52), + (28, 38, 41), (32, 40, 25), (33, 41, 20), (34, 42, 16), + (36, 44, 15), (39, 41, 16), (39, 40, 16), (40, 40, 16), + (42, 38, 13), (42, 33, 12), (39, 27, 9), (37, 23, 6), + (29, 13, 2), (27, 10, 1), (26, 8, 0), (24, 5, 0), + (24, 3, 0), (26, 1, 0), (33, 1, 0), (43, 1, 0), + (53, 1, 2), (60, 3, 2), (64, 6, 2), (67, 7, 4), + (65, 8, 7), (66, 10, 11), (69, 13, 12), (75, 15, 17), + (83, 25, 18), (83, 28, 17), (83, 31, 17), (79, 36, 16), + (72, 38, 17), (64, 40, 16), (60, 43, 18), (59, 45, 21), + (61, 49, 21), (63, 56, 21), (66, 63, 23), (73, 67, 25), + (80, 68, 26), (83, 70, 26), (87, 71, 30), (91, 72, 28), + (94, 72, 26), (94, 75, 28), (99, 78, 31), (110, 80, 30), + (117, 80, 28), (119, 79, 30), (121, 77, 26), (118, 71, 19), + (107, 65, 14), (93, 58, 11), (87, 54, 8), (82, 47, 5), + (78, 43, 5), (76, 40, 3), (74, 38, 3), (73, 36, 4), + (68, 34, 7), (65, 37, 11), (64, 39, 15), (65, 43, 18), + (66, 50, 19), (60, 54, 19), (58, 60, 20), (57, 73, 23), + (57, 87, 26), (55, 94, 29), (53, 96, 32), (55, 101, 37), + (49, 102, 37), (42, 96, 37), (35, 100, 40), (34, 104, 48), + (26, 102, 48), (19, 93, 46), (17, 86, 49), (16, 75, 49), + (14, 57, 47), (10, 46, 45), (14, 42, 54), (15, 40, 58), + (18, 37, 57), (21, 34, 56), (23, 28, 49), (23, 20, 41), + (23, 16, 31), (26, 15, 26), (29, 17, 26), (34, 20, 25), + (46, 26, 26), (56, 30, 22), (55, 30, 21), (56, 31, 18), + (57, 31, 14), (57, 33, 11), (50, 34, 8), (52, 38, 10) + ), + +// 435 040221-93 +((186, 187, 147), (208, 206, 183), (217, 215, 198), (227, 224, 214), + (233, 231, 226), (239, 239, 238), (236, 236, 234), (234, 233, 231), + (218, 216, 205), (207, 204, 190), (197, 193, 175), (185, 183, 162), + (174, 174, 149), (162, 165, 137), (150, 156, 126), (145, 151, 119), + (140, 146, 113), (121, 129, 83), (114, 121, 69), (108, 113, 55), + (104, 110, 50), (100, 108, 46), (99, 108, 46), (99, 108, 46), + (100, 111, 46), (103, 112, 43), (106, 113, 40), (106, 114, 36), + (107, 115, 33), (106, 114, 31), (105, 114, 29), (98, 112, 28), + (93, 108, 27), (78, 99, 22), (72, 96, 19), (66, 93, 17), + (61, 91, 16), (57, 89, 16), (55, 89, 17), (53, 90, 18), + (50, 86, 23), (50, 85, 25), (51, 85, 27), (54, 86, 28), + (58, 88, 30), (60, 90, 31), (62, 93, 32), (66, 95, 36), + (70, 97, 39), (77, 99, 43), (77, 97, 40), (78, 96, 38), + (75, 94, 34), (73, 93, 30), (71, 91, 28), (69, 89, 27), + (61, 83, 23), (59, 80, 20), (58, 77, 18), (55, 75, 14), + (53, 74, 11), (51, 73, 9), (49, 72, 8), (45, 72, 7), + (44, 72, 7), (54, 80, 14), (68, 90, 23), (83, 101, 33), + (90, 109, 41), (98, 117, 50), (113, 130, 68), (126, 141, 87), + (149, 160, 115), (157, 163, 118), (165, 167, 122), (169, 170, 123), + (174, 174, 125), (174, 174, 126), (174, 174, 128), (172, 176, 132), + (173, 175, 134), (171, 168, 125), (167, 161, 113), (163, 154, 101), + (158, 150, 94), (153, 146, 87), (142, 139, 75), (133, 131, 68), + (127, 127, 64), (133, 130, 68), (139, 134, 72), (143, 136, 75), + (147, 139, 78), (154, 146, 82), (159, 153, 91), (162, 156, 101), + (165, 161, 112), (175, 175, 136), (184, 183, 148), (193, 191, 160), + (198, 197, 166), (204, 203, 172), (216, 213, 185), (224, 221, 196), + (228, 224, 201), (218, 218, 194), (208, 212, 188), (201, 206, 180), + (195, 200, 172), (183, 188, 155), (168, 178, 140), (154, 164, 125), + (142, 151, 108), (112, 126, 76), (103, 119, 68), (95, 112, 60), + (81, 99, 45), (67, 88, 34), (56, 74, 27), (48, 63, 20), + (42, 51, 12), (44, 53, 10), (46, 56, 9), (48, 59, 10), + (51, 62, 11), (56, 67, 14), (60, 71, 15), (64, 73, 17), + (68, 76, 18), (76, 85, 20), (78, 88, 20), (80, 91, 21), + (84, 98, 23), (85, 104, 22), (84, 105, 22), (82, 105, 22), + (77, 104, 22), (76, 102, 23), (76, 100, 24), (76, 100, 24), + (76, 101, 24), (75, 100, 22), (73, 98, 20), (71, 96, 18), + (67, 93, 16), (63, 84, 16), (63, 82, 17), (64, 80, 18), + (63, 76, 18), (61, 72, 18), (57, 67, 17), (54, 61, 17), + (50, 59, 19), (51, 59, 20), (53, 60, 21), (56, 62, 23), + (60, 67, 27), (64, 71, 30), (71, 74, 35), (78, 81, 42), + (88, 90, 49), (117, 114, 64), (126, 122, 69), (136, 130, 75), + (153, 146, 89), (168, 160, 104), (180, 172, 120), (191, 181, 137), + (208, 198, 165), (212, 200, 169), (216, 203, 173), (224, 211, 183), + (229, 217, 192), (233, 220, 198), (235, 220, 198), (231, 217, 196), + (224, 213, 191), (217, 205, 180), (211, 198, 168), (204, 194, 159), + (200, 189, 151), (195, 183, 139), (189, 176, 125), (181, 169, 111), + (162, 151, 82), (157, 149, 77), (153, 147, 73), (147, 145, 70), + (146, 144, 71), (147, 146, 74), (151, 150, 79), (158, 154, 85), + (162, 156, 92), (165, 159, 97), (161, 159, 98), (155, 154, 97), + (148, 149, 94), (139, 143, 89), (131, 135, 84), (124, 127, 81), + (118, 117, 78), (108, 109, 73), (95, 96, 66), (81, 84, 57), + (65, 72, 47), (49, 62, 34), (37, 54, 24), (32, 48, 18), + (31, 46, 14), (30, 44, 13), (31, 43, 15), (33, 43, 18), + (36, 46, 22), (41, 52, 26), (50, 61, 30), (61, 73, 37), + (75, 86, 45), (92, 99, 55), (107, 113, 73), (121, 126, 90), + (133, 138, 107), (144, 148, 121), (153, 156, 130), (160, 164, 134), + (169, 169, 131), (181, 177, 136), (191, 183, 142), (202, 190, 150), + (213, 198, 158), (220, 201, 163), (219, 200, 161), (215, 194, 150), + (212, 189, 138), (207, 182, 126), (205, 176, 117), (204, 176, 113), + (207, 178, 111), (208, 177, 110), (205, 176, 106), (199, 173, 99), + (190, 169, 91), (181, 161, 83), (170, 155, 78), (162, 152, 71), + (155, 148, 66), (150, 147, 61), (145, 144, 57), (140, 141, 54), + (138, 140, 52), (136, 137, 54), (142, 144, 68), (146, 151, 84), + (155, 159, 99), (163, 167, 113), (172, 176, 128), (181, 185, 142) + ), + +// 436 040221-94 +((117, 143, 160), (109, 132, 146), (97, 123, 139), (86, 115, 132), + (71, 100, 118), (56, 86, 104), (50, 81, 99), (45, 76, 94), + (24, 62, 86), (18, 55, 78), (12, 48, 71), (12, 44, 65), + (13, 41, 59), (15, 46, 64), (18, 52, 69), (21, 54, 71), + (24, 56, 73), (39, 58, 69), (39, 58, 68), (39, 58, 67), + (37, 56, 65), (36, 54, 64), (36, 52, 61), (36, 50, 58), + (31, 35, 42), (24, 32, 39), (18, 30, 37), (24, 40, 50), + (30, 51, 63), (37, 58, 71), (44, 66, 80), (60, 82, 97), + (74, 100, 117), (104, 137, 157), (119, 149, 169), (134, 161, 181), + (141, 165, 184), (149, 169, 187), (148, 169, 187), (147, 169, 187), + (134, 160, 179), (122, 150, 168), (111, 140, 157), (98, 125, 141), + (85, 110, 125), (77, 102, 118), (70, 95, 111), (57, 82, 97), + (50, 75, 90), (51, 73, 86), (56, 77, 90), (62, 81, 94), + (73, 91, 103), (84, 101, 113), (90, 107, 120), (96, 114, 128), + (116, 140, 157), (122, 144, 161), (128, 149, 165), (122, 145, 162), + (117, 142, 160), (112, 139, 158), (107, 136, 156), (97, 125, 144), + (84, 109, 126), (53, 72, 86), (40, 58, 71), (28, 45, 57), + (22, 37, 48), (17, 30, 39), (10, 17, 23), (4, 7, 9), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 1, 3), (3, 12, 14), (7, 23, 25), + (12, 31, 33), (17, 39, 41), (30, 56, 56), (43, 67, 69), + (60, 93, 98), (67, 106, 113), (75, 119, 128), (78, 121, 131), + (82, 124, 135), (84, 123, 137), (85, 122, 139), (81, 121, 142), + (84, 122, 145), (95, 129, 150), (105, 136, 157), (116, 144, 165), + (122, 150, 170), (129, 157, 176), (141, 170, 188), (152, 178, 196), + (167, 189, 207), (171, 196, 213), (176, 203, 219), (176, 204, 220), + (177, 206, 222), (172, 205, 221), (166, 197, 215), (163, 192, 209), + (162, 190, 206), (161, 188, 202), (159, 185, 199), (157, 183, 197), + (152, 178, 192), (148, 175, 191), (148, 175, 192), (148, 177, 195), + (157, 182, 198), (163, 187, 202), (170, 192, 206), (171, 193, 207), + (173, 195, 209), (173, 195, 208), (173, 192, 204), (175, 190, 201), + (175, 190, 197), (164, 183, 193), (160, 180, 190), (156, 177, 188), + (149, 170, 185), (143, 168, 182), (141, 168, 183), (138, 170, 187), + (144, 170, 187), (141, 164, 179), (139, 158, 171), (132, 151, 164), + (126, 145, 158), (109, 125, 138), (96, 108, 118), (84, 90, 97), + (71, 73, 76), (35, 37, 40), (27, 28, 32), (19, 20, 24), + (8, 15, 18), (7, 21, 21), (14, 35, 35), (25, 52, 51), + (51, 77, 80), (58, 86, 89), (66, 95, 99), (82, 112, 118), + (99, 134, 139), (117, 146, 153), (132, 156, 165), (143, 164, 175), + (153, 168, 182), (166, 177, 190), (168, 179, 191), (171, 181, 193), + (175, 186, 197), (178, 188, 201), (182, 191, 202), (183, 193, 204), + (184, 194, 204), (182, 194, 204), (181, 195, 205), (178, 196, 207), + (173, 194, 208), (168, 193, 207), (163, 186, 203), (151, 178, 195), + (138, 169, 187), (119, 155, 175), (99, 139, 162), (83, 118, 140), + (69, 97, 116), (56, 79, 95), (42, 62, 75), (26, 47, 60), + (4, 16, 24), (2, 11, 17), (1, 6, 10), (1, 1, 1), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 1), + (0, 1, 2), (0, 11, 10), (2, 20, 18), (2, 27, 29), + (3, 35, 40), (6, 35, 46), (7, 43, 56), (9, 53, 62), + (8, 53, 62), (6, 52, 61), (6, 42, 53), (7, 33, 48), + (7, 33, 44), (6, 26, 33), (4, 18, 22), (6, 14, 16), + (11, 14, 18), (17, 25, 30), (24, 37, 45), (28, 49, 55), + (36, 63, 69), (49, 78, 86), (62, 95, 106), (75, 109, 126), + (79, 122, 137), (81, 130, 143), (82, 131, 144), (80, 131, 144), + (79, 125, 144), (72, 118, 138), (65, 115, 133), (61, 110, 129), + (59, 110, 125), (60, 111, 127), (61, 112, 129), (65, 116, 133), + (73, 119, 140), (85, 126, 144), (96, 136, 152), (103, 144, 160), + (108, 150, 166), (111, 150, 170), (114, 148, 170), (115, 145, 166), + (113, 144, 165), (111, 144, 165), (112, 146, 168), (110, 146, 168), + (119, 153, 174), (124, 156, 177), (124, 155, 175), (126, 156, 174) + ), + +// 437 040221-95 +((87, 115, 72), (85, 115, 74), (90, 120, 78), (95, 126, 82), + (102, 130, 85), (110, 135, 88), (110, 133, 88), (110, 131, 89), + (109, 135, 91), (112, 142, 96), (115, 149, 101), (122, 161, 109), + (130, 173, 118), (136, 182, 126), (143, 191, 135), (143, 192, 135), + (144, 194, 136), (138, 194, 133), (136, 191, 128), (134, 189, 124), + (131, 186, 120), (128, 183, 117), (125, 180, 115), (123, 177, 113), + (103, 154, 92), (92, 138, 79), (82, 123, 67), (73, 109, 54), + (65, 96, 42), (60, 93, 39), (56, 90, 36), (47, 84, 31), + (39, 78, 25), (24, 63, 21), (20, 51, 20), (17, 40, 20), + (18, 37, 22), (19, 34, 24), (20, 34, 25), (21, 34, 26), + (20, 40, 24), (20, 41, 24), (21, 42, 25), (22, 44, 27), + (24, 46, 30), (27, 47, 32), (30, 49, 34), (37, 56, 37), + (46, 63, 38), (60, 80, 42), (63, 87, 45), (67, 94, 48), + (67, 96, 49), (68, 99, 50), (68, 98, 49), (69, 97, 49), + (68, 92, 49), (67, 89, 50), (67, 86, 51), (62, 80, 52), + (57, 74, 53), (54, 71, 51), (51, 68, 50), (43, 60, 44), + (36, 50, 39), (26, 36, 26), (26, 33, 26), (26, 30, 27), + (27, 31, 28), (28, 33, 29), (30, 40, 31), (32, 47, 34), + (32, 62, 31), (33, 66, 30), (34, 70, 30), (38, 73, 31), + (42, 77, 32), (46, 82, 35), (51, 88, 38), (61, 101, 47), + (70, 112, 55), (85, 137, 75), (91, 139, 79), (98, 141, 83), + (101, 140, 83), (105, 139, 84), (110, 140, 84), (114, 136, 82), + (113, 135, 83), (110, 132, 81), (107, 130, 79), (105, 126, 76), + (103, 123, 74), (97, 116, 67), (91, 105, 57), (83, 93, 49), + (74, 85, 43), (65, 82, 39), (64, 86, 42), (63, 90, 46), + (64, 91, 47), (65, 92, 48), (66, 90, 50), (64, 86, 51), + (61, 78, 53), (58, 75, 57), (55, 73, 62), (53, 72, 62), + (52, 71, 63), (50, 67, 64), (45, 59, 64), (43, 52, 61), + (40, 45, 59), (36, 33, 56), (35, 32, 57), (35, 31, 58), + (34, 31, 60), (35, 31, 62), (40, 36, 63), (47, 46, 67), + (69, 75, 80), (80, 93, 90), (92, 111, 101), (96, 119, 105), + (100, 127, 110), (108, 140, 119), (118, 155, 129), (128, 167, 137), + (138, 182, 145), (157, 208, 163), (159, 214, 167), (162, 220, 171), + (163, 226, 175), (163, 230, 178), (162, 229, 177), (158, 226, 173), + (147, 211, 160), (137, 203, 151), (127, 195, 143), (121, 190, 137), + (116, 186, 132), (104, 174, 118), (95, 161, 105), (86, 147, 91), + (76, 132, 77), (55, 106, 55), (50, 102, 50), (46, 99, 46), + (36, 91, 38), (30, 83, 30), (29, 77, 22), (29, 72, 16), + (33, 60, 10), (34, 59, 10), (35, 59, 11), (37, 60, 12), + (37, 62, 15), (40, 64, 18), (45, 70, 20), (52, 76, 23), + (61, 84, 27), (76, 103, 43), (79, 108, 47), (83, 113, 52), + (87, 119, 61), (91, 125, 67), (93, 130, 72), (97, 136, 76), + (100, 147, 85), (101, 150, 87), (102, 153, 90), (101, 152, 93), + (98, 147, 92), (92, 138, 89), (86, 127, 83), (78, 113, 73), + (68, 99, 65), (60, 89, 59), (52, 79, 56), (45, 66, 52), + (38, 56, 47), (32, 50, 40), (26, 48, 33), (21, 48, 29), + (20, 61, 29), (21, 63, 32), (23, 66, 35), (27, 68, 40), + (31, 71, 41), (35, 74, 41), (41, 82, 43), (50, 91, 45), + (60, 103, 47), (69, 114, 55), (78, 121, 64), (86, 125, 70), + (89, 124, 72), (92, 122, 71), (95, 119, 70), (98, 117, 67), + (99, 118, 68), (100, 122, 71), (99, 127, 75), (96, 134, 78), + (92, 138, 80), (88, 141, 83), (88, 143, 84), (88, 141, 83), + (88, 140, 85), (85, 140, 85), (83, 143, 88), (81, 148, 90), + (79, 152, 97), (81, 159, 102), (85, 165, 107), (89, 165, 111), + (91, 164, 113), (92, 164, 114), (92, 164, 112), (88, 163, 108), + (86, 160, 103), (84, 157, 99), (82, 150, 94), (78, 141, 89), + (77, 133, 84), (78, 128, 80), (75, 128, 78), (76, 130, 76), + (80, 134, 76), (82, 138, 80), (85, 141, 85), (87, 141, 89), + (93, 139, 90), (98, 139, 94), (105, 144, 97), (113, 153, 101), + (121, 163, 107), (129, 175, 118), (135, 186, 129), (141, 194, 137), + (145, 198, 143), (148, 197, 144), (148, 195, 142), (146, 188, 134), + (143, 183, 127), (140, 176, 121), (134, 169, 117), (128, 165, 114), + (123, 165, 112), (117, 160, 108), (114, 161, 107), (112, 159, 103), + (108, 155, 97), (105, 147, 90), (101, 135, 82), (96, 131, 79) + ), + +// 438 040221-96 +((179, 154, 69), (165, 128, 66), (155, 118, 62), (145, 108, 59), + (144, 109, 62), (144, 110, 65), (148, 113, 68), (153, 117, 72), + (161, 126, 81), (156, 125, 80), (152, 125, 79), (150, 121, 72), + (149, 118, 65), (150, 119, 64), (152, 121, 64), (154, 122, 64), + (156, 123, 65), (164, 128, 64), (175, 130, 56), (186, 132, 49), + (200, 139, 44), (214, 146, 40), (218, 150, 41), (223, 155, 42), + (233, 176, 47), (237, 183, 48), (242, 190, 49), (246, 193, 52), + (251, 197, 56), (251, 197, 57), (252, 198, 58), (250, 201, 61), + (249, 204, 65), (235, 197, 80), (221, 186, 85), (207, 175, 90), + (186, 158, 88), (165, 142, 86), (156, 134, 83), (147, 126, 80), + (104, 94, 73), (85, 81, 66), (67, 68, 60), (52, 59, 59), + (38, 51, 59), (32, 48, 58), (27, 46, 58), (19, 39, 60), + (20, 30, 65), (33, 27, 69), (42, 32, 79), (51, 37, 89), + (58, 42, 96), (65, 47, 104), (70, 48, 101), (76, 49, 99), + (107, 58, 82), (122, 71, 75), (138, 84, 68), (146, 95, 58), + (155, 106, 49), (159, 110, 43), (163, 114, 38), (166, 118, 28), + (165, 118, 20), (153, 112, 17), (144, 106, 21), (136, 101, 26), + (133, 99, 28), (131, 97, 30), (121, 92, 37), (110, 85, 42), + (81, 63, 42), (69, 52, 42), (57, 42, 42), (55, 43, 44), + (54, 44, 46), (57, 46, 44), (60, 48, 43), (67, 54, 41), + (71, 57, 37), (73, 50, 28), (76, 51, 25), (80, 53, 23), + (86, 57, 25), (93, 61, 27), (108, 71, 30), (116, 77, 29), + (112, 79, 38), (109, 83, 44), (107, 88, 51), (109, 92, 56), + (112, 97, 62), (119, 107, 68), (125, 115, 76), (128, 122, 89), + (131, 130, 102), (152, 147, 117), (160, 153, 119), (169, 159, 122), + (170, 160, 124), (172, 161, 126), (172, 164, 133), (174, 168, 136), + (183, 167, 132), (185, 167, 132), (188, 168, 132), (187, 169, 134), + (186, 171, 137), (182, 174, 145), (176, 174, 151), (168, 168, 147), + (162, 164, 142), (151, 142, 123), (145, 136, 117), (140, 130, 112), + (128, 115, 101), (110, 98, 87), (91, 87, 72), (79, 70, 61), + (80, 58, 33), (87, 57, 25), (94, 56, 17), (98, 59, 15), + (102, 63, 14), (111, 70, 18), (127, 81, 19), (146, 92, 23), + (164, 104, 26), (194, 122, 30), (198, 125, 32), (203, 128, 34), + (208, 132, 36), (212, 134, 38), (215, 136, 38), (217, 137, 38), + (220, 139, 38), (223, 141, 39), (226, 143, 40), (227, 143, 40), + (229, 144, 40), (230, 145, 38), (230, 145, 39), (229, 144, 39), + (225, 142, 38), (218, 136, 37), (215, 134, 35), (213, 133, 34), + (204, 127, 32), (191, 118, 30), (177, 109, 27), (163, 102, 23), + (156, 97, 19), (156, 97, 18), (157, 98, 17), (159, 98, 19), + (162, 103, 20), (162, 106, 24), (166, 114, 29), (176, 128, 43), + (191, 145, 57), (220, 179, 94), (225, 185, 101), (231, 191, 108), + (237, 203, 114), (242, 214, 119), (247, 222, 120), (250, 230, 128), + (254, 240, 152), (254, 242, 156), (254, 244, 161), (253, 247, 165), + (249, 243, 160), (244, 240, 156), (240, 238, 159), (239, 236, 167), + (238, 236, 180), (241, 240, 197), (241, 242, 204), (240, 238, 204), + (236, 231, 193), (233, 221, 178), (231, 211, 163), (232, 204, 150), + (234, 195, 130), (233, 190, 123), (233, 186, 116), (229, 175, 96), + (225, 164, 76), (221, 152, 58), (216, 143, 46), (213, 138, 41), + (211, 136, 41), (207, 133, 42), (202, 132, 44), (192, 130, 51), + (179, 130, 64), (167, 129, 76), (162, 131, 83), (163, 132, 89), + (171, 135, 87), (179, 141, 87), (183, 149, 97), (183, 157, 115), + (183, 170, 134), (188, 180, 153), (199, 190, 163), (216, 200, 161), + (233, 208, 159), (244, 213, 153), (250, 221, 150), (249, 220, 149), + (243, 217, 148), (236, 208, 141), (223, 194, 140), (213, 179, 133), + (209, 170, 120), (205, 160, 104), (203, 153, 90), (202, 148, 73), + (196, 138, 64), (189, 129, 63), (188, 125, 62), (188, 126, 62), + (194, 130, 63), (202, 139, 61), (208, 148, 63), (214, 157, 72), + (217, 166, 84), (220, 174, 97), (225, 184, 111), (229, 192, 120), + (231, 200, 134), (235, 209, 151), (233, 215, 165), (231, 219, 179), + (225, 219, 187), (217, 217, 188), (208, 211, 183), (202, 206, 180), + (192, 198, 172), (192, 193, 163), (191, 183, 149), (192, 176, 133), + (193, 170, 115), (197, 168, 101), (195, 168, 91), (201, 174, 83), + (208, 177, 76), (220, 180, 69), (232, 183, 61), (220, 168, 49), + (206, 157, 45), (190, 153, 46), (174, 150, 51), (162, 144, 58) + ), + +// 439 040221-97 +((138, 99, 27), (149, 112, 31), (141, 102, 29), (134, 93, 27), + (133, 88, 24), (133, 83, 21), (132, 80, 19), (131, 78, 18), + (120, 64, 22), (107, 55, 21), (94, 46, 21), (76, 36, 19), + (58, 27, 17), (44, 25, 17), (31, 24, 17), (27, 29, 23), + (23, 34, 29), (12, 78, 51), (9, 90, 57), (6, 103, 64), + (6, 111, 80), (6, 120, 96), (7, 133, 104), (8, 147, 112), + (18, 163, 120), (18, 139, 111), (19, 116, 103), (17, 104, 96), + (15, 93, 89), (15, 90, 85), (16, 87, 81), (19, 68, 62), + (22, 50, 40), (25, 25, 15), (33, 23, 10), (41, 22, 5), + (53, 27, 4), (66, 32, 3), (72, 36, 2), (78, 41, 2), + (101, 55, 2), (112, 56, 2), (123, 57, 2), (132, 54, 2), + (142, 51, 2), (149, 49, 2), (157, 48, 2), (165, 58, 5), + (168, 63, 14), (145, 72, 31), (135, 77, 34), (125, 83, 38), + (111, 91, 43), (97, 99, 48), (87, 100, 48), (77, 101, 48), + (55, 94, 37), (54, 85, 31), (54, 77, 26), (72, 69, 17), + (91, 61, 9), (104, 59, 6), (117, 57, 3), (131, 57, 2), + (137, 54, 1), (133, 51, 1), (133, 48, 2), (134, 45, 3), + (130, 43, 3), (127, 41, 3), (118, 37, 4), (108, 36, 4), + (93, 30, 3), (84, 26, 3), (76, 22, 3), (72, 23, 3), + (68, 25, 3), (66, 27, 3), (65, 30, 4), (61, 33, 5), + (62, 35, 3), (73, 44, 4), (79, 52, 7), (85, 61, 10), + (89, 64, 9), (93, 68, 9), (102, 71, 7), (107, 76, 3), + (101, 77, 8), (87, 72, 7), (74, 67, 7), (65, 64, 5), + (57, 61, 3), (42, 54, 2), (30, 45, 4), (20, 39, 4), + (13, 31, 4), (5, 20, 0), (6, 19, 0), (7, 18, 0), + (10, 18, 0), (13, 19, 0), (21, 22, 1), (37, 26, 3), + (73, 42, 9), (86, 52, 11), (100, 63, 14), (105, 65, 15), + (110, 67, 16), (120, 69, 16), (128, 71, 14), (131, 72, 16), + (130, 73, 14), (111, 60, 11), (105, 55, 8), (99, 50, 6), + (83, 41, 2), (70, 37, 1), (58, 37, 1), (48, 42, 1), + (33, 56, 1), (29, 63, 8), (25, 70, 15), (23, 76, 17), + (22, 83, 19), (26, 89, 20), (27, 95, 15), (27, 96, 17), + (26, 89, 22), (24, 78, 25), (26, 75, 21), (28, 72, 17), + (29, 63, 11), (31, 55, 9), (32, 48, 9), (37, 47, 7), + (67, 62, 5), (85, 74, 9), (104, 86, 14), (110, 89, 14), + (117, 93, 15), (123, 99, 16), (121, 105, 18), (120, 114, 26), + (129, 133, 41), (152, 150, 55), (149, 148, 54), (147, 146, 53), + (131, 132, 48), (122, 132, 46), (124, 134, 49), (138, 135, 46), + (152, 116, 30), (150, 111, 24), (148, 107, 18), (145, 102, 11), + (144, 102, 6), (147, 100, 4), (151, 100, 4), (157, 102, 6), + (164, 105, 6), (182, 103, 4), (187, 105, 4), (192, 107, 4), + (202, 108, 9), (209, 116, 14), (215, 128, 21), (220, 128, 27), + (228, 136, 39), (229, 140, 41), (230, 144, 44), (224, 151, 51), + (209, 156, 58), (191, 161, 60), (177, 155, 60), (172, 153, 59), + (173, 144, 54), (173, 139, 53), (162, 138, 49), (155, 134, 44), + (152, 131, 42), (154, 125, 35), (165, 120, 33), (171, 118, 31), + (174, 122, 34), (173, 123, 33), (173, 124, 32), (173, 127, 34), + (177, 128, 35), (184, 132, 41), (189, 133, 49), (193, 136, 51), + (194, 139, 53), (193, 141, 52), (196, 145, 54), (196, 144, 58), + (195, 143, 59), (197, 142, 55), (194, 140, 49), (192, 139, 42), + (189, 135, 39), (185, 130, 38), (183, 123, 35), (179, 112, 31), + (173, 103, 26), (166, 93, 20), (161, 89, 18), (158, 88, 16), + (158, 88, 16), (158, 92, 18), (158, 96, 17), (162, 105, 23), + (168, 117, 32), (176, 129, 39), (184, 140, 47), (186, 146, 48), + (184, 147, 44), (179, 142, 45), (166, 130, 43), (151, 120, 41), + (134, 107, 38), (116, 93, 26), (99, 81, 17), (81, 66, 9), + (64, 57, 4), (50, 49, 2), (39, 42, 0), (32, 40, 0), + (29, 44, 0), (27, 51, 2), (29, 59, 3), (36, 64, 6), + (44, 66, 8), (52, 69, 10), (60, 73, 12), (64, 77, 15), + (74, 78, 17), (84, 75, 20), (92, 71, 19), (96, 66, 16), + (91, 63, 16), (86, 63, 18), (81, 66, 25), (74, 71, 33), + (69, 75, 38), (62, 76, 39), (54, 76, 37), (51, 77, 35), + (50, 79, 38), (61, 86, 42), (84, 102, 54), (99, 106, 53), + (106, 106, 44), (106, 99, 37), (103, 85, 22), (119, 92, 24) + ), + +// 440 040221-98 +((217, 111, 68), (225, 131, 74), (235, 144, 77), (246, 157, 81), + (248, 163, 83), (251, 169, 86), (250, 168, 85), (249, 167, 85), + (242, 154, 78), (240, 148, 77), (239, 143, 76), (239, 138, 75), + (239, 133, 74), (239, 128, 71), (240, 124, 69), (241, 123, 68), + (242, 122, 68), (242, 115, 64), (240, 112, 63), (238, 110, 62), + (238, 107, 62), (239, 105, 63), (239, 103, 63), (239, 102, 63), + (244, 95, 61), (248, 92, 60), (252, 89, 59), (252, 89, 60), + (252, 90, 62), (250, 91, 62), (248, 93, 63), (235, 96, 61), + (222, 94, 60), (198, 88, 58), (185, 81, 56), (173, 75, 55), + (162, 67, 54), (151, 60, 53), (149, 56, 54), (148, 53, 55), + (124, 43, 49), (118, 37, 46), (113, 32, 43), (112, 25, 37), + (111, 19, 32), (111, 15, 29), (111, 12, 27), (115, 6, 23), + (128, 3, 23), (147, 5, 23), (156, 10, 25), (166, 15, 27), + (178, 24, 30), (190, 34, 33), (196, 40, 35), (203, 46, 38), + (227, 72, 48), (236, 84, 52), (245, 96, 57), (247, 107, 62), + (250, 118, 67), (250, 124, 69), (251, 131, 71), (251, 144, 78), + (252, 159, 85), (252, 189, 101), (252, 201, 109), (253, 214, 118), + (253, 218, 121), (253, 223, 125), (253, 230, 132), (253, 234, 135), + (253, 237, 136), (253, 235, 133), (253, 233, 130), (250, 229, 124), + (248, 225, 118), (244, 223, 115), (240, 221, 112), (238, 212, 108), + (238, 203, 104), (238, 184, 98), (239, 180, 96), (240, 176, 94), + (240, 173, 93), (241, 171, 92), (246, 172, 90), (240, 176, 89), + (238, 178, 92), (237, 179, 96), (237, 181, 101), (237, 182, 104), + (238, 183, 108), (239, 188, 116), (242, 191, 125), (250, 196, 136), + (252, 206, 145), (252, 228, 162), (252, 236, 167), (252, 245, 173), + (252, 247, 174), (252, 249, 175), (253, 250, 176), (253, 249, 174), + (253, 245, 167), (253, 241, 163), (253, 237, 160), (252, 235, 158), + (252, 234, 157), (252, 228, 151), (252, 220, 144), (253, 210, 137), + (253, 197, 129), (253, 171, 109), (253, 164, 103), (253, 157, 98), + (254, 141, 89), (253, 128, 83), (254, 117, 77), (253, 106, 72), + (254, 85, 66), (253, 78, 62), (253, 71, 59), (253, 68, 57), + (253, 65, 56), (254, 61, 54), (254, 57, 53), (254, 56, 52), + (254, 56, 51), (252, 56, 51), (252, 56, 50), (252, 56, 50), + (251, 56, 51), (246, 57, 51), (235, 56, 52), (223, 56, 54), + (199, 54, 55), (187, 52, 54), (175, 50, 54), (169, 47, 53), + (164, 45, 52), (156, 39, 49), (157, 34, 42), (155, 27, 38), + (154, 21, 36), (152, 10, 33), (152, 8, 32), (152, 6, 31), + (152, 6, 30), (153, 7, 30), (151, 9, 31), (160, 13, 29), + (182, 20, 27), (187, 21, 27), (193, 23, 27), (205, 27, 27), + (218, 29, 26), (228, 32, 25), (239, 36, 24), (243, 39, 24), + (246, 43, 24), (249, 49, 23), (249, 50, 23), (249, 51, 24), + (250, 54, 26), (251, 54, 28), (252, 55, 30), (252, 58, 33), + (247, 70, 37), (245, 74, 38), (244, 79, 40), (243, 89, 44), + (242, 97, 47), (242, 106, 51), (243, 113, 56), (243, 120, 61), + (245, 125, 66), (248, 134, 65), (247, 142, 66), (246, 154, 65), + (245, 167, 69), (243, 178, 72), (243, 187, 76), (243, 194, 79), + (244, 196, 87), (245, 195, 87), (247, 195, 88), (249, 193, 90), + (249, 192, 88), (251, 196, 90), (250, 199, 92), (250, 203, 97), + (250, 209, 102), (250, 213, 109), (250, 213, 115), (250, 211, 120), + (247, 205, 125), (246, 196, 127), (247, 190, 125), (247, 182, 121), + (247, 176, 118), (247, 171, 116), (247, 166, 115), (248, 160, 111), + (250, 153, 106), (250, 144, 100), (249, 133, 94), (249, 120, 86), + (249, 106, 76), (249, 91, 67), (249, 77, 59), (247, 63, 53), + (247, 49, 48), (246, 39, 43), (242, 31, 39), (236, 25, 37), + (232, 20, 34), (230, 16, 32), (229, 11, 29), (230, 8, 28), + (230, 8, 27), (232, 8, 27), (233, 7, 25), (234, 8, 24), + (232, 9, 25), (230, 11, 26), (229, 15, 28), (228, 19, 28), + (229, 24, 29), (231, 33, 31), (235, 45, 34), (239, 57, 37), + (245, 70, 41), (249, 83, 45), (251, 97, 50), (252, 111, 58), + (252, 122, 64), (252, 129, 69), (252, 134, 72), (252, 137, 74), + (249, 137, 76), (243, 135, 77), (232, 131, 78), (222, 128, 78), + (217, 129, 78), (216, 133, 79), (216, 138, 83), (217, 144, 88), + (218, 146, 89), (222, 146, 89), (226, 143, 87), (225, 138, 84), + (220, 129, 81), (216, 119, 76), (215, 112, 69), (215, 107, 66) + ), + +// 441 040221-99 +((176, 74, 34), (153, 63, 28), (145, 58, 25), (137, 54, 22), + (137, 51, 20), (137, 48, 18), (139, 49, 20), (141, 51, 23), + (141, 61, 32), (142, 68, 34), (144, 75, 37), (150, 84, 41), + (157, 93, 45), (172, 102, 53), (187, 112, 62), (192, 115, 65), + (197, 118, 69), (211, 125, 77), (209, 121, 73), (208, 117, 70), + (206, 111, 66), (204, 106, 62), (203, 103, 60), (202, 100, 58), + (202, 105, 60), (202, 108, 63), (202, 111, 67), (204, 116, 72), + (207, 121, 78), (207, 122, 79), (207, 124, 81), (207, 127, 80), + (202, 133, 83), (194, 150, 99), (199, 163, 112), (204, 176, 125), + (212, 187, 137), (220, 198, 150), (221, 200, 152), (222, 203, 155), + (213, 197, 154), (203, 191, 147), (193, 186, 140), (190, 184, 138), + (188, 183, 137), (188, 182, 134), (188, 182, 132), (189, 178, 124), + (192, 173, 120), (186, 161, 104), (174, 155, 101), (163, 150, 98), + (150, 145, 94), (138, 141, 91), (135, 138, 89), (132, 136, 87), + (128, 130, 81), (127, 129, 84), (126, 128, 88), (124, 129, 90), + (122, 130, 93), (121, 129, 92), (120, 129, 91), (113, 125, 87), + (109, 120, 79), (110, 111, 70), (108, 107, 67), (106, 104, 64), + (104, 103, 61), (103, 102, 59), (99, 98, 54), (90, 91, 47), + (74, 76, 33), (69, 71, 29), (64, 66, 26), (58, 61, 23), + (52, 57, 20), (48, 54, 18), (44, 51, 17), (36, 45, 12), + (27, 37, 7), (19, 26, 2), (19, 24, 2), (20, 22, 2), + (22, 22, 2), (24, 22, 2), (32, 23, 2), (40, 24, 2), + (51, 27, 2), (52, 27, 2), (53, 27, 3), (52, 29, 3), + (51, 31, 3), (56, 35, 4), (62, 41, 6), (77, 48, 8), + (89, 54, 9), (114, 65, 16), (117, 71, 20), (120, 78, 24), + (119, 81, 27), (118, 84, 31), (120, 90, 36), (122, 93, 38), + (130, 93, 41), (134, 89, 40), (139, 85, 40), (141, 83, 41), + (144, 82, 42), (149, 83, 43), (153, 82, 42), (155, 80, 42), + (154, 76, 40), (141, 58, 29), (136, 53, 26), (131, 48, 24), + (124, 43, 20), (121, 42, 20), (124, 45, 21), (130, 53, 26), + (147, 73, 41), (150, 80, 49), (153, 88, 58), (153, 93, 64), + (153, 99, 70), (156, 111, 78), (162, 123, 88), (176, 138, 100), + (193, 154, 109), (226, 171, 122), (232, 173, 124), (238, 176, 127), + (246, 179, 127), (249, 174, 125), (249, 169, 119), (246, 163, 112), + (239, 153, 95), (238, 152, 90), (238, 151, 85), (238, 150, 85), + (239, 150, 85), (240, 148, 83), (240, 145, 83), (239, 142, 81), + (234, 142, 79), (226, 140, 79), (223, 142, 80), (220, 144, 81), + (215, 144, 84), (208, 142, 85), (202, 137, 84), (188, 131, 83), + (154, 107, 71), (144, 101, 66), (135, 95, 62), (116, 82, 54), + (99, 70, 47), (86, 62, 42), (75, 56, 39), (61, 53, 35), + (52, 47, 31), (32, 37, 22), (28, 35, 19), (25, 34, 17), + (25, 35, 16), (32, 38, 16), (42, 44, 19), (58, 51, 24), + (94, 69, 34), (101, 73, 36), (109, 78, 39), (125, 87, 45), + (140, 95, 50), (154, 100, 54), (169, 105, 56), (184, 108, 58), + (199, 111, 59), (210, 112, 61), (219, 114, 64), (228, 117, 67), + (230, 116, 69), (231, 112, 68), (227, 108, 67), (224, 105, 62), + (210, 92, 48), (208, 89, 44), (206, 86, 41), (199, 81, 37), + (191, 73, 32), (179, 67, 31), (169, 64, 30), (165, 65, 28), + (159, 63, 27), (157, 65, 25), (161, 69, 26), (167, 74, 27), + (170, 81, 33), (168, 87, 39), (169, 95, 46), (169, 100, 53), + (167, 108, 58), (169, 115, 61), (178, 123, 67), (189, 134, 74), + (196, 144, 80), (201, 153, 86), (205, 156, 91), (200, 158, 94), + (191, 155, 93), (181, 150, 92), (173, 144, 87), (165, 138, 80), + (160, 134, 77), (157, 128, 69), (151, 123, 64), (142, 116, 60), + (132, 112, 58), (122, 108, 59), (116, 106, 58), (112, 105, 61), + (108, 106, 60), (103, 104, 58), (96, 100, 57), (89, 98, 54), + (80, 98, 54), (77, 97, 53), (79, 96, 54), (83, 97, 52), + (91, 97, 50), (101, 95, 51), (109, 91, 49), (112, 87, 47), + (114, 83, 44), (119, 76, 42), (122, 71, 37), (128, 68, 31), + (136, 64, 27), (145, 61, 27), (151, 60, 28), (154, 65, 34), + (159, 71, 43), (161, 74, 49), (162, 80, 52), (162, 83, 51), + (164, 84, 51), (167, 84, 49), (167, 89, 49), (168, 97, 53), + (170, 102, 57), (173, 111, 64), (176, 113, 62), (180, 111, 60), + (185, 105, 54), (188, 97, 47), (186, 89, 41), (185, 78, 33) + ), + +// 442 040222 +((92, 110, 105), (106, 101, 96), (104, 95, 91), (102, 89, 86), + (98, 84, 84), (94, 80, 83), (94, 82, 83), (95, 84, 84), + (111, 102, 96), (125, 116, 106), (139, 131, 117), (147, 144, 127), + (155, 158, 137), (165, 169, 149), (176, 181, 162), (181, 186, 167), + (187, 191, 173), (201, 196, 185), (197, 188, 178), (193, 180, 171), + (187, 172, 162), (182, 164, 153), (181, 162, 149), (181, 161, 146), + (176, 144, 129), (174, 136, 119), (173, 129, 110), (172, 126, 104), + (171, 123, 98), (171, 122, 95), (171, 122, 93), (169, 122, 92), + (169, 119, 94), (166, 115, 96), (159, 107, 93), (153, 99, 90), + (139, 89, 81), (125, 80, 72), (117, 75, 66), (110, 70, 61), + (83, 51, 43), (74, 44, 37), (66, 37, 32), (60, 36, 30), + (55, 35, 29), (52, 35, 29), (50, 36, 29), (49, 39, 30), + (47, 47, 32), (51, 65, 36), (61, 76, 42), (72, 88, 48), + (86, 99, 60), (101, 110, 72), (106, 121, 79), (112, 133, 87), + (126, 147, 93), (134, 145, 93), (142, 144, 93), (144, 135, 93), + (147, 127, 93), (144, 125, 92), (142, 123, 92), (132, 113, 85), + (121, 103, 77), (96, 78, 55), (82, 66, 45), (69, 54, 35), + (63, 48, 30), (58, 42, 25), (47, 34, 21), (38, 31, 17), + (23, 35, 19), (20, 36, 22), (17, 37, 25), (20, 39, 31), + (23, 42, 37), (26, 43, 44), (30, 44, 52), (36, 59, 64), + (44, 71, 74), (52, 88, 92), (54, 86, 97), (56, 85, 103), + (55, 85, 105), (55, 85, 107), (59, 88, 107), (66, 89, 105), + (83, 98, 93), (92, 98, 89), (102, 99, 86), (106, 100, 85), + (110, 101, 85), (119, 98, 85), (131, 101, 81), (144, 107, 79), + (160, 117, 84), (183, 139, 98), (186, 145, 106), (190, 151, 115), + (190, 152, 116), (190, 154, 118), (193, 157, 117), (194, 161, 117), + (192, 162, 118), (184, 153, 114), (176, 144, 110), (172, 137, 105), + (168, 131, 101), (161, 123, 93), (153, 112, 84), (145, 102, 79), + (137, 92, 72), (119, 68, 60), (116, 64, 57), (113, 61, 55), + (111, 57, 50), (109, 56, 50), (107, 58, 49), (106, 61, 48), + (103, 64, 44), (103, 63, 45), (104, 63, 46), (103, 63, 47), + (102, 64, 48), (98, 66, 50), (99, 70, 55), (95, 77, 55), + (95, 80, 59), (103, 95, 72), (103, 99, 75), (104, 104, 79), + (109, 111, 86), (114, 122, 90), (115, 125, 93), (120, 128, 98), + (136, 138, 112), (148, 143, 118), (161, 148, 125), (164, 150, 128), + (167, 153, 131), (171, 155, 135), (173, 154, 136), (173, 149, 133), + (172, 144, 132), (181, 135, 124), (182, 136, 122), (183, 137, 121), + (184, 141, 120), (182, 142, 113), (177, 141, 106), (173, 136, 98), + (165, 117, 80), (161, 115, 78), (158, 113, 76), (152, 107, 73), + (143, 102, 68), (135, 99, 67), (124, 94, 66), (118, 86, 65), + (111, 79, 66), (89, 62, 62), (84, 59, 60), (79, 56, 58), + (65, 51, 55), (54, 46, 52), (50, 42, 54), (46, 40, 54), + (42, 37, 50), (40, 36, 47), (39, 35, 44), (34, 35, 35), + (34, 32, 33), (33, 33, 31), (36, 34, 31), (36, 35, 33), + (36, 35, 33), (37, 39, 31), (39, 37, 32), (40, 40, 34), + (46, 49, 42), (53, 59, 52), (65, 70, 59), (81, 85, 67), + (111, 97, 73), (117, 100, 74), (124, 103, 76), (131, 107, 79), + (142, 109, 80), (152, 114, 81), (166, 115, 87), (174, 116, 84), + (176, 115, 85), (169, 111, 79), (160, 106, 77), (147, 102, 74), + (143, 100, 78), (141, 104, 86), (142, 112, 102), (138, 122, 112), + (131, 131, 119), (122, 134, 122), (119, 134, 122), (119, 135, 122), + (126, 135, 129), (137, 139, 137), (142, 143, 142), (146, 147, 141), + (148, 147, 134), (149, 147, 120), (150, 144, 107), (153, 136, 98), + (150, 127, 93), (148, 123, 89), (146, 119, 84), (150, 117, 78), + (155, 118, 75), (162, 116, 76), (167, 116, 80), (167, 115, 89), + (165, 115, 104), (170, 122, 115), (178, 133, 126), (190, 142, 142), + (206, 156, 156), (214, 165, 166), (214, 168, 179), (211, 167, 182), + (201, 167, 173), (187, 158, 164), (176, 151, 156), (163, 141, 143), + (151, 129, 132), (141, 111, 123), (128, 94, 111), (117, 78, 98), + (111, 69, 88), (107, 64, 83), (108, 70, 83), (113, 82, 88), + (121, 95, 100), (131, 113, 114), (140, 127, 128), (142, 138, 137), + (142, 145, 149), (140, 153, 155), (132, 157, 160), (127, 167, 163), + (125, 172, 166), (128, 175, 164), (123, 175, 162), (121, 163, 152), + (111, 147, 142), (101, 133, 130), (89, 120, 118), (93, 110, 109) + ), + +// 443 040222-00 +((94, 93, 77), (85, 102, 65), (85, 100, 67), (86, 98, 69), + (99, 105, 72), (112, 113, 75), (116, 117, 79), (121, 121, 84), + (143, 124, 76), (152, 126, 75), (162, 129, 74), (176, 139, 82), + (191, 149, 91), (203, 149, 99), (215, 150, 107), (218, 152, 109), + (222, 154, 112), (221, 153, 125), (215, 139, 115), (209, 125, 106), + (192, 111, 92), (176, 98, 78), (173, 94, 74), (170, 90, 70), + (158, 91, 42), (159, 100, 36), (161, 110, 30), (162, 127, 33), + (164, 144, 37), (168, 147, 38), (172, 150, 40), (177, 144, 45), + (177, 141, 55), (167, 155, 87), (161, 154, 96), (155, 153, 106), + (141, 152, 107), (127, 152, 109), (120, 150, 107), (114, 148, 106), + (99, 125, 92), (99, 102, 83), (99, 79, 75), (100, 57, 68), + (102, 36, 61), (101, 29, 57), (100, 22, 54), (100, 17, 50), + (100, 23, 48), (88, 43, 54), (74, 46, 63), (60, 49, 72), + (60, 54, 85), (61, 59, 98), (63, 58, 105), (66, 58, 112), + (81, 62, 125), (92, 67, 127), (103, 73, 129), (120, 81, 122), + (138, 90, 115), (144, 93, 109), (151, 97, 103), (155, 97, 92), + (152, 95, 87), (134, 89, 73), (118, 72, 66), (103, 55, 60), + (97, 51, 58), (91, 48, 56), (82, 43, 54), (76, 29, 51), + (73, 4, 59), (81, 3, 64), (90, 3, 70), (101, 7, 73), + (113, 11, 76), (116, 18, 79), (119, 26, 83), (134, 39, 85), + (161, 55, 75), (190, 103, 54), (200, 118, 56), (210, 134, 58), + (216, 135, 60), (222, 137, 63), (232, 147, 63), (228, 141, 61), + (221, 108, 68), (212, 90, 66), (204, 72, 65), (200, 63, 65), + (196, 54, 65), (180, 45, 59), (172, 39, 56), (166, 37, 58), + (172, 38, 66), (175, 55, 61), (177, 64, 53), (179, 74, 45), + (175, 78, 43), (172, 83, 41), (160, 81, 37), (152, 78, 33), + (139, 60, 37), (129, 48, 46), (119, 37, 56), (116, 29, 60), + (114, 22, 65), (110, 13, 76), (103, 13, 81), (95, 24, 82), + (81, 33, 72), (45, 38, 56), (42, 45, 52), (39, 53, 48), + (45, 65, 32), (58, 59, 27), (76, 48, 17), (93, 51, 14), + (135, 70, 9), (155, 74, 8), (175, 78, 8), (171, 80, 10), + (167, 82, 13), (152, 92, 19), (143, 101, 25), (136, 106, 29), + (121, 105, 37), (106, 92, 64), (109, 86, 67), (113, 81, 70), + (117, 73, 69), (121, 73, 67), (128, 75, 71), (139, 78, 76), + (156, 99, 84), (158, 117, 93), (161, 135, 103), (160, 138, 108), + (159, 142, 114), (165, 144, 131), (172, 147, 140), (176, 153, 146), + (177, 149, 141), (184, 142, 146), (187, 151, 147), (190, 161, 149), + (200, 170, 141), (208, 169, 129), (221, 156, 122), (224, 159, 115), + (234, 153, 85), (238, 143, 80), (243, 134, 75), (245, 131, 73), + (246, 138, 71), (246, 151, 73), (242, 152, 80), (239, 152, 91), + (236, 146, 98), (231, 129, 100), (224, 123, 103), (218, 117, 106), + (198, 109, 109), (182, 107, 105), (172, 115, 100), (157, 124, 105), + (133, 159, 135), (134, 171, 140), (136, 183, 146), (139, 193, 143), + (134, 197, 145), (129, 193, 141), (131, 188, 146), (132, 178, 136), + (125, 173, 128), (118, 164, 118), (117, 158, 117), (114, 145, 109), + (109, 140, 106), (99, 133, 106), (95, 125, 110), (86, 105, 105), + (62, 79, 95), (57, 72, 95), (53, 66, 95), (46, 47, 88), + (47, 32, 70), (46, 32, 53), (44, 41, 49), (46, 50, 54), + (63, 61, 54), (84, 76, 41), (91, 95, 31), (91, 103, 27), + (100, 110, 33), (125, 102, 31), (146, 93, 26), (154, 77, 12), + (139, 69, 15), (119, 57, 23), (109, 47, 36), (113, 43, 36), + (114, 49, 49), (106, 56, 67), (105, 64, 86), (111, 77, 90), + (130, 90, 98), (142, 102, 102), (155, 116, 110), (165, 134, 113), + (177, 151, 117), (184, 169, 113), (188, 181, 105), (191, 186, 100), + (199, 181, 88), (207, 175, 74), (207, 162, 56), (195, 142, 50), + (182, 118, 39), (165, 105, 30), (151, 98, 19), (136, 97, 29), + (121, 97, 42), (106, 107, 47), (95, 115, 39), (90, 114, 36), + (81, 108, 48), (76, 113, 53), (80, 126, 55), (88, 135, 44), + (89, 142, 44), (90, 146, 50), (97, 156, 71), (108, 165, 86), + (112, 182, 93), (112, 185, 96), (107, 180, 104), (102, 168, 112), + (94, 162, 117), (88, 156, 110), (89, 155, 104), (93, 155, 98), + (98, 156, 97), (103, 158, 91), (112, 158, 83), (119, 152, 81), + (127, 140, 85), (129, 133, 89), (134, 127, 90), (132, 117, 90), + (136, 107, 89), (120, 103, 85), (108, 102, 84), (90, 95, 82) + ), + +// 444 040222-01 +((54, 94, 49), (43, 94, 43), (41, 93, 50), (39, 93, 58), + (38, 95, 61), (38, 97, 65), (37, 98, 63), (36, 99, 62), + (25, 88, 69), (21, 78, 73), (17, 68, 77), (16, 63, 66), + (15, 58, 56), (15, 54, 48), (15, 50, 41), (14, 46, 40), + (14, 43, 40), (15, 33, 44), (16, 33, 44), (18, 34, 44), + (20, 40, 45), (22, 46, 46), (24, 50, 48), (27, 55, 51), + (35, 67, 56), (35, 68, 57), (35, 70, 59), (35, 73, 61), + (36, 77, 64), (38, 78, 65), (41, 79, 66), (42, 77, 74), + (44, 73, 76), (43, 70, 95), (48, 73, 106), (53, 76, 117), + (68, 87, 123), (83, 99, 129), (93, 107, 135), (103, 115, 142), + (146, 152, 174), (163, 169, 184), (181, 186, 195), (200, 201, 200), + (220, 216, 206), (223, 219, 206), (227, 222, 206), (219, 221, 196), + (201, 214, 177), (161, 191, 136), (139, 170, 112), (118, 150, 89), + (92, 133, 69), (66, 116, 50), (57, 110, 43), (49, 105, 37), + (33, 80, 27), (29, 70, 24), (26, 60, 22), (24, 54, 19), + (23, 49, 17), (24, 47, 17), (25, 46, 17), (26, 44, 17), + (28, 44, 17), (33, 59, 21), (39, 69, 26), (45, 80, 32), + (48, 84, 34), (52, 88, 36), (60, 95, 43), (69, 101, 48), + (77, 111, 64), (73, 106, 73), (70, 102, 83), (66, 92, 88), + (62, 82, 93), (59, 78, 97), (57, 75, 101), (50, 70, 109), + (42, 69, 120), (36, 68, 131), (35, 65, 128), (34, 62, 125), + (34, 62, 120), (35, 62, 116), (36, 67, 106), (38, 72, 95), + (38, 71, 72), (37, 69, 60), (37, 68, 48), (37, 70, 44), + (37, 73, 40), (39, 81, 38), (40, 83, 45), (42, 82, 56), + (46, 82, 68), (52, 89, 95), (56, 93, 113), (60, 98, 131), + (65, 101, 139), (70, 105, 147), (82, 112, 169), (96, 124, 180), + (122, 145, 200), (134, 154, 202), (147, 164, 205), (151, 166, 203), + (155, 169, 201), (158, 171, 203), (156, 169, 209), (149, 163, 205), + (143, 157, 205), (121, 138, 182), (116, 136, 177), (111, 134, 172), + (95, 131, 161), (85, 127, 149), (77, 125, 134), (71, 113, 117), + (65, 103, 97), (61, 100, 91), (57, 98, 86), (55, 94, 84), + (54, 90, 83), (51, 81, 85), (49, 73, 94), (47, 69, 103), + (47, 68, 112), (54, 71, 124), (55, 74, 127), (57, 78, 130), + (59, 83, 135), (59, 86, 141), (57, 86, 141), (56, 84, 145), + (54, 83, 150), (49, 80, 148), (44, 77, 147), (41, 74, 143), + (39, 72, 139), (36, 65, 132), (34, 59, 121), (31, 55, 107), + (28, 51, 92), (25, 45, 61), (25, 43, 55), (25, 41, 50), + (25, 41, 39), (25, 43, 31), (25, 47, 25), (25, 53, 20), + (21, 56, 32), (21, 57, 38), (21, 59, 45), (22, 59, 61), + (22, 61, 72), (23, 64, 83), (23, 66, 90), (25, 67, 98), + (27, 71, 105), (38, 86, 105), (40, 91, 102), (43, 96, 100), + (50, 103, 97), (55, 116, 94), (62, 129, 92), (69, 143, 90), + (78, 155, 105), (80, 154, 109), (82, 153, 114), (86, 149, 125), + (87, 143, 132), (86, 141, 135), (86, 134, 141), (87, 132, 139), + (90, 129, 132), (91, 128, 125), (88, 130, 115), (88, 132, 111), + (86, 141, 106), (87, 150, 97), (86, 156, 88), (80, 158, 81), + (70, 142, 86), (68, 138, 89), (66, 134, 92), (61, 122, 91), + (54, 112, 83), (46, 101, 72), (41, 88, 65), (37, 77, 63), + (34, 63, 68), (33, 57, 69), (32, 56, 69), (30, 56, 69), + (28, 60, 64), (25, 59, 70), (23, 60, 76), (27, 68, 83), + (33, 77, 89), (39, 89, 86), (42, 100, 81), (42, 105, 76), + (45, 108, 67), (47, 110, 60), (51, 109, 51), (52, 105, 43), + (50, 97, 37), (47, 85, 30), (41, 73, 23), (36, 60, 17), + (30, 47, 12), (25, 36, 9), (21, 28, 6), (19, 25, 4), + (18, 25, 3), (17, 28, 3), (17, 29, 3), (18, 32, 4), + (19, 36, 7), (21, 40, 10), (23, 48, 14), (26, 56, 18), + (31, 65, 22), (36, 75, 26), (40, 81, 30), (42, 85, 32), + (42, 88, 32), (42, 89, 31), (41, 89, 28), (39, 86, 25), + (34, 81, 22), (32, 76, 21), (31, 73, 20), (31, 72, 22), + (32, 75, 22), (33, 79, 25), (38, 87, 31), (46, 98, 37), + (58, 113, 47), (69, 132, 55), (80, 142, 64), (89, 150, 79), + (92, 151, 95), (100, 151, 111), (109, 155, 120), (112, 151, 123), + (114, 144, 122), (106, 131, 120), (91, 114, 116), (86, 106, 111), + (77, 97, 98), (73, 91, 84), (69, 91, 70), (58, 87, 54) + ), + +// 445 040222-02 +((140, 109, 204), (117, 101, 203), (109, 100, 208), (102, 99, 213), + (98, 93, 210), (95, 88, 208), (101, 89, 205), (107, 90, 203), + (133, 104, 206), (150, 116, 217), (167, 128, 229), (184, 136, 240), + (202, 144, 252), (216, 146, 252), (230, 149, 253), (235, 149, 253), + (240, 150, 254), (247, 153, 254), (240, 150, 254), (233, 148, 254), + (218, 141, 252), (204, 134, 250), (195, 128, 244), (186, 122, 239), + (151, 98, 207), (132, 86, 188), (114, 74, 170), (96, 65, 156), + (79, 57, 143), (69, 52, 135), (59, 47, 127), (43, 39, 110), + (29, 31, 91), (8, 14, 53), (5, 9, 42), (2, 4, 32), + (2, 4, 34), (2, 5, 36), (4, 8, 43), (6, 12, 51), + (16, 28, 82), (20, 35, 97), (24, 43, 112), (23, 42, 112), + (22, 42, 113), (21, 42, 113), (21, 42, 114), (21, 42, 114), + (21, 42, 114), (24, 45, 118), (21, 41, 108), (19, 37, 99), + (14, 29, 82), (10, 21, 65), (8, 17, 57), (6, 13, 49), + (1, 3, 26), (0, 2, 24), (0, 1, 22), (0, 3, 27), + (1, 6, 33), (3, 9, 41), (5, 13, 49), (11, 21, 67), + (17, 29, 85), (29, 43, 118), (30, 47, 126), (32, 51, 134), + (32, 52, 136), (33, 53, 138), (33, 54, 139), (32, 54, 139), + (35, 55, 142), (37, 58, 149), (39, 61, 157), (45, 62, 160), + (51, 63, 164), (54, 62, 164), (57, 62, 164), (63, 60, 163), + (71, 58, 161), (90, 65, 176), (108, 75, 193), (127, 85, 211), + (138, 89, 219), (149, 94, 228), (168, 103, 241), (186, 108, 251), + (208, 114, 254), (214, 116, 254), (221, 118, 254), (222, 119, 254), + (224, 120, 254), (223, 121, 254), (219, 121, 254), (208, 119, 251), + (191, 116, 242), (156, 99, 212), (137, 88, 193), (119, 78, 175), + (110, 73, 166), (102, 68, 158), (83, 60, 144), (65, 52, 128), + (32, 35, 93), (21, 26, 74), (10, 17, 55), (7, 13, 47), + (5, 10, 40), (2, 4, 29), (1, 1, 23), (0, 0, 21), + (0, 0, 20), (0, 0, 20), (0, 0, 21), (0, 0, 22), + (1, 0, 24), (1, 2, 28), (3, 5, 35), (7, 12, 52), + (24, 28, 89), (35, 35, 107), (47, 43, 126), (52, 46, 133), + (58, 49, 140), (68, 53, 150), (76, 60, 167), (83, 67, 184), + (87, 74, 200), (88, 80, 212), (88, 79, 211), (88, 79, 210), + (85, 76, 200), (84, 73, 194), (83, 73, 194), (84, 75, 201), + (82, 77, 205), (74, 75, 200), (67, 74, 195), (62, 70, 186), + (57, 67, 178), (49, 62, 164), (45, 58, 155), (44, 55, 150), + (47, 52, 145), (47, 49, 137), (45, 46, 129), (43, 43, 122), + (34, 37, 105), (23, 29, 86), (13, 21, 66), (7, 13, 47), + (1, 3, 21), (1, 2, 18), (1, 1, 16), (1, 1, 14), + (0, 0, 12), (1, 0, 12), (1, 1, 14), (1, 1, 16), + (2, 4, 22), (8, 15, 46), (10, 18, 54), (12, 22, 63), + (18, 29, 81), (24, 37, 99), (27, 43, 114), (30, 48, 125), + (29, 49, 128), (28, 49, 128), (27, 49, 129), (28, 49, 129), + (29, 48, 129), (29, 47, 127), (29, 47, 124), (26, 41, 110), + (22, 35, 96), (15, 27, 78), (10, 20, 61), (5, 12, 46), + (2, 5, 34), (0, 2, 28), (0, 0, 23), (0, 0, 22), + (0, 0, 21), (0, 0, 21), (0, 0, 22), (0, 0, 23), + (0, 0, 24), (0, 0, 26), (0, 0, 27), (0, 1, 28), + (0, 1, 29), (0, 1, 30), (0, 2, 30), (0, 2, 30), + (0, 2, 30), (0, 2, 31), (0, 2, 32), (0, 3, 35), + (1, 6, 40), (3, 10, 51), (9, 18, 67), (18, 26, 85), + (30, 35, 103), (43, 44, 120), (54, 51, 135), (64, 56, 149), + (68, 61, 161), (69, 67, 174), (69, 71, 183), (70, 73, 188), + (71, 76, 192), (73, 79, 194), (79, 82, 200), (81, 83, 202), + (81, 85, 206), (76, 85, 210), (71, 83, 209), (65, 82, 206), + (60, 78, 199), (59, 78, 198), (60, 79, 200), (63, 82, 205), + (66, 86, 215), (66, 87, 215), (64, 85, 212), (60, 78, 198), + (55, 71, 184), (51, 64, 169), (47, 59, 158), (44, 58, 156), + (42, 59, 155), (43, 61, 158), (47, 62, 159), (55, 63, 159), + (68, 63, 158), (83, 64, 159), (96, 67, 162), (106, 73, 173), + (116, 81, 190), (125, 91, 208), (134, 100, 225), (149, 107, 239), + (168, 113, 251), (187, 119, 254), (202, 122, 254), (211, 126, 254), + (216, 131, 254), (216, 138, 254), (200, 135, 252), (186, 131, 250), + (175, 129, 247), (163, 122, 237), (151, 114, 224), (139, 105, 211) + ), + +// 446 040222-03 +((108, 61, 116), (101, 42, 124), (99, 37, 123), (98, 32, 122), + (94, 32, 122), (91, 33, 122), (90, 33, 121), (89, 33, 121), + (96, 45, 138), (103, 51, 149), (111, 58, 161), (114, 66, 165), + (118, 75, 170), (114, 82, 166), (111, 89, 162), (108, 91, 158), + (106, 93, 154), (97, 99, 138), (94, 95, 132), (92, 92, 126), + (87, 87, 120), (83, 83, 115), (79, 81, 112), (76, 80, 109), + (62, 71, 94), (57, 64, 85), (53, 57, 77), (52, 51, 69), + (51, 45, 61), (52, 43, 58), (54, 42, 56), (61, 43, 56), + (70, 48, 62), (93, 68, 82), (107, 80, 95), (121, 93, 109), + (133, 104, 120), (145, 115, 131), (151, 119, 136), (158, 123, 141), + (182, 143, 162), (193, 151, 171), (204, 160, 181), (209, 164, 186), + (214, 168, 192), (213, 169, 193), (213, 171, 195), (211, 172, 196), + (208, 172, 194), (199, 169, 189), (193, 165, 184), (187, 161, 179), + (176, 152, 171), (166, 143, 164), (160, 138, 160), (155, 134, 157), + (142, 117, 144), (137, 114, 142), (133, 112, 141), (126, 110, 140), + (119, 108, 139), (116, 106, 138), (113, 105, 138), (107, 101, 137), + (100, 100, 135), (96, 87, 126), (95, 85, 123), (95, 83, 121), + (94, 82, 118), (93, 81, 115), (90, 77, 110), (86, 76, 108), + (76, 74, 101), (74, 70, 96), (73, 67, 92), (75, 67, 90), + (78, 68, 89), (79, 67, 87), (81, 67, 86), (85, 68, 85), + (89, 68, 84), (98, 75, 89), (98, 76, 93), (98, 77, 97), + (97, 79, 98), (97, 81, 99), (96, 82, 100), (97, 82, 99), + (105, 82, 98), (109, 85, 98), (113, 89, 98), (113, 89, 99), + (113, 90, 101), (112, 92, 102), (111, 94, 103), (112, 93, 102), + (115, 91, 102), (122, 86, 100), (124, 86, 99), (127, 86, 98), + (126, 86, 98), (125, 86, 99), (121, 87, 99), (114, 86, 97), + (110, 83, 95), (110, 80, 93), (110, 77, 91), (109, 75, 91), + (109, 74, 91), (108, 70, 92), (104, 66, 96), (97, 61, 101), + (94, 57, 106), (95, 48, 120), (98, 49, 123), (102, 50, 126), + (111, 56, 134), (126, 64, 143), (139, 72, 153), (151, 82, 163), + (171, 104, 187), (181, 114, 199), (191, 124, 211), (194, 128, 213), + (198, 133, 216), (209, 143, 220), (216, 152, 223), (223, 158, 221), + (225, 162, 217), (223, 168, 206), (221, 169, 204), (219, 170, 202), + (213, 168, 196), (206, 166, 189), (200, 162, 183), (193, 156, 177), + (175, 132, 161), (165, 121, 149), (156, 110, 138), (151, 105, 132), + (146, 100, 127), (135, 90, 116), (124, 83, 105), (113, 78, 94), + (100, 74, 85), (77, 57, 74), (73, 56, 73), (69, 55, 72), + (63, 53, 69), (63, 52, 68), (64, 53, 68), (67, 56, 71), + (73, 65, 82), (73, 65, 84), (74, 65, 86), (74, 67, 93), + (73, 72, 99), (75, 75, 105), (76, 78, 109), (81, 82, 113), + (87, 87, 117), (106, 89, 133), (110, 87, 136), (115, 85, 139), + (121, 83, 144), (125, 80, 151), (126, 75, 155), (127, 69, 159), + (129, 63, 160), (129, 61, 162), (129, 60, 164), (134, 58, 169), + (140, 60, 173), (147, 67, 177), (152, 74, 180), (158, 80, 186), + (163, 89, 192), (168, 95, 197), (166, 103, 199), (166, 106, 200), + (166, 110, 201), (168, 118, 202), (170, 126, 199), (173, 137, 196), + (183, 158, 198), (184, 162, 198), (186, 167, 198), (192, 169, 199), + (196, 167, 199), (198, 165, 199), (199, 160, 197), (200, 157, 193), + (202, 156, 191), (206, 153, 192), (207, 150, 191), (207, 145, 194), + (210, 140, 198), (213, 134, 200), (215, 126, 199), (213, 118, 198), + (212, 112, 198), (210, 106, 196), (209, 102, 191), (203, 97, 185), + (195, 93, 185), (187, 92, 185), (180, 90, 184), (169, 89, 181), + (157, 88, 180), (144, 87, 174), (134, 85, 162), (126, 83, 147), + (114, 79, 136), (104, 76, 124), (96, 74, 114), (87, 73, 103), + (80, 72, 99), (70, 71, 95), (62, 68, 91), (57, 65, 83), + (54, 60, 76), (53, 57, 69), (53, 53, 65), (53, 50, 60), + (55, 49, 57), (56, 48, 57), (59, 49, 58), (61, 50, 59), + (65, 52, 63), (71, 57, 68), (78, 64, 76), (87, 71, 85), + (96, 79, 92), (106, 84, 101), (116, 89, 109), (125, 92, 114), + (134, 96, 119), (145, 100, 123), (155, 104, 129), (166, 111, 136), + (177, 119, 143), (188, 127, 152), (195, 134, 160), (198, 136, 164), + (198, 137, 165), (194, 134, 162), (191, 129, 157), (183, 123, 151), + (176, 119, 143), (169, 114, 134), (161, 109, 128), (153, 102, 120), + (143, 97, 117), (131, 89, 116), (122, 81, 113), (112, 69, 112) + ), + +// 447 040222-05 +((97, 154, 138), (60, 119, 109), (59, 117, 109), (58, 115, 109), + (65, 124, 114), (73, 133, 120), (78, 139, 123), (83, 146, 126), + (104, 166, 142), (111, 173, 147), (119, 181, 152), (122, 183, 157), + (125, 186, 162), (128, 189, 165), (131, 192, 168), (132, 193, 168), + (133, 195, 169), (142, 198, 178), (149, 202, 181), (157, 207, 184), + (162, 208, 182), (168, 209, 180), (171, 211, 180), (175, 213, 181), + (158, 191, 164), (148, 178, 155), (138, 165, 147), (118, 153, 139), + (99, 141, 131), (97, 139, 129), (95, 137, 128), (92, 136, 131), + (95, 136, 126), (94, 139, 123), (91, 132, 117), (88, 126, 111), + (76, 124, 108), (65, 122, 105), (61, 117, 102), (57, 112, 100), + (50, 106, 97), (47, 104, 94), (45, 102, 91), (43, 102, 89), + (41, 102, 87), (40, 101, 85), (39, 101, 84), (39, 99, 84), + (40, 101, 85), (45, 103, 91), (49, 107, 99), (53, 111, 107), + (58, 116, 112), (63, 122, 118), (65, 125, 120), (68, 128, 123), + (73, 134, 125), (74, 135, 125), (76, 136, 125), (72, 132, 121), + (69, 128, 117), (65, 125, 115), (62, 122, 113), (58, 117, 110), + (55, 112, 105), (55, 114, 105), (62, 118, 108), (69, 123, 111), + (74, 125, 116), (79, 127, 121), (89, 132, 127), (93, 138, 131), + (103, 147, 145), (103, 155, 149), (104, 163, 153), (108, 168, 154), + (113, 173, 156), (113, 174, 157), (114, 176, 158), (119, 179, 159), + (124, 184, 162), (132, 193, 170), (142, 199, 177), (152, 206, 184), + (156, 208, 186), (161, 211, 189), (169, 215, 191), (176, 219, 197), + (188, 220, 203), (191, 221, 205), (194, 222, 208), (191, 220, 207), + (188, 218, 206), (184, 218, 205), (174, 210, 196), (151, 197, 184), + (125, 182, 173), (87, 146, 141), (72, 130, 127), (58, 115, 113), + (53, 111, 108), (49, 107, 104), (44, 102, 95), (43, 100, 89), + (43, 106, 86), (48, 112, 90), (53, 119, 94), (55, 123, 95), + (57, 127, 96), (64, 134, 101), (69, 139, 108), (70, 144, 108), + (70, 141, 109), (72, 134, 113), (75, 131, 112), (78, 128, 111), + (84, 123, 109), (88, 119, 110), (98, 121, 109), (104, 125, 105), + (101, 135, 110), (96, 138, 111), (91, 141, 112), (88, 142, 113), + (85, 144, 115), (80, 146, 119), (78, 145, 121), (81, 146, 125), + (84, 146, 130), (96, 137, 128), (97, 136, 127), (99, 135, 126), + (87, 128, 120), (80, 120, 109), (75, 113, 100), (60, 108, 94), + (44, 104, 91), (48, 108, 94), (52, 113, 97), (55, 116, 101), + (58, 119, 105), (63, 127, 111), (71, 136, 115), (80, 145, 123), + (85, 151, 130), (95, 160, 137), (97, 162, 139), (99, 164, 141), + (101, 164, 145), (101, 166, 144), (99, 163, 141), (94, 157, 137), + (78, 139, 123), (73, 134, 120), (68, 130, 118), (63, 122, 115), + (61, 120, 114), (62, 123, 117), (70, 131, 124), (79, 140, 130), + (86, 148, 135), (99, 162, 143), (100, 163, 142), (101, 165, 141), + (99, 165, 139), (95, 161, 133), (88, 155, 127), (81, 148, 121), + (62, 124, 103), (58, 119, 99), (54, 115, 95), (48, 106, 89), + (42, 98, 84), (37, 95, 79), (35, 94, 76), (36, 94, 78), + (37, 94, 81), (42, 100, 88), (51, 111, 97), (60, 122, 109), + (73, 135, 122), (88, 152, 134), (104, 167, 145), (122, 180, 154), + (152, 199, 165), (153, 200, 165), (155, 202, 165), (154, 202, 167), + (152, 200, 165), (143, 196, 160), (131, 191, 162), (125, 187, 164), + (123, 186, 162), (123, 186, 163), (121, 183, 165), (118, 181, 162), + (115, 180, 157), (113, 179, 151), (107, 174, 146), (100, 169, 142), + (98, 168, 137), (93, 163, 131), (85, 154, 128), (81, 148, 124), + (77, 140, 121), (70, 130, 118), (65, 124, 115), (65, 122, 116), + (66, 123, 118), (68, 127, 118), (75, 136, 122), (81, 146, 127), + (87, 153, 131), (95, 161, 135), (100, 167, 141), (103, 170, 145), + (109, 174, 148), (114, 178, 152), (116, 181, 154), (121, 185, 154), + (127, 190, 154), (130, 194, 156), (134, 198, 157), (141, 202, 160), + (153, 205, 164), (152, 204, 168), (148, 203, 174), (153, 202, 175), + (149, 199, 174), (139, 196, 174), (135, 194, 171), (134, 192, 168), + (130, 191, 165), (126, 188, 162), (124, 186, 159), (121, 182, 155), + (115, 179, 152), (113, 176, 151), (112, 174, 150), (111, 175, 148), + (113, 176, 151), (116, 177, 154), (116, 179, 154), (115, 179, 157), + (115, 176, 156), (112, 170, 152), (108, 161, 150), (109, 151, 143), + (112, 143, 134), (110, 137, 136), (111, 144, 140), (121, 153, 142), + (126, 159, 150), (124, 174, 160), (112, 174, 152), (101, 160, 140) + ), + +// 448 040222-06 +((101, 0, 0), (96, 0, 1), (94, 0, 1), (92, 0, 1), + (86, 0, 0), (80, 0, 0), (78, 0, 0), (77, 0, 0), + (74, 0, 0), (71, 0, 0), (68, 0, 0), (61, 0, 2), + (55, 0, 4), (50, 0, 2), (46, 1, 0), (46, 0, 0), + (46, 0, 0), (59, 0, 0), (77, 0, 0), (96, 1, 0), + (114, 0, 0), (132, 0, 0), (138, 0, 0), (144, 0, 0), + (156, 0, 0), (153, 4, 7), (150, 9, 15), (136, 4, 7), + (122, 0, 0), (114, 0, 0), (106, 0, 0), (98, 0, 0), + (92, 1, 0), (79, 0, 0), (82, 0, 0), (86, 0, 1), + (87, 0, 0), (89, 1, 0), (85, 1, 0), (82, 1, 0), + (70, 2, 1), (64, 1, 0), (58, 0, 0), (56, 0, 0), + (55, 0, 0), (55, 0, 0), (55, 0, 0), (56, 0, 1), + (58, 0, 1), (68, 0, 1), (69, 0, 2), (71, 0, 4), + (62, 0, 3), (53, 1, 3), (48, 1, 3), (44, 2, 4), + (17, 6, 4), (9, 5, 2), (2, 4, 0), (3, 2, 0), + (4, 0, 0), (7, 0, 0), (11, 0, 0), (30, 0, 0), + (39, 0, 0), (46, 0, 0), (50, 0, 0), (54, 0, 0), + (56, 0, 0), (59, 1, 0), (67, 8, 4), (74, 15, 21), + (53, 11, 15), (50, 5, 10), (48, 0, 5), (47, 1, 4), + (46, 2, 3), (45, 1, 1), (45, 1, 0), (47, 2, 0), + (52, 1, 0), (72, 4, 3), (81, 19, 19), (90, 34, 35), + (103, 27, 26), (116, 21, 17), (122, 24, 23), (134, 5, 10), + (140, 0, 1), (132, 0, 0), (125, 0, 0), (121, 0, 0), + (117, 0, 0), (103, 0, 0), (97, 0, 0), (91, 1, 0), + (83, 1, 5), (73, 1, 4), (64, 1, 5), (56, 1, 6), + (53, 2, 5), (50, 4, 4), (47, 1, 3), (44, 0, 1), + (49, 1, 1), (53, 0, 1), (58, 0, 1), (62, 0, 1), + (66, 0, 1), (72, 0, 1), (80, 1, 0), (90, 2, 1), + (93, 0, 0), (95, 1, 0), (93, 2, 1), (91, 3, 2), + (87, 3, 1), (79, 1, 1), (69, 1, 0), (58, 0, 0), + (47, 0, 0), (44, 0, 0), (42, 0, 1), (41, 1, 1), + (40, 2, 1), (39, 0, 1), (31, 0, 0), (13, 0, 0), + (7, 0, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), + (0, 1, 2), (0, 1, 5), (6, 0, 4), (22, 0, 0), + (59, 0, 2), (86, 2, 2), (113, 5, 3), (121, 11, 8), + (130, 18, 14), (154, 32, 29), (163, 8, 12), (173, 4, 11), + (183, 7, 17), (187, 2, 0), (180, 5, 1), (174, 9, 3), + (151, 3, 1), (136, 0, 0), (123, 1, 0), (106, 0, 0), + (74, 0, 1), (67, 0, 0), (61, 0, 0), (52, 0, 0), + (46, 0, 0), (45, 0, 0), (45, 0, 0), (45, 0, 0), + (44, 0, 0), (44, 0, 1), (42, 0, 1), (41, 1, 2), + (41, 1, 1), (41, 0, 0), (44, 0, 0), (45, 0, 0), + (53, 0, 2), (55, 0, 2), (57, 1, 2), (62, 0, 1), + (69, 0, 1), (75, 1, 2), (80, 0, 1), (85, 1, 1), + (89, 0, 0), (89, 0, 0), (81, 0, 0), (78, 0, 0), + (73, 1, 2), (67, 2, 0), (56, 0, 1), (48, 0, 0), + (33, 0, 0), (24, 0, 0), (15, 0, 0), (7, 0, 0), + (1, 0, 4), (4, 0, 4), (8, 0, 0), (15, 0, 0), + (33, 0, 0), (40, 0, 0), (43, 0, 0), (45, 0, 1), + (50, 0, 1), (54, 0, 0), (58, 0, 0), (65, 1, 0), + (68, 0, 0), (70, 0, 0), (71, 0, 0), (71, 0, 0), + (71, 1, 1), (72, 0, 1), (74, 0, 0), (74, 0, 0), + (75, 0, 0), (79, 0, 0), (85, 0, 0), (93, 0, 0), + (100, 0, 0), (108, 0, 0), (120, 15, 9), (119, 23, 25), + (97, 19, 17), (90, 5, 12), (80, 11, 14), (75, 3, 6), + (80, 0, 1), (91, 0, 0), (103, 0, 0), (115, 1, 1), + (137, 1, 1), (148, 0, 0), (171, 2, 0), (173, 0, 0), + (186, 1, 0), (195, 1, 1), (223, 13, 12), (234, 11, 12), + (236, 0, 0), (215, 0, 0), (213, 0, 0), (194, 0, 0), + (182, 0, 1), (168, 0, 0), (151, 1, 2), (138, 0, 0), + (133, 0, 1), (128, 0, 0), (123, 0, 0), (122, 2, 1), + (118, 0, 0), (114, 0, 4), (109, 0, 3), (103, 0, 1), + (100, 3, 0), (99, 3, 4), (97, 1, 2), (97, 0, 0), + (102, 0, 0), (103, 0, 0), (114, 2, 0), (108, 0, 0) + ), + +// 449 040222-07 +((91, 49, 67), (81, 45, 62), (77, 41, 58), (74, 37, 54), + (72, 33, 50), (71, 30, 47), (71, 27, 45), (72, 24, 44), + (83, 21, 49), (84, 23, 51), (86, 26, 53), (89, 30, 59), + (93, 35, 65), (102, 42, 73), (112, 50, 81), (119, 53, 86), + (127, 56, 91), (160, 73, 115), (171, 84, 126), (183, 96, 138), + (189, 107, 147), (195, 118, 156), (195, 121, 157), (195, 124, 159), + (185, 123, 154), (175, 115, 145), (166, 107, 136), (154, 100, 125), + (142, 93, 114), (135, 90, 109), (129, 87, 104), (116, 81, 93), + (101, 73, 83), (71, 55, 57), (57, 44, 45), (43, 33, 34), + (37, 27, 30), (32, 21, 26), (32, 22, 26), (33, 24, 27), + (51, 35, 45), (66, 43, 61), (82, 52, 77), (97, 61, 89), + (112, 70, 102), (120, 76, 108), (128, 82, 115), (144, 100, 132), + (155, 114, 145), (183, 140, 169), (193, 147, 181), (203, 155, 194), + (206, 155, 194), (210, 155, 194), (210, 156, 193), (211, 157, 193), + (202, 150, 184), (197, 144, 175), (193, 138, 166), (193, 129, 164), + (194, 120, 163), (192, 114, 159), (190, 109, 155), (185, 102, 146), + (178, 97, 138), (159, 80, 117), (147, 68, 104), (136, 56, 92), + (134, 51, 88), (132, 47, 84), (125, 40, 79), (119, 34, 72), + (106, 32, 61), (93, 31, 51), (81, 30, 42), (68, 24, 32), + (55, 19, 22), (49, 15, 18), (44, 12, 14), (34, 6, 8), + (27, 1, 4), (19, 0, 0), (16, 0, 0), (14, 0, 0), + (13, 0, 0), (13, 0, 0), (11, 0, 0), (8, 0, 0), + (4, 0, 0), (2, 0, 0), (1, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (1, 0, 0), (2, 0, 0), + (3, 0, 0), (5, 0, 0), (5, 0, 0), (6, 0, 0), + (6, 0, 0), (6, 0, 0), (6, 0, 0), (7, 0, 0), + (11, 1, 1), (14, 1, 4), (18, 1, 7), (19, 0, 7), + (21, 0, 8), (23, 1, 8), (23, 1, 8), (22, 2, 9), + (20, 2, 8), (17, 2, 6), (17, 2, 6), (17, 3, 7), + (17, 2, 8), (17, 2, 9), (18, 2, 9), (17, 3, 9), + (12, 3, 5), (8, 3, 3), (4, 3, 1), (3, 3, 0), + (2, 3, 0), (0, 2, 0), (0, 1, 0), (0, 1, 0), + (1, 2, 0), (5, 2, 1), (7, 2, 2), (10, 2, 3), + (15, 3, 5), (23, 7, 10), (31, 12, 17), (40, 18, 25), + (62, 31, 43), (76, 34, 52), (90, 37, 61), (98, 38, 64), + (106, 39, 68), (121, 39, 67), (129, 39, 70), (136, 42, 74), + (138, 45, 77), (133, 50, 78), (130, 48, 77), (128, 46, 76), + (123, 46, 79), (120, 41, 69), (113, 32, 61), (104, 26, 53), + (81, 18, 36), (73, 16, 31), (65, 15, 27), (49, 10, 19), + (34, 8, 19), (27, 8, 16), (24, 9, 14), (26, 11, 14), + (32, 16, 19), (53, 31, 36), (60, 34, 41), (68, 38, 47), + (83, 45, 60), (96, 52, 74), (110, 59, 88), (126, 66, 99), + (152, 85, 121), (159, 91, 127), (166, 97, 133), (180, 111, 143), + (193, 122, 152), (201, 130, 163), (207, 137, 172), (209, 138, 175), + (206, 138, 176), (199, 135, 171), (187, 130, 164), (174, 124, 152), + (159, 118, 137), (144, 108, 123), (131, 102, 112), (122, 95, 102), + (112, 84, 94), (110, 81, 93), (109, 79, 93), (105, 75, 90), + (101, 73, 87), (97, 72, 84), (92, 69, 81), (89, 67, 76), + (89, 66, 72), (92, 65, 72), (98, 68, 76), (106, 73, 81), + (117, 79, 89), (130, 89, 99), (141, 96, 110), (149, 105, 119), + (156, 112, 122), (159, 115, 124), (159, 116, 124), (158, 116, 124), + (157, 116, 121), (160, 118, 123), (165, 120, 127), (171, 125, 132), + (179, 132, 140), (186, 135, 147), (191, 139, 150), (191, 140, 152), + (187, 138, 148), (183, 134, 145), (179, 127, 140), (174, 120, 134), + (169, 115, 131), (166, 108, 128), (162, 104, 124), (156, 100, 119), + (150, 94, 111), (142, 86, 104), (134, 76, 95), (128, 66, 87), + (121, 59, 82), (120, 52, 80), (123, 45, 86), (124, 41, 93), + (131, 37, 101), (138, 33, 110), (146, 37, 120), (154, 41, 127), + (160, 44, 133), (166, 49, 135), (171, 51, 140), (174, 55, 144), + (177, 59, 147), (180, 57, 152), (179, 59, 154), (177, 60, 154), + (170, 60, 150), (162, 60, 141), (152, 61, 130), (142, 62, 119), + (131, 66, 106), (120, 65, 95), (110, 62, 86), (105, 63, 81), + (99, 63, 76), (91, 62, 69), (84, 58, 65), (82, 56, 63), + (83, 53, 61), (84, 53, 61), (83, 50, 60), (86, 48, 63) + ), + +// 450 040222-08 +((63, 75, 138), (68, 68, 145), (67, 64, 142), (67, 60, 139), + (66, 54, 133), (66, 48, 127), (65, 45, 124), (65, 43, 122), + (67, 43, 123), (67, 49, 130), (68, 55, 137), (67, 60, 140), + (66, 65, 143), (64, 66, 139), (62, 68, 136), (60, 66, 132), + (58, 65, 128), (53, 60, 109), (52, 60, 107), (52, 61, 106), + (53, 61, 109), (55, 61, 113), (57, 62, 117), (59, 63, 121), + (67, 58, 138), (72, 53, 143), (78, 49, 149), (82, 44, 153), + (86, 39, 157), (89, 37, 157), (92, 36, 158), (95, 33, 156), + (97, 34, 156), (98, 45, 163), (95, 53, 167), (93, 61, 172), + (89, 69, 177), (85, 77, 182), (85, 80, 183), (85, 84, 185), + (84, 90, 176), (85, 90, 170), (87, 91, 165), (88, 94, 165), + (90, 97, 165), (91, 99, 166), (92, 102, 167), (91, 108, 171), + (92, 111, 179), (96, 117, 194), (100, 112, 198), (105, 108, 202), + (110, 104, 209), (116, 100, 216), (119, 99, 219), (122, 98, 222), + (127, 103, 227), (124, 109, 229), (121, 115, 232), (115, 116, 227), + (109, 117, 222), (105, 114, 216), (101, 111, 211), (93, 105, 200), + (86, 97, 191), (76, 86, 166), (72, 82, 157), (68, 79, 149), + (67, 78, 146), (67, 77, 144), (66, 78, 144), (64, 77, 144), + (64, 73, 149), (68, 70, 152), (72, 67, 155), (80, 63, 156), + (89, 59, 157), (93, 57, 158), (98, 56, 160), (106, 61, 168), + (114, 67, 179), (134, 84, 204), (140, 93, 216), (146, 102, 228), + (148, 105, 232), (150, 109, 236), (153, 114, 236), (152, 113, 230), + (145, 109, 211), (140, 106, 199), (135, 104, 188), (132, 102, 182), + (129, 100, 176), (117, 97, 164), (107, 94, 155), (100, 90, 144), + (91, 82, 131), (75, 60, 106), (69, 50, 93), (63, 41, 80), + (60, 37, 75), (58, 33, 70), (53, 25, 60), (49, 19, 52), + (45, 11, 42), (46, 8, 43), (48, 6, 45), (49, 5, 48), + (51, 5, 51), (57, 6, 62), (64, 8, 76), (70, 11, 91), + (76, 13, 105), (84, 18, 129), (85, 18, 132), (86, 19, 136), + (88, 19, 139), (88, 18, 140), (88, 18, 140), (88, 18, 140), + (87, 18, 139), (83, 20, 139), (79, 23, 139), (76, 24, 138), + (74, 26, 137), (69, 27, 131), (64, 28, 123), (58, 28, 113), + (52, 28, 103), (41, 28, 81), (38, 30, 78), (36, 33, 75), + (32, 38, 72), (28, 44, 72), (26, 48, 71), (26, 51, 71), + (27, 57, 76), (29, 57, 79), (31, 58, 82), (33, 58, 83), + (36, 59, 85), (42, 61, 89), (46, 64, 97), (53, 67, 104), + (61, 70, 113), (79, 79, 129), (81, 83, 133), (84, 88, 138), + (84, 94, 145), (85, 99, 150), (86, 106, 155), (89, 107, 161), + (95, 111, 179), (98, 109, 184), (101, 107, 190), (107, 104, 198), + (112, 103, 206), (114, 102, 213), (113, 103, 214), (108, 108, 212), + (107, 108, 209), (105, 107, 205), (105, 105, 204), (106, 103, 204), + (109, 98, 202), (113, 93, 203), (118, 86, 204), (120, 80, 201), + (110, 73, 184), (107, 72, 178), (105, 71, 173), (99, 69, 161), + (93, 65, 147), (88, 64, 133), (81, 63, 123), (76, 61, 116), + (72, 61, 111), (67, 59, 107), (61, 55, 102), (56, 51, 97), + (51, 46, 93), (48, 40, 87), (43, 35, 81), (38, 29, 76), + (26, 22, 63), (24, 21, 60), (22, 21, 57), (19, 19, 51), + (17, 18, 48), (16, 15, 45), (17, 13, 44), (19, 13, 44), + (22, 10, 46), (26, 10, 48), (29, 9, 50), (32, 10, 54), + (35, 11, 56), (38, 14, 58), (41, 16, 59), (42, 19, 61), + (43, 25, 62), (43, 30, 64), (45, 32, 67), (46, 34, 67), + (45, 36, 68), (46, 37, 71), (46, 41, 75), (50, 46, 82), + (51, 53, 91), (54, 66, 104), (53, 81, 116), (55, 94, 130), + (55, 107, 140), (53, 121, 148), (49, 130, 155), (44, 137, 158), + (42, 142, 160), (40, 143, 161), (41, 146, 164), (40, 152, 167), + (42, 158, 174), (44, 164, 181), (46, 171, 188), (49, 174, 192), + (51, 176, 196), (55, 173, 196), (60, 169, 195), (65, 161, 197), + (68, 152, 197), (73, 145, 195), (77, 138, 192), (79, 134, 187), + (81, 128, 182), (81, 128, 181), (80, 128, 180), (81, 131, 179), + (81, 132, 179), (80, 131, 183), (80, 130, 184), (81, 129, 186), + (81, 128, 185), (82, 125, 181), (80, 123, 178), (76, 121, 173), + (72, 125, 168), (66, 131, 163), (61, 135, 161), (55, 138, 161), + (50, 140, 161), (46, 137, 158), (44, 131, 151), (44, 121, 144), + (47, 108, 137), (50, 97, 132), (53, 88, 131), (58, 80, 133) + ), + +// 451 040222-09 +((129, 104, 65), (88, 68, 58), (66, 46, 50), (44, 25, 42), + (35, 13, 37), (26, 1, 32), (27, 1, 31), (29, 1, 30), + (41, 0, 23), (49, 0, 18), (58, 1, 14), (67, 1, 10), + (76, 1, 6), (83, 4, 5), (91, 7, 5), (95, 10, 7), + (99, 14, 9), (128, 35, 16), (145, 51, 20), (162, 67, 24), + (173, 85, 29), (184, 103, 35), (187, 109, 38), (190, 115, 42), + (206, 121, 40), (205, 118, 36), (204, 116, 33), (191, 111, 31), + (179, 106, 29), (171, 99, 27), (163, 92, 25), (149, 75, 19), + (135, 56, 12), (103, 22, 1), (88, 14, 0), (73, 7, 0), + (66, 4, 3), (59, 1, 6), (57, 1, 8), (56, 2, 11), + (62, 10, 19), (73, 17, 22), (84, 25, 25), (100, 32, 28), + (116, 40, 32), (123, 42, 32), (131, 45, 33), (144, 54, 35), + (157, 65, 34), (179, 83, 43), (181, 86, 54), (184, 90, 65), + (174, 92, 77), (165, 94, 89), (159, 93, 90), (154, 92, 91), + (142, 87, 96), (128, 83, 109), (114, 80, 122), (92, 79, 143), + (71, 78, 164), (64, 78, 169), (58, 79, 175), (54, 78, 180), + (53, 77, 178), (52, 88, 192), (44, 96, 208), (36, 104, 225), + (34, 104, 231), (32, 105, 237), (27, 102, 242), (24, 98, 237), + (28, 83, 214), (28, 76, 203), (29, 69, 192), (32, 62, 179), + (36, 55, 167), (43, 51, 158), (50, 47, 149), (68, 44, 128), + (84, 47, 105), (115, 56, 72), (128, 60, 60), (141, 64, 49), + (146, 62, 43), (152, 60, 37), (158, 59, 25), (159, 59, 21), + (140, 56, 20), (122, 47, 25), (104, 38, 30), (94, 32, 34), + (84, 26, 38), (64, 14, 50), (44, 9, 68), (30, 10, 91), + (18, 17, 113), (5, 31, 153), (3, 37, 167), (1, 43, 181), + (1, 43, 187), (1, 43, 193), (2, 44, 201), (2, 42, 203), + (2, 39, 188), (1, 37, 174), (1, 35, 161), (1, 31, 155), + (2, 28, 149), (2, 20, 139), (2, 12, 130), (3, 4, 116), + (6, 3, 100), (21, 9, 72), (25, 9, 68), (29, 9, 64), + (34, 9, 63), (35, 8, 64), (37, 7, 61), (36, 8, 59), + (46, 10, 39), (50, 9, 33), (54, 8, 27), (57, 7, 25), + (60, 6, 23), (63, 6, 21), (70, 8, 22), (81, 13, 23), + (96, 19, 22), (119, 29, 17), (123, 31, 14), (128, 33, 12), + (137, 34, 7), (144, 34, 7), (152, 37, 6), (157, 39, 7), + (156, 37, 6), (148, 31, 4), (140, 25, 2), (135, 22, 1), + (131, 19, 0), (123, 14, 0), (119, 11, 0), (113, 8, 0), + (107, 5, 0), (99, 1, 1), (98, 0, 1), (98, 0, 1), + (102, 1, 1), (108, 3, 0), (111, 5, 0), (114, 11, 1), + (127, 23, 1), (133, 27, 1), (139, 31, 1), (154, 39, 1), + (168, 47, 1), (182, 59, 3), (194, 71, 5), (200, 80, 8), + (204, 89, 11), (202, 92, 21), (200, 92, 22), (199, 92, 24), + (197, 93, 28), (193, 88, 30), (183, 83, 29), (169, 73, 32), + (131, 49, 36), (124, 45, 38), (117, 41, 40), (112, 38, 43), + (114, 39, 42), (119, 42, 40), (131, 51, 40), (137, 58, 39), + (146, 65, 39), (154, 74, 39), (165, 81, 39), (174, 84, 35), + (184, 89, 32), (185, 88, 28), (185, 86, 23), (178, 81, 19), + (159, 64, 10), (156, 60, 8), (153, 57, 6), (142, 49, 7), + (132, 40, 9), (119, 34, 12), (105, 27, 19), (92, 21, 28), + (81, 19, 35), (74, 19, 41), (71, 19, 50), (75, 22, 54), + (80, 26, 57), (88, 32, 59), (96, 36, 58), (103, 41, 53), + (111, 47, 50), (124, 54, 44), (140, 63, 38), (159, 74, 32), + (179, 81, 24), (195, 86, 16), (204, 88, 9), (205, 84, 3), + (200, 78, 1), (187, 72, 8), (174, 66, 20), (159, 62, 32), + (142, 56, 47), (126, 47, 57), (107, 38, 62), (86, 28, 65), + (66, 18, 70), (52, 14, 75), (37, 16, 89), (32, 23, 103), + (28, 29, 120), (22, 36, 135), (15, 38, 145), (12, 34, 144), + (4, 27, 143), (7, 26, 133), (14, 24, 127), (25, 31, 124), + (40, 43, 125), (61, 52, 119), (80, 61, 113), (99, 73, 98), + (118, 80, 83), (139, 93, 67), (159, 109, 56), (181, 120, 47), + (203, 133, 41), (223, 146, 37), (237, 153, 35), (246, 159, 35), + (248, 161, 35), (245, 155, 35), (236, 143, 32), (227, 130, 29), + (220, 119, 25), (219, 113, 23), (218, 113, 23), (222, 117, 29), + (223, 124, 31), (221, 130, 40), (218, 140, 47), (198, 126, 47), + (177, 116, 48), (161, 108, 53), (145, 101, 52), (128, 92, 56) + ), + +// 452 040222-10 +((105, 97, 60), (56, 52, 35), (45, 37, 28), (35, 22, 21), + (48, 26, 19), (61, 30, 18), (65, 31, 17), (70, 33, 16), + (76, 29, 14), (74, 30, 15), (72, 31, 16), (65, 36, 18), + (59, 41, 20), (45, 40, 24), (32, 40, 28), (25, 40, 29), + (18, 40, 31), (5, 41, 34), (4, 39, 32), (4, 38, 30), + (3, 33, 26), (3, 29, 22), (4, 26, 20), (6, 24, 18), + (26, 17, 12), (39, 14, 8), (53, 11, 5), (68, 12, 6), + (83, 13, 7), (89, 13, 8), (95, 13, 9), (103, 12, 9), + (98, 9, 6), (89, 12, 9), (78, 12, 11), (67, 13, 13), + (49, 12, 13), (31, 11, 14), (25, 12, 14), (19, 14, 15), + (22, 28, 23), (31, 36, 26), (41, 45, 29), (46, 55, 32), + (52, 66, 36), (55, 71, 37), (59, 76, 39), (61, 80, 42), + (59, 79, 43), (50, 75, 40), (41, 73, 40), (33, 71, 40), + (23, 61, 39), (13, 52, 38), (9, 48, 37), (6, 44, 36), + (3, 40, 32), (2, 38, 31), (2, 37, 31), (3, 37, 31), + (4, 37, 31), (6, 38, 29), (9, 39, 28), (21, 43, 28), + (36, 49, 29), (78, 70, 42), (95, 87, 55), (112, 105, 68), + (122, 115, 73), (132, 126, 79), (147, 143, 78), (158, 153, 72), + (139, 148, 82), (124, 144, 85), (109, 140, 88), (90, 129, 74), + (71, 119, 61), (62, 110, 60), (54, 102, 59), (43, 85, 62), + (42, 76, 69), (66, 83, 70), (82, 87, 72), (99, 91, 74), + (104, 88, 74), (109, 86, 75), (118, 91, 74), (133, 93, 69), + (157, 88, 55), (155, 81, 51), (153, 75, 47), (151, 73, 46), + (149, 71, 45), (152, 70, 47), (159, 73, 48), (166, 77, 51), + (174, 92, 53), (178, 123, 62), (172, 121, 63), (166, 120, 65), + (161, 119, 62), (157, 118, 60), (138, 115, 62), (121, 121, 57), + (91, 96, 45), (84, 74, 36), (78, 52, 27), (70, 47, 24), + (62, 42, 22), (46, 32, 20), (37, 27, 17), (43, 23, 15), + (62, 22, 12), (82, 26, 14), (83, 28, 15), (84, 31, 16), + (83, 34, 20), (89, 37, 21), (100, 43, 20), (100, 45, 23), + (87, 44, 25), (75, 40, 22), (63, 36, 19), (55, 33, 18), + (48, 30, 17), (33, 24, 14), (19, 20, 13), (8, 15, 12), + (3, 14, 9), (1, 16, 10), (1, 17, 11), (2, 19, 13), + (3, 24, 17), (4, 28, 20), (5, 34, 24), (5, 41, 32), + (15, 57, 61), (30, 72, 85), (45, 88, 110), (54, 99, 122), + (64, 111, 134), (84, 127, 150), (102, 142, 165), (119, 151, 181), + (127, 153, 191), (131, 155, 194), (129, 152, 185), (127, 150, 177), + (118, 137, 157), (103, 113, 129), (74, 92, 104), (54, 68, 81), + (25, 40, 46), (21, 35, 40), (17, 31, 34), (9, 27, 25), + (6, 25, 21), (12, 24, 21), (23, 28, 22), (35, 34, 24), + (47, 41, 28), (64, 55, 34), (72, 58, 35), (80, 62, 36), + (94, 71, 38), (109, 76, 42), (113, 80, 41), (113, 81, 42), + (117, 78, 38), (120, 77, 38), (124, 76, 39), (130, 72, 38), + (133, 69, 37), (135, 67, 37), (136, 63, 36), (132, 59, 40), + (130, 60, 48), (125, 63, 58), (121, 67, 69), (123, 80, 88), + (116, 92, 108), (111, 108, 120), (107, 129, 129), (95, 133, 121), + (76, 132, 115), (69, 127, 110), (63, 122, 106), (61, 123, 102), + (53, 115, 84), (43, 105, 60), (31, 85, 46), (15, 60, 31), + (8, 43, 25), (8, 33, 22), (14, 32, 20), (26, 35, 20), + (36, 41, 23), (47, 61, 32), (62, 75, 49), (77, 94, 69), + (96, 108, 90), (113, 115, 102), (134, 131, 106), (153, 135, 110), + (167, 143, 116), (175, 141, 121), (167, 128, 119), (164, 115, 105), + (150, 93, 86), (137, 77, 69), (121, 61, 57), (95, 51, 48), + (76, 44, 41), (53, 35, 36), (35, 30, 33), (18, 26, 34), + (7, 26, 34), (2, 29, 32), (1, 31, 31), (1, 35, 30), + (2, 37, 31), (4, 39, 31), (5, 39, 32), (4, 40, 33), + (4, 39, 33), (5, 38, 32), (5, 37, 30), (6, 34, 28), + (6, 31, 26), (4, 29, 25), (4, 27, 25), (4, 27, 24), + (4, 26, 25), (4, 26, 24), (4, 27, 24), (3, 29, 26), + (5, 32, 29), (12, 39, 36), (21, 47, 47), (34, 63, 67), + (56, 85, 93), (79, 109, 117), (108, 134, 140), (134, 152, 158), + (155, 171, 178), (179, 192, 201), (198, 214, 221), (215, 231, 228), + (230, 240, 223), (235, 234, 207), (229, 222, 187), (226, 206, 169), + (192, 176, 142), (160, 155, 119), (138, 130, 95), (104, 108, 74) + ), + +// 453 040222-11 +((203, 172, 123), (209, 179, 129), (213, 183, 131), (217, 187, 134), + (219, 188, 135), (222, 190, 137), (222, 189, 137), (222, 189, 137), + (209, 175, 124), (201, 167, 116), (193, 159, 109), (185, 150, 100), + (177, 141, 91), (170, 132, 84), (163, 124, 78), (159, 119, 74), + (156, 115, 71), (143, 100, 59), (137, 94, 54), (131, 89, 49), + (128, 86, 46), (125, 84, 43), (124, 83, 43), (124, 83, 43), + (123, 83, 44), (123, 83, 44), (123, 83, 44), (121, 81, 42), + (119, 80, 41), (118, 79, 40), (117, 79, 39), (113, 76, 35), + (109, 74, 33), (105, 70, 31), (103, 68, 31), (102, 67, 31), + (100, 66, 31), (99, 65, 31), (98, 64, 30), (98, 63, 29), + (95, 61, 27), (94, 60, 27), (93, 60, 28), (92, 60, 29), + (91, 60, 30), (90, 59, 31), (90, 59, 32), (89, 57, 32), + (86, 54, 28), (79, 46, 22), (75, 42, 20), (71, 38, 18), + (66, 34, 16), (62, 31, 15), (60, 30, 15), (58, 29, 16), + (49, 25, 14), (46, 22, 11), (43, 19, 9), (40, 16, 7), + (37, 14, 6), (35, 12, 5), (33, 11, 5), (28, 9, 4), + (25, 9, 4), (22, 10, 4), (24, 11, 5), (26, 13, 6), + (28, 15, 7), (30, 17, 8), (32, 19, 10), (33, 19, 10), + (32, 19, 11), (32, 19, 10), (32, 19, 9), (36, 21, 9), + (41, 24, 9), (44, 26, 10), (48, 29, 11), (54, 33, 15), + (61, 39, 20), (71, 49, 29), (72, 50, 30), (74, 52, 31), + (74, 53, 31), (75, 54, 31), (75, 54, 31), (75, 53, 31), + (79, 56, 33), (81, 57, 34), (83, 59, 35), (83, 59, 35), + (84, 60, 36), (85, 60, 35), (83, 59, 34), (80, 56, 31), + (78, 53, 29), (74, 50, 24), (77, 51, 24), (80, 52, 25), + (84, 54, 26), (88, 56, 27), (97, 65, 33), (106, 74, 41), + (128, 96, 59), (137, 107, 68), (147, 118, 78), (151, 123, 82), + (156, 128, 86), (165, 136, 92), (173, 144, 98), (179, 151, 104), + (181, 154, 109), (182, 156, 112), (181, 155, 112), (180, 155, 112), + (175, 151, 110), (170, 147, 106), (165, 143, 101), (162, 137, 96), + (151, 124, 84), (145, 116, 77), (139, 109, 71), (135, 104, 67), + (131, 99, 64), (125, 92, 58), (118, 86, 53), (114, 82, 48), + (110, 78, 45), (107, 73, 42), (105, 72, 41), (104, 72, 41), + (100, 68, 39), (97, 65, 37), (92, 61, 34), (86, 56, 32), + (69, 43, 23), (61, 37, 19), (53, 32, 16), (49, 28, 14), + (46, 25, 13), (40, 20, 9), (36, 17, 7), (34, 15, 6), + (33, 15, 6), (37, 19, 10), (39, 21, 12), (42, 23, 14), + (48, 29, 18), (55, 34, 22), (62, 41, 26), (71, 49, 31), + (96, 71, 45), (103, 77, 49), (110, 83, 53), (124, 96, 62), + (137, 108, 71), (149, 118, 77), (157, 124, 81), (160, 126, 82), + (160, 126, 80), (152, 119, 74), (148, 117, 73), (145, 115, 72), + (138, 111, 70), (131, 107, 68), (123, 100, 65), (114, 92, 60), + (93, 74, 49), (88, 69, 45), (84, 64, 42), (77, 56, 36), + (73, 52, 33), (73, 52, 34), (76, 56, 37), (84, 62, 41), + (92, 69, 46), (99, 74, 50), (107, 80, 52), (115, 84, 53), + (122, 88, 54), (128, 91, 54), (132, 95, 56), (138, 98, 56), + (142, 101, 54), (141, 100, 53), (140, 99, 52), (138, 97, 50), + (133, 93, 48), (128, 87, 44), (122, 83, 42), (119, 81, 40), + (118, 80, 40), (119, 81, 42), (122, 86, 47), (128, 91, 53), + (134, 100, 62), (142, 110, 73), (151, 120, 84), (160, 132, 96), + (169, 143, 106), (177, 150, 113), (184, 158, 118), (190, 161, 121), + (192, 163, 122), (194, 165, 124), (194, 165, 125), (192, 165, 125), + (191, 165, 125), (187, 162, 122), (183, 157, 117), (179, 150, 111), + (174, 142, 103), (168, 133, 96), (162, 127, 88), (157, 119, 80), + (155, 115, 75), (153, 112, 71), (150, 110, 69), (149, 108, 66), + (148, 106, 63), (147, 104, 61), (148, 104, 60), (148, 105, 60), + (151, 107, 62), (157, 112, 65), (164, 120, 71), (171, 128, 79), + (177, 136, 87), (182, 144, 96), (187, 151, 105), (191, 159, 114), + (194, 166, 125), (201, 174, 134), (209, 184, 143), (218, 194, 154), + (227, 204, 164), (234, 215, 174), (241, 223, 182), (246, 230, 188), + (248, 233, 191), (248, 233, 191), (246, 230, 188), (242, 225, 181), + (237, 217, 173), (230, 209, 163), (223, 200, 153), (215, 191, 143), + (207, 182, 134), (206, 178, 129), (205, 175, 126), (205, 174, 123), + (204, 171, 121), (204, 171, 121), (206, 172, 122), (206, 173, 124) + ), + +// 454 040222-12 +((61, 63, 55), (43, 52, 51), (37, 50, 50), (31, 48, 50), + (34, 50, 53), (37, 53, 56), (39, 55, 58), (42, 57, 60), + (59, 66, 63), (65, 65, 61), (71, 65, 59), (74, 65, 57), + (77, 65, 56), (79, 65, 57), (81, 65, 58), (82, 66, 58), + (84, 67, 58), (88, 72, 62), (87, 72, 62), (87, 73, 63), + (87, 73, 62), (87, 74, 62), (88, 73, 61), (89, 73, 61), + (105, 76, 53), (115, 81, 53), (126, 87, 54), (132, 91, 57), + (138, 96, 60), (136, 98, 64), (135, 100, 68), (132, 108, 78), + (131, 113, 85), (134, 118, 92), (139, 120, 93), (145, 123, 94), + (146, 121, 93), (148, 120, 92), (144, 119, 93), (141, 118, 95), + (122, 112, 95), (114, 106, 92), (107, 101, 89), (108, 98, 83), + (110, 95, 77), (111, 93, 75), (112, 92, 73), (113, 91, 72), + (113, 94, 77), (108, 109, 92), (103, 114, 99), (99, 120, 107), + (95, 123, 110), (92, 127, 113), (89, 127, 114), (87, 128, 116), + (69, 129, 126), (61, 132, 133), (53, 135, 140), (47, 139, 148), + (42, 143, 156), (41, 143, 156), (40, 144, 157), (40, 140, 153), + (40, 134, 146), (33, 114, 124), (32, 105, 113), (32, 96, 103), + (33, 93, 99), (34, 91, 96), (34, 88, 92), (36, 85, 88), + (41, 82, 83), (41, 76, 75), (41, 70, 68), (40, 64, 61), + (40, 58, 55), (39, 56, 52), (39, 54, 50), (40, 51, 47), + (42, 50, 46), (47, 51, 48), (48, 52, 49), (49, 54, 50), + (49, 54, 50), (50, 54, 51), (52, 54, 50), (56, 55, 48), + (68, 56, 44), (75, 56, 41), (83, 57, 38), (86, 58, 37), + (89, 59, 37), (95, 62, 37), (100, 63, 36), (105, 65, 35), + (106, 66, 34), (104, 67, 31), (100, 63, 28), (97, 60, 25), + (94, 59, 24), (92, 58, 24), (87, 56, 24), (85, 55, 24), + (81, 55, 25), (80, 54, 25), (80, 53, 25), (79, 51, 24), + (78, 50, 23), (74, 48, 21), (69, 45, 20), (64, 42, 18), + (61, 39, 17), (61, 36, 18), (62, 36, 18), (64, 37, 18), + (68, 39, 18), (74, 40, 19), (81, 40, 18), (85, 41, 18), + (84, 45, 22), (79, 49, 31), (75, 54, 40), (74, 58, 45), + (73, 63, 51), (70, 74, 66), (74, 86, 79), (86, 95, 87), + (99, 105, 92), (122, 118, 98), (122, 121, 102), (122, 124, 106), + (121, 131, 115), (117, 140, 125), (110, 147, 135), (110, 148, 140), + (119, 151, 138), (126, 144, 129), (133, 138, 120), (135, 135, 116), + (137, 132, 113), (138, 130, 109), (134, 127, 106), (131, 121, 101), + (131, 117, 96), (146, 111, 79), (151, 108, 73), (157, 106, 68), + (165, 102, 60), (168, 102, 58), (168, 103, 60), (165, 105, 63), + (160, 118, 83), (158, 122, 89), (156, 127, 95), (153, 134, 102), + (151, 141, 109), (145, 147, 117), (138, 151, 124), (129, 149, 126), + (116, 145, 127), (88, 135, 130), (81, 132, 129), (75, 129, 129), + (64, 122, 125), (53, 117, 120), (44, 113, 117), (38, 103, 107), + (28, 80, 82), (26, 75, 76), (24, 70, 71), (22, 60, 62), + (22, 50, 52), (24, 44, 43), (27, 40, 38), (33, 40, 36), + (40, 44, 37), (51, 48, 38), (62, 53, 39), (74, 59, 42), + (89, 66, 45), (103, 73, 45), (114, 78, 46), (125, 82, 46), + (141, 84, 45), (143, 83, 44), (145, 82, 43), (145, 80, 41), + (144, 78, 39), (143, 75, 36), (140, 72, 34), (139, 67, 30), + (137, 67, 26), (136, 63, 23), (137, 59, 19), (139, 60, 18), + (140, 60, 16), (141, 61, 16), (143, 64, 20), (148, 68, 24), + (155, 78, 28), (163, 88, 34), (172, 94, 39), (181, 100, 43), + (192, 106, 44), (197, 109, 43), (201, 110, 42), (201, 110, 42), + (199, 110, 42), (197, 112, 44), (190, 111, 50), (180, 109, 54), + (172, 107, 57), (163, 104, 58), (156, 100, 58), (149, 95, 57), + (143, 90, 55), (145, 89, 54), (148, 92, 56), (152, 97, 62), + (156, 105, 73), (159, 114, 84), (167, 125, 97), (175, 136, 111), + (170, 145, 123), (170, 154, 135), (170, 163, 143), (171, 171, 152), + (171, 180, 163), (167, 185, 169), (162, 190, 174), (165, 193, 179), + (154, 193, 181), (141, 190, 181), (129, 184, 177), (120, 175, 170), + (113, 168, 162), (107, 159, 152), (102, 150, 140), (108, 143, 129), + (114, 135, 116), (116, 128, 105), (118, 120, 94), (120, 112, 84), + (121, 105, 75), (123, 97, 66), (123, 90, 59), (121, 84, 54), + (122, 80, 48), (118, 77, 46), (112, 74, 46), (106, 74, 48), + (97, 74, 51), (89, 73, 54), (81, 71, 56), (68, 67, 56) + ), + +// 455 040222-13 +((33, 6, 3), (26, 9, 4), (23, 11, 4), (21, 13, 5), + (31, 15, 4), (41, 18, 4), (45, 21, 3), (50, 24, 3), + (71, 39, 5), (83, 46, 10), (95, 53, 15), (108, 61, 22), + (121, 70, 30), (131, 82, 40), (141, 95, 51), (146, 100, 55), + (152, 106, 59), (181, 132, 78), (191, 142, 87), (202, 153, 96), + (210, 156, 98), (219, 159, 100), (222, 159, 100), (226, 159, 100), + (222, 151, 93), (204, 136, 86), (186, 121, 79), (166, 100, 68), + (146, 80, 57), (136, 72, 50), (127, 64, 43), (109, 53, 37), + (90, 40, 29), (68, 27, 22), (62, 26, 18), (57, 25, 15), + (53, 26, 14), (49, 28, 14), (48, 30, 16), (48, 32, 18), + (40, 36, 16), (34, 35, 15), (29, 34, 14), (26, 31, 17), + (24, 29, 21), (23, 29, 23), (22, 30, 26), (20, 28, 30), + (23, 33, 30), (44, 40, 37), (61, 47, 42), (78, 54, 47), + (96, 58, 42), (114, 62, 37), (125, 65, 33), (136, 68, 30), + (177, 91, 34), (180, 87, 32), (184, 84, 30), (171, 72, 22), + (158, 61, 15), (150, 59, 14), (143, 58, 14), (124, 58, 17), + (102, 47, 18), (53, 18, 12), (40, 14, 12), (27, 10, 13), + (25, 9, 14), (23, 9, 15), (21, 6, 12), (22, 5, 12), + (25, 6, 13), (28, 5, 11), (31, 5, 9), (30, 4, 6), + (30, 3, 3), (28, 3, 3), (26, 4, 4), (24, 5, 8), + (23, 7, 9), (29, 16, 6), (37, 23, 9), (45, 30, 12), + (51, 33, 15), (57, 36, 19), (75, 49, 26), (93, 60, 32), + (127, 88, 40), (145, 96, 48), (163, 105, 57), (171, 110, 63), + (180, 115, 70), (189, 122, 80), (195, 137, 94), (203, 145, 100), + (209, 150, 99), (223, 156, 99), (223, 166, 116), (224, 177, 133), + (225, 183, 136), (227, 190, 139), (236, 199, 134), (244, 203, 123), + (243, 207, 131), (245, 213, 139), (248, 219, 148), (251, 217, 147), + (254, 216, 147), (252, 209, 132), (244, 197, 125), (233, 184, 121), + (219, 171, 115), (185, 135, 96), (172, 126, 88), (160, 118, 81), + (136, 103, 69), (115, 90, 56), (97, 82, 46), (87, 75, 39), + (71, 74, 38), (67, 72, 37), (63, 70, 37), (62, 66, 34), + (61, 62, 32), (63, 58, 32), (64, 55, 30), (66, 48, 29), + (62, 42, 25), (53, 21, 9), (54, 19, 6), (56, 17, 3), + (65, 21, 2), (74, 28, 6), (84, 37, 13), (90, 47, 21), + (99, 60, 39), (97, 63, 48), (95, 67, 58), (91, 66, 62), + (88, 66, 67), (81, 61, 65), (69, 54, 63), (57, 45, 58), + (43, 36, 52), (23, 20, 37), (20, 17, 31), (17, 15, 26), + (15, 14, 17), (14, 13, 9), (15, 17, 7), (17, 23, 9), + (22, 34, 14), (23, 35, 14), (24, 37, 15), (26, 39, 15), + (27, 41, 16), (29, 40, 15), (31, 41, 15), (32, 39, 13), + (33, 36, 11), (29, 34, 12), (29, 35, 12), (30, 36, 13), + (35, 38, 15), (38, 38, 15), (41, 40, 15), (40, 41, 16), + (39, 41, 16), (39, 38, 15), (40, 36, 15), (42, 29, 12), + (40, 24, 9), (36, 18, 4), (32, 14, 2), (29, 10, 1), + (28, 6, 0), (26, 3, 0), (22, 1, 0), (18, 0, 0), + (16, 1, 0), (16, 3, 0), (20, 6, 1), (25, 9, 2), + (44, 21, 3), (49, 24, 2), (54, 27, 2), (64, 29, 3), + (71, 29, 5), (80, 27, 5), (85, 25, 5), (86, 26, 2), + (83, 23, 2), (76, 19, 2), (70, 12, 2), (63, 5, 2), + (56, 3, 0), (53, 2, 0), (50, 4, 0), (48, 8, 0), + (45, 9, 0), (42, 11, 1), (43, 10, 1), (44, 10, 2), + (45, 12, 2), (42, 12, 1), (36, 14, 2), (33, 13, 1), + (33, 12, 1), (35, 13, 1), (42, 15, 3), (52, 21, 7), + (63, 33, 14), (82, 46, 21), (98, 60, 29), (112, 72, 37), + (125, 78, 46), (131, 85, 57), (140, 91, 61), (139, 97, 65), + (135, 102, 66), (124, 96, 67), (111, 91, 77), (105, 86, 84), + (94, 81, 89), (83, 79, 90), (67, 70, 84), (54, 63, 84), + (52, 59, 86), (52, 56, 86), (51, 53, 85), (47, 48, 74), + (40, 40, 63), (39, 33, 56), (41, 31, 50), (41, 30, 50), + (44, 31, 51), (45, 36, 54), (52, 42, 63), (60, 50, 74), + (66, 59, 87), (71, 67, 98), (76, 76, 110), (88, 86, 115), + (96, 93, 114), (101, 95, 110), (102, 91, 99), (93, 80, 89), + (89, 73, 77), (86, 64, 62), (81, 54, 47), (79, 44, 33), + (62, 30, 21), (48, 20, 12), (38, 12, 7), (30, 7, 4) + ), + +// 456 040222-15 +((153, 104, 63), (189, 101, 74), (188, 94, 76), (188, 88, 78), + (211, 75, 65), (235, 63, 52), (240, 53, 46), (246, 44, 41), + (251, 16, 20), (240, 16, 15), (230, 16, 10), (201, 15, 7), + (173, 15, 4), (148, 19, 7), (123, 23, 11), (115, 25, 13), + (108, 28, 16), (61, 46, 26), (52, 64, 36), (43, 82, 47), + (51, 103, 68), (59, 125, 89), (63, 136, 99), (68, 147, 110), + (81, 183, 133), (78, 183, 135), (75, 184, 138), (66, 173, 135), + (57, 162, 133), (50, 152, 126), (44, 143, 120), (34, 121, 105), + (23, 98, 86), (13, 71, 63), (19, 73, 69), (26, 75, 76), + (42, 94, 95), (59, 114, 114), (66, 126, 121), (74, 138, 128), + (98, 180, 147), (122, 202, 154), (146, 224, 162), (168, 223, 162), + (191, 223, 163), (195, 213, 156), (199, 203, 149), (208, 175, 124), + (219, 156, 97), (244, 119, 68), (247, 105, 60), (251, 92, 52), + (251, 94, 50), (252, 96, 49), (250, 100, 49), (248, 105, 50), + (232, 100, 37), (220, 97, 35), (209, 95, 34), (205, 92, 37), + (202, 90, 41), (200, 80, 36), (198, 70, 31), (193, 47, 18), + (187, 23, 5), (193, 20, 2), (199, 20, 3), (205, 21, 5), + (200, 22, 4), (196, 23, 3), (176, 29, 5), (155, 40, 10), + (115, 67, 22), (97, 80, 26), (79, 94, 30), (56, 97, 35), + (34, 100, 41), (25, 97, 43), (17, 94, 45), (16, 90, 45), + (15, 84, 39), (12, 62, 35), (8, 48, 32), (5, 34, 29), + (4, 30, 26), (4, 26, 23), (4, 27, 22), (5, 38, 33), + (14, 79, 71), (21, 102, 91), (28, 125, 112), (33, 136, 123), + (38, 148, 135), (40, 169, 155), (52, 192, 179), (62, 215, 205), + (73, 231, 218), (83, 241, 230), (79, 232, 223), (75, 224, 216), + (75, 218, 212), (76, 213, 208), (79, 206, 198), (81, 197, 187), + (67, 191, 156), (66, 189, 149), (66, 188, 142), (68, 178, 147), + (71, 169, 152), (73, 152, 164), (76, 142, 173), (78, 145, 185), + (83, 161, 182), (100, 150, 173), (107, 145, 168), (114, 141, 163), + (129, 133, 168), (142, 148, 161), (163, 154, 139), (178, 154, 115), + (215, 131, 66), (218, 119, 60), (222, 107, 55), (220, 102, 52), + (219, 97, 50), (204, 79, 35), (189, 68, 28), (162, 60, 29), + (138, 64, 37), (107, 87, 58), (99, 93, 60), (91, 100, 62), + (73, 107, 64), (54, 113, 77), (50, 122, 91), (48, 127, 104), + (50, 128, 98), (57, 119, 86), (65, 111, 74), (75, 106, 68), + (85, 101, 63), (98, 90, 57), (111, 90, 49), (119, 100, 44), + (111, 109, 41), (113, 123, 25), (116, 127, 23), (119, 131, 22), + (135, 147, 37), (131, 163, 61), (123, 179, 82), (114, 189, 93), + (105, 212, 91), (107, 214, 93), (109, 216, 95), (122, 223, 107), + (139, 208, 112), (152, 196, 102), (163, 180, 90), (162, 162, 72), + (168, 155, 64), (175, 145, 79), (180, 137, 84), (186, 130, 90), + (180, 112, 103), (177, 91, 103), (171, 81, 106), (141, 86, 110), + (90, 106, 124), (80, 106, 126), (71, 106, 128), (77, 108, 135), + (70, 121, 138), (71, 135, 133), (69, 157, 141), (69, 175, 150), + (86, 189, 167), (103, 202, 187), (123, 213, 197), (143, 223, 199), + (161, 216, 196), (180, 206, 185), (198, 183, 175), (208, 160, 155), + (208, 132, 109), (202, 131, 101), (197, 131, 93), (184, 128, 87), + (169, 127, 81), (158, 133, 70), (148, 138, 66), (147, 143, 63), + (149, 146, 66), (149, 146, 67), (155, 146, 60), (160, 141, 57), + (177, 136, 50), (198, 132, 46), (204, 129, 45), (195, 127, 43), + (174, 126, 48), (150, 126, 49), (136, 125, 49), (119, 136, 53), + (99, 148, 60), (77, 160, 80), (61, 170, 100), (55, 175, 119), + (57, 184, 132), (64, 192, 139), (77, 198, 147), (98, 207, 156), + (123, 217, 164), (147, 224, 174), (167, 223, 179), (186, 213, 170), + (202, 199, 152), (221, 184, 123), (236, 172, 98), (246, 156, 82), + (251, 137, 68), (245, 118, 52), (232, 102, 37), (204, 94, 24), + (174, 86, 17), (147, 79, 16), (122, 69, 13), (106, 57, 14), + (79, 52, 18), (52, 48, 23), (28, 44, 24), (9, 40, 21), + (5, 35, 19), (4, 33, 18), (7, 35, 22), (9, 38, 25), + (11, 45, 24), (9, 53, 27), (6, 59, 27), (5, 62, 26), + (6, 61, 27), (7, 61, 26), (7, 62, 28), (7, 65, 33), + (7, 65, 35), (9, 60, 34), (10, 54, 34), (11, 48, 32), + (13, 41, 31), (20, 38, 29), (42, 39, 25), (73, 52, 27), + (73, 65, 40), (80, 74, 52), (83, 87, 61), (96, 94, 66) + ), + +// 457 040222-16 +((100, 134, 148), (88, 123, 138), (82, 116, 131), (76, 110, 125), + (73, 106, 121), (70, 102, 117), (69, 101, 115), (69, 100, 114), + (64, 97, 110), (65, 98, 112), (67, 100, 115), (68, 103, 118), + (70, 106, 122), (71, 108, 124), (72, 110, 127), (72, 110, 128), + (72, 110, 129), (72, 110, 129), (73, 111, 130), (75, 113, 131), + (78, 115, 132), (81, 118, 134), (83, 120, 136), (85, 123, 138), + (92, 130, 145), (95, 133, 147), (99, 136, 150), (100, 138, 153), + (102, 141, 157), (104, 144, 159), (106, 147, 162), (111, 154, 168), + (115, 159, 173), (125, 168, 179), (125, 167, 177), (125, 166, 176), + (121, 160, 169), (118, 154, 162), (115, 149, 157), (113, 145, 152), + (98, 123, 131), (91, 114, 122), (84, 105, 113), (79, 99, 106), + (75, 93, 99), (73, 91, 97), (72, 89, 96), (69, 86, 92), + (67, 83, 89), (68, 80, 85), (66, 76, 80), (64, 73, 76), + (60, 68, 71), (57, 64, 67), (55, 61, 65), (53, 59, 63), + (46, 52, 57), (44, 51, 55), (43, 50, 54), (44, 51, 55), + (46, 52, 56), (48, 54, 58), (51, 57, 61), (56, 64, 67), + (64, 72, 75), (83, 92, 95), (93, 102, 105), (104, 113, 115), + (108, 117, 120), (113, 122, 126), (122, 131, 134), (126, 137, 141), + (138, 149, 154), (144, 155, 159), (151, 162, 165), (159, 170, 172), + (167, 179, 180), (171, 183, 184), (175, 188, 189), (184, 197, 197), + (189, 205, 206), (202, 218, 219), (207, 223, 223), (212, 228, 228), + (213, 229, 229), (214, 231, 231), (216, 232, 233), (216, 232, 232), + (215, 231, 231), (213, 229, 229), (211, 227, 227), (210, 226, 226), + (209, 226, 225), (208, 224, 224), (208, 223, 222), (207, 222, 221), + (206, 221, 221), (204, 219, 220), (203, 218, 220), (202, 217, 220), + (202, 216, 218), (202, 215, 217), (200, 212, 214), (195, 209, 212), + (184, 199, 203), (177, 192, 196), (170, 185, 189), (166, 181, 185), + (162, 177, 182), (155, 170, 175), (147, 163, 169), (141, 158, 164), + (135, 153, 160), (122, 141, 150), (119, 140, 149), (117, 139, 149), + (114, 137, 148), (110, 137, 148), (108, 136, 148), (106, 137, 149), + (103, 136, 149), (102, 136, 149), (101, 136, 149), (100, 135, 148), + (100, 134, 148), (97, 130, 144), (95, 127, 143), (94, 126, 142), + (93, 127, 143), (98, 132, 147), (100, 134, 148), (103, 136, 150), + (107, 139, 154), (111, 143, 157), (112, 145, 159), (113, 146, 160), + (107, 139, 154), (101, 131, 146), (96, 123, 138), (91, 118, 133), + (87, 113, 128), (80, 105, 120), (74, 98, 111), (70, 91, 104), + (67, 86, 99), (63, 82, 96), (63, 82, 96), (64, 83, 97), + (66, 87, 100), (68, 90, 104), (69, 93, 108), (68, 94, 112), + (67, 96, 116), (67, 96, 116), (67, 97, 117), (67, 98, 117), + (67, 98, 117), (67, 97, 116), (65, 95, 115), (66, 95, 112), + (65, 94, 111), (63, 93, 111), (63, 93, 110), (63, 93, 110), + (63, 92, 109), (63, 92, 109), (64, 91, 107), (63, 90, 106), + (59, 83, 99), (57, 81, 96), (56, 79, 94), (53, 74, 89), + (50, 69, 83), (46, 64, 77), (42, 59, 72), (39, 54, 66), + (36, 50, 62), (35, 47, 58), (33, 45, 56), (33, 45, 55), + (33, 45, 55), (33, 45, 56), (34, 47, 59), (36, 50, 62), + (39, 55, 71), (39, 56, 73), (40, 58, 75), (42, 60, 79), + (43, 63, 82), (45, 65, 84), (47, 68, 87), (51, 72, 91), + (56, 76, 94), (61, 81, 99), (67, 87, 104), (73, 94, 110), + (79, 100, 116), (86, 107, 123), (92, 113, 129), (99, 120, 135), + (105, 125, 141), (110, 130, 145), (115, 136, 150), (122, 142, 155), + (127, 148, 160), (134, 155, 164), (140, 161, 170), (146, 167, 175), + (151, 173, 179), (156, 177, 182), (159, 179, 183), (161, 179, 181), + (158, 174, 178), (153, 169, 172), (148, 163, 166), (142, 156, 160), + (136, 150, 154), (130, 146, 150), (126, 142, 148), (123, 141, 148), + (121, 141, 149), (121, 142, 150), (120, 143, 150), (120, 141, 150), + (119, 138, 147), (118, 135, 144), (118, 133, 140), (117, 130, 137), + (116, 128, 135), (116, 127, 134), (117, 129, 135), (118, 132, 139), + (122, 137, 146), (128, 146, 153), (134, 154, 161), (142, 162, 169), + (147, 168, 175), (152, 173, 180), (156, 176, 183), (157, 177, 183), + (155, 174, 180), (152, 170, 175), (149, 164, 170), (144, 160, 166), + (142, 158, 164), (138, 155, 161), (133, 150, 156), (128, 145, 152), + (123, 142, 149), (119, 140, 148), (117, 140, 149), (115, 140, 149), + (112, 139, 149), (110, 138, 149), (104, 136, 147), (102, 135, 148) + ), + +// 458 040222-17 +((145, 86, 63), (120, 68, 49), (105, 61, 47), (90, 55, 45), + (90, 54, 45), (90, 53, 45), (90, 52, 43), (90, 51, 42), + (79, 41, 34), (73, 36, 30), (67, 32, 26), (63, 28, 23), + (59, 24, 20), (55, 20, 17), (51, 16, 14), (49, 14, 12), + (48, 13, 10), (47, 9, 7), (49, 8, 8), (51, 7, 9), + (59, 10, 11), (67, 13, 13), (71, 15, 14), (75, 17, 16), + (88, 30, 25), (95, 36, 29), (102, 42, 34), (110, 48, 40), + (119, 55, 46), (123, 60, 49), (128, 65, 53), (139, 74, 58), + (148, 82, 67), (164, 81, 73), (168, 81, 73), (173, 81, 74), + (173, 82, 75), (173, 83, 76), (171, 81, 74), (170, 79, 73), + (167, 66, 66), (157, 62, 61), (147, 58, 57), (137, 55, 51), + (128, 52, 46), (125, 50, 44), (122, 48, 43), (111, 43, 36), + (97, 34, 30), (64, 21, 17), (51, 17, 13), (39, 13, 9), + (32, 10, 6), (26, 7, 4), (25, 6, 3), (24, 5, 3), + (26, 8, 6), (31, 9, 8), (36, 11, 11), (42, 12, 13), + (49, 14, 15), (52, 14, 16), (55, 15, 17), (61, 17, 21), + (65, 22, 25), (74, 32, 31), (75, 35, 33), (76, 39, 36), + (75, 40, 38), (74, 42, 41), (73, 46, 42), (73, 48, 42), + (71, 45, 35), (70, 41, 33), (69, 37, 32), (70, 35, 31), + (71, 34, 31), (72, 34, 30), (73, 34, 30), (75, 32, 31), + (78, 34, 34), (92, 49, 50), (105, 66, 63), (119, 84, 76), + (128, 91, 81), (137, 99, 87), (150, 108, 98), (158, 112, 105), + (169, 119, 115), (175, 114, 108), (182, 110, 102), (178, 103, 96), + (175, 96, 91), (162, 83, 85), (145, 69, 78), (132, 57, 64), + (122, 45, 51), (100, 27, 29), (89, 23, 25), (78, 20, 22), + (73, 19, 21), (69, 18, 21), (61, 16, 16), (55, 13, 12), + (45, 8, 6), (45, 9, 7), (45, 11, 8), (45, 12, 9), + (46, 14, 10), (47, 18, 13), (49, 20, 14), (54, 23, 17), + (60, 26, 18), (67, 33, 23), (66, 34, 24), (65, 35, 25), + (62, 34, 27), (58, 34, 27), (56, 34, 28), (55, 34, 29), + (55, 40, 38), (57, 43, 42), (59, 47, 46), (61, 47, 47), + (63, 48, 48), (69, 49, 51), (75, 54, 55), (85, 59, 60), + (93, 63, 64), (110, 67, 66), (113, 69, 65), (116, 71, 64), + (125, 76, 64), (132, 81, 67), (136, 89, 70), (147, 93, 73), + (162, 106, 76), (162, 108, 75), (163, 110, 75), (161, 109, 74), + (160, 109, 74), (153, 104, 73), (146, 100, 72), (136, 92, 68), + (123, 84, 63), (97, 67, 50), (92, 63, 47), (87, 59, 45), + (75, 51, 39), (65, 43, 33), (58, 35, 28), (52, 29, 23), + (46, 23, 19), (44, 22, 17), (43, 21, 16), (40, 16, 15), + (37, 14, 12), (35, 11, 11), (34, 10, 11), (34, 11, 13), + (33, 12, 15), (32, 13, 17), (31, 13, 16), (30, 14, 16), + (29, 14, 17), (31, 14, 17), (33, 14, 18), (35, 12, 17), + (41, 9, 13), (43, 8, 12), (46, 8, 12), (51, 9, 15), + (58, 12, 18), (68, 15, 19), (78, 18, 21), (86, 21, 21), + (92, 25, 22), (93, 27, 22), (94, 29, 23), (96, 29, 23), + (96, 29, 23), (95, 31, 22), (88, 32, 21), (79, 29, 18), + (62, 21, 17), (58, 20, 17), (55, 19, 17), (49, 18, 19), + (44, 19, 18), (41, 18, 18), (41, 17, 18), (45, 16, 18), + (53, 16, 20), (65, 17, 22), (82, 21, 24), (99, 29, 27), + (113, 36, 29), (125, 44, 32), (134, 50, 35), (144, 55, 40), + (154, 64, 45), (157, 70, 49), (154, 77, 53), (142, 82, 54), + (131, 83, 59), (122, 83, 64), (117, 83, 67), (116, 82, 72), + (111, 84, 74), (109, 89, 78), (106, 91, 83), (106, 91, 84), + (111, 87, 87), (118, 85, 89), (126, 91, 87), (135, 99, 89), + (142, 106, 89), (148, 110, 90), (154, 111, 92), (159, 109, 88), + (163, 110, 83), (165, 107, 77), (163, 100, 69), (161, 97, 66), + (157, 91, 64), (154, 89, 61), (149, 86, 59), (145, 80, 55), + (142, 78, 54), (137, 76, 56), (134, 80, 60), (130, 85, 64), + (127, 85, 65), (125, 84, 62), (121, 80, 59), (115, 75, 56), + (108, 70, 53), (100, 62, 49), (96, 56, 42), (94, 50, 37), + (92, 46, 33), (92, 45, 32), (93, 48, 34), (97, 55, 38), + (104, 62, 42), (113, 71, 51), (121, 81, 60), (128, 90, 71), + (136, 101, 78), (147, 107, 79), (156, 107, 78), (163, 109, 78), + (154, 104, 79), (146, 103, 79), (142, 99, 77), (137, 90, 70) + ), + +// 459 040222-18 +((52, 100, 5), (50, 86, 6), (49, 74, 6), (49, 62, 7), + (43, 54, 6), (37, 47, 6), (31, 47, 5), (26, 47, 5), + (9, 53, 6), (5, 50, 5), (1, 48, 5), (4, 49, 4), + (7, 51, 3), (15, 55, 2), (24, 59, 1), (27, 58, 1), + (31, 57, 1), (36, 54, 1), (32, 53, 1), (29, 52, 1), + (29, 54, 1), (30, 56, 1), (31, 56, 1), (32, 56, 1), + (36, 50, 1), (29, 46, 1), (23, 42, 1), (14, 41, 1), + (6, 40, 1), (3, 41, 0), (1, 42, 0), (0, 42, 0), + (0, 42, 0), (0, 42, 0), (0, 42, 0), (0, 42, 0), + (0, 42, 0), (0, 42, 0), (0, 41, 0), (0, 40, 0), + (7, 32, 1), (9, 31, 1), (12, 30, 1), (12, 31, 3), + (12, 33, 6), (11, 35, 7), (11, 37, 9), (9, 40, 14), + (11, 41, 18), (17, 44, 26), (19, 47, 29), (21, 50, 33), + (20, 55, 41), (20, 61, 50), (24, 61, 59), (29, 61, 69), + (50, 56, 91), (62, 52, 94), (74, 48, 98), (82, 50, 89), + (91, 52, 80), (96, 52, 81), (102, 52, 82), (109, 56, 82), + (108, 55, 83), (108, 52, 97), (110, 49, 90), (113, 47, 84), + (112, 47, 77), (111, 47, 71), (113, 59, 58), (106, 68, 48), + (70, 78, 33), (59, 76, 37), (48, 75, 42), (45, 71, 43), + (42, 67, 44), (43, 68, 43), (44, 70, 42), (42, 72, 34), + (31, 77, 24), (16, 87, 15), (11, 87, 16), (6, 88, 17), + (8, 94, 22), (10, 100, 27), (20, 114, 46), (31, 130, 65), + (67, 154, 85), (74, 159, 77), (82, 164, 70), (82, 165, 64), + (82, 167, 59), (84, 169, 56), (76, 168, 60), (75, 166, 65), + (80, 163, 71), (81, 145, 60), (73, 130, 42), (66, 115, 24), + (57, 107, 17), (48, 99, 11), (30, 82, 2), (16, 69, 0), + (7, 43, 2), (7, 36, 5), (8, 30, 9), (9, 29, 11), + (10, 29, 13), (11, 32, 16), (11, 42, 15), (16, 50, 15), + (21, 59, 14), (27, 70, 12), (27, 71, 13), (28, 72, 14), + (27, 70, 16), (23, 75, 16), (20, 80, 15), (20, 85, 13), + (19, 94, 3), (17, 92, 2), (16, 91, 1), (13, 89, 1), + (11, 87, 1), (6, 82, 1), (3, 78, 1), (2, 73, 2), + (0, 69, 1), (0, 65, 1), (0, 64, 1), (0, 64, 1), + (0, 63, 1), (0, 64, 1), (0, 62, 1), (0, 59, 1), + (0, 51, 0), (0, 46, 1), (0, 41, 2), (0, 38, 2), + (1, 36, 3), (3, 34, 6), (3, 33, 8), (3, 33, 10), + (3, 34, 11), (1, 37, 10), (1, 36, 9), (1, 35, 9), + (3, 37, 9), (3, 38, 9), (3, 41, 10), (3, 46, 11), + (2, 65, 9), (1, 70, 8), (0, 75, 7), (1, 83, 4), + (1, 88, 2), (1, 91, 1), (0, 91, 0), (1, 92, 0), + (1, 95, 0), (1, 116, 1), (2, 123, 1), (3, 130, 1), + (7, 142, 3), (7, 148, 6), (7, 147, 8), (9, 137, 12), + (8, 123, 21), (7, 120, 22), (7, 118, 23), (12, 115, 27), + (14, 113, 29), (21, 110, 31), (32, 99, 35), (41, 86, 39), + (48, 71, 40), (50, 53, 37), (49, 42, 37), (43, 34, 31), + (41, 33, 27), (44, 33, 24), (53, 38, 22), (72, 48, 20), + (114, 72, 20), (119, 79, 20), (124, 86, 20), (133, 98, 23), + (137, 107, 25), (142, 118, 26), (151, 128, 27), (165, 133, 28), + (174, 135, 40), (174, 148, 51), (172, 162, 73), (164, 171, 91), + (152, 177, 103), (136, 184, 104), (123, 185, 90), (109, 169, 85), + (91, 160, 72), (68, 152, 71), (47, 147, 72), (32, 137, 78), + (17, 138, 80), (9, 140, 66), (6, 133, 52), (8, 123, 33), + (11, 113, 18), (21, 107, 8), (39, 100, 5), (60, 100, 8), + (80, 106, 11), (98, 117, 13), (109, 124, 14), (113, 135, 14), + (114, 139, 15), (114, 141, 15), (116, 138, 18), (117, 135, 23), + (121, 135, 28), (119, 129, 31), (112, 127, 31), (97, 120, 28), + (77, 111, 24), (56, 98, 19), (37, 84, 17), (23, 74, 16), + (15, 65, 17), (16, 64, 17), (27, 67, 16), (43, 72, 15), + (62, 80, 11), (80, 84, 10), (95, 87, 11), (108, 85, 10), + (115, 88, 11), (123, 93, 11), (129, 97, 12), (138, 105, 11), + (147, 115, 11), (152, 126, 14), (156, 126, 14), (149, 127, 16), + (137, 128, 15), (119, 125, 14), (102, 123, 12), (89, 126, 8), + (78, 136, 7), (76, 139, 4), (78, 135, 5), (80, 129, 5), + (79, 121, 6), (75, 114, 6), (68, 107, 6), (59, 101, 5) + ), + +// 460 040222-19 +((195, 72, 19), (223, 63, 7), (229, 65, 7), (235, 67, 7), + (233, 73, 16), (231, 80, 26), (228, 81, 35), (225, 82, 44), + (195, 69, 75), (177, 53, 82), (160, 38, 89), (147, 30, 88), + (135, 23, 88), (127, 20, 98), (119, 18, 108), (116, 18, 117), + (113, 19, 126), (101, 19, 172), (97, 19, 187), (93, 19, 202), + (93, 18, 199), (93, 17, 197), (96, 17, 194), (99, 17, 192), + (102, 19, 183), (102, 20, 179), (103, 21, 176), (102, 23, 169), + (101, 26, 162), (96, 25, 155), (92, 25, 149), (86, 22, 135), + (79, 22, 124), (71, 17, 93), (73, 16, 75), (76, 16, 58), + (83, 17, 42), (91, 18, 26), (97, 17, 20), (104, 17, 14), + (126, 19, 4), (138, 17, 3), (151, 15, 3), (162, 15, 3), + (173, 16, 3), (175, 16, 3), (177, 17, 3), (178, 18, 3), + (173, 17, 3), (152, 16, 4), (139, 15, 4), (127, 15, 4), + (121, 14, 4), (116, 13, 4), (113, 13, 4), (111, 13, 4), + (101, 11, 3), (89, 12, 3), (77, 13, 4), (66, 12, 7), + (55, 12, 11), (53, 11, 13), (52, 11, 16), (52, 11, 22), + (52, 11, 28), (65, 9, 55), (65, 10, 71), (65, 12, 87), + (62, 12, 95), (59, 13, 104), (50, 14, 121), (41, 15, 138), + (30, 17, 164), (35, 16, 177), (41, 16, 190), (51, 17, 189), + (61, 19, 188), (67, 19, 185), (74, 20, 183), (88, 21, 176), + (99, 22, 166), (114, 24, 138), (117, 24, 140), (121, 24, 142), + (124, 23, 141), (127, 23, 140), (133, 23, 138), (140, 22, 135), + (150, 21, 122), (159, 22, 107), (168, 23, 92), (170, 24, 91), + (173, 25, 91), (177, 27, 91), (182, 29, 92), (188, 30, 93), + (193, 30, 97), (203, 31, 94), (208, 31, 78), (213, 31, 63), + (216, 31, 55), (219, 31, 47), (226, 31, 32), (235, 32, 17), + (245, 30, 5), (247, 29, 5), (249, 29, 5), (248, 29, 5), + (247, 29, 5), (247, 29, 4), (246, 29, 4), (243, 28, 4), + (238, 27, 4), (221, 24, 5), (213, 23, 6), (206, 23, 7), + (191, 22, 11), (174, 20, 16), (159, 19, 21), (144, 18, 26), + (122, 18, 32), (118, 16, 30), (115, 14, 29), (112, 13, 28), + (110, 13, 28), (104, 12, 31), (96, 13, 43), (89, 16, 61), + (82, 15, 81), (76, 22, 116), (77, 23, 123), (79, 24, 130), + (83, 25, 140), (89, 27, 144), (94, 28, 150), (100, 31, 163), + (98, 33, 197), (89, 34, 214), (80, 35, 232), (74, 34, 239), + (69, 33, 246), (60, 30, 242), (52, 26, 231), (50, 25, 213), + (53, 24, 196), (72, 22, 160), (80, 23, 151), (89, 24, 143), + (104, 25, 133), (117, 26, 119), (125, 31, 106), (134, 46, 90), + (148, 59, 77), (148, 59, 77), (148, 60, 78), (152, 62, 79), + (155, 63, 88), (158, 57, 100), (157, 53, 117), (154, 54, 129), + (153, 67, 137), (136, 68, 171), (130, 67, 175), (125, 67, 180), + (119, 65, 180), (115, 54, 180), (112, 41, 180), (112, 27, 173), + (128, 24, 140), (133, 24, 135), (139, 24, 130), (145, 23, 121), + (152, 22, 103), (159, 21, 85), (161, 19, 67), (160, 20, 50), + (157, 19, 35), (154, 17, 22), (151, 16, 18), (141, 16, 20), + (129, 15, 22), (117, 13, 23), (105, 9, 23), (89, 11, 20), + (55, 9, 18), (48, 10, 18), (42, 12, 19), (32, 16, 22), + (23, 19, 23), (16, 21, 24), (14, 18, 27), (13, 18, 28), + (11, 16, 30), (15, 17, 39), (20, 20, 53), (28, 23, 69), + (39, 27, 85), (53, 32, 100), (65, 34, 116), (75, 35, 131), + (81, 33, 136), (93, 32, 138), (104, 28, 138), (114, 27, 138), + (126, 24, 137), (139, 26, 135), (148, 27, 131), (148, 27, 130), + (140, 24, 123), (134, 22, 115), (127, 18, 103), (118, 17, 93), + (109, 14, 86), (103, 13, 85), (102, 13, 85), (95, 13, 90), + (84, 12, 99), (70, 12, 115), (58, 13, 131), (46, 14, 141), + (33, 12, 142), (24, 10, 147), (22, 9, 151), (23, 9, 156), + (24, 9, 158), (24, 9, 158), (24, 9, 160), (27, 11, 161), + (25, 11, 148), (24, 13, 131), (25, 17, 116), (26, 21, 101), + (27, 24, 87), (26, 26, 70), (24, 24, 61), (24, 24, 61), + (23, 21, 62), (21, 19, 60), (19, 19, 59), (19, 19, 58), + (21, 21, 60), (23, 25, 57), (23, 25, 57), (29, 26, 60), + (39, 24, 59), (48, 19, 57), (57, 14, 54), (65, 9, 51), + (73, 6, 50), (90, 9, 46), (101, 20, 43), (114, 35, 44), + (130, 51, 40), (147, 65, 35), (166, 67, 29), (185, 70, 24) + ), + +// 461 040222-20 +((141, 196, 173), (149, 202, 166), (150, 200, 159), (151, 199, 152), + (155, 198, 148), (160, 197, 145), (158, 190, 138), (157, 184, 131), + (153, 167, 103), (148, 156, 88), (144, 145, 74), (136, 134, 64), + (129, 124, 54), (118, 111, 49), (107, 98, 45), (101, 93, 44), + (95, 88, 43), (73, 69, 42), (67, 64, 41), (62, 60, 40), + (61, 58, 40), (61, 56, 40), (62, 56, 40), (63, 57, 40), + (63, 57, 45), (64, 59, 46), (66, 62, 48), (69, 66, 54), + (72, 70, 60), (75, 73, 64), (79, 76, 69), (87, 85, 78), + (91, 88, 84), (92, 92, 90), (89, 94, 91), (86, 96, 93), + (87, 99, 95), (89, 103, 97), (91, 105, 95), (94, 107, 93), + (109, 117, 87), (115, 123, 86), (121, 130, 85), (123, 134, 93), + (126, 138, 101), (127, 140, 104), (129, 142, 107), (137, 151, 118), + (151, 160, 121), (183, 179, 117), (196, 181, 117), (209, 184, 117), + (211, 179, 117), (213, 175, 118), (211, 172, 117), (209, 169, 117), + (197, 159, 104), (192, 153, 95), (188, 147, 87), (184, 143, 81), + (181, 139, 76), (177, 136, 75), (173, 133, 75), (164, 132, 73), + (154, 128, 75), (132, 118, 79), (128, 119, 82), (125, 120, 86), + (126, 122, 90), (127, 125, 94), (132, 134, 102), (137, 142, 111), + (144, 151, 121), (143, 146, 119), (143, 142, 117), (140, 137, 114), + (138, 132, 111), (136, 130, 111), (135, 128, 111), (132, 125, 109), + (129, 124, 110), (119, 118, 107), (115, 116, 104), (111, 115, 101), + (110, 114, 102), (109, 113, 103), (110, 113, 105), (114, 113, 110), + (122, 121, 112), (126, 122, 109), (130, 123, 107), (130, 124, 107), + (131, 126, 107), (129, 129, 107), (129, 132, 110), (130, 131, 111), + (127, 132, 110), (116, 115, 99), (104, 105, 92), (93, 96, 85), + (86, 93, 82), (79, 91, 79), (69, 83, 75), (60, 79, 72), + (51, 73, 73), (47, 66, 72), (43, 60, 72), (41, 59, 71), + (40, 58, 71), (40, 58, 70), (40, 55, 67), (42, 53, 63), + (42, 52, 62), (45, 49, 56), (46, 49, 54), (48, 50, 53), + (55, 54, 50), (66, 57, 49), (75, 59, 46), (80, 60, 46), + (91, 65, 50), (98, 73, 50), (105, 82, 51), (113, 87, 52), + (121, 92, 53), (133, 102, 51), (141, 107, 49), (145, 111, 50), + (148, 113, 52), (148, 123, 59), (151, 127, 61), (155, 131, 63), + (164, 141, 70), (171, 148, 74), (175, 152, 80), (176, 152, 83), + (168, 148, 93), (167, 148, 94), (166, 148, 95), (168, 149, 94), + (171, 150, 94), (177, 151, 96), (183, 153, 94), (191, 158, 96), + (197, 163, 99), (193, 173, 99), (191, 173, 96), (190, 173, 94), + (186, 168, 89), (179, 160, 79), (175, 153, 69), (171, 146, 62), + (164, 147, 58), (161, 147, 59), (158, 148, 60), (149, 143, 64), + (136, 133, 62), (122, 119, 59), (102, 99, 54), (88, 83, 48), + (77, 71, 40), (60, 63, 38), (57, 63, 39), (54, 64, 40), + (55, 66, 42), (55, 65, 45), (59, 64, 50), (70, 63, 51), + (94, 70, 49), (99, 76, 50), (105, 82, 51), (117, 97, 57), + (127, 107, 64), (136, 117, 75), (147, 125, 84), (158, 127, 87), + (163, 123, 86), (168, 123, 84), (167, 124, 82), (161, 123, 80), + (151, 121, 83), (141, 120, 87), (135, 118, 91), (129, 114, 92), + (128, 111, 88), (129, 111, 86), (130, 112, 85), (133, 115, 86), + (138, 120, 90), (145, 129, 95), (151, 138, 103), (157, 151, 111), + (165, 163, 122), (170, 173, 129), (177, 181, 136), (180, 182, 139), + (180, 180, 140), (176, 173, 137), (168, 167, 132), (159, 158, 129), + (146, 150, 121), (138, 144, 116), (131, 136, 113), (124, 130, 109), + (118, 122, 103), (112, 116, 97), (103, 108, 91), (92, 101, 86), + (82, 99, 87), (78, 98, 94), (79, 101, 101), (85, 104, 106), + (93, 110, 113), (97, 114, 115), (100, 116, 113), (100, 116, 112), + (100, 116, 114), (104, 120, 118), (116, 126, 121), (133, 136, 125), + (151, 148, 126), (168, 159, 123), (182, 166, 118), (190, 170, 110), + (193, 171, 102), (194, 174, 99), (196, 177, 98), (200, 182, 98), + (205, 192, 101), (210, 204, 106), (215, 213, 112), (219, 217, 112), + (220, 219, 115), (219, 217, 116), (218, 215, 117), (216, 215, 117), + (215, 219, 122), (215, 223, 130), (221, 230, 142), (225, 236, 154), + (228, 237, 165), (233, 239, 175), (233, 238, 180), (231, 237, 182), + (228, 234, 176), (228, 235, 175), (222, 232, 174), (212, 227, 175), + (198, 220, 177), (188, 211, 176), (176, 213, 186), (165, 209, 188), + (155, 208, 188), (147, 204, 186), (148, 204, 186), (141, 205, 186) + ), + +// 462 040222-21 +((46, 7, 70), (35, 5, 85), (31, 4, 92), (28, 4, 100), + (22, 3, 103), (17, 3, 107), (18, 3, 104), (19, 3, 101), + (18, 1, 89), (17, 0, 84), (16, 0, 79), (20, 0, 72), + (25, 0, 65), (35, 0, 55), (45, 1, 45), (50, 2, 40), + (56, 3, 36), (72, 3, 18), (76, 3, 13), (81, 3, 8), + (82, 3, 6), (84, 3, 5), (84, 3, 6), (84, 4, 8), + (79, 4, 16), (74, 4, 19), (69, 4, 23), (59, 3, 24), + (50, 2, 26), (45, 2, 26), (40, 2, 27), (28, 2, 29), + (19, 2, 30), (7, 0, 31), (6, 0, 29), (5, 0, 27), + (6, 0, 23), (7, 0, 20), (8, 0, 18), (10, 0, 17), + (17, 0, 11), (22, 0, 8), (27, 0, 5), (33, 0, 3), + (39, 0, 1), (41, 0, 0), (44, 0, 0), (47, 0, 0), + (49, 0, 1), (56, 4, 1), (61, 8, 4), (67, 13, 7), + (73, 16, 7), (80, 19, 8), (82, 19, 8), (84, 20, 9), + (83, 19, 8), (77, 19, 7), (72, 19, 7), (69, 19, 7), + (67, 20, 8), (67, 20, 8), (67, 20, 9), (67, 20, 12), + (64, 15, 13), (51, 7, 16), (41, 4, 21), (32, 2, 27), + (28, 1, 29), (25, 1, 32), (20, 2, 38), (17, 2, 44), + (15, 2, 51), (14, 2, 53), (14, 2, 55), (17, 3, 52), + (20, 5, 50), (23, 6, 49), (27, 7, 48), (35, 10, 46), + (47, 12, 42), (74, 25, 36), (91, 39, 39), (109, 53, 43), + (118, 61, 46), (127, 69, 49), (143, 86, 57), (161, 104, 72), + (178, 122, 94), (173, 120, 106), (169, 119, 118), (164, 117, 124), + (159, 116, 130), (149, 110, 133), (142, 109, 145), (134, 114, 153), + (134, 117, 157), (125, 110, 154), (119, 103, 149), (114, 96, 144), + (109, 88, 140), (105, 80, 137), (96, 75, 128), (98, 77, 117), + (118, 85, 94), (131, 92, 86), (144, 100, 79), (149, 101, 78), + (155, 102, 78), (158, 102, 79), (157, 105, 76), (156, 102, 73), + (150, 96, 69), (142, 81, 55), (144, 78, 53), (146, 76, 52), + (146, 69, 51), (145, 69, 53), (143, 70, 55), (136, 68, 57), + (113, 57, 50), (103, 46, 42), (94, 35, 34), (90, 30, 32), + (87, 26, 30), (85, 22, 27), (86, 18, 25), (84, 16, 22), + (79, 15, 21), (69, 11, 15), (64, 10, 13), (60, 9, 12), + (55, 7, 11), (54, 6, 10), (54, 6, 9), (55, 7, 10), + (54, 7, 10), (49, 7, 8), (45, 7, 7), (42, 7, 6), + (39, 7, 6), (33, 5, 4), (30, 5, 4), (28, 4, 5), + (27, 3, 6), (27, 2, 11), (27, 2, 12), (27, 2, 13), + (26, 1, 13), (26, 1, 13), (27, 1, 11), (28, 1, 10), + (30, 1, 11), (30, 1, 11), (31, 2, 12), (32, 2, 14), + (33, 2, 15), (33, 2, 15), (33, 2, 13), (33, 2, 12), + (33, 2, 10), (31, 2, 8), (30, 2, 8), (29, 2, 8), + (27, 2, 8), (24, 2, 9), (21, 2, 10), (18, 1, 10), + (14, 1, 11), (14, 1, 11), (14, 1, 11), (15, 1, 11), + (17, 1, 12), (19, 1, 15), (21, 1, 19), (24, 2, 23), + (26, 1, 28), (26, 1, 33), (29, 1, 36), (32, 2, 37), + (33, 2, 40), (34, 2, 40), (36, 4, 40), (40, 4, 40), + (45, 8, 43), (46, 9, 43), (47, 10, 44), (48, 15, 47), + (50, 18, 49), (52, 20, 48), (55, 21, 45), (55, 20, 43), + (58, 20, 38), (59, 19, 35), (63, 22, 33), (68, 26, 35), + (74, 32, 37), (83, 37, 36), (90, 40, 35), (95, 40, 30), + (96, 37, 27), (95, 38, 25), (94, 36, 26), (91, 41, 31), + (95, 48, 35), (100, 59, 41), (108, 69, 45), (118, 76, 50), + (126, 85, 52), (134, 86, 56), (139, 89, 62), (146, 91, 64), + (148, 94, 67), (153, 98, 66), (159, 102, 64), (166, 106, 61), + (170, 108, 57), (174, 110, 57), (179, 109, 56), (178, 105, 57), + (175, 101, 57), (169, 100, 59), (162, 101, 62), (155, 98, 62), + (146, 97, 62), (134, 91, 67), (122, 83, 71), (109, 74, 74), + (99, 66, 78), (87, 62, 82), (77, 54, 86), (70, 51, 85), + (61, 46, 91), (53, 40, 95), (42, 30, 101), (34, 19, 109), + (25, 11, 117), (17, 5, 126), (12, 2, 131), (7, 1, 135), + (6, 1, 137), (8, 1, 142), (11, 2, 143), (14, 2, 144), + (18, 2, 142), (22, 2, 139), (25, 2, 132), (30, 5, 121), + (37, 5, 111), (45, 6, 98), (44, 7, 90), (43, 7, 85), + (47, 8, 81), (47, 6, 75), (43, 8, 73), (40, 6, 73) + ), + +// 463 040222-22 +((87, 97, 127), (91, 103, 136), (91, 102, 134), (92, 102, 133), + (93, 102, 131), (94, 102, 130), (94, 102, 129), (95, 102, 129), + (98, 104, 131), (102, 108, 135), (106, 112, 139), (110, 117, 145), + (114, 122, 152), (113, 121, 151), (113, 121, 151), (111, 119, 149), + (109, 117, 147), (99, 106, 135), (94, 101, 131), (90, 96, 127), + (91, 96, 125), (92, 96, 124), (94, 98, 125), (96, 100, 126), + (111, 117, 144), (120, 127, 153), (129, 137, 163), (136, 145, 170), + (143, 153, 178), (145, 156, 180), (148, 159, 182), (152, 163, 186), + (156, 167, 189), (165, 174, 191), (170, 179, 194), (175, 184, 197), + (180, 188, 199), (185, 192, 202), (186, 192, 202), (187, 193, 202), + (184, 188, 192), (177, 180, 183), (170, 173, 175), (160, 163, 164), + (150, 153, 153), (145, 147, 147), (140, 142, 142), (129, 131, 131), + (119, 122, 122), (99, 100, 101), (88, 89, 90), (77, 78, 80), + (66, 67, 69), (56, 56, 58), (50, 50, 53), (45, 45, 48), + (27, 26, 29), (20, 20, 23), (14, 14, 17), (12, 13, 16), + (10, 12, 15), (10, 12, 15), (10, 12, 16), (12, 13, 17), + (13, 15, 20), (14, 16, 22), (14, 16, 22), (15, 17, 23), + (15, 16, 23), (15, 16, 23), (14, 16, 22), (14, 15, 21), + (14, 15, 22), (14, 15, 22), (15, 16, 23), (15, 16, 23), + (15, 17, 24), (15, 17, 24), (16, 17, 24), (16, 18, 25), + (17, 18, 26), (18, 19, 26), (19, 19, 26), (20, 19, 26), + (20, 19, 26), (21, 20, 26), (23, 22, 27), (25, 23, 28), + (33, 30, 34), (40, 36, 40), (48, 43, 47), (52, 47, 52), + (56, 52, 57), (65, 62, 67), (75, 73, 77), (86, 83, 88), + (97, 94, 99), (120, 117, 121), (129, 126, 129), (138, 136, 138), + (142, 140, 141), (146, 144, 145), (154, 152, 153), (162, 161, 161), + (175, 176, 177), (181, 183, 184), (188, 191, 192), (190, 194, 196), + (193, 198, 200), (198, 204, 208), (202, 209, 213), (202, 211, 216), + (198, 208, 216), (184, 195, 205), (179, 190, 201), (175, 186, 197), + (166, 176, 187), (155, 166, 177), (144, 154, 166), (132, 143, 156), + (111, 120, 135), (102, 111, 125), (93, 102, 116), (88, 97, 111), + (84, 92, 106), (74, 82, 96), (64, 72, 86), (54, 61, 75), + (44, 51, 64), (27, 32, 44), (23, 27, 39), (19, 23, 35), + (12, 16, 26), (8, 10, 18), (5, 7, 14), (3, 4, 10), + (1, 2, 7), (1, 2, 6), (1, 2, 5), (1, 2, 4), + (1, 2, 4), (1, 2, 4), (1, 2, 5), (2, 4, 6), + (4, 6, 8), (14, 14, 18), (17, 17, 22), (20, 21, 26), + (28, 29, 36), (36, 38, 46), (44, 47, 57), (52, 56, 67), + (68, 74, 86), (71, 77, 90), (74, 81, 94), (78, 86, 102), + (81, 90, 108), (84, 92, 111), (85, 93, 115), (86, 95, 119), + (87, 96, 122), (90, 99, 128), (90, 100, 129), (91, 101, 130), + (94, 103, 133), (97, 106, 134), (101, 109, 137), (104, 113, 140), + (107, 115, 140), (107, 115, 140), (108, 115, 141), (109, 117, 141), + (110, 117, 141), (111, 118, 141), (112, 119, 141), (113, 120, 142), + (115, 122, 142), (119, 125, 143), (126, 131, 147), (131, 137, 152), + (139, 144, 158), (146, 151, 164), (153, 159, 172), (161, 167, 180), + (174, 182, 194), (176, 185, 197), (179, 188, 200), (182, 192, 205), + (184, 195, 209), (186, 197, 211), (185, 198, 212), (184, 196, 212), + (180, 192, 210), (173, 186, 205), (165, 178, 199), (156, 170, 191), + (147, 160, 182), (138, 150, 172), (129, 141, 162), (119, 131, 153), + (111, 122, 144), (105, 116, 136), (101, 111, 129), (98, 107, 125), + (97, 104, 121), (95, 101, 119), (93, 100, 119), (90, 98, 118), + (88, 95, 115), (86, 92, 111), (82, 87, 106), (78, 81, 99), + (73, 75, 93), (70, 71, 87), (68, 69, 83), (69, 68, 81), + (70, 68, 79), (72, 70, 80), (74, 71, 83), (75, 74, 85), + (77, 76, 87), (78, 77, 88), (78, 77, 88), (76, 75, 86), + (72, 72, 83), (67, 67, 79), (61, 62, 74), (56, 56, 68), + (53, 52, 62), (49, 48, 57), (47, 45, 55), (45, 44, 53), + (46, 45, 54), (49, 48, 57), (50, 49, 58), (50, 49, 58), + (51, 49, 57), (51, 49, 57), (51, 49, 57), (51, 49, 59), + (50, 49, 60), (51, 50, 62), (50, 50, 62), (52, 51, 63), + (55, 54, 67), (58, 58, 72), (60, 59, 73), (62, 61, 76), + (64, 63, 79), (67, 66, 83), (69, 71, 89), (72, 75, 96), + (75, 79, 103), (77, 83, 109), (78, 86, 114), (82, 90, 118) + ), + +// 464 040222-23 +((114, 119, 136), (103, 112, 130), (98, 108, 125), (93, 104, 121), + (91, 100, 116), (89, 96, 111), (88, 95, 109), (87, 94, 107), + (90, 97, 108), (95, 101, 113), (100, 106, 118), (110, 114, 126), + (120, 123, 134), (131, 133, 144), (143, 144, 155), (148, 149, 159), + (154, 155, 164), (173, 175, 180), (178, 181, 187), (184, 187, 194), + (184, 189, 197), (185, 191, 200), (184, 190, 201), (183, 190, 202), + (175, 182, 195), (167, 176, 187), (160, 170, 180), (153, 162, 170), + (147, 154, 160), (143, 150, 155), (140, 146, 151), (134, 138, 142), + (130, 131, 134), (123, 121, 126), (119, 118, 123), (115, 116, 120), + (113, 115, 119), (111, 114, 119), (111, 114, 119), (111, 115, 120), + (117, 119, 125), (119, 121, 128), (122, 124, 132), (121, 124, 133), + (120, 124, 135), (118, 123, 134), (117, 122, 133), (114, 120, 132), + (111, 118, 129), (111, 113, 124), (114, 114, 125), (117, 115, 126), + (119, 116, 126), (121, 117, 127), (121, 117, 126), (121, 117, 125), + (116, 110, 115), (114, 107, 110), (113, 104, 106), (112, 102, 104), + (112, 101, 103), (110, 101, 103), (109, 101, 104), (106, 99, 105), + (100, 96, 104), (85, 82, 89), (77, 75, 82), (69, 69, 76), + (67, 67, 74), (65, 66, 72), (62, 66, 74), (63, 70, 80), + (73, 83, 99), (81, 92, 109), (89, 101, 120), (98, 112, 131), + (108, 124, 142), (113, 130, 147), (118, 136, 152), (126, 147, 164), + (133, 158, 176), (150, 175, 195), (157, 181, 202), (165, 187, 210), + (167, 190, 213), (170, 193, 217), (176, 198, 222), (179, 203, 226), + (182, 205, 225), (183, 203, 223), (184, 201, 221), (184, 199, 219), + (185, 197, 218), (186, 197, 217), (189, 199, 219), (193, 203, 222), + (198, 207, 225), (209, 215, 230), (214, 218, 230), (220, 221, 230), + (222, 221, 229), (224, 221, 229), (226, 222, 229), (227, 224, 231), + (227, 225, 233), (224, 223, 231), (222, 222, 230), (220, 220, 228), + (219, 219, 227), (215, 214, 224), (210, 209, 219), (204, 205, 214), + (198, 200, 210), (182, 188, 201), (177, 184, 198), (172, 180, 195), + (162, 173, 188), (153, 164, 182), (143, 155, 174), (134, 147, 165), + (118, 133, 151), (109, 126, 145), (101, 120, 140), (97, 117, 136), + (93, 115, 132), (85, 106, 125), (78, 98, 117), (72, 89, 106), + (68, 82, 98), (68, 77, 89), (69, 77, 88), (70, 77, 88), + (74, 80, 89), (78, 83, 92), (82, 86, 97), (84, 88, 99), + (88, 95, 104), (90, 97, 107), (93, 99, 110), (94, 100, 111), + (95, 101, 112), (98, 103, 115), (101, 106, 120), (102, 108, 122), + (103, 109, 126), (104, 117, 136), (105, 118, 139), (107, 120, 142), + (108, 123, 146), (110, 125, 148), (113, 128, 151), (118, 130, 152), + (133, 137, 154), (136, 140, 156), (140, 143, 158), (151, 153, 166), + (162, 163, 176), (171, 173, 185), (180, 182, 194), (186, 190, 203), + (192, 196, 207), (200, 200, 211), (201, 200, 210), (202, 200, 210), + (205, 199, 211), (205, 200, 210), (205, 200, 210), (201, 199, 210), + (193, 193, 208), (191, 191, 206), (189, 190, 205), (184, 185, 201), + (181, 181, 198), (180, 177, 195), (178, 174, 193), (176, 173, 190), + (173, 171, 188), (170, 168, 183), (167, 166, 180), (162, 162, 176), + (158, 160, 174), (155, 159, 173), (152, 158, 175), (150, 158, 178), + (144, 158, 180), (142, 157, 179), (140, 156, 178), (133, 149, 172), + (125, 143, 166), (118, 137, 159), (111, 132, 154), (107, 128, 152), + (106, 127, 153), (107, 129, 155), (111, 132, 158), (115, 135, 160), + (120, 136, 160), (124, 138, 159), (128, 137, 155), (129, 136, 152), + (131, 136, 148), (135, 135, 145), (139, 135, 144), (142, 138, 144), + (145, 140, 147), (146, 144, 152), (149, 147, 157), (151, 151, 163), + (149, 156, 166), (153, 160, 171), (156, 164, 176), (161, 169, 179), + (165, 173, 183), (167, 179, 187), (173, 185, 195), (180, 191, 204), + (183, 198, 210), (187, 204, 216), (189, 208, 223), (194, 211, 226), + (198, 212, 227), (199, 212, 225), (199, 211, 222), (199, 208, 219), + (194, 201, 212), (185, 193, 203), (174, 183, 195), (162, 172, 186), + (152, 161, 177), (141, 150, 169), (130, 142, 160), (124, 135, 154), + (119, 129, 150), (115, 128, 148), (111, 127, 146), (105, 124, 144), + (101, 122, 142), (97, 119, 141), (94, 116, 138), (93, 114, 134), + (95, 113, 132), (100, 115, 131), (107, 120, 135), (113, 124, 138), + (121, 130, 143), (127, 136, 149), (131, 139, 152), (131, 139, 154), + (132, 138, 153), (131, 134, 147), (130, 131, 143), (129, 127, 139), + (127, 126, 137), (126, 124, 136), (124, 123, 135), (118, 120, 134) + ), + +// 465 040222-24 +((38, 7, 7), (42, 8, 7), (45, 7, 6), (48, 6, 6), + (49, 6, 6), (50, 6, 7), (48, 5, 6), (46, 4, 6), + (41, 1, 3), (40, 2, 4), (39, 3, 6), (41, 5, 12), + (43, 7, 19), (48, 11, 26), (53, 16, 34), (55, 16, 35), + (57, 16, 37), (57, 18, 38), (56, 17, 37), (55, 16, 36), + (53, 17, 38), (52, 19, 41), (52, 18, 40), (53, 18, 39), + (50, 19, 33), (47, 15, 25), (45, 12, 18), (40, 9, 13), + (35, 6, 9), (34, 4, 8), (33, 3, 7), (33, 5, 9), + (36, 13, 18), (58, 31, 48), (72, 42, 67), (87, 54, 86), + (100, 62, 102), (113, 70, 119), (120, 79, 124), (128, 88, 130), + (150, 115, 138), (157, 117, 136), (165, 120, 135), (162, 112, 129), + (160, 104, 124), (157, 101, 119), (154, 98, 115), (144, 93, 112), + (131, 90, 94), (107, 70, 55), (90, 54, 36), (73, 38, 17), + (56, 23, 10), (39, 8, 4), (32, 5, 4), (26, 2, 5), + (14, 7, 9), (15, 14, 15), (17, 21, 22), (23, 31, 32), + (30, 41, 42), (32, 44, 45), (35, 47, 49), (38, 52, 52), + (39, 54, 55), (54, 53, 57), (65, 57, 58), (77, 61, 59), + (84, 64, 59), (92, 67, 60), (103, 70, 57), (104, 65, 52), + (105, 48, 38), (101, 37, 28), (97, 26, 18), (99, 23, 12), + (101, 20, 7), (101, 18, 5), (101, 17, 3), (100, 17, 0), + (99, 15, 1), (97, 8, 0), (100, 9, 0), (103, 11, 0), + (105, 13, 0), (108, 16, 0), (118, 23, 1), (127, 28, 4), + (137, 29, 5), (139, 29, 5), (141, 29, 6), (139, 28, 6), + (138, 27, 6), (137, 30, 5), (135, 32, 7), (128, 34, 9), + (120, 29, 9), (99, 20, 9), (88, 14, 7), (78, 8, 6), + (76, 6, 5), (74, 4, 5), (72, 4, 4), (73, 3, 4), + (80, 3, 7), (82, 2, 6), (85, 1, 6), (85, 0, 5), + (85, 0, 5), (83, 0, 4), (81, 0, 3), (78, 0, 3), + (74, 0, 5), (65, 0, 5), (62, 0, 5), (59, 1, 5), + (52, 1, 4), (45, 1, 3), (38, 0, 1), (33, 0, 1), + (29, 0, 0), (30, 0, 0), (32, 0, 0), (33, 0, 0), + (35, 0, 0), (37, 0, 0), (39, 0, 0), (41, 0, 0), + (41, 0, 0), (39, 0, 0), (38, 0, 0), (37, 0, 0), + (35, 0, 0), (31, 0, 0), (27, 0, 0), (23, 1, 0), + (12, 2, 0), (8, 2, 0), (4, 3, 0), (3, 3, 0), + (2, 3, 0), (1, 3, 0), (0, 2, 0), (0, 2, 0), + (1, 2, 0), (5, 3, 1), (7, 3, 1), (9, 4, 1), + (13, 5, 2), (18, 5, 5), (23, 6, 9), (27, 6, 12), + (38, 5, 16), (39, 5, 16), (41, 5, 16), (45, 5, 15), + (46, 5, 15), (46, 5, 16), (45, 7, 17), (41, 7, 20), + (39, 7, 22), (33, 8, 19), (31, 9, 19), (30, 10, 19), + (27, 13, 17), (21, 18, 17), (14, 26, 20), (10, 32, 25), + (7, 37, 27), (8, 37, 27), (9, 37, 28), (12, 35, 26), + (15, 32, 25), (17, 32, 23), (19, 33, 24), (22, 34, 25), + (26, 33, 23), (31, 30, 21), (40, 24, 17), (49, 17, 13), + (59, 9, 8), (66, 5, 5), (76, 6, 3), (91, 10, 9), + (123, 31, 15), (131, 40, 22), (140, 50, 29), (158, 69, 43), + (160, 82, 60), (156, 92, 67), (151, 97, 78), (145, 99, 84), + (138, 103, 81), (134, 115, 92), (145, 133, 107), (149, 146, 129), + (144, 150, 140), (138, 145, 149), (128, 131, 149), (114, 109, 134), + (97, 86, 116), (87, 75, 99), (87, 71, 92), (84, 66, 86), + (85, 62, 86), (83, 52, 80), (81, 40, 69), (74, 23, 53), + (62, 12, 36), (51, 6, 24), (40, 3, 13), (30, 3, 9), + (22, 3, 5), (16, 3, 2), (13, 2, 1), (11, 1, 1), + (10, 1, 0), (9, 0, 0), (9, 0, 0), (10, 0, 0), + (10, 0, 0), (12, 0, 1), (14, 1, 2), (17, 1, 2), + (19, 0, 2), (21, 0, 2), (21, 0, 2), (22, 0, 2), + (22, 0, 2), (22, 0, 2), (22, 0, 3), (22, 0, 3), + (22, 0, 2), (21, 0, 2), (21, 0, 1), (20, 0, 1), + (19, 0, 0), (18, 0, 0), (17, 0, 0), (16, 1, 1), + (15, 4, 4), (14, 9, 9), (16, 13, 13), (18, 14, 14), + (19, 13, 14), (20, 13, 15), (19, 12, 13), (18, 12, 11), + (16, 13, 12), (17, 16, 15), (23, 19, 18), (27, 20, 19), + (33, 19, 20), (38, 16, 18), (40, 12, 14), (41, 9, 10) + ), + +// 466 040222-25 +((134, 105, 81), (107, 78, 57), (92, 64, 45), (77, 50, 33), + (68, 43, 28), (59, 37, 24), (56, 35, 22), (53, 34, 21), + (41, 26, 15), (38, 22, 12), (36, 18, 10), (39, 21, 13), + (43, 24, 17), (51, 31, 23), (60, 38, 30), (65, 41, 33), + (70, 45, 36), (90, 60, 45), (99, 67, 49), (108, 75, 54), + (114, 81, 58), (120, 87, 63), (121, 88, 63), (123, 89, 63), + (121, 88, 57), (118, 87, 54), (116, 86, 51), (115, 87, 54), + (115, 89, 57), (116, 90, 59), (117, 92, 62), (121, 97, 67), + (127, 103, 71), (139, 118, 80), (145, 125, 87), (151, 132, 94), + (155, 134, 97), (159, 136, 101), (158, 135, 101), (158, 134, 102), + (145, 124, 91), (134, 115, 83), (124, 107, 75), (116, 96, 68), + (109, 85, 62), (105, 81, 59), (101, 77, 57), (97, 73, 53), + (96, 74, 53), (106, 86, 57), (115, 93, 63), (125, 101, 69), + (132, 106, 76), (140, 112, 83), (142, 115, 85), (144, 118, 87), + (146, 119, 88), (142, 114, 84), (139, 109, 80), (131, 100, 76), + (124, 91, 72), (119, 86, 68), (115, 82, 65), (107, 74, 59), + (105, 67, 55), (105, 68, 55), (113, 78, 64), (121, 88, 74), + (125, 94, 79), (130, 101, 84), (142, 114, 97), (152, 126, 108), + (171, 145, 121), (178, 154, 127), (185, 164, 133), (191, 169, 135), + (197, 175, 137), (197, 175, 137), (197, 176, 138), (197, 173, 133), + (194, 170, 128), (183, 162, 115), (179, 158, 109), (176, 154, 103), + (174, 152, 101), (173, 150, 99), (169, 143, 95), (164, 137, 92), + (154, 128, 87), (154, 129, 88), (155, 131, 89), (157, 132, 91), + (160, 134, 93), (165, 139, 97), (170, 145, 103), (174, 150, 110), + (177, 155, 116), (191, 173, 130), (197, 179, 134), (204, 186, 138), + (206, 188, 139), (209, 191, 140), (209, 192, 141), (208, 191, 141), + (205, 186, 142), (200, 180, 139), (196, 175, 137), (192, 171, 135), + (189, 168, 133), (183, 161, 125), (178, 153, 117), (172, 147, 112), + (165, 138, 107), (150, 121, 98), (146, 117, 94), (142, 114, 90), + (137, 106, 82), (133, 102, 74), (131, 98, 70), (131, 98, 69), + (132, 102, 76), (135, 105, 80), (138, 109, 84), (138, 110, 85), + (139, 112, 87), (141, 113, 86), (141, 113, 85), (137, 109, 84), + (133, 106, 83), (114, 94, 72), (108, 89, 68), (102, 85, 64), + (91, 75, 53), (78, 62, 45), (67, 51, 36), (55, 39, 28), + (36, 27, 17), (31, 25, 14), (27, 23, 11), (27, 22, 11), + (27, 22, 12), (26, 19, 12), (25, 17, 11), (25, 15, 8), + (24, 15, 6), (25, 15, 6), (25, 14, 6), (25, 14, 6), + (23, 12, 7), (22, 9, 6), (19, 7, 5), (18, 6, 2), + (15, 5, 1), (14, 5, 1), (13, 5, 1), (13, 5, 1), + (12, 7, 1), (15, 8, 1), (19, 9, 1), (22, 13, 2), + (28, 16, 5), (39, 24, 10), (42, 25, 11), (45, 27, 12), + (49, 29, 14), (51, 30, 14), (53, 31, 15), (53, 31, 16), + (53, 29, 15), (52, 28, 16), (51, 28, 17), (47, 25, 16), + (45, 23, 15), (43, 22, 16), (44, 22, 16), (47, 22, 16), + (51, 23, 19), (53, 26, 21), (54, 26, 23), (55, 28, 25), + (57, 29, 26), (57, 28, 26), (59, 29, 25), (58, 30, 24), + (55, 30, 20), (55, 30, 20), (56, 31, 20), (56, 33, 20), + (60, 35, 21), (63, 41, 22), (69, 46, 23), (77, 53, 26), + (87, 62, 32), (97, 72, 38), (107, 79, 46), (114, 86, 51), + (118, 88, 53), (119, 89, 53), (120, 88, 55), (121, 89, 56), + (120, 89, 59), (120, 91, 62), (122, 93, 65), (125, 97, 70), + (132, 102, 77), (141, 112, 87), (153, 123, 97), (164, 137, 108), + (174, 148, 116), (184, 160, 126), (194, 171, 133), (205, 181, 142), + (214, 190, 151), (221, 199, 162), (226, 204, 168), (228, 208, 176), + (230, 213, 179), (231, 215, 180), (228, 211, 176), (221, 206, 173), + (212, 197, 165), (198, 182, 159), (187, 171, 150), (178, 160, 140), + (169, 150, 127), (159, 139, 114), (148, 126, 100), (133, 109, 86), + (119, 92, 72), (107, 78, 62), (100, 69, 52), (96, 64, 45), + (96, 64, 44), (100, 67, 46), (106, 74, 49), (115, 83, 57), + (124, 93, 65), (134, 103, 72), (145, 114, 80), (155, 126, 91), + (166, 138, 100), (178, 152, 110), (188, 164, 119), (197, 174, 126), + (202, 180, 130), (205, 183, 134), (206, 185, 139), (206, 186, 141), + (206, 185, 142), (204, 183, 140), (197, 176, 133), (184, 160, 120), + (171, 144, 109), (158, 131, 99), (148, 118, 91), (138, 109, 86) + ), + +// 467 040222-26 +((78, 46, 94), (49, 30, 72), (25, 15, 54), (2, 1, 37), + (2, 1, 38), (3, 1, 40), (2, 1, 40), (2, 1, 41), + (3, 2, 43), (3, 1, 44), (4, 1, 45), (3, 1, 45), + (2, 1, 46), (2, 1, 46), (2, 1, 46), (2, 1, 46), + (2, 2, 46), (4, 2, 49), (10, 4, 53), (16, 7, 57), + (28, 15, 65), (41, 23, 73), (49, 27, 78), (57, 32, 84), + (91, 52, 109), (109, 64, 120), (127, 77, 132), (146, 89, 145), + (165, 101, 158), (172, 106, 163), (179, 111, 169), (187, 117, 174), + (188, 118, 175), (177, 110, 166), (163, 102, 157), (150, 95, 149), + (131, 83, 136), (113, 71, 124), (103, 64, 117), (94, 58, 111), + (61, 38, 89), (55, 34, 86), (50, 31, 84), (59, 35, 91), + (69, 40, 98), (75, 43, 102), (82, 47, 106), (95, 56, 115), + (104, 62, 121), (118, 69, 129), (115, 66, 126), (112, 63, 123), + (99, 56, 114), (87, 49, 106), (79, 45, 100), (72, 41, 95), + (41, 22, 73), (28, 15, 64), (16, 9, 56), (11, 6, 52), + (7, 3, 49), (7, 2, 48), (7, 2, 48), (10, 3, 51), + (16, 6, 55), (41, 21, 73), (61, 32, 88), (82, 44, 103), + (94, 51, 111), (106, 59, 120), (130, 74, 137), (156, 90, 154), + (195, 116, 182), (204, 121, 188), (214, 127, 194), (207, 123, 189), + (200, 120, 184), (191, 115, 178), (183, 110, 172), (160, 97, 157), + (137, 80, 141), (88, 51, 106), (67, 39, 90), (47, 28, 74), + (39, 23, 68), (31, 18, 63), (21, 12, 57), (15, 8, 53), + (13, 7, 51), (16, 8, 53), (19, 9, 56), (20, 10, 57), + (21, 11, 59), (23, 11, 63), (23, 11, 65), (23, 11, 65), + (22, 10, 65), (18, 9, 62), (15, 8, 59), (12, 7, 57), + (10, 6, 55), (9, 5, 54), (6, 4, 50), (4, 4, 48), + (2, 3, 44), (1, 2, 43), (0, 2, 42), (0, 2, 41), + (0, 2, 41), (0, 2, 41), (0, 2, 41), (0, 2, 42), + (0, 2, 42), (1, 2, 44), (1, 2, 44), (2, 2, 45), + (3, 2, 47), (4, 2, 48), (5, 3, 49), (7, 3, 50), + (12, 6, 53), (15, 8, 57), (19, 10, 61), (22, 11, 63), + (25, 12, 65), (30, 15, 69), (34, 17, 72), (39, 20, 75), + (46, 23, 80), (59, 30, 90), (62, 32, 92), (66, 34, 95), + (72, 37, 98), (81, 42, 104), (89, 47, 110), (94, 51, 113), + (93, 52, 111), (88, 49, 107), (84, 47, 104), (80, 45, 101), + (77, 43, 99), (70, 39, 90), (61, 35, 81), (50, 31, 71), + (42, 25, 65), (32, 19, 60), (33, 18, 60), (34, 18, 61), + (40, 24, 63), (48, 29, 70), (60, 36, 81), (76, 47, 94), + (116, 72, 126), (127, 80, 134), (138, 88, 142), (160, 102, 159), + (181, 118, 175), (199, 130, 188), (215, 142, 201), (230, 151, 211), + (238, 155, 217), (243, 158, 220), (241, 156, 218), (239, 155, 217), + (238, 151, 215), (233, 146, 210), (225, 141, 203), (217, 135, 196), + (206, 127, 188), (204, 125, 187), (203, 123, 186), (195, 119, 181), + (184, 113, 173), (170, 105, 163), (155, 96, 153), (140, 85, 145), + (124, 74, 134), (106, 62, 121), (85, 51, 109), (67, 40, 96), + (50, 30, 85), (36, 20, 75), (26, 13, 66), (17, 8, 58), + (8, 5, 49), (8, 5, 47), (9, 5, 46), (9, 5, 44), + (9, 6, 42), (8, 5, 42), (7, 5, 41), (7, 6, 41), + (7, 6, 41), (6, 6, 41), (6, 6, 42), (6, 6, 42), + (7, 7, 41), (11, 9, 41), (14, 11, 42), (15, 12, 43), + (17, 13, 44), (16, 12, 44), (17, 12, 44), (17, 12, 45), + (15, 11, 46), (13, 10, 47), (9, 8, 47), (6, 5, 47), + (3, 3, 47), (1, 2, 47), (0, 1, 46), (0, 1, 45), + (0, 1, 44), (0, 1, 43), (0, 1, 42), (0, 1, 42), + (0, 1, 41), (1, 1, 41), (2, 2, 40), (5, 4, 39), + (9, 6, 39), (13, 9, 39), (17, 10, 43), (22, 13, 48), + (27, 16, 53), (34, 19, 57), (41, 24, 62), (47, 28, 68), + (49, 28, 72), (50, 28, 77), (48, 26, 78), (44, 23, 78), + (42, 23, 76), (36, 20, 70), (31, 17, 65), (25, 13, 58), + (17, 9, 51), (12, 6, 47), (7, 3, 41), (5, 2, 36), + (3, 1, 33), (2, 1, 31), (1, 1, 31), (2, 0, 32), + (3, 1, 35), (5, 1, 38), (9, 4, 43), (17, 9, 51), + (28, 15, 61), (44, 25, 73), (67, 39, 91), (85, 49, 105), + (82, 47, 101), (76, 43, 96), (65, 37, 86), (65, 38, 84) + ), + +// 468 040222-27 +((183, 145, 135), (187, 128, 111), (180, 117, 99), (173, 106, 88), + (160, 93, 76), (147, 81, 64), (141, 75, 59), (135, 69, 55), + (95, 46, 39), (74, 38, 33), (54, 30, 27), (44, 25, 21), + (35, 20, 16), (30, 17, 14), (25, 14, 12), (24, 13, 11), + (23, 13, 10), (26, 17, 14), (37, 22, 20), (49, 28, 26), + (71, 44, 42), (93, 60, 59), (104, 71, 69), (115, 82, 79), + (159, 125, 119), (179, 144, 138), (199, 164, 158), (201, 171, 163), + (204, 178, 168), (200, 176, 166), (197, 174, 165), (188, 161, 154), + (174, 143, 143), (137, 115, 115), (123, 101, 100), (110, 87, 86), + (105, 83, 85), (101, 79, 85), (100, 79, 85), (99, 79, 86), + (117, 87, 92), (133, 101, 105), (150, 115, 119), (163, 130, 132), + (177, 146, 146), (184, 154, 154), (192, 162, 162), (207, 180, 176), + (217, 193, 185), (219, 199, 188), (213, 190, 179), (207, 181, 171), + (187, 162, 152), (168, 144, 134), (157, 132, 122), (147, 120, 111), + (101, 76, 70), (79, 57, 53), (57, 38, 36), (43, 27, 26), + (29, 17, 16), (25, 14, 13), (22, 12, 11), (19, 11, 10), + (22, 14, 14), (46, 36, 36), (64, 51, 53), (82, 67, 70), + (92, 75, 78), (103, 83, 86), (125, 99, 103), (143, 116, 117), + (157, 125, 131), (152, 122, 129), (148, 120, 127), (145, 116, 121), + (142, 113, 115), (139, 110, 113), (136, 107, 112), (135, 105, 108), + (137, 105, 104), (151, 109, 99), (155, 108, 96), (160, 107, 93), + (160, 108, 93), (161, 110, 94), (163, 112, 97), (162, 112, 99), + (151, 110, 95), (143, 105, 94), (136, 101, 93), (131, 98, 91), + (126, 95, 89), (113, 89, 82), (98, 79, 74), (88, 69, 65), + (78, 58, 59), (65, 50, 50), (63, 47, 46), (62, 44, 42), + (61, 42, 40), (61, 40, 38), (57, 38, 36), (54, 35, 31), + (43, 25, 20), (36, 21, 15), (29, 17, 11), (26, 14, 10), + (23, 12, 9), (17, 8, 6), (12, 6, 4), (7, 4, 2), + (4, 2, 1), (1, 0, 0), (0, 0, 0), (0, 0, 0), + (2, 0, 1), (4, 1, 1), (7, 3, 4), (10, 6, 8), + (21, 11, 13), (24, 15, 17), (28, 19, 21), (28, 19, 21), + (28, 20, 21), (30, 20, 22), (29, 19, 20), (29, 20, 21), + (27, 19, 19), (29, 17, 16), (30, 18, 17), (32, 19, 18), + (36, 22, 20), (43, 27, 25), (52, 33, 31), (60, 42, 38), + (81, 57, 53), (89, 64, 61), (98, 72, 69), (102, 75, 73), + (106, 78, 78), (115, 85, 85), (129, 94, 97), (141, 108, 108), + (154, 122, 123), (183, 155, 155), (190, 165, 163), (198, 176, 172), + (215, 194, 190), (224, 208, 202), (230, 218, 211), (232, 223, 214), + (232, 220, 212), (231, 217, 209), (230, 214, 206), (225, 203, 198), + (221, 195, 190), (213, 185, 179), (206, 171, 165), (192, 154, 151), + (177, 138, 138), (154, 116, 108), (149, 109, 102), (144, 103, 96), + (137, 91, 89), (136, 89, 86), (141, 91, 85), (148, 100, 90), + (167, 116, 108), (171, 121, 112), (176, 126, 116), (184, 138, 125), + (189, 148, 131), (198, 156, 137), (202, 162, 144), (206, 164, 150), + (207, 169, 156), (216, 177, 163), (221, 187, 171), (225, 192, 180), + (223, 194, 184), (224, 193, 185), (220, 192, 183), (216, 188, 181), + (196, 165, 162), (188, 156, 153), (181, 148, 145), (165, 133, 131), + (151, 118, 121), (136, 103, 110), (120, 90, 96), (105, 81, 84), + (96, 74, 77), (89, 67, 73), (87, 63, 67), (90, 60, 60), + (101, 61, 56), (116, 65, 57), (124, 69, 59), (123, 68, 58), + (117, 62, 53), (117, 58, 47), (111, 54, 44), (99, 50, 43), + (77, 42, 39), (62, 35, 34), (54, 30, 33), (53, 31, 36), + (53, 32, 38), (52, 32, 37), (50, 31, 38), (49, 33, 42), + (50, 35, 44), (49, 34, 40), (46, 31, 35), (44, 29, 33), + (45, 32, 34), (49, 35, 37), (57, 40, 42), (66, 44, 46), + (74, 51, 54), (81, 59, 63), (87, 66, 73), (95, 73, 79), + (97, 76, 85), (98, 78, 86), (95, 78, 86), (94, 78, 83), + (91, 78, 79), (89, 73, 73), (87, 68, 68), (87, 66, 63), + (85, 67, 60), (87, 67, 57), (88, 65, 57), (89, 62, 57), + (87, 61, 55), (87, 60, 53), (89, 59, 52), (92, 58, 54), + (95, 59, 56), (97, 62, 57), (100, 65, 57), (105, 69, 62), + (115, 75, 67), (122, 83, 75), (126, 85, 78), (127, 88, 85), + (130, 91, 90), (137, 98, 100), (147, 105, 111), (156, 115, 121), + (163, 126, 129), (164, 127, 131), (167, 129, 133), (173, 132, 133) + ), + +// 469 040222-28 +((101, 156, 123), (83, 141, 116), (72, 130, 115), (62, 120, 114), + (62, 124, 118), (63, 128, 123), (62, 127, 123), (61, 126, 123), + (50, 116, 125), (42, 107, 121), (35, 98, 117), (28, 88, 108), + (22, 79, 100), (20, 73, 93), (19, 68, 86), (20, 64, 82), + (22, 61, 79), (28, 43, 63), (31, 39, 52), (34, 36, 42), + (40, 35, 34), (47, 35, 27), (51, 33, 26), (56, 32, 26), + (51, 34, 29), (49, 41, 35), (48, 49, 42), (50, 57, 52), + (53, 65, 63), (51, 69, 69), (50, 74, 76), (48, 79, 85), + (48, 84, 93), (50, 85, 90), (51, 82, 84), (53, 80, 79), + (56, 74, 69), (59, 69, 60), (61, 65, 55), (64, 62, 51), + (77, 67, 48), (83, 78, 54), (90, 90, 60), (93, 101, 69), + (97, 113, 78), (98, 119, 85), (100, 126, 93), (103, 140, 109), + (107, 157, 123), (110, 172, 135), (107, 171, 137), (105, 171, 139), + (101, 166, 133), (97, 162, 128), (95, 160, 124), (94, 158, 121), + (91, 149, 120), (81, 141, 116), (71, 133, 113), (58, 122, 106), + (45, 112, 100), (42, 107, 99), (40, 102, 98), (38, 92, 95), + (33, 81, 91), (17, 62, 74), (13, 53, 64), (9, 45, 55), + (8, 41, 49), (7, 37, 44), (4, 29, 33), (5, 24, 26), + (7, 23, 20), (7, 27, 19), (7, 31, 19), (11, 34, 18), + (15, 37, 18), (17, 37, 16), (19, 37, 15), (21, 37, 14), + (20, 36, 14), (18, 33, 15), (18, 29, 12), (19, 25, 9), + (18, 22, 8), (17, 20, 8), (16, 13, 10), (15, 9, 16), + (21, 7, 21), (23, 7, 20), (26, 8, 20), (26, 8, 21), + (27, 9, 22), (33, 14, 23), (39, 17, 22), (44, 22, 17), + (43, 25, 13), (35, 27, 9), (33, 30, 11), (32, 34, 13), + (32, 37, 15), (32, 41, 17), (31, 43, 20), (26, 44, 24), + (16, 38, 37), (17, 38, 41), (18, 39, 45), (19, 40, 43), + (21, 42, 42), (23, 45, 39), (29, 48, 37), (38, 52, 33), + (52, 62, 33), (80, 86, 39), (82, 92, 43), (85, 98, 47), + (88, 104, 53), (88, 110, 58), (92, 114, 64), (101, 115, 64), + (100, 107, 65), (92, 102, 59), (85, 97, 54), (86, 95, 49), + (88, 94, 44), (99, 99, 34), (109, 105, 29), (119, 115, 29), + (126, 128, 38), (130, 146, 63), (130, 149, 69), (130, 152, 75), + (124, 159, 89), (122, 164, 103), (115, 166, 115), (112, 166, 125), + (104, 159, 135), (100, 150, 131), (96, 142, 128), (96, 137, 123), + (96, 133, 119), (96, 124, 113), (96, 118, 111), (89, 118, 118), + (81, 112, 119), (70, 106, 110), (69, 104, 107), (68, 103, 105), + (62, 110, 113), (55, 114, 124), (55, 119, 134), (59, 130, 141), + (82, 151, 141), (85, 155, 142), (89, 159, 143), (97, 161, 146), + (104, 163, 146), (113, 167, 138), (124, 170, 125), (130, 170, 110), + (133, 165, 96), (126, 143, 81), (123, 138, 74), (120, 133, 68), + (114, 123, 53), (110, 111, 38), (103, 97, 29), (97, 82, 30), + (82, 66, 37), (81, 66, 40), (80, 67, 43), (78, 74, 50), + (80, 79, 59), (79, 84, 70), (79, 88, 79), (78, 87, 89), + (77, 88, 96), (75, 93, 98), (71, 96, 95), (64, 97, 90), + (56, 90, 88), (48, 78, 85), (41, 69, 81), (38, 64, 74), + (41, 82, 64), (46, 85, 63), (51, 88, 63), (64, 96, 63), + (76, 103, 63), (92, 112, 60), (103, 129, 58), (116, 137, 52), + (124, 136, 42), (126, 126, 34), (123, 112, 27), (111, 101, 23), + (98, 94, 20), (84, 80, 18), (69, 63, 16), (58, 48, 14), + (48, 38, 13), (44, 36, 11), (44, 38, 9), (43, 40, 11), + (45, 45, 14), (46, 54, 22), (46, 62, 26), (47, 65, 30), + (46, 67, 36), (44, 66, 41), (40, 71, 50), (37, 78, 56), + (37, 80, 62), (37, 80, 64), (41, 73, 62), (43, 71, 59), + (46, 73, 54), (51, 79, 54), (54, 86, 54), (60, 89, 56), + (61, 90, 55), (59, 87, 52), (57, 84, 51), (51, 82, 51), + (48, 82, 55), (44, 82, 58), (41, 82, 59), (41, 81, 61), + (41, 79, 60), (42, 78, 63), (42, 82, 68), (44, 89, 70), + (53, 96, 70), (62, 101, 68), (74, 101, 64), (79, 99, 62), + (78, 99, 64), (79, 99, 65), (78, 99, 70), (83, 100, 75), + (84, 97, 78), (84, 100, 89), (81, 103, 99), (81, 107, 111), + (85, 122, 126), (89, 139, 137), (104, 159, 144), (113, 171, 151), + (120, 176, 153), (127, 180, 153), (126, 186, 152), (136, 197, 148), + (129, 186, 136), (120, 173, 128), (111, 157, 122), (97, 146, 117) + ), + +// 470 040222-29 +((202, 107, 147), (191, 91, 132), (188, 88, 128), (186, 85, 125), + (185, 84, 125), (185, 83, 125), (184, 83, 126), (184, 84, 128), + (182, 88, 130), (182, 90, 131), (182, 92, 132), (185, 98, 137), + (188, 104, 142), (194, 112, 149), (201, 121, 157), (204, 126, 162), + (208, 131, 167), (220, 153, 186), (224, 158, 190), (228, 163, 194), + (229, 162, 193), (230, 162, 192), (230, 159, 190), (230, 157, 188), + (226, 144, 176), (221, 137, 170), (216, 130, 164), (212, 123, 158), + (209, 116, 153), (208, 112, 150), (207, 109, 148), (205, 103, 144), + (205, 96, 139), (203, 84, 129), (201, 77, 124), (200, 70, 119), + (196, 64, 115), (193, 59, 111), (191, 57, 109), (190, 56, 107), + (189, 53, 105), (190, 55, 107), (191, 58, 109), (194, 61, 111), + (197, 65, 114), (197, 67, 115), (197, 69, 116), (196, 71, 116), + (194, 73, 117), (189, 71, 114), (186, 68, 111), (183, 65, 109), + (178, 62, 105), (173, 60, 101), (170, 59, 98), (167, 58, 96), + (154, 57, 91), (148, 56, 88), (143, 55, 85), (141, 55, 84), + (139, 55, 84), (138, 55, 85), (138, 55, 86), (138, 55, 85), + (136, 53, 83), (131, 49, 77), (126, 46, 73), (122, 43, 70), + (121, 43, 69), (120, 43, 68), (119, 44, 69), (120, 48, 71), + (132, 60, 84), (139, 68, 92), (146, 77, 100), (152, 83, 107), + (158, 90, 115), (160, 92, 117), (162, 94, 120), (165, 99, 124), + (168, 103, 127), (175, 110, 134), (180, 115, 139), (185, 120, 144), + (188, 122, 147), (192, 125, 151), (198, 130, 157), (205, 133, 163), + (215, 137, 171), (218, 136, 171), (222, 135, 172), (222, 132, 171), + (222, 130, 170), (219, 123, 165), (214, 115, 157), (208, 107, 149), + (199, 99, 140), (181, 83, 123), (171, 75, 114), (162, 68, 105), + (158, 64, 101), (155, 60, 97), (146, 53, 88), (136, 43, 79), + (118, 27, 59), (111, 20, 52), (104, 14, 45), (101, 12, 42), + (98, 11, 40), (96, 11, 38), (99, 14, 40), (105, 19, 45), + (114, 25, 53), (132, 41, 71), (135, 45, 75), (139, 50, 79), + (148, 56, 87), (154, 64, 96), (159, 71, 102), (164, 77, 107), + (174, 85, 116), (179, 90, 121), (184, 95, 127), (185, 98, 129), + (187, 101, 132), (190, 106, 137), (193, 111, 143), (193, 115, 145), + (191, 118, 146), (184, 115, 141), (181, 113, 138), (179, 111, 136), + (175, 106, 131), (170, 101, 126), (167, 99, 122), (167, 97, 122), + (172, 101, 127), (178, 105, 131), (184, 109, 136), (186, 111, 138), + (189, 113, 140), (193, 115, 143), (195, 116, 145), (197, 118, 146), + (198, 120, 149), (204, 130, 159), (206, 134, 162), (208, 138, 166), + (214, 145, 173), (220, 150, 179), (226, 154, 184), (230, 155, 186), + (234, 147, 184), (233, 143, 181), (233, 140, 179), (229, 132, 172), + (225, 125, 164), (219, 120, 157), (212, 113, 149), (207, 106, 141), + (197, 99, 132), (178, 78, 112), (173, 72, 106), (168, 66, 100), + (157, 53, 88), (147, 40, 75), (136, 31, 64), (125, 23, 55), + (116, 18, 45), (114, 18, 44), (113, 19, 44), (112, 21, 46), + (113, 25, 50), (115, 30, 56), (120, 36, 61), (125, 43, 68), + (129, 48, 74), (137, 52, 81), (145, 56, 88), (154, 63, 97), + (164, 69, 104), (174, 76, 114), (183, 85, 124), (194, 95, 134), + (214, 121, 158), (217, 126, 162), (221, 131, 167), (226, 139, 175), + (231, 146, 183), (235, 151, 186), (236, 152, 188), (236, 153, 189), + (235, 152, 189), (234, 152, 188), (232, 154, 187), (231, 155, 186), + (230, 156, 186), (229, 156, 187), (228, 156, 185), (225, 152, 182), + (223, 147, 176), (219, 140, 170), (215, 131, 164), (209, 122, 155), + (203, 113, 146), (196, 105, 139), (190, 99, 133), (184, 95, 128), + (178, 92, 123), (173, 88, 117), (169, 85, 113), (164, 83, 110), + (160, 81, 106), (156, 79, 102), (151, 77, 100), (148, 75, 97), + (145, 74, 95), (143, 75, 95), (140, 74, 95), (139, 74, 95), + (138, 75, 95), (136, 75, 93), (135, 73, 91), (131, 68, 87), + (127, 64, 83), (123, 59, 78), (120, 55, 75), (120, 52, 73), + (121, 51, 73), (122, 53, 75), (125, 56, 78), (131, 60, 83), + (135, 62, 86), (139, 66, 90), (143, 71, 94), (145, 74, 97), + (150, 76, 100), (155, 81, 105), (160, 86, 112), (166, 93, 119), + (176, 102, 129), (187, 111, 139), (197, 119, 150), (207, 126, 159), + (213, 133, 166), (219, 137, 170), (224, 139, 174), (228, 140, 176), + (231, 142, 179), (233, 142, 181), (234, 142, 181), (233, 140, 180), + (229, 135, 177), (224, 131, 173), (218, 125, 167), (212, 118, 159) + ), + +// 471 040223 +((183, 89, 57), (215, 132, 89), (229, 149, 101), (243, 166, 113), + (242, 165, 110), (242, 164, 108), (239, 162, 105), (236, 161, 103), + (227, 148, 89), (220, 133, 76), (214, 118, 63), (202, 109, 57), + (190, 100, 52), (187, 106, 55), (185, 112, 59), (188, 114, 58), + (191, 117, 57), (203, 124, 65), (201, 133, 82), (199, 142, 100), + (189, 155, 108), (180, 168, 117), (174, 169, 115), (168, 170, 113), + (142, 151, 104), (134, 147, 108), (127, 144, 112), (118, 140, 107), + (109, 137, 102), (106, 135, 99), (104, 134, 97), (101, 134, 88), + (103, 133, 90), (105, 117, 87), (104, 110, 82), (104, 103, 78), + (106, 95, 66), (108, 87, 55), (111, 82, 51), (115, 78, 48), + (146, 78, 48), (157, 84, 45), (169, 90, 43), (177, 93, 44), + (186, 97, 46), (186, 99, 49), (187, 102, 52), (175, 106, 59), + (161, 103, 61), (141, 86, 48), (144, 71, 41), (148, 57, 35), + (145, 44, 29), (142, 32, 24), (139, 29, 21), (137, 27, 18), + (129, 21, 9), (117, 20, 5), (106, 19, 2), (87, 17, 1), + (68, 15, 1), (60, 15, 1), (52, 15, 1), (38, 14, 1), + (28, 16, 2), (25, 16, 4), (33, 16, 7), (42, 16, 10), + (45, 18, 14), (49, 21, 18), (56, 30, 29), (63, 39, 36), + (84, 49, 36), (88, 47, 34), (93, 45, 33), (91, 43, 32), + (89, 42, 31), (87, 39, 28), (85, 36, 26), (81, 29, 15), + (75, 19, 7), (62, 5, 0), (51, 3, 0), (41, 1, 0), + (36, 2, 0), (31, 4, 0), (22, 8, 1), (18, 13, 4), + (11, 25, 15), (12, 35, 22), (14, 45, 30), (17, 51, 33), + (20, 58, 37), (24, 69, 42), (29, 77, 44), (40, 78, 45), + (50, 75, 43), (70, 63, 36), (78, 56, 29), (87, 49, 22), + (90, 43, 18), (94, 37, 15), (98, 25, 7), (95, 14, 5), + (81, 2, 5), (71, 1, 6), (61, 0, 7), (55, 0, 8), + (49, 1, 9), (39, 1, 6), (31, 1, 6), (24, 1, 7), + (21, 1, 6), (32, 1, 4), (37, 1, 3), (42, 1, 2), + (50, 3, 4), (56, 7, 7), (66, 16, 15), (81, 29, 26), + (123, 71, 53), (131, 93, 67), (140, 116, 82), (143, 125, 91), + (146, 135, 101), (150, 148, 107), (158, 161, 114), (166, 169, 118), + (171, 173, 120), (183, 172, 124), (183, 167, 120), (184, 162, 116), + (191, 154, 106), (197, 141, 98), (207, 136, 92), (216, 128, 85), + (209, 112, 63), (196, 109, 59), (184, 106, 56), (176, 106, 56), + (168, 106, 57), (152, 100, 52), (135, 96, 51), (115, 97, 53), + (102, 108, 68), (79, 118, 97), (75, 114, 98), (71, 110, 99), + (64, 93, 87), (62, 94, 76), (54, 86, 81), (52, 82, 79), + (41, 64, 68), (38, 66, 58), (36, 69, 48), (25, 70, 39), + (23, 76, 36), (20, 83, 40), (28, 89, 54), (40, 100, 64), + (51, 105, 67), (87, 112, 66), (94, 112, 66), (102, 112, 67), + (116, 113, 71), (126, 105, 71), (131, 100, 66), (138, 93, 64), + (121, 81, 45), (115, 74, 41), (110, 68, 37), (88, 58, 28), + (72, 47, 25), (55, 37, 20), (36, 28, 16), (27, 18, 11), + (21, 11, 7), (20, 8, 4), (22, 11, 4), (27, 13, 6), + (32, 18, 7), (41, 22, 8), (51, 24, 10), (64, 28, 8), + (88, 27, 7), (92, 26, 7), (97, 26, 8), (104, 24, 8), + (112, 21, 6), (120, 15, 5), (130, 11, 2), (137, 9, 2), + (140, 10, 2), (143, 13, 1), (145, 14, 2), (150, 15, 1), + (151, 14, 2), (148, 12, 3), (141, 19, 6), (130, 23, 10), + (117, 29, 18), (100, 30, 23), (81, 25, 25), (64, 24, 26), + (55, 26, 27), (50, 34, 32), (46, 46, 36), (38, 56, 40), + (32, 62, 39), (32, 59, 41), (37, 56, 42), (49, 52, 42), + (55, 53, 42), (58, 59, 40), (56, 57, 41), (53, 52, 43), + (51, 42, 45), (45, 35, 44), (40, 33, 39), (32, 30, 34), + (28, 29, 28), (23, 24, 25), (18, 21, 23), (18, 19, 20), + (19, 17, 17), (28, 13, 13), (43, 11, 8), (59, 9, 5), + (78, 10, 3), (93, 12, 1), (104, 11, 2), (113, 15, 3), + (117, 18, 8), (120, 21, 11), (121, 24, 12), (115, 25, 15), + (108, 27, 16), (97, 30, 22), (83, 35, 28), (75, 38, 35), + (72, 44, 36), (72, 46, 33), (76, 46, 28), (73, 45, 24), + (67, 42, 24), (62, 39, 22), (59, 34, 20), (64, 29, 14), + (70, 23, 6), (73, 16, 2), (76, 9, 0), (81, 4, 1), + (95, 19, 13), (117, 41, 26), (142, 61, 37), (164, 82, 53) + ), + +// 472 040224 +((164, 132, 113), (149, 103, 81), (146, 85, 63), (144, 68, 46), + (133, 54, 31), (122, 40, 17), (113, 34, 13), (105, 29, 9), + (73, 10, 1), (60, 6, 0), (47, 2, 0), (38, 1, 0), + (30, 1, 0), (25, 1, 0), (20, 2, 0), (18, 2, 0), + (16, 2, 0), (10, 2, 0), (7, 2, 0), (5, 2, 0), + (4, 3, 0), (3, 4, 0), (3, 4, 0), (3, 5, 0), + (6, 5, 0), (12, 4, 0), (18, 4, 0), (25, 3, 1), + (32, 3, 2), (35, 3, 2), (38, 4, 3), (40, 7, 4), + (40, 12, 6), (41, 29, 13), (43, 37, 18), (45, 45, 24), + (51, 47, 27), (57, 50, 31), (60, 50, 30), (63, 50, 30), + (79, 55, 33), (86, 59, 36), (94, 64, 40), (108, 66, 47), + (122, 68, 55), (128, 67, 55), (135, 66, 55), (149, 66, 52), + (164, 61, 49), (192, 62, 36), (204, 68, 37), (217, 75, 39), + (224, 90, 43), (231, 105, 47), (233, 112, 47), (235, 119, 48), + (229, 135, 40), (213, 136, 39), (197, 138, 39), (179, 144, 51), + (162, 150, 63), (153, 152, 71), (145, 154, 80), (133, 157, 86), + (125, 156, 92), (88, 141, 90), (67, 131, 84), (47, 122, 79), + (37, 117, 81), (27, 112, 84), (13, 107, 85), (13, 103, 87), + (11, 81, 83), (9, 73, 76), (7, 66, 70), (7, 69, 68), + (8, 73, 67), (7, 78, 72), (7, 83, 78), (19, 92, 91), + (39, 98, 103), (78, 96, 117), (99, 92, 116), (120, 89, 116), + (122, 88, 120), (125, 88, 124), (133, 91, 127), (140, 94, 128), + (147, 87, 118), (152, 79, 103), (157, 72, 88), (153, 68, 83), + (150, 64, 79), (141, 60, 73), (130, 63, 76), (113, 76, 79), + (106, 85, 90), (109, 106, 81), (116, 112, 76), (124, 118, 72), + (132, 118, 73), (141, 118, 74), (150, 125, 72), (159, 130, 90), + (190, 130, 112), (203, 119, 107), (216, 108, 103), (221, 98, 97), + (227, 88, 92), (231, 72, 73), (224, 59, 62), (221, 54, 59), + (216, 51, 62), (213, 53, 64), (213, 58, 66), (214, 64, 68), + (217, 75, 65), (216, 87, 63), (216, 95, 61), (215, 102, 62), + (211, 108, 54), (212, 112, 51), (213, 116, 48), (214, 120, 49), + (216, 124, 50), (215, 125, 52), (209, 123, 53), (197, 119, 50), + (186, 103, 43), (171, 76, 23), (172, 75, 19), (174, 75, 15), + (180, 78, 10), (185, 84, 12), (167, 91, 14), (154, 89, 19), + (128, 81, 22), (123, 74, 20), (119, 68, 19), (129, 67, 19), + (140, 67, 20), (131, 71, 19), (123, 69, 21), (105, 65, 22), + (87, 60, 20), (44, 40, 15), (45, 36, 12), (46, 33, 10), + (47, 32, 8), (47, 29, 9), (42, 28, 8), (36, 30, 8), + (35, 40, 9), (37, 44, 7), (39, 49, 6), (51, 60, 8), + (65, 66, 9), (82, 69, 8), (95, 72, 9), (108, 73, 13), + (120, 68, 16), (133, 67, 12), (135, 66, 12), (137, 66, 12), + (138, 66, 12), (136, 68, 13), (129, 74, 18), (119, 77, 25), + (97, 82, 26), (91, 83, 26), (86, 84, 27), (73, 93, 26), + (58, 106, 24), (46, 122, 28), (32, 133, 37), (24, 147, 49), + (16, 156, 56), (12, 158, 59), (12, 154, 59), (10, 148, 51), + (12, 145, 46), (9, 134, 41), (8, 126, 40), (6, 116, 42), + (9, 86, 45), (10, 77, 43), (12, 68, 41), (19, 54, 33), + (26, 40, 24), (33, 28, 14), (37, 18, 7), (41, 12, 5), + (44, 8, 5), (44, 7, 4), (46, 5, 4), (48, 5, 4), + (50, 4, 4), (50, 2, 2), (49, 2, 0), (48, 1, 1), + (47, 2, 0), (49, 3, 2), (53, 3, 1), (57, 3, 2), + (62, 3, 2), (71, 2, 2), (79, 2, 2), (88, 2, 3), + (96, 3, 4), (107, 4, 3), (117, 4, 3), (124, 4, 4), + (131, 4, 4), (136, 5, 2), (140, 7, 3), (142, 8, 3), + (144, 9, 3), (146, 10, 3), (146, 10, 4), (144, 11, 7), + (141, 10, 7), (136, 12, 9), (131, 12, 10), (124, 12, 10), + (115, 12, 8), (107, 10, 6), (100, 11, 7), (94, 11, 7), + (86, 11, 9), (79, 10, 10), (72, 9, 11), (64, 9, 10), + (56, 8, 6), (49, 8, 7), (43, 11, 9), (37, 13, 11), + (33, 15, 12), (30, 17, 12), (30, 18, 12), (32, 20, 11), + (40, 21, 11), (55, 25, 19), (75, 29, 28), (93, 38, 39), + (105, 51, 57), (112, 67, 74), (108, 86, 87), (110, 102, 100), + (116, 119, 113), (137, 123, 121), (160, 128, 122), (183, 132, 127), + (203, 134, 130), (200, 139, 124), (196, 138, 122), (177, 140, 120) + ), + +// 473 040225 +((174, 52, 5), (173, 60, 7), (171, 58, 6), (169, 56, 5), + (155, 51, 5), (142, 47, 5), (136, 46, 5), (130, 45, 5), + (112, 44, 6), (113, 47, 9), (115, 50, 12), (113, 53, 18), + (112, 57, 24), (106, 55, 28), (101, 53, 32), (98, 51, 30), + (95, 49, 29), (99, 46, 28), (106, 49, 30), (113, 52, 32), + (118, 49, 31), (124, 47, 31), (124, 43, 28), (124, 39, 25), + (119, 22, 13), (116, 19, 10), (113, 17, 8), (110, 17, 8), + (107, 18, 9), (107, 19, 8), (107, 20, 8), (112, 18, 8), + (116, 16, 6), (124, 7, 2), (128, 6, 1), (133, 6, 0), + (147, 12, 1), (161, 19, 2), (170, 23, 3), (179, 28, 4), + (209, 46, 7), (214, 52, 9), (219, 58, 11), (214, 60, 10), + (210, 62, 10), (208, 65, 10), (206, 68, 10), (204, 79, 12), + (197, 84, 13), (190, 91, 17), (185, 85, 17), (180, 79, 17), + (176, 76, 16), (172, 73, 16), (174, 76, 17), (176, 79, 18), + (176, 86, 22), (179, 85, 25), (183, 84, 29), (179, 83, 32), + (176, 82, 36), (170, 80, 35), (165, 78, 34), (158, 72, 32), + (153, 69, 30), (160, 65, 32), (162, 65, 32), (164, 66, 33), + (165, 64, 32), (166, 63, 32), (172, 63, 30), (180, 65, 28), + (184, 90, 34), (185, 109, 45), (187, 128, 56), (195, 145, 71), + (203, 162, 87), (200, 169, 90), (197, 176, 93), (187, 192, 97), + (181, 196, 98), (173, 191, 98), (179, 178, 96), (186, 166, 94), + (186, 162, 88), (187, 158, 83), (189, 145, 73), (181, 129, 55), + (195, 99, 40), (203, 89, 35), (211, 79, 30), (212, 79, 29), + (214, 79, 28), (217, 81, 28), (221, 86, 31), (224, 94, 35), + (229, 102, 41), (237, 110, 45), (241, 112, 45), (246, 115, 45), + (246, 116, 44), (247, 117, 43), (249, 120, 42), (248, 121, 39), + (226, 114, 32), (214, 106, 29), (202, 98, 26), (197, 96, 27), + (193, 94, 28), (188, 93, 29), (181, 95, 29), (171, 97, 28), + (163, 99, 26), (144, 103, 30), (143, 105, 32), (143, 107, 35), + (152, 112, 40), (164, 119, 45), (177, 125, 47), (188, 131, 47), + (197, 136, 52), (205, 134, 53), (213, 133, 54), (216, 130, 54), + (220, 128, 54), (226, 125, 53), (229, 120, 56), (224, 117, 52), + (218, 108, 47), (208, 89, 34), (205, 85, 31), (202, 82, 28), + (196, 73, 24), (189, 67, 20), (182, 62, 16), (177, 58, 13), + (181, 54, 5), (186, 53, 5), (191, 52, 5), (194, 53, 5), + (198, 55, 6), (200, 59, 8), (203, 67, 9), (211, 76, 10), + (219, 84, 12), (236, 92, 19), (237, 93, 22), (239, 95, 25), + (230, 106, 34), (222, 118, 40), (215, 128, 43), (204, 131, 41), + (177, 113, 34), (166, 107, 34), (156, 102, 35), (134, 96, 37), + (118, 90, 36), (106, 88, 33), (99, 89, 29), (96, 83, 24), + (94, 83, 25), (91, 101, 40), (93, 108, 47), (95, 116, 54), + (106, 135, 64), (115, 150, 73), (127, 169, 79), (139, 182, 85), + (161, 186, 96), (166, 184, 96), (171, 183, 97), (174, 168, 92), + (175, 155, 85), (177, 138, 71), (175, 115, 58), (179, 92, 47), + (185, 71, 37), (188, 50, 28), (188, 36, 22), (187, 27, 13), + (181, 19, 7), (176, 12, 4), (175, 8, 2), (175, 4, 2), + (176, 1, 1), (176, 0, 1), (176, 0, 1), (175, 0, 0), + (175, 1, 1), (176, 3, 1), (176, 6, 1), (177, 10, 1), + (179, 14, 1), (181, 18, 2), (182, 23, 4), (186, 29, 8), + (191, 36, 11), (196, 43, 15), (200, 49, 17), (203, 52, 19), + (203, 52, 19), (204, 53, 21), (207, 54, 23), (208, 55, 24), + (211, 58, 24), (212, 58, 23), (209, 55, 19), (204, 50, 14), + (201, 46, 12), (196, 40, 10), (193, 38, 7), (190, 38, 5), + (185, 38, 4), (174, 36, 3), (163, 35, 3), (154, 35, 6), + (145, 32, 8), (142, 30, 7), (144, 32, 7), (145, 32, 8), + (148, 35, 7), (153, 43, 11), (157, 50, 16), (163, 54, 18), + (175, 58, 19), (185, 60, 18), (196, 58, 14), (205, 57, 11), + (210, 57, 11), (216, 61, 12), (221, 64, 13), (222, 67, 12), + (224, 69, 10), (224, 66, 7), (217, 61, 4), (210, 56, 2), + (203, 52, 1), (194, 47, 2), (186, 45, 2), (180, 43, 2), + (171, 39, 1), (162, 33, 2), (159, 28, 0), (154, 21, 1), + (150, 15, 1), (148, 12, 1), (147, 12, 1), (146, 14, 2), + (153, 18, 1), (164, 24, 1), (175, 30, 1), (184, 33, 2), + (190, 37, 2), (188, 40, 2), (183, 42, 3), (177, 47, 5) + ), + +// 474 040226 +((49, 78, 48), (42, 93, 55), (38, 103, 59), (34, 113, 63), + (29, 114, 64), (25, 115, 65), (23, 114, 63), (22, 114, 61), + (23, 109, 56), (21, 100, 51), (20, 92, 47), (15, 81, 38), + (10, 71, 30), (13, 61, 26), (16, 52, 22), (21, 49, 21), + (26, 46, 21), (57, 41, 18), (78, 42, 18), (99, 44, 19), + (108, 46, 21), (118, 48, 23), (118, 48, 24), (119, 49, 25), + (120, 57, 27), (110, 56, 27), (101, 55, 27), (83, 49, 25), + (66, 43, 24), (60, 41, 23), (54, 40, 23), (45, 38, 25), + (38, 38, 26), (34, 45, 29), (34, 52, 34), (35, 60, 39), + (34, 69, 42), (34, 79, 46), (32, 82, 47), (31, 85, 49), + (28, 87, 53), (32, 86, 53), (36, 85, 54), (38, 83, 51), + (41, 82, 48), (41, 81, 47), (42, 80, 46), (53, 74, 49), + (69, 72, 51), (108, 80, 53), (120, 87, 52), (132, 94, 52), + (135, 94, 49), (139, 95, 46), (138, 92, 45), (137, 90, 44), + (117, 76, 34), (100, 73, 29), (84, 70, 25), (63, 63, 21), + (42, 56, 17), (34, 50, 15), (26, 45, 13), (16, 37, 13), + (11, 36, 12), (5, 42, 15), (3, 42, 15), (2, 42, 15), + (2, 40, 15), (3, 38, 15), (5, 32, 14), (7, 30, 15), + (11, 29, 16), (14, 26, 16), (18, 23, 16), (21, 19, 15), + (25, 15, 14), (27, 14, 13), (29, 14, 13), (33, 15, 14), + (40, 18, 15), (59, 22, 15), (62, 22, 14), (66, 23, 13), + (65, 24, 13), (65, 25, 14), (66, 28, 15), (69, 33, 18), + (64, 47, 22), (54, 49, 23), (45, 51, 25), (42, 50, 27), + (40, 50, 30), (36, 52, 32), (34, 53, 32), (32, 53, 32), + (30, 50, 27), (31, 38, 21), (35, 32, 17), (39, 27, 13), + (42, 24, 11), (45, 22, 9), (51, 19, 7), (56, 19, 4), + (70, 18, 2), (73, 16, 1), (77, 14, 1), (76, 13, 0), + (75, 13, 0), (70, 14, 1), (66, 14, 1), (62, 11, 1), + (57, 10, 2), (38, 6, 1), (33, 6, 1), (29, 6, 2), + (22, 6, 4), (20, 7, 5), (17, 9, 5), (14, 9, 3), + (8, 11, 4), (10, 13, 7), (13, 16, 10), (16, 17, 10), + (19, 18, 11), (28, 21, 10), (40, 24, 9), (56, 28, 10), + (78, 32, 10), (114, 42, 10), (118, 43, 10), (123, 44, 10), + (125, 46, 12), (123, 45, 11), (123, 44, 13), (118, 43, 11), + (105, 45, 16), (107, 51, 28), (109, 58, 41), (113, 69, 48), + (117, 80, 55), (117, 103, 76), (135, 121, 95), (151, 132, 101), + (178, 134, 109), (214, 160, 100), (221, 168, 102), (228, 177, 104), + (229, 190, 106), (234, 193, 111), (245, 183, 102), (243, 178, 87), + (245, 163, 62), (246, 163, 63), (247, 163, 64), (243, 159, 68), + (236, 157, 74), (229, 138, 70), (227, 118, 57), (228, 96, 43), + (227, 84, 32), (218, 81, 26), (215, 82, 25), (213, 83, 24), + (216, 78, 21), (218, 80, 20), (218, 84, 21), (210, 93, 27), + (175, 95, 31), (165, 92, 32), (156, 90, 34), (144, 81, 33), + (130, 79, 38), (107, 75, 38), (87, 66, 36), (65, 54, 35), + (56, 42, 28), (55, 33, 24), (58, 30, 20), (63, 29, 15), + (67, 30, 16), (75, 33, 14), (84, 35, 14), (92, 39, 13), + (102, 39, 13), (102, 39, 13), (103, 39, 14), (102, 38, 15), + (101, 39, 16), (99, 37, 17), (100, 35, 15), (102, 34, 13), + (104, 33, 13), (115, 40, 13), (130, 50, 14), (146, 62, 12), + (166, 73, 10), (179, 81, 13), (193, 86, 19), (205, 91, 26), + (210, 100, 31), (208, 101, 33), (191, 112, 42), (171, 118, 52), + (155, 118, 63), (140, 127, 68), (134, 120, 67), (124, 131, 72), + (106, 146, 80), (86, 158, 90), (70, 175, 97), (65, 172, 95), + (70, 169, 91), (70, 161, 86), (59, 153, 81), (45, 141, 77), + (31, 125, 69), (24, 106, 62), (23, 84, 51), (19, 65, 39), + (16, 47, 27), (14, 31, 16), (14, 20, 10), (14, 11, 7), + (11, 6, 6), (10, 5, 5), (8, 6, 5), (9, 7, 6), + (10, 11, 5), (11, 17, 7), (12, 24, 7), (14, 32, 10), + (16, 40, 13), (20, 51, 19), (26, 60, 24), (29, 70, 28), + (38, 79, 32), (47, 82, 34), (57, 85, 39), (68, 83, 44), + (72, 80, 47), (78, 78, 48), (87, 76, 45), (98, 72, 44), + (110, 71, 45), (120, 66, 45), (125, 63, 44), (125, 64, 40), + (124, 60, 37), (119, 61, 38), (116, 60, 39), (114, 57, 40), + (111, 57, 40), (100, 63, 41), (83, 67, 44), (65, 72, 45) + ), + +// 475 040227 +((180, 72, 104), (178, 67, 104), (177, 66, 100), (177, 66, 97), + (187, 60, 96), (197, 55, 95), (201, 54, 94), (205, 54, 94), + (211, 65, 90), (204, 81, 87), (198, 97, 85), (184, 119, 86), + (171, 141, 88), (151, 154, 98), (131, 168, 108), (124, 165, 110), + (118, 163, 113), (102, 138, 125), (84, 130, 136), (67, 122, 147), + (61, 99, 163), (56, 76, 179), (63, 62, 185), (71, 48, 191), + (84, 45, 208), (79, 62, 209), (74, 80, 211), (71, 98, 205), + (68, 117, 199), (68, 124, 196), (68, 132, 194), (60, 131, 195), + (56, 133, 187), (32, 123, 169), (29, 110, 167), (26, 97, 165), + (40, 76, 161), (54, 55, 157), (63, 50, 153), (72, 46, 149), + (103, 64, 132), (107, 84, 122), (111, 105, 113), (107, 123, 117), + (104, 142, 121), (105, 149, 127), (106, 157, 133), (104, 175, 139), + (100, 196, 149), (77, 213, 177), (81, 204, 194), (85, 195, 211), + (102, 191, 217), (119, 188, 223), (125, 189, 224), (132, 191, 226), + (146, 197, 228), (149, 193, 224), (153, 189, 220), (168, 176, 212), + (183, 164, 205), (184, 159, 200), (186, 155, 195), (179, 142, 189), + (171, 129, 180), (170, 97, 155), (174, 75, 146), (179, 54, 137), + (177, 44, 136), (176, 34, 136), (175, 25, 140), (178, 24, 134), + (186, 19, 109), (189, 12, 99), (192, 6, 89), (200, 6, 84), + (209, 7, 80), (212, 7, 75), (215, 8, 70), (205, 9, 57), + (192, 6, 51), (179, 5, 55), (179, 5, 69), (179, 6, 83), + (175, 6, 91), (172, 6, 99), (166, 13, 109), (168, 21, 121), + (167, 44, 157), (159, 52, 173), (151, 60, 190), (145, 61, 193), + (140, 63, 196), (144, 69, 196), (146, 77, 191), (151, 82, 183), + (152, 96, 190), (136, 100, 199), (128, 107, 196), (121, 115, 193), + (120, 123, 193), (119, 131, 194), (118, 146, 203), (115, 143, 207), + (89, 139, 214), (88, 141, 201), (87, 143, 188), (94, 139, 176), + (101, 136, 164), (111, 132, 133), (113, 128, 118), (112, 122, 103), + (123, 120, 83), (163, 120, 41), (171, 120, 39), (179, 121, 38), + (180, 125, 42), (181, 124, 49), (190, 122, 58), (203, 119, 66), + (233, 96, 102), (230, 86, 111), (227, 76, 121), (226, 74, 121), + (225, 72, 122), (226, 66, 124), (231, 50, 128), (228, 35, 128), + (226, 21, 130), (225, 17, 126), (228, 18, 125), (231, 19, 125), + (233, 23, 120), (233, 23, 124), (230, 25, 127), (228, 31, 130), + (229, 53, 139), (227, 78, 153), (226, 104, 168), (222, 113, 169), + (219, 123, 171), (214, 130, 170), (209, 123, 160), (212, 122, 162), + (213, 121, 167), (202, 108, 152), (192, 97, 139), (182, 87, 127), + (165, 61, 104), (155, 42, 87), (141, 29, 74), (137, 26, 65), + (121, 41, 59), (116, 45, 60), (112, 50, 62), (93, 53, 68), + (90, 57, 70), (93, 64, 73), (106, 64, 72), (121, 64, 70), + (122, 57, 72), (135, 50, 71), (142, 45, 69), (150, 41, 67), + (166, 36, 63), (170, 27, 58), (171, 22, 55), (171, 28, 62), + (185, 35, 85), (187, 35, 90), (189, 36, 96), (186, 40, 100), + (177, 51, 104), (177, 64, 109), (184, 73, 117), (199, 78, 130), + (211, 80, 141), (212, 84, 147), (216, 88, 152), (219, 89, 154), + (228, 86, 155), (241, 78, 152), (245, 70, 143), (247, 59, 135), + (240, 44, 120), (238, 41, 114), (237, 39, 109), (236, 34, 93), + (230, 32, 81), (220, 36, 72), (206, 35, 70), (188, 39, 70), + (174, 35, 62), (164, 31, 54), (157, 31, 47), (157, 29, 46), + (161, 33, 57), (166, 34, 68), (171, 32, 77), (174, 32, 92), + (184, 33, 105), (201, 42, 123), (215, 56, 136), (221, 76, 140), + (212, 96, 145), (197, 115, 156), (185, 134, 172), (174, 154, 183), + (160, 174, 173), (141, 190, 153), (127, 194, 133), (116, 195, 127), + (118, 184, 135), (123, 166, 135), (122, 148, 138), (125, 120, 131), + (123, 101, 127), (126, 80, 133), (136, 59, 134), (140, 44, 141), + (142, 31, 146), (133, 28, 145), (125, 31, 142), (127, 39, 129), + (136, 60, 114), (151, 89, 102), (154, 118, 88), (153, 139, 79), + (137, 151, 71), (127, 165, 67), (123, 184, 67), (123, 196, 69), + (138, 196, 70), (135, 184, 74), (127, 162, 77), (115, 148, 80), + (107, 127, 81), (120, 104, 73), (141, 84, 64), (159, 74, 53), + (165, 79, 50), (165, 84, 54), (163, 84, 59), (164, 75, 66), + (169, 68, 72), (170, 69, 78), (174, 74, 84), (181, 79, 92), + (188, 74, 99), (197, 61, 106), (203, 51, 110), (202, 44, 109), + (203, 47, 105), (188, 60, 101), (184, 68, 98), (185, 75, 98) + ), + +// 476 040228 +((20, 32, 20), (21, 27, 20), (20, 25, 20), (20, 23, 20), + (20, 23, 20), (21, 23, 20), (20, 22, 20), (20, 22, 20), + (20, 22, 20), (20, 22, 20), (20, 22, 20), (20, 22, 20), + (20, 22, 20), (20, 22, 20), (20, 22, 20), (20, 21, 20), + (20, 21, 20), (22, 20, 20), (22, 20, 20), (23, 21, 20), + (22, 21, 20), (22, 22, 20), (22, 22, 20), (22, 23, 21), + (21, 25, 25), (20, 26, 28), (20, 28, 31), (21, 34, 41), + (22, 40, 52), (23, 43, 59), (25, 47, 66), (27, 56, 81), + (29, 67, 94), (33, 89, 114), (34, 88, 112), (35, 87, 111), + (31, 79, 100), (28, 72, 89), (28, 68, 81), (29, 64, 73), + (24, 39, 45), (22, 31, 37), (20, 23, 30), (20, 21, 27), + (20, 20, 25), (20, 20, 24), (20, 20, 24), (20, 20, 24), + (20, 20, 24), (20, 20, 24), (20, 20, 24), (20, 20, 25), + (20, 20, 24), (21, 20, 23), (21, 20, 22), (21, 21, 22), + (21, 24, 21), (21, 26, 20), (21, 29, 20), (20, 29, 21), + (20, 29, 23), (20, 29, 26), (20, 29, 30), (20, 29, 43), + (20, 27, 63), (24, 39, 83), (30, 41, 87), (36, 43, 92), + (37, 45, 90), (39, 47, 88), (52, 55, 80), (67, 75, 72), + (93, 111, 83), (109, 132, 97), (125, 153, 111), (128, 173, 137), + (131, 194, 164), (124, 192, 170), (118, 191, 177), (106, 188, 185), + (95, 183, 176), (80, 179, 189), (84, 174, 179), (89, 169, 169), + (100, 173, 165), (112, 177, 161), (140, 178, 150), (174, 173, 123), + (212, 156, 90), (200, 140, 68), (188, 124, 46), (176, 114, 36), + (164, 104, 26), (140, 89, 23), (116, 82, 26), (101, 90, 29), + (87, 94, 32), (100, 114, 58), (128, 134, 71), (157, 154, 84), + (165, 156, 85), (173, 159, 87), (169, 161, 100), (169, 169, 108), + (162, 157, 102), (154, 150, 89), (147, 143, 76), (144, 138, 71), + (142, 133, 66), (134, 123, 65), (133, 125, 67), (139, 128, 70), + (133, 129, 68), (131, 153, 113), (144, 162, 132), (158, 172, 152), + (173, 189, 172), (173, 201, 188), (177, 216, 191), (175, 210, 199), + (141, 161, 184), (115, 133, 155), (89, 105, 126), (70, 89, 110), + (52, 74, 94), (26, 44, 74), (20, 30, 55), (21, 21, 43), + (22, 21, 35), (23, 21, 29), (23, 21, 28), (24, 21, 28), + (24, 22, 28), (24, 22, 30), (24, 22, 30), (23, 21, 30), + (21, 21, 29), (20, 20, 30), (20, 20, 32), (21, 20, 34), + (23, 21, 37), (31, 27, 41), (48, 35, 42), (76, 45, 43), + (102, 46, 44), (116, 51, 40), (120, 51, 39), (124, 52, 39), + (146, 48, 32), (174, 51, 31), (181, 52, 30), (177, 59, 29), + (184, 79, 29), (185, 83, 38), (187, 88, 47), (181, 100, 59), + (173, 110, 64), (153, 116, 66), (121, 109, 74), (91, 96, 77), + (71, 81, 72), (48, 60, 58), (42, 54, 53), (37, 48, 48), + (29, 36, 36), (25, 27, 28), (23, 23, 26), (22, 21, 25), + (22, 21, 24), (22, 21, 24), (22, 22, 24), (22, 22, 25), + (21, 24, 25), (20, 25, 24), (20, 26, 24), (20, 28, 25), + (20, 28, 26), (20, 30, 27), (20, 29, 32), (20, 31, 37), + (25, 37, 43), (34, 48, 47), (46, 56, 57), (55, 64, 64), + (71, 83, 83), (70, 87, 87), (69, 92, 91), (64, 99, 97), + (63, 104, 99), (66, 101, 99), (65, 97, 89), (68, 97, 82), + (71, 103, 69), (83, 98, 58), (90, 87, 43), (93, 76, 35), + (89, 74, 28), (83, 68, 24), (75, 59, 22), (67, 45, 23), + (65, 37, 23), (81, 36, 22), (106, 41, 22), (133, 44, 22), + (152, 48, 21), (170, 52, 20), (171, 51, 20), (161, 46, 20), + (140, 47, 20), (124, 48, 21), (94, 40, 22), (62, 28, 24), + (34, 21, 26), (25, 21, 30), (22, 20, 36), (22, 23, 46), + (22, 38, 57), (21, 53, 64), (20, 56, 66), (22, 47, 69), + (22, 47, 70), (22, 56, 70), (20, 58, 60), (21, 45, 52), + (22, 30, 43), (22, 23, 37), (22, 22, 29), (23, 22, 25), + (25, 23, 23), (31, 24, 22), (40, 24, 21), (59, 27, 20), + (87, 41, 20), (122, 62, 20), (149, 84, 31), (173, 110, 49), + (197, 142, 76), (219, 174, 96), (234, 194, 112), (243, 216, 125), + (247, 233, 128), (244, 237, 127), (235, 224, 115), (216, 203, 109), + (200, 191, 93), (183, 175, 84), (170, 158, 71), (137, 131, 67), + (102, 115, 67), (75, 100, 72), (62, 89, 69), (49, 74, 58), + (36, 64, 47), (29, 55, 39), (24, 45, 31), (22, 37, 24) + ), + +// 477 10000 +((52, 44, 62), (50, 38, 55), (43, 38, 52), (36, 39, 50), + (30, 38, 48), (25, 37, 47), (23, 35, 44), (22, 34, 42), + (23, 21, 32), (28, 14, 26), (33, 7, 20), (36, 7, 21), + (40, 7, 23), (39, 12, 25), (38, 17, 28), (37, 19, 31), + (37, 21, 34), (44, 22, 37), (52, 23, 40), (61, 24, 43), + (69, 31, 46), (77, 39, 49), (78, 46, 52), (80, 53, 56), + (93, 76, 68), (106, 82, 71), (120, 88, 75), (132, 91, 74), + (144, 94, 74), (147, 97, 75), (150, 100, 76), (155, 105, 79), + (158, 110, 81), (160, 111, 87), (156, 107, 85), (152, 103, 83), + (140, 97, 78), (128, 91, 74), (120, 86, 72), (113, 82, 70), + (83, 70, 68), (74, 65, 66), (65, 60, 65), (61, 54, 61), + (58, 49, 57), (57, 47, 55), (57, 45, 54), (57, 43, 53), + (57, 42, 53), (56, 38, 54), (55, 33, 50), (55, 28, 46), + (54, 23, 41), (53, 19, 37), (53, 17, 35), (53, 16, 34), + (52, 19, 38), (51, 23, 40), (51, 27, 43), (53, 33, 48), + (55, 40, 53), (55, 42, 56), (56, 45, 60), (58, 53, 68), + (58, 61, 76), (60, 75, 93), (70, 83, 97), (81, 92, 101), + (87, 96, 104), (94, 101, 107), (115, 113, 113), (126, 122, 119), + (127, 126, 122), (122, 122, 116), (117, 119, 110), (116, 117, 105), + (115, 116, 100), (116, 117, 100), (117, 119, 101), (118, 120, 101), + (114, 119, 103), (101, 110, 103), (88, 103, 100), (75, 96, 97), + (71, 95, 97), (67, 95, 98), (63, 94, 100), (66, 95, 100), + (88, 109, 104), (100, 115, 106), (113, 122, 109), (119, 128, 112), + (125, 134, 116), (135, 144, 127), (149, 154, 136), (163, 166, 145), + (177, 177, 149), (201, 185, 146), (204, 185, 145), (207, 185, 144), + (205, 181, 143), (203, 177, 142), (197, 172, 145), (190, 167, 147), + (179, 158, 140), (172, 153, 134), (166, 148, 129), (162, 142, 125), + (159, 137, 122), (151, 128, 112), (141, 115, 107), (132, 103, 99), + (121, 92, 90), (102, 80, 77), (99, 77, 76), (96, 75, 76), + (91, 72, 68), (81, 65, 62), (73, 54, 54), (63, 42, 43), + (40, 18, 18), (31, 10, 12), (22, 3, 6), (18, 2, 4), + (15, 1, 2), (11, 0, 1), (10, 0, 1), (8, 0, 2), + (9, 2, 3), (9, 9, 9), (8, 11, 11), (8, 14, 13), + (7, 19, 18), (7, 23, 23), (5, 27, 27), (5, 29, 31), + (10, 34, 33), (13, 34, 34), (16, 35, 35), (18, 35, 35), + (21, 35, 35), (25, 35, 36), (29, 33, 37), (32, 35, 38), + (37, 37, 38), (40, 42, 43), (40, 43, 44), (41, 45, 46), + (44, 49, 51), (48, 50, 56), (52, 55, 65), (58, 63, 73), + (62, 80, 92), (61, 84, 96), (60, 88, 101), (57, 95, 108), + (54, 97, 113), (56, 95, 114), (63, 92, 114), (71, 87, 111), + (78, 81, 106), (88, 70, 97), (87, 68, 95), (86, 66, 93), + (86, 59, 86), (87, 53, 80), (89, 48, 72), (90, 41, 63), + (88, 27, 43), (85, 25, 40), (82, 24, 38), (74, 22, 35), + (65, 22, 34), (59, 26, 36), (53, 31, 40), (48, 37, 44), + (44, 40, 45), (39, 44, 45), (34, 43, 44), (29, 39, 42), + (26, 37, 39), (25, 34, 40), (26, 35, 43), (32, 35, 46), + (44, 35, 51), (46, 33, 50), (49, 31, 50), (52, 25, 45), + (50, 19, 39), (49, 14, 33), (48, 9, 30), (52, 6, 27), + (53, 8, 27), (54, 11, 29), (54, 15, 33), (51, 20, 38), + (47, 28, 43), (43, 36, 51), (45, 46, 62), (50, 57, 72), + (58, 69, 80), (66, 77, 85), (76, 81, 89), (86, 84, 90), + (90, 84, 91), (95, 83, 93), (99, 84, 97), (106, 86, 101), + (111, 89, 103), (117, 89, 101), (123, 87, 96), (126, 84, 89), + (125, 78, 80), (120, 71, 72), (117, 64, 67), (110, 60, 65), + (104, 57, 63), (102, 56, 62), (102, 57, 63), (102, 58, 64), + (100, 61, 65), (99, 62, 63), (98, 62, 60), (94, 58, 56), + (90, 53, 51), (88, 48, 47), (86, 44, 45), (84, 41, 46), + (81, 40, 48), (81, 43, 48), (76, 47, 51), (71, 52, 54), + (66, 54, 55), (61, 58, 58), (55, 59, 63), (51, 59, 68), + (49, 58, 70), (44, 60, 73), (41, 64, 76), (39, 66, 78), + (36, 72, 82), (32, 76, 86), (28, 78, 88), (27, 76, 88), + (24, 72, 84), (26, 66, 79), (29, 57, 72), (34, 50, 66), + (40, 45, 64), (46, 43, 62), (51, 44, 64), (51, 48, 66), + (51, 51, 69), (50, 52, 70), (51, 50, 69), (51, 48, 66) + ), + +// 478 Apophysis-040208-115d +((0, 0, 0), (3, 0, 5), (1, 0, 12), (0, 1, 19), + (2, 5, 26), (4, 9, 33), (6, 12, 36), (9, 16, 40), + (15, 23, 54), (17, 26, 61), (20, 30, 68), (22, 33, 74), + (24, 37, 81), (25, 37, 88), (26, 37, 95), (26, 38, 99), + (27, 39, 104), (31, 41, 120), (32, 43, 127), (34, 45, 134), + (35, 45, 138), (36, 45, 142), (36, 43, 142), (36, 41, 142), + (34, 35, 142), (35, 35, 142), (37, 36, 142), (38, 37, 142), + (40, 39, 142), (41, 40, 142), (43, 42, 142), (42, 41, 142), + (38, 37, 142), (36, 33, 142), (34, 30, 140), (33, 28, 138), + (32, 26, 134), (31, 24, 131), (31, 23, 129), (31, 23, 127), + (31, 22, 120), (31, 21, 115), (32, 20, 110), (27, 17, 105), + (23, 15, 101), (22, 14, 98), (22, 14, 95), (23, 13, 88), + (23, 13, 82), (20, 10, 67), (18, 8, 58), (17, 7, 50), + (15, 5, 43), (14, 3, 36), (14, 2, 34), (14, 2, 32), + (12, 0, 22), (11, 0, 18), (10, 0, 15), (9, 0, 13), + (8, 0, 12), (7, 0, 11), (7, 0, 11), (7, 0, 10), + (7, 0, 11), (5, 2, 18), (13, 11, 23), (22, 20, 29), + (26, 24, 32), (30, 29, 36), (39, 38, 41), (48, 48, 48), + (57, 57, 57), (62, 62, 62), (68, 68, 68), (72, 71, 74), + (76, 74, 81), (75, 73, 83), (75, 72, 85), (77, 73, 92), + (80, 74, 98), (82, 77, 113), (83, 78, 120), (85, 80, 127), + (86, 81, 130), (88, 83, 134), (92, 90, 141), (99, 97, 142), + (112, 109, 142), (115, 112, 142), (118, 116, 142), (116, 115, 142), + (115, 114, 142), (114, 114, 142), (110, 110, 142), (104, 105, 142), + (98, 101, 142), (82, 87, 132), (71, 76, 127), (60, 66, 123), + (54, 60, 120), (49, 54, 118), (41, 48, 117), (34, 43, 116), + (30, 44, 115), (30, 48, 114), (31, 53, 113), (31, 53, 113), + (31, 54, 113), (31, 56, 115), (33, 59, 115), (33, 59, 113), + (32, 58, 111), (32, 56, 101), (32, 56, 99), (33, 57, 97), + (31, 51, 90), (28, 47, 85), (24, 42, 80), (20, 36, 73), + (15, 28, 64), (18, 29, 62), (21, 31, 60), (23, 32, 60), + (26, 34, 60), (33, 41, 64), (43, 50, 69), (52, 58, 76), + (60, 67, 83), (76, 81, 92), (79, 82, 93), (82, 84, 94), + (87, 89, 94), (90, 90, 92), (89, 89, 89), (88, 88, 88), + (87, 87, 87), (86, 86, 86), (85, 85, 85), (85, 85, 85), + (85, 85, 85), (81, 81, 81), (80, 80, 80), (80, 80, 80), + (81, 81, 81), (90, 90, 90), (93, 93, 93), (97, 97, 97), + (103, 103, 103), (104, 106, 106), (104, 109, 111), (107, 113, 116), + (110, 121, 128), (110, 123, 131), (110, 125, 134), (110, 127, 137), + (110, 129, 141), (109, 130, 142), (108, 129, 142), (107, 129, 142), + (104, 126, 142), (95, 118, 142), (93, 116, 142), (92, 115, 142), + (90, 112, 142), (87, 107, 142), (86, 106, 142), (86, 105, 142), + (87, 103, 142), (87, 103, 142), (87, 103, 142), (90, 106, 142), + (92, 107, 142), (95, 109, 141), (98, 110, 138), (99, 109, 134), + (100, 107, 127), (101, 106, 122), (99, 102, 116), (99, 100, 111), + (96, 97, 106), (93, 93, 104), (89, 89, 101), (87, 87, 99), + (78, 77, 92), (76, 74, 91), (74, 72, 90), (68, 66, 89), + (64, 61, 89), (61, 56, 89), (56, 51, 89), (53, 48, 89), + (51, 45, 89), (48, 44, 89), (49, 43, 89), (46, 41, 89), + (46, 41, 89), (44, 40, 92), (40, 36, 97), (37, 34, 101), + (32, 33, 105), (30, 31, 110), (25, 28, 113), (20, 23, 116), + (18, 23, 121), (14, 21, 126), (13, 22, 130), (15, 27, 134), + (16, 30, 139), (17, 31, 142), (17, 31, 142), (17, 29, 142), + (17, 29, 142), (17, 29, 142), (17, 25, 142), (17, 23, 142), + (17, 23, 142), (17, 23, 142), (17, 23, 142), (17, 25, 142), + (17, 27, 141), (15, 25, 136), (13, 22, 128), (10, 21, 121), + (8, 18, 113), (5, 14, 104), (2, 12, 95), (0, 9, 85), + (0, 11, 76), (0, 8, 67), (0, 9, 60), (0, 7, 51), + (0, 5, 43), (0, 3, 34), (0, 0, 27), (0, 0, 18), + (3, 0, 10), (2, 0, 3), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0) + ), + +// 479 Apophysis-040208-115e +((0, 0, 0), (5, 1, 0), (12, 0, 3), (19, 0, 7), + (26, 2, 13), (33, 4, 19), (36, 6, 22), (40, 9, 26), + (54, 15, 36), (61, 17, 41), (68, 20, 46), (74, 22, 51), + (81, 24, 56), (88, 25, 58), (95, 26, 60), (99, 26, 62), + (104, 27, 65), (120, 31, 71), (127, 32, 75), (134, 34, 79), + (138, 35, 79), (142, 36, 80), (142, 36, 78), (142, 36, 76), + (142, 34, 72), (142, 35, 70), (142, 36, 69), (142, 37, 70), + (142, 39, 71), (142, 40, 72), (142, 42, 73), (142, 41, 73), + (142, 37, 70), (142, 33, 65), (140, 30, 62), (138, 28, 59), + (134, 26, 55), (131, 24, 52), (129, 23, 50), (127, 23, 49), + (120, 22, 45), (115, 21, 41), (110, 20, 38), (105, 17, 36), + (101, 15, 35), (98, 14, 34), (95, 14, 33), (88, 13, 28), + (82, 13, 25), (67, 10, 18), (58, 8, 14), (50, 7, 10), + (43, 5, 6), (36, 3, 3), (34, 3, 2), (32, 4, 2), + (22, 5, 0), (18, 5, 0), (15, 5, 0), (13, 4, 0), + (12, 4, 0), (11, 4, 0), (11, 4, 0), (10, 3, 0), + (11, 4, 0), (18, 2, 4), (23, 11, 12), (29, 20, 20), + (32, 24, 24), (36, 29, 29), (41, 38, 38), (48, 48, 48), + (57, 57, 57), (62, 62, 62), (68, 68, 68), (74, 71, 71), + (81, 74, 74), (83, 73, 73), (85, 72, 73), (92, 73, 75), + (98, 74, 76), (113, 77, 83), (120, 78, 87), (127, 80, 91), + (130, 81, 93), (134, 83, 95), (141, 90, 104), (142, 97, 110), + (142, 109, 117), (142, 112, 119), (142, 116, 122), (142, 115, 122), + (142, 114, 122), (142, 114, 123), (142, 110, 121), (142, 104, 118), + (142, 98, 116), (132, 82, 104), (127, 71, 95), (123, 60, 87), + (120, 54, 82), (118, 49, 78), (117, 41, 74), (116, 34, 71), + (115, 30, 72), (114, 30, 76), (113, 31, 80), (113, 31, 80), + (113, 31, 81), (115, 31, 84), (115, 33, 86), (113, 33, 86), + (111, 32, 84), (101, 32, 79), (99, 32, 79), (97, 33, 79), + (90, 31, 71), (85, 28, 66), (80, 24, 61), (73, 20, 53), + (64, 15, 44), (62, 18, 44), (60, 21, 44), (60, 23, 44), + (60, 26, 45), (64, 33, 51), (69, 43, 59), (76, 52, 66), + (83, 60, 74), (92, 76, 86), (93, 79, 87), (94, 82, 88), + (94, 87, 91), (92, 90, 91), (89, 89, 89), (88, 88, 88), + (87, 87, 87), (86, 86, 86), (85, 85, 85), (85, 85, 85), + (85, 85, 85), (81, 81, 81), (80, 80, 80), (80, 80, 80), + (81, 81, 81), (90, 90, 90), (93, 93, 93), (97, 97, 97), + (103, 103, 103), (106, 104, 106), (110, 104, 111), (116, 107, 116), + (128, 110, 127), (131, 110, 130), (134, 110, 133), (137, 110, 136), + (141, 110, 139), (142, 109, 141), (142, 108, 140), (142, 107, 140), + (142, 104, 139), (142, 95, 133), (142, 93, 132), (142, 92, 132), + (142, 90, 129), (142, 87, 125), (142, 86, 125), (142, 86, 123), + (142, 87, 122), (142, 87, 122), (142, 87, 122), (142, 90, 123), + (142, 92, 124), (141, 95, 124), (138, 98, 123), (134, 99, 121), + (127, 100, 116), (122, 101, 113), (116, 99, 108), (111, 99, 105), + (106, 96, 100), (104, 93, 97), (101, 89, 93), (99, 87, 90), + (92, 77, 80), (91, 74, 77), (90, 72, 75), (89, 66, 72), + (89, 61, 66), (89, 56, 62), (89, 51, 58), (89, 48, 56), + (89, 45, 54), (89, 44, 54), (89, 43, 52), (89, 41, 51), + (89, 41, 51), (92, 40, 53), (97, 36, 52), (101, 34, 53), + (105, 32, 57), (110, 30, 58), (113, 25, 57), (116, 20, 55), + (121, 18, 57), (126, 14, 59), (130, 13, 61), (134, 15, 66), + (139, 16, 71), (142, 17, 73), (142, 17, 73), (142, 17, 71), + (142, 17, 71), (142, 17, 71), (142, 17, 67), (142, 17, 65), + (142, 17, 65), (142, 17, 65), (142, 17, 65), (142, 17, 67), + (141, 17, 68), (136, 15, 65), (128, 13, 61), (121, 10, 58), + (113, 8, 53), (104, 5, 48), (95, 2, 44), (85, 0, 38), + (76, 0, 36), (67, 0, 31), (60, 0, 29), (51, 0, 24), + (43, 0, 19), (34, 0, 14), (27, 0, 9), (18, 0, 6), + (10, 0, 0), (3, 1, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0) + ), + +// 480 Apophysis-040208-115g +((0, 0, 0), (5, 3, 0), (12, 1, 0), (19, 0, 1), + (26, 0, 3), (33, 0, 5), (36, 0, 7), (40, 1, 9), + (54, 5, 14), (61, 6, 16), (68, 7, 19), (74, 8, 21), + (81, 9, 24), (88, 8, 22), (95, 8, 21), (99, 8, 21), + (104, 8, 22), (120, 9, 20), (127, 9, 21), (134, 9, 22), + (138, 9, 20), (142, 10, 19), (142, 10, 16), (142, 10, 14), + (142, 8, 8), (142, 11, 9), (142, 14, 10), (142, 15, 11), + (142, 17, 13), (142, 18, 14), (142, 20, 16), (142, 19, 15), + (142, 15, 11), (142, 13, 7), (140, 12, 5), (138, 11, 3), + (134, 11, 1), (131, 11, 0), (129, 11, 0), (127, 12, 0), + (120, 13, 0), (115, 14, 0), (110, 16, 0), (105, 13, 0), + (101, 11, 0), (98, 10, 0), (95, 10, 0), (88, 12, 0), + (82, 13, 0), (67, 12, 0), (58, 12, 0), (50, 12, 0), + (43, 12, 0), (36, 12, 0), (34, 12, 0), (32, 12, 0), + (22, 12, 0), (18, 11, 0), (15, 10, 0), (13, 9, 0), + (12, 8, 0), (11, 7, 0), (11, 7, 0), (10, 7, 0), + (11, 7, 0), (18, 3, 0), (23, 10, 7), (29, 18, 14), + (32, 22, 18), (36, 26, 22), (41, 34, 30), (48, 39, 39), + (57, 46, 46), (62, 50, 50), (68, 55, 55), (74, 60, 57), + (81, 65, 59), (83, 64, 57), (85, 63, 56), (92, 66, 56), + (98, 67, 56), (113, 66, 56), (120, 65, 56), (127, 64, 57), + (130, 65, 58), (134, 67, 59), (141, 69, 64), (142, 76, 71), + (142, 90, 83), (142, 93, 86), (142, 96, 90), (142, 94, 89), + (142, 92, 88), (142, 90, 88), (142, 84, 84), (142, 78, 80), + (142, 72, 75), (132, 58, 64), (127, 48, 54), (123, 38, 44), + (120, 32, 38), (118, 27, 33), (117, 20, 27), (116, 13, 23), + (115, 9, 24), (114, 9, 29), (113, 10, 35), (113, 10, 36), + (113, 10, 38), (115, 10, 40), (115, 12, 42), (113, 12, 42), + (111, 12, 43), (101, 13, 43), (99, 14, 43), (97, 15, 44), + (90, 14, 39), (85, 12, 35), (80, 9, 31), (73, 6, 25), + (64, 3, 18), (62, 6, 19), (60, 10, 21), (60, 12, 22), + (60, 15, 24), (64, 21, 31), (69, 30, 41), (76, 38, 46), + (83, 45, 55), (92, 59, 67), (93, 62, 68), (94, 65, 70), + (94, 70, 77), (92, 73, 73), (89, 73, 73), (88, 72, 72), + (87, 71, 71), (86, 70, 70), (85, 69, 69), (85, 69, 69), + (85, 69, 69), (81, 66, 66), (80, 65, 65), (80, 65, 65), + (81, 66, 66), (90, 74, 74), (93, 76, 76), (97, 79, 79), + (103, 84, 84), (106, 85, 95), (111, 84, 103), (116, 86, 103), + (128, 87, 112), (131, 86, 114), (134, 86, 116), (137, 85, 118), + (141, 84, 119), (142, 83, 119), (142, 82, 117), (142, 81, 118), + (142, 78, 115), (142, 69, 103), (142, 67, 101), (142, 66, 100), + (142, 64, 96), (142, 61, 89), (142, 60, 89), (142, 60, 86), + (142, 61, 83), (142, 61, 83), (142, 61, 83), (142, 64, 87), + (142, 66, 87), (141, 69, 90), (138, 73, 91), (134, 75, 92), + (127, 77, 90), (122, 79, 89), (116, 78, 85), (111, 79, 82), + (106, 77, 80), (104, 74, 74), (101, 71, 71), (99, 69, 69), + (92, 64, 60), (91, 62, 58), (90, 61, 56), (89, 53, 50), + (89, 51, 45), (89, 47, 40), (89, 43, 35), (89, 40, 32), + (89, 37, 29), (89, 34, 28), (89, 36, 27), (89, 33, 25), + (89, 33, 25), (92, 30, 23), (97, 25, 18), (101, 20, 15), + (105, 13, 13), (110, 10, 10), (113, 4, 5), (116, 0, 1), + (121, 0, 3), (126, 0, 5), (130, 0, 7), (134, 0, 11), + (139, 0, 13), (142, 0, 13), (142, 0, 13), (142, 0, 11), + (142, 0, 11), (142, 0, 11), (142, 0, 6), (142, 0, 4), + (142, 0, 4), (142, 0, 4), (142, 0, 4), (142, 0, 6), + (141, 0, 9), (136, 0, 9), (128, 0, 7), (121, 0, 9), + (113, 0, 8), (104, 0, 8), (95, 0, 9), (85, 0, 8), + (76, 0, 10), (67, 0, 7), (60, 0, 8), (51, 0, 6), + (43, 0, 4), (34, 0, 2), (27, 0, 0), (18, 0, 0), + (10, 3, 0), (3, 2, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0) + ), + +// 481 Apophysis-040208-115h +((0, 0, 0), (5, 5, 0), (12, 5, 0), (19, 6, 0), + (26, 7, 0), (33, 8, 0), (36, 8, 0), (40, 8, 1), + (54, 15, 5), (61, 17, 6), (68, 19, 7), (74, 21, 8), + (81, 23, 9), (88, 26, 8), (95, 29, 8), (99, 30, 8), + (104, 32, 8), (120, 42, 9), (127, 44, 9), (134, 46, 9), + (138, 50, 9), (142, 54, 10), (142, 56, 10), (142, 58, 10), + (142, 61, 8), (142, 64, 9), (142, 67, 10), (142, 68, 11), + (142, 69, 13), (142, 69, 14), (142, 70, 16), (142, 70, 15), + (142, 68, 11), (142, 68, 7), (140, 67, 5), (138, 66, 3), + (134, 64, 1), (131, 63, 0), (129, 63, 0), (127, 63, 0), + (120, 60, 0), (115, 60, 0), (110, 60, 0), (105, 56, 0), + (101, 52, 0), (98, 49, 0), (95, 47, 0), (88, 47, 0), + (82, 46, 0), (67, 39, 0), (58, 35, 0), (50, 31, 0), + (43, 28, 0), (36, 26, 0), (34, 25, 0), (32, 24, 0), + (22, 20, 0), (18, 17, 0), (14, 15, 0), (12, 13, 0), + (11, 12, 0), (10, 11, 0), (10, 11, 0), (9, 10, 0), + (10, 11, 0), (18, 10, 0), (23, 17, 7), (29, 24, 14), + (32, 27, 18), (36, 31, 22), (41, 38, 30), (48, 42, 39), + (57, 50, 46), (62, 55, 50), (68, 60, 55), (74, 66, 57), + (81, 73, 59), (83, 73, 57), (85, 74, 56), (92, 80, 56), + (98, 84, 56), (113, 89, 56), (120, 90, 56), (127, 92, 57), + (130, 94, 58), (134, 96, 59), (141, 100, 64), (142, 104, 71), + (142, 113, 83), (142, 115, 86), (142, 117, 90), (142, 115, 89), + (142, 113, 88), (142, 111, 88), (142, 107, 84), (142, 101, 78), + (142, 96, 72), (132, 81, 58), (127, 73, 48), (123, 66, 38), + (120, 61, 32), (118, 57, 27), (117, 52, 20), (116, 44, 13), + (115, 37, 9), (114, 31, 9), (113, 25, 10), (113, 24, 10), + (113, 23, 10), (115, 22, 10), (115, 24, 12), (113, 22, 12), + (111, 20, 12), (101, 18, 13), (99, 18, 14), (97, 19, 15), + (90, 19, 14), (85, 18, 12), (80, 14, 9), (73, 13, 6), + (64, 12, 3), (62, 15, 6), (60, 19, 10), (60, 21, 12), + (60, 24, 15), (64, 28, 21), (69, 34, 30), (76, 45, 38), + (83, 50, 45), (92, 64, 59), (93, 68, 62), (94, 72, 65), + (94, 72, 70), (92, 80, 73), (89, 79, 73), (88, 78, 72), + (87, 77, 71), (86, 76, 70), (85, 75, 69), (85, 75, 69), + (85, 75, 69), (81, 72, 66), (80, 71, 65), (80, 71, 65), + (81, 72, 66), (90, 80, 74), (93, 83, 76), (97, 86, 79), + (103, 91, 84), (106, 85, 87), (111, 84, 92), (116, 86, 91), + (128, 87, 96), (131, 86, 96), (134, 86, 97), (137, 85, 97), + (141, 84, 96), (142, 83, 96), (142, 82, 93), (142, 81, 93), + (142, 78, 90), (142, 69, 74), (142, 67, 72), (142, 66, 70), + (142, 64, 65), (142, 65, 61), (142, 64, 60), (142, 67, 60), + (142, 72, 61), (142, 72, 61), (142, 72, 61), (142, 72, 64), + (142, 75, 66), (141, 76, 69), (138, 80, 73), (134, 82, 75), + (127, 83, 77), (122, 86, 79), (116, 86, 78), (111, 88, 79), + (106, 86, 77), (104, 86, 74), (101, 83, 71), (99, 81, 69), + (92, 77, 60), (91, 75, 58), (90, 74, 56), (89, 69, 50), + (89, 68, 45), (89, 67, 40), (89, 64, 35), (89, 62, 32), + (89, 61, 29), (89, 58, 28), (89, 61, 27), (89, 59, 25), + (89, 59, 25), (92, 57, 23), (97, 56, 18), (101, 53, 15), + (105, 49, 13), (110, 50, 10), (113, 45, 4), (116, 44, 0), + (121, 46, 0), (126, 46, 0), (130, 45, 0), (134, 42, 0), + (139, 41, 0), (142, 45, 0), (142, 45, 0), (142, 45, 0), + (142, 45, 0), (142, 45, 0), (142, 49, 0), (142, 52, 0), + (142, 52, 0), (142, 52, 0), (142, 52, 0), (142, 49, 0), + (141, 47, 0), (136, 45, 0), (128, 44, 0), (121, 40, 0), + (113, 37, 0), (104, 33, 0), (95, 28, 0), (85, 25, 0), + (76, 20, 0), (67, 20, 0), (60, 16, 0), (51, 14, 0), + (43, 12, 0), (34, 11, 0), (27, 10, 0), (18, 7, 0), + (10, 7, 0), (2, 3, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0) + ), + +// 482 Apophysis-040208-115i +((0, 0, 0), (3, 5, 0), (11, 9, 0), (19, 13, 0), + (26, 16, 0), (33, 19, 0), (36, 20, 0), (40, 22, 1), + (54, 32, 5), (61, 36, 6), (68, 40, 7), (74, 43, 8), + (81, 47, 9), (88, 53, 8), (95, 60, 8), (99, 62, 8), + (104, 65, 8), (120, 81, 9), (127, 85, 9), (134, 90, 9), + (138, 95, 9), (142, 100, 10), (142, 102, 10), (142, 105, 10), + (142, 108, 8), (142, 110, 9), (142, 113, 10), (142, 113, 11), + (142, 114, 13), (142, 114, 14), (142, 115, 16), (142, 114, 15), + (142, 114, 11), (142, 115, 7), (140, 114, 5), (138, 113, 3), + (134, 111, 1), (131, 109, 0), (129, 108, 0), (127, 108, 0), + (120, 102, 0), (115, 100, 0), (110, 99, 0), (105, 93, 0), + (101, 87, 0), (98, 84, 0), (95, 81, 0), (88, 78, 0), + (82, 75, 0), (67, 62, 0), (58, 55, 0), (50, 49, 0), + (41, 42, 0), (33, 36, 0), (30, 34, 0), (27, 32, 0), + (15, 22, 0), (11, 18, 0), (8, 15, 0), (7, 13, 0), + (7, 12, 0), (6, 11, 0), (6, 11, 0), (5, 10, 0), + (6, 11, 0), (18, 16, 0), (23, 22, 7), (28, 29, 14), + (31, 32, 18), (35, 36, 22), (39, 41, 30), (48, 45, 39), + (57, 54, 46), (62, 59, 50), (68, 65, 55), (74, 73, 57), + (80, 81, 59), (82, 82, 57), (85, 84, 56), (91, 92, 56), + (97, 98, 56), (113, 109, 56), (120, 112, 56), (127, 116, 57), + (130, 119, 58), (134, 123, 59), (141, 127, 64), (142, 129, 71), + (142, 134, 83), (142, 134, 86), (142, 135, 90), (142, 133, 89), + (142, 132, 88), (142, 130, 88), (142, 127, 84), (142, 124, 78), + (142, 121, 72), (132, 107, 58), (127, 101, 48), (123, 96, 38), + (120, 92, 32), (118, 89, 27), (117, 86, 20), (116, 80, 13), + (115, 74, 9), (114, 67, 9), (113, 61, 10), (113, 60, 10), + (113, 60, 10), (115, 59, 10), (115, 60, 12), (113, 57, 12), + (111, 55, 12), (101, 49, 13), (99, 48, 14), (97, 47, 15), + (90, 45, 14), (85, 43, 12), (80, 39, 9), (73, 37, 6), + (64, 33, 3), (62, 34, 6), (60, 36, 10), (60, 37, 12), + (60, 39, 15), (64, 43, 21), (69, 48, 30), (76, 58, 38), + (83, 63, 45), (92, 75, 59), (93, 78, 62), (94, 82, 65), + (94, 81, 70), (92, 87, 73), (89, 85, 73), (88, 84, 72), + (87, 83, 71), (86, 82, 70), (85, 81, 69), (85, 81, 69), + (85, 81, 69), (81, 77, 66), (80, 76, 65), (80, 76, 65), + (81, 77, 66), (90, 86, 74), (93, 89, 76), (97, 92, 79), + (103, 98, 84), (106, 90, 85), (111, 85, 84), (116, 91, 86), + (128, 92, 87), (131, 92, 86), (134, 92, 86), (137, 91, 85), + (141, 91, 84), (142, 91, 83), (142, 92, 82), (142, 90, 81), + (142, 89, 78), (142, 90, 69), (142, 89, 67), (142, 89, 66), + (142, 90, 64), (142, 93, 61), (142, 93, 60), (142, 95, 60), + (142, 100, 61), (142, 100, 61), (142, 100, 61), (142, 99, 64), + (142, 101, 66), (141, 103, 69), (138, 103, 73), (134, 102, 75), + (127, 101, 77), (122, 101, 79), (116, 99, 78), (111, 100, 79), + (106, 96, 77), (104, 96, 74), (101, 93, 71), (99, 91, 69), + (92, 88, 60), (91, 87, 58), (90, 86, 56), (89, 82, 50), + (89, 84, 45), (89, 84, 40), (89, 83, 35), (89, 82, 32), + (89, 82, 29), (89, 80, 28), (89, 83, 27), (89, 81, 25), + (89, 81, 25), (92, 81, 23), (97, 84, 18), (101, 84, 15), + (105, 82, 13), (110, 85, 10), (113, 84, 4), (116, 85, 0), + (121, 89, 0), (126, 90, 0), (130, 91, 0), (134, 89, 0), + (139, 90, 0), (142, 95, 0), (142, 95, 0), (142, 95, 0), + (142, 95, 0), (142, 95, 0), (142, 99, 0), (142, 102, 0), + (142, 102, 0), (142, 102, 0), (142, 102, 0), (142, 99, 0), + (141, 96, 0), (136, 93, 0), (128, 89, 0), (121, 83, 0), + (113, 77, 0), (104, 69, 0), (95, 61, 0), (85, 55, 0), + (76, 47, 0), (67, 43, 0), (60, 37, 0), (51, 32, 0), + (43, 28, 0), (34, 23, 0), (27, 20, 0), (18, 13, 0), + (9, 10, 0), (1, 3, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0) + ), + +// 483 Apophysis-040208-115j +((0, 0, 0), (0, 5, 1), (3, 12, 0), (7, 19, 0), + (11, 26, 0), (16, 33, 0), (18, 36, 0), (21, 40, 1), + (30, 54, 5), (34, 61, 6), (39, 68, 7), (43, 74, 8), + (47, 81, 9), (48, 88, 8), (50, 95, 8), (52, 99, 8), + (54, 104, 8), (57, 120, 9), (60, 127, 9), (63, 134, 9), + (63, 138, 9), (63, 142, 10), (60, 142, 10), (58, 142, 10), + (52, 142, 8), (50, 142, 9), (49, 142, 10), (50, 142, 11), + (51, 142, 13), (52, 142, 14), (54, 142, 16), (53, 142, 15), + (50, 142, 11), (45, 142, 7), (42, 140, 5), (39, 138, 3), + (35, 134, 1), (32, 131, 0), (30, 129, 0), (29, 127, 0), + (28, 120, 0), (24, 115, 0), (20, 110, 0), (20, 105, 0), + (21, 101, 0), (21, 98, 0), (22, 95, 0), (17, 88, 0), + (13, 82, 0), (10, 67, 0), (7, 58, 0), (5, 50, 0), + (2, 43, 0), (0, 36, 0), (0, 34, 0), (0, 32, 1), + (0, 22, 4), (0, 18, 4), (0, 15, 5), (0, 13, 4), + (0, 12, 4), (0, 11, 3), (0, 11, 3), (0, 10, 3), + (0, 11, 3), (3, 18, 0), (9, 23, 7), (15, 29, 14), + (18, 32, 18), (22, 36, 22), (30, 41, 30), (42, 48, 39), + (49, 57, 46), (54, 62, 50), (59, 68, 55), (59, 74, 57), + (60, 81, 59), (59, 83, 57), (59, 85, 56), (58, 92, 56), + (59, 98, 56), (64, 113, 56), (68, 120, 56), (73, 127, 57), + (74, 130, 58), (76, 134, 59), (84, 141, 64), (90, 142, 71), + (96, 142, 83), (98, 142, 86), (101, 142, 90), (101, 142, 89), + (102, 142, 88), (104, 142, 88), (103, 142, 84), (101, 142, 78), + (99, 142, 72), (89, 132, 58), (80, 127, 48), (72, 123, 38), + (67, 120, 32), (63, 118, 27), (59, 117, 20), (57, 116, 13), + (58, 115, 9), (64, 114, 9), (70, 113, 10), (71, 113, 10), + (72, 113, 10), (75, 115, 10), (75, 115, 12), (76, 113, 12), + (76, 111, 12), (71, 101, 13), (71, 99, 14), (71, 97, 15), + (64, 90, 14), (59, 85, 12), (55, 80, 9), (47, 73, 6), + (38, 64, 3), (37, 62, 6), (37, 60, 10), (38, 60, 12), + (39, 60, 15), (45, 64, 21), (54, 69, 30), (59, 76, 38), + (68, 83, 45), (78, 92, 59), (78, 93, 62), (79, 94, 65), + (85, 94, 70), (79, 92, 73), (78, 89, 73), (77, 88, 72), + (76, 87, 71), (75, 86, 70), (74, 85, 69), (74, 85, 69), + (74, 85, 69), (71, 81, 66), (70, 80, 65), (70, 80, 65), + (71, 81, 66), (79, 90, 74), (82, 93, 76), (85, 97, 79), + (90, 103, 84), (102, 106, 85), (111, 110, 84), (113, 116, 86), + (126, 128, 87), (129, 131, 86), (132, 134, 86), (135, 137, 85), + (138, 141, 84), (139, 142, 83), (137, 142, 82), (138, 142, 81), + (137, 142, 78), (127, 142, 69), (126, 142, 67), (126, 142, 66), + (122, 142, 64), (116, 142, 61), (116, 142, 60), (113, 142, 60), + (110, 142, 61), (110, 142, 61), (110, 142, 61), (113, 142, 64), + (113, 142, 66), (115, 141, 69), (113, 138, 73), (111, 134, 75), + (107, 127, 77), (103, 122, 79), (98, 116, 78), (93, 111, 79), + (89, 106, 77), (84, 104, 74), (81, 101, 71), (79, 99, 69), + (66, 92, 60), (64, 91, 58), (62, 90, 56), (59, 89, 50), + (54, 89, 45), (49, 89, 40), (45, 89, 35), (43, 89, 32), + (41, 89, 29), (42, 89, 28), (38, 89, 27), (37, 89, 25), + (37, 89, 25), (39, 92, 23), (37, 97, 18), (39, 101, 15), + (43, 105, 13), (43, 110, 10), (42, 113, 4), (40, 116, 0), + (42, 121, 0), (46, 126, 0), (50, 130, 0), (56, 134, 0), + (60, 139, 0), (59, 142, 0), (59, 142, 0), (59, 142, 0), + (59, 142, 0), (59, 142, 0), (54, 142, 0), (52, 142, 0), + (52, 142, 0), (52, 142, 0), (52, 142, 0), (54, 142, 0), + (56, 141, 0), (54, 136, 0), (49, 128, 0), (48, 121, 0), + (45, 113, 0), (43, 104, 0), (41, 95, 0), (36, 85, 0), + (35, 76, 0), (29, 67, 0), (28, 60, 0), (23, 51, 0), + (18, 43, 0), (13, 34, 0), (9, 27, 0), (6, 18, 0), + (0, 10, 0), (0, 3, 1), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0) + ), + +// 484 Apophysis-040208-115k +((81, 81, 81), (81, 81, 81), (78, 78, 78), (75, 75, 75), + (72, 72, 72), (70, 70, 70), (67, 67, 67), (65, 65, 65), + (51, 51, 51), (44, 44, 44), (38, 38, 38), (33, 33, 33), + (28, 28, 28), (23, 23, 23), (19, 19, 19), (19, 19, 19), + (19, 19, 19), (12, 12, 12), (6, 6, 6), (1, 1, 1), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (1, 1, 1), (6, 6, 6), (12, 12, 12), (18, 18, 18), + (24, 24, 24), (24, 24, 24), (24, 24, 24), (22, 22, 22), + (19, 19, 19), (14, 14, 14), (8, 8, 8), (3, 3, 3), + (1, 1, 1), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (2, 2, 2), (5, 5, 5), (8, 8, 8), + (12, 12, 12), (13, 13, 13), (14, 14, 14), (12, 12, 12), + (12, 12, 12), (12, 12, 12), (10, 10, 10), (8, 8, 8), + (11, 11, 11), (14, 14, 14), (16, 16, 16), (19, 19, 19), + (33, 33, 33), (35, 35, 35), (38, 38, 38), (39, 39, 39), + (40, 40, 40), (40, 40, 40), (40, 40, 40), (38, 38, 38), + (38, 38, 38), (38, 38, 38), (39, 39, 39), (40, 40, 40), + (40, 40, 40), (40, 40, 40), (40, 40, 40), (40, 40, 40), + (38, 38, 38), (33, 33, 33), (28, 28, 28), (22, 22, 22), + (17, 17, 17), (14, 14, 14), (12, 12, 12), (12, 12, 12), + (8, 8, 8), (8, 8, 8), (13, 13, 13), (19, 19, 19), + (20, 20, 20), (22, 22, 22), (28, 28, 28), (30, 30, 30), + (35, 35, 35), (35, 35, 35), (35, 35, 35), (35, 35, 35), + (35, 35, 35), (35, 35, 35), (35, 35, 35), (38, 38, 38), + (40, 40, 40), (56, 56, 56), (64, 64, 64), (72, 72, 72), + (76, 76, 76), (81, 81, 81), (84, 84, 84), (86, 86, 86), + (89, 89, 89), (89, 89, 89), (89, 89, 89), (89, 89, 89), + (89, 89, 89), (89, 89, 89), (91, 91, 91), (97, 97, 97), + (102, 102, 102), (118, 118, 118), (122, 122, 122), (126, 126, 126), + (132, 132, 132), (137, 137, 137), (142, 142, 142), (146, 146, 146), + (156, 156, 156), (160, 160, 160), (164, 164, 164), (166, 166, 166), + (169, 169, 169), (172, 172, 172), (180, 180, 180), (185, 185, 185), + (190, 190, 190), (199, 199, 199), (200, 200, 200), (201, 201, 201), + (206, 206, 206), (209, 209, 209), (206, 206, 206), (201, 201, 201), + (190, 190, 190), (185, 185, 185), (180, 180, 180), (176, 176, 176), + (172, 172, 172), (169, 169, 169), (169, 169, 169), (169, 169, 169), + (169, 169, 169), (164, 164, 164), (161, 161, 161), (158, 158, 158), + (156, 156, 156), (148, 148, 148), (146, 146, 146), (139, 139, 139), + (132, 132, 132), (129, 129, 129), (126, 126, 126), (121, 121, 121), + (118, 118, 118), (113, 113, 113), (111, 111, 111), (113, 113, 113), + (118, 118, 118), (116, 116, 116), (113, 113, 113), (111, 111, 111), + (111, 111, 111), (105, 105, 105), (97, 97, 97), (91, 91, 91), + (84, 84, 84), (84, 84, 84), (84, 84, 84), (84, 84, 84), + (84, 84, 84), (86, 86, 86), (89, 89, 89), (89, 89, 89), + (89, 89, 89), (86, 86, 86), (84, 84, 84), (86, 86, 86), + (86, 86, 86), (84, 84, 84), (84, 84, 84), (81, 81, 81), + (75, 75, 75), (75, 75, 75), (75, 75, 75), (79, 79, 79), + (79, 79, 79), (79, 79, 79), (81, 81, 81), (81, 81, 81), + (79, 79, 79), (79, 79, 79), (75, 75, 75), (72, 72, 72), + (72, 72, 72), (70, 70, 70), (65, 65, 65), (65, 65, 65), + (63, 63, 63), (65, 65, 65), (67, 67, 67), (72, 72, 72), + (72, 72, 72), (79, 79, 79), (81, 81, 81), (81, 81, 81), + (81, 81, 81), (81, 81, 81), (81, 81, 81), (75, 75, 75), + (72, 72, 72), (72, 72, 72), (75, 75, 75), (79, 79, 79), + (81, 81, 81), (84, 84, 84), (86, 86, 86), (89, 89, 89), + (89, 89, 89), (89, 89, 89), (89, 89, 89), (89, 89, 89), + (91, 91, 91), (91, 91, 91), (89, 89, 89), (86, 86, 86), + (86, 86, 86), (84, 84, 84), (81, 81, 81), (72, 72, 72), + (67, 67, 67), (65, 65, 65), (59, 59, 59), (56, 56, 56), + (59, 59, 59), (65, 65, 65), (70, 70, 70), (72, 72, 72), + (81, 81, 81), (89, 89, 89), (97, 97, 97), (102, 102, 102), + (102, 102, 102), (105, 105, 105), (105, 105, 105), (102, 102, 102), + (97, 97, 97), (95, 95, 95), (95, 95, 95), (95, 95, 95), + (91, 91, 91), (89, 89, 89), (81, 81, 81), (81, 81, 81) + ), + +// 485 A_Bit_Confused +((219, 140, 152), (243, 165, 171), (237, 167, 192), (232, 169, 213), + (213, 157, 212), (194, 146, 212), (184, 134, 199), (175, 122, 187), + (131, 84, 156), (111, 64, 145), (91, 44, 135), (78, 37, 115), + (66, 30, 96), (54, 35, 90), (42, 40, 84), (39, 42, 86), + (36, 44, 89), (39, 60, 127), (53, 70, 136), (68, 80, 145), + (88, 88, 136), (108, 97, 127), (117, 99, 126), (127, 101, 126), + (171, 102, 108), (184, 89, 87), (197, 77, 67), (192, 76, 60), + (188, 76, 54), (180, 74, 52), (172, 72, 51), (156, 53, 55), + (136, 41, 55), (106, 31, 53), (100, 31, 50), (94, 31, 47), + (105, 24, 40), (116, 17, 34), (126, 15, 28), (136, 13, 23), + (172, 26, 16), (180, 31, 22), (188, 36, 28), (187, 43, 26), + (186, 51, 25), (186, 57, 28), (187, 63, 32), (187, 71, 48), + (189, 75, 73), (178, 92, 113), (181, 108, 131), (184, 124, 150), + (199, 125, 164), (215, 126, 179), (222, 124, 180), (230, 122, 181), + (243, 116, 191), (235, 110, 180), (228, 105, 170), (204, 103, 155), + (181, 102, 140), (176, 99, 140), (171, 96, 141), (167, 93, 138), + (174, 85, 140), (167, 84, 114), (172, 81, 104), (178, 79, 94), + (185, 77, 92), (193, 75, 90), (205, 57, 81), (205, 47, 70), + (201, 33, 55), (190, 35, 59), (179, 38, 64), (157, 39, 66), + (136, 40, 69), (128, 42, 69), (121, 44, 70), (118, 46, 73), + (116, 46, 73), (106, 39, 59), (98, 38, 58), (90, 37, 58), + (88, 36, 59), (86, 35, 61), (79, 34, 62), (74, 31, 59), + (56, 21, 69), (47, 19, 76), (39, 17, 84), (35, 16, 85), + (31, 16, 86), (25, 16, 84), (23, 15, 79), (23, 17, 72), + (27, 17, 68), (48, 19, 69), (68, 26, 73), (89, 34, 78), + (98, 42, 84), (108, 51, 91), (113, 65, 108), (112, 75, 130), + (110, 81, 154), (119, 85, 156), (129, 90, 159), (135, 93, 162), + (142, 97, 165), (150, 103, 160), (154, 101, 157), (158, 93, 140), + (170, 87, 136), (221, 85, 150), (232, 87, 157), (243, 90, 165), + (253, 94, 172), (254, 108, 182), (254, 117, 187), (254, 130, 182), + (224, 144, 161), (201, 145, 143), (179, 146, 125), (170, 144, 115), + (161, 142, 105), (147, 145, 93), (130, 153, 84), (119, 150, 83), + (117, 147, 76), (119, 110, 71), (117, 107, 72), (115, 104, 73), + (112, 96, 75), (119, 101, 66), (130, 96, 57), (138, 87, 46), + (125, 54, 37), (107, 47, 45), (90, 41, 53), (86, 44, 60), + (83, 47, 68), (77, 59, 78), (74, 62, 84), (70, 58, 93), + (54, 54, 95), (30, 65, 88), (25, 70, 82), (21, 76, 76), + (19, 82, 67), (14, 81, 56), (14, 76, 45), (14, 72, 33), + (27, 63, 20), (32, 60, 19), (37, 58, 18), (48, 57, 22), + (61, 52, 21), (81, 44, 28), (106, 42, 33), (134, 49, 40), + (157, 67, 54), (194, 109, 75), (202, 115, 81), (210, 121, 88), + (222, 137, 110), (221, 152, 137), (209, 173, 156), (194, 198, 174), + (180, 218, 197), (180, 214, 204), (180, 211, 212), (177, 210, 228), + (169, 217, 236), (174, 231, 232), (175, 231, 210), (176, 216, 194), + (181, 206, 190), (173, 196, 190), (176, 191, 188), (171, 172, 163), + (156, 141, 139), (141, 112, 124), (124, 98, 125), (121, 94, 135), + (122, 84, 135), (123, 81, 134), (124, 79, 133), (119, 83, 139), + (128, 88, 144), (130, 95, 147), (120, 98, 148), (112, 105, 143), + (93, 106, 141), (85, 101, 135), (87, 95, 124), (80, 81, 109), + (76, 72, 89), (70, 65, 76), (62, 61, 69), (65, 61, 66), + (71, 65, 63), (85, 70, 62), (110, 79, 66), (134, 95, 88), + (153, 112, 117), (157, 127, 138), (150, 131, 161), (140, 121, 169), + (131, 111, 185), (133, 112, 200), (129, 104, 199), (121, 99, 196), + (103, 81, 174), (76, 52, 154), (57, 43, 131), (50, 29, 104), + (51, 26, 80), (63, 28, 56), (66, 21, 38), (64, 22, 25), + (62, 18, 20), (57, 15, 20), (61, 15, 21), (60, 14, 22), + (55, 14, 25), (47, 16, 30), (38, 19, 41), (33, 30, 49), + (32, 37, 53), (29, 41, 53), (23, 41, 46), (17, 36, 45), + (13, 37, 40), (17, 37, 37), (21, 37, 35), (21, 33, 27), + (20, 27, 20), (25, 24, 11), (34, 27, 8), (49, 35, 5), + (65, 39, 8), (72, 43, 12), (89, 48, 13), (106, 54, 14), + (122, 62, 14), (139, 59, 12), (144, 52, 15), (149, 42, 18), + (156, 34, 18), (163, 34, 27), (170, 35, 32), (177, 39, 45), + (182, 50, 60), (187, 68, 76), (196, 93, 106), (207, 120, 131) + ), + +// 486 Afternoon_Shadows +((86, 73, 63), (76, 68, 62), (72, 65, 60), (68, 63, 58), + (62, 58, 54), (56, 53, 50), (49, 47, 46), (43, 41, 43), + (29, 32, 34), (25, 29, 29), (21, 26, 25), (17, 20, 19), + (13, 14, 13), (10, 10, 9), (8, 7, 6), (8, 6, 6), + (8, 6, 6), (11, 10, 11), (18, 18, 16), (26, 26, 21), + (37, 36, 29), (49, 47, 37), (55, 53, 41), (62, 60, 45), + (88, 82, 63), (97, 88, 70), (106, 94, 77), (114, 99, 77), + (122, 104, 78), (124, 104, 79), (126, 105, 80), (130, 106, 83), + (132, 109, 85), (133, 113, 89), (130, 110, 91), (127, 108, 93), + (119, 102, 88), (111, 96, 84), (106, 91, 81), (101, 86, 78), + (77, 64, 65), (65, 55, 59), (53, 47, 53), (46, 45, 53), + (40, 43, 53), (39, 46, 56), (39, 49, 59), (45, 58, 65), + (54, 69, 75), (80, 93, 98), (93, 105, 108), (107, 118, 119), + (117, 125, 125), (127, 133, 132), (132, 137, 136), (137, 142, 140), + (157, 160, 151), (168, 168, 156), (180, 176, 162), (191, 185, 169), + (203, 195, 176), (207, 198, 177), (212, 201, 179), (217, 204, 182), + (219, 204, 184), (216, 206, 182), (212, 202, 178), (208, 199, 174), + (204, 194, 171), (200, 190, 168), (192, 184, 162), (181, 176, 154), + (159, 156, 139), (151, 148, 132), (143, 141, 126), (140, 138, 122), + (138, 135, 118), (137, 132, 115), (136, 130, 113), (135, 126, 110), + (133, 124, 105), (120, 111, 95), (113, 102, 88), (106, 93, 81), + (104, 89, 77), (103, 85, 74), (105, 83, 68), (110, 83, 67), + (126, 94, 75), (135, 102, 82), (144, 111, 89), (145, 113, 92), + (147, 116, 95), (145, 116, 98), (139, 112, 97), (132, 106, 90), + (124, 98, 84), (109, 81, 71), (108, 81, 70), (108, 81, 70), + (108, 83, 72), (109, 85, 74), (112, 90, 81), (117, 96, 89), + (126, 107, 100), (128, 108, 101), (131, 110, 103), (132, 111, 102), + (133, 113, 102), (139, 119, 106), (145, 127, 113), (153, 137, 124), + (167, 150, 135), (196, 178, 158), (202, 184, 164), (208, 191, 170), + (218, 200, 179), (224, 207, 184), (228, 212, 187), (228, 211, 185), + (222, 204, 180), (216, 198, 175), (211, 192, 170), (208, 188, 168), + (206, 185, 167), (200, 178, 163), (192, 168, 157), (182, 160, 148), + (171, 147, 134), (149, 121, 108), (143, 115, 103), (137, 109, 98), + (124, 97, 86), (112, 84, 76), (101, 75, 69), (91, 64, 63), + (72, 53, 53), (65, 47, 48), (59, 41, 44), (57, 39, 43), + (56, 38, 42), (55, 37, 42), (55, 36, 41), (55, 36, 40), + (54, 35, 42), (45, 35, 43), (43, 33, 42), (41, 32, 41), + (39, 30, 39), (34, 27, 35), (34, 26, 36), (35, 26, 37), + (41, 30, 41), (42, 32, 42), (44, 34, 44), (47, 37, 45), + (49, 41, 47), (51, 44, 49), (51, 43, 48), (50, 41, 47), + (49, 38, 46), (46, 32, 42), (45, 31, 41), (45, 31, 41), + (43, 29, 39), (43, 29, 36), (42, 30, 36), (42, 30, 37), + (44, 31, 38), (43, 30, 37), (42, 29, 36), (40, 26, 35), + (37, 23, 33), (31, 19, 29), (27, 14, 23), (22, 12, 19), + (20, 11, 15), (19, 10, 13), (18, 9, 10), (17, 8, 8), + (17, 7, 7), (17, 7, 8), (17, 7, 7), (16, 6, 6), + (15, 7, 7), (15, 7, 7), (16, 8, 8), (17, 8, 9), + (17, 9, 8), (18, 8, 9), (17, 8, 10), (17, 10, 12), + (18, 13, 15), (21, 19, 20), (28, 28, 29), (38, 40, 39), + (50, 52, 50), (62, 65, 59), (76, 78, 69), (88, 89, 78), + (101, 100, 88), (115, 110, 95), (124, 121, 103), (136, 134, 113), + (149, 146, 125), (162, 159, 136), (175, 171, 147), (188, 183, 157), + (196, 190, 164), (200, 194, 168), (201, 190, 165), (193, 182, 157), + (181, 172, 147), (168, 161, 137), (155, 149, 127), (142, 137, 117), + (130, 126, 107), (118, 114, 99), (106, 104, 92), (94, 93, 84), + (82, 80, 73), (69, 67, 62), (56, 54, 51), (43, 41, 39), + (31, 29, 30), (23, 19, 20), (18, 13, 16), (19, 11, 16), + (25, 16, 21), (34, 22, 26), (46, 30, 32), (58, 38, 35), + (69, 47, 38), (76, 54, 41), (81, 62, 42), (86, 67, 42), + (91, 68, 43), (95, 70, 45), (97, 72, 47), (101, 75, 52), + (109, 77, 51), (115, 81, 51), (120, 81, 51), (121, 85, 52), + (119, 89, 52), (122, 92, 53), (127, 97, 56), (125, 97, 57), + (116, 91, 58), (110, 84, 59), (105, 81, 59), (104, 76, 61), + (100, 72, 61), (93, 71, 62), (84, 66, 60), (83, 69, 61) + ), + +// 487 Air +((87, 148, 201), (88, 148, 200), (88, 148, 200), (88, 148, 200), + (89, 149, 201), (91, 151, 203), (92, 153, 204), (94, 155, 205), + (117, 160, 206), (135, 162, 209), (153, 165, 213), (166, 173, 219), + (179, 181, 225), (190, 183, 225), (202, 185, 226), (202, 183, 226), + (202, 181, 226), (187, 183, 230), (177, 183, 229), (167, 184, 229), + (149, 177, 224), (131, 171, 219), (123, 169, 217), (116, 167, 215), + (102, 163, 212), (100, 162, 212), (99, 161, 212), (98, 160, 211), + (98, 160, 210), (98, 159, 209), (98, 159, 209), (98, 158, 209), + (107, 156, 206), (126, 140, 192), (122, 130, 180), (119, 120, 168), + (112, 110, 157), (105, 100, 146), (101, 95, 141), (98, 90, 136), + (82, 70, 118), (72, 69, 117), (63, 69, 117), (70, 73, 124), + (77, 77, 131), (83, 80, 135), (89, 84, 140), (88, 93, 147), + (94, 104, 159), (110, 126, 179), (114, 131, 184), (119, 136, 190), + (112, 138, 190), (105, 141, 190), (102, 138, 186), (100, 135, 182), + (90, 115, 161), (81, 109, 156), (72, 104, 152), (74, 100, 148), + (76, 97, 145), (75, 95, 143), (74, 94, 141), (64, 93, 142), + (55, 95, 143), (49, 95, 147), (46, 91, 143), (44, 88, 139), + (41, 84, 134), (39, 81, 129), (34, 67, 112), (27, 54, 95), + (12, 30, 63), (8, 23, 54), (4, 16, 46), (3, 13, 40), + (3, 10, 34), (4, 12, 32), (6, 14, 30), (7, 22, 29), + (8, 30, 31), (9, 39, 47), (13, 50, 58), (17, 61, 69), + (20, 67, 75), (23, 74, 82), (32, 90, 95), (39, 93, 113), + (47, 105, 143), (52, 112, 154), (58, 119, 166), (60, 119, 168), + (63, 119, 170), (61, 115, 166), (55, 105, 153), (50, 94, 137), + (45, 82, 124), (34, 67, 109), (34, 63, 104), (35, 59, 99), + (43, 58, 99), (52, 58, 99), (66, 65, 104), (77, 77, 114), + (82, 109, 149), (95, 120, 164), (109, 131, 180), (114, 136, 182), + (120, 142, 185), (117, 150, 192), (107, 156, 196), (100, 157, 199), + (94, 154, 202), (89, 148, 197), (87, 146, 196), (86, 145, 195), + (84, 142, 192), (82, 139, 189), (79, 135, 186), (75, 131, 182), + (66, 118, 171), (60, 110, 163), (55, 102, 155), (52, 98, 151), + (50, 94, 148), (46, 91, 143), (43, 88, 142), (44, 89, 142), + (46, 90, 144), (51, 97, 150), (53, 100, 153), (55, 104, 156), + (61, 113, 164), (67, 122, 173), (72, 128, 178), (76, 132, 182), + (77, 134, 185), (77, 135, 186), (77, 136, 187), (78, 136, 187), + (79, 137, 188), (81, 138, 191), (83, 141, 193), (85, 144, 195), + (88, 147, 198), (94, 153, 203), (95, 154, 204), (96, 156, 205), + (95, 156, 206), (94, 154, 205), (91, 151, 201), (86, 144, 196), + (69, 121, 174), (63, 113, 166), (58, 105, 158), (48, 91, 141), + (39, 76, 124), (31, 62, 109), (22, 51, 96), (16, 41, 86), + (11, 36, 80), (13, 40, 82), (16, 45, 87), (20, 50, 93), + (29, 63, 108), (39, 79, 126), (48, 92, 140), (57, 106, 155), + (79, 135, 184), (84, 140, 189), (89, 146, 194), (102, 152, 199), + (118, 155, 202), (136, 156, 204), (152, 156, 207), (164, 158, 211), + (173, 160, 211), (184, 162, 212), (197, 163, 211), (195, 161, 212), + (191, 161, 214), (180, 163, 216), (165, 165, 216), (161, 168, 216), + (128, 164, 212), (120, 162, 210), (112, 160, 209), (97, 156, 206), + (84, 138, 180), (72, 119, 159), (60, 101, 140), (48, 85, 123), + (47, 87, 132), (40, 78, 119), (35, 70, 109), (30, 64, 103), + (27, 58, 96), (32, 67, 112), (35, 76, 124), (39, 82, 133), + (38, 85, 137), (38, 86, 137), (43, 85, 136), (55, 85, 136), + (72, 88, 140), (84, 92, 143), (92, 93, 144), (93, 92, 140), + (96, 86, 134), (100, 86, 126), (99, 86, 124), (97, 84, 123), + (87, 80, 117), (72, 67, 107), (56, 55, 85), (35, 42, 67), + (19, 29, 50), (8, 20, 38), (2, 10, 32), (1, 7, 26), + (0, 4, 25), (4, 4, 28), (6, 8, 33), (8, 13, 40), + (10, 18, 47), (7, 24, 56), (10, 25, 64), (11, 28, 72), + (12, 33, 79), (15, 39, 85), (13, 46, 91), (14, 49, 96), + (17, 53, 101), (22, 60, 109), (29, 69, 119), (37, 81, 130), + (45, 93, 144), (54, 104, 156), (63, 115, 169), (72, 127, 181), + (81, 138, 191), (88, 148, 199), (94, 154, 205), (98, 159, 209), + (100, 161, 212), (102, 163, 212), (103, 163, 213), (103, 163, 213), + (102, 163, 212), (101, 161, 211), (98, 159, 210), (97, 157, 209), + (95, 155, 207), (93, 153, 205), (90, 150, 203), (88, 148, 202) + ), + +// 488 Angora +((87, 50, 73), (92, 61, 79), (107, 72, 90), (122, 84, 101), + (135, 98, 119), (148, 113, 137), (156, 118, 144), (164, 124, 152), + (183, 132, 158), (180, 135, 160), (177, 138, 163), (171, 133, 153), + (165, 128, 143), (153, 120, 132), (142, 112, 122), (137, 108, 118), + (133, 105, 114), (122, 94, 114), (120, 88, 111), (119, 83, 108), + (120, 84, 110), (122, 85, 113), (123, 87, 116), (124, 90, 120), + (142, 103, 131), (152, 112, 140), (163, 122, 150), (171, 124, 154), + (179, 127, 159), (179, 126, 157), (179, 125, 155), (173, 120, 151), + (161, 108, 139), (136, 76, 108), (117, 62, 93), (99, 49, 78), + (88, 40, 71), (78, 31, 64), (75, 28, 62), (72, 26, 61), + (64, 26, 59), (64, 26, 60), (65, 26, 61), (68, 29, 64), + (72, 33, 67), (75, 35, 69), (78, 38, 72), (86, 45, 78), + (95, 53, 86), (114, 68, 102), (119, 71, 106), (125, 74, 111), + (124, 72, 109), (124, 70, 108), (119, 65, 104), (115, 60, 100), + (99, 47, 87), (93, 45, 83), (87, 44, 80), (85, 45, 82), + (83, 46, 84), (87, 48, 86), (91, 50, 89), (96, 54, 91), + (98, 54, 93), (100, 54, 96), (99, 52, 90), (98, 51, 84), + (95, 49, 79), (92, 47, 75), (87, 43, 69), (86, 42, 65), + (79, 39, 53), (78, 35, 50), (77, 32, 47), (76, 31, 47), + (76, 31, 48), (75, 31, 48), (74, 31, 49), (73, 29, 48), + (72, 29, 48), (67, 25, 46), (65, 24, 45), (64, 24, 44), + (64, 24, 44), (65, 25, 45), (66, 27, 49), (69, 32, 54), + (82, 51, 75), (89, 57, 86), (97, 63, 98), (99, 65, 101), + (102, 68, 104), (105, 70, 105), (105, 72, 102), (106, 68, 99), + (104, 61, 93), (98, 49, 71), (98, 48, 67), (98, 48, 63), + (100, 50, 65), (102, 52, 67), (107, 58, 70), (114, 66, 75), + (130, 79, 92), (133, 79, 95), (136, 79, 99), (131, 75, 97), + (126, 72, 95), (122, 69, 97), (126, 70, 104), (141, 79, 117), + (145, 89, 126), (164, 125, 160), (175, 136, 171), (187, 148, 182), + (206, 165, 199), (220, 177, 212), (224, 186, 217), (223, 191, 215), + (221, 181, 210), (220, 178, 206), (219, 175, 203), (216, 174, 202), + (214, 174, 201), (211, 170, 203), (212, 166, 200), (209, 163, 194), + (203, 159, 183), (190, 150, 164), (186, 147, 159), (183, 144, 155), + (174, 137, 142), (166, 127, 133), (161, 123, 128), (159, 120, 128), + (150, 113, 124), (148, 108, 123), (146, 103, 122), (147, 102, 122), + (148, 101, 122), (149, 98, 121), (148, 97, 121), (146, 98, 123), + (149, 99, 127), (158, 100, 132), (158, 102, 132), (158, 104, 133), + (157, 110, 134), (157, 111, 131), (157, 112, 125), (155, 109, 119), + (136, 98, 105), (132, 95, 101), (128, 93, 98), (120, 88, 93), + (113, 81, 89), (105, 74, 86), (101, 70, 84), (96, 69, 82), + (93, 68, 80), (90, 63, 74), (89, 62, 74), (89, 62, 74), + (89, 63, 73), (95, 66, 77), (106, 69, 81), (121, 78, 89), + (149, 96, 114), (155, 98, 119), (161, 101, 124), (174, 109, 129), + (180, 113, 131), (180, 113, 134), (170, 109, 136), (163, 105, 134), + (156, 99, 126), (149, 94, 118), (138, 89, 113), (131, 86, 110), + (127, 83, 105), (122, 80, 98), (117, 76, 92), (112, 72, 89), + (107, 66, 85), (107, 63, 83), (107, 61, 82), (109, 57, 82), + (111, 55, 81), (109, 52, 82), (104, 45, 79), (104, 40, 76), + (102, 37, 71), (97, 35, 69), (86, 30, 65), (77, 26, 59), + (71, 24, 54), (68, 24, 52), (65, 25, 54), (61, 25, 55), + (60, 27, 55), (60, 28, 54), (65, 28, 55), (65, 29, 59), + (67, 31, 61), (67, 32, 63), (70, 33, 63), (73, 34, 64), + (76, 37, 65), (79, 39, 66), (84, 43, 69), (88, 41, 72), + (92, 43, 75), (93, 45, 77), (96, 48, 77), (96, 44, 78), + (95, 40, 78), (95, 38, 77), (97, 41, 77), (98, 44, 77), + (100, 48, 77), (106, 50, 78), (115, 56, 81), (122, 64, 86), + (126, 74, 94), (132, 82, 98), (136, 87, 100), (138, 88, 103), + (134, 89, 104), (132, 88, 103), (126, 85, 97), (121, 82, 92), + (114, 79, 89), (110, 74, 88), (104, 68, 86), (103, 66, 84), + (103, 67, 84), (111, 70, 90), (120, 69, 98), (128, 72, 104), + (133, 79, 111), (140, 90, 116), (148, 100, 123), (153, 111, 129), + (158, 121, 132), (157, 127, 127), (151, 129, 123), (142, 130, 121), + (138, 130, 116), (136, 120, 104), (128, 106, 97), (114, 89, 92), + (103, 79, 87), (96, 66, 78), (92, 57, 75), (89, 51, 73) + ), + +// 489 Antique +((60, 18, 38), (72, 25, 55), (76, 31, 62), (81, 37, 69), + (82, 38, 73), (83, 39, 77), (82, 38, 77), (81, 38, 77), + (78, 33, 75), (80, 32, 73), (82, 31, 72), (84, 33, 71), + (87, 36, 71), (88, 38, 69), (90, 41, 67), (90, 41, 65), + (90, 42, 64), (86, 36, 59), (85, 34, 58), (85, 32, 58), + (86, 31, 59), (88, 30, 61), (88, 31, 62), (89, 32, 63), + (89, 38, 67), (87, 39, 67), (86, 41, 68), (83, 40, 66), + (80, 39, 65), (78, 36, 63), (77, 34, 62), (73, 30, 57), + (69, 26, 52), (61, 24, 42), (57, 23, 36), (54, 22, 31), + (52, 21, 28), (51, 21, 25), (51, 20, 23), (51, 20, 22), + (49, 16, 18), (48, 15, 17), (47, 14, 17), (46, 13, 17), + (45, 13, 17), (44, 13, 17), (44, 13, 17), (43, 13, 18), + (42, 13, 19), (41, 13, 19), (39, 13, 17), (38, 13, 16), + (36, 12, 16), (34, 12, 16), (34, 12, 16), (35, 13, 16), + (39, 17, 21), (44, 21, 25), (49, 25, 29), (51, 27, 31), + (54, 30, 33), (54, 30, 34), (55, 30, 35), (55, 31, 36), + (56, 31, 37), (57, 30, 39), (60, 31, 40), (63, 32, 42), + (64, 31, 43), (65, 31, 44), (64, 31, 46), (63, 30, 46), + (61, 26, 45), (60, 26, 47), (60, 26, 49), (66, 29, 55), + (72, 32, 62), (71, 31, 61), (71, 31, 61), (71, 31, 62), + (72, 31, 62), (76, 33, 64), (80, 37, 67), (85, 42, 70), + (90, 46, 75), (96, 51, 80), (101, 55, 82), (103, 57, 82), + (102, 53, 79), (95, 46, 72), (89, 40, 65), (86, 38, 62), + (84, 37, 60), (87, 41, 63), (94, 45, 66), (102, 51, 65), + (109, 60, 66), (126, 77, 72), (130, 80, 74), (135, 84, 77), + (135, 84, 77), (135, 85, 77), (135, 86, 79), (135, 84, 76), + (133, 85, 69), (133, 85, 67), (134, 86, 65), (133, 86, 64), + (132, 86, 64), (127, 84, 62), (121, 80, 62), (112, 71, 58), + (101, 60, 50), (76, 37, 34), (71, 32, 31), (66, 28, 28), + (58, 22, 25), (54, 18, 25), (54, 15, 29), (57, 16, 36), + (70, 26, 53), (76, 30, 61), (83, 35, 70), (84, 36, 72), + (86, 38, 75), (87, 40, 76), (88, 39, 75), (89, 39, 74), + (88, 37, 74), (92, 43, 75), (94, 44, 77), (96, 46, 79), + (98, 49, 81), (95, 49, 79), (91, 47, 75), (86, 42, 69), + (74, 30, 56), (71, 28, 53), (69, 27, 50), (70, 27, 51), + (71, 27, 52), (71, 27, 54), (71, 27, 56), (71, 28, 56), + (70, 26, 56), (70, 24, 52), (70, 23, 51), (70, 23, 51), + (72, 25, 52), (76, 29, 54), (78, 32, 56), (81, 36, 57), + (82, 38, 57), (81, 38, 56), (81, 38, 55), (79, 37, 52), + (78, 35, 51), (78, 36, 49), (79, 38, 50), (80, 40, 51), + (82, 43, 51), (83, 45, 54), (82, 44, 54), (82, 44, 54), + (79, 40, 52), (76, 35, 49), (73, 31, 44), (70, 28, 39), + (65, 26, 31), (65, 25, 30), (65, 25, 29), (65, 25, 28), + (64, 24, 28), (64, 23, 29), (65, 22, 28), (66, 22, 28), + (68, 22, 28), (72, 24, 28), (75, 26, 28), (77, 26, 28), + (77, 26, 28), (76, 26, 28), (75, 26, 28), (75, 27, 29), + (82, 34, 34), (85, 38, 35), (89, 43, 37), (99, 52, 43), + (107, 61, 48), (115, 69, 53), (119, 74, 58), (120, 76, 65), + (122, 78, 73), (126, 81, 84), (132, 89, 95), (142, 99, 109), + (152, 109, 122), (163, 119, 136), (173, 128, 144), (176, 130, 152), + (176, 129, 155), (173, 123, 156), (168, 117, 153), (159, 110, 148), + (150, 102, 142), (140, 95, 136), (132, 91, 127), (123, 84, 118), + (112, 75, 107), (102, 65, 95), (91, 55, 83), (79, 45, 69), + (69, 36, 56), (58, 28, 44), (48, 21, 32), (40, 16, 24), + (33, 11, 18), (29, 8, 15), (26, 6, 14), (25, 5, 14), + (25, 5, 15), (26, 6, 16), (28, 6, 17), (29, 7, 18), + (31, 7, 19), (32, 8, 21), (33, 9, 22), (34, 9, 22), + (34, 9, 23), (35, 10, 23), (36, 10, 24), (36, 11, 24), + (37, 10, 24), (38, 10, 25), (39, 10, 26), (39, 10, 26), + (39, 10, 27), (38, 11, 27), (38, 10, 27), (36, 10, 25), + (35, 9, 23), (34, 9, 21), (34, 8, 20), (34, 8, 19), + (34, 7, 18), (34, 8, 18), (35, 8, 17), (37, 9, 17), + (38, 10, 16), (39, 10, 16), (41, 10, 16), (43, 11, 17), + (45, 12, 19), (47, 13, 22), (50, 14, 26), (54, 16, 31) + ), + +// 490 Arizona +((205, 130, 107), (212, 138, 114), (211, 136, 116), (210, 135, 119), + (217, 145, 142), (224, 155, 166), (221, 151, 166), (218, 148, 166), + (199, 104, 186), (173, 84, 199), (148, 64, 213), (134, 45, 210), + (120, 27, 208), (110, 22, 200), (100, 17, 193), (96, 14, 189), + (92, 11, 185), (94, 6, 162), (96, 7, 143), (99, 8, 125), + (97, 9, 114), (95, 11, 104), (93, 10, 99), (92, 10, 94), + (87, 7, 81), (85, 8, 80), (84, 9, 79), (82, 7, 79), + (81, 6, 79), (80, 6, 78), (79, 6, 77), (79, 4, 73), + (76, 3, 70), (58, 3, 61), (52, 2, 57), (46, 1, 54), + (42, 0, 55), (39, 0, 57), (38, 0, 58), (38, 0, 60), + (49, 1, 67), (53, 0, 69), (58, 0, 71), (59, 0, 68), + (60, 0, 66), (60, 0, 64), (61, 0, 62), (60, 0, 57), + (57, 0, 51), (58, 2, 52), (65, 3, 57), (73, 4, 63), + (85, 10, 70), (97, 17, 77), (102, 21, 80), (107, 25, 84), + (119, 37, 79), (123, 44, 73), (127, 52, 68), (115, 51, 57), + (103, 51, 47), (97, 46, 42), (92, 41, 37), (85, 36, 36), + (82, 29, 41), (69, 14, 49), (72, 9, 55), (75, 4, 62), + (78, 4, 64), (81, 4, 66), (86, 4, 71), (91, 4, 77), + (92, 8, 87), (92, 7, 97), (93, 6, 107), (97, 6, 112), + (102, 7, 118), (102, 7, 119), (103, 8, 120), (99, 6, 117), + (102, 2, 115), (103, 5, 95), (95, 4, 83), (87, 3, 72), + (82, 2, 67), (78, 2, 63), (64, 2, 53), (56, 3, 48), + (50, 1, 40), (49, 0, 35), (49, 0, 31), (51, 1, 28), + (53, 3, 26), (64, 7, 23), (77, 16, 20), (97, 24, 19), + (105, 32, 15), (104, 41, 5), (108, 44, 12), (113, 47, 19), + (111, 43, 23), (110, 40, 27), (100, 30, 33), (92, 26, 37), + (91, 14, 54), (101, 24, 58), (112, 34, 62), (123, 48, 61), + (135, 62, 60), (156, 86, 61), (177, 103, 59), (184, 109, 55), + (197, 122, 49), (192, 131, 57), (181, 121, 58), (171, 112, 59), + (154, 89, 61), (136, 73, 68), (118, 59, 78), (106, 44, 84), + (104, 29, 94), (105, 26, 97), (107, 23, 101), (110, 22, 104), + (114, 22, 108), (121, 23, 115), (129, 25, 122), (134, 27, 129), + (142, 28, 141), (140, 20, 157), (139, 19, 154), (139, 18, 151), + (136, 17, 144), (129, 14, 139), (115, 7, 132), (104, 4, 122), + (86, 5, 116), (80, 3, 118), (75, 2, 121), (78, 7, 118), + (82, 12, 116), (90, 25, 111), (108, 39, 100), (127, 59, 89), + (156, 89, 79), (196, 125, 42), (199, 125, 31), (202, 126, 20), + (205, 128, 16), (204, 133, 21), (194, 118, 20), (172, 91, 17), + (127, 54, 35), (123, 51, 42), (120, 49, 50), (118, 43, 63), + (112, 40, 76), (104, 38, 80), (104, 41, 85), (115, 47, 81), + (124, 57, 77), (132, 63, 62), (131, 61, 58), (131, 59, 54), + (127, 52, 51), (125, 49, 47), (123, 41, 49), (120, 33, 49), + (111, 22, 45), (112, 22, 44), (113, 23, 44), (117, 24, 44), + (123, 30, 36), (125, 38, 26), (121, 45, 22), (113, 42, 23), + (105, 37, 29), (99, 32, 33), (89, 30, 37), (80, 27, 43), + (76, 24, 57), (85, 23, 75), (95, 28, 96), (105, 37, 113), + (133, 54, 143), (140, 55, 148), (148, 56, 154), (154, 50, 154), + (167, 53, 141), (166, 46, 133), (159, 40, 128), (143, 26, 120), + (143, 18, 97), (137, 10, 79), (126, 7, 72), (111, 7, 74), + (107, 8, 80), (105, 7, 82), (104, 6, 81), (101, 8, 75), + (100, 13, 71), (96, 18, 64), (90, 22, 56), (81, 25, 45), + (73, 27, 32), (70, 25, 24), (64, 22, 18), (56, 18, 18), + (49, 23, 15), (48, 22, 11), (47, 22, 12), (44, 16, 17), + (41, 16, 22), (41, 16, 23), (41, 18, 25), (49, 17, 32), + (57, 14, 43), (70, 15, 56), (86, 12, 66), (107, 15, 83), + (128, 14, 100), (138, 18, 111), (148, 16, 109), (152, 21, 112), + (158, 21, 122), (146, 16, 126), (130, 10, 121), (119, 12, 115), + (117, 18, 114), (115, 17, 114), (111, 15, 118), (111, 13, 127), + (117, 15, 130), (124, 18, 131), (127, 23, 132), (125, 25, 142), + (120, 20, 149), (116, 16, 154), (113, 17, 159), (106, 18, 166), + (104, 16, 172), (110, 14, 176), (120, 19, 180), (119, 21, 180), + (113, 20, 179), (103, 17, 180), (100, 22, 175), (97, 26, 168), + (97, 28, 153), (94, 29, 148), (102, 41, 136), (125, 67, 128), + (154, 97, 113), (162, 92, 104), (166, 82, 99), (172, 87, 100) + ), + +// 491 Autumn_Garden +((87, 71, 62), (91, 74, 71), (90, 75, 73), (90, 76, 76), + (90, 78, 81), (91, 81, 86), (88, 77, 82), (85, 74, 78), + (81, 70, 76), (84, 72, 78), (87, 75, 80), (90, 84, 85), + (93, 93, 90), (99, 99, 91), (105, 106, 92), (108, 108, 91), + (111, 111, 91), (120, 113, 86), (120, 112, 83), (120, 112, 81), + (119, 111, 73), (119, 110, 66), (119, 108, 60), (119, 107, 55), + (117, 102, 41), (118, 98, 38), (120, 95, 36), (119, 88, 32), + (119, 82, 28), (120, 78, 27), (121, 75, 26), (122, 70, 24), + (126, 68, 21), (133, 71, 22), (136, 76, 22), (139, 81, 22), + (141, 85, 26), (143, 89, 31), (143, 92, 33), (144, 95, 35), + (143, 106, 55), (147, 115, 63), (152, 125, 72), (152, 129, 71), + (153, 134, 70), (152, 135, 66), (152, 137, 63), (146, 133, 58), + (138, 132, 54), (129, 122, 55), (126, 114, 52), (123, 106, 49), + (117, 97, 39), (112, 88, 29), (104, 81, 23), (96, 75, 17), + (76, 58, 4), (71, 53, 2), (66, 48, 1), (65, 47, 4), + (65, 46, 7), (62, 44, 7), (59, 43, 7), (57, 44, 11), + (58, 43, 12), (63, 44, 12), (68, 45, 12), (74, 47, 12), + (75, 48, 12), (77, 49, 12), (80, 49, 12), (83, 48, 14), + (92, 51, 17), (98, 56, 17), (104, 62, 17), (109, 68, 21), + (115, 74, 26), (116, 75, 29), (118, 76, 33), (120, 77, 35), + (121, 76, 40), (121, 81, 44), (121, 87, 45), (121, 94, 46), + (120, 97, 47), (120, 100, 49), (117, 104, 50), (115, 103, 53), + (107, 99, 51), (102, 96, 44), (98, 94, 37), (95, 93, 34), + (93, 93, 32), (88, 94, 27), (83, 94, 26), (77, 93, 27), + (72, 91, 29), (65, 87, 35), (62, 86, 39), (59, 85, 44), + (57, 84, 45), (56, 84, 47), (53, 82, 51), (51, 78, 56), + (45, 75, 62), (44, 75, 64), (44, 76, 66), (46, 76, 67), + (48, 77, 69), (53, 76, 70), (59, 68, 72), (68, 62, 68), + (70, 57, 60), (71, 53, 43), (72, 54, 41), (73, 56, 39), + (77, 61, 36), (85, 67, 34), (102, 74, 35), (114, 83, 32), + (134, 101, 27), (139, 109, 27), (144, 117, 28), (144, 120, 27), + (145, 124, 26), (150, 134, 29), (155, 141, 30), (161, 150, 26), + (169, 159, 26), (176, 164, 21), (173, 161, 19), (171, 158, 17), + (161, 153, 16), (150, 143, 15), (139, 134, 10), (130, 127, 8), + (120, 119, 3), (117, 115, 3), (115, 112, 4), (112, 110, 4), + (110, 108, 5), (105, 105, 5), (101, 102, 7), (98, 102, 9), + (96, 101, 14), (95, 103, 29), (96, 105, 33), (97, 108, 37), + (99, 111, 46), (105, 115, 54), (107, 118, 60), (111, 119, 64), + (112, 116, 70), (111, 116, 71), (110, 116, 72), (109, 115, 77), + (110, 119, 78), (112, 123, 76), (114, 126, 73), (118, 125, 68), + (118, 121, 61), (113, 109, 43), (112, 106, 40), (111, 103, 37), + (111, 101, 30), (110, 101, 24), (112, 101, 19), (111, 101, 19), + (107, 96, 22), (106, 92, 24), (105, 89, 27), (103, 83, 31), + (100, 80, 36), (102, 78, 40), (102, 79, 44), (103, 78, 50), + (106, 77, 56), (107, 77, 61), (106, 76, 63), (104, 74, 64), + (103, 73, 64), (102, 75, 61), (100, 76, 56), (99, 73, 52), + (97, 71, 41), (95, 69, 37), (94, 68, 34), (90, 65, 30), + (85, 65, 27), (82, 65, 24), (79, 67, 21), (76, 71, 20), + (75, 74, 20), (75, 76, 20), (73, 76, 24), (72, 77, 29), + (74, 76, 36), (75, 75, 43), (74, 76, 50), (76, 79, 56), + (81, 80, 58), (84, 81, 63), (89, 82, 70), (94, 85, 75), + (99, 86, 82), (102, 87, 90), (105, 91, 99), (115, 94, 106), + (119, 95, 110), (122, 97, 120), (124, 101, 125), (134, 109, 127), + (142, 118, 136), (145, 127, 140), (154, 136, 144), (160, 141, 138), + (162, 143, 136), (158, 141, 132), (158, 140, 119), (153, 139, 112), + (147, 137, 102), (145, 137, 94), (143, 131, 83), (140, 126, 72), + (133, 117, 64), (123, 105, 52), (111, 96, 43), (99, 87, 40), + (89, 81, 37), (78, 74, 36), (67, 70, 34), (58, 64, 35), + (50, 58, 36), (46, 54, 40), (43, 51, 42), (41, 51, 46), + (39, 50, 51), (38, 52, 52), (38, 53, 53), (39, 55, 53), + (40, 56, 51), (44, 55, 48), (47, 57, 45), (53, 57, 44), + (59, 58, 42), (64, 58, 43), (68, 60, 46), (71, 62, 51), + (73, 64, 55), (75, 64, 54), (84, 74, 65), (92, 81, 70), + (94, 84, 71), (95, 83, 72), (96, 83, 72), (96, 83, 74) + ), + +// 492 Autumn_Leaves +((151, 96, 34), (130, 130, 63), (125, 127, 57), (120, 124, 51), + (104, 107, 50), (88, 90, 50), (79, 79, 50), (71, 69, 50), + (41, 46, 33), (35, 40, 27), (30, 35, 22), (32, 35, 19), + (35, 36, 16), (43, 39, 25), (52, 43, 34), (58, 49, 39), + (64, 56, 44), (86, 80, 70), (97, 90, 74), (108, 101, 78), + (114, 103, 79), (121, 105, 80), (125, 104, 77), (129, 103, 75), + (141, 113, 61), (134, 119, 56), (128, 126, 52), (108, 125, 40), + (89, 125, 29), (79, 122, 28), (70, 119, 27), (57, 101, 21), + (50, 84, 15), (39, 47, 10), (39, 37, 10), (39, 27, 11), + (39, 24, 11), (39, 21, 12), (41, 24, 12), (44, 28, 12), + (59, 39, 19), (63, 40, 15), (67, 41, 11), (74, 39, 8), + (81, 37, 6), (81, 30, 4), (81, 23, 2), (74, 20, 4), + (68, 18, 8), (47, 6, 13), (38, 8, 12), (29, 11, 12), + (36, 13, 9), (44, 16, 6), (52, 19, 8), (60, 22, 11), + (87, 38, 20), (95, 39, 20), (104, 41, 21), (96, 37, 16), + (89, 34, 12), (81, 31, 13), (74, 28, 15), (56, 20, 18), + (42, 15, 21), (22, 22, 46), (34, 39, 49), (46, 57, 52), + (52, 67, 55), (58, 78, 59), (76, 94, 62), (103, 112, 60), + (141, 122, 55), (156, 119, 56), (172, 117, 57), (174, 116, 58), + (177, 116, 60), (172, 122, 60), (167, 129, 61), (160, 128, 74), + (151, 131, 88), (139, 131, 91), (139, 122, 94), (139, 114, 98), + (135, 107, 92), (132, 101, 87), (115, 89, 76), (106, 76, 72), + (80, 56, 63), (69, 51, 57), (59, 46, 51), (61, 42, 48), + (63, 38, 46), (67, 38, 38), (77, 39, 34), (95, 41, 31), + (106, 49, 30), (139, 70, 42), (149, 80, 46), (159, 91, 50), + (160, 94, 54), (162, 97, 58), (155, 93, 55), (152, 86, 50), + (129, 81, 54), (116, 76, 53), (104, 71, 53), (99, 71, 54), + (95, 72, 55), (86, 70, 54), (81, 72, 46), (80, 80, 41), + (80, 83, 48), (86, 88, 41), (90, 89, 43), (95, 90, 46), + (102, 87, 48), (112, 83, 45), (114, 75, 41), (119, 71, 36), + (110, 67, 38), (107, 61, 40), (105, 55, 42), (99, 55, 42), + (94, 56, 43), (90, 49, 47), (87, 42, 49), (79, 39, 43), + (76, 34, 37), (63, 33, 28), (64, 33, 28), (66, 34, 29), + (65, 41, 33), (67, 51, 41), (77, 62, 52), (88, 75, 60), + (116, 93, 57), (127, 93, 50), (139, 93, 43), (139, 91, 38), + (140, 89, 33), (132, 79, 27), (120, 66, 25), (108, 59, 25), + (93, 51, 30), (64, 43, 27), (62, 41, 27), (60, 39, 28), + (58, 39, 27), (56, 37, 17), (52, 37, 11), (51, 42, 10), + (41, 35, 5), (38, 34, 5), (35, 33, 6), (25, 33, 3), + (21, 25, 3), (18, 14, 3), (15, 9, 1), (15, 6, 0), + (22, 2, 0), (32, 0, 9), (38, 0, 10), (44, 0, 12), + (51, 0, 17), (61, 2, 24), (77, 7, 22), (83, 12, 18), + (93, 32, 13), (94, 36, 10), (95, 41, 7), (93, 47, 7), + (91, 53, 10), (91, 61, 17), (93, 63, 21), (90, 60, 21), + (85, 61, 28), (78, 63, 31), (69, 57, 27), (66, 53, 28), + (62, 56, 30), (56, 55, 29), (58, 52, 33), (58, 52, 32), + (57, 34, 32), (56, 29, 33), (55, 24, 34), (51, 16, 26), + (45, 8, 20), (39, 5, 19), (35, 6, 14), (34, 12, 7), + (34, 19, 5), (34, 22, 8), (41, 25, 9), (48, 27, 6), + (50, 24, 7), (51, 22, 8), (51, 15, 4), (46, 10, 2), + (39, 11, 1), (34, 8, 0), (32, 7, 3), (30, 12, 9), + (27, 22, 17), (25, 33, 29), (29, 47, 53), (44, 66, 70), + (60, 83, 68), (65, 103, 71), (77, 107, 70), (93, 98, 52), + (97, 100, 41), (91, 92, 37), (85, 75, 35), (83, 74, 42), + (74, 78, 51), (62, 79, 59), (62, 88, 61), (47, 86, 47), + (29, 77, 40), (26, 73, 39), (19, 61, 20), (19, 56, 5), + (26, 55, 11), (33, 53, 18), (51, 60, 20), (74, 66, 34), + (90, 71, 46), (105, 79, 51), (125, 90, 64), (141, 105, 71), + (149, 131, 77), (154, 147, 82), (154, 156, 76), (162, 168, 76), + (164, 168, 72), (161, 149, 60), (169, 130, 47), (162, 124, 40), + (155, 113, 38), (154, 98, 34), (135, 93, 37), (120, 90, 43), + (120, 92, 49), (113, 93, 59), (108, 87, 67), (117, 86, 64), + (121, 92, 61), (129, 93, 62), (143, 88, 54), (150, 87, 41), + (156, 88, 33), (165, 85, 28), (157, 90, 41), (148, 93, 50) + ), + +// 493 Autumn_Mountains +((189, 156, 127), (195, 167, 135), (187, 158, 123), (179, 150, 112), + (172, 141, 107), (165, 133, 102), (160, 128, 97), (155, 123, 93), + (133, 99, 75), (119, 82, 53), (106, 66, 32), (101, 60, 27), + (97, 55, 23), (99, 57, 26), (102, 59, 30), (104, 61, 31), + (107, 64, 33), (124, 82, 42), (132, 90, 45), (140, 98, 48), + (141, 100, 50), (143, 103, 52), (143, 102, 52), (143, 102, 52), + (135, 95, 54), (131, 94, 55), (128, 93, 57), (128, 93, 58), + (128, 93, 60), (129, 94, 61), (130, 96, 62), (135, 96, 68), + (139, 102, 73), (151, 115, 86), (156, 121, 88), (162, 127, 91), + (167, 130, 92), (172, 133, 94), (174, 134, 92), (177, 135, 91), + (176, 131, 83), (172, 127, 78), (169, 124, 73), (163, 120, 68), + (158, 116, 63), (156, 114, 60), (155, 113, 58), (153, 110, 52), + (151, 106, 49), (146, 103, 48), (143, 102, 47), (140, 101, 46), + (136, 96, 44), (133, 91, 42), (132, 89, 41), (132, 87, 40), + (125, 74, 41), (123, 70, 38), (121, 67, 35), (120, 62, 31), + (119, 58, 27), (119, 57, 25), (119, 56, 24), (117, 53, 22), + (117, 52, 21), (123, 61, 30), (128, 65, 34), (134, 70, 38), + (135, 72, 39), (136, 74, 40), (136, 73, 38), (135, 73, 37), + (127, 69, 34), (122, 64, 32), (118, 59, 31), (112, 51, 26), + (106, 44, 21), (103, 42, 17), (101, 40, 14), (95, 39, 10), + (92, 38, 10), (88, 41, 14), (87, 44, 21), (87, 47, 29), + (87, 49, 32), (87, 52, 36), (91, 55, 43), (96, 61, 46), + (98, 71, 54), (96, 75, 59), (95, 79, 64), (95, 79, 65), + (95, 79, 67), (98, 76, 67), (104, 73, 62), (105, 70, 59), + (105, 67, 55), (103, 64, 52), (105, 63, 49), (107, 63, 46), + (108, 63, 44), (110, 63, 42), (111, 62, 37), (112, 60, 34), + (109, 54, 31), (107, 53, 28), (105, 52, 25), (103, 52, 23), + (102, 52, 21), (100, 53, 18), (100, 52, 15), (101, 52, 17), + (103, 53, 20), (108, 58, 27), (109, 60, 29), (111, 62, 31), + (114, 67, 34), (117, 72, 40), (121, 78, 46), (126, 85, 51), + (134, 97, 62), (137, 100, 65), (140, 104, 69), (140, 104, 69), + (141, 105, 69), (145, 106, 67), (148, 110, 65), (156, 119, 73), + (162, 123, 75), (161, 123, 75), (159, 120, 72), (157, 117, 70), + (146, 104, 55), (142, 101, 53), (137, 94, 48), (131, 87, 47), + (114, 71, 41), (103, 59, 29), (92, 47, 18), (89, 43, 14), + (87, 40, 10), (85, 39, 6), (85, 37, 5), (86, 38, 7), + (87, 42, 8), (97, 53, 15), (101, 58, 17), (105, 63, 20), + (111, 70, 27), (115, 77, 37), (119, 83, 43), (122, 89, 50), + (131, 101, 58), (134, 103, 59), (137, 105, 60), (139, 108, 65), + (141, 110, 67), (142, 109, 63), (140, 106, 57), (139, 102, 51), + (138, 97, 42), (131, 83, 33), (129, 78, 30), (127, 73, 27), + (120, 64, 19), (110, 53, 13), (100, 42, 6), (89, 32, 3), + (77, 18, 3), (76, 17, 3), (76, 16, 4), (75, 16, 7), + (74, 18, 10), (71, 19, 15), (66, 23, 18), (66, 26, 21), + (69, 30, 22), (71, 31, 22), (75, 34, 22), (73, 35, 21), + (67, 35, 24), (62, 35, 26), (63, 35, 27), (65, 34, 24), + (78, 39, 17), (79, 40, 16), (81, 41, 16), (81, 44, 20), + (85, 46, 24), (89, 48, 27), (98, 50, 29), (108, 55, 29), + (117, 62, 29), (125, 71, 33), (131, 77, 40), (134, 85, 47), + (137, 88, 53), (140, 90, 57), (144, 95, 62), (151, 104, 66), + (158, 112, 73), (171, 132, 93), (183, 150, 115), (192, 165, 135), + (202, 180, 155), (213, 194, 172), (218, 199, 176), (227, 213, 193), + (237, 225, 209), (243, 236, 224), (249, 245, 239), (254, 254, 252), + (254, 254, 252), (254, 254, 253), (255, 253, 252), (254, 253, 251), + (247, 242, 239), (240, 231, 226), (231, 220, 214), (221, 207, 202), + (211, 195, 189), (208, 193, 186), (199, 182, 174), (192, 170, 161), + (184, 160, 146), (175, 150, 135), (165, 137, 120), (163, 135, 114), + (160, 132, 108), (159, 126, 102), (158, 123, 97), (158, 121, 96), + (155, 120, 94), (155, 120, 94), (153, 119, 91), (151, 115, 85), + (148, 111, 78), (145, 107, 74), (140, 103, 70), (136, 101, 71), + (132, 100, 71), (131, 100, 69), (130, 100, 66), (130, 99, 62), + (129, 96, 54), (129, 95, 52), (128, 92, 52), (130, 92, 52), + (134, 94, 56), (138, 97, 61), (142, 102, 65), (148, 108, 73), + (153, 113, 79), (159, 118, 84), (167, 126, 92), (179, 141, 110) + ), + +// 494 Awakening +((214, 197, 29), (211, 204, 88), (207, 201, 110), (204, 198, 132), + (203, 189, 153), (203, 181, 174), (208, 173, 176), (214, 166, 179), + (215, 131, 158), (210, 118, 144), (206, 105, 130), (206, 101, 133), + (206, 98, 136), (204, 122, 146), (203, 147, 157), (197, 152, 157), + (191, 157, 158), (172, 177, 168), (168, 174, 164), (164, 171, 160), + (162, 162, 154), (160, 154, 149), (159, 155, 149), (159, 156, 149), + (179, 167, 167), (187, 181, 180), (195, 195, 194), (195, 205, 196), + (195, 215, 199), (193, 214, 194), (191, 214, 189), (175, 209, 165), + (162, 196, 134), (134, 172, 86), (122, 165, 60), (110, 159, 34), + (123, 162, 22), (137, 165, 11), (145, 168, 10), (153, 171, 9), + (181, 177, 29), (197, 169, 41), (213, 161, 53), (203, 167, 77), + (193, 174, 102), (188, 169, 97), (183, 165, 93), (187, 145, 81), + (190, 154, 68), (185, 175, 63), (179, 170, 37), (174, 165, 12), + (163, 158, 8), (152, 152, 5), (141, 151, 5), (131, 150, 6), + (96, 140, 3), (98, 135, 1), (100, 130, 0), (106, 132, 3), + (113, 134, 7), (116, 137, 9), (119, 141, 11), (118, 141, 13), + (116, 135, 16), (81, 129, 29), (61, 119, 30), (41, 109, 31), + (33, 103, 32), (25, 97, 33), (12, 88, 33), (3, 80, 31), + (3, 75, 19), (8, 80, 16), (13, 86, 14), (19, 91, 10), + (25, 96, 6), (26, 98, 4), (27, 100, 3), (32, 104, 3), + (37, 106, 5), (37, 102, 9), (45, 104, 17), (53, 107, 26), + (64, 105, 33), (76, 103, 41), (99, 90, 55), (121, 73, 56), + (133, 82, 63), (141, 80, 59), (149, 79, 56), (149, 79, 50), + (150, 80, 44), (137, 95, 31), (120, 116, 31), (106, 126, 25), + (101, 128, 18), (86, 125, 16), (70, 119, 19), (54, 113, 22), + (45, 109, 23), (36, 106, 25), (24, 102, 32), (16, 97, 34), + (7, 84, 41), (7, 79, 43), (8, 74, 45), (14, 71, 42), + (20, 69, 40), (37, 75, 32), (59, 83, 27), (80, 97, 21), + (106, 101, 16), (144, 125, 9), (147, 130, 7), (150, 136, 5), + (148, 134, 6), (128, 128, 9), (110, 121, 12), (87, 112, 12), + (40, 91, 17), (25, 89, 19), (11, 87, 22), (11, 89, 22), + (11, 92, 22), (13, 95, 22), (18, 99, 22), (20, 100, 25), + (27, 103, 27), (25, 109, 26), (23, 107, 26), (21, 106, 27), + (20, 98, 29), (16, 90, 30), (8, 86, 29), (4, 84, 29), + (23, 88, 21), (42, 97, 17), (62, 107, 14), (74, 113, 12), + (86, 120, 11), (114, 138, 8), (139, 157, 4), (153, 169, 2), + (158, 166, 2), (147, 164, 3), (138, 161, 2), (130, 158, 2), + (108, 140, 2), (91, 123, 0), (76, 115, 3), (70, 115, 5), + (74, 113, 14), (77, 116, 17), (80, 120, 21), (93, 133, 28), + (111, 145, 44), (125, 152, 62), (124, 157, 76), (124, 159, 79), + (128, 161, 77), (111, 155, 70), (102, 152, 68), (94, 149, 66), + (85, 143, 57), (77, 137, 38), (65, 129, 23), (55, 125, 17), + (53, 120, 17), (54, 118, 15), (55, 116, 14), (57, 118, 10), + (60, 122, 8), (62, 126, 8), (63, 123, 7), (59, 119, 7), + (54, 115, 7), (46, 113, 12), (39, 106, 15), (28, 95, 19), + (20, 82, 21), (11, 71, 24), (6, 61, 25), (2, 54, 27), + (0, 47, 29), (0, 47, 27), (0, 47, 25), (4, 51, 21), + (12, 60, 16), (21, 73, 16), (27, 84, 15), (34, 94, 18), + (41, 102, 17), (49, 111, 18), (55, 118, 20), (61, 123, 23), + (64, 124, 26), (63, 124, 24), (64, 126, 25), (69, 130, 29), + (74, 130, 38), (74, 128, 46), (76, 132, 55), (78, 134, 63), + (72, 133, 68), (59, 124, 71), (52, 122, 73), (49, 118, 75), + (46, 115, 70), (42, 113, 60), (45, 116, 50), (61, 118, 48), + (75, 120, 48), (86, 125, 45), (90, 129, 41), (94, 130, 40), + (95, 128, 38), (87, 122, 36), (75, 115, 32), (60, 107, 29), + (45, 104, 27), (32, 96, 24), (25, 91, 22), (22, 91, 20), + (18, 96, 21), (21, 101, 23), (28, 103, 27), (45, 108, 32), + (63, 115, 46), (83, 127, 66), (101, 142, 91), (121, 157, 110), + (141, 163, 118), (152, 169, 127), (150, 173, 133), (137, 175, 134), + (124, 168, 119), (113, 157, 101), (100, 149, 87), (86, 141, 73), + (73, 135, 63), (77, 133, 54), (87, 134, 63), (108, 136, 82), + (128, 146, 103), (142, 160, 109), (152, 169, 98), (165, 164, 88), + (191, 167, 85), (204, 177, 79), (210, 189, 61), (209, 186, 33), + (220, 186, 12), (229, 193, 1), (234, 198, 1), (226, 199, 9) + ), + +// 495 Baby +((168, 150, 133), (195, 153, 148), (200, 157, 153), (205, 162, 159), + (202, 161, 152), (200, 161, 145), (196, 163, 146), (193, 165, 147), + (179, 168, 150), (166, 161, 146), (154, 155, 142), (149, 147, 128), + (145, 140, 115), (139, 133, 107), (134, 127, 99), (133, 124, 95), + (133, 122, 91), (124, 120, 91), (118, 119, 90), (112, 119, 90), + (110, 119, 94), (109, 119, 99), (108, 122, 101), (107, 126, 104), + (124, 136, 118), (124, 145, 132), (125, 154, 146), (118, 168, 158), + (112, 182, 170), (111, 186, 173), (111, 191, 176), (104, 202, 179), + (105, 210, 180), (127, 205, 179), (142, 194, 181), (157, 184, 183), + (155, 180, 183), (154, 176, 184), (154, 173, 184), (154, 171, 184), + (152, 178, 171), (156, 179, 164), (160, 180, 158), (171, 176, 148), + (182, 172, 138), (182, 166, 136), (183, 161, 135), (178, 156, 134), + (172, 139, 133), (142, 112, 120), (137, 102, 117), (133, 93, 114), + (130, 96, 117), (127, 99, 121), (126, 104, 123), (126, 110, 126), + (93, 126, 142), (83, 131, 143), (73, 137, 145), (66, 130, 139), + (59, 124, 133), (65, 124, 128), (71, 124, 124), (80, 126, 106), + (83, 126, 101), (97, 124, 101), (100, 124, 110), (104, 125, 120), + (107, 125, 123), (111, 125, 126), (118, 123, 139), (126, 121, 141), + (133, 126, 145), (134, 126, 138), (135, 126, 132), (132, 122, 125), + (130, 119, 119), (130, 119, 114), (130, 119, 109), (130, 116, 97), + (133, 112, 90), (133, 98, 74), (131, 91, 68), (130, 84, 63), + (128, 79, 64), (126, 74, 66), (124, 70, 69), (123, 70, 75), + (140, 92, 97), (144, 103, 106), (149, 114, 115), (149, 122, 118), + (149, 131, 122), (146, 145, 131), (134, 159, 145), (117, 173, 158), + (102, 189, 172), (98, 190, 189), (107, 182, 180), (116, 175, 172), + (127, 169, 168), (138, 164, 164), (152, 152, 152), (162, 146, 146), + (162, 146, 149), (146, 152, 158), (130, 159, 167), (121, 166, 171), + (112, 173, 176), (93, 177, 173), (72, 180, 168), (57, 193, 165), + (45, 187, 157), (38, 175, 142), (37, 170, 142), (37, 166, 142), + (38, 163, 146), (37, 160, 149), (37, 154, 152), (37, 151, 152), + (37, 154, 148), (51, 152, 143), (65, 151, 139), (72, 150, 136), + (80, 149, 134), (85, 148, 130), (106, 140, 122), (124, 130, 114), + (124, 128, 103), (127, 122, 89), (128, 124, 87), (129, 126, 85), + (128, 127, 81), (129, 125, 86), (129, 123, 93), (129, 122, 98), + (121, 104, 116), (122, 106, 130), (124, 109, 144), (123, 110, 146), + (123, 112, 149), (126, 114, 155), (128, 107, 155), (131, 104, 143), + (130, 100, 134), (123, 81, 102), (123, 83, 99), (123, 86, 97), + (118, 92, 97), (107, 104, 97), (96, 118, 104), (83, 129, 113), + (57, 158, 125), (51, 157, 127), (45, 156, 130), (47, 158, 128), + (60, 158, 128), (71, 151, 130), (81, 140, 131), (96, 134, 128), + (110, 129, 120), (119, 127, 115), (118, 127, 113), (118, 128, 111), + (122, 134, 110), (117, 147, 120), (106, 158, 132), (101, 168, 152), + (87, 179, 178), (87, 177, 182), (87, 176, 186), (97, 181, 191), + (100, 174, 190), (100, 169, 186), (107, 176, 177), (106, 180, 172), + (88, 175, 162), (77, 170, 150), (81, 169, 152), (85, 164, 145), + (87, 150, 137), (98, 149, 141), (117, 154, 142), (134, 155, 143), + (140, 167, 142), (141, 172, 143), (143, 178, 144), (136, 183, 148), + (122, 179, 151), (105, 175, 153), (83, 172, 155), (68, 170, 157), + (61, 161, 156), (63, 157, 156), (71, 164, 160), (82, 160, 162), + (103, 153, 159), (118, 156, 154), (123, 154, 152), (129, 141, 147), + (133, 136, 139), (133, 129, 133), (131, 119, 130), (127, 109, 126), + (122, 99, 122), (121, 95, 120), (118, 90, 112), (115, 92, 100), + (114, 94, 87), (118, 89, 71), (123, 90, 58), (122, 93, 48), + (121, 93, 39), (121, 96, 46), (125, 101, 56), (124, 108, 65), + (120, 113, 85), (123, 119, 104), (130, 130, 112), (143, 138, 121), + (163, 136, 141), (184, 140, 155), (203, 151, 156), (220, 153, 157), + (225, 147, 158), (219, 144, 152), (211, 146, 139), (198, 143, 131), + (187, 137, 127), (181, 135, 123), (179, 139, 125), (180, 140, 127), + (179, 135, 122), (175, 134, 117), (169, 132, 113), (160, 126, 105), + (151, 118, 96), (146, 115, 89), (136, 114, 81), (130, 107, 75), + (129, 100, 69), (129, 97, 66), (127, 91, 65), (125, 83, 65), + (123, 82, 64), (119, 84, 62), (118, 86, 56), (115, 95, 50), + (116, 109, 52), (121, 120, 56), (121, 128, 55), (125, 135, 66), + (134, 143, 88), (136, 142, 97), (144, 136, 99), (162, 144, 117) + ), + +// 496 Banana +((199, 176, 153), (195, 176, 150), (205, 186, 162), (216, 196, 174), + (213, 194, 172), (211, 192, 170), (210, 191, 170), (209, 191, 170), + (216, 194, 171), (218, 198, 176), (221, 202, 181), (221, 202, 181), + (221, 203, 181), (220, 203, 183), (219, 204, 185), (217, 204, 186), + (216, 204, 188), (213, 203, 189), (217, 205, 191), (221, 208, 194), + (226, 212, 197), (232, 217, 201), (232, 216, 200), (233, 216, 200), + (234, 213, 192), (228, 205, 182), (223, 198, 172), (216, 188, 160), + (209, 178, 148), (207, 173, 139), (205, 169, 131), (204, 160, 113), + (207, 157, 98), (212, 160, 92), (211, 157, 89), (211, 155, 86), + (209, 157, 92), (208, 160, 99), (206, 158, 102), (204, 157, 105), + (193, 148, 108), (191, 147, 108), (190, 147, 109), (192, 150, 112), + (194, 154, 115), (195, 157, 118), (197, 160, 122), (197, 166, 130), + (199, 170, 137), (203, 179, 150), (200, 179, 153), (197, 180, 156), + (196, 179, 157), (196, 179, 158), (196, 179, 158), (197, 180, 159), + (198, 184, 166), (202, 188, 170), (206, 192, 175), (208, 195, 178), + (211, 198, 181), (211, 198, 180), (212, 198, 180), (213, 195, 174), + (214, 190, 165), (214, 181, 149), (211, 175, 141), (209, 170, 134), + (208, 167, 129), (208, 165, 125), (206, 159, 118), (197, 151, 110), + (179, 140, 103), (177, 138, 102), (176, 137, 102), (173, 138, 105), + (171, 139, 109), (173, 141, 112), (176, 144, 116), (181, 149, 123), + (185, 152, 125), (181, 151, 124), (174, 144, 115), (168, 137, 106), + (164, 132, 99), (161, 128, 93), (155, 119, 82), (148, 113, 72), + (149, 105, 58), (151, 102, 46), (154, 100, 35), (159, 101, 33), + (165, 103, 32), (173, 106, 35), (178, 109, 35), (178, 111, 35), + (183, 115, 40), (189, 125, 65), (187, 129, 77), (185, 134, 90), + (186, 135, 95), (188, 137, 100), (189, 140, 108), (189, 144, 112), + (190, 147, 118), (191, 150, 118), (193, 154, 119), (193, 154, 120), + (194, 155, 121), (196, 156, 120), (198, 156, 121), (198, 158, 121), + (197, 159, 122), (195, 159, 123), (195, 159, 125), (195, 160, 127), + (196, 163, 130), (197, 164, 132), (198, 166, 132), (198, 166, 133), + (204, 167, 132), (205, 166, 131), (207, 166, 131), (206, 167, 132), + (206, 169, 134), (206, 171, 139), (208, 174, 145), (209, 177, 150), + (210, 183, 159), (211, 194, 172), (211, 194, 172), (212, 195, 172), + (212, 193, 170), (211, 189, 164), (209, 181, 150), (204, 170, 134), + (184, 143, 98), (173, 128, 80), (162, 113, 62), (154, 106, 56), + (146, 100, 51), (137, 95, 48), (130, 93, 48), (134, 98, 54), + (136, 105, 70), (149, 129, 102), (155, 135, 107), (161, 142, 113), + (173, 152, 126), (184, 162, 137), (190, 169, 142), (194, 175, 146), + (202, 180, 152), (203, 181, 152), (205, 183, 153), (208, 184, 152), + (209, 185, 151), (209, 184, 150), (207, 181, 148), (206, 175, 140), + (205, 167, 126), (199, 150, 95), (196, 145, 89), (193, 140, 83), + (189, 129, 68), (189, 125, 56), (193, 122, 42), (192, 124, 41), + (191, 127, 57), (193, 129, 59), (195, 132, 62), (197, 138, 74), + (201, 146, 86), (197, 149, 102), (193, 154, 112), (192, 157, 123), + (194, 162, 130), (194, 165, 137), (192, 170, 142), (192, 172, 148), + (193, 175, 152), (195, 177, 156), (198, 180, 157), (199, 181, 161), + (200, 183, 165), (201, 185, 166), (203, 187, 168), (208, 192, 174), + (211, 198, 182), (215, 204, 189), (221, 210, 196), (228, 217, 203), + (235, 225, 212), (238, 229, 217), (238, 232, 220), (240, 232, 220), + (240, 232, 221), (238, 229, 217), (232, 224, 213), (228, 219, 206), + (226, 216, 203), (224, 213, 198), (221, 210, 197), (218, 209, 195), + (217, 207, 194), (218, 206, 192), (217, 204, 189), (215, 201, 184), + (211, 194, 175), (208, 186, 163), (204, 177, 151), (200, 167, 136), + (193, 156, 122), (189, 148, 111), (186, 146, 107), (188, 145, 106), + (184, 143, 105), (185, 143, 107), (186, 147, 112), (192, 154, 118), + (196, 158, 122), (199, 161, 127), (202, 165, 131), (208, 170, 135), + (215, 175, 137), (217, 179, 142), (217, 184, 150), (218, 188, 159), + (221, 194, 165), (222, 198, 172), (220, 203, 181), (220, 208, 190), + (223, 212, 197), (227, 217, 202), (228, 220, 206), (231, 223, 211), + (231, 223, 212), (231, 222, 210), (229, 219, 206), (227, 216, 201), + (223, 210, 194), (220, 201, 187), (216, 193, 176), (213, 187, 166), + (208, 183, 156), (208, 176, 149), (206, 169, 143), (206, 165, 138), + (201, 166, 136), (199, 166, 136), (195, 162, 135), (193, 158, 133), + (186, 155, 131), (179, 150, 124), (184, 159, 133), (193, 166, 142) + ), + +// 497 Beach +((131, 111, 158), (173, 150, 160), (177, 158, 172), (182, 167, 185), + (194, 179, 196), (206, 191, 208), (214, 198, 212), (223, 205, 217), + (240, 230, 231), (236, 229, 232), (233, 229, 234), (229, 214, 230), + (226, 199, 226), (223, 193, 223), (220, 187, 220), (217, 187, 219), + (215, 188, 218), (211, 180, 213), (207, 173, 212), (204, 167, 211), + (194, 162, 210), (184, 157, 210), (182, 156, 210), (180, 156, 210), + (178, 147, 194), (172, 138, 184), (166, 129, 175), (167, 129, 158), + (168, 130, 142), (173, 136, 136), (179, 143, 131), (190, 155, 124), + (193, 164, 127), (198, 179, 139), (202, 188, 145), (206, 197, 151), + (207, 200, 153), (209, 204, 156), (208, 203, 156), (208, 203, 157), + (202, 188, 157), (191, 172, 145), (181, 156, 133), (163, 140, 123), + (145, 125, 113), (136, 117, 113), (128, 110, 114), (113, 95, 122), + (102, 79, 122), (81, 65, 131), (76, 68, 145), (71, 72, 160), + (78, 81, 170), (86, 91, 180), (91, 96, 184), (96, 102, 188), + (126, 131, 204), (142, 147, 206), (159, 163, 208), (170, 172, 197), + (181, 181, 187), (185, 183, 182), (190, 185, 178), (201, 189, 173), + (204, 190, 171), (191, 174, 167), (179, 162, 168), (167, 151, 170), + (159, 146, 173), (151, 142, 177), (138, 130, 187), (125, 120, 198), + (107, 109, 213), (105, 111, 214), (104, 114, 215), (115, 121, 216), + (126, 129, 217), (132, 132, 216), (139, 135, 215), (149, 137, 211), + (151, 132, 203), (157, 110, 172), (153, 101, 160), (150, 93, 149), + (143, 88, 145), (136, 84, 142), (120, 68, 141), (106, 54, 131), + (80, 40, 128), (71, 43, 138), (63, 47, 148), (61, 49, 153), + (60, 51, 159), (61, 55, 163), (62, 58, 166), (63, 62, 169), + (65, 64, 173), (65, 67, 179), (66, 65, 179), (67, 63, 180), + (66, 62, 179), (66, 62, 178), (65, 60, 174), (61, 56, 168), + (56, 44, 156), (57, 43, 153), (58, 43, 150), (59, 45, 150), + (60, 47, 150), (65, 51, 150), (71, 58, 153), (77, 66, 159), + (84, 74, 164), (93, 91, 186), (96, 93, 190), (99, 96, 195), + (102, 100, 202), (108, 98, 200), (113, 90, 200), (118, 87, 199), + (125, 91, 209), (127, 93, 210), (130, 96, 212), (131, 97, 212), + (133, 98, 212), (139, 102, 214), (144, 113, 219), (153, 132, 226), + (161, 148, 231), (172, 172, 235), (174, 175, 236), (176, 178, 237), + (183, 182, 238), (185, 179, 239), (183, 177, 236), (176, 172, 229), + (158, 149, 217), (153, 135, 210), (148, 121, 203), (146, 116, 197), + (145, 111, 191), (137, 106, 185), (136, 106, 178), (139, 105, 178), + (140, 109, 182), (146, 113, 187), (145, 115, 186), (144, 118, 185), + (141, 117, 187), (138, 119, 187), (137, 117, 185), (137, 115, 181), + (139, 114, 156), (142, 116, 148), (145, 118, 141), (151, 120, 125), + (155, 124, 111), (158, 126, 97), (155, 123, 88), (152, 117, 83), + (150, 114, 80), (156, 120, 75), (157, 123, 73), (158, 127, 72), + (159, 126, 74), (161, 128, 76), (162, 130, 80), (168, 136, 83), + (173, 147, 85), (172, 146, 85), (172, 146, 86), (167, 142, 91), + (165, 139, 97), (163, 133, 106), (158, 120, 112), (154, 102, 116), + (146, 84, 123), (137, 74, 124), (134, 71, 125), (123, 64, 123), + (113, 53, 116), (98, 36, 113), (81, 24, 110), (74, 24, 97), + (50, 21, 79), (44, 18, 77), (38, 16, 75), (26, 11, 83), + (25, 14, 82), (31, 20, 87), (40, 30, 98), (52, 43, 113), + (67, 59, 131), (85, 77, 145), (105, 97, 155), (123, 116, 160), + (136, 128, 165), (148, 137, 164), (155, 141, 160), (155, 141, 158), + (154, 139, 152), (147, 132, 147), (140, 127, 145), (138, 122, 140), + (136, 119, 135), (138, 120, 131), (143, 126, 122), (149, 135, 120), + (158, 147, 118), (169, 157, 111), (179, 164, 102), (190, 174, 92), + (193, 178, 85), (192, 180, 85), (185, 171, 95), (169, 156, 102), + (157, 142, 111), (140, 128, 122), (129, 121, 132), (120, 111, 151), + (108, 101, 166), (101, 92, 172), (94, 86, 173), (91, 83, 163), + (94, 84, 158), (96, 84, 156), (101, 80, 160), (108, 77, 161), + (109, 76, 158), (108, 76, 157), (102, 75, 154), (96, 69, 157), + (92, 58, 162), (85, 52, 164), (79, 48, 167), (70, 46, 166), + (64, 46, 166), (61, 44, 166), (57, 43, 161), (54, 42, 157), + (51, 41, 152), (52, 39, 145), (54, 39, 139), (56, 36, 131), + (59, 34, 120), (62, 31, 113), (63, 33, 103), (65, 39, 103), + (71, 45, 105), (80, 51, 106), (95, 57, 110), (111, 72, 107), + (124, 92, 109), (119, 96, 121), (116, 100, 135), (120, 104, 151) + ), + +// 498 Beautiful +((215, 129, 52), (194, 131, 15), (204, 142, 14), (214, 153, 13), + (233, 147, 29), (252, 142, 45), (235, 142, 69), (219, 143, 94), + (190, 147, 174), (134, 139, 168), (79, 132, 163), (71, 113, 153), + (64, 94, 144), (65, 78, 135), (67, 62, 126), (65, 64, 125), + (64, 66, 125), (106, 108, 97), (153, 117, 88), (200, 126, 79), + (220, 131, 63), (240, 136, 47), (243, 139, 52), (246, 142, 57), + (219, 188, 71), (216, 173, 77), (214, 158, 83), (206, 136, 66), + (199, 114, 50), (190, 115, 36), (182, 116, 22), (155, 121, 0), + (136, 108, 8), (147, 144, 49), (130, 139, 63), (114, 135, 78), + (93, 101, 102), (72, 68, 127), (66, 69, 126), (61, 70, 125), + (38, 140, 154), (44, 150, 166), (51, 161, 178), (45, 156, 178), + (40, 151, 178), (33, 148, 159), (26, 145, 141), (52, 155, 125), + (96, 142, 78), (173, 127, 33), (187, 141, 62), (201, 156, 91), + (195, 156, 134), (190, 157, 178), (192, 161, 183), (195, 166, 188), + (183, 153, 187), (124, 162, 195), (66, 171, 203), (48, 174, 194), + (30, 177, 185), (26, 169, 185), (23, 162, 185), (37, 139, 177), + (70, 113, 155), (147, 96, 93), (170, 109, 75), (193, 122, 58), + (197, 122, 58), (202, 122, 59), (203, 122, 56), (205, 123, 47), + (255, 138, 38), (253, 141, 42), (252, 144, 46), (242, 172, 45), + (233, 200, 45), (227, 194, 68), (222, 188, 91), (211, 176, 156), + (194, 156, 177), (191, 144, 176), (184, 151, 161), (177, 159, 147), + (187, 156, 116), (198, 153, 86), (212, 142, 83), (200, 123, 69), + (166, 108, 88), (170, 74, 117), (174, 41, 146), (166, 40, 145), + (159, 39, 145), (147, 30, 134), (157, 19, 114), (134, 32, 132), + (82, 52, 126), (66, 72, 130), (60, 108, 142), (54, 144, 155), + (49, 144, 166), (44, 144, 178), (40, 153, 185), (49, 174, 204), + (77, 144, 170), (104, 134, 132), (131, 124, 95), (139, 118, 94), + (148, 113, 93), (144, 104, 112), (144, 106, 119), (96, 118, 132), + (54, 139, 178), (48, 99, 178), (65, 93, 162), (82, 88, 146), + (128, 57, 137), (156, 46, 143), (151, 43, 144), (134, 37, 130), + (71, 60, 129), (59, 84, 127), (47, 108, 126), (51, 113, 121), + (56, 118, 117), (66, 133, 149), (75, 132, 161), (152, 133, 163), + (182, 140, 190), (84, 143, 173), (74, 141, 170), (64, 139, 168), + (84, 132, 146), (151, 125, 128), (175, 114, 86), (204, 123, 58), + (208, 123, 40), (196, 122, 27), (184, 121, 15), (183, 118, 18), + (182, 116, 22), (143, 137, 39), (109, 119, 66), (103, 115, 69), + (68, 108, 71), (35, 80, 122), (39, 79, 125), (43, 79, 129), + (40, 67, 122), (44, 56, 114), (61, 40, 109), (74, 51, 119), + (103, 24, 116), (99, 26, 116), (95, 29, 116), (85, 34, 111), + (60, 30, 104), (60, 39, 106), (47, 58, 112), (43, 63, 113), + (49, 66, 109), (67, 41, 112), (86, 31, 123), (106, 22, 134), + (126, 21, 175), (186, 17, 196), (190, 6, 192), (157, 0, 159), + (122, 36, 143), (100, 55, 141), (79, 74, 140), (82, 102, 161), + (72, 150, 188), (73, 159, 184), (81, 160, 177), (149, 164, 143), + (172, 189, 83), (135, 201, 91), (101, 206, 166), (55, 168, 184), + (57, 160, 179), (49, 156, 172), (45, 141, 163), (31, 128, 135), + (46, 66, 116), (48, 55, 110), (50, 44, 104), (48, 39, 94), + (46, 11, 77), (21, 19, 82), (36, 21, 90), (39, 34, 92), + (54, 34, 103), (65, 45, 108), (102, 48, 126), (143, 38, 141), + (169, 41, 138), (185, 95, 97), (151, 102, 98), (143, 95, 91), + (85, 58, 93), (50, 55, 111), (40, 48, 110), (31, 56, 110), + (37, 46, 101), (36, 34, 109), (47, 35, 109), (48, 41, 108), + (63, 59, 118), (119, 85, 118), (143, 104, 87), (153, 118, 90), + (155, 149, 53), (165, 152, 58), (185, 176, 71), (187, 179, 80), + (206, 159, 77), (203, 154, 88), (183, 161, 85), (171, 168, 87), + (161, 162, 82), (171, 161, 76), (173, 128, 95), (178, 131, 105), + (187, 146, 160), (171, 117, 153), (154, 53, 183), (146, 50, 176), + (159, 64, 184), (188, 135, 177), (186, 152, 189), (189, 156, 185), + (186, 156, 194), (63, 190, 222), (23, 220, 239), (23, 220, 239), + (54, 177, 210), (57, 154, 187), (58, 144, 167), (49, 86, 138), + (69, 66, 133), (74, 66, 123), (105, 115, 62), (174, 122, 13), + (199, 119, 20), (208, 137, 0), (209, 144, 14), (203, 151, 13), + (206, 143, 12), (200, 136, 13), (191, 124, 17), (179, 113, 17), + (165, 124, 0), (177, 133, 0), (213, 155, 12), (197, 144, 2) + ), + +// 499 Before_Dawn +((85, 88, 111), (80, 81, 94), (91, 90, 103), (102, 100, 113), + (118, 117, 129), (135, 134, 145), (139, 138, 149), (144, 143, 154), + (143, 142, 158), (134, 134, 150), (126, 126, 142), (107, 108, 125), + (88, 91, 109), (73, 75, 90), (58, 59, 71), (49, 51, 62), + (41, 43, 54), (16, 18, 27), (11, 12, 19), (6, 7, 12), + (5, 5, 8), (4, 4, 4), (3, 3, 3), (3, 3, 3), + (2, 3, 2), (1, 2, 2), (1, 2, 3), (1, 1, 2), + (1, 0, 2), (0, 0, 2), (0, 0, 2), (0, 0, 3), + (0, 0, 4), (0, 0, 6), (0, 0, 7), (0, 1, 9), + (1, 2, 12), (3, 4, 15), (4, 6, 17), (6, 8, 20), + (16, 20, 34), (24, 28, 46), (32, 37, 58), (36, 43, 68), + (40, 50, 79), (40, 50, 79), (41, 50, 79), (40, 48, 78), + (36, 46, 78), (25, 35, 67), (20, 28, 53), (15, 22, 40), + (12, 18, 36), (10, 15, 33), (10, 14, 31), (10, 13, 29), + (9, 12, 20), (7, 10, 19), (6, 8, 18), (4, 6, 16), + (3, 5, 14), (2, 4, 13), (2, 4, 13), (1, 3, 12), + (1, 3, 11), (1, 2, 8), (1, 2, 8), (1, 2, 9), + (1, 2, 10), (2, 3, 11), (4, 5, 15), (5, 7, 20), + (8, 12, 27), (9, 13, 30), (10, 14, 33), (10, 14, 32), + (10, 15, 32), (10, 14, 29), (10, 14, 27), (10, 13, 24), + (9, 12, 23), (11, 15, 26), (13, 17, 30), (16, 19, 35), + (18, 21, 38), (20, 24, 42), (25, 30, 49), (28, 34, 56), + (42, 48, 74), (51, 56, 82), (60, 64, 90), (62, 66, 94), + (64, 69, 99), (66, 73, 102), (66, 72, 103), (65, 69, 98), + (60, 64, 92), (40, 46, 70), (31, 36, 56), (23, 26, 42), + (20, 22, 36), (18, 19, 30), (11, 14, 24), (9, 12, 22), + (13, 15, 26), (20, 23, 36), (28, 32, 47), (33, 37, 53), + (38, 42, 60), (46, 52, 79), (50, 59, 95), (51, 60, 103), + (51, 58, 99), (42, 50, 88), (35, 43, 82), (29, 37, 77), + (20, 25, 59), (13, 15, 38), (8, 10, 23), (4, 5, 15), + (2, 2, 10), (4, 4, 13), (6, 7, 16), (8, 9, 20), + (10, 12, 24), (17, 19, 34), (27, 30, 49), (40, 43, 65), + (51, 56, 82), (71, 80, 112), (77, 85, 118), (83, 91, 124), + (93, 100, 132), (97, 104, 132), (98, 106, 132), (95, 101, 125), + (84, 85, 105), (77, 77, 93), (71, 69, 82), (66, 65, 77), + (62, 61, 73), (56, 54, 68), (54, 52, 67), (56, 52, 64), + (58, 55, 67), (69, 69, 91), (73, 72, 97), (77, 76, 103), + (84, 84, 113), (94, 94, 124), (105, 107, 139), (116, 117, 149), + (125, 126, 150), (123, 126, 148), (122, 126, 147), (115, 118, 141), + (105, 108, 128), (90, 92, 111), (72, 75, 92), (52, 55, 74), + (35, 37, 56), (13, 14, 24), (10, 10, 19), (7, 7, 14), + (3, 3, 7), (1, 0, 3), (0, 0, 1), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 1, 1), (1, 2, 2), (2, 3, 3), (5, 6, 7), + (10, 11, 13), (17, 19, 24), (29, 30, 38), (45, 46, 56), + (65, 65, 76), (84, 84, 100), (106, 106, 125), (126, 130, 154), + (169, 173, 199), (177, 181, 205), (186, 189, 211), (197, 200, 223), + (212, 217, 238), (224, 228, 248), (233, 236, 247), (234, 235, 245), + (236, 237, 246), (238, 236, 245), (236, 235, 241), (225, 226, 236), + (214, 215, 230), (209, 208, 224), (208, 205, 218), (202, 202, 216), + (195, 195, 211), (191, 191, 207), (192, 192, 205), (191, 193, 205), + (188, 189, 204), (182, 183, 201), (175, 176, 194), (163, 166, 185), + (151, 154, 175), (133, 138, 162), (116, 120, 146), (94, 98, 122), + (74, 77, 101), (52, 57, 82), (35, 41, 64), (21, 25, 44), + (10, 13, 29), (3, 5, 20), (0, 2, 15), (0, 1, 10), + (2, 2, 7), (4, 4, 8), (7, 8, 13), (13, 14, 20), + (22, 23, 29), (35, 37, 42), (51, 54, 62), (71, 73, 84), + (90, 93, 107), (108, 111, 127), (125, 129, 146), (142, 145, 164), + (155, 156, 175), (162, 162, 183), (165, 166, 187), (164, 165, 189), + (157, 159, 184), (146, 148, 174), (135, 138, 162), (123, 127, 153), + (104, 111, 139), (82, 90, 120), (63, 72, 99), (50, 58, 82), + (38, 45, 66), (26, 33, 53), (19, 26, 45), (19, 25, 43), + (23, 28, 46), (33, 37, 55), (45, 51, 69), (61, 68, 88), + (74, 81, 104), (68, 74, 95), (64, 68, 87), (65, 69, 89) + ), + +// 500 Beginning_to_Thaw +((205, 239, 212), (205, 231, 216), (202, 226, 212), (200, 222, 209), + (191, 210, 195), (182, 198, 181), (175, 189, 171), (168, 180, 161), + (131, 153, 115), (119, 141, 97), (107, 130, 80), (112, 123, 79), + (117, 116, 79), (128, 124, 83), (139, 132, 87), (145, 137, 89), + (151, 142, 92), (179, 162, 122), (185, 169, 136), (191, 177, 151), + (191, 188, 158), (191, 199, 165), (191, 202, 169), (191, 205, 173), + (187, 191, 178), (181, 185, 163), (176, 179, 149), (169, 168, 142), + (163, 157, 135), (161, 150, 134), (160, 144, 134), (155, 138, 117), + (152, 140, 106), (151, 140, 103), (156, 139, 114), (162, 138, 126), + (170, 147, 132), (178, 156, 138), (180, 159, 137), (183, 163, 137), + (176, 148, 129), (159, 135, 114), (143, 123, 100), (121, 110, 81), + (99, 98, 63), (87, 91, 54), (76, 84, 46), (57, 77, 28), + (41, 66, 17), (31, 66, 8), (38, 70, 8), (46, 75, 9), + (51, 79, 11), (56, 83, 14), (59, 86, 19), (62, 90, 25), + (86, 120, 51), (97, 126, 60), (109, 133, 70), (106, 132, 82), + (103, 132, 94), (99, 134, 105), (96, 136, 116), (101, 147, 138), + (105, 159, 156), (117, 166, 169), (113, 158, 170), (110, 151, 172), + (110, 149, 172), (111, 147, 172), (116, 142, 169), (128, 140, 156), + (135, 117, 124), (138, 105, 109), (141, 93, 94), (137, 88, 86), + (133, 83, 79), (134, 82, 77), (135, 81, 76), (142, 84, 83), + (154, 93, 96), (167, 121, 128), (166, 128, 139), (166, 135, 151), + (169, 137, 155), (173, 139, 159), (182, 142, 161), (188, 146, 156), + (180, 135, 128), (173, 120, 108), (166, 106, 89), (162, 102, 80), + (158, 98, 72), (153, 87, 56), (144, 82, 44), (142, 80, 37), + (142, 78, 37), (144, 81, 53), (134, 80, 60), (125, 80, 68), + (119, 81, 68), (113, 83, 68), (101, 84, 67), (96, 82, 67), + (86, 77, 72), (82, 91, 79), (78, 105, 86), (77, 112, 89), + (77, 120, 93), (84, 137, 100), (99, 152, 107), (115, 172, 126), + (138, 197, 144), (164, 229, 171), (167, 231, 170), (171, 234, 169), + (169, 234, 159), (165, 224, 151), (161, 211, 143), (150, 192, 135), + (134, 153, 106), (127, 133, 85), (120, 114, 64), (115, 102, 56), + (111, 91, 49), (100, 74, 38), (93, 58, 31), (86, 53, 23), + (86, 54, 16), (92, 61, 18), (92, 63, 21), (93, 65, 24), + (95, 78, 34), (105, 99, 48), (122, 119, 61), (138, 140, 80), + (151, 166, 115), (157, 175, 129), (164, 184, 143), (165, 186, 147), + (167, 189, 151), (163, 187, 150), (144, 178, 149), (126, 165, 145), + (116, 151, 141), (113, 141, 140), (112, 140, 140), (111, 139, 141), + (107, 141, 142), (112, 145, 144), (124, 153, 149), (146, 169, 156), + (183, 196, 180), (188, 201, 185), (193, 207, 191), (199, 216, 201), + (205, 224, 203), (215, 226, 202), (221, 228, 200), (223, 227, 200), + (217, 229, 207), (200, 223, 215), (198, 221, 215), (196, 220, 215), + (193, 219, 216), (188, 225, 219), (182, 226, 220), (180, 222, 218), + (188, 215, 209), (189, 216, 208), (191, 217, 208), (195, 219, 204), + (204, 218, 200), (206, 211, 192), (215, 205, 182), (218, 201, 178), + (215, 199, 177), (218, 199, 179), (212, 194, 181), (207, 191, 183), + (203, 190, 186), (196, 189, 186), (195, 190, 184), (196, 190, 183), + (195, 204, 187), (195, 208, 190), (195, 213, 194), (195, 221, 197), + (203, 224, 201), (205, 229, 207), (211, 237, 214), (216, 246, 226), + (216, 250, 233), (221, 249, 239), (225, 243, 241), (231, 239, 240), + (236, 239, 241), (237, 240, 240), (235, 242, 242), (230, 239, 243), + (227, 234, 240), (223, 228, 233), (222, 224, 225), (218, 221, 219), + (212, 213, 212), (209, 205, 204), (208, 194, 196), (212, 186, 189), + (218, 181, 188), (224, 178, 185), (229, 180, 181), (232, 184, 176), + (238, 191, 173), (241, 200, 179), (241, 209, 187), (237, 216, 195), + (231, 225, 199), (224, 230, 199), (220, 233, 201), (214, 232, 203), + (210, 227, 206), (207, 221, 207), (206, 216, 208), (209, 214, 209), + (211, 212, 211), (217, 214, 213), (218, 215, 210), (224, 219, 207), + (232, 223, 206), (238, 227, 208), (240, 230, 214), (232, 233, 219), + (220, 233, 218), (210, 229, 215), (200, 224, 211), (196, 213, 208), + (186, 202, 202), (176, 189, 194), (172, 178, 188), (170, 167, 178), + (176, 160, 175), (179, 156, 170), (183, 152, 162), (192, 152, 161), + (204, 152, 157), (216, 155, 159), (227, 164, 160), (231, 175, 154), + (231, 186, 153), (231, 196, 156), (223, 202, 159), (219, 208, 164), + (214, 215, 169), (211, 224, 175), (210, 233, 188), (207, 237, 203) + ), + +// 501 Beige +((106, 95, 83), (97, 88, 77), (89, 81, 72), (81, 74, 67), + (69, 64, 60), (57, 54, 53), (55, 53, 52), (53, 52, 51), + (50, 50, 49), (50, 50, 49), (51, 51, 49), (53, 52, 50), + (56, 54, 51), (59, 56, 53), (62, 58, 56), (62, 59, 56), + (63, 60, 57), (63, 61, 58), (63, 61, 58), (63, 61, 59), + (64, 62, 59), (66, 63, 60), (67, 63, 60), (68, 63, 61), + (67, 62, 60), (67, 62, 59), (67, 62, 59), (68, 63, 60), + (70, 65, 62), (72, 66, 64), (74, 68, 66), (77, 70, 69), + (79, 72, 71), (83, 74, 72), (83, 74, 72), (83, 75, 72), + (84, 75, 72), (85, 76, 73), (85, 76, 73), (85, 77, 74), + (88, 78, 74), (90, 79, 74), (92, 80, 74), (94, 81, 74), + (96, 83, 75), (97, 84, 75), (98, 85, 75), (102, 88, 76), + (107, 91, 77), (120, 98, 82), (123, 100, 84), (127, 103, 87), + (126, 104, 88), (126, 106, 89), (125, 106, 89), (125, 106, 89), + (123, 104, 87), (122, 102, 86), (121, 100, 85), (116, 97, 83), + (112, 95, 81), (109, 93, 80), (106, 91, 79), (99, 86, 76), + (95, 82, 73), (89, 76, 67), (89, 75, 66), (90, 75, 66), + (90, 75, 66), (91, 76, 67), (93, 78, 69), (96, 81, 73), + (105, 89, 80), (110, 93, 84), (115, 98, 88), (118, 101, 91), + (121, 105, 94), (122, 106, 95), (123, 107, 97), (122, 108, 99), + (120, 107, 99), (114, 102, 94), (107, 97, 89), (100, 92, 85), + (96, 89, 82), (92, 86, 80), (84, 79, 74), (76, 72, 68), + (65, 61, 57), (61, 56, 53), (58, 52, 49), (57, 51, 48), + (56, 50, 47), (55, 49, 46), (55, 49, 46), (56, 49, 46), + (58, 50, 46), (65, 54, 46), (69, 56, 47), (73, 58, 48), + (74, 59, 48), (75, 60, 49), (77, 62, 52), (80, 65, 54), + (90, 74, 60), (97, 79, 64), (104, 84, 68), (107, 86, 70), + (110, 89, 73), (117, 95, 78), (122, 101, 83), (125, 105, 88), + (128, 109, 93), (133, 114, 100), (133, 115, 101), (133, 116, 102), + (134, 116, 104), (133, 115, 103), (129, 114, 101), (124, 110, 98), + (112, 101, 91), (106, 97, 88), (100, 93, 85), (98, 91, 83), + (97, 89, 81), (94, 86, 78), (91, 83, 73), (88, 79, 70), + (84, 76, 68), (76, 71, 63), (75, 70, 62), (74, 70, 62), + (73, 69, 63), (73, 69, 62), (74, 69, 62), (74, 69, 62), + (76, 70, 63), (78, 71, 64), (81, 72, 66), (82, 73, 67), + (84, 75, 68), (88, 78, 70), (94, 84, 75), (103, 91, 82), + (115, 100, 91), (148, 127, 112), (157, 135, 118), (166, 143, 125), + (180, 157, 136), (191, 167, 145), (197, 172, 150), (198, 174, 152), + (195, 170, 149), (194, 169, 148), (193, 168, 148), (189, 166, 143), + (183, 162, 139), (173, 153, 133), (161, 142, 124), (143, 128, 113), + (125, 112, 100), (94, 85, 76), (88, 80, 72), (82, 76, 69), + (72, 68, 63), (66, 62, 59), (60, 58, 56), (56, 55, 53), + (52, 53, 52), (52, 53, 52), (52, 53, 52), (53, 53, 52), + (53, 53, 52), (54, 53, 52), (55, 54, 53), (58, 55, 53), + (60, 57, 55), (63, 59, 57), (67, 61, 59), (71, 65, 63), + (78, 70, 67), (85, 75, 72), (93, 83, 78), (103, 91, 86), + (119, 103, 97), (121, 105, 99), (123, 107, 101), (125, 109, 102), + (125, 109, 101), (124, 108, 100), (123, 109, 102), (122, 107, 100), + (121, 106, 98), (117, 103, 95), (111, 98, 91), (104, 91, 85), + (94, 84, 77), (84, 77, 71), (75, 70, 65), (69, 65, 61), + (64, 61, 57), (60, 58, 55), (58, 55, 54), (57, 54, 53), + (57, 54, 52), (57, 54, 52), (57, 54, 52), (57, 53, 52), + (56, 53, 52), (56, 53, 52), (56, 52, 51), (56, 52, 50), + (56, 51, 50), (56, 51, 49), (57, 52, 49), (57, 52, 50), + (59, 54, 51), (60, 55, 52), (63, 58, 54), (67, 61, 55), + (71, 64, 58), (76, 68, 61), (81, 73, 64), (84, 76, 68), + (88, 79, 71), (90, 81, 73), (92, 83, 74), (93, 83, 75), + (92, 83, 74), (93, 83, 73), (91, 82, 73), (89, 80, 71), + (85, 77, 69), (81, 73, 66), (76, 69, 63), (70, 64, 59), + (65, 60, 56), (61, 56, 53), (57, 53, 51), (55, 52, 49), + (54, 51, 48), (56, 52, 48), (58, 54, 49), (61, 57, 51), + (65, 61, 54), (70, 66, 57), (77, 71, 62), (86, 79, 67), + (96, 87, 73), (108, 98, 80), (110, 100, 82), (111, 101, 83), + (111, 100, 83), (108, 97, 82), (105, 95, 81), (101, 90, 80) + ), + +// 502 Berry_Bush +((160, 10, 24), (195, 13, 23), (194, 17, 27), (193, 22, 31), + (180, 30, 34), (168, 38, 38), (162, 42, 41), (156, 46, 44), + (141, 61, 52), (132, 71, 55), (124, 82, 59), (110, 86, 58), + (96, 91, 58), (83, 86, 58), (70, 82, 58), (67, 79, 59), + (65, 76, 60), (73, 70, 59), (86, 66, 52), (100, 62, 46), + (108, 53, 44), (117, 44, 43), (120, 41, 43), (124, 39, 43), + (149, 38, 34), (167, 45, 29), (185, 52, 24), (198, 63, 26), + (211, 74, 28), (212, 79, 28), (213, 85, 28), (208, 97, 28), + (200, 111, 28), (190, 140, 35), (190, 151, 39), (190, 162, 43), + (186, 168, 40), (183, 175, 38), (177, 176, 39), (171, 178, 40), + (131, 192, 59), (117, 193, 66), (104, 195, 74), (95, 188, 67), + (87, 182, 61), (82, 178, 58), (78, 175, 56), (72, 174, 57), + (69, 170, 67), (42, 160, 64), (36, 147, 55), (31, 135, 46), + (44, 123, 47), (57, 112, 49), (58, 109, 51), (60, 107, 53), + (52, 120, 71), (40, 126, 74), (29, 132, 77), (35, 126, 78), + (42, 121, 79), (43, 123, 78), (44, 126, 77), (39, 133, 75), + (34, 148, 72), (31, 181, 66), (45, 177, 53), (59, 173, 41), + (65, 165, 36), (71, 157, 31), (78, 140, 22), (77, 134, 16), + (66, 115, 16), (68, 104, 19), (71, 93, 23), (77, 79, 26), + (83, 65, 29), (83, 57, 30), (84, 50, 32), (84, 41, 27), + (80, 36, 23), (97, 44, 22), (108, 55, 23), (120, 66, 25), + (123, 69, 25), (127, 73, 26), (125, 72, 21), (121, 68, 19), + (104, 60, 13), (96, 63, 16), (88, 66, 19), (79, 65, 19), + (71, 64, 19), (54, 62, 19), (38, 57, 22), (20, 48, 22), + (14, 45, 19), (18, 53, 28), (29, 60, 34), (41, 67, 41), + (47, 71, 46), (53, 76, 51), (67, 83, 59), (81, 97, 63), + (110, 116, 71), (119, 126, 72), (129, 137, 73), (129, 142, 76), + (130, 147, 80), (122, 163, 84), (116, 176, 90), (108, 181, 100), + (98, 174, 94), (77, 154, 78), (67, 151, 74), (58, 149, 70), + (41, 153, 61), (26, 164, 68), (16, 168, 64), (11, 164, 58), + (27, 130, 44), (44, 118, 34), (61, 107, 24), (71, 109, 22), + (81, 111, 20), (99, 119, 16), (114, 128, 15), (128, 128, 21), + (148, 125, 30), (179, 130, 75), (177, 134, 83), (175, 138, 92), + (166, 154, 107), (147, 168, 120), (125, 181, 124), (115, 196, 141), + (89, 214, 168), (75, 220, 169), (61, 227, 170), (55, 224, 160), + (49, 222, 150), (47, 215, 136), (50, 209, 119), (54, 207, 109), + (57, 205, 93), (50, 210, 71), (52, 210, 67), (55, 210, 64), + (54, 206, 58), (50, 202, 55), (49, 201, 50), (40, 198, 45), + (27, 196, 40), (26, 191, 40), (25, 186, 40), (22, 177, 42), + (24, 174, 45), (25, 173, 47), (22, 172, 55), (22, 177, 60), + (22, 180, 67), (19, 183, 86), (18, 186, 92), (18, 190, 99), + (15, 196, 118), (13, 204, 133), (11, 211, 144), (10, 217, 149), + (21, 214, 145), (28, 209, 143), (35, 204, 141), (51, 191, 135), + (69, 170, 126), (87, 150, 110), (101, 133, 98), (118, 118, 82), + (137, 101, 70), (153, 89, 59), (170, 74, 49), (181, 58, 39), + (182, 46, 35), (176, 39, 33), (164, 33, 35), (151, 35, 36), + (119, 48, 39), (110, 56, 41), (101, 65, 43), (82, 83, 54), + (61, 99, 68), (43, 115, 82), (30, 131, 95), (19, 142, 101), + (14, 157, 108), (10, 176, 117), (6, 191, 128), (6, 203, 138), + (10, 214, 146), (17, 216, 147), (31, 207, 145), (48, 199, 137), + (66, 188, 124), (86, 171, 109), (102, 156, 96), (112, 146, 82), + (122, 135, 76), (135, 127, 74), (142, 118, 68), (149, 107, 60), + (156, 92, 53), (154, 82, 45), (143, 76, 40), (134, 78, 43), + (118, 83, 47), (100, 94, 55), (86, 108, 63), (75, 116, 70), + (61, 122, 70), (51, 129, 70), (42, 134, 67), (33, 135, 64), + (28, 139, 62), (23, 142, 61), (20, 147, 61), (17, 153, 60), + (14, 158, 58), (10, 156, 57), (10, 151, 52), (14, 139, 46), + (20, 130, 42), (29, 119, 39), (39, 115, 38), (49, 117, 44), + (59, 121, 50), (76, 113, 55), (91, 104, 57), (109, 91, 58), + (119, 79, 58), (126, 71, 57), (122, 71, 55), (119, 68, 53), + (111, 62, 50), (109, 56, 48), (100, 49, 49), (91, 41, 50), + (77, 37, 56), (62, 39, 56), (45, 34, 54), (35, 30, 51), + (34, 26, 45), (46, 24, 38), (64, 18, 41), (85, 17, 41), + (105, 12, 40), (119, 10, 39), (126, 7, 34), (143, 10, 27) + ), + +// 503 Biology_Class +((157, 53, 16), (163, 96, 4), (158, 117, 4), (154, 138, 4), + (145, 159, 7), (136, 181, 10), (132, 189, 11), (129, 198, 12), + (103, 216, 9), (83, 213, 10), (64, 210, 11), (49, 198, 11), + (35, 186, 12), (27, 169, 15), (19, 152, 19), (14, 141, 20), + (10, 131, 22), (3, 86, 22), (3, 68, 23), (4, 50, 24), + (11, 48, 24), (19, 46, 25), (24, 50, 22), (30, 55, 19), + (43, 77, 8), (46, 86, 4), (50, 95, 1), (50, 100, 0), + (50, 106, 0), (48, 105, 2), (46, 105, 4), (47, 102, 10), + (44, 92, 19), (35, 60, 39), (36, 46, 50), (38, 33, 62), + (51, 26, 77), (64, 20, 92), (73, 19, 99), (83, 19, 106), + (113, 15, 127), (126, 15, 134), (139, 15, 141), (144, 16, 146), + (150, 17, 151), (148, 18, 151), (146, 19, 152), (137, 22, 149), + (126, 22, 152), (93, 18, 153), (77, 17, 142), (61, 16, 132), + (51, 15, 122), (41, 15, 112), (38, 15, 106), (35, 16, 101), + (27, 19, 74), (24, 22, 67), (21, 25, 60), (19, 31, 58), + (17, 38, 57), (15, 43, 56), (13, 48, 55), (7, 56, 49), + (3, 69, 45), (13, 96, 40), (20, 105, 37), (27, 115, 34), + (28, 116, 29), (29, 117, 24), (32, 116, 15), (35, 114, 10), + (45, 106, 28), (44, 97, 39), (44, 88, 50), (37, 78, 56), + (30, 68, 62), (27, 63, 65), (25, 59, 68), (20, 55, 73), + (18, 53, 80), (15, 52, 82), (13, 52, 79), (11, 53, 76), + (10, 54, 72), (9, 55, 69), (8, 60, 59), (11, 70, 51), + (29, 101, 42), (36, 119, 35), (44, 137, 28), (47, 144, 24), + (50, 152, 20), (56, 164, 15), (66, 173, 18), (77, 179, 26), + (86, 179, 34), (94, 160, 48), (91, 142, 51), (88, 124, 55), + (86, 118, 55), (84, 112, 56), (77, 99, 54), (67, 92, 51), + (42, 91, 39), (35, 99, 35), (28, 107, 32), (25, 111, 31), + (23, 115, 31), (25, 127, 30), (36, 138, 29), (49, 145, 31), + (62, 149, 34), (86, 144, 38), (93, 140, 38), (101, 136, 39), + (114, 125, 39), (122, 110, 38), (130, 97, 33), (131, 82, 30), + (128, 53, 37), (125, 39, 47), (122, 26, 57), (120, 21, 60), + (119, 16, 64), (110, 8, 69), (96, 5, 76), (81, 3, 85), + (70, 7, 95), (47, 21, 105), (40, 25, 102), (34, 30, 100), + (19, 36, 92), (8, 44, 83), (4, 55, 71), (3, 70, 62), + (19, 104, 46), (31, 118, 39), (43, 132, 32), (48, 139, 28), + (53, 146, 25), (63, 159, 21), (70, 167, 18), (78, 169, 21), + (83, 168, 24), (84, 153, 27), (83, 145, 27), (83, 138, 28), + (84, 120, 29), (87, 101, 29), (89, 80, 31), (97, 61, 32), + (110, 32, 30), (112, 27, 27), (115, 23, 24), (113, 20, 19), + (112, 19, 17), (109, 21, 12), (103, 27, 12), (97, 31, 8), + (87, 34, 4), (72, 43, 0), (72, 49, 0), (72, 56, 0), + (77, 71, 0), (83, 81, 0), (84, 85, 3), (81, 87, 6), + (67, 97, 13), (64, 100, 14), (61, 104, 16), (55, 106, 20), + (45, 106, 23), (33, 103, 25), (19, 98, 27), (8, 93, 33), + (2, 86, 42), (1, 80, 51), (1, 73, 60), (3, 61, 62), + (12, 50, 66), (25, 41, 76), (40, 33, 81), (53, 26, 86), + (66, 7, 75), (69, 4, 71), (73, 2, 67), (80, 4, 58), + (88, 15, 50), (94, 31, 45), (95, 49, 39), (90, 63, 32), + (81, 72, 26), (74, 83, 21), (68, 92, 19), (66, 100, 20), + (64, 102, 20), (60, 95, 19), (61, 86, 22), (61, 73, 27), + (63, 58, 34), (62, 45, 41), (55, 29, 42), (49, 19, 47), + (45, 15, 54), (42, 15, 63), (41, 18, 77), (36, 22, 85), + (25, 25, 93), (14, 30, 99), (4, 36, 104), (0, 43, 110), + (0, 50, 114), (0, 53, 117), (3, 55, 117), (10, 55, 113), + (19, 56, 105), (30, 58, 93), (40, 58, 79), (48, 60, 64), + (56, 58, 53), (61, 56, 45), (66, 57, 43), (66, 55, 44), + (63, 58, 49), (59, 62, 57), (50, 66, 67), (41, 76, 81), + (29, 83, 91), (19, 89, 96), (13, 98, 96), (8, 105, 91), + (7, 117, 87), (12, 127, 82), (22, 128, 72), (32, 122, 59), + (44, 111, 43), (53, 99, 28), (67, 90, 23), (88, 82, 21), + (108, 70, 25), (126, 61, 37), (139, 50, 44), (150, 39, 53), + (163, 34, 62), (173, 27, 68), (179, 25, 78), (181, 23, 84), + (180, 20, 86), (179, 17, 85), (177, 10, 77), (175, 5, 66), + (170, 3, 54), (165, 7, 42), (160, 17, 31), (157, 33, 23) + ), + +// 504 Birthday_Party +((55, 78, 72), (63, 106, 50), (58, 130, 45), (53, 155, 41), + (60, 159, 59), (68, 164, 78), (74, 164, 86), (80, 164, 95), + (98, 167, 109), (109, 167, 131), (121, 168, 154), (129, 163, 171), + (138, 158, 188), (142, 162, 186), (147, 167, 185), (148, 165, 184), + (149, 164, 184), (154, 169, 196), (154, 173, 199), (155, 178, 202), + (153, 173, 193), (152, 169, 184), (152, 164, 177), (152, 160, 170), + (144, 123, 153), (143, 105, 142), (142, 87, 131), (144, 71, 116), + (147, 56, 102), (148, 51, 99), (150, 47, 96), (156, 41, 92), + (162, 36, 93), (165, 39, 82), (169, 43, 73), (173, 48, 65), + (179, 47, 60), (186, 46, 55), (185, 44, 51), (185, 43, 47), + (178, 32, 35), (180, 27, 40), (183, 23, 46), (189, 20, 58), + (196, 18, 71), (199, 19, 76), (202, 20, 81), (201, 25, 93), + (203, 33, 100), (209, 53, 112), (212, 58, 121), (215, 63, 131), + (204, 63, 131), (193, 64, 131), (184, 64, 125), (175, 65, 120), + (150, 94, 102), (140, 99, 94), (131, 104, 87), (129, 105, 73), + (128, 106, 59), (127, 109, 54), (127, 113, 49), (133, 118, 55), + (137, 108, 59), (151, 77, 65), (151, 64, 78), (152, 51, 92), + (150, 43, 98), (149, 35, 105), (155, 25, 102), (149, 20, 98), + (125, 32, 80), (123, 49, 79), (121, 66, 78), (124, 88, 70), + (127, 111, 63), (127, 120, 60), (127, 130, 58), (119, 144, 64), + (114, 154, 75), (132, 172, 96), (139, 177, 105), (147, 183, 115), + (141, 181, 118), (136, 180, 121), (131, 166, 121), (125, 158, 115), + (129, 137, 103), (129, 122, 103), (130, 108, 104), (132, 102, 105), + (135, 97, 106), (135, 90, 113), (138, 84, 120), (144, 82, 133), + (144, 82, 151), (147, 95, 187), (138, 112, 196), (129, 130, 205), + (125, 137, 206), (121, 145, 207), (116, 155, 205), (121, 156, 204), + (126, 158, 185), (131, 155, 177), (136, 152, 169), (140, 146, 168), + (145, 140, 167), (147, 125, 164), (144, 109, 160), (136, 99, 152), + (126, 88, 141), (107, 79, 120), (104, 74, 118), (101, 69, 116), + (93, 65, 112), (87, 67, 106), (88, 75, 103), (96, 88, 99), + (125, 94, 120), (140, 95, 135), (155, 97, 150), (160, 100, 153), + (166, 103, 157), (176, 108, 155), (183, 108, 158), (192, 110, 161), + (196, 109, 164), (207, 133, 151), (201, 140, 148), (195, 148, 145), + (186, 165, 140), (165, 173, 150), (148, 183, 164), (136, 196, 173), + (102, 218, 178), (85, 216, 176), (69, 215, 175), (64, 215, 174), + (60, 215, 174), (51, 202, 175), (62, 193, 164), (84, 182, 149), + (108, 165, 136), (146, 144, 129), (155, 139, 129), (164, 135, 129), + (186, 126, 128), (204, 114, 127), (213, 107, 122), (212, 102, 120), + (191, 100, 104), (186, 96, 98), (182, 93, 92), (167, 95, 77), + (152, 93, 65), (139, 93, 53), (130, 91, 50), (131, 85, 55), + (131, 90, 59), (116, 111, 79), (112, 114, 84), (109, 118, 89), + (110, 115, 107), (118, 109, 128), (131, 106, 150), (134, 114, 165), + (138, 121, 176), (139, 120, 178), (140, 119, 180), (150, 106, 189), + (154, 97, 193), (157, 91, 198), (151, 88, 203), (139, 83, 192), + (131, 75, 187), (120, 61, 179), (121, 48, 160), (116, 39, 155), + (116, 27, 131), (120, 21, 109), (126, 20, 94), (146, 24, 79), + (170, 46, 79), (171, 52, 79), (172, 58, 80), (168, 72, 84), + (169, 83, 96), (163, 98, 119), (155, 110, 136), (142, 118, 156), + (128, 126, 169), (119, 128, 173), (112, 130, 179), (109, 125, 170), + (99, 112, 162), (92, 99, 151), (91, 85, 135), (90, 79, 122), + (102, 71, 103), (107, 59, 83), (116, 49, 64), (129, 44, 50), + (138, 58, 45), (154, 78, 44), (169, 101, 52), (181, 109, 57), + (191, 110, 67), (198, 115, 76), (202, 111, 85), (208, 119, 108), + (211, 110, 127), (215, 97, 139), (215, 86, 145), (214, 69, 136), + (210, 62, 128), (200, 49, 122), (194, 43, 108), (191, 37, 99), + (197, 36, 81), (207, 45, 67), (204, 42, 59), (195, 43, 50), + (186, 37, 47), (187, 33, 45), (199, 40, 52), (213, 51, 65), + (218, 65, 77), (208, 79, 94), (197, 93, 108), (179, 102, 119), + (164, 118, 132), (150, 125, 138), (133, 131, 142), (118, 131, 149), + (103, 125, 161), (91, 125, 172), (78, 122, 184), (76, 132, 185), + (75, 138, 184), (80, 147, 188), (83, 156, 188), (84, 156, 190), + (86, 160, 182), (85, 156, 167), (87, 151, 161), (77, 148, 149), + (72, 133, 138), (66, 113, 127), (68, 90, 109), (71, 63, 102), + (67, 59, 93), (63, 62, 80), (49, 70, 79), (55, 81, 75) + ), + +// 505 Bistro +((181, 69, 63), (185, 79, 72), (191, 77, 72), (197, 76, 72), + (196, 67, 65), (195, 58, 58), (191, 53, 54), (188, 48, 50), + (173, 41, 43), (171, 42, 46), (169, 44, 49), (171, 48, 51), + (174, 52, 53), (175, 58, 54), (176, 65, 55), (176, 66, 53), + (177, 67, 51), (183, 76, 48), (190, 83, 47), (197, 91, 46), + (204, 109, 39), (211, 127, 33), (211, 131, 30), (211, 136, 27), + (196, 129, 17), (186, 120, 16), (176, 111, 15), (168, 112, 16), + (161, 114, 17), (156, 113, 19), (152, 112, 21), (140, 104, 25), + (128, 91, 30), (112, 68, 44), (113, 72, 51), (115, 77, 58), + (124, 92, 69), (133, 107, 80), (137, 112, 84), (142, 117, 89), + (165, 138, 104), (173, 142, 106), (181, 147, 109), (180, 145, 108), + (179, 144, 107), (175, 139, 105), (171, 135, 103), (164, 123, 95), + (157, 106, 85), (154, 81, 66), (152, 73, 61), (150, 65, 57), + (151, 62, 58), (152, 60, 60), (154, 61, 61), (157, 62, 62), + (162, 65, 62), (162, 64, 62), (162, 63, 63), (160, 61, 62), + (158, 59, 62), (157, 59, 60), (156, 60, 59), (147, 56, 54), + (134, 49, 47), (101, 34, 28), (91, 32, 22), (81, 30, 17), + (80, 32, 16), (80, 34, 16), (84, 36, 16), (90, 39, 21), + (109, 50, 35), (117, 57, 37), (126, 64, 40), (137, 69, 36), + (149, 75, 32), (158, 80, 31), (168, 85, 31), (188, 96, 33), + (205, 115, 40), (225, 140, 56), (224, 144, 54), (223, 149, 53), + (223, 148, 49), (224, 148, 45), (228, 158, 38), (231, 165, 44), + (229, 181, 70), (226, 178, 76), (223, 175, 82), (224, 173, 73), + (225, 171, 64), (229, 166, 49), (232, 161, 40), (232, 160, 38), + (225, 156, 48), (208, 141, 49), (197, 133, 37), (186, 126, 26), + (181, 122, 22), (176, 118, 18), (158, 108, 15), (144, 95, 16), + (113, 68, 18), (104, 61, 15), (96, 54, 13), (93, 52, 10), + (91, 51, 8), (93, 47, 6), (94, 44, 6), (99, 43, 8), + (105, 41, 10), (123, 40, 15), (126, 38, 16), (130, 37, 18), + (138, 35, 20), (146, 36, 22), (152, 37, 25), (158, 40, 27), + (167, 43, 32), (172, 43, 34), (178, 43, 37), (179, 43, 39), + (180, 43, 41), (179, 43, 41), (175, 43, 38), (165, 43, 39), + (154, 45, 38), (148, 66, 45), (148, 73, 47), (149, 81, 50), + (148, 93, 55), (146, 102, 62), (142, 105, 67), (139, 105, 72), + (158, 121, 87), (171, 134, 94), (185, 147, 102), (189, 151, 104), + (194, 156, 107), (194, 156, 108), (193, 146, 107), (192, 138, 105), + (185, 128, 100), (165, 118, 82), (158, 117, 77), (151, 117, 73), + (141, 108, 62), (134, 98, 53), (124, 88, 46), (120, 77, 40), + (110, 58, 27), (106, 54, 25), (103, 50, 23), (96, 41, 21), + (89, 38, 20), (86, 34, 21), (86, 31, 21), (88, 29, 19), + (90, 27, 18), (74, 22, 17), (68, 21, 16), (62, 20, 15), + (51, 20, 15), (45, 19, 15), (50, 18, 14), (57, 18, 12), + (71, 19, 9), (72, 19, 9), (74, 20, 9), (74, 20, 9), + (75, 20, 9), (77, 18, 10), (76, 17, 9), (77, 16, 9), + (75, 15, 8), (71, 13, 6), (65, 13, 5), (58, 13, 6), + (48, 12, 6), (40, 10, 7), (32, 10, 6), (24, 9, 6), + (16, 12, 6), (15, 12, 6), (15, 13, 7), (17, 14, 9), + (18, 15, 10), (22, 15, 12), (24, 15, 14), (25, 16, 15), + (25, 18, 15), (27, 20, 15), (27, 22, 13), (31, 23, 13), + (38, 23, 14), (46, 23, 15), (58, 24, 14), (72, 23, 14), + (83, 21, 11), (93, 22, 9), (101, 22, 7), (104, 21, 7), + (104, 22, 7), (102, 23, 9), (102, 22, 11), (104, 23, 12), + (106, 22, 12), (105, 20, 14), (101, 21, 15), (95, 21, 18), + (89, 24, 21), (88, 28, 26), (94, 33, 31), (103, 40, 36), + (115, 49, 41), (131, 58, 49), (142, 71, 56), (152, 87, 65), + (164, 100, 76), (174, 117, 87), (184, 139, 97), (196, 154, 106), + (205, 165, 114), (213, 175, 120), (223, 182, 130), (226, 186, 138), + (232, 200, 147), (235, 210, 156), (236, 215, 161), (237, 213, 159), + (238, 205, 156), (228, 188, 147), (224, 176, 136), (217, 166, 126), + (209, 159, 117), (203, 150, 104), (197, 141, 93), (185, 127, 79), + (177, 109, 61), (168, 93, 44), (162, 76, 31), (162, 61, 18), + (164, 53, 15), (164, 48, 15), (162, 45, 15), (159, 47, 17), + (153, 48, 21), (152, 47, 21), (153, 43, 25), (163, 56, 40), + (172, 65, 49), (182, 69, 58), (186, 74, 65), (189, 80, 69) + ), + +// 506 Blossoms +((153, 135, 91), (143, 145, 101), (148, 139, 97), (153, 134, 93), + (165, 127, 89), (178, 121, 85), (187, 118, 85), (196, 116, 86), + (217, 118, 99), (222, 119, 102), (228, 121, 106), (231, 117, 104), + (234, 114, 103), (235, 116, 106), (236, 118, 109), (234, 120, 110), + (232, 123, 112), (220, 147, 123), (211, 156, 122), (202, 165, 122), + (192, 167, 119), (183, 169, 117), (179, 167, 116), (175, 165, 115), + (142, 158, 109), (125, 157, 106), (108, 156, 104), (98, 147, 99), + (88, 138, 94), (87, 132, 91), (87, 127, 89), (90, 114, 79), + (93, 110, 73), (96, 107, 62), (106, 106, 60), (116, 106, 59), + (133, 106, 61), (151, 106, 64), (160, 108, 67), (169, 111, 70), + (190, 118, 85), (195, 123, 92), (200, 128, 100), (199, 128, 106), + (198, 129, 112), (196, 126, 113), (195, 124, 115), (186, 117, 117), + (181, 109, 120), (165, 97, 110), (160, 94, 99), (156, 92, 88), + (157, 89, 77), (158, 86, 66), (162, 86, 62), (166, 86, 59), + (181, 85, 49), (186, 84, 45), (192, 84, 41), (194, 86, 39), + (196, 88, 38), (199, 90, 38), (202, 92, 39), (207, 100, 41), + (212, 109, 45), (212, 112, 63), (202, 113, 69), (193, 114, 75), + (189, 115, 74), (185, 117, 73), (176, 122, 73), (175, 129, 74), + (185, 128, 82), (190, 124, 85), (195, 120, 88), (193, 116, 85), + (191, 113, 83), (190, 109, 81), (189, 106, 80), (187, 99, 76), + (189, 89, 79), (191, 80, 85), (188, 82, 89), (186, 85, 93), + (183, 88, 94), (181, 92, 95), (181, 94, 98), (187, 102, 102), + (185, 113, 114), (182, 124, 119), (180, 136, 125), (179, 142, 126), + (178, 148, 128), (186, 163, 135), (199, 177, 140), (209, 187, 147), + (220, 192, 153), (221, 203, 162), (218, 202, 162), (215, 201, 162), + (217, 199, 159), (219, 197, 157), (228, 191, 151), (237, 183, 152), + (239, 170, 148), (237, 165, 145), (236, 160, 143), (237, 159, 140), + (238, 158, 138), (238, 155, 134), (240, 155, 135), (238, 155, 136), + (235, 159, 137), (228, 180, 141), (225, 187, 139), (222, 194, 138), + (219, 202, 134), (218, 205, 134), (220, 203, 135), (219, 203, 139), + (216, 197, 145), (202, 186, 136), (188, 175, 128), (183, 167, 124), + (179, 159, 120), (170, 144, 111), (169, 131, 106), (171, 126, 103), + (173, 122, 97), (159, 110, 78), (152, 109, 73), (146, 108, 68), + (128, 108, 60), (113, 117, 54), (106, 130, 51), (108, 143, 52), + (134, 170, 87), (143, 181, 110), (152, 192, 133), (153, 198, 141), + (154, 204, 149), (158, 214, 156), (166, 213, 163), (181, 212, 167), + (196, 206, 170), (221, 187, 166), (223, 184, 159), (226, 181, 153), + (226, 173, 134), (230, 169, 114), (228, 165, 93), (215, 159, 74), + (192, 144, 45), (184, 141, 41), (177, 139, 37), (170, 137, 32), + (173, 140, 27), (168, 144, 25), (162, 147, 23), (159, 144, 26), + (151, 143, 29), (152, 131, 34), (157, 131, 33), (162, 131, 33), + (173, 135, 30), (185, 134, 31), (197, 137, 28), (206, 135, 28), + (222, 120, 30), (227, 117, 30), (232, 115, 30), (240, 112, 32), + (246, 113, 36), (247, 115, 41), (249, 119, 47), (248, 115, 53), + (248, 109, 58), (248, 106, 58), (249, 106, 58), (243, 108, 61), + (240, 116, 66), (235, 121, 74), (226, 120, 82), (219, 113, 83), + (215, 99, 79), (214, 98, 79), (214, 98, 79), (216, 99, 83), + (215, 96, 90), (215, 90, 94), (214, 84, 93), (219, 82, 91), + (223, 85, 85), (231, 97, 77), (239, 105, 76), (244, 109, 72), + (246, 107, 67), (246, 105, 65), (243, 103, 62), (239, 110, 54), + (237, 118, 51), (231, 123, 47), (227, 120, 41), (225, 116, 38), + (219, 110, 38), (211, 103, 37), (204, 100, 40), (192, 99, 44), + (182, 99, 45), (172, 97, 44), (164, 98, 42), (152, 92, 37), + (142, 86, 34), (130, 81, 37), (119, 85, 44), (111, 92, 53), + (106, 108, 62), (102, 119, 70), (103, 124, 71), (105, 121, 69), + (107, 121, 69), (114, 120, 70), (121, 125, 73), (128, 133, 81), + (136, 138, 86), (146, 136, 86), (154, 132, 89), (164, 128, 89), + (175, 127, 89), (185, 130, 95), (194, 139, 103), (203, 146, 111), + (211, 155, 121), (218, 163, 129), (225, 169, 134), (231, 171, 139), + (235, 170, 139), (236, 166, 139), (235, 161, 137), (231, 155, 133), + (226, 147, 125), (223, 139, 116), (225, 130, 102), (227, 117, 89), + (227, 106, 76), (227, 98, 68), (224, 92, 62), (220, 92, 61), + (214, 100, 63), (208, 111, 68), (204, 119, 71), (189, 118, 73), + (175, 117, 72), (166, 115, 74), (156, 114, 75), (147, 120, 82) + ), + +// 507 Blue_Velvet +((55, 47, 96), (55, 48, 95), (55, 47, 93), (55, 47, 91), + (53, 45, 86), (52, 44, 81), (51, 42, 78), (50, 41, 76), + (46, 38, 68), (45, 37, 66), (45, 36, 64), (44, 35, 62), + (43, 35, 61), (43, 34, 59), (43, 34, 58), (43, 33, 57), + (43, 33, 57), (44, 35, 57), (44, 35, 58), (44, 36, 59), + (44, 35, 58), (45, 35, 58), (45, 35, 57), (46, 35, 57), + (47, 36, 58), (48, 37, 60), (49, 39, 62), (50, 40, 64), + (51, 41, 66), (51, 42, 67), (52, 43, 69), (52, 46, 74), + (55, 50, 81), (65, 67, 102), (66, 72, 110), (68, 77, 118), + (68, 77, 121), (68, 78, 124), (68, 78, 124), (69, 79, 124), + (70, 78, 121), (66, 71, 114), (63, 65, 108), (60, 59, 101), + (58, 54, 95), (56, 52, 93), (55, 51, 91), (52, 47, 87), + (51, 45, 85), (51, 45, 88), (50, 46, 90), (49, 47, 92), + (49, 47, 93), (49, 47, 94), (49, 47, 94), (50, 48, 95), + (53, 49, 95), (53, 48, 94), (54, 48, 93), (53, 48, 90), + (53, 48, 88), (52, 48, 86), (52, 48, 85), (52, 47, 83), + (52, 46, 83), (53, 48, 84), (53, 49, 84), (53, 50, 85), + (53, 50, 86), (53, 51, 87), (54, 52, 90), (55, 52, 92), + (56, 51, 92), (55, 50, 92), (55, 49, 92), (55, 48, 91), + (55, 48, 91), (56, 48, 91), (57, 48, 92), (58, 49, 94), + (59, 50, 97), (62, 59, 105), (65, 67, 113), (69, 76, 121), + (73, 81, 125), (77, 86, 129), (86, 97, 140), (101, 112, 149), + (138, 148, 174), (149, 157, 178), (160, 166, 182), (162, 167, 181), + (164, 168, 180), (160, 164, 178), (161, 168, 183), (154, 162, 181), + (146, 155, 175), (113, 128, 156), (99, 120, 153), (85, 113, 151), + (81, 111, 150), (78, 109, 150), (75, 106, 151), (76, 106, 151), + (82, 110, 154), (87, 114, 155), (92, 118, 157), (94, 119, 157), + (97, 121, 158), (96, 124, 161), (97, 125, 162), (99, 125, 162), + (99, 124, 160), (91, 111, 152), (88, 107, 149), (85, 104, 147), + (79, 95, 142), (75, 89, 137), (70, 81, 131), (65, 72, 124), + (57, 58, 111), (55, 55, 107), (53, 53, 103), (52, 52, 101), + (52, 52, 99), (50, 50, 94), (50, 48, 87), (49, 45, 79), + (48, 42, 71), (46, 37, 57), (45, 35, 53), (45, 34, 50), + (44, 32, 46), (44, 30, 43), (43, 30, 40), (43, 30, 40), + (44, 32, 45), (45, 34, 50), (47, 37, 56), (47, 37, 58), + (48, 38, 60), (49, 39, 63), (51, 41, 65), (53, 43, 69), + (55, 45, 73), (56, 46, 77), (55, 45, 77), (55, 45, 77), + (54, 45, 76), (54, 43, 76), (52, 42, 74), (51, 42, 75), + (49, 41, 75), (49, 40, 75), (49, 40, 75), (48, 40, 76), + (48, 42, 80), (49, 44, 85), (51, 50, 91), (56, 58, 100), + (60, 66, 108), (69, 86, 128), (72, 90, 132), (75, 95, 136), + (81, 105, 146), (85, 114, 154), (87, 121, 160), (86, 127, 164), + (90, 132, 168), (93, 134, 169), (96, 136, 170), (102, 139, 172), + (107, 143, 176), (116, 145, 174), (124, 148, 172), (135, 152, 169), + (139, 152, 165), (138, 152, 167), (137, 150, 166), (133, 144, 162), + (129, 137, 156), (119, 127, 147), (105, 114, 139), (90, 102, 134), + (68, 82, 125), (64, 78, 122), (61, 74, 120), (58, 68, 116), + (56, 63, 114), (55, 61, 111), (56, 60, 111), (57, 60, 111), + (57, 60, 112), (59, 61, 113), (61, 64, 117), (66, 70, 120), + (70, 77, 125), (75, 82, 129), (79, 87, 131), (82, 91, 134), + (85, 93, 134), (84, 95, 133), (83, 93, 132), (82, 91, 129), + (80, 88, 124), (78, 81, 118), (70, 73, 110), (64, 64, 103), + (57, 56, 97), (54, 52, 92), (53, 49, 87), (52, 46, 83), + (51, 45, 80), (51, 44, 79), (51, 45, 79), (53, 46, 80), + (54, 46, 81), (55, 47, 83), (56, 48, 86), (56, 49, 89), + (57, 49, 91), (57, 49, 93), (57, 49, 94), (57, 48, 95), + (56, 47, 95), (55, 47, 93), (54, 47, 90), (54, 46, 88), + (54, 46, 87), (54, 45, 86), (54, 47, 87), (55, 48, 87), + (55, 50, 90), (56, 53, 94), (58, 56, 99), (59, 60, 104), + (59, 63, 109), (60, 64, 112), (60, 66, 115), (61, 67, 117), + (62, 67, 119), (62, 66, 119), (62, 65, 118), (61, 64, 116), + (59, 62, 113), (58, 60, 109), (58, 57, 107), (57, 54, 104), + (55, 53, 102), (54, 51, 100), (53, 50, 98), (53, 49, 98), + (53, 49, 98), (53, 48, 98), (54, 47, 99), (54, 47, 98) + ), + +// 508 Bluebells +((51, 31, 24), (40, 29, 26), (37, 28, 32), (35, 28, 39), + (37, 27, 52), (39, 27, 66), (41, 29, 73), (44, 31, 80), + (49, 40, 109), (44, 45, 119), (40, 50, 129), (35, 51, 136), + (30, 52, 144), (34, 53, 145), (38, 55, 147), (44, 60, 150), + (51, 66, 153), (87, 102, 178), (88, 115, 184), (90, 128, 190), + (88, 133, 191), (87, 139, 192), (93, 143, 191), (100, 148, 191), + (150, 179, 208), (169, 195, 218), (188, 211, 228), (189, 217, 238), + (191, 223, 248), (183, 219, 246), (176, 215, 244), (160, 204, 238), + (155, 195, 232), (151, 173, 215), (145, 162, 208), (139, 152, 202), + (120, 139, 197), (101, 126, 192), (91, 123, 191), (82, 120, 190), + (48, 96, 186), (36, 84, 178), (25, 73, 170), (22, 63, 154), + (19, 54, 139), (18, 53, 133), (17, 53, 128), (16, 53, 120), + (19, 53, 118), (25, 59, 118), (32, 59, 107), (39, 60, 97), + (39, 61, 85), (40, 62, 73), (40, 62, 71), (41, 63, 70), + (37, 69, 89), (37, 72, 100), (37, 76, 112), (36, 78, 113), + (35, 81, 115), (34, 80, 113), (33, 79, 111), (31, 76, 107), + (26, 69, 106), (14, 55, 115), (10, 46, 112), (7, 38, 109), + (5, 34, 103), (4, 30, 98), (3, 22, 82), (2, 14, 65), + (2, 5, 46), (2, 4, 43), (2, 3, 41), (3, 5, 42), + (5, 7, 43), (5, 9, 43), (5, 11, 43), (7, 17, 45), + (11, 23, 49), (19, 34, 60), (21, 35, 62), (24, 37, 65), + (24, 36, 65), (25, 35, 65), (25, 37, 66), (27, 39, 68), + (36, 50, 79), (41, 57, 85), (47, 64, 91), (54, 69, 94), + (62, 74, 98), (79, 88, 107), (95, 102, 115), (108, 110, 118), + (122, 118, 115), (119, 115, 109), (124, 117, 110), (129, 120, 111), + (138, 129, 119), (147, 138, 128), (164, 158, 151), (186, 175, 163), + (206, 192, 178), (201, 186, 172), (196, 180, 167), (195, 179, 167), + (194, 179, 168), (198, 188, 183), (208, 201, 200), (228, 220, 218), + (241, 236, 234), (239, 246, 250), (229, 240, 249), (220, 235, 248), + (200, 223, 246), (179, 207, 239), (159, 190, 228), (140, 172, 217), + (124, 156, 204), (112, 149, 199), (101, 143, 194), (100, 143, 195), + (99, 144, 196), (99, 144, 196), (99, 141, 194), (111, 146, 195), + (128, 150, 187), (147, 152, 160), (152, 153, 157), (157, 154, 154), + (166, 158, 150), (170, 160, 148), (170, 164, 154), (170, 162, 157), + (155, 152, 146), (143, 139, 127), (131, 126, 108), (124, 119, 97), + (118, 112, 86), (104, 105, 74), (92, 98, 70), (80, 92, 72), + (69, 88, 78), (53, 78, 86), (50, 75, 86), (47, 72, 86), + (44, 65, 85), (41, 62, 78), (39, 57, 71), (34, 50, 68), + (24, 36, 65), (22, 35, 65), (21, 34, 66), (21, 33, 68), + (22, 33, 66), (23, 37, 62), (25, 38, 55), (25, 36, 44), + (24, 33, 34), (25, 35, 17), (28, 35, 16), (31, 36, 16), + (36, 43, 15), (42, 51, 20), (46, 55, 25), (45, 55, 29), + (41, 43, 31), (41, 39, 31), (41, 36, 32), (40, 33, 29), + (45, 30, 28), (50, 30, 29), (51, 33, 30), (55, 32, 32), + (53, 29, 31), (49, 23, 33), (42, 19, 34), (37, 14, 36), + (33, 11, 37), (28, 12, 40), (27, 14, 44), (26, 17, 48), + (19, 26, 69), (17, 30, 75), (16, 34, 81), (17, 43, 95), + (19, 54, 109), (26, 68, 127), (47, 88, 140), (69, 106, 151), + (88, 122, 164), (106, 139, 176), (126, 157, 189), (144, 172, 199), + (152, 185, 212), (172, 202, 223), (193, 217, 231), (212, 229, 240), + (227, 239, 247), (242, 249, 253), (254, 254, 254), (251, 253, 249), + (241, 243, 238), (226, 233, 220), (211, 217, 200), (193, 197, 180), + (173, 176, 160), (156, 158, 146), (142, 147, 135), (126, 130, 125), + (107, 116, 113), (88, 100, 101), (69, 82, 89), (48, 62, 78), + (31, 46, 75), (21, 43, 79), (19, 43, 89), (22, 48, 99), + (26, 56, 107), (36, 61, 111), (46, 65, 113), (55, 66, 114), + (58, 67, 116), (58, 67, 117), (60, 71, 119), (59, 77, 124), + (64, 84, 126), (70, 90, 124), (88, 99, 122), (107, 113, 128), + (123, 121, 133), (136, 132, 140), (144, 143, 154), (152, 155, 168), + (155, 164, 183), (162, 175, 190), (180, 193, 206), (198, 210, 218), + (217, 225, 227), (233, 238, 236), (246, 245, 237), (246, 240, 233), + (236, 226, 219), (221, 209, 202), (202, 190, 183), (182, 170, 162), + (162, 152, 147), (146, 138, 132), (129, 122, 113), (114, 103, 94), + (99, 85, 76), (82, 66, 58), (67, 49, 41), (57, 37, 29) + ), + + +// 509 Blush +((245, 172, 163), (249, 180, 171), (248, 185, 177), (248, 191, 183), + (248, 200, 191), (249, 209, 199), (249, 214, 201), (249, 220, 204), + (252, 237, 213), (252, 241, 217), (252, 246, 222), (251, 247, 224), + (251, 248, 227), (251, 248, 228), (252, 249, 229), (252, 249, 230), + (253, 250, 231), (253, 249, 240), (252, 245, 239), (252, 241, 238), + (252, 234, 231), (252, 228, 224), (251, 223, 221), (251, 219, 218), + (250, 211, 213), (250, 209, 212), (250, 207, 212), (250, 207, 211), + (250, 208, 210), (250, 208, 209), (250, 209, 209), (248, 212, 213), + (246, 215, 217), (246, 219, 221), (241, 216, 212), (237, 214, 203), + (232, 202, 190), (227, 190, 178), (225, 182, 171), (223, 174, 165), + (224, 151, 143), (223, 141, 130), (223, 131, 118), (220, 120, 104), + (218, 110, 91), (217, 104, 86), (216, 99, 82), (216, 92, 78), + (213, 91, 79), (217, 93, 88), (217, 94, 88), (217, 95, 89), + (211, 91, 86), (205, 87, 84), (200, 85, 83), (195, 84, 82), + (175, 78, 85), (163, 75, 84), (152, 72, 83), (133, 64, 73), + (115, 56, 64), (108, 50, 58), (101, 45, 52), (81, 37, 41), + (68, 30, 32), (59, 21, 23), (58, 17, 18), (58, 13, 14), + (56, 11, 12), (54, 10, 10), (44, 7, 5), (42, 5, 4), + (44, 4, 3), (45, 5, 3), (46, 6, 4), (35, 5, 4), + (25, 5, 4), (20, 4, 3), (15, 3, 3), (7, 1, 2), + (1, 0, 1), (0, 0, 0), (0, 0, 0), (0, 0, 1), + (0, 0, 1), (0, 1, 1), (0, 0, 1), (0, 1, 1), + (10, 11, 11), (29, 20, 21), (48, 29, 31), (60, 37, 38), + (72, 45, 45), (93, 59, 60), (116, 81, 82), (130, 101, 101), + (144, 105, 106), (185, 126, 127), (205, 140, 141), (225, 155, 156), + (232, 170, 170), (240, 185, 184), (241, 195, 193), (240, 201, 198), + (240, 202, 200), (244, 211, 209), (248, 221, 218), (249, 227, 225), + (251, 234, 232), (253, 243, 240), (254, 249, 245), (254, 251, 248), + (254, 252, 249), (253, 251, 245), (253, 249, 242), (253, 247, 240), + (253, 241, 230), (253, 230, 217), (252, 217, 202), (252, 203, 189), + (246, 184, 171), (245, 180, 164), (245, 177, 157), (245, 175, 153), + (246, 174, 150), (246, 170, 145), (246, 163, 142), (245, 160, 142), + (241, 158, 142), (229, 151, 135), (224, 147, 130), (219, 144, 126), + (205, 130, 115), (188, 115, 103), (166, 102, 91), (145, 83, 77), + (103, 51, 47), (87, 35, 33), (72, 19, 19), (67, 14, 15), + (62, 10, 11), (59, 7, 9), (62, 11, 14), (73, 20, 24), + (84, 31, 35), (127, 55, 62), (136, 60, 68), (146, 65, 74), + (166, 74, 84), (185, 84, 94), (196, 91, 101), (205, 98, 108), + (211, 104, 115), (210, 103, 113), (209, 102, 112), (204, 97, 107), + (197, 91, 99), (188, 80, 87), (178, 71, 76), (167, 62, 65), + (157, 53, 55), (146, 41, 42), (145, 39, 40), (145, 38, 39), + (146, 38, 40), (148, 43, 43), (151, 48, 50), (158, 57, 61), + (175, 90, 93), (178, 98, 101), (182, 106, 109), (194, 124, 121), + (205, 141, 135), (215, 157, 150), (227, 172, 165), (236, 186, 183), + (239, 197, 198), (242, 206, 206), (242, 212, 209), (239, 215, 208), + (236, 210, 201), (234, 198, 189), (228, 182, 176), (223, 165, 161), + (207, 141, 139), (204, 140, 135), (202, 139, 132), (201, 139, 124), + (202, 139, 120), (207, 138, 117), (209, 140, 114), (212, 144, 121), + (214, 150, 132), (219, 162, 145), (226, 171, 157), (235, 179, 167), + (241, 181, 170), (245, 180, 172), (246, 176, 173), (245, 173, 173), + (246, 168, 174), (245, 165, 173), (246, 161, 172), (245, 158, 169), + (245, 159, 167), (246, 164, 167), (245, 172, 175), (245, 181, 182), + (247, 188, 189), (247, 190, 193), (246, 190, 192), (245, 187, 185), + (244, 183, 177), (242, 178, 169), (241, 172, 163), (241, 165, 159), + (241, 159, 157), (242, 151, 151), (242, 145, 146), (242, 142, 140), + (241, 142, 138), (244, 151, 140), (246, 163, 149), (248, 174, 159), + (248, 186, 170), (245, 193, 177), (239, 193, 178), (233, 192, 175), + (226, 184, 166), (220, 174, 153), (211, 162, 139), (203, 148, 126), + (192, 132, 113), (179, 117, 102), (165, 97, 88), (152, 78, 74), + (130, 57, 55), (114, 38, 38), (97, 24, 24), (79, 18, 16), + (67, 12, 11), (59, 10, 11), (47, 9, 12), (41, 8, 13), + (43, 13, 17), (50, 22, 24), (64, 40, 37), (86, 58, 52), + (108, 72, 65), (125, 86, 78), (145, 95, 85), (166, 99, 89), + (187, 113, 104), (208, 129, 120), (227, 143, 134), (239, 159, 151) + ), + +// 510 Bluster +((65, 45, 53), (74, 53, 57), (71, 49, 54), (69, 46, 52), + (71, 46, 53), (73, 47, 54), (72, 47, 54), (72, 48, 54), + (62, 45, 52), (52, 43, 52), (42, 41, 53), (33, 42, 55), + (25, 43, 58), (21, 47, 62), (17, 51, 67), (15, 53, 70), + (14, 55, 74), (9, 63, 85), (10, 67, 89), (11, 71, 93), + (12, 71, 93), (14, 71, 94), (13, 71, 93), (12, 71, 93), + (11, 62, 82), (14, 57, 75), (18, 52, 69), (21, 48, 64), + (25, 44, 59), (26, 42, 57), (28, 41, 56), (34, 41, 56), + (41, 44, 60), (49, 53, 71), (53, 59, 77), (58, 65, 84), + (62, 71, 92), (67, 78, 100), (64, 79, 102), (61, 80, 105), + (47, 80, 104), (46, 79, 101), (45, 78, 99), (43, 75, 98), + (41, 73, 97), (42, 73, 97), (43, 74, 98), (45, 76, 101), + (50, 80, 106), (58, 85, 112), (65, 85, 112), (72, 85, 112), + (78, 86, 113), (84, 87, 114), (84, 87, 112), (85, 87, 111), + (75, 73, 92), (69, 63, 81), (64, 54, 70), (60, 49, 61), + (57, 44, 53), (54, 41, 49), (51, 38, 46), (47, 34, 42), + (44, 33, 42), (49, 39, 52), (56, 47, 62), (63, 56, 72), + (68, 61, 77), (73, 66, 83), (85, 79, 99), (94, 87, 112), + (104, 104, 135), (105, 108, 139), (107, 113, 143), (105, 110, 141), + (103, 108, 140), (97, 106, 139), (92, 104, 138), (82, 100, 133), + (71, 95, 127), (61, 85, 113), (59, 83, 108), (58, 81, 104), + (58, 80, 101), (58, 80, 99), (60, 79, 94), (64, 77, 89), + (78, 77, 82), (86, 76, 76), (95, 75, 71), (96, 74, 69), + (97, 74, 68), (95, 73, 70), (88, 75, 76), (80, 77, 80), + (78, 78, 83), (76, 86, 99), (64, 89, 107), (53, 92, 116), + (47, 91, 115), (42, 90, 115), (35, 87, 111), (37, 83, 108), + (35, 75, 100), (26, 70, 93), (18, 65, 87), (17, 61, 83), + (16, 58, 79), (16, 54, 74), (20, 50, 67), (24, 47, 63), + (25, 47, 62), (26, 46, 61), (26, 45, 61), (27, 45, 61), + (28, 47, 63), (27, 50, 65), (30, 52, 68), (32, 52, 69), + (31, 46, 63), (26, 43, 58), (21, 40, 54), (20, 37, 51), + (19, 35, 48), (18, 30, 41), (18, 23, 32), (16, 14, 23), + (11, 10, 17), (5, 8, 14), (5, 8, 14), (6, 9, 14), + (7, 9, 16), (12, 11, 18), (18, 15, 23), (24, 20, 30), + (38, 36, 45), (43, 44, 53), (49, 52, 61), (50, 54, 65), + (51, 57, 69), (51, 64, 78), (49, 69, 87), (47, 76, 94), + (47, 82, 100), (44, 86, 104), (43, 85, 103), (43, 85, 103), + (43, 84, 101), (48, 83, 98), (53, 82, 95), (63, 83, 92), + (77, 80, 85), (78, 78, 82), (80, 76, 80), (80, 69, 74), + (79, 63, 69), (78, 57, 62), (77, 53, 59), (79, 50, 59), + (84, 48, 56), (95, 42, 46), (96, 41, 43), (98, 41, 40), + (100, 43, 44), (104, 49, 48), (107, 57, 56), (112, 61, 62), + (120, 72, 76), (123, 77, 85), (127, 83, 95), (136, 98, 115), + (147, 106, 130), (154, 113, 143), (160, 111, 144), (161, 114, 149), + (159, 118, 153), (159, 115, 147), (152, 110, 141), (142, 93, 123), + (125, 79, 104), (100, 66, 89), (78, 54, 71), (59, 45, 56), + (38, 25, 32), (34, 21, 28), (30, 17, 24), (24, 12, 18), + (18, 9, 13), (13, 8, 10), (11, 6, 8), (12, 6, 7), + (11, 6, 8), (10, 7, 9), (7, 9, 11), (6, 11, 16), + (8, 15, 20), (13, 19, 25), (18, 23, 31), (22, 27, 35), + (24, 29, 39), (27, 31, 42), (31, 33, 44), (36, 35, 48), + (39, 38, 51), (38, 39, 54), (36, 42, 58), (32, 46, 61), + (30, 49, 67), (30, 55, 74), (30, 60, 81), (33, 65, 90), + (34, 71, 96), (32, 74, 102), (33, 78, 105), (32, 79, 106), + (34, 80, 108), (38, 79, 104), (38, 74, 100), (39, 68, 92), + (38, 63, 86), (36, 63, 85), (39, 63, 85), (42, 63, 84), + (46, 60, 80), (50, 55, 74), (49, 50, 68), (48, 48, 65), + (46, 46, 62), (43, 43, 59), (41, 37, 51), (37, 30, 41), + (32, 23, 31), (27, 17, 23), (22, 13, 19), (20, 10, 16), + (20, 10, 15), (23, 10, 15), (27, 12, 15), (29, 13, 17), + (30, 15, 20), (30, 16, 23), (33, 18, 25), (37, 20, 28), + (40, 22, 30), (41, 23, 31), (41, 24, 33), (41, 25, 34), + (43, 25, 35), (46, 26, 37), (51, 32, 41), (52, 36, 44), + (49, 34, 43), (49, 34, 42), (47, 30, 40), (54, 36, 45) + ), + +// 511 Boquet_of_Roses +((154, 14, 6), (150, 22, 9), (145, 26, 10), (141, 30, 12), + (139, 35, 14), (138, 41, 17), (137, 44, 18), (136, 47, 19), + (138, 61, 31), (144, 74, 42), (151, 87, 53), (155, 95, 66), + (159, 104, 80), (159, 99, 74), (160, 95, 69), (158, 94, 66), + (157, 93, 64), (155, 101, 79), (154, 101, 75), (153, 101, 71), + (160, 118, 89), (168, 136, 107), (170, 143, 117), (173, 151, 127), + (184, 173, 146), (187, 175, 151), (190, 178, 157), (183, 173, 151), + (177, 169, 146), (174, 165, 142), (172, 161, 138), (166, 151, 128), + (158, 138, 114), (145, 110, 83), (139, 99, 69), (133, 88, 55), + (132, 74, 43), (131, 60, 32), (130, 55, 28), (129, 50, 24), + (127, 40, 14), (127, 38, 16), (128, 37, 18), (126, 38, 23), + (124, 40, 29), (123, 43, 29), (122, 46, 30), (117, 53, 32), + (113, 56, 38), (107, 62, 46), (103, 64, 44), (100, 67, 43), + (96, 65, 44), (92, 64, 45), (92, 63, 44), (92, 62, 44), + (80, 49, 35), (81, 41, 30), (83, 34, 25), (86, 26, 19), + (89, 18, 13), (90, 15, 11), (92, 12, 9), (99, 10, 6), + (108, 8, 5), (119, 3, 0), (125, 4, 1), (131, 6, 2), + (133, 7, 2), (135, 9, 2), (138, 10, 2), (140, 16, 5), + (143, 34, 12), (145, 44, 17), (147, 54, 22), (151, 68, 29), + (155, 83, 37), (154, 88, 42), (154, 93, 47), (154, 100, 58), + (159, 109, 66), (164, 123, 84), (159, 124, 91), (154, 125, 99), + (154, 125, 100), (155, 125, 102), (156, 118, 98), (153, 111, 89), + (142, 89, 69), (141, 71, 55), (140, 54, 41), (138, 46, 34), + (136, 39, 28), (133, 29, 17), (130, 20, 11), (130, 14, 7), + (131, 12, 7), (135, 20, 12), (134, 24, 14), (134, 28, 17), + (133, 27, 17), (133, 27, 17), (129, 30, 20), (122, 38, 23), + (114, 45, 26), (114, 53, 35), (114, 62, 45), (114, 70, 50), + (114, 78, 56), (116, 88, 62), (121, 95, 71), (126, 99, 78), + (129, 102, 78), (130, 104, 73), (132, 102, 70), (134, 101, 68), + (139, 95, 62), (143, 93, 58), (147, 93, 57), (152, 90, 51), + (156, 79, 46), (159, 82, 53), (163, 85, 60), (165, 87, 63), + (168, 90, 67), (168, 96, 73), (169, 107, 85), (176, 123, 104), + (187, 138, 118), (192, 154, 128), (192, 155, 129), (193, 156, 131), + (195, 152, 120), (190, 136, 105), (182, 115, 84), (174, 91, 67), + (161, 52, 31), (151, 34, 19), (142, 17, 7), (140, 12, 4), + (138, 8, 2), (137, 4, 1), (137, 9, 5), (139, 18, 10), + (141, 31, 19), (148, 68, 47), (152, 78, 55), (156, 88, 64), + (163, 105, 82), (164, 119, 95), (168, 127, 100), (171, 130, 99), + (168, 123, 94), (166, 120, 91), (164, 117, 89), (163, 112, 79), + (161, 105, 71), (153, 100, 63), (145, 94, 60), (145, 87, 55), + (147, 81, 51), (142, 64, 38), (141, 60, 35), (140, 57, 32), + (138, 52, 29), (133, 49, 25), (122, 46, 24), (117, 46, 24), + (121, 44, 20), (120, 41, 18), (120, 38, 17), (122, 31, 13), + (130, 24, 9), (143, 18, 5), (152, 12, 2), (159, 11, 2), + (163, 13, 5), (166, 14, 6), (163, 13, 7), (161, 15, 7), + (160, 20, 9), (161, 24, 11), (158, 27, 14), (154, 31, 13), + (161, 59, 21), (164, 65, 26), (168, 72, 31), (176, 87, 42), + (183, 105, 51), (194, 125, 58), (199, 134, 62), (199, 136, 68), + (195, 133, 70), (193, 131, 68), (182, 122, 62), (169, 109, 57), + (154, 97, 54), (144, 89, 50), (136, 85, 51), (134, 83, 54), + (133, 85, 62), (131, 88, 65), (130, 91, 67), (127, 92, 69), + (125, 91, 68), (115, 88, 64), (107, 79, 56), (101, 69, 47), + (104, 53, 36), (106, 41, 26), (111, 28, 16), (120, 21, 11), + (134, 12, 6), (152, 6, 4), (170, 1, 1), (187, 1, 1), + (193, 3, 2), (199, 8, 3), (199, 9, 4), (202, 9, 5), + (198, 11, 6), (193, 21, 9), (184, 33, 15), (178, 48, 23), + (178, 66, 35), (179, 88, 50), (176, 104, 67), (171, 120, 77), + (169, 134, 88), (167, 143, 99), (158, 141, 106), (147, 131, 100), + (133, 118, 89), (125, 106, 79), (117, 93, 68), (113, 83, 56), + (111, 77, 50), (117, 80, 51), (129, 86, 55), (143, 96, 66), + (154, 111, 84), (167, 130, 102), (179, 144, 109), (192, 154, 114), + (199, 160, 118), (199, 161, 121), (191, 147, 109), (185, 128, 90), + (182, 103, 67), (177, 82, 51), (169, 59, 38), (160, 40, 27), + (159, 22, 15), (158, 13, 6), (158, 11, 3), (155, 14, 4) + ), + +// 512 Brushed_Silver +((184, 191, 195), (182, 187, 191), (183, 187, 190), (184, 188, 190), + (185, 189, 191), (186, 191, 193), (187, 192, 195), (188, 193, 197), + (192, 200, 210), (190, 202, 213), (188, 205, 216), (179, 199, 211), + (170, 194, 206), (158, 182, 195), (146, 171, 184), (140, 165, 178), + (134, 159, 172), (114, 139, 150), (107, 131, 143), (101, 123, 136), + (95, 119, 131), (90, 116, 126), (86, 113, 123), (83, 110, 120), + (69, 96, 103), (60, 84, 91), (52, 73, 79), (44, 62, 66), + (36, 52, 54), (33, 46, 49), (31, 41, 45), (29, 34, 36), + (30, 33, 35), (35, 37, 41), (40, 42, 46), (46, 48, 52), + (52, 55, 58), (59, 62, 64), (62, 65, 67), (65, 68, 71), + (82, 83, 85), (92, 93, 95), (102, 104, 106), (112, 115, 118), + (122, 127, 130), (126, 132, 135), (130, 137, 141), (138, 145, 151), + (146, 155, 159), (161, 169, 174), (166, 173, 176), (172, 177, 179), + (174, 178, 178), (177, 179, 178), (177, 178, 176), (178, 178, 175), + (169, 168, 166), (160, 160, 158), (151, 153, 150), (142, 145, 143), + (133, 137, 136), (129, 133, 132), (126, 130, 129), (119, 123, 122), + (115, 118, 115), (110, 114, 109), (106, 111, 107), (103, 109, 106), + (100, 106, 104), (98, 104, 102), (92, 99, 97), (87, 94, 93), + (77, 84, 85), (74, 80, 80), (71, 77, 75), (70, 76, 74), + (69, 76, 73), (68, 76, 73), (68, 76, 74), (67, 76, 75), + (65, 75, 74), (59, 69, 68), (54, 65, 65), (50, 62, 63), + (49, 60, 61), (48, 59, 60), (47, 56, 57), (47, 55, 55), + (49, 57, 57), (53, 62, 61), (58, 68, 66), (62, 71, 69), + (66, 75, 72), (75, 83, 79), (83, 90, 89), (93, 99, 98), + (104, 109, 107), (123, 125, 124), (128, 130, 131), (134, 136, 139), + (135, 138, 142), (136, 140, 145), (138, 144, 149), (139, 146, 151), + (141, 148, 154), (144, 150, 156), (148, 153, 158), (149, 154, 160), + (151, 156, 162), (154, 158, 165), (154, 160, 169), (153, 160, 173), + (151, 160, 173), (145, 159, 174), (144, 158, 173), (143, 157, 173), + (142, 157, 172), (143, 158, 172), (145, 159, 172), (150, 162, 173), + (159, 167, 176), (163, 168, 174), (168, 169, 173), (168, 168, 171), + (168, 168, 170), (165, 165, 167), (162, 162, 164), (158, 158, 158), + (153, 152, 152), (145, 143, 139), (142, 140, 137), (140, 138, 135), + (137, 135, 132), (135, 131, 128), (131, 128, 123), (122, 126, 120), + (105, 119, 115), (96, 112, 109), (87, 105, 104), (82, 101, 101), + (78, 98, 98), (69, 92, 94), (62, 88, 93), (59, 86, 94), + (63, 86, 95), (70, 94, 105), (73, 98, 108), (77, 103, 112), + (85, 111, 120), (93, 119, 129), (100, 126, 135), (106, 131, 139), + (114, 137, 145), (117, 137, 145), (120, 138, 145), (126, 138, 145), + (129, 137, 145), (131, 136, 145), (133, 136, 143), (134, 136, 142), + (134, 135, 140), (133, 130, 133), (132, 129, 131), (131, 129, 130), + (128, 127, 127), (126, 124, 125), (122, 122, 123), (117, 118, 122), + (109, 114, 123), (106, 113, 122), (104, 112, 121), (101, 110, 120), + (98, 108, 117), (97, 107, 115), (98, 108, 115), (101, 109, 115), + (104, 113, 119), (107, 116, 123), (114, 121, 129), (120, 128, 137), + (124, 134, 145), (130, 140, 153), (134, 144, 158), (137, 148, 162), + (146, 156, 168), (148, 158, 169), (151, 160, 170), (155, 162, 171), + (159, 163, 170), (164, 166, 171), (168, 168, 173), (173, 170, 175), + (179, 173, 174), (182, 174, 173), (183, 175, 173), (183, 175, 172), + (182, 174, 170), (179, 172, 169), (175, 170, 167), (172, 168, 166), + (169, 168, 166), (168, 169, 168), (171, 171, 169), (174, 173, 168), + (177, 175, 170), (179, 175, 171), (180, 177, 172), (180, 176, 172), + (178, 175, 171), (174, 171, 169), (166, 166, 166), (157, 161, 165), + (149, 157, 164), (143, 154, 162), (139, 150, 159), (137, 147, 157), + (136, 145, 153), (136, 143, 148), (136, 139, 142), (136, 137, 137), + (136, 134, 134), (134, 133, 131), (133, 131, 129), (131, 130, 128), + (129, 128, 127), (128, 128, 127), (126, 127, 126), (123, 126, 125), + (122, 123, 121), (120, 120, 116), (120, 118, 113), (122, 119, 112), + (125, 121, 112), (128, 123, 114), (132, 126, 118), (137, 131, 124), + (142, 137, 133), (147, 144, 142), (151, 149, 148), (153, 151, 152), + (153, 151, 154), (152, 151, 155), (152, 152, 154), (151, 151, 153), + (149, 151, 153), (147, 151, 151), (145, 149, 150), (144, 148, 149), + (149, 153, 155), (155, 159, 160), (159, 165, 168), (164, 171, 175), + (169, 177, 181), (174, 181, 185), (179, 184, 189), (182, 188, 192) + ), + +// 513 Bubblegum +((194, 37, 79), (193, 49, 97), (193, 50, 99), (193, 52, 101), + (196, 51, 101), (199, 50, 102), (202, 50, 104), (205, 50, 107), + (206, 46, 110), (207, 46, 116), (208, 46, 122), (206, 44, 124), + (205, 43, 127), (200, 38, 126), (195, 33, 125), (192, 30, 123), + (190, 28, 122), (188, 29, 124), (188, 38, 132), (189, 48, 140), + (189, 61, 146), (190, 75, 152), (191, 82, 157), (192, 90, 162), + (191, 108, 172), (191, 117, 176), (192, 126, 180), (193, 135, 184), + (194, 145, 189), (195, 149, 189), (196, 154, 189), (199, 163, 193), + (198, 166, 193), (199, 161, 185), (201, 157, 185), (203, 154, 186), + (202, 150, 187), (202, 147, 188), (203, 144, 188), (205, 142, 189), + (206, 119, 171), (208, 104, 160), (211, 89, 150), (210, 80, 147), + (209, 71, 145), (207, 69, 145), (205, 68, 146), (203, 70, 154), + (197, 69, 154), (188, 59, 147), (188, 51, 138), (188, 43, 130), + (185, 43, 125), (183, 43, 120), (181, 48, 123), (180, 53, 127), + (170, 83, 143), (168, 90, 151), (166, 98, 160), (172, 103, 168), + (179, 108, 177), (183, 109, 181), (187, 111, 186), (196, 116, 194), + (201, 123, 196), (204, 138, 193), (204, 135, 196), (205, 133, 199), + (205, 129, 198), (206, 125, 197), (204, 115, 192), (200, 102, 189), + (189, 81, 169), (181, 72, 152), (173, 63, 135), (170, 54, 128), + (167, 46, 121), (167, 42, 118), (168, 38, 116), (169, 34, 115), + (168, 32, 114), (171, 47, 132), (170, 55, 140), (169, 64, 148), + (172, 64, 155), (175, 65, 162), (182, 66, 178), (191, 66, 193), + (198, 66, 200), (200, 67, 201), (203, 68, 203), (199, 68, 200), + (196, 69, 198), (194, 69, 196), (192, 66, 194), (191, 63, 197), + (197, 59, 199), (201, 47, 188), (198, 43, 176), (196, 39, 165), + (193, 37, 158), (191, 36, 152), (187, 26, 136), (187, 20, 129), + (194, 15, 125), (200, 14, 124), (207, 13, 123), (209, 13, 122), + (212, 13, 122), (214, 13, 117), (214, 14, 114), (213, 14, 110), + (211, 16, 110), (211, 15, 106), (212, 15, 105), (213, 15, 104), + (216, 18, 104), (217, 23, 100), (217, 33, 100), (216, 46, 103), + (214, 72, 119), (215, 82, 133), (216, 92, 148), (218, 97, 154), + (220, 102, 161), (223, 111, 173), (225, 121, 184), (226, 134, 194), + (223, 149, 205), (208, 157, 215), (200, 156, 213), (192, 156, 212), + (182, 152, 211), (171, 142, 212), (164, 131, 213), (166, 128, 216), + (157, 127, 213), (152, 129, 211), (147, 131, 209), (148, 135, 207), + (149, 139, 206), (152, 140, 197), (149, 131, 192), (158, 125, 192), + (168, 117, 193), (173, 101, 186), (172, 96, 184), (172, 92, 182), + (176, 95, 176), (170, 98, 158), (168, 94, 147), (169, 82, 137), + (176, 54, 125), (177, 47, 122), (179, 41, 119), (182, 32, 122), + (183, 26, 123), (183, 23, 124), (182, 20, 123), (184, 20, 124), + (189, 19, 127), (201, 21, 132), (203, 24, 134), (206, 27, 137), + (210, 35, 143), (215, 45, 153), (218, 56, 161), (220, 70, 170), + (222, 94, 188), (222, 96, 191), (223, 99, 194), (221, 106, 196), + (219, 114, 197), (218, 122, 199), (217, 130, 201), (219, 139, 206), + (220, 148, 211), (221, 155, 218), (218, 158, 222), (210, 161, 221), + (204, 163, 218), (198, 165, 216), (191, 163, 213), (195, 164, 215), + (204, 167, 218), (205, 167, 219), (206, 168, 221), (206, 169, 222), + (206, 170, 223), (205, 173, 224), (197, 171, 223), (194, 171, 223), + (195, 170, 225), (201, 168, 228), (206, 163, 231), (211, 156, 234), + (217, 150, 233), (219, 142, 229), (216, 133, 222), (211, 124, 214), + (206, 115, 206), (201, 107, 197), (199, 101, 189), (198, 97, 183), + (195, 96, 172), (190, 87, 159), (180, 75, 140), (167, 64, 122), + (153, 55, 110), (139, 46, 95), (129, 40, 89), (122, 35, 81), + (120, 34, 75), (119, 33, 76), (118, 31, 67), (114, 33, 65), + (111, 39, 71), (110, 45, 75), (113, 55, 88), (113, 64, 97), + (118, 72, 109), (123, 73, 125), (132, 80, 137), (142, 88, 146), + (146, 91, 154), (156, 98, 163), (169, 103, 175), (182, 107, 183), + (188, 108, 187), (189, 107, 188), (191, 107, 188), (192, 107, 185), + (190, 101, 181), (190, 96, 178), (191, 90, 176), (196, 87, 171), + (199, 76, 162), (199, 63, 149), (196, 51, 136), (192, 41, 124), + (188, 34, 116), (186, 29, 105), (187, 24, 95), (191, 23, 93), + (198, 22, 92), (205, 21, 94), (206, 19, 94), (205, 19, 93), + (199, 21, 92), (197, 27, 98), (196, 26, 88), (195, 28, 83), + (194, 30, 82), (196, 32, 78), (197, 33, 79), (199, 35, 81) + ), + +// 514 California +((80, 121, 173), (83, 126, 183), (81, 124, 185), (79, 123, 187), + (72, 120, 188), (65, 118, 190), (60, 116, 189), (56, 114, 188), + (46, 114, 192), (50, 116, 194), (54, 118, 197), (64, 123, 199), + (75, 129, 202), (87, 132, 197), (100, 136, 193), (105, 135, 189), + (111, 134, 186), (134, 128, 166), (152, 127, 158), (170, 126, 150), + (183, 122, 145), (196, 119, 141), (202, 117, 138), (209, 115, 136), + (219, 96, 122), (219, 88, 120), (220, 80, 119), (214, 77, 127), + (208, 74, 136), (204, 74, 141), (200, 75, 146), (198, 73, 156), + (194, 68, 161), (185, 58, 174), (181, 52, 179), (178, 46, 184), + (164, 47, 190), (150, 48, 196), (144, 49, 197), (138, 51, 198), + (122, 59, 197), (126, 53, 190), (131, 48, 183), (132, 47, 175), + (134, 47, 168), (131, 46, 166), (129, 45, 164), (119, 44, 158), + (111, 51, 153), (100, 63, 147), (111, 66, 141), (122, 69, 135), + (134, 66, 131), (146, 64, 127), (151, 63, 126), (156, 62, 125), + (154, 64, 127), (154, 62, 132), (154, 61, 137), (154, 64, 141), + (155, 68, 146), (155, 68, 147), (156, 68, 148), (158, 69, 153), + (156, 74, 156), (150, 78, 164), (153, 81, 163), (157, 85, 162), + (158, 85, 160), (159, 86, 159), (157, 85, 160), (153, 81, 165), + (130, 76, 177), (125, 73, 176), (120, 71, 176), (122, 68, 170), + (125, 65, 164), (125, 61, 162), (126, 57, 161), (127, 47, 162), + (112, 40, 169), (82, 35, 179), (73, 39, 175), (64, 44, 171), + (63, 48, 167), (62, 52, 163), (66, 58, 158), (66, 61, 155), + (62, 63, 161), (58, 64, 166), (54, 65, 171), (54, 65, 172), + (55, 65, 174), (58, 63, 176), (62, 60, 178), (67, 61, 175), + (69, 58, 175), (63, 60, 171), (61, 63, 171), (60, 67, 171), + (59, 66, 172), (59, 66, 173), (62, 66, 169), (64, 65, 168), + (61, 73, 155), (58, 82, 156), (56, 92, 157), (55, 96, 160), + (55, 100, 164), (55, 102, 171), (57, 101, 179), (59, 101, 187), + (57, 100, 189), (57, 97, 196), (58, 98, 197), (59, 99, 199), + (66, 98, 202), (75, 96, 202), (82, 90, 203), (88, 83, 200), + (87, 73, 193), (79, 70, 190), (72, 67, 187), (70, 66, 186), + (69, 66, 185), (69, 63, 182), (77, 59, 178), (91, 55, 173), + (103, 53, 167), (123, 51, 155), (126, 52, 153), (130, 53, 152), + (129, 56, 149), (126, 60, 147), (130, 63, 146), (131, 70, 146), + (148, 84, 151), (156, 91, 152), (164, 98, 154), (164, 97, 154), + (165, 97, 154), (166, 94, 152), (165, 94, 149), (164, 92, 150), + (162, 92, 153), (162, 97, 166), (162, 95, 169), (162, 94, 173), + (159, 89, 177), (157, 85, 180), (159, 81, 181), (161, 81, 181), + (165, 90, 193), (167, 93, 194), (169, 96, 196), (168, 99, 195), + (167, 98, 194), (164, 94, 194), (161, 93, 195), (157, 96, 200), + (149, 97, 209), (143, 97, 218), (141, 94, 216), (140, 92, 215), + (134, 86, 206), (128, 77, 198), (121, 72, 194), (110, 68, 190), + (94, 74, 208), (92, 76, 212), (90, 79, 217), (88, 86, 223), + (91, 91, 225), (95, 98, 227), (103, 109, 222), (112, 122, 218), + (125, 133, 216), (139, 145, 215), (153, 155, 218), (162, 163, 222), + (166, 170, 231), (168, 178, 235), (172, 186, 238), (175, 188, 239), + (177, 193, 236), (175, 191, 234), (174, 190, 233), (168, 183, 234), + (154, 175, 233), (142, 168, 230), (131, 159, 227), (122, 146, 224), + (116, 134, 219), (113, 123, 215), (111, 115, 211), (106, 108, 210), + (102, 103, 209), (98, 101, 207), (93, 96, 207), (88, 88, 206), + (83, 82, 207), (80, 78, 204), (75, 78, 204), (74, 81, 205), + (74, 88, 208), (75, 98, 212), (75, 104, 215), (74, 109, 222), + (75, 111, 225), (71, 110, 224), (67, 110, 223), (64, 107, 221), + (63, 109, 218), (62, 109, 212), (63, 110, 209), (66, 112, 209), + (73, 109, 206), (82, 108, 203), (89, 99, 199), (96, 91, 198), + (98, 83, 193), (99, 75, 185), (95, 72, 181), (90, 67, 178), + (89, 68, 176), (87, 66, 175), (87, 64, 177), (84, 63, 180), + (82, 61, 180), (78, 63, 177), (71, 63, 174), (65, 61, 170), + (60, 60, 160), (57, 62, 156), (55, 69, 156), (56, 74, 160), + (61, 82, 164), (68, 93, 168), (75, 98, 174), (84, 100, 175), + (91, 100, 175), (96, 103, 173), (99, 105, 172), (98, 107, 174), + (96, 114, 176), (93, 119, 181), (93, 124, 186), (95, 125, 193), + (96, 129, 195), (101, 133, 195), (102, 136, 193), (99, 132, 186), + (94, 128, 179), (88, 127, 172), (84, 123, 171), (81, 123, 171) + ), + +// 515 Canyon +((195, 147, 118), (190, 144, 108), (181, 123, 90), (172, 103, 73), + (179, 117, 79), (186, 131, 85), (190, 139, 88), (195, 148, 92), + (202, 155, 111), (201, 160, 115), (200, 166, 119), (184, 161, 123), + (168, 156, 128), (154, 139, 124), (141, 123, 120), (132, 116, 113), + (124, 110, 106), (86, 90, 82), (75, 76, 76), (65, 63, 71), + (59, 56, 72), (54, 50, 74), (54, 47, 77), (55, 44, 81), + (49, 63, 98), (58, 69, 106), (67, 75, 115), (76, 90, 121), + (86, 106, 127), (89, 112, 127), (92, 118, 127), (102, 120, 125), + (103, 124, 122), (106, 124, 118), (105, 124, 112), (105, 124, 106), + (96, 113, 96), (88, 102, 86), (86, 93, 79), (85, 84, 72), + (60, 62, 46), (49, 47, 36), (38, 32, 27), (32, 28, 27), + (27, 25, 28), (29, 28, 29), (31, 31, 30), (37, 35, 35), + (47, 43, 43), (75, 50, 52), (82, 49, 45), (90, 48, 39), + (99, 52, 39), (108, 56, 39), (110, 53, 34), (113, 51, 30), + (112, 61, 28), (121, 70, 41), (131, 80, 54), (131, 89, 60), + (132, 99, 67), (133, 100, 70), (135, 102, 73), (138, 111, 80), + (135, 118, 88), (123, 120, 86), (113, 110, 77), (104, 100, 69), + (99, 94, 65), (94, 88, 62), (86, 68, 53), (81, 54, 49), + (80, 56, 63), (85, 62, 67), (90, 69, 72), (97, 87, 85), + (105, 106, 98), (111, 113, 102), (118, 120, 107), (125, 125, 111), + (126, 128, 107), (128, 125, 85), (121, 112, 73), (114, 100, 62), + (108, 92, 54), (103, 84, 47), (90, 66, 33), (84, 62, 23), + (92, 62, 30), (102, 71, 41), (112, 81, 52), (123, 92, 56), + (135, 103, 61), (163, 133, 78), (186, 152, 87), (209, 166, 96), + (222, 168, 91), (222, 163, 89), (217, 153, 87), (212, 143, 86), + (205, 135, 85), (199, 127, 85), (183, 120, 91), (168, 116, 101), + (152, 122, 114), (143, 132, 125), (135, 143, 137), (133, 147, 142), + (132, 152, 147), (139, 158, 145), (146, 167, 146), (153, 168, 143), + (153, 164, 136), (175, 147, 99), (182, 136, 89), (189, 126, 79), + (182, 103, 59), (168, 87, 48), (145, 83, 39), (134, 68, 34), + (100, 41, 18), (79, 47, 18), (59, 54, 19), (55, 54, 23), + (52, 55, 27), (50, 48, 25), (45, 45, 23), (43, 54, 22), + (47, 62, 36), (66, 73, 60), (73, 79, 64), (80, 85, 68), + (96, 97, 82), (109, 113, 88), (122, 126, 98), (140, 139, 104), + (157, 156, 115), (157, 162, 126), (157, 168, 138), (162, 169, 145), + (168, 171, 152), (169, 186, 167), (172, 194, 174), (170, 194, 178), + (179, 178, 171), (178, 169, 151), (172, 162, 140), (166, 156, 130), + (153, 130, 105), (139, 112, 90), (130, 105, 79), (123, 99, 71), + (116, 98, 74), (118, 103, 74), (120, 108, 74), (130, 119, 73), + (138, 129, 78), (152, 134, 92), (162, 143, 98), (171, 153, 102), + (170, 160, 102), (166, 147, 110), (164, 143, 110), (162, 140, 110), + (159, 134, 98), (161, 122, 82), (159, 107, 64), (153, 95, 56), + (142, 78, 43), (141, 78, 44), (140, 78, 46), (135, 83, 60), + (130, 85, 77), (117, 84, 91), (106, 85, 102), (97, 92, 112), + (94, 92, 127), (82, 93, 144), (81, 95, 146), (78, 103, 141), + (86, 113, 138), (78, 115, 160), (80, 118, 170), (83, 120, 168), + (112, 142, 156), (116, 140, 157), (120, 138, 158), (128, 124, 147), + (149, 118, 122), (172, 117, 100), (186, 111, 86), (198, 102, 75), + (206, 89, 64), (213, 86, 56), (209, 88, 53), (202, 91, 54), + (184, 84, 53), (164, 84, 51), (142, 84, 46), (121, 86, 44), + (104, 83, 36), (91, 83, 32), (81, 84, 27), (74, 84, 37), + (66, 90, 48), (62, 98, 68), (61, 109, 78), (72, 112, 88), + (81, 118, 93), (92, 124, 95), (100, 128, 88), (112, 127, 84), + (122, 122, 82), (130, 118, 81), (133, 111, 71), (123, 101, 68), + (106, 91, 73), (91, 82, 90), (85, 80, 96), (82, 77, 98), + (83, 82, 93), (93, 82, 95), (112, 87, 101), (133, 87, 101), + (155, 94, 97), (173, 100, 86), (192, 107, 81), (199, 104, 74), + (198, 102, 72), (188, 102, 71), (178, 107, 64), (169, 107, 59), + (155, 104, 60), (138, 100, 69), (126, 102, 75), (126, 104, 83), + (129, 108, 90), (128, 111, 98), (129, 118, 101), (136, 126, 111), + (152, 134, 118), (165, 144, 125), (172, 149, 125), (175, 153, 124), + (182, 148, 120), (191, 150, 111), (201, 149, 100), (205, 148, 90), + (212, 142, 85), (215, 141, 90), (223, 150, 99), (227, 157, 106), + (235, 173, 115), (238, 181, 128), (227, 173, 127), (210, 152, 120) + ), + +// 516 Carnations +((152, 48, 49), (153, 50, 49), (148, 40, 42), (143, 30, 35), + (147, 31, 37), (152, 32, 39), (155, 35, 44), (158, 39, 50), + (180, 58, 71), (187, 67, 79), (195, 76, 87), (196, 84, 89), + (197, 92, 92), (194, 95, 82), (192, 99, 72), (188, 95, 69), + (185, 92, 66), (180, 88, 61), (178, 89, 58), (177, 90, 55), + (177, 89, 63), (178, 88, 72), (178, 89, 71), (179, 90, 71), + (167, 91, 73), (154, 89, 71), (141, 87, 69), (139, 80, 62), + (138, 74, 56), (135, 69, 54), (132, 64, 52), (130, 55, 42), + (135, 42, 31), (146, 26, 18), (138, 21, 13), (131, 17, 9), + (117, 20, 9), (103, 23, 10), (95, 27, 11), (88, 31, 13), + (61, 42, 23), (61, 47, 26), (62, 53, 30), (64, 59, 33), + (66, 66, 36), (69, 68, 36), (72, 70, 37), (77, 73, 38), + (74, 73, 38), (72, 71, 35), (66, 64, 32), (60, 57, 29), + (54, 51, 24), (49, 45, 20), (47, 42, 18), (45, 39, 17), + (34, 34, 13), (32, 38, 14), (30, 43, 15), (33, 48, 18), + (37, 53, 21), (39, 56, 23), (42, 59, 25), (46, 61, 30), + (50, 64, 35), (48, 65, 37), (46, 61, 33), (44, 58, 29), + (40, 55, 26), (37, 53, 24), (29, 48, 22), (25, 47, 18), + (24, 39, 6), (26, 34, 7), (28, 30, 9), (34, 27, 8), + (40, 25, 8), (46, 23, 7), (53, 22, 7), (67, 18, 10), + (77, 17, 10), (85, 11, 7), (84, 13, 10), (84, 15, 14), + (83, 17, 15), (82, 19, 16), (77, 17, 19), (75, 18, 21), + (77, 25, 28), (90, 28, 31), (104, 31, 34), (114, 33, 35), + (125, 36, 37), (143, 47, 39), (160, 58, 49), (170, 67, 56), + (179, 75, 66), (193, 98, 74), (186, 100, 79), (179, 103, 85), + (175, 102, 85), (172, 101, 85), (170, 98, 82), (169, 88, 74), + (163, 72, 65), (157, 65, 57), (152, 59, 50), (147, 56, 45), + (142, 53, 41), (134, 47, 36), (120, 51, 37), (105, 57, 38), + (87, 63, 40), (70, 68, 46), (68, 72, 47), (66, 77, 49), + (64, 84, 52), (70, 89, 56), (81, 86, 58), (98, 90, 60), + (129, 111, 61), (141, 109, 64), (154, 108, 67), (156, 106, 66), + (159, 104, 65), (160, 106, 59), (149, 102, 55), (134, 90, 48), + (116, 75, 40), (77, 52, 22), (67, 47, 18), (58, 42, 14), + (42, 33, 7), (30, 24, 3), (24, 21, 1), (21, 21, 0), + (14, 21, 8), (18, 24, 11), (23, 28, 15), (27, 31, 16), + (32, 34, 17), (41, 38, 23), (53, 41, 28), (66, 43, 32), + (80, 42, 33), (103, 39, 31), (104, 40, 31), (105, 41, 31), + (100, 41, 31), (93, 43, 27), (86, 45, 23), (81, 50, 22), + (72, 53, 14), (74, 50, 12), (76, 47, 11), (91, 47, 14), + (103, 48, 18), (116, 49, 22), (126, 44, 25), (140, 47, 34), + (148, 55, 41), (149, 74, 46), (145, 76, 48), (142, 79, 51), + (133, 84, 55), (117, 83, 52), (101, 84, 44), (84, 78, 37), + (56, 63, 34), (51, 61, 32), (47, 60, 30), (45, 58, 25), + (54, 56, 26), (69, 58, 31), (89, 63, 37), (108, 73, 44), + (129, 81, 55), (149, 89, 67), (165, 98, 77), (187, 109, 78), + (200, 125, 85), (215, 141, 93), (215, 150, 103), (225, 147, 104), + (217, 144, 101), (212, 143, 100), (207, 143, 99), (205, 132, 95), + (188, 116, 92), (173, 102, 82), (162, 93, 73), (157, 87, 65), + (152, 81, 59), (143, 73, 51), (135, 65, 45), (126, 59, 41), + (121, 52, 37), (113, 44, 30), (102, 39, 22), (92, 41, 21), + (90, 44, 24), (91, 42, 28), (91, 43, 30), (93, 47, 35), + (96, 54, 41), (101, 52, 43), (103, 47, 40), (103, 36, 36), + (97, 34, 30), (89, 29, 26), (79, 25, 17), (74, 14, 11), + (69, 10, 5), (72, 10, 6), (78, 12, 12), (94, 14, 19), + (112, 21, 26), (130, 34, 34), (147, 44, 46), (160, 52, 54), + (172, 60, 63), (177, 71, 66), (181, 77, 69), (177, 77, 68), + (178, 73, 65), (175, 65, 62), (180, 56, 56), (182, 43, 49), + (185, 33, 40), (184, 23, 33), (186, 17, 26), (184, 10, 22), + (173, 7, 20), (159, 12, 17), (146, 26, 18), (133, 39, 22), + (120, 48, 32), (110, 61, 38), (114, 81, 49), (124, 107, 66), + (135, 123, 85), (140, 126, 87), (150, 122, 83), (161, 121, 83), + (170, 122, 92), (169, 113, 90), (162, 98, 78), (154, 81, 64), + (145, 71, 61), (141, 59, 60), (140, 54, 58), (144, 52, 55), + (148, 56, 59), (155, 61, 66), (153, 57, 62), (154, 53, 56) + ), + +// 517 Carnival +((203, 92, 124), (201, 82, 109), (200, 79, 105), (199, 77, 101), + (197, 75, 96), (196, 73, 92), (195, 73, 89), (194, 73, 87), + (186, 72, 78), (183, 70, 75), (181, 69, 73), (177, 69, 76), + (173, 69, 79), (169, 68, 80), (166, 68, 81), (164, 69, 83), + (163, 71, 85), (164, 72, 97), (167, 77, 111), (170, 82, 125), + (171, 92, 139), (173, 102, 154), (173, 106, 160), (174, 110, 166), + (182, 126, 186), (188, 132, 196), (194, 139, 206), (196, 146, 212), + (199, 154, 219), (199, 157, 220), (200, 160, 221), (201, 159, 218), + (200, 155, 213), (201, 140, 187), (198, 128, 172), (195, 117, 158), + (190, 106, 148), (185, 95, 138), (184, 90, 134), (183, 86, 130), + (181, 81, 117), (181, 83, 115), (181, 85, 113), (182, 90, 121), + (183, 96, 129), (184, 100, 133), (186, 104, 138), (191, 115, 149), + (196, 122, 158), (203, 136, 166), (204, 138, 170), (206, 141, 174), + (206, 141, 176), (206, 141, 178), (206, 139, 177), (207, 137, 176), + (202, 129, 166), (199, 124, 159), (196, 119, 153), (195, 114, 145), + (195, 110, 138), (194, 106, 133), (193, 102, 129), (191, 95, 119), + (187, 86, 108), (178, 69, 91), (176, 64, 85), (174, 60, 80), + (174, 60, 80), (174, 60, 81), (173, 60, 83), (171, 64, 91), + (172, 75, 124), (175, 82, 141), (178, 89, 158), (183, 95, 171), + (188, 102, 185), (190, 106, 191), (193, 110, 198), (196, 117, 210), + (197, 122, 219), (201, 123, 228), (200, 119, 223), (199, 116, 218), + (198, 114, 213), (197, 113, 208), (194, 110, 195), (190, 111, 181), + (189, 113, 155), (186, 114, 151), (184, 115, 148), (183, 114, 149), + (183, 113, 151), (178, 112, 154), (182, 112, 156), (185, 111, 159), + (189, 111, 164), (192, 115, 186), (192, 115, 199), (192, 116, 213), + (193, 116, 216), (195, 116, 219), (196, 114, 215), (193, 112, 206), + (178, 101, 189), (168, 98, 185), (158, 96, 181), (155, 94, 176), + (153, 92, 171), (152, 89, 158), (149, 86, 147), (152, 80, 140), + (149, 75, 139), (149, 75, 153), (153, 77, 155), (157, 79, 158), + (164, 89, 163), (174, 96, 168), (184, 104, 177), (193, 113, 187), + (199, 122, 208), (199, 126, 215), (200, 131, 222), (200, 134, 225), + (200, 137, 228), (201, 143, 232), (199, 148, 233), (198, 150, 234), + (193, 147, 236), (193, 145, 236), (193, 145, 235), (193, 146, 235), + (193, 149, 230), (194, 153, 224), (192, 150, 217), (192, 145, 209), + (194, 132, 194), (193, 124, 188), (193, 117, 182), (191, 114, 179), + (189, 112, 176), (184, 102, 168), (180, 94, 158), (178, 85, 150), + (178, 78, 139), (177, 67, 132), (177, 64, 131), (177, 61, 130), + (175, 59, 130), (174, 58, 131), (175, 61, 127), (178, 62, 124), + (191, 79, 124), (194, 84, 127), (197, 89, 130), (201, 98, 142), + (203, 107, 155), (204, 115, 167), (203, 127, 176), (202, 136, 183), + (204, 144, 188), (205, 154, 199), (205, 154, 201), (206, 154, 204), + (206, 153, 209), (204, 151, 214), (199, 146, 217), (194, 142, 217), + (190, 132, 217), (190, 128, 217), (191, 125, 217), (195, 122, 220), + (198, 115, 224), (199, 111, 225), (198, 109, 228), (198, 113, 228), + (198, 112, 226), (202, 117, 224), (208, 119, 225), (212, 121, 223), + (212, 123, 223), (212, 130, 221), (209, 135, 219), (206, 143, 216), + (203, 151, 214), (202, 151, 213), (201, 152, 213), (201, 151, 212), + (197, 149, 208), (194, 147, 204), (193, 142, 200), (192, 139, 196), + (193, 137, 195), (193, 133, 195), (193, 126, 194), (194, 120, 192), + (195, 111, 193), (194, 103, 190), (192, 96, 184), (190, 90, 179), + (189, 85, 170), (189, 84, 160), (191, 80, 153), (193, 79, 145), + (193, 73, 131), (191, 68, 117), (189, 63, 101), (187, 63, 85), + (190, 66, 74), (195, 75, 72), (201, 84, 74), (205, 90, 80), + (207, 97, 86), (207, 102, 95), (210, 109, 105), (212, 116, 117), + (214, 125, 134), (217, 132, 152), (219, 137, 169), (217, 140, 184), + (217, 142, 197), (216, 142, 208), (217, 142, 216), (216, 143, 220), + (218, 142, 222), (217, 143, 218), (215, 141, 213), (213, 140, 209), + (214, 142, 207), (213, 144, 206), (213, 146, 205), (213, 150, 203), + (211, 151, 198), (208, 148, 195), (207, 146, 191), (205, 140, 185), + (202, 133, 183), (199, 128, 179), (198, 124, 172), (196, 118, 168), + (195, 114, 163), (197, 112, 159), (198, 110, 156), (198, 109, 156), + (202, 111, 151), (202, 113, 149), (202, 115, 147), (203, 119, 147), + (204, 121, 146), (202, 121, 151), (206, 121, 153), (207, 118, 155), + (208, 115, 155), (208, 109, 151), (207, 105, 142), (204, 96, 134) + ), + +// 518 Carpenter +((143, 159, 149), (98, 114, 104), (77, 91, 82), (57, 68, 60), + (48, 59, 52), (39, 50, 44), (39, 49, 43), (39, 48, 43), + (41, 50, 47), (44, 55, 49), (47, 60, 51), (65, 62, 47), + (83, 65, 43), (95, 71, 43), (108, 78, 44), (105, 80, 51), + (103, 83, 58), (87, 98, 92), (108, 102, 84), (130, 107, 76), + (147, 112, 67), (164, 118, 58), (158, 112, 52), (152, 106, 47), + (109, 71, 26), (102, 66, 22), (95, 62, 19), (107, 70, 24), + (119, 79, 30), (123, 85, 36), (127, 91, 43), (148, 111, 59), + (165, 123, 73), (195, 138, 69), (180, 128, 61), (166, 118, 54), + (149, 105, 49), (133, 93, 44), (130, 91, 44), (127, 90, 45), + (120, 88, 47), (113, 90, 59), (107, 92, 71), (101, 102, 86), + (95, 112, 102), (96, 116, 105), (98, 120, 108), (98, 120, 108), + (93, 115, 103), (80, 93, 84), (75, 87, 76), (71, 82, 68), + (61, 73, 62), (52, 65, 56), (51, 64, 55), (51, 64, 55), + (49, 62, 53), (50, 63, 54), (52, 65, 56), (59, 74, 65), + (67, 84, 74), (72, 86, 78), (77, 88, 82), (82, 98, 87), + (92, 110, 98), (107, 127, 116), (132, 127, 102), (157, 127, 89), + (164, 128, 84), (171, 129, 79), (163, 113, 50), (152, 105, 49), + (88, 71, 45), (72, 66, 51), (56, 62, 58), (68, 72, 59), + (80, 82, 61), (94, 88, 68), (109, 94, 75), (147, 117, 79), + (167, 133, 88), (193, 139, 75), (179, 128, 65), (165, 117, 55), + (154, 111, 57), (144, 106, 59), (119, 99, 72), (94, 104, 96), + (90, 103, 94), (87, 100, 91), (84, 97, 88), (93, 96, 80), + (102, 96, 72), (108, 94, 68), (113, 94, 64), (136, 95, 51), + (155, 108, 52), (131, 95, 59), (120, 106, 86), (109, 118, 113), + (114, 125, 118), (120, 133, 124), (129, 140, 132), (135, 155, 144), + (140, 156, 146), (158, 149, 121), (176, 142, 96), (180, 143, 95), + (184, 144, 95), (194, 147, 93), (193, 148, 89), (176, 139, 87), + (159, 118, 72), (113, 93, 66), (107, 94, 72), (102, 95, 79), + (97, 110, 103), (95, 112, 102), (100, 117, 107), (102, 122, 110), + (129, 123, 107), (147, 128, 100), (165, 133, 94), (166, 134, 95), + (168, 136, 97), (168, 135, 92), (162, 127, 87), (159, 125, 87), + (152, 111, 65), (131, 95, 47), (129, 92, 44), (127, 89, 42), + (122, 88, 40), (107, 74, 29), (103, 73, 39), (96, 66, 28), + (95, 62, 19), (93, 63, 27), (92, 65, 35), (88, 69, 42), + (85, 73, 49), (91, 84, 68), (97, 108, 100), (102, 122, 111), + (112, 128, 117), (124, 144, 133), (120, 141, 129), (116, 138, 126), + (111, 128, 118), (98, 114, 103), (82, 95, 86), (66, 82, 72), + (50, 63, 56), (47, 59, 53), (45, 56, 50), (45, 54, 49), + (44, 50, 48), (44, 53, 48), (52, 54, 41), (69, 49, 24), + (75, 51, 23), (92, 61, 17), (93, 61, 17), (94, 61, 18), + (90, 65, 34), (74, 73, 55), (83, 78, 58), (93, 73, 48), + (114, 80, 43), (114, 81, 43), (115, 83, 44), (101, 84, 58), + (78, 91, 82), (79, 92, 83), (74, 90, 80), (69, 80, 72), + (59, 72, 63), (53, 62, 57), (47, 58, 50), (44, 55, 47), + (52, 54, 41), (73, 55, 35), (74, 50, 22), (82, 54, 15), + (84, 54, 16), (81, 53, 16), (78, 52, 17), (74, 51, 20), + (70, 48, 24), (72, 48, 20), (71, 46, 16), (71, 47, 21), + (66, 49, 23), (56, 47, 30), (48, 48, 38), (41, 50, 45), + (36, 45, 40), (34, 40, 36), (41, 42, 28), (58, 42, 19), + (64, 44, 19), (68, 44, 18), (60, 45, 24), (51, 52, 38), + (41, 52, 44), (43, 54, 48), (41, 50, 47), (40, 46, 42), + (60, 44, 21), (64, 46, 24), (74, 51, 20), (90, 58, 20), + (94, 68, 33), (103, 82, 55), (105, 89, 66), (121, 97, 69), + (154, 122, 83), (168, 137, 93), (186, 150, 102), (198, 157, 101), + (199, 159, 107), (195, 158, 106), (199, 152, 100), (197, 150, 94), + (196, 151, 96), (194, 152, 102), (186, 149, 105), (183, 146, 101), + (182, 146, 98), (182, 145, 93), (183, 139, 92), (198, 140, 76), + (194, 145, 87), (180, 140, 91), (169, 137, 96), (121, 132, 124), + (127, 140, 133), (126, 143, 133), (134, 150, 140), (137, 153, 143), + (139, 155, 145), (136, 153, 143), (123, 145, 132), (121, 141, 130), + (119, 132, 123), (115, 131, 121), (104, 124, 113), (105, 118, 109), + (105, 116, 108), (102, 118, 108), (104, 124, 113), (106, 123, 113), + (115, 137, 124), (126, 142, 132), (139, 150, 142), (179, 145, 100) + ), + +// 519 Cellist +((141, 91, 68), (93, 57, 37), (80, 47, 29), (68, 37, 21), + (65, 36, 20), (63, 35, 20), (59, 33, 19), (55, 32, 18), + (43, 26, 14), (40, 25, 14), (37, 24, 14), (36, 23, 12), + (35, 23, 11), (38, 25, 12), (41, 27, 14), (43, 27, 14), + (46, 28, 15), (55, 36, 19), (60, 41, 22), (65, 46, 26), + (73, 52, 30), (81, 58, 34), (86, 63, 38), (92, 68, 43), + (109, 92, 68), (111, 98, 77), (113, 104, 87), (117, 102, 84), + (121, 101, 81), (116, 99, 79), (112, 98, 78), (106, 93, 78), + (105, 79, 62), (105, 66, 41), (110, 65, 40), (115, 64, 39), + (116, 64, 38), (117, 65, 37), (116, 65, 37), (115, 66, 38), + (105, 59, 35), (94, 54, 30), (83, 50, 26), (75, 48, 27), + (68, 47, 28), (68, 47, 29), (69, 47, 30), (75, 50, 33), + (88, 63, 39), (131, 100, 63), (150, 115, 73), (169, 131, 83), + (190, 152, 100), (212, 174, 117), (218, 179, 120), (224, 185, 124), + (231, 184, 123), (231, 183, 120), (232, 183, 117), (225, 170, 104), + (218, 157, 92), (215, 154, 90), (213, 151, 88), (206, 146, 80), + (194, 137, 74), (181, 121, 66), (175, 116, 64), (169, 112, 62), + (165, 109, 60), (162, 107, 58), (159, 101, 57), (159, 98, 53), + (143, 91, 48), (134, 85, 45), (126, 80, 43), (116, 77, 41), + (107, 74, 40), (102, 71, 39), (98, 69, 38), (91, 63, 36), + (87, 58, 34), (83, 54, 30), (80, 51, 29), (78, 48, 28), + (77, 47, 27), (76, 46, 27), (71, 43, 25), (66, 42, 24), + (55, 37, 22), (49, 32, 19), (44, 28, 16), (42, 26, 15), + (40, 24, 15), (38, 23, 14), (37, 22, 13), (38, 23, 13), + (41, 27, 15), (59, 39, 24), (75, 47, 30), (92, 56, 37), + (101, 59, 40), (111, 63, 43), (131, 72, 51), (153, 83, 58), + (192, 97, 71), (200, 109, 77), (209, 121, 84), (212, 124, 85), + (215, 128, 87), (208, 126, 85), (194, 120, 81), (176, 118, 77), + (160, 114, 72), (124, 90, 53), (115, 83, 49), (107, 77, 45), + (94, 66, 39), (85, 60, 33), (81, 57, 30), (79, 54, 29), + (71, 48, 26), (68, 47, 24), (66, 46, 23), (66, 45, 23), + (66, 44, 24), (64, 45, 24), (63, 45, 24), (64, 46, 25), + (68, 48, 27), (79, 53, 30), (81, 54, 31), (83, 55, 32), + (87, 58, 34), (92, 60, 36), (98, 65, 37), (104, 67, 37), + (123, 72, 42), (135, 73, 44), (147, 75, 47), (153, 77, 47), + (159, 80, 48), (170, 86, 54), (181, 95, 60), (188, 101, 67), + (190, 104, 69), (188, 104, 70), (186, 103, 68), (185, 102, 67), + (172, 98, 62), (155, 84, 54), (141, 71, 44), (132, 60, 35), + (104, 48, 24), (97, 46, 22), (91, 45, 20), (87, 45, 20), + (88, 49, 23), (91, 53, 29), (96, 59, 33), (106, 70, 38), + (115, 79, 46), (121, 84, 54), (123, 85, 53), (125, 87, 52), + (130, 89, 53), (132, 87, 52), (127, 78, 48), (119, 71, 42), + (111, 64, 34), (109, 62, 34), (107, 61, 34), (97, 59, 36), + (89, 59, 40), (82, 62, 46), (85, 66, 49), (92, 68, 50), + (100, 71, 52), (103, 74, 58), (107, 76, 57), (112, 73, 50), + (119, 69, 42), (119, 66, 39), (114, 63, 36), (107, 58, 31), + (92, 47, 21), (89, 45, 20), (87, 44, 19), (82, 41, 18), + (77, 38, 18), (73, 36, 17), (69, 35, 16), (67, 33, 15), + (67, 34, 16), (71, 36, 16), (77, 40, 19), (87, 48, 24), + (100, 60, 32), (117, 75, 39), (134, 89, 47), (151, 104, 57), + (163, 117, 70), (167, 122, 79), (164, 120, 84), (162, 118, 78), + (156, 114, 75), (146, 104, 69), (133, 90, 66), (125, 80, 56), + (123, 75, 47), (127, 71, 42), (139, 68, 42), (153, 68, 46), + (168, 73, 50), (177, 78, 56), (185, 85, 64), (189, 87, 70), + (199, 95, 73), (199, 104, 73), (195, 112, 75), (184, 113, 78), + (182, 114, 77), (177, 114, 71), (168, 111, 64), (152, 102, 60), + (138, 95, 57), (127, 88, 53), (114, 81, 48), (101, 74, 43), + (88, 66, 38), (79, 60, 34), (72, 53, 32), (67, 48, 29), + (61, 43, 25), (56, 39, 23), (51, 34, 21), (48, 32, 19), + (45, 30, 17), (45, 31, 17), (45, 34, 19), (47, 37, 21), + (49, 40, 23), (52, 40, 22), (54, 41, 23), (56, 43, 26), + (59, 45, 29), (63, 45, 29), (68, 46, 29), (76, 52, 32), + (88, 61, 37), (103, 73, 44), (119, 86, 50), (143, 100, 71), + (163, 111, 81), (154, 106, 77), (137, 96, 60), (128, 87, 62) + ), + +// 520 Cherry +((179, 49, 37), (185, 76, 61), (196, 103, 83), (208, 130, 106), + (220, 138, 116), (233, 146, 126), (236, 145, 125), (239, 145, 125), + (239, 129, 112), (236, 106, 94), (233, 84, 76), (224, 68, 61), + (216, 53, 47), (205, 47, 43), (194, 41, 39), (188, 38, 35), + (182, 35, 31), (141, 27, 18), (126, 21, 13), (112, 16, 8), + (104, 13, 5), (96, 11, 2), (96, 10, 3), (97, 10, 4), + (118, 20, 13), (138, 25, 18), (158, 31, 24), (166, 37, 33), + (174, 43, 42), (178, 47, 47), (183, 51, 52), (192, 59, 56), + (193, 58, 58), (179, 58, 54), (174, 52, 47), (169, 47, 41), + (171, 38, 35), (174, 29, 29), (174, 23, 25), (174, 18, 21), + (179, 9, 21), (185, 10, 23), (191, 12, 25), (191, 13, 25), + (191, 14, 26), (188, 18, 26), (186, 22, 27), (183, 31, 28), + (182, 36, 32), (181, 51, 41), (183, 65, 50), (186, 80, 59), + (199, 91, 70), (213, 103, 82), (217, 107, 86), (221, 112, 91), + (226, 116, 94), (228, 112, 93), (231, 108, 92), (232, 111, 96), + (234, 115, 100), (235, 117, 102), (237, 120, 105), (235, 122, 108), + (229, 116, 105), (219, 113, 98), (199, 98, 86), (180, 84, 74), + (165, 71, 63), (151, 59, 53), (117, 41, 34), (93, 27, 22), + (66, 4, 8), (55, 2, 5), (45, 0, 2), (51, 0, 2), + (57, 1, 3), (59, 1, 2), (62, 2, 1), (64, 2, 0), + (66, 3, 1), (77, 8, 4), (87, 10, 5), (98, 12, 7), + (104, 12, 7), (110, 13, 8), (129, 16, 14), (144, 18, 19), + (157, 15, 16), (155, 14, 17), (153, 13, 18), (149, 11, 17), + (146, 9, 17), (133, 6, 13), (118, 6, 10), (103, 5, 7), + (91, 2, 3), (77, 0, 3), (73, 0, 1), (70, 0, 0), + (68, 0, 0), (66, 0, 0), (64, 0, 0), (61, 0, 0), + (59, 1, 1), (59, 1, 1), (59, 2, 1), (59, 2, 0), + (59, 2, 0), (58, 1, 0), (60, 2, 1), (62, 2, 1), + (64, 2, 1), (71, 1, 0), (73, 1, 0), (76, 1, 0), + (81, 3, 0), (90, 3, 0), (101, 4, 0), (113, 3, 3), + (131, 2, 6), (140, 2, 6), (150, 3, 7), (150, 2, 7), + (151, 2, 7), (146, 1, 7), (142, 2, 6), (139, 2, 4), + (134, 1, 2), (121, 2, 0), (118, 2, 0), (116, 3, 0), + (112, 2, 0), (110, 1, 0), (111, 1, 0), (110, 1, 0), + (114, 1, 0), (119, 4, 1), (125, 7, 3), (128, 10, 5), + (132, 14, 8), (140, 25, 15), (146, 33, 21), (146, 37, 25), + (144, 37, 23), (136, 37, 23), (132, 35, 23), (128, 33, 23), + (119, 25, 17), (112, 16, 11), (108, 9, 4), (104, 4, 2), + (96, 2, 2), (95, 1, 1), (95, 1, 1), (94, 1, 0), + (93, 1, 0), (92, 1, 0), (92, 1, 0), (92, 1, 0), + (93, 2, 1), (100, 5, 5), (104, 6, 6), (108, 8, 8), + (117, 11, 10), (123, 17, 12), (130, 23, 17), (136, 28, 20), + (143, 28, 16), (141, 27, 15), (140, 27, 15), (132, 25, 14), + (125, 19, 10), (118, 13, 6), (111, 9, 3), (103, 5, 1), + (97, 2, 0), (93, 1, 0), (90, 2, 0), (91, 3, 0), + (93, 5, 1), (98, 6, 4), (103, 9, 8), (108, 15, 12), + (131, 30, 22), (138, 33, 26), (146, 37, 31), (157, 44, 40), + (169, 53, 46), (187, 56, 49), (199, 58, 50), (209, 57, 52), + (213, 57, 54), (216, 56, 54), (208, 57, 51), (201, 58, 53), + (192, 66, 62), (192, 71, 66), (186, 78, 65), (187, 77, 61), + (181, 86, 70), (184, 88, 69), (182, 86, 64), (182, 72, 47), + (173, 61, 41), (164, 51, 31), (151, 43, 25), (135, 31, 16), + (123, 20, 11), (113, 11, 5), (105, 6, 3), (97, 3, 1), + (90, 1, 0), (83, 0, 0), (79, 0, 0), (79, 0, 0), + (79, 0, 0), (79, 0, 0), (81, 1, 0), (87, 2, 0), + (94, 4, 0), (102, 7, 0), (109, 10, 4), (114, 12, 7), + (116, 15, 9), (115, 17, 8), (112, 21, 11), (111, 20, 13), + (110, 22, 13), (115, 20, 11), (120, 19, 11), (132, 19, 15), + (147, 23, 18), (165, 27, 22), (180, 26, 25), (193, 26, 29), + (202, 26, 32), (203, 27, 33), (198, 22, 30), (189, 18, 26), + (179, 13, 22), (164, 9, 17), (149, 4, 12), (137, 1, 9), + (131, 0, 9), (127, 0, 7), (124, 0, 7), (123, 0, 8), + (125, 2, 8), (131, 4, 9), (138, 7, 9), (155, 14, 17), + (164, 20, 21), (160, 22, 19), (151, 21, 12), (162, 34, 21) + ), + +// 521 Circus +((43, 95, 52), (58, 92, 51), (71, 87, 46), (85, 83, 41), + (95, 73, 37), (105, 63, 34), (111, 58, 35), (117, 53, 36), + (144, 35, 38), (153, 25, 33), (163, 15, 28), (168, 10, 29), + (173, 5, 30), (173, 8, 35), (173, 11, 41), (172, 14, 44), + (171, 18, 48), (164, 30, 70), (157, 35, 84), (151, 40, 98), + (143, 46, 108), (136, 53, 118), (137, 57, 124), (138, 61, 131), + (144, 63, 156), (142, 65, 157), (141, 68, 158), (140, 74, 147), + (139, 80, 136), (140, 82, 130), (141, 85, 125), (143, 94, 115), + (140, 104, 103), (125, 123, 68), (124, 129, 54), (123, 135, 40), + (123, 140, 34), (123, 146, 28), (121, 147, 27), (120, 148, 26), + (117, 144, 31), (119, 137, 34), (121, 131, 38), (117, 123, 47), + (113, 115, 57), (110, 110, 63), (107, 106, 69), (109, 100, 80), + (112, 92, 90), (125, 72, 111), (123, 64, 118), (122, 56, 126), + (120, 51, 128), (119, 47, 130), (118, 44, 129), (118, 42, 128), + (100, 33, 117), (87, 35, 111), (75, 38, 105), (66, 42, 101), + (58, 47, 97), (55, 48, 94), (53, 50, 91), (53, 52, 85), + (58, 54, 78), (77, 58, 67), (88, 57, 61), (99, 56, 55), + (105, 53, 50), (112, 50, 46), (126, 44, 35), (138, 37, 25), + (153, 26, 13), (155, 24, 10), (157, 22, 7), (155, 21, 4), + (154, 20, 2), (153, 18, 1), (152, 16, 1), (149, 13, 2), + (143, 10, 7), (130, 13, 18), (124, 13, 22), (119, 14, 26), + (117, 14, 30), (116, 14, 34), (115, 14, 46), (111, 17, 58), + (96, 26, 68), (88, 32, 70), (80, 38, 73), (77, 41, 76), + (74, 45, 79), (69, 53, 84), (63, 59, 86), (55, 64, 87), + (47, 67, 87), (36, 72, 92), (33, 74, 96), (30, 76, 100), + (29, 74, 101), (28, 73, 102), (25, 67, 103), (20, 59, 103), + (11, 48, 103), (9, 42, 101), (8, 37, 99), (9, 34, 97), + (11, 31, 96), (17, 27, 95), (28, 26, 97), (38, 27, 100), + (49, 28, 103), (70, 32, 99), (76, 32, 97), (83, 33, 95), + (96, 33, 90), (104, 31, 86), (107, 30, 76), (103, 30, 68), + (92, 28, 43), (86, 24, 33), (81, 21, 24), (77, 20, 20), + (73, 19, 17), (64, 19, 11), (58, 17, 7), (54, 18, 7), + (52, 17, 9), (49, 19, 20), (48, 18, 23), (48, 18, 26), + (45, 17, 32), (42, 16, 39), (41, 19, 49), (41, 26, 61), + (42, 36, 82), (44, 39, 88), (47, 42, 95), (51, 45, 99), + (56, 48, 103), (69, 57, 113), (85, 66, 124), (100, 74, 131), + (115, 80, 135), (145, 86, 134), (153, 87, 134), (162, 89, 135), + (174, 93, 136), (184, 96, 139), (191, 96, 143), (195, 92, 140), + (201, 76, 124), (201, 72, 120), (201, 69, 117), (199, 64, 118), + (195, 58, 115), (190, 51, 108), (181, 43, 91), (174, 40, 70), + (169, 43, 56), (162, 64, 40), (158, 69, 36), (155, 74, 32), + (151, 86, 24), (148, 97, 20), (148, 111, 19), (147, 126, 23), + (138, 145, 37), (136, 144, 41), (135, 143, 45), (135, 135, 51), + (136, 123, 55), (132, 110, 56), (128, 102, 55), (128, 91, 57), + (132, 76, 60), (142, 60, 65), (151, 45, 73), (156, 36, 79), + (161, 32, 85), (165, 30, 92), (170, 26, 99), (176, 24, 110), + (182, 27, 134), (181, 28, 138), (181, 29, 142), (181, 29, 146), + (182, 27, 145), (180, 24, 141), (177, 21, 137), (171, 18, 134), + (163, 16, 132), (156, 12, 129), (148, 8, 122), (139, 5, 113), + (127, 2, 103), (112, 1, 94), (97, 2, 88), (82, 2, 84), + (67, 3, 80), (56, 4, 77), (45, 6, 73), (35, 7, 70), + (25, 9, 69), (16, 12, 69), (10, 14, 71), (6, 16, 74), + (4, 16, 76), (2, 14, 76), (1, 13, 75), (2, 13, 73), + (7, 14, 73), (16, 17, 72), (25, 18, 69), (32, 16, 63), + (37, 14, 55), (42, 13, 48), (49, 18, 44), (57, 25, 41), + (62, 30, 39), (64, 31, 35), (62, 28, 33), (57, 27, 33), + (50, 27, 35), (43, 30, 40), (36, 31, 43), (32, 31, 51), + (27, 28, 57), (20, 26, 64), (14, 26, 72), (7, 27, 78), + (4, 28, 85), (3, 30, 91), (4, 34, 97), (5, 37, 101), + (7, 41, 105), (8, 42, 108), (10, 42, 110), (12, 42, 112), + (15, 44, 112), (17, 47, 112), (17, 48, 111), (16, 47, 111), + (14, 46, 111), (15, 45, 109), (16, 49, 107), (19, 55, 104), + (20, 60, 100), (20, 65, 96), (18, 69, 92), (18, 73, 87), + (22, 78, 80), (29, 84, 70), (37, 90, 61), (41, 94, 53) + ), + +// 522 City_Street +((73, 45, 53), (42, 26, 29), (32, 16, 16), (22, 6, 4), + (28, 10, 6), (34, 14, 8), (39, 19, 10), (44, 24, 13), + (72, 51, 39), (86, 63, 51), (100, 76, 64), (109, 85, 71), + (118, 94, 78), (121, 95, 86), (124, 96, 94), (122, 94, 96), + (121, 93, 98), (104, 86, 96), (96, 82, 93), (89, 78, 90), + (85, 71, 84), (81, 64, 79), (79, 62, 77), (78, 60, 75), + (75, 65, 76), (74, 65, 72), (73, 65, 68), (71, 56, 58), + (70, 48, 48), (69, 44, 43), (69, 41, 39), (67, 35, 32), + (63, 30, 27), (56, 23, 16), (54, 17, 10), (52, 12, 5), + (49, 8, 3), (46, 5, 1), (44, 5, 1), (42, 5, 1), + (32, 6, 2), (31, 5, 1), (30, 5, 1), (31, 6, 0), + (33, 7, 0), (33, 7, 0), (33, 8, 1), (34, 9, 1), + (35, 9, 1), (43, 14, 3), (45, 17, 6), (47, 21, 10), + (47, 26, 14), (47, 31, 18), (47, 32, 19), (47, 34, 20), + (42, 34, 24), (39, 32, 25), (36, 31, 26), (35, 27, 23), + (34, 23, 20), (33, 20, 18), (33, 18, 16), (35, 14, 12), + (37, 10, 9), (44, 3, 4), (48, 2, 3), (52, 2, 2), + (54, 2, 1), (57, 3, 1), (59, 3, 1), (61, 2, 0), + (64, 2, 0), (64, 2, 0), (64, 3, 0), (65, 4, 0), + (66, 6, 0), (67, 6, 0), (69, 6, 0), (73, 6, 1), + (76, 5, 3), (75, 10, 5), (75, 17, 8), (76, 25, 12), + (76, 28, 16), (77, 31, 20), (78, 37, 25), (79, 42, 29), + (80, 55, 29), (83, 59, 30), (86, 64, 32), (89, 65, 34), + (92, 66, 36), (96, 68, 38), (98, 71, 40), (103, 78, 43), + (110, 83, 47), (133, 101, 65), (141, 113, 77), (150, 126, 90), + (153, 130, 95), (156, 134, 100), (159, 139, 107), (160, 140, 109), + (152, 129, 95), (146, 118, 85), (140, 108, 76), (137, 102, 71), + (135, 96, 66), (123, 81, 51), (112, 65, 37), (108, 50, 22), + (103, 37, 13), (108, 23, 4), (105, 21, 4), (103, 19, 4), + (96, 14, 5), (86, 10, 8), (79, 8, 12), (78, 11, 16), + (79, 21, 19), (81, 27, 23), (83, 34, 27), (87, 41, 30), + (91, 49, 34), (101, 63, 42), (116, 77, 47), (126, 90, 51), + (134, 93, 54), (137, 93, 51), (135, 90, 49), (134, 88, 48), + (127, 83, 44), (116, 74, 41), (108, 61, 34), (94, 51, 29), + (67, 32, 23), (63, 31, 25), (60, 31, 28), (62, 34, 30), + (64, 37, 32), (70, 45, 36), (70, 55, 45), (72, 62, 53), + (73, 67, 59), (80, 68, 55), (78, 66, 53), (77, 65, 51), + (73, 61, 49), (69, 59, 49), (66, 56, 47), (67, 57, 45), + (79, 65, 46), (84, 69, 48), (89, 73, 50), (96, 79, 56), + (101, 84, 60), (105, 90, 64), (108, 91, 68), (113, 90, 70), + (117, 94, 77), (109, 94, 84), (106, 94, 87), (103, 94, 90), + (103, 91, 93), (108, 98, 100), (115, 104, 106), (123, 113, 111), + (131, 126, 123), (133, 127, 124), (135, 128, 126), (136, 125, 126), + (136, 117, 119), (135, 110, 112), (130, 98, 95), (123, 85, 79), + (118, 70, 64), (113, 53, 52), (111, 39, 41), (110, 29, 29), + (106, 23, 16), (100, 17, 6), (95, 11, 2), (89, 4, 0), + (75, 4, 0), (69, 5, 1), (64, 6, 3), (55, 8, 5), + (47, 10, 9), (44, 10, 13), (45, 12, 18), (49, 19, 28), + (59, 32, 41), (73, 51, 59), (89, 71, 78), (110, 91, 98), + (131, 112, 119), (154, 133, 139), (172, 157, 163), (184, 182, 185), + (193, 204, 203), (206, 222, 221), (221, 234, 229), (233, 241, 235), + (234, 242, 239), (223, 236, 234), (211, 227, 227), (199, 216, 217), + (193, 200, 199), (182, 182, 181), (162, 158, 157), (139, 135, 131), + (116, 112, 107), (97, 91, 86), (82, 72, 66), (69, 54, 48), + (58, 38, 31), (48, 29, 19), (45, 25, 13), (46, 24, 10), + (50, 22, 8), (55, 20, 5), (57, 20, 4), (60, 24, 6), + (63, 29, 11), (65, 34, 16), (67, 36, 19), (63, 36, 20), + (56, 35, 23), (52, 35, 25), (48, 36, 30), (51, 36, 36), + (52, 36, 42), (48, 36, 47), (47, 34, 49), (44, 31, 47), + (47, 29, 45), (50, 27, 42), (50, 26, 40), (46, 25, 39), + (39, 22, 35), (32, 19, 29), (26, 16, 24), (23, 15, 18), + (23, 18, 17), (26, 22, 18), (33, 29, 21), (40, 35, 28), + (52, 44, 38), (67, 52, 50), (80, 60, 62), (91, 67, 68), + (86, 65, 63), (82, 63, 59), (78, 55, 55), (72, 47, 51) + ), + +// 523 Clash +((85, 129, 75), (24, 79, 141), (27, 75, 124), (31, 72, 108), + (35, 62, 102), (39, 53, 97), (40, 51, 90), (41, 49, 84), + (33, 46, 59), (32, 48, 49), (31, 51, 39), (30, 46, 35), + (30, 41, 32), (40, 34, 30), (51, 28, 29), (56, 25, 26), + (61, 22, 23), (63, 15, 18), (52, 14, 24), (41, 13, 30), + (33, 12, 44), (26, 12, 58), (25, 10, 59), (25, 8, 60), + (23, 12, 70), (27, 13, 72), (31, 14, 75), (30, 16, 85), + (29, 19, 95), (26, 20, 100), (23, 22, 105), (19, 24, 115), + (22, 23, 116), (30, 28, 100), (48, 34, 87), (66, 40, 74), + (71, 41, 73), (77, 43, 73), (74, 42, 76), (71, 42, 79), + (51, 24, 109), (36, 19, 119), (21, 15, 130), (21, 22, 127), + (21, 29, 124), (22, 36, 117), (23, 43, 110), (28, 72, 91), + (31, 86, 62), (49, 94, 32), (61, 92, 27), (73, 91, 22), + (85, 79, 40), (98, 67, 59), (103, 61, 64), (108, 55, 70), + (84, 28, 123), (72, 18, 126), (60, 9, 130), (55, 7, 129), + (51, 6, 129), (54, 12, 121), (58, 19, 114), (78, 37, 97), + (98, 44, 75), (121, 84, 48), (122, 89, 36), (124, 94, 24), + (117, 91, 29), (110, 88, 35), (88, 78, 37), (63, 60, 36), + (26, 47, 40), (27, 62, 31), (28, 77, 23), (43, 106, 17), + (59, 135, 11), (74, 143, 9), (90, 152, 8), (108, 160, 10), + (119, 166, 12), (128, 160, 16), (124, 150, 18), (120, 141, 21), + (117, 136, 21), (114, 132, 21), (104, 122, 11), (102, 118, 16), + (120, 126, 15), (128, 133, 17), (136, 141, 20), (141, 140, 21), + (146, 139, 23), (135, 129, 29), (116, 118, 52), (101, 95, 83), + (88, 75, 92), (81, 54, 114), (99, 52, 99), (117, 51, 84), + (124, 57, 73), (131, 63, 63), (141, 63, 42), (144, 58, 34), + (104, 65, 15), (89, 61, 19), (74, 57, 23), (65, 55, 19), + (57, 54, 16), (51, 40, 16), (46, 32, 18), (40, 26, 17), + (35, 19, 23), (19, 4, 51), (14, 5, 58), (10, 6, 65), + (10, 15, 75), (13, 24, 77), (7, 39, 75), (13, 60, 60), + (16, 72, 40), (25, 70, 44), (34, 68, 48), (37, 56, 54), + (41, 44, 60), (60, 33, 69), (89, 40, 65), (109, 53, 60), + (120, 70, 51), (131, 101, 17), (121, 102, 12), (111, 104, 8), + (90, 101, 15), (79, 87, 23), (66, 66, 26), (50, 50, 41), + (59, 25, 57), (58, 20, 67), (57, 15, 78), (57, 11, 81), + (58, 7, 84), (54, 13, 94), (54, 16, 105), (49, 19, 114), + (45, 18, 126), (59, 23, 146), (61, 22, 151), (63, 21, 156), + (66, 17, 175), (75, 15, 186), (74, 15, 193), (57, 14, 199), + (37, 7, 202), (30, 7, 196), (24, 8, 191), (17, 11, 178), + (13, 16, 166), (8, 19, 147), (13, 25, 133), (16, 27, 118), + (9, 24, 99), (12, 26, 80), (10, 22, 75), (9, 19, 71), + (11, 17, 76), (9, 15, 78), (10, 9, 74), (16, 9, 76), + (32, 11, 84), (42, 15, 87), (53, 19, 91), (70, 32, 100), + (73, 42, 117), (78, 42, 134), (85, 40, 139), (76, 47, 145), + (58, 42, 144), (49, 31, 131), (46, 29, 113), (41, 25, 93), + (39, 19, 79), (37, 14, 73), (32, 8, 70), (32, 5, 76), + (18, 3, 104), (15, 7, 107), (12, 11, 111), (18, 18, 103), + (20, 25, 90), (35, 47, 72), (54, 68, 47), (74, 88, 27), + (97, 114, 15), (105, 132, 6), (109, 133, 4), (113, 132, 4), + (95, 126, 5), (72, 107, 14), (68, 91, 28), (56, 86, 36), + (34, 81, 43), (33, 81, 51), (39, 95, 45), (41, 101, 36), + (53, 108, 36), (50, 129, 51), (56, 128, 80), (63, 118, 106), + (42, 114, 147), (31, 96, 186), (26, 79, 198), (18, 64, 198), + (9, 52, 186), (4, 53, 167), (12, 53, 145), (11, 53, 134), + (11, 57, 131), (17, 53, 126), (19, 44, 137), (34, 39, 160), + (46, 44, 174), (37, 58, 196), (48, 58, 210), (70, 73, 197), + (69, 105, 181), (80, 118, 147), (103, 129, 105), (120, 142, 76), + (126, 150, 44), (125, 157, 47), (121, 151, 78), (101, 142, 81), + (79, 147, 84), (63, 144, 88), (60, 131, 71), (60, 130, 50), + (61, 138, 26), (75, 142, 14), (67, 144, 33), (53, 144, 61), + (60, 122, 94), (38, 109, 126), (14, 101, 140), (20, 68, 159), + (20, 45, 160), (17, 41, 139), (27, 32, 116), (39, 27, 89), + (50, 44, 68), (65, 59, 49), (82, 73, 28), (98, 103, 14), + (117, 127, 11), (131, 141, 7), (105, 132, 49), (78, 122, 91) + ), + +// 524 Clouds +((135, 182, 203), (158, 189, 207), (169, 188, 207), (181, 188, 207), + (192, 188, 205), (203, 188, 204), (207, 187, 202), (211, 186, 200), + (205, 180, 193), (199, 176, 192), (193, 172, 191), (190, 171, 192), + (187, 170, 194), (186, 170, 194), (185, 170, 195), (183, 170, 196), + (181, 170, 198), (172, 172, 207), (172, 173, 209), (173, 174, 212), + (174, 175, 212), (175, 176, 213), (174, 175, 213), (174, 175, 214), + (162, 170, 211), (156, 162, 203), (151, 155, 196), (148, 144, 180), + (145, 133, 165), (142, 129, 161), (140, 126, 157), (140, 124, 153), + (143, 127, 153), (155, 135, 156), (160, 136, 154), (166, 137, 153), + (166, 142, 159), (167, 147, 166), (164, 151, 171), (162, 156, 177), + (149, 166, 189), (135, 161, 183), (122, 156, 178), (104, 147, 168), + (87, 138, 159), (78, 132, 153), (69, 127, 148), (55, 115, 136), + (43, 103, 126), (34, 89, 111), (34, 88, 110), (34, 87, 109), + (40, 92, 115), (46, 98, 121), (51, 101, 126), (56, 105, 132), + (77, 126, 157), (84, 135, 167), (91, 144, 177), (94, 149, 183), + (98, 155, 189), (100, 156, 191), (103, 157, 193), (107, 160, 197), + (108, 159, 197), (107, 162, 197), (107, 163, 196), (107, 164, 195), + (107, 164, 195), (107, 164, 195), (105, 163, 194), (104, 162, 193), + (95, 168, 192), (90, 167, 190), (86, 167, 188), (80, 161, 184), + (74, 156, 180), (70, 152, 176), (66, 148, 173), (59, 144, 167), + (52, 141, 161), (51, 136, 156), (55, 135, 157), (59, 135, 159), + (62, 136, 161), (66, 138, 164), (76, 144, 170), (84, 149, 176), + (104, 158, 187), (108, 156, 188), (112, 154, 190), (110, 151, 186), + (109, 148, 183), (102, 141, 176), (94, 131, 168), (88, 123, 158), + (85, 113, 144), (77, 87, 113), (64, 76, 100), (52, 65, 88), + (46, 62, 86), (40, 60, 84), (37, 60, 82), (44, 63, 86), + (71, 77, 100), (77, 87, 113), (84, 98, 127), (86, 104, 133), + (88, 110, 140), (91, 121, 155), (97, 133, 166), (106, 143, 178), + (111, 152, 187), (115, 165, 199), (113, 166, 199), (112, 168, 199), + (105, 167, 196), (98, 168, 194), (88, 167, 189), (79, 163, 184), + (63, 153, 169), (59, 148, 163), (55, 144, 158), (55, 144, 157), + (56, 145, 157), (60, 147, 159), (66, 149, 163), (72, 151, 169), + (79, 152, 172), (96, 156, 182), (101, 159, 185), (106, 162, 189), + (118, 167, 196), (126, 172, 204), (130, 173, 209), (132, 169, 209), + (127, 162, 202), (123, 156, 196), (120, 151, 190), (119, 149, 188), + (119, 148, 186), (120, 142, 178), (131, 136, 165), (139, 128, 150), + (140, 116, 131), (125, 97, 108), (118, 95, 108), (111, 94, 109), + (106, 96, 109), (113, 103, 112), (117, 107, 113), (116, 111, 112), + (103, 116, 129), (98, 120, 135), (94, 124, 142), (97, 136, 155), + (107, 148, 169), (118, 159, 177), (130, 166, 181), (136, 168, 183), + (140, 162, 176), (141, 142, 144), (139, 136, 137), (137, 130, 130), + (132, 117, 117), (117, 111, 111), (102, 99, 103), (83, 84, 89), + (53, 59, 60), (50, 53, 54), (48, 47, 49), (41, 45, 48), + (38, 49, 56), (37, 57, 69), (39, 66, 81), (43, 75, 93), + (53, 83, 103), (63, 89, 109), (70, 94, 115), (73, 100, 121), + (75, 106, 128), (74, 111, 137), (76, 114, 146), (80, 116, 147), + (88, 105, 132), (88, 101, 126), (88, 98, 121), (85, 91, 113), + (84, 88, 111), (84, 90, 113), (89, 94, 117), (92, 98, 119), + (97, 103, 123), (99, 108, 126), (100, 115, 134), (96, 114, 135), + (94, 115, 141), (91, 116, 146), (87, 117, 149), (83, 115, 150), + (80, 122, 156), (72, 117, 148), (65, 109, 136), (57, 99, 126), + (47, 85, 112), (40, 69, 98), (36, 63, 92), (32, 57, 86), + (28, 52, 79), (23, 51, 74), (17, 50, 73), (14, 48, 71), + (11, 47, 69), (9, 42, 64), (10, 38, 60), (11, 35, 57), + (15, 35, 57), (19, 36, 55), (25, 38, 56), (33, 39, 56), + (39, 40, 53), (39, 38, 52), (39, 37, 55), (37, 37, 53), + (35, 38, 56), (36, 41, 61), (40, 47, 63), (39, 52, 69), + (36, 59, 78), (28, 66, 86), (19, 73, 93), (11, 79, 101), + (9, 86, 106), (10, 90, 111), (12, 91, 112), (14, 93, 113), + (17, 93, 113), (21, 93, 115), (24, 96, 116), (27, 98, 119), + (30, 99, 120), (33, 99, 123), (32, 100, 123), (34, 100, 124), + (38, 102, 126), (42, 105, 128), (45, 111, 133), (52, 118, 140), + (54, 125, 146), (55, 132, 152), (59, 138, 160), (65, 144, 166), + (72, 150, 174), (87, 159, 182), (104, 167, 190), (120, 176, 198) + ), + +// 525 Copper +((255, 217, 186), (255, 202, 167), (255, 188, 153), (255, 175, 140), + (243, 161, 124), (232, 147, 108), (225, 140, 99), (218, 134, 91), + (191, 106, 65), (181, 97, 58), (171, 88, 51), (163, 82, 47), + (155, 77, 44), (151, 78, 44), (148, 79, 44), (149, 79, 44), + (151, 80, 45), (165, 89, 56), (172, 97, 61), (179, 106, 67), + (186, 110, 69), (194, 114, 71), (194, 114, 70), (195, 114, 69), + (179, 102, 63), (164, 92, 55), (150, 83, 48), (131, 71, 39), + (112, 59, 31), (101, 53, 26), (91, 47, 22), (75, 39, 16), + (61, 29, 12), (59, 24, 9), (70, 32, 14), (81, 41, 20), + (101, 54, 30), (122, 67, 41), (133, 74, 48), (144, 81, 55), + (190, 111, 80), (207, 125, 91), (225, 139, 102), (233, 147, 108), + (241, 155, 115), (242, 154, 115), (244, 154, 115), (244, 152, 114), + (240, 147, 111), (228, 140, 98), (220, 131, 89), (213, 122, 80), + (203, 116, 73), (194, 110, 67), (188, 106, 64), (182, 103, 61), + (159, 83, 48), (147, 76, 42), (135, 69, 37), (121, 62, 31), + (108, 56, 25), (102, 52, 22), (96, 49, 20), (85, 41, 14), + (76, 35, 10), (55, 20, 2), (47, 14, 1), (40, 9, 0), + (39, 9, 0), (39, 9, 0), (36, 6, 0), (32, 2, 0), + (26, 1, 0), (25, 3, 0), (25, 5, 0), (24, 4, 0), + (24, 4, 0), (23, 3, 0), (22, 2, 0), (18, 0, 0), + (14, 0, 0), (6, 0, 0), (5, 0, 0), (4, 0, 0), + (4, 0, 0), (4, 0, 0), (2, 0, 0), (2, 0, 0), + (4, 0, 0), (8, 1, 0), (13, 2, 0), (16, 3, 0), + (20, 4, 0), (25, 6, 0), (31, 6, 0), (33, 10, 0), + (36, 13, 1), (43, 14, 1), (46, 14, 1), (49, 14, 1), + (51, 15, 1), (53, 16, 2), (59, 21, 6), (68, 28, 10), + (100, 48, 25), (119, 61, 35), (138, 75, 45), (148, 81, 50), + (158, 87, 56), (177, 104, 68), (197, 118, 79), (213, 130, 92), + (228, 144, 107), (248, 169, 132), (250, 173, 136), (253, 178, 140), + (255, 179, 146), (255, 182, 148), (255, 183, 150), (255, 185, 147), + (249, 174, 139), (240, 164, 129), (232, 155, 120), (225, 149, 113), + (218, 144, 107), (203, 135, 95), (190, 118, 84), (175, 111, 73), + (166, 99, 63), (148, 85, 55), (147, 85, 55), (147, 85, 56), + (144, 87, 56), (146, 84, 53), (148, 85, 55), (154, 85, 55), + (171, 94, 61), (175, 98, 61), (179, 103, 61), (180, 102, 58), + (181, 102, 56), (177, 98, 52), (174, 89, 51), (167, 87, 48), + (163, 85, 47), (155, 80, 40), (154, 79, 41), (154, 79, 43), + (154, 80, 47), (160, 88, 52), (170, 94, 59), (181, 104, 67), + (205, 126, 83), (209, 131, 87), (214, 136, 92), (222, 139, 98), + (223, 142, 98), (218, 136, 94), (209, 131, 89), (194, 123, 83), + (177, 110, 73), (136, 77, 48), (127, 70, 42), (118, 64, 37), + (102, 51, 28), (87, 45, 25), (77, 40, 20), (73, 37, 18), + (75, 32, 10), (73, 34, 11), (72, 36, 13), (71, 36, 17), + (72, 36, 18), (73, 37, 20), (77, 36, 14), (76, 33, 12), + (76, 33, 10), (77, 31, 12), (77, 37, 17), (84, 39, 18), + (91, 40, 17), (96, 40, 17), (100, 44, 16), (100, 43, 17), + (95, 43, 17), (93, 42, 16), (91, 41, 16), (91, 43, 14), + (91, 40, 13), (91, 40, 17), (94, 45, 18), (98, 48, 22), + (106, 52, 25), (115, 56, 26), (122, 61, 32), (128, 65, 35), + (132, 71, 37), (135, 68, 36), (131, 65, 33), (122, 61, 33), + (112, 57, 31), (106, 53, 29), (103, 48, 26), (102, 48, 25), + (104, 47, 25), (108, 53, 26), (116, 60, 32), (130, 65, 36), + (142, 73, 41), (156, 79, 44), (167, 87, 48), (173, 92, 49), + (174, 91, 49), (169, 88, 49), (163, 87, 45), (155, 79, 41), + (146, 73, 37), (140, 71, 33), (135, 67, 33), (139, 72, 39), + (144, 80, 43), (155, 89, 52), (171, 104, 65), (187, 122, 81), + (209, 138, 99), (230, 154, 114), (248, 173, 132), (255, 186, 150), + (255, 206, 170), (255, 217, 185), (255, 226, 191), (255, 222, 195), + (255, 228, 197), (255, 223, 199), (255, 222, 199), (255, 223, 193), + (255, 219, 182), (255, 207, 174), (255, 199, 165), (255, 197, 159), + (255, 189, 151), (255, 189, 148), (255, 186, 147), (255, 187, 148), + (255, 190, 152), (255, 193, 156), (255, 198, 163), (255, 202, 169), + (255, 206, 174), (255, 207, 179), (255, 214, 182), (255, 215, 189), + (255, 217, 193), (255, 218, 197), (255, 225, 195), (255, 217, 193) + ), + +// 526 Coral +((155, 66, 54), (138, 51, 35), (140, 52, 36), (143, 54, 37), + (141, 52, 35), (139, 51, 34), (137, 50, 32), (136, 50, 30), + (127, 41, 24), (123, 38, 20), (119, 36, 16), (109, 31, 12), + (99, 26, 8), (89, 20, 6), (80, 15, 4), (75, 13, 2), + (71, 11, 1), (76, 5, 0), (86, 11, 4), (97, 18, 8), + (114, 24, 10), (131, 30, 13), (135, 33, 16), (140, 37, 20), + (154, 39, 20), (153, 36, 17), (153, 34, 15), (147, 35, 14), + (142, 37, 13), (140, 35, 12), (139, 33, 11), (133, 35, 12), + (129, 38, 13), (125, 38, 16), (125, 39, 17), (126, 41, 18), + (126, 45, 21), (127, 49, 24), (130, 49, 26), (133, 50, 29), + (142, 60, 37), (152, 65, 43), (162, 70, 50), (177, 78, 58), + (193, 86, 66), (200, 87, 69), (207, 89, 73), (222, 94, 79), + (229, 95, 79), (226, 93, 76), (215, 85, 69), (204, 78, 63), + (188, 70, 54), (172, 63, 46), (168, 59, 42), (165, 55, 39), + (147, 46, 29), (141, 44, 26), (135, 43, 24), (127, 40, 18), + (120, 37, 13), (119, 34, 11), (118, 31, 10), (118, 28, 6), + (114, 27, 3), (121, 24, 3), (125, 28, 7), (130, 33, 12), + (131, 34, 14), (133, 36, 16), (138, 40, 23), (142, 45, 28), + (143, 50, 32), (143, 51, 33), (143, 53, 34), (142, 52, 33), + (142, 51, 33), (140, 50, 32), (139, 50, 32), (134, 47, 31), + (131, 45, 30), (119, 44, 28), (120, 46, 29), (121, 49, 31), + (123, 50, 35), (125, 52, 40), (136, 58, 49), (145, 69, 57), + (165, 80, 74), (168, 84, 75), (172, 88, 77), (172, 88, 77), + (173, 88, 77), (171, 81, 75), (168, 75, 70), (162, 72, 65), + (155, 67, 59), (146, 54, 41), (140, 52, 37), (134, 50, 34), + (133, 49, 32), (133, 49, 31), (134, 50, 28), (138, 52, 26), + (149, 48, 26), (153, 48, 23), (158, 48, 21), (159, 47, 22), + (160, 47, 24), (163, 49, 27), (164, 51, 32), (164, 56, 38), + (167, 61, 43), (171, 67, 51), (170, 67, 52), (170, 67, 53), + (167, 67, 49), (163, 65, 45), (159, 62, 44), (155, 60, 42), + (154, 63, 45), (161, 69, 50), (169, 75, 56), (174, 79, 58), + (179, 84, 60), (190, 90, 66), (196, 96, 76), (206, 109, 93), + (220, 114, 97), (225, 110, 102), (225, 108, 101), (226, 107, 101), + (223, 94, 76), (211, 81, 64), (205, 72, 59), (197, 63, 48), + (188, 62, 47), (187, 67, 52), (187, 72, 58), (184, 74, 60), + (182, 77, 63), (176, 80, 62), (169, 77, 60), (160, 71, 54), + (148, 64, 46), (134, 51, 31), (133, 48, 28), (132, 46, 25), + (131, 44, 24), (131, 45, 24), (136, 45, 25), (143, 47, 28), + (152, 51, 33), (156, 53, 35), (160, 55, 37), (167, 60, 42), + (175, 65, 45), (184, 72, 50), (191, 78, 57), (195, 84, 66), + (195, 89, 70), (185, 86, 73), (179, 84, 73), (173, 83, 73), + (161, 76, 65), (153, 68, 55), (142, 60, 46), (131, 52, 36), + (112, 38, 19), (106, 33, 14), (101, 29, 10), (97, 25, 6), + (96, 30, 9), (100, 34, 16), (113, 42, 26), (131, 61, 42), + (155, 78, 59), (174, 84, 68), (182, 88, 75), (190, 91, 77), + (196, 85, 70), (187, 76, 60), (178, 68, 49), (176, 60, 41), + (171, 56, 35), (170, 54, 33), (169, 53, 31), (168, 52, 32), + (168, 54, 34), (166, 55, 33), (165, 55, 32), (164, 59, 35), + (161, 63, 38), (160, 64, 41), (158, 68, 46), (154, 72, 49), + (153, 71, 50), (151, 67, 50), (151, 65, 48), (155, 65, 44), + (158, 62, 41), (163, 59, 39), (168, 62, 39), (171, 62, 43), + (170, 61, 46), (169, 64, 48), (171, 65, 52), (168, 65, 52), + (168, 66, 50), (170, 68, 50), (170, 67, 47), (172, 66, 46), + (171, 65, 46), (166, 64, 45), (161, 62, 44), (157, 62, 45), + (152, 63, 46), (148, 63, 46), (141, 60, 43), (132, 58, 40), + (124, 55, 37), (119, 52, 34), (111, 46, 27), (103, 38, 19), + (100, 35, 14), (102, 29, 10), (105, 25, 5), (101, 23, 2), + (99, 20, 1), (103, 22, 2), (103, 25, 3), (98, 26, 5), + (98, 28, 9), (100, 31, 11), (104, 33, 14), (106, 33, 16), + (108, 35, 19), (115, 37, 22), (121, 38, 22), (126, 42, 24), + (129, 46, 26), (132, 48, 26), (137, 50, 28), (138, 52, 28), + (138, 52, 26), (139, 50, 28), (141, 50, 28), (143, 48, 27), + (143, 48, 29), (146, 49, 32), (152, 50, 34), (157, 56, 42), + (161, 63, 51), (166, 68, 55), (158, 64, 50), (152, 61, 49) + ), + +// 527 Cotton_Flower +((100, 160, 186), (126, 177, 195), (134, 183, 199), (143, 189, 203), + (148, 189, 198), (153, 190, 194), (155, 191, 192), (158, 193, 191), + (174, 202, 200), (174, 203, 201), (174, 204, 202), (164, 193, 187), + (154, 183, 172), (149, 171, 157), (144, 160, 142), (142, 156, 139), + (141, 153, 137), (125, 142, 136), (110, 135, 132), (96, 129, 129), + (85, 119, 124), (75, 109, 119), (74, 106, 112), (74, 103, 106), + (74, 95, 104), (81, 94, 101), (88, 94, 99), (95, 88, 91), + (102, 82, 83), (101, 78, 75), (101, 74, 67), (101, 63, 53), + (98, 58, 41), (98, 49, 23), (95, 48, 21), (92, 47, 19), + (84, 50, 24), (77, 53, 29), (70, 55, 35), (63, 57, 41), + (51, 71, 75), (48, 76, 88), (46, 82, 101), (46, 82, 101), + (46, 83, 102), (46, 83, 101), (47, 83, 100), (46, 79, 98), + (43, 76, 95), (36, 66, 88), (37, 64, 74), (38, 62, 61), + (44, 59, 48), (51, 57, 36), (54, 57, 32), (58, 57, 29), + (64, 58, 27), (65, 61, 29), (66, 64, 32), (69, 67, 37), + (73, 70, 42), (74, 69, 44), (76, 69, 47), (76, 68, 51), + (72, 67, 55), (57, 58, 53), (50, 55, 55), (44, 52, 57), + (43, 51, 57), (43, 50, 57), (42, 51, 57), (42, 51, 57), + (43, 50, 51), (42, 48, 50), (42, 47, 49), (40, 47, 48), + (39, 47, 48), (39, 47, 46), (40, 47, 44), (45, 48, 39), + (48, 51, 39), (53, 53, 35), (51, 53, 32), (50, 53, 30), + (49, 52, 27), (48, 51, 25), (46, 50, 23), (44, 48, 18), + (44, 47, 13), (44, 48, 14), (44, 50, 15), (44, 51, 16), + (44, 52, 18), (44, 52, 20), (43, 52, 20), (44, 50, 20), + (48, 48, 21), (64, 51, 24), (77, 53, 25), (90, 56, 26), + (95, 56, 25), (101, 57, 24), (110, 57, 22), (117, 59, 21), + (121, 64, 18), (123, 67, 17), (126, 70, 16), (125, 69, 15), + (125, 69, 15), (123, 68, 15), (118, 68, 14), (112, 70, 16), + (113, 72, 18), (121, 68, 15), (121, 64, 15), (122, 61, 15), + (122, 52, 11), (117, 44, 12), (112, 40, 12), (114, 39, 10), + (113, 39, 7), (105, 34, 4), (97, 29, 2), (88, 27, 3), + (80, 26, 4), (68, 27, 9), (60, 32, 13), (55, 37, 16), + (51, 41, 17), (42, 43, 17), (40, 43, 18), (38, 43, 19), + (34, 43, 22), (34, 42, 23), (34, 39, 24), (33, 38, 21), + (26, 33, 12), (22, 32, 11), (18, 31, 10), (17, 29, 9), + (17, 27, 9), (19, 29, 8), (22, 32, 7), (28, 36, 6), + (31, 41, 7), (35, 45, 8), (35, 45, 7), (36, 46, 7), + (42, 49, 9), (50, 53, 9), (59, 57, 10), (67, 58, 11), + (70, 54, 14), (69, 53, 14), (68, 53, 15), (66, 54, 18), + (65, 55, 19), (65, 58, 22), (67, 60, 25), (67, 63, 29), + (68, 65, 30), (62, 67, 32), (59, 67, 32), (57, 67, 33), + (53, 66, 35), (50, 65, 39), (50, 64, 38), (50, 64, 37), + (49, 61, 34), (48, 59, 33), (47, 58, 33), (43, 57, 34), + (40, 55, 34), (37, 52, 31), (36, 50, 26), (33, 47, 22), + (31, 45, 20), (30, 44, 19), (28, 46, 20), (27, 47, 19), + (28, 48, 18), (29, 46, 16), (29, 46, 15), (29, 44, 16), + (29, 45, 20), (30, 46, 20), (31, 47, 21), (35, 47, 20), + (39, 47, 19), (44, 47, 17), (47, 46, 17), (51, 46, 18), + (53, 48, 22), (55, 53, 29), (53, 58, 42), (52, 61, 54), + (52, 68, 69), (55, 76, 82), (59, 83, 95), (65, 95, 105), + (70, 106, 119), (72, 114, 130), (74, 121, 143), (77, 129, 152), + (82, 135, 160), (89, 141, 161), (103, 145, 159), (115, 147, 153), + (121, 143, 147), (126, 138, 136), (130, 132, 125), (126, 127, 119), + (126, 123, 115), (129, 123, 114), (121, 122, 119), (113, 118, 122), + (104, 113, 120), (97, 109, 115), (89, 102, 107), (91, 102, 95), + (90, 103, 93), (88, 105, 91), (81, 104, 90), (81, 103, 87), + (81, 97, 80), (88, 92, 64), (95, 88, 50), (104, 84, 36), + (109, 79, 25), (114, 76, 19), (117, 70, 15), (120, 66, 12), + (121, 62, 12), (118, 58, 9), (116, 57, 10), (112, 56, 10), + (109, 56, 10), (106, 57, 9), (104, 57, 11), (102, 56, 8), + (101, 56, 9), (96, 56, 12), (91, 60, 14), (86, 64, 19), + (82, 68, 26), (77, 71, 35), (75, 78, 50), (75, 82, 65), + (77, 90, 79), (76, 99, 95), (79, 108, 110), (76, 115, 123), + (74, 124, 139), (76, 132, 156), (81, 139, 168), (89, 149, 177) + ), + +// 528 Country_Garden +((64, 127, 54), (64, 145, 64), (54, 140, 73), (44, 136, 82), + (44, 115, 95), (44, 94, 108), (45, 89, 112), (46, 85, 116), + (44, 63, 112), (46, 44, 111), (49, 26, 111), (60, 19, 111), + (72, 12, 111), (86, 12, 103), (100, 13, 96), (104, 15, 92), + (109, 18, 89), (118, 46, 68), (131, 63, 65), (145, 80, 62), + (156, 90, 68), (168, 101, 74), (167, 110, 75), (167, 119, 77), + (179, 139, 68), (179, 135, 69), (179, 132, 70), (172, 122, 68), + (165, 113, 66), (163, 105, 63), (161, 97, 61), (147, 88, 59), + (130, 77, 57), (104, 61, 46), (102, 49, 43), (101, 38, 41), + (96, 34, 43), (92, 31, 45), (87, 31, 43), (83, 31, 42), + (63, 26, 31), (55, 34, 28), (48, 42, 25), (44, 51, 22), + (40, 60, 19), (42, 59, 17), (45, 59, 15), (52, 59, 11), + (61, 57, 13), (85, 52, 14), (104, 49, 11), (123, 47, 9), + (137, 45, 10), (152, 44, 11), (152, 46, 12), (153, 48, 14), + (137, 50, 11), (125, 53, 20), (114, 57, 29), (102, 55, 41), + (90, 54, 54), (83, 52, 57), (76, 50, 60), (61, 52, 70), + (54, 53, 80), (46, 50, 99), (52, 56, 100), (59, 63, 102), + (66, 68, 102), (73, 73, 102), (88, 87, 98), (104, 89, 91), + (137, 90, 65), (152, 82, 56), (168, 75, 48), (173, 65, 41), + (179, 56, 35), (179, 53, 33), (180, 50, 32), (171, 44, 32), + (163, 36, 29), (130, 31, 22), (107, 40, 24), (84, 50, 26), + (75, 54, 27), (67, 58, 28), (61, 70, 25), (57, 80, 20), + (47, 93, 16), (48, 89, 24), (49, 86, 33), (57, 83, 39), + (66, 80, 45), (86, 76, 56), (109, 74, 71), (124, 72, 89), + (133, 71, 101), (152, 60, 110), (148, 54, 115), (145, 49, 121), + (136, 50, 123), (127, 51, 126), (114, 52, 120), (101, 46, 111), + (77, 27, 94), (60, 19, 85), (44, 12, 76), (40, 10, 70), + (36, 9, 64), (41, 13, 54), (51, 14, 47), (62, 23, 38), + (69, 31, 31), (72, 57, 20), (72, 64, 22), (72, 71, 24), + (80, 83, 34), (92, 89, 45), (108, 83, 47), (124, 80, 48), + (150, 95, 38), (163, 102, 40), (177, 109, 42), (182, 107, 40), + (188, 105, 39), (202, 108, 32), (207, 111, 18), (202, 124, 19), + (187, 129, 17), (141, 124, 27), (130, 119, 27), (120, 114, 28), + (104, 105, 46), (92, 90, 55), (87, 74, 62), (91, 71, 70), + (102, 78, 87), (111, 77, 106), (120, 77, 126), (127, 74, 133), + (135, 72, 140), (141, 82, 138), (135, 99, 126), (126, 114, 113), + (105, 127, 105), (77, 119, 103), (71, 121, 92), (65, 123, 82), + (60, 127, 60), (52, 136, 39), (53, 139, 27), (58, 130, 28), + (88, 102, 22), (94, 95, 23), (101, 88, 25), (112, 73, 22), + (121, 61, 23), (126, 50, 22), (130, 37, 17), (131, 30, 18), + (129, 24, 17), (118, 26, 18), (113, 26, 18), (109, 26, 19), + (94, 28, 21), (78, 29, 23), (64, 34, 23), (56, 40, 27), + (49, 38, 39), (47, 38, 41), (45, 39, 43), (42, 46, 43), + (40, 60, 48), (47, 71, 46), (65, 72, 47), (88, 75, 43), + (116, 79, 38), (135, 92, 40), (150, 113, 42), (157, 119, 44), + (161, 119, 42), (163, 107, 38), (157, 93, 31), (147, 87, 30), + (111, 77, 29), (104, 74, 30), (97, 71, 31), (78, 63, 25), + (65, 55, 22), (56, 53, 20), (49, 52, 16), (52, 57, 18), + (51, 66, 18), (53, 71, 21), (52, 81, 24), (51, 88, 23), + (53, 92, 24), (52, 99, 27), (49, 96, 32), (44, 90, 42), + (39, 86, 44), (39, 82, 44), (42, 86, 44), (49, 92, 43), + (56, 94, 48), (68, 97, 47), (82, 99, 45), (95, 103, 38), + (110, 113, 30), (118, 123, 26), (126, 132, 19), (130, 138, 16), + (127, 141, 12), (119, 142, 8), (105, 146, 10), (91, 148, 17), + (73, 143, 26), (55, 143, 34), (37, 135, 40), (21, 131, 42), + (14, 123, 46), (11, 107, 51), (12, 92, 55), (16, 75, 61), + (21, 62, 62), (30, 48, 56), (40, 37, 53), (48, 27, 49), + (56, 18, 52), (64, 16, 64), (72, 18, 83), (74, 30, 103), + (76, 41, 119), (83, 45, 122), (85, 43, 120), (91, 37, 125), + (85, 40, 125), (75, 48, 135), (71, 50, 133), (68, 49, 120), + (73, 38, 108), (72, 32, 90), (63, 33, 85), (52, 38, 80), + (41, 45, 72), (33, 50, 69), (28, 50, 62), (23, 51, 54), + (19, 57, 48), (21, 66, 36), (28, 79, 28), (38, 83, 24), + (36, 94, 21), (31, 106, 27), (37, 116, 34), (44, 128, 43) + ), + +// 529 Creamsicle +((255, 175, 47), (255, 163, 47), (255, 154, 46), (255, 145, 45), + (255, 131, 45), (255, 118, 45), (255, 113, 45), (255, 108, 45), + (255, 92, 45), (255, 87, 45), (255, 83, 45), (255, 83, 45), + (255, 83, 45), (255, 88, 45), (255, 94, 45), (255, 96, 45), + (255, 98, 45), (255, 108, 45), (255, 116, 45), (255, 124, 45), + (255, 131, 45), (255, 139, 45), (255, 142, 45), (255, 146, 45), + (247, 162, 43), (231, 166, 41), (215, 171, 39), (200, 172, 37), + (186, 174, 36), (180, 171, 34), (174, 168, 33), (163, 158, 31), + (150, 146, 29), (147, 124, 47), (165, 109, 68), (183, 95, 89), + (194, 82, 117), (206, 69, 146), (211, 65, 161), (216, 62, 177), + (247, 50, 223), (251, 47, 237), (255, 45, 251), (255, 45, 253), + (255, 46, 255), (255, 48, 255), (255, 51, 255), (255, 61, 255), + (255, 74, 253), (255, 101, 239), (255, 118, 229), (255, 135, 220), + (255, 146, 191), (255, 157, 162), (255, 158, 148), (255, 159, 135), + (255, 155, 98), (255, 144, 80), (255, 134, 62), (255, 124, 67), + (255, 115, 72), (255, 109, 76), (255, 104, 80), (255, 91, 89), + (255, 79, 99), (255, 65, 114), (255, 58, 120), (255, 52, 126), + (255, 49, 129), (255, 47, 133), (255, 45, 139), (249, 44, 146), + (239, 42, 165), (236, 42, 167), (233, 42, 170), (205, 43, 160), + (177, 44, 151), (171, 46, 145), (166, 49, 140), (168, 55, 126), + (162, 60, 103), (129, 69, 63), (144, 80, 54), (159, 91, 45), + (172, 96, 41), (185, 102, 38), (200, 109, 35), (204, 113, 40), + (233, 129, 71), (244, 132, 90), (255, 135, 109), (255, 130, 118), + (255, 126, 128), (255, 116, 154), (255, 104, 177), (255, 93, 197), + (255, 82, 211), (255, 59, 223), (255, 52, 222), (255, 45, 222), + (255, 45, 219), (255, 45, 217), (255, 45, 208), (255, 45, 194), + (255, 45, 161), (255, 49, 150), (255, 53, 139), (255, 57, 133), + (255, 62, 127), (255, 70, 109), (255, 78, 93), (255, 89, 81), + (255, 101, 76), (255, 118, 70), (255, 121, 72), (255, 124, 75), + (255, 127, 88), (255, 128, 106), (252, 124, 126), (244, 118, 153), + (229, 101, 205), (217, 94, 219), (206, 88, 233), (199, 85, 238), + (192, 83, 244), (185, 73, 252), (186, 66, 255), (191, 61, 255), + (198, 62, 250), (216, 54, 219), (222, 51, 208), (229, 48, 198), + (242, 49, 176), (251, 54, 150), (255, 59, 121), (255, 63, 95), + (255, 75, 62), (255, 81, 57), (255, 87, 52), (255, 90, 55), + (255, 93, 58), (255, 97, 66), (255, 99, 72), (255, 101, 79), + (255, 102, 89), (255, 109, 103), (255, 110, 102), (255, 112, 102), + (255, 112, 97), (255, 113, 90), (255, 117, 82), (255, 122, 75), + (255, 126, 57), (255, 125, 53), (255, 124, 50), (255, 123, 46), + (255, 123, 45), (255, 124, 45), (255, 123, 45), (255, 121, 45), + (255, 120, 45), (255, 124, 49), (255, 125, 50), (255, 126, 51), + (255, 128, 52), (255, 128, 52), (255, 128, 52), (255, 128, 52), + (255, 126, 50), (255, 124, 48), (255, 123, 47), (255, 121, 45), + (255, 119, 45), (255, 121, 45), (255, 124, 45), (255, 129, 45), + (255, 135, 45), (248, 145, 43), (236, 157, 42), (220, 166, 46), + (209, 168, 60), (194, 162, 75), (175, 159, 82), (155, 156, 85), + (133, 131, 110), (133, 121, 113), (133, 111, 117), (141, 91, 115), + (156, 81, 112), (173, 73, 111), (183, 63, 109), (185, 48, 108), + (180, 43, 106), (174, 48, 102), (163, 58, 98), (150, 63, 99), + (132, 69, 101), (114, 84, 102), (103, 104, 100), (105, 123, 93), + (116, 138, 83), (133, 151, 77), (151, 165, 75), (170, 178, 69), + (188, 187, 56), (205, 186, 44), (221, 181, 40), (236, 175, 42), + (245, 169, 43), (247, 160, 43), (245, 146, 43), (245, 132, 43), + (244, 119, 43), (244, 110, 43), (243, 101, 43), (245, 93, 43), + (247, 86, 43), (250, 82, 44), (253, 80, 44), (254, 80, 45), + (255, 82, 45), (255, 86, 45), (255, 90, 45), (255, 92, 45), + (255, 90, 45), (255, 87, 45), (255, 87, 45), (255, 87, 45), + (255, 86, 45), (255, 81, 45), (255, 74, 45), (255, 67, 45), + (255, 65, 45), (255, 63, 45), (255, 60, 47), (255, 55, 51), + (255, 49, 57), (255, 47, 60), (255, 48, 64), (255, 48, 69), + (255, 47, 76), (255, 46, 81), (255, 49, 84), (255, 56, 84), + (255, 65, 80), (255, 71, 76), (255, 80, 73), (255, 92, 71), + (255, 107, 64), (255, 122, 57), (255, 134, 51), (255, 144, 50), + (255, 154, 50), (255, 164, 48), (255, 173, 46), (255, 176, 46) + ), + +// 530 Cricket_Music +((112, 38, 168), (104, 37, 182), (102, 36, 188), (100, 36, 194), + (94, 31, 177), (88, 26, 160), (82, 23, 153), (77, 20, 146), + (57, 28, 102), (57, 35, 81), (57, 43, 61), (44, 54, 42), + (32, 65, 24), (32, 71, 24), (32, 78, 24), (37, 77, 35), + (43, 76, 46), (54, 57, 84), (70, 47, 105), (86, 38, 126), + (96, 26, 145), (106, 14, 165), (108, 11, 173), (110, 8, 182), + (86, 0, 198), (71, 3, 211), (56, 6, 224), (42, 4, 227), + (28, 2, 230), (24, 1, 224), (21, 0, 218), (4, 0, 215), + (0, 4, 211), (0, 12, 179), (0, 17, 158), (0, 23, 137), + (0, 31, 117), (0, 39, 98), (0, 38, 85), (0, 38, 73), + (0, 52, 44), (0, 44, 42), (0, 36, 40), (0, 24, 50), + (0, 12, 61), (1, 11, 65), (3, 10, 70), (15, 7, 76), + (26, 5, 80), (29, 0, 77), (28, 1, 61), (27, 3, 45), + (21, 9, 37), (16, 16, 30), (15, 16, 31), (14, 16, 32), + (15, 10, 45), (21, 16, 55), (28, 22, 65), (36, 24, 77), + (45, 27, 89), (45, 28, 91), (46, 30, 94), (38, 36, 93), + (31, 49, 89), (23, 64, 84), (14, 55, 85), (6, 47, 86), + (5, 41, 90), (4, 35, 94), (2, 23, 102), (6, 12, 106), + (30, 0, 124), (30, 2, 122), (31, 5, 120), (33, 2, 118), + (35, 0, 117), (32, 0, 110), (29, 0, 104), (19, 8, 91), + (3, 6, 80), (0, 0, 55), (0, 5, 42), (0, 10, 30), + (0, 16, 26), (0, 22, 23), (0, 28, 8), (0, 27, 0), + (0, 44, 0), (0, 57, 7), (0, 71, 15), (3, 75, 19), + (6, 80, 24), (11, 89, 40), (14, 93, 59), (6, 93, 72), + (3, 89, 89), (6, 71, 102), (5, 61, 102), (4, 52, 103), + (7, 45, 110), (10, 39, 117), (29, 39, 135), (47, 44, 142), + (87, 35, 171), (106, 27, 185), (125, 20, 199), (129, 19, 199), + (134, 19, 200), (127, 14, 184), (112, 8, 160), (92, 11, 132), + (75, 27, 101), (39, 44, 54), (33, 44, 50), (27, 45, 46), + (22, 47, 46), (28, 42, 47), (32, 36, 64), (47, 31, 86), + (62, 4, 111), (59, 8, 114), (57, 13, 117), (52, 20, 110), + (48, 27, 104), (26, 27, 86), (14, 42, 61), (5, 62, 51), + (4, 65, 36), (7, 48, 0), (13, 45, 0), (19, 43, 0), + (40, 37, 14), (48, 13, 32), (65, 0, 63), (78, 0, 81), + (86, 0, 114), (85, 0, 121), (84, 0, 129), (80, 0, 121), + (76, 0, 114), (76, 0, 102), (89, 0, 98), (106, 0, 106), + (106, 0, 103), (112, 7, 128), (120, 7, 138), (128, 8, 149), + (140, 12, 162), (141, 15, 169), (144, 12, 174), (154, 8, 179), + (163, 13, 181), (169, 11, 179), (175, 10, 177), (183, 6, 181), + (194, 4, 194), (192, 20, 207), (184, 24, 199), (183, 37, 178), + (165, 44, 146), (141, 53, 154), (137, 51, 149), (133, 49, 144), + (122, 45, 117), (109, 53, 121), (91, 47, 130), (80, 42, 152), + (87, 45, 170), (90, 47, 171), (94, 49, 173), (100, 54, 185), + (106, 51, 190), (117, 49, 193), (122, 42, 185), (138, 32, 184), + (137, 23, 178), (133, 15, 176), (124, 8, 173), (121, 0, 177), + (111, 0, 178), (95, 0, 178), (80, 2, 183), (83, 4, 192), + (98, 2, 218), (97, 2, 224), (96, 2, 230), (93, 2, 231), + (88, 4, 233), (91, 0, 228), (84, 0, 224), (73, 0, 209), + (65, 0, 199), (59, 0, 183), (51, 0, 170), (49, 2, 153), + (49, 7, 149), (52, 11, 143), (51, 18, 141), (46, 28, 137), + (31, 28, 134), (29, 34, 129), (38, 44, 134), (38, 46, 144), + (38, 55, 156), (29, 54, 157), (42, 60, 167), (59, 54, 183), + (93, 63, 200), (97, 44, 199), (109, 32, 195), (127, 20, 198), + (144, 11, 206), (157, 5, 207), (163, 4, 195), (160, 8, 181), + (142, 15, 167), (117, 35, 156), (95, 53, 134), (77, 69, 110), + (54, 75, 80), (36, 93, 64), (20, 96, 44), (10, 97, 42), + (6, 89, 45), (3, 80, 53), (0, 63, 60), (0, 42, 69), + (0, 31, 91), (0, 26, 109), (0, 16, 122), (0, 8, 133), + (0, 0, 142), (12, 7, 152), (40, 19, 162), (59, 20, 174), + (77, 5, 184), (92, 0, 199), (101, 0, 208), (104, 7, 215), + (98, 15, 215), (92, 23, 210), (70, 37, 191), (31, 34, 171), + (18, 49, 148), (7, 59, 122), (0, 71, 92), (0, 93, 87), + (0, 88, 77), (0, 79, 69), (7, 71, 69), (28, 69, 65), + (38, 51, 72), (53, 49, 92), (67, 44, 130), (96, 48, 156) + ), + +// 531 Dark_Rainbow +((90, 148, 72), (141, 187, 70), (162, 176, 67), (183, 165, 65), + (202, 148, 55), (221, 132, 45), (222, 124, 41), (224, 117, 38), + (188, 66, 18), (169, 48, 14), (151, 30, 11), (127, 24, 11), + (103, 19, 12), (80, 29, 13), (58, 39, 15), (49, 42, 18), + (41, 45, 22), (20, 40, 46), (14, 40, 51), (9, 40, 56), + (8, 38, 59), (8, 37, 62), (6, 32, 63), (5, 28, 64), + (10, 11, 61), (18, 8, 53), (27, 5, 45), (39, 5, 35), + (52, 5, 26), (58, 5, 23), (64, 5, 21), (77, 4, 19), + (92, 6, 21), (116, 7, 30), (112, 5, 32), (108, 3, 34), + (95, 3, 36), (83, 4, 38), (78, 4, 40), (73, 5, 42), + (52, 22, 48), (44, 34, 60), (36, 47, 72), (37, 55, 71), + (39, 64, 70), (43, 70, 64), (48, 77, 58), (61, 92, 56), + (72, 101, 58), (73, 108, 52), (67, 111, 37), (62, 115, 23), + (65, 108, 25), (69, 101, 28), (67, 93, 33), (65, 85, 38), + (46, 68, 56), (37, 64, 80), (29, 61, 105), (33, 42, 129), + (37, 24, 154), (34, 18, 153), (32, 13, 153), (20, 13, 149), + (12, 13, 146), (7, 6, 142), (18, 3, 121), (30, 0, 101), + (39, 0, 87), (49, 1, 74), (68, 2, 49), (83, 2, 34), + (114, 4, 14), (121, 9, 15), (128, 15, 17), (119, 27, 24), + (111, 40, 32), (104, 45, 33), (97, 51, 34), (80, 57, 35), + (67, 58, 41), (55, 56, 62), (55, 55, 68), (56, 54, 74), + (58, 53, 72), (61, 53, 70), (71, 43, 64), (76, 33, 60), + (79, 17, 61), (75, 16, 58), (71, 16, 55), (65, 16, 53), + (60, 17, 52), (49, 19, 53), (33, 12, 61), (22, 13, 78), + (18, 14, 96), (28, 16, 141), (34, 15, 152), (41, 14, 163), + (47, 16, 163), (53, 19, 163), (65, 24, 163), (85, 29, 157), + (110, 27, 131), (115, 27, 110), (121, 28, 90), (121, 29, 79), + (122, 31, 69), (121, 42, 53), (111, 59, 46), (100, 82, 45), + (102, 104, 44), (123, 137, 35), (125, 140, 32), (128, 143, 30), + (121, 152, 33), (115, 160, 35), (117, 166, 41), (126, 168, 44), + (143, 135, 43), (144, 115, 40), (146, 95, 38), (149, 87, 39), + (153, 80, 41), (158, 66, 37), (166, 54, 36), (176, 43, 29), + (186, 39, 18), (207, 26, 8), (208, 24, 8), (209, 22, 9), + (205, 17, 15), (197, 21, 17), (193, 28, 19), (189, 32, 18), + (186, 49, 18), (191, 67, 23), (197, 86, 28), (202, 95, 31), + (207, 104, 35), (192, 115, 45), (167, 122, 66), (149, 115, 89), + (127, 112, 114), (117, 99, 142), (101, 94, 143), (86, 90, 145), + (67, 70, 150), (39, 45, 148), (27, 29, 152), (26, 15, 138), + (18, 9, 92), (18, 6, 80), (18, 3, 69), (18, 6, 62), + (17, 10, 58), (14, 15, 58), (12, 23, 62), (15, 27, 63), + (23, 28, 60), (25, 30, 54), (25, 30, 54), (26, 31, 54), + (26, 33, 57), (39, 31, 58), (43, 27, 57), (50, 24, 64), + (37, 17, 88), (40, 16, 93), (44, 16, 99), (51, 13, 112), + (72, 19, 123), (89, 34, 129), (98, 44, 132), (107, 55, 126), + (106, 57, 121), (114, 52, 115), (119, 55, 105), (126, 57, 97), + (132, 59, 86), (136, 63, 76), (140, 57, 69), (141, 49, 57), + (155, 40, 43), (161, 42, 43), (167, 44, 43), (180, 55, 44), + (198, 65, 37), (213, 74, 34), (221, 74, 29), (227, 71, 22), + (226, 70, 21), (227, 70, 19), (228, 74, 19), (224, 72, 22), + (221, 67, 19), (214, 59, 15), (209, 53, 9), (209, 56, 3), + (208, 58, 3), (204, 62, 6), (197, 63, 8), (185, 65, 14), + (183, 73, 13), (184, 84, 17), (188, 99, 21), (200, 117, 26), + (198, 135, 41), (200, 153, 42), (200, 170, 43), (194, 180, 39), + (194, 191, 43), (184, 200, 58), (173, 202, 77), (163, 201, 103), + (148, 188, 120), (136, 173, 134), (128, 156, 146), (121, 134, 158), + (114, 111, 172), (111, 90, 180), (107, 70, 178), (112, 58, 165), + (120, 48, 148), (121, 38, 127), (121, 29, 106), (105, 17, 84), + (92, 8, 59), (79, 6, 44), (64, 6, 36), (56, 7, 34), + (42, 8, 30), (34, 6, 25), (22, 13, 21), (17, 23, 23), + (23, 38, 33), (32, 53, 50), (49, 66, 60), (74, 82, 67), + (101, 94, 66), (126, 113, 61), (144, 125, 66), (147, 136, 71), + (151, 149, 84), (153, 141, 92), (152, 135, 89), (141, 117, 78), + (117, 97, 66), (87, 95, 63), (61, 93, 67), (48, 95, 73), + (40, 102, 74), (38, 106, 74), (46, 108, 74), (64, 128, 73) + ), + +// 532 Dark_Rose +((92, 63, 80), (75, 57, 74), (70, 54, 69), (66, 51, 65), + (62, 48, 60), (59, 45, 55), (57, 43, 51), (56, 42, 48), + (54, 42, 47), (55, 52, 48), (57, 63, 49), (61, 74, 55), + (66, 86, 62), (81, 94, 69), (97, 102, 77), (102, 92, 77), + (107, 82, 78), (129, 72, 98), (132, 64, 96), (136, 56, 95), + (132, 50, 93), (129, 45, 91), (125, 42, 85), (122, 39, 80), + (104, 39, 66), (91, 40, 61), (78, 42, 56), (71, 41, 51), + (64, 40, 47), (61, 40, 44), (58, 41, 41), (55, 41, 41), + (53, 42, 47), (42, 51, 39), (46, 44, 40), (50, 38, 41), + (50, 36, 37), (50, 35, 33), (49, 33, 32), (48, 31, 31), + (46, 25, 32), (42, 24, 29), (39, 23, 26), (35, 23, 28), + (32, 23, 31), (30, 22, 29), (28, 21, 27), (18, 18, 24), + (17, 22, 17), (12, 20, 12), (13, 19, 12), (15, 19, 13), + (18, 22, 15), (21, 26, 17), (21, 27, 19), (22, 29, 22), + (27, 37, 34), (29, 39, 34), (31, 42, 35), (31, 40, 37), + (31, 38, 39), (30, 38, 36), (29, 38, 34), (27, 37, 34), + (27, 35, 31), (35, 31, 27), (38, 30, 31), (41, 30, 35), + (42, 30, 36), (44, 31, 38), (48, 31, 36), (51, 32, 35), + (55, 30, 41), (54, 29, 38), (53, 28, 35), (49, 25, 31), + (45, 23, 27), (43, 22, 26), (42, 22, 25), (38, 21, 22), + (33, 19, 22), (24, 19, 15), (22, 15, 14), (21, 12, 13), + (20, 10, 14), (19, 9, 15), (17, 8, 13), (15, 7, 11), + (16, 6, 12), (15, 7, 11), (15, 8, 11), (16, 9, 11), + (18, 10, 11), (23, 16, 14), (29, 17, 22), (34, 19, 23), + (39, 21, 25), (50, 27, 38), (54, 27, 41), (58, 27, 44), + (59, 26, 43), (60, 26, 43), (61, 27, 47), (61, 28, 46), + (64, 29, 47), (65, 31, 46), (66, 34, 46), (67, 34, 46), + (68, 35, 47), (69, 39, 51), (72, 43, 55), (75, 49, 58), + (78, 52, 58), (80, 56, 60), (82, 56, 62), (85, 57, 65), + (92, 59, 70), (97, 60, 73), (104, 61, 75), (113, 65, 83), + (131, 79, 98), (142, 80, 104), (154, 81, 111), (156, 82, 111), + (158, 84, 111), (149, 86, 106), (145, 82, 108), (140, 75, 105), + (135, 67, 100), (104, 54, 72), (97, 52, 70), (90, 51, 68), + (80, 49, 64), (72, 49, 59), (67, 47, 49), (65, 47, 49), + (60, 49, 45), (59, 47, 47), (58, 45, 49), (58, 44, 49), + (59, 43, 50), (57, 39, 47), (57, 34, 47), (57, 30, 47), + (58, 27, 44), (63, 21, 42), (65, 19, 41), (68, 18, 41), + (74, 18, 46), (77, 20, 47), (80, 24, 51), (85, 27, 53), + (97, 31, 65), (97, 33, 65), (98, 35, 66), (99, 41, 72), + (99, 43, 70), (100, 46, 73), (97, 47, 69), (94, 50, 70), + (86, 53, 69), (69, 76, 57), (66, 77, 54), (63, 79, 52), + (60, 78, 49), (55, 76, 48), (51, 71, 46), (52, 69, 45), + (61, 55, 45), (58, 47, 43), (56, 40, 42), (54, 36, 44), + (50, 34, 36), (51, 44, 36), (50, 54, 36), (50, 55, 35), + (43, 54, 30), (44, 54, 30), (41, 52, 30), (44, 49, 30), + (43, 39, 27), (38, 22, 23), (36, 18, 24), (34, 18, 27), + (31, 13, 22), (30, 13, 22), (29, 13, 23), (26, 15, 25), + (22, 14, 24), (22, 15, 21), (24, 15, 20), (27, 16, 28), + (30, 20, 32), (33, 26, 38), (42, 37, 48), (66, 50, 65), + (86, 67, 80), (103, 80, 84), (113, 94, 89), (118, 88, 99), + (123, 88, 95), (126, 88, 94), (119, 86, 87), (104, 73, 82), + (89, 59, 68), (76, 51, 52), (70, 54, 49), (65, 62, 49), + (62, 58, 47), (62, 56, 46), (65, 49, 46), (75, 42, 53), + (89, 37, 62), (95, 30, 66), (92, 27, 61), (87, 22, 56), + (87, 18, 52), (82, 13, 51), (70, 11, 42), (53, 11, 28), + (45, 13, 23), (42, 14, 24), (44, 11, 24), (44, 10, 21), + (47, 13, 26), (54, 16, 33), (61, 17, 40), (65, 18, 41), + (69, 23, 48), (71, 29, 51), (73, 32, 56), (72, 32, 52), + (74, 32, 58), (73, 32, 54), (73, 32, 56), (70, 32, 55), + (68, 30, 54), (64, 30, 52), (62, 29, 51), (58, 30, 51), + (54, 28, 48), (49, 27, 43), (44, 26, 34), (42, 26, 33), + (40, 27, 31), (40, 34, 30), (40, 44, 31), (46, 50, 35), + (56, 57, 40), (63, 54, 44), (68, 55, 49), (80, 56, 58), + (90, 59, 65), (90, 58, 65), (83, 57, 67), (86, 60, 71) + ), + +// 533 Dark_Turquoise +((38, 116, 114), (38, 115, 113), (37, 104, 104), (37, 93, 95), + (33, 80, 82), (30, 67, 70), (28, 60, 64), (27, 54, 58), + (25, 34, 40), (25, 32, 37), (26, 30, 35), (27, 34, 39), + (28, 38, 43), (30, 48, 52), (33, 59, 62), (34, 66, 67), + (36, 73, 73), (44, 105, 103), (47, 116, 113), (50, 127, 124), + (55, 131, 127), (61, 136, 130), (62, 139, 134), (63, 143, 138), + (61, 155, 150), (60, 153, 147), (60, 151, 145), (60, 148, 143), + (61, 146, 142), (59, 148, 145), (58, 151, 148), (53, 160, 156), + (52, 166, 162), (56, 169, 165), (57, 171, 168), (59, 174, 171), + (59, 180, 178), (60, 187, 185), (61, 189, 187), (62, 191, 190), + (63, 195, 195), (63, 195, 195), (63, 195, 195), (63, 188, 188), + (63, 182, 181), (63, 175, 174), (63, 168, 167), (60, 153, 151), + (58, 137, 136), (49, 105, 105), (47, 89, 89), (45, 74, 73), + (41, 65, 64), (37, 56, 56), (35, 53, 54), (34, 51, 53), + (34, 46, 49), (33, 45, 48), (33, 45, 47), (32, 45, 46), + (31, 45, 45), (31, 43, 44), (32, 42, 44), (32, 38, 40), + (30, 34, 37), (26, 29, 31), (25, 28, 30), (25, 28, 30), + (25, 28, 30), (26, 28, 31), (26, 30, 34), (27, 33, 39), + (27, 46, 53), (28, 59, 64), (30, 73, 76), (33, 86, 88), + (36, 99, 100), (35, 102, 102), (35, 105, 105), (32, 106, 107), + (32, 106, 107), (34, 101, 102), (32, 91, 92), (30, 82, 82), + (28, 76, 76), (27, 70, 70), (25, 59, 61), (26, 53, 56), + (33, 54, 55), (35, 58, 57), (38, 63, 60), (38, 63, 61), + (38, 64, 62), (36, 64, 65), (36, 64, 66), (38, 63, 67), + (41, 63, 68), (46, 65, 71), (51, 65, 73), (56, 66, 76), + (57, 66, 77), (59, 67, 78), (62, 70, 79), (60, 76, 75), + (64, 72, 73), (60, 66, 69), (57, 61, 66), (52, 59, 61), + (47, 58, 57), (40, 53, 52), (35, 45, 45), (32, 40, 41), + (32, 39, 41), (34, 46, 49), (34, 48, 50), (34, 50, 52), + (35, 53, 56), (36, 56, 60), (37, 59, 63), (37, 61, 64), + (34, 55, 60), (31, 52, 58), (29, 49, 57), (28, 49, 58), + (28, 49, 59), (27, 52, 60), (28, 58, 66), (31, 70, 75), + (33, 85, 89), (40, 117, 123), (41, 125, 131), (43, 134, 139), + (48, 151, 155), (51, 170, 171), (57, 184, 186), (60, 194, 197), + (61, 201, 204), (61, 200, 203), (61, 200, 202), (61, 199, 201), + (61, 198, 200), (60, 194, 195), (58, 185, 185), (53, 174, 172), + (48, 158, 158), (45, 127, 128), (44, 118, 119), (44, 109, 111), + (41, 95, 94), (35, 79, 79), (32, 64, 65), (29, 52, 53), + (34, 39, 42), (35, 40, 42), (37, 42, 43), (44, 50, 51), + (52, 63, 61), (72, 83, 81), (75, 102, 99), (75, 119, 114), + (77, 134, 132), (85, 158, 157), (84, 162, 161), (84, 167, 165), + (76, 169, 165), (66, 160, 159), (45, 139, 142), (40, 123, 128), + (35, 95, 99), (33, 87, 91), (31, 80, 83), (28, 66, 71), + (25, 58, 65), (25, 54, 63), (27, 59, 67), (30, 71, 75), + (34, 84, 87), (36, 98, 102), (38, 112, 115), (38, 119, 122), + (39, 124, 125), (40, 125, 125), (39, 121, 122), (39, 116, 118), + (33, 91, 95), (32, 83, 87), (32, 76, 80), (29, 61, 65), + (27, 48, 54), (26, 37, 45), (25, 31, 38), (26, 27, 34), + (26, 25, 31), (27, 25, 29), (28, 27, 29), (29, 29, 31), + (31, 33, 35), (35, 37, 41), (38, 44, 47), (42, 51, 53), + (43, 56, 59), (43, 61, 64), (43, 63, 70), (43, 67, 75), + (43, 69, 77), (42, 70, 77), (38, 67, 72), (34, 61, 66), + (31, 57, 62), (28, 53, 59), (27, 52, 57), (27, 52, 57), + (26, 52, 56), (25, 57, 59), (25, 63, 64), (25, 68, 69), + (26, 74, 77), (25, 76, 82), (26, 76, 85), (27, 79, 89), + (26, 76, 86), (26, 73, 82), (25, 67, 75), (25, 58, 67), + (26, 51, 61), (26, 44, 54), (26, 38, 47), (25, 33, 40), + (25, 30, 34), (25, 28, 31), (26, 26, 30), (27, 26, 29), + (27, 26, 28), (26, 26, 27), (26, 27, 26), (26, 27, 26), + (27, 28, 26), (27, 28, 26), (26, 28, 26), (25, 28, 26), + (25, 29, 26), (25, 28, 26), (25, 28, 27), (25, 27, 27), + (25, 26, 28), (25, 26, 28), (25, 27, 28), (25, 29, 30), + (25, 33, 33), (26, 39, 41), (28, 51, 52), (30, 66, 67), + (33, 81, 81), (36, 94, 91), (39, 102, 102), (40, 110, 109) + ), + +// 534 Dark_Waters +((40, 9, 84), (36, 5, 75), (37, 2, 65), (39, 0, 56), + (21, 0, 42), (4, 0, 28), (2, 7, 14), (0, 14, 0), + (0, 14, 0), (0, 14, 0), (0, 14, 0), (0, 14, 0), + (0, 14, 0), (0, 7, 8), (0, 0, 17), (0, 0, 17), + (0, 0, 18), (0, 0, 31), (0, 2, 41), (0, 4, 52), + (0, 13, 64), (0, 22, 76), (0, 27, 82), (0, 32, 89), + (0, 48, 110), (0, 52, 118), (0, 57, 127), (0, 61, 133), + (0, 65, 140), (0, 66, 141), (0, 67, 142), (0, 63, 142), + (0, 61, 140), (0, 56, 124), (0, 48, 115), (0, 41, 106), + (0, 36, 96), (0, 31, 87), (0, 24, 83), (0, 17, 79), + (0, 5, 71), (0, 2, 71), (0, 0, 71), (0, 0, 73), + (0, 0, 76), (0, 2, 79), (0, 5, 83), (0, 0, 88), + (10, 4, 92), (13, 4, 100), (11, 4, 101), (9, 4, 102), + (7, 4, 99), (5, 4, 96), (7, 4, 94), (10, 4, 92), + (22, 4, 76), (23, 2, 67), (25, 0, 59), (25, 0, 50), + (25, 0, 41), (23, 0, 38), (22, 0, 35), (22, 0, 26), + (21, 0, 1), (0, 14, 0), (0, 14, 0), (0, 14, 0), + (0, 14, 0), (0, 14, 0), (0, 14, 0), (0, 14, 0), + (0, 0, 18), (9, 0, 24), (18, 0, 31), (24, 0, 41), + (31, 0, 52), (39, 0, 58), (48, 0, 65), (61, 5, 83), + (45, 17, 106), (28, 40, 158), (32, 55, 175), (36, 71, 193), + (38, 79, 198), (40, 88, 203), (36, 84, 210), (36, 79, 210), + (35, 83, 203), (31, 86, 200), (28, 89, 198), (25, 88, 194), + (22, 87, 190), (21, 88, 181), (14, 92, 166), (5, 75, 150), + (0, 56, 123), (0, 26, 83), (0, 22, 72), (0, 18, 61), + (0, 17, 60), (0, 17, 59), (0, 22, 59), (0, 21, 65), + (0, 28, 65), (0, 22, 65), (0, 17, 65), (0, 17, 63), + (0, 18, 61), (0, 18, 61), (0, 25, 59), (0, 25, 61), + (0, 25, 59), (0, 21, 53), (0, 17, 49), (0, 14, 45), + (0, 13, 39), (0, 8, 28), (0, 1, 21), (0, 17, 0), + (0, 14, 0), (0, 14, 0), (0, 14, 0), (0, 14, 0), + (0, 14, 0), (0, 14, 0), (0, 14, 0), (0, 14, 0), + (0, 14, 0), (0, 14, 0), (0, 14, 0), (0, 14, 0), + (0, 14, 0), (0, 14, 0), (0, 0, 17), (0, 1, 17), + (0, 0, 21), (0, 0, 21), (0, 0, 21), (0, 0, 19), + (0, 1, 18), (0, 1, 18), (0, 0, 18), (0, 0, 18), + (0, 0, 18), (0, 0, 25), (0, 0, 25), (0, 0, 26), + (0, 0, 26), (0, 0, 26), (1, 0, 26), (14, 0, 26), + (28, 0, 22), (24, 0, 27), (21, 0, 32), (22, 0, 39), + (36, 0, 45), (32, 0, 56), (26, 0, 67), (41, 1, 76), + (41, 8, 84), (45, 14, 107), (57, 18, 115), (69, 22, 123), + (73, 32, 146), (102, 45, 171), (135, 57, 201), (154, 73, 232), + (206, 107, 255), (208, 114, 255), (210, 122, 255), (255, 127, 255), + (255, 131, 255), (255, 136, 255), (255, 132, 255), (255, 128, 255), + (232, 131, 255), (198, 127, 255), (158, 123, 255), (118, 115, 255), + (106, 118, 255), (94, 119, 255), (83, 100, 255), (65, 79, 242), + (28, 40, 177), (22, 38, 162), (17, 36, 148), (4, 36, 123), + (0, 32, 107), (0, 36, 96), (0, 26, 84), (0, 17, 75), + (0, 4, 67), (0, 4, 57), (0, 0, 52), (0, 0, 49), + (0, 0, 49), (0, 0, 56), (0, 4, 61), (0, 25, 69), + (0, 32, 79), (0, 44, 87), (0, 52, 98), (5, 49, 111), + (10, 61, 128), (21, 67, 154), (32, 79, 181), (44, 80, 206), + (52, 84, 223), (53, 100, 233), (56, 106, 238), (53, 106, 241), + (52, 98, 241), (49, 111, 245), (49, 115, 255), (56, 122, 255), + (67, 124, 255), (79, 127, 255), (92, 138, 255), (94, 163, 255), + (92, 173, 255), (88, 183, 255), (79, 170, 255), (65, 181, 255), + (59, 181, 255), (57, 177, 255), (61, 159, 255), (63, 170, 255), + (71, 163, 255), (71, 162, 255), (69, 136, 255), (59, 124, 255), + (45, 118, 233), (31, 94, 202), (21, 65, 170), (10, 48, 140), + (8, 26, 118), (4, 17, 100), (1, 9, 87), (0, 0, 75), + (14, 0, 63), (32, 0, 56), (14, 0, 48), (13, 0, 45), + (14, 0, 48), (18, 0, 53), (14, 0, 63), (35, 4, 75), + (41, 9, 87), (40, 9, 84), (40, 5, 83), (49, 4, 80), + (44, 4, 79), (36, 5, 76), (21, 1, 75), (35, 4, 75) + ), + +// 535 Darkness +((51, 35, 40), (48, 23, 29), (46, 20, 21), (45, 17, 13), + (38, 16, 12), (32, 16, 11), (28, 17, 9), (25, 18, 8), + (24, 21, 24), (24, 27, 34), (25, 33, 45), (23, 41, 62), + (22, 49, 80), (25, 51, 88), (29, 53, 96), (33, 54, 98), + (38, 56, 101), (49, 46, 116), (53, 45, 108), (57, 44, 100), + (52, 41, 90), (48, 39, 81), (45, 37, 72), (42, 35, 63), + (31, 27, 38), (25, 22, 32), (19, 18, 26), (18, 16, 23), + (17, 15, 20), (17, 15, 19), (18, 15, 19), (19, 15, 17), + (20, 16, 17), (21, 16, 15), (20, 16, 14), (19, 16, 14), + (17, 14, 14), (16, 13, 14), (13, 11, 12), (11, 10, 11), + (7, 7, 8), (7, 7, 8), (7, 8, 9), (17, 12, 13), + (28, 17, 18), (37, 20, 21), (46, 24, 24), (62, 26, 41), + (82, 30, 50), (121, 68, 60), (114, 74, 61), (107, 80, 63), + (91, 80, 60), (75, 80, 57), (65, 75, 56), (56, 70, 56), + (33, 39, 57), (29, 35, 59), (26, 31, 61), (28, 31, 69), + (31, 32, 77), (31, 32, 80), (32, 32, 84), (25, 29, 92), + (26, 29, 91), (19, 21, 79), (19, 22, 68), (20, 23, 58), + (23, 25, 56), (27, 27, 54), (33, 33, 59), (39, 36, 62), + (55, 46, 68), (53, 45, 66), (52, 45, 65), (48, 42, 58), + (45, 39, 51), (39, 36, 50), (34, 33, 49), (29, 29, 48), + (25, 27, 45), (13, 22, 49), (15, 22, 54), (17, 23, 59), + (18, 22, 65), (19, 22, 71), (21, 18, 81), (25, 20, 87), + (29, 20, 92), (25, 21, 82), (22, 22, 73), (22, 21, 67), + (23, 21, 61), (20, 21, 51), (16, 20, 44), (15, 19, 39), + (17, 18, 37), (19, 19, 33), (20, 18, 29), (22, 18, 26), + (22, 18, 25), (23, 19, 24), (23, 18, 21), (23, 17, 18), + (21, 16, 19), (21, 16, 19), (21, 16, 20), (22, 17, 21), + (23, 18, 23), (25, 20, 26), (31, 24, 32), (36, 29, 37), + (36, 31, 39), (40, 33, 41), (37, 31, 38), (35, 30, 36), + (29, 25, 32), (26, 23, 27), (22, 20, 23), (18, 17, 21), + (14, 16, 18), (13, 16, 20), (12, 17, 22), (12, 16, 23), + (13, 16, 24), (13, 19, 27), (15, 20, 29), (20, 20, 31), + (27, 24, 33), (45, 24, 25), (50, 26, 26), (56, 28, 28), + (78, 30, 38), (102, 24, 39), (108, 26, 42), (113, 33, 54), + (112, 28, 38), (107, 31, 45), (102, 34, 53), (102, 34, 56), + (102, 35, 59), (110, 41, 72), (111, 47, 83), (102, 47, 95), + (97, 43, 85), (54, 39, 60), (45, 34, 55), (37, 30, 50), + (29, 25, 38), (22, 21, 30), (19, 18, 26), (18, 17, 25), + (16, 14, 20), (16, 14, 19), (16, 14, 18), (16, 11, 17), + (15, 10, 16), (14, 12, 16), (14, 11, 16), (13, 10, 16), + (13, 11, 16), (12, 12, 17), (12, 12, 17), (13, 12, 17), + (13, 12, 17), (14, 12, 18), (14, 13, 19), (14, 14, 21), + (14, 15, 24), (14, 15, 25), (14, 16, 26), (14, 16, 27), + (13, 15, 28), (11, 15, 30), (12, 18, 33), (13, 20, 39), + (16, 22, 45), (18, 28, 58), (19, 37, 74), (29, 39, 76), + (37, 40, 76), (39, 45, 77), (44, 44, 71), (45, 39, 58), + (35, 30, 41), (32, 27, 41), (30, 25, 41), (30, 25, 40), + (31, 30, 44), (36, 32, 48), (43, 37, 50), (53, 40, 50), + (65, 42, 46), (74, 57, 48), (93, 52, 46), (114, 35, 33), + (113, 43, 27), (109, 45, 27), (110, 38, 25), (96, 39, 22), + (73, 40, 22), (60, 45, 34), (57, 53, 42), (56, 53, 45), + (59, 55, 45), (62, 59, 44), (58, 57, 49), (60, 57, 49), + (71, 63, 55), (77, 64, 72), (84, 57, 84), (89, 53, 103), + (85, 58, 109), (94, 57, 107), (82, 48, 109), (64, 45, 107), + (67, 47, 111), (75, 47, 113), (86, 55, 139), (94, 53, 151), + (101, 36, 126), (101, 45, 127), (88, 42, 111), (71, 17, 74), + (52, 15, 50), (33, 16, 33), (20, 10, 27), (16, 10, 24), + (13, 11, 22), (10, 9, 18), (9, 8, 13), (6, 7, 13), + (7, 6, 13), (8, 8, 12), (8, 9, 12), (10, 10, 15), + (12, 12, 19), (13, 14, 21), (16, 15, 23), (18, 17, 24), + (19, 18, 27), (19, 18, 27), (20, 18, 26), (19, 18, 26), + (16, 17, 24), (15, 16, 22), (15, 15, 22), (15, 14, 20), + (16, 16, 21), (19, 17, 23), (23, 19, 25), (27, 23, 28), + (32, 28, 33), (39, 35, 39), (37, 36, 40), (39, 32, 39) + ), + +// 536 Davinci +((210, 157, 143), (233, 209, 178), (220, 210, 184), (207, 212, 190), + (181, 200, 172), (156, 189, 155), (151, 175, 164), (146, 161, 173), + (90, 107, 141), (105, 94, 145), (120, 81, 150), (130, 71, 134), + (140, 62, 118), (138, 41, 96), (137, 20, 74), (130, 15, 68), + (123, 11, 63), (86, 12, 41), (81, 31, 53), (77, 50, 66), + (77, 66, 77), (77, 82, 89), (80, 94, 101), (83, 106, 113), + (73, 84, 100), (66, 68, 90), (59, 52, 81), (56, 42, 74), + (53, 32, 68), (58, 30, 61), (64, 28, 55), (65, 36, 39), + (61, 56, 52), (38, 87, 51), (32, 101, 68), (27, 115, 86), + (30, 124, 89), (34, 133, 92), (43, 129, 92), (53, 126, 92), + (116, 146, 93), (160, 172, 115), (205, 198, 137), (217, 191, 135), + (229, 185, 134), (221, 177, 132), (213, 169, 130), (205, 128, 97), + (184, 83, 70), (155, 43, 50), (148, 28, 41), (142, 14, 33), + (146, 21, 49), (150, 29, 65), (152, 35, 73), (154, 42, 81), + (177, 82, 126), (184, 104, 146), (191, 127, 167), (186, 130, 157), + (182, 133, 147), (179, 137, 152), (176, 141, 157), (169, 123, 145), + (163, 102, 122), (150, 60, 67), (157, 66, 65), (164, 73, 63), + (172, 80, 63), (181, 87, 64), (192, 110, 69), (185, 101, 73), + (194, 75, 45), (178, 49, 29), (162, 23, 13), (162, 38, 16), + (162, 54, 19), (152, 67, 29), (143, 81, 40), (150, 118, 58), + (152, 147, 70), (114, 147, 73), (125, 147, 81), (137, 147, 89), + (141, 139, 91), (145, 131, 94), (147, 98, 73), (144, 55, 47), + (140, 36, 48), (141, 33, 42), (142, 30, 37), (139, 35, 44), + (137, 41, 52), (129, 49, 62), (125, 43, 50), (118, 40, 39), + (104, 41, 43), (99, 55, 43), (98, 48, 45), (98, 41, 47), + (97, 40, 48), (97, 39, 50), (104, 36, 49), (115, 36, 45), + (112, 52, 63), (115, 84, 77), (118, 116, 92), (106, 117, 95), + (95, 119, 98), (98, 138, 123), (99, 138, 108), (97, 144, 99), + (113, 149, 111), (174, 159, 114), (173, 149, 108), (172, 139, 102), + (165, 109, 83), (148, 81, 66), (115, 57, 63), (96, 53, 66), + (59, 43, 68), (38, 39, 57), (18, 35, 47), (14, 24, 41), + (11, 13, 35), (16, 7, 41), (34, 17, 44), (47, 12, 24), + (62, 6, 20), (109, 34, 20), (120, 51, 28), (131, 69, 36), + (136, 88, 56), (139, 118, 77), (138, 135, 81), (125, 130, 75), + (84, 105, 47), (70, 86, 33), (57, 67, 20), (49, 58, 19), + (41, 49, 18), (20, 33, 12), (8, 27, 7), (16, 39, 34), + (30, 61, 52), (54, 114, 66), (70, 127, 82), (86, 140, 98), + (101, 159, 97), (96, 181, 95), (109, 177, 109), (112, 165, 109), + (134, 147, 109), (134, 131, 105), (135, 115, 102), (138, 92, 91), + (156, 79, 81), (159, 74, 95), (161, 81, 100), (176, 92, 97), + (181, 109, 107), (177, 142, 116), (172, 144, 117), (168, 147, 118), + (150, 141, 116), (140, 138, 100), (108, 112, 83), (77, 82, 68), + (65, 66, 41), (66, 61, 40), (67, 56, 39), (83, 48, 31), + (90, 59, 35), (102, 79, 43), (137, 85, 42), (143, 89, 51), + (136, 109, 69), (150, 118, 71), (151, 103, 71), (148, 97, 82), + (142, 99, 91), (131, 90, 87), (132, 85, 83), (136, 107, 98), + (145, 150, 100), (145, 154, 109), (145, 158, 119), (135, 164, 122), + (139, 165, 119), (158, 168, 137), (161, 155, 148), (148, 126, 126), + (150, 120, 112), (147, 99, 97), (140, 83, 89), (142, 75, 82), + (149, 62, 70), (152, 53, 54), (152, 65, 56), (158, 78, 64), + (168, 109, 86), (175, 153, 115), (185, 183, 131), (179, 191, 144), + (177, 194, 150), (195, 198, 162), (193, 182, 163), (184, 173, 149), + (180, 153, 130), (176, 134, 117), (172, 144, 119), (174, 155, 118), + (169, 160, 117), (141, 154, 112), (122, 147, 111), (121, 146, 108), + (110, 137, 106), (115, 135, 119), (123, 127, 117), (127, 121, 111), + (124, 111, 110), (117, 112, 122), (110, 109, 119), (120, 109, 121), + (116, 105, 124), (126, 97, 116), (127, 74, 93), (116, 55, 68), + (117, 40, 40), (108, 33, 28), (83, 20, 12), (67, 26, 10), + (51, 31, 12), (31, 19, 5), (21, 11, 3), (13, 4, 4), + (11, 7, 10), (12, 9, 13), (7, 5, 11), (4, 9, 12), + (5, 17, 19), (2, 14, 18), (4, 19, 20), (8, 23, 21), + (9, 18, 21), (21, 22, 20), (39, 40, 26), (50, 53, 32), + (72, 71, 45), (98, 95, 59), (117, 126, 63), (146, 151, 78), + (165, 152, 101), (180, 167, 109), (207, 182, 114), (218, 162, 124) + ), + +// 537 Daylight_Fading +((80, 105, 154), (70, 95, 136), (64, 82, 120), (58, 70, 105), + (50, 62, 94), (42, 54, 83), (39, 51, 78), (36, 49, 74), + (34, 44, 65), (38, 44, 63), (43, 44, 61), (47, 44, 62), + (52, 45, 63), (57, 47, 67), (62, 50, 71), (67, 53, 73), + (73, 56, 76), (99, 72, 86), (105, 75, 87), (112, 79, 88), + (114, 80, 91), (117, 82, 94), (120, 84, 96), (123, 87, 98), + (141, 88, 93), (148, 84, 92), (155, 80, 91), (165, 86, 99), + (175, 92, 108), (182, 98, 113), (190, 105, 119), (203, 112, 124), + (213, 113, 126), (210, 108, 123), (198, 111, 126), (186, 115, 129), + (170, 111, 128), (155, 107, 127), (147, 102, 124), (140, 97, 121), + (121, 93, 118), (126, 96, 122), (131, 100, 127), (142, 104, 126), + (153, 109, 126), (153, 109, 125), (154, 110, 125), (160, 107, 122), + (161, 101, 113), (150, 89, 93), (135, 80, 85), (121, 71, 77), + (104, 60, 70), (88, 50, 64), (82, 47, 61), (77, 45, 58), + (69, 43, 57), (68, 44, 58), (67, 46, 60), (64, 46, 60), + (62, 46, 61), (61, 45, 61), (60, 45, 61), (58, 45, 59), + (55, 45, 57), (45, 40, 53), (40, 38, 51), (36, 36, 50), + (36, 36, 49), (36, 37, 49), (37, 36, 50), (40, 35, 51), + (42, 36, 52), (43, 36, 52), (44, 37, 53), (46, 35, 53), + (49, 34, 53), (49, 33, 51), (49, 33, 50), (49, 32, 46), + (46, 30, 43), (39, 26, 37), (38, 26, 35), (37, 26, 33), + (39, 26, 32), (41, 27, 32), (46, 28, 32), (52, 29, 35), + (70, 41, 50), (83, 51, 61), (96, 62, 72), (103, 65, 76), + (110, 69, 81), (129, 79, 89), (144, 86, 97), (156, 95, 107), + (159, 102, 116), (139, 102, 117), (131, 95, 108), (124, 89, 99), + (121, 85, 95), (118, 81, 92), (102, 71, 88), (88, 62, 78), + (73, 41, 56), (84, 41, 56), (96, 42, 57), (106, 44, 60), + (117, 46, 63), (135, 53, 68), (152, 57, 74), (166, 63, 80), + (180, 73, 91), (193, 87, 115), (193, 89, 118), (193, 91, 121), + (184, 91, 121), (175, 94, 117), (159, 90, 113), (142, 87, 110), + (109, 77, 102), (96, 74, 97), (84, 72, 93), (79, 70, 90), + (75, 68, 88), (66, 65, 84), (60, 61, 80), (55, 59, 79), + (50, 56, 79), (49, 50, 76), (50, 48, 72), (51, 47, 68), + (54, 44, 61), (55, 41, 56), (57, 39, 57), (62, 38, 58), + (74, 42, 62), (79, 43, 63), (84, 45, 65), (86, 45, 66), + (89, 45, 68), (95, 49, 69), (100, 52, 71), (102, 52, 71), + (103, 52, 69), (109, 49, 64), (111, 48, 63), (114, 48, 62), + (119, 45, 60), (124, 43, 55), (126, 41, 55), (128, 41, 54), + (130, 43, 55), (130, 43, 55), (130, 44, 55), (128, 46, 56), + (124, 50, 61), (117, 54, 67), (107, 58, 72), (97, 61, 77), + (87, 64, 82), (76, 70, 92), (74, 71, 93), (72, 72, 95), + (69, 74, 96), (67, 73, 96), (69, 70, 94), (71, 69, 92), + (77, 67, 86), (79, 66, 84), (81, 65, 83), (87, 61, 81), + (90, 57, 78), (92, 52, 75), (92, 51, 72), (91, 52, 66), + (92, 56, 67), (93, 61, 67), (96, 62, 71), (98, 69, 79), + (100, 75, 85), (100, 81, 92), (97, 86, 93), (97, 84, 93), + (99, 82, 94), (98, 80, 95), (98, 79, 97), (93, 75, 94), + (88, 67, 88), (82, 58, 79), (82, 51, 71), (83, 49, 70), + (86, 49, 70), (91, 52, 73), (95, 54, 76), (101, 55, 77), + (107, 56, 80), (118, 59, 83), (131, 62, 85), (141, 65, 87), + (149, 63, 82), (150, 58, 77), (149, 53, 72), (147, 49, 66), + (142, 46, 62), (133, 41, 59), (122, 36, 54), (106, 31, 49), + (91, 28, 44), (77, 28, 41), (64, 27, 41), (55, 29, 44), + (49, 33, 48), (50, 39, 51), (59, 46, 55), (77, 50, 60), + (74, 49, 58), (70, 49, 57), (64, 46, 52), (57, 45, 50), + (78, 47, 56), (76, 43, 53), (71, 38, 49), (60, 31, 43), + (42, 26, 38), (43, 27, 39), (43, 29, 41), (43, 28, 42), + (41, 26, 41), (39, 25, 40), (37, 24, 37), (36, 25, 35), + (36, 26, 33), (33, 24, 33), (32, 23, 33), (34, 23, 34), + (38, 25, 35), (45, 29, 40), (51, 35, 47), (56, 41, 57), + (62, 49, 67), (67, 55, 75), (74, 62, 86), (81, 68, 92), + (85, 74, 99), (91, 77, 102), (94, 78, 103), (93, 83, 111), + (95, 86, 117), (96, 93, 126), (99, 98, 132), (102, 108, 142), + (101, 111, 147), (98, 111, 152), (93, 111, 156), (89, 102, 150) + ), + +// 538 Dinosaurs +((27, 168, 193), (15, 167, 195), (12, 154, 194), (10, 141, 193), + (7, 133, 179), (4, 125, 165), (7, 118, 154), (10, 112, 144), + (12, 84, 92), (17, 80, 74), (23, 76, 56), (26, 77, 43), + (30, 78, 30), (41, 79, 43), (53, 81, 57), (55, 79, 67), + (57, 78, 77), (64, 92, 106), (67, 80, 114), (71, 69, 122), + (80, 62, 117), (89, 56, 112), (92, 56, 101), (96, 56, 91), + (91, 37, 68), (94, 40, 50), (98, 44, 33), (86, 52, 30), + (75, 61, 27), (75, 58, 26), (75, 56, 26), (77, 54, 23), + (71, 55, 23), (69, 80, 54), (68, 88, 71), (68, 96, 89), + (61, 116, 101), (55, 136, 113), (48, 141, 118), (41, 146, 124), + (33, 146, 139), (35, 130, 137), (37, 114, 135), (52, 94, 143), + (68, 74, 152), (82, 65, 155), (96, 56, 158), (104, 49, 165), + (104, 62, 170), (123, 82, 169), (109, 82, 154), (96, 83, 139), + (77, 83, 115), (59, 83, 92), (53, 81, 84), (47, 79, 76), + (24, 64, 40), (20, 70, 29), (16, 76, 19), (12, 90, 16), + (9, 104, 14), (8, 109, 17), (7, 114, 21), (9, 124, 27), + (11, 131, 34), (14, 136, 46), (14, 133, 55), (14, 131, 64), + (15, 126, 65), (17, 121, 66), (17, 112, 59), (22, 99, 51), + (24, 99, 36), (26, 107, 27), (28, 116, 18), (29, 132, 19), + (31, 148, 20), (28, 152, 24), (26, 157, 28), (25, 164, 27), + (24, 171, 23), (23, 161, 27), (32, 150, 25), (42, 139, 23), + (50, 136, 27), (59, 133, 32), (69, 121, 42), (85, 113, 58), + (117, 95, 61), (121, 80, 61), (126, 65, 61), (127, 62, 58), + (129, 60, 55), (142, 55, 44), (149, 48, 34), (152, 35, 33), + (155, 30, 43), (169, 48, 71), (165, 46, 75), (162, 44, 80), + (159, 42, 80), (157, 40, 80), (146, 56, 80), (133, 75, 75), + (138, 95, 71), (122, 103, 74), (107, 112, 77), (109, 115, 85), + (112, 119, 93), (120, 127, 121), (110, 133, 147), (84, 135, 156), + (63, 132, 160), (49, 136, 168), (46, 139, 161), (43, 142, 155), + (40, 142, 128), (52, 134, 105), (72, 116, 80), (99, 98, 62), + (144, 71, 22), (148, 58, 17), (153, 46, 13), (155, 39, 13), + (157, 33, 14), (153, 33, 14), (137, 33, 13), (114, 33, 14), + (94, 28, 13), (60, 18, 24), (55, 18, 28), (51, 18, 33), + (40, 19, 42), (31, 16, 51), (18, 12, 53), (13, 18, 56), + (10, 36, 63), (13, 39, 59), (17, 42, 55), (16, 44, 54), + (16, 47, 53), (15, 51, 61), (18, 64, 81), (20, 75, 100), + (21, 83, 116), (21, 93, 138), (20, 100, 138), (19, 107, 139), + (12, 117, 133), (12, 121, 122), (10, 117, 105), (15, 115, 82), + (8, 110, 48), (6, 105, 43), (5, 101, 38), (17, 94, 32), + (30, 93, 27), (44, 90, 23), (51, 82, 22), (66, 68, 23), + (79, 64, 28), (98, 44, 23), (106, 38, 23), (115, 32, 23), + (124, 26, 32), (133, 16, 48), (142, 10, 60), (163, 11, 73), + (186, 15, 107), (189, 16, 111), (192, 17, 115), (200, 24, 116), + (204, 27, 108), (195, 34, 103), (181, 43, 103), (164, 50, 107), + (160, 51, 102), (153, 53, 86), (152, 62, 70), (135, 64, 103), + (121, 66, 131), (101, 69, 145), (99, 82, 117), (100, 83, 134), + (102, 79, 176), (104, 78, 169), (106, 77, 163), (116, 72, 148), + (129, 63, 141), (147, 54, 127), (156, 40, 109), (152, 35, 87), + (134, 31, 76), (114, 28, 76), (95, 24, 81), (77, 28, 82), + (59, 44, 88), (43, 54, 90), (33, 58, 94), (29, 58, 85), + (34, 64, 79), (46, 66, 61), (50, 63, 46), (48, 57, 29), + (41, 50, 27), (42, 46, 29), (41, 37, 41), (46, 33, 55), + (51, 31, 79), (61, 35, 97), (72, 43, 116), (84, 54, 128), + (90, 72, 143), (95, 86, 146), (94, 104, 138), (89, 119, 123), + (70, 144, 113), (49, 161, 106), (35, 170, 100), (31, 164, 89), + (27, 158, 82), (26, 152, 71), (27, 144, 69), (31, 138, 64), + (33, 135, 61), (37, 134, 55), (39, 126, 50), (39, 122, 42), + (39, 123, 34), (36, 125, 32), (32, 128, 40), (27, 127, 47), + (30, 135, 45), (31, 144, 38), (30, 154, 38), (20, 154, 43), + (18, 150, 49), (19, 146, 47), (26, 137, 43), (24, 119, 36), + (24, 98, 36), (27, 79, 45), (37, 66, 60), (42, 56, 70), + (42, 53, 69), (44, 53, 70), (47, 63, 82), (47, 84, 100), + (42, 100, 112), (41, 110, 118), (43, 118, 128), (43, 138, 140), + (38, 159, 153), (36, 171, 163), (36, 170, 182), (34, 167, 191) + ), + +// 539 Dragon +((148, 29, 29), (138, 15, 31), (124, 16, 40), (111, 17, 50), + (95, 26, 55), (79, 35, 61), (73, 39, 60), (67, 44, 60), + (71, 68, 51), (88, 75, 41), (106, 82, 32), (119, 76, 23), + (133, 70, 14), (145, 65, 9), (157, 61, 4), (158, 56, 5), + (159, 51, 6), (153, 47, 13), (148, 46, 14), (143, 46, 16), + (142, 51, 18), (141, 56, 21), (141, 59, 18), (141, 62, 16), + (135, 65, 14), (124, 75, 10), (113, 85, 7), (94, 99, 6), + (75, 113, 5), (68, 116, 7), (61, 120, 9), (45, 123, 9), + (26, 129, 8), (12, 124, 11), (9, 114, 9), (7, 104, 7), + (7, 100, 9), (8, 96, 11), (8, 95, 11), (9, 94, 11), + (9, 90, 13), (9, 98, 15), (10, 106, 18), (9, 107, 21), + (8, 108, 25), (7, 108, 26), (7, 109, 28), (7, 112, 29), + (8, 116, 28), (17, 118, 39), (25, 119, 44), (34, 121, 49), + (41, 117, 50), (48, 113, 52), (59, 104, 54), (70, 96, 57), + (107, 68, 52), (119, 57, 43), (131, 46, 34), (142, 42, 28), + (153, 39, 22), (152, 39, 19), (151, 40, 16), (139, 43, 9), + (120, 49, 7), (86, 51, 13), (72, 43, 22), (58, 35, 31), + (52, 34, 37), (46, 33, 43), (36, 32, 48), (34, 23, 55), + (35, 10, 61), (31, 10, 63), (28, 10, 66), (27, 10, 61), + (26, 11, 57), (25, 11, 53), (25, 12, 49), (26, 13, 45), + (21, 17, 45), (22, 36, 35), (21, 43, 37), (21, 50, 40), + (24, 54, 45), (27, 58, 50), (28, 69, 57), (27, 85, 63), + (23, 101, 70), (27, 102, 65), (32, 103, 60), (34, 100, 55), + (37, 98, 50), (49, 89, 41), (71, 79, 33), (94, 68, 27), + (111, 59, 29), (145, 52, 26), (155, 60, 25), (165, 69, 25), + (164, 72, 27), (163, 76, 29), (160, 74, 34), (157, 74, 33), + (140, 78, 41), (134, 76, 47), (128, 75, 54), (125, 77, 52), + (123, 80, 51), (121, 90, 43), (116, 110, 37), (120, 127, 33), + (119, 138, 28), (107, 142, 15), (103, 144, 15), (100, 147, 16), + (89, 145, 22), (71, 131, 30), (54, 118, 31), (40, 112, 29), + (28, 100, 29), (29, 96, 27), (30, 93, 26), (35, 90, 23), + (41, 88, 21), (47, 86, 23), (50, 85, 31), (56, 84, 41), + (70, 79, 42), (95, 82, 39), (98, 86, 39), (102, 91, 39), + (115, 103, 32), (125, 113, 26), (136, 123, 21), (139, 125, 20), + (141, 112, 23), (134, 98, 32), (127, 85, 41), (121, 77, 46), + (115, 70, 52), (101, 54, 58), (90, 45, 63), (82, 44, 58), + (78, 47, 51), (76, 68, 43), (74, 74, 38), (73, 80, 34), + (75, 83, 22), (79, 83, 13), (78, 93, 11), (70, 106, 12), + (70, 104, 12), (71, 101, 11), (72, 98, 11), (72, 97, 11), + (79, 89, 9), (87, 77, 8), (94, 62, 9), (93, 56, 11), + (97, 49, 10), (80, 54, 9), (72, 56, 10), (65, 59, 12), + (64, 60, 12), (58, 62, 15), (46, 66, 22), (34, 68, 33), + (34, 68, 45), (35, 68, 49), (36, 68, 53), (39, 69, 63), + (40, 78, 69), (56, 92, 64), (77, 104, 57), (94, 110, 45), + (99, 114, 39), (106, 121, 33), (114, 129, 31), (113, 130, 26), + (98, 122, 22), (80, 111, 21), (66, 104, 24), (53, 99, 24), + (23, 68, 22), (18, 60, 26), (13, 53, 30), (15, 42, 37), + (19, 38, 41), (20, 30, 42), (14, 31, 45), (15, 33, 48), + (17, 43, 53), (19, 51, 53), (23, 63, 52), (32, 77, 45), + (50, 91, 40), (64, 101, 36), (80, 100, 35), (96, 104, 36), + (116, 105, 35), (130, 106, 34), (132, 100, 29), (131, 105, 28), + (123, 115, 33), (115, 124, 37), (108, 126, 36), (107, 129, 31), + (102, 123, 36), (87, 114, 42), (72, 98, 40), (62, 88, 32), + (58, 64, 26), (52, 39, 27), (44, 19, 26), (37, 13, 25), + (36, 13, 19), (49, 18, 14), (69, 34, 11), (88, 50, 14), + (99, 67, 20), (108, 86, 23), (115, 105, 23), (118, 126, 20), + (115, 143, 20), (101, 155, 24), (81, 156, 27), (63, 153, 24), + (55, 146, 17), (46, 138, 14), (32, 132, 15), (22, 123, 17), + (24, 116, 16), (33, 105, 17), (40, 103, 17), (47, 104, 15), + (57, 110, 15), (70, 114, 14), (79, 120, 14), (80, 126, 15), + (76, 130, 16), (72, 134, 19), (69, 135, 27), (58, 137, 34), + (44, 137, 38), (29, 136, 36), (24, 132, 40), (21, 124, 44), + (23, 117, 48), (25, 111, 47), (35, 102, 42), (53, 92, 38), + (76, 74, 36), (97, 60, 37), (115, 46, 35), (133, 38, 32) + ), + +// 540 Dust_Bunny +((103, 105, 94), (100, 104, 95), (100, 104, 96), (101, 104, 97), + (104, 107, 101), (107, 111, 105), (107, 112, 107), (107, 113, 110), + (106, 115, 115), (105, 115, 114), (105, 115, 114), (105, 114, 113), + (106, 113, 113), (104, 111, 112), (103, 110, 112), (101, 108, 111), + (99, 107, 110), (91, 96, 104), (86, 92, 100), (82, 88, 97), + (76, 82, 92), (70, 76, 87), (67, 73, 84), (64, 70, 81), + (59, 63, 75), (57, 63, 75), (56, 63, 75), (57, 63, 74), + (58, 63, 73), (59, 64, 73), (60, 65, 74), (62, 68, 78), + (65, 71, 83), (71, 75, 83), (72, 75, 80), (73, 75, 77), + (72, 73, 75), (71, 71, 73), (71, 69, 71), (71, 68, 70), + (67, 60, 58), (65, 56, 53), (64, 53, 49), (63, 52, 49), + (63, 52, 49), (62, 51, 49), (62, 51, 49), (63, 51, 49), + (64, 51, 51), (68, 58, 57), (70, 61, 63), (73, 65, 69), + (74, 69, 74), (76, 74, 80), (76, 76, 82), (76, 78, 84), + (79, 80, 83), (78, 79, 81), (78, 78, 79), (73, 75, 77), + (69, 73, 75), (67, 71, 72), (66, 70, 70), (64, 67, 66), + (64, 64, 64), (63, 60, 61), (64, 60, 60), (65, 60, 59), + (67, 61, 59), (69, 63, 60), (74, 68, 64), (80, 73, 69), + (98, 88, 78), (108, 97, 85), (119, 107, 93), (125, 114, 100), + (131, 122, 108), (134, 125, 110), (137, 129, 113), (141, 131, 114), + (143, 132, 115), (137, 128, 112), (131, 122, 107), (125, 117, 103), + (120, 114, 101), (116, 111, 99), (110, 106, 95), (102, 101, 91), + (90, 89, 85), (85, 83, 83), (80, 78, 81), (77, 76, 79), + (75, 74, 78), (71, 69, 75), (67, 64, 71), (64, 59, 68), + (61, 55, 64), (56, 50, 54), (53, 48, 51), (50, 47, 48), + (49, 46, 48), (48, 46, 48), (48, 49, 49), (49, 51, 50), + (55, 58, 57), (58, 62, 63), (61, 67, 69), (63, 70, 72), + (65, 73, 75), (70, 77, 80), (74, 80, 83), (77, 81, 85), + (78, 79, 85), (74, 74, 81), (72, 73, 79), (71, 72, 78), + (69, 69, 75), (68, 65, 70), (68, 63, 66), (70, 64, 66), + (76, 74, 73), (82, 79, 75), (89, 84, 78), (94, 88, 80), + (99, 92, 83), (109, 99, 88), (115, 106, 90), (118, 109, 92), + (119, 109, 90), (123, 109, 88), (122, 107, 85), (121, 105, 83), + (115, 99, 77), (107, 92, 71), (99, 85, 65), (96, 82, 62), + (91, 76, 58), (89, 76, 59), (87, 76, 61), (86, 77, 62), + (86, 78, 63), (84, 80, 67), (85, 80, 69), (85, 82, 71), + (85, 81, 72), (81, 79, 74), (79, 77, 74), (78, 76, 75), + (77, 76, 77), (78, 76, 79), (81, 78, 82), (87, 83, 87), + (101, 95, 97), (104, 98, 99), (108, 101, 101), (112, 106, 106), + (114, 110, 109), (113, 112, 113), (112, 113, 113), (113, 113, 111), + (112, 112, 108), (104, 107, 103), (101, 105, 102), (98, 104, 102), + (93, 101, 98), (91, 99, 95), (90, 95, 91), (87, 91, 87), + (83, 81, 79), (82, 79, 76), (81, 77, 73), (79, 73, 68), + (77, 68, 62), (76, 65, 57), (77, 64, 55), (82, 66, 55), + (86, 71, 56), (92, 76, 59), (96, 80, 59), (99, 83, 61), + (101, 86, 63), (101, 86, 65), (101, 85, 67), (97, 82, 66), + (85, 72, 61), (81, 68, 59), (77, 65, 57), (70, 58, 53), + (62, 51, 52), (56, 47, 50), (53, 45, 49), (52, 47, 48), + (53, 47, 47), (56, 49, 48), (58, 51, 50), (63, 53, 53), + (66, 59, 56), (72, 65, 59), (79, 71, 60), (87, 76, 62), + (94, 80, 64), (97, 83, 67), (97, 86, 72), (97, 89, 75), + (95, 90, 78), (93, 90, 79), (90, 87, 78), (83, 81, 76), + (76, 76, 73), (69, 69, 69), (61, 63, 65), (57, 58, 60), + (53, 52, 54), (54, 50, 48), (56, 48, 44), (58, 48, 42), + (61, 50, 42), (64, 55, 45), (69, 60, 50), (75, 67, 57), + (81, 72, 65), (87, 79, 73), (90, 85, 79), (94, 90, 83), + (99, 94, 86), (103, 97, 88), (109, 100, 91), (115, 106, 95), + (120, 110, 96), (125, 113, 96), (129, 116, 95), (133, 117, 95), + (135, 120, 98), (135, 121, 103), (132, 121, 106), (128, 120, 107), + (122, 117, 107), (115, 112, 104), (108, 106, 103), (99, 98, 100), + (89, 92, 96), (81, 86, 92), (76, 82, 86), (74, 79, 81), + (74, 75, 78), (73, 75, 76), (74, 76, 77), (75, 80, 80), + (79, 85, 82), (84, 89, 87), (88, 92, 88), (90, 94, 90), + (89, 95, 90), (91, 97, 90), (95, 99, 91), (98, 101, 92) + ), + +// 541 Dynasty +((85, 96, 61), (34, 91, 51), (21, 89, 49), (8, 88, 48), + (8, 82, 35), (8, 77, 22), (7, 73, 19), (6, 69, 17), + (10, 51, 18), (16, 38, 14), (22, 25, 11), (36, 18, 14), + (51, 12, 17), (62, 12, 15), (74, 13, 14), (79, 13, 12), + (85, 13, 10), (88, 9, 23), (86, 11, 28), (84, 14, 33), + (80, 17, 42), (76, 21, 52), (76, 27, 58), (77, 33, 65), + (93, 55, 79), (94, 71, 80), (96, 88, 81), (95, 90, 68), + (95, 92, 56), (94, 87, 53), (94, 83, 50), (95, 70, 41), + (101, 58, 26), (123, 39, 4), (144, 33, 4), (166, 28, 5), + (176, 37, 11), (186, 47, 17), (185, 52, 26), (185, 57, 35), + (187, 70, 55), (178, 75, 54), (169, 80, 54), (162, 78, 57), + (156, 77, 60), (154, 74, 54), (152, 72, 49), (142, 72, 42), + (130, 70, 45), (101, 57, 51), (80, 48, 53), (59, 39, 56), + (46, 33, 51), (33, 28, 46), (27, 24, 41), (22, 20, 37), + (9, 19, 17), (15, 21, 13), (21, 24, 9), (28, 34, 8), + (35, 45, 7), (42, 45, 5), (49, 46, 4), (65, 43, 8), + (80, 46, 11), (98, 58, 12), (95, 62, 18), (93, 67, 25), + (90, 69, 30), (88, 72, 35), (73, 76, 36), (57, 88, 38), + (33, 99, 47), (30, 99, 56), (28, 99, 66), (28, 87, 73), + (29, 76, 80), (34, 69, 84), (39, 63, 88), (45, 58, 78), + (35, 56, 83), (26, 50, 68), (26, 54, 50), (26, 59, 32), + (29, 61, 27), (32, 63, 22), (51, 70, 15), (70, 69, 14), + (122, 50, 7), (143, 44, 9), (164, 38, 11), (170, 37, 11), + (177, 37, 11), (182, 38, 13), (183, 37, 14), (168, 37, 21), + (154, 42, 28), (144, 60, 29), (141, 65, 33), (138, 70, 38), + (135, 72, 44), (132, 74, 50), (128, 79, 50), (122, 84, 47), + (107, 98, 46), (96, 93, 44), (86, 88, 42), (81, 85, 42), + (77, 82, 42), (72, 74, 47), (71, 62, 47), (76, 54, 47), + (83, 51, 51), (86, 47, 50), (85, 50, 48), (84, 54, 46), + (90, 61, 44), (96, 71, 32), (96, 78, 21), (93, 88, 20), + (113, 95, 43), (126, 99, 52), (139, 104, 61), (142, 103, 67), + (145, 103, 73), (146, 107, 81), (147, 112, 86), (146, 112, 88), + (132, 99, 85), (89, 74, 63), (82, 69, 59), (76, 65, 56), + (67, 49, 49), (67, 33, 47), (79, 25, 41), (96, 23, 35), + (146, 16, 26), (169, 17, 22), (193, 18, 19), (199, 18, 18), + (205, 18, 17), (208, 16, 12), (203, 19, 8), (184, 23, 4), + (162, 26, 4), (119, 33, 5), (109, 35, 5), (100, 38, 5), + (88, 44, 10), (78, 58, 19), (75, 64, 33), (71, 68, 46), + (78, 79, 69), (83, 85, 76), (89, 91, 84), (90, 97, 94), + (91, 95, 99), (87, 84, 96), (89, 77, 93), (86, 66, 81), + (86, 57, 65), (80, 31, 44), (76, 27, 39), (72, 23, 35), + (61, 17, 25), (56, 18, 16), (55, 19, 13), (57, 30, 14), + (71, 52, 28), (78, 55, 34), (85, 59, 40), (103, 73, 50), + (125, 84, 63), (147, 97, 74), (168, 103, 83), (178, 102, 83), + (177, 97, 80), (172, 89, 74), (168, 81, 65), (160, 67, 54), + (143, 58, 44), (125, 49, 36), (116, 45, 26), (115, 38, 19), + (127, 32, 28), (136, 31, 29), (145, 31, 30), (163, 38, 25), + (178, 40, 28), (182, 49, 35), (189, 48, 52), (193, 63, 63), + (191, 71, 69), (175, 87, 67), (152, 89, 72), (128, 100, 74), + (107, 98, 72), (91, 95, 62), (76, 83, 53), (56, 77, 45), + (38, 65, 41), (29, 57, 35), (26, 48, 31), (24, 42, 25), + (19, 36, 24), (22, 36, 23), (33, 47, 25), (47, 58, 27), + (54, 63, 31), (52, 62, 34), (53, 65, 42), (57, 69, 49), + (66, 62, 55), (63, 49, 55), (61, 36, 57), (63, 29, 58), + (73, 25, 55), (85, 17, 48), (98, 10, 44), (118, 6, 46), + (131, 11, 43), (142, 13, 36), (145, 9, 29), (156, 6, 26), + (165, 6, 21), (172, 9, 18), (169, 7, 14), (164, 6, 18), + (162, 3, 19), (163, 5, 19), (155, 9, 20), (135, 11, 26), + (112, 12, 29), (98, 18, 26), (86, 31, 21), (75, 48, 18), + (67, 58, 17), (70, 64, 13), (83, 72, 10), (97, 79, 7), + (114, 78, 7), (126, 66, 5), (138, 58, 7), (145, 50, 13), + (151, 45, 19), (152, 33, 19), (151, 29, 15), (151, 31, 16), + (154, 42, 20), (163, 53, 22), (172, 65, 20), (167, 70, 25), + (162, 81, 29), (137, 85, 37), (125, 95, 43), (91, 94, 56) + ), + +// 542 Easter +((178, 165, 213), (177, 160, 215), (176, 158, 215), (175, 156, 216), + (175, 154, 216), (176, 153, 217), (176, 151, 217), (177, 150, 217), + (178, 151, 217), (179, 154, 217), (180, 158, 217), (180, 158, 216), + (180, 159, 215), (180, 159, 214), (180, 159, 214), (179, 160, 214), + (179, 161, 214), (178, 164, 218), (177, 163, 219), (177, 163, 220), + (175, 164, 223), (173, 166, 226), (174, 167, 226), (175, 168, 227), + (182, 171, 227), (180, 170, 227), (178, 170, 227), (176, 164, 221), + (174, 158, 215), (173, 152, 210), (173, 147, 206), (167, 134, 196), + (158, 121, 186), (134, 89, 157), (120, 72, 143), (106, 56, 130), + (98, 46, 122), (91, 36, 115), (90, 33, 112), (89, 31, 109), + (90, 30, 111), (95, 35, 116), (100, 40, 121), (108, 47, 126), + (116, 54, 132), (118, 55, 135), (120, 57, 139), (122, 59, 141), + (121, 57, 140), (112, 51, 130), (104, 44, 126), (97, 37, 122), + (93, 31, 118), (89, 25, 115), (89, 25, 113), (89, 25, 112), + (95, 33, 119), (107, 48, 131), (119, 63, 144), (129, 79, 156), + (139, 96, 169), (141, 101, 172), (144, 106, 176), (158, 130, 193), + (169, 142, 202), (182, 169, 224), (182, 177, 227), (183, 185, 230), + (185, 188, 231), (188, 192, 232), (193, 196, 234), (197, 200, 237), + (199, 207, 240), (199, 206, 238), (199, 205, 237), (197, 199, 235), + (195, 193, 233), (193, 189, 232), (192, 185, 231), (185, 174, 228), + (180, 162, 225), (168, 143, 218), (166, 136, 214), (164, 129, 211), + (163, 125, 209), (163, 122, 208), (160, 117, 205), (158, 114, 200), + (156, 110, 190), (156, 107, 187), (157, 105, 184), (156, 104, 182), + (156, 103, 181), (155, 100, 178), (152, 99, 177), (150, 97, 178), + (149, 98, 180), (152, 103, 184), (155, 109, 187), (158, 115, 190), + (158, 119, 192), (158, 124, 195), (160, 132, 198), (163, 138, 201), + (170, 142, 199), (169, 142, 196), (169, 142, 194), (167, 140, 192), + (166, 139, 191), (164, 131, 188), (160, 120, 184), (155, 108, 177), + (148, 97, 170), (136, 78, 156), (131, 73, 153), (127, 69, 151), + (120, 60, 144), (113, 52, 139), (107, 46, 132), (106, 42, 127), + (105, 45, 126), (110, 50, 131), (116, 56, 137), (121, 61, 141), + (126, 67, 145), (136, 81, 155), (146, 96, 168), (155, 111, 180), + (163, 124, 193), (176, 150, 215), (178, 155, 218), (181, 161, 222), + (184, 169, 228), (185, 175, 233), (185, 177, 235), (185, 177, 237), + (186, 177, 236), (186, 175, 234), (186, 173, 232), (185, 170, 231), + (184, 168, 230), (182, 162, 227), (179, 156, 222), (178, 151, 218), + (177, 148, 214), (174, 139, 206), (172, 134, 203), (170, 129, 201), + (166, 121, 196), (164, 115, 191), (162, 110, 187), (159, 107, 182), + (148, 85, 173), (144, 78, 169), (141, 72, 166), (134, 64, 160), + (128, 58, 153), (120, 53, 144), (114, 45, 138), (105, 37, 130), + (94, 33, 122), (88, 32, 113), (89, 35, 114), (90, 39, 116), + (96, 45, 122), (98, 55, 129), (104, 65, 136), (113, 73, 144), + (136, 94, 171), (141, 100, 178), (146, 107, 185), (154, 119, 196), + (161, 127, 204), (164, 134, 212), (167, 139, 217), (168, 144, 221), + (171, 148, 223), (174, 152, 224), (175, 155, 225), (176, 155, 225), + (176, 154, 224), (175, 152, 221), (175, 149, 217), (173, 145, 212), + (162, 139, 210), (161, 139, 211), (160, 139, 213), (161, 140, 215), + (166, 144, 216), (166, 144, 217), (162, 147, 220), (161, 149, 223), + (163, 151, 228), (169, 155, 230), (173, 155, 229), (170, 152, 230), + (167, 150, 227), (166, 148, 228), (166, 147, 228), (168, 148, 226), + (167, 146, 226), (165, 146, 225), (166, 145, 225), (166, 144, 223), + (169, 144, 220), (171, 142, 218), (170, 140, 215), (169, 137, 212), + (166, 132, 209), (163, 127, 206), (160, 123, 205), (158, 122, 204), + (159, 123, 204), (161, 124, 204), (162, 125, 204), (163, 127, 205), + (164, 132, 207), (165, 137, 208), (170, 143, 210), (172, 146, 212), + (175, 147, 213), (174, 148, 215), (173, 148, 215), (173, 147, 216), + (172, 143, 216), (170, 135, 215), (168, 128, 214), (166, 124, 211), + (164, 122, 209), (165, 122, 207), (166, 119, 207), (166, 119, 207), + (167, 122, 207), (167, 126, 208), (169, 133, 209), (172, 139, 211), + (176, 147, 214), (179, 154, 218), (181, 162, 222), (185, 170, 226), + (188, 178, 228), (193, 186, 231), (198, 192, 233), (199, 198, 234), + (199, 200, 235), (197, 199, 235), (195, 199, 234), (193, 197, 233), + (192, 195, 230), (189, 191, 227), (185, 185, 225), (183, 179, 222), + (179, 175, 220), (178, 172, 217), (177, 170, 215), (177, 168, 213) + ), + +// 543 Easter_2 +((145, 146, 202), (154, 169, 210), (159, 183, 215), (165, 198, 220), + (173, 210, 225), (181, 222, 230), (187, 224, 232), (193, 227, 234), + (220, 240, 243), (229, 243, 246), (238, 247, 249), (239, 247, 249), + (241, 248, 250), (233, 244, 247), (226, 241, 244), (220, 236, 242), + (215, 232, 240), (185, 203, 229), (171, 186, 220), (157, 169, 211), + (148, 151, 203), (139, 134, 196), (135, 128, 193), (132, 122, 190), + (122, 101, 179), (110, 84, 172), (99, 67, 165), (89, 52, 154), + (79, 37, 144), (74, 29, 140), (70, 22, 136), (64, 12, 131), + (65, 8, 131), (93, 27, 143), (105, 38, 151), (118, 50, 160), + (125, 65, 165), (133, 81, 170), (134, 87, 171), (136, 93, 172), + (149, 120, 187), (161, 136, 197), (174, 153, 207), (190, 169, 217), + (207, 185, 228), (214, 193, 232), (221, 202, 237), (232, 217, 242), + (240, 228, 245), (246, 244, 251), (249, 248, 252), (252, 252, 254), + (250, 252, 253), (249, 252, 252), (246, 250, 251), (243, 249, 250), + (227, 242, 244), (217, 237, 241), (208, 233, 238), (200, 230, 235), + (193, 227, 233), (190, 226, 232), (187, 225, 231), (182, 223, 230), + (178, 221, 228), (176, 220, 227), (176, 220, 227), (176, 221, 227), + (177, 221, 227), (179, 221, 228), (184, 223, 230), (190, 225, 232), + (202, 226, 237), (209, 224, 239), (217, 223, 241), (224, 219, 243), + (231, 216, 245), (233, 214, 246), (236, 212, 247), (239, 207, 247), + (241, 200, 246), (236, 180, 243), (230, 168, 239), (225, 156, 236), + (222, 150, 235), (220, 144, 234), (215, 132, 230), (209, 123, 227), + (201, 104, 221), (196, 96, 218), (191, 89, 215), (188, 86, 213), + (186, 83, 212), (181, 78, 209), (178, 73, 207), (174, 72, 206), + (173, 71, 205), (172, 73, 204), (172, 76, 204), (173, 79, 204), + (174, 81, 204), (175, 83, 205), (178, 88, 206), (180, 93, 208), + (182, 104, 211), (176, 111, 210), (171, 118, 209), (167, 122, 209), + (164, 126, 209), (159, 133, 208), (156, 141, 208), (156, 151, 210), + (160, 160, 212), (172, 177, 218), (174, 181, 219), (176, 185, 221), + (177, 194, 223), (178, 201, 224), (179, 209, 226), (183, 217, 229), + (197, 229, 235), (209, 234, 239), (222, 240, 243), (227, 242, 245), + (233, 244, 247), (241, 244, 250), (246, 241, 251), (247, 235, 251), + (245, 226, 249), (235, 205, 242), (233, 200, 240), (232, 195, 239), + (229, 186, 237), (227, 179, 236), (225, 173, 236), (222, 164, 235), + (215, 150, 231), (207, 147, 227), (200, 144, 224), (197, 144, 223), + (195, 144, 222), (193, 148, 223), (196, 156, 225), (199, 164, 228), + (204, 173, 230), (215, 187, 237), (215, 190, 237), (216, 193, 238), + (215, 195, 236), (212, 195, 235), (207, 200, 234), (199, 204, 233), + (180, 204, 228), (176, 203, 227), (172, 202, 226), (166, 200, 223), + (160, 197, 221), (155, 190, 218), (149, 187, 216), (143, 185, 214), + (137, 184, 212), (121, 183, 207), (117, 184, 206), (113, 185, 205), + (108, 188, 204), (108, 190, 204), (113, 192, 206), (123, 193, 207), + (146, 190, 213), (150, 187, 214), (155, 184, 215), (160, 175, 214), + (160, 162, 211), (165, 165, 213), (165, 168, 215), (166, 171, 214), + (164, 172, 213), (162, 174, 214), (161, 175, 214), (160, 173, 215), + (153, 150, 208), (151, 143, 209), (147, 138, 213), (144, 138, 216), + (130, 148, 213), (126, 153, 213), (122, 158, 213), (114, 170, 214), + (102, 166, 207), (96, 157, 202), (87, 143, 198), (86, 128, 195), + (87, 115, 191), (87, 112, 189), (85, 113, 188), (81, 117, 187), + (75, 125, 185), (73, 136, 181), (67, 139, 180), (65, 140, 179), + (68, 131, 177), (78, 125, 177), (87, 120, 177), (94, 112, 177), + (98, 107, 176), (105, 108, 175), (107, 108, 174), (104, 108, 172), + (97, 102, 167), (97, 93, 160), (97, 82, 153), (96, 71, 147), + (96, 59, 143), (103, 51, 144), (111, 42, 144), (117, 36, 145), + (120, 34, 147), (123, 37, 149), (128, 44, 153), (133, 53, 156), + (137, 64, 159), (145, 79, 167), (156, 95, 176), (169, 109, 188), + (183, 122, 200), (196, 133, 211), (207, 143, 222), (216, 151, 230), + (224, 156, 234), (228, 162, 237), (230, 170, 238), (226, 180, 239), + (217, 186, 237), (206, 188, 234), (193, 188, 230), (179, 185, 226), + (167, 180, 222), (157, 174, 219), (152, 168, 217), (151, 164, 213), + (148, 159, 211), (145, 155, 209), (140, 150, 206), (134, 144, 202), + (127, 136, 197), (121, 128, 193), (117, 123, 191), (118, 118, 189), + (118, 118, 188), (120, 119, 190), (121, 122, 191), (124, 125, 193), + (127, 125, 194), (132, 126, 195), (133, 130, 197), (140, 135, 199) + ), + +// 544 Easter_3 +((216, 166, 226), (229, 189, 237), (235, 199, 242), (241, 210, 247), + (244, 216, 250), (247, 223, 253), (247, 223, 253), (247, 224, 253), + (243, 219, 250), (236, 213, 246), (229, 208, 242), (219, 199, 238), + (210, 190, 234), (200, 176, 231), (191, 162, 228), (187, 153, 225), + (184, 145, 223), (158, 118, 206), (146, 110, 198), (135, 102, 191), + (128, 96, 185), (122, 90, 179), (123, 88, 176), (124, 86, 174), + (129, 84, 165), (130, 84, 166), (132, 85, 167), (137, 89, 172), + (142, 93, 178), (148, 96, 180), (154, 100, 183), (166, 108, 187), + (176, 111, 191), (174, 106, 193), (166, 103, 191), (158, 100, 190), + (151, 98, 183), (145, 96, 176), (141, 93, 171), (138, 91, 167), + (111, 71, 146), (97, 62, 137), (83, 54, 128), (73, 49, 120), + (63, 44, 113), (60, 42, 111), (58, 41, 109), (55, 38, 106), + (52, 35, 104), (51, 34, 104), (50, 33, 104), (50, 32, 104), + (51, 33, 105), (52, 35, 106), (53, 35, 107), (54, 36, 109), + (63, 42, 121), (68, 47, 127), (74, 53, 133), (79, 57, 139), + (84, 62, 145), (86, 63, 149), (88, 64, 153), (94, 66, 161), + (101, 68, 168), (108, 74, 178), (109, 74, 177), (110, 75, 176), + (108, 73, 174), (107, 72, 172), (105, 68, 169), (103, 66, 165), + (105, 67, 167), (110, 72, 171), (116, 77, 176), (125, 87, 181), + (134, 98, 186), (138, 104, 189), (143, 110, 192), (155, 121, 202), + (170, 132, 212), (203, 155, 235), (214, 168, 242), (225, 181, 249), + (228, 184, 251), (232, 188, 253), (234, 191, 251), (234, 190, 248), + (226, 179, 237), (215, 172, 230), (205, 165, 224), (199, 160, 220), + (194, 156, 217), (184, 147, 213), (180, 138, 209), (177, 133, 210), + (174, 131, 209), (177, 134, 214), (179, 134, 216), (181, 134, 219), + (183, 135, 223), (185, 136, 227), (190, 137, 233), (193, 139, 239), + (193, 138, 243), (188, 133, 240), (184, 128, 237), (181, 124, 235), + (178, 120, 234), (172, 114, 231), (169, 113, 228), (165, 112, 226), + (165, 113, 224), (165, 115, 226), (167, 116, 226), (169, 117, 227), + (177, 122, 228), (186, 131, 230), (197, 139, 231), (204, 144, 230), + (201, 143, 222), (191, 136, 214), (181, 129, 206), (178, 126, 201), + (176, 124, 197), (173, 118, 191), (168, 112, 185), (164, 109, 181), + (158, 104, 175), (141, 99, 168), (139, 96, 168), (137, 94, 169), + (136, 91, 171), (140, 90, 176), (146, 92, 181), (153, 96, 183), + (165, 107, 186), (169, 107, 187), (173, 108, 188), (175, 108, 190), + (177, 109, 193), (180, 112, 196), (180, 112, 197), (183, 116, 201), + (184, 119, 205), (197, 123, 210), (202, 126, 212), (207, 130, 215), + (210, 130, 219), (209, 130, 221), (203, 129, 221), (194, 126, 215), + (179, 111, 199), (174, 108, 194), (170, 105, 189), (161, 97, 180), + (147, 90, 169), (132, 84, 159), (114, 74, 149), (100, 64, 139), + (87, 57, 131), (69, 45, 121), (67, 44, 119), (65, 43, 117), + (62, 43, 116), (61, 43, 116), (62, 43, 116), (62, 43, 117), + (67, 46, 123), (68, 47, 124), (70, 49, 126), (73, 51, 130), + (75, 53, 133), (75, 52, 134), (75, 51, 135), (75, 50, 136), + (78, 53, 137), (85, 57, 137), (97, 66, 141), (111, 73, 146), + (127, 83, 153), (142, 91, 159), (154, 101, 167), (167, 108, 171), + (193, 131, 186), (199, 135, 191), (206, 139, 197), (219, 150, 207), + (229, 160, 219), (236, 168, 227), (239, 177, 234), (241, 187, 238), + (240, 192, 243), (239, 196, 246), (239, 194, 246), (238, 193, 244), + (233, 191, 241), (228, 190, 235), (221, 190, 232), (212, 189, 228), + (203, 180, 222), (194, 167, 213), (180, 152, 204), (164, 133, 192), + (146, 118, 180), (131, 109, 172), (119, 100, 165), (110, 92, 160), + (106, 87, 159), (104, 78, 159), (102, 72, 160), (104, 70, 164), + (109, 71, 170), (116, 74, 177), (125, 83, 186), (137, 90, 197), + (147, 98, 206), (160, 108, 217), (172, 118, 224), (184, 125, 231), + (194, 136, 236), (205, 142, 242), (213, 147, 244), (221, 154, 248), + (229, 162, 249), (234, 166, 248), (238, 170, 246), (239, 170, 243), + (238, 165, 238), (233, 160, 233), (227, 156, 228), (219, 150, 225), + (210, 149, 221), (203, 148, 217), (198, 146, 215), (192, 142, 214), + (186, 139, 213), (178, 132, 213), (166, 127, 209), (156, 124, 204), + (149, 120, 198), (143, 116, 194), (141, 114, 192), (142, 111, 194), + (143, 107, 196), (143, 107, 196), (146, 107, 193), (147, 106, 188), + (150, 105, 181), (152, 109, 182), (158, 111, 185), (171, 121, 196), + (185, 133, 206), (197, 143, 216), (210, 150, 221), (216, 161, 228) + ), + +// 545 Egg_Hunt +((119, 124, 148), (130, 119, 106), (148, 117, 90), (167, 116, 75), + (173, 123, 73), (180, 130, 71), (177, 135, 70), (175, 141, 70), + (159, 152, 77), (157, 153, 75), (155, 155, 74), (146, 160, 67), + (138, 165, 61), (128, 174, 64), (118, 183, 67), (119, 183, 62), + (121, 183, 58), (162, 187, 23), (179, 191, 18), (196, 196, 14), + (204, 192, 14), (212, 188, 15), (214, 182, 14), (216, 176, 13), + (225, 153, 22), (228, 146, 33), (232, 139, 45), (231, 133, 53), + (230, 128, 62), (229, 127, 63), (229, 127, 64), (229, 131, 69), + (230, 138, 64), (231, 145, 55), (229, 154, 47), (227, 164, 39), + (218, 173, 38), (209, 182, 38), (200, 178, 43), (192, 175, 48), + (164, 174, 75), (144, 181, 98), (125, 188, 122), (106, 187, 136), + (88, 186, 150), (86, 183, 147), (85, 180, 144), (80, 178, 130), + (73, 180, 131), (68, 187, 125), (86, 185, 104), (105, 183, 84), + (116, 177, 76), (127, 172, 68), (130, 169, 72), (133, 166, 77), + (160, 143, 94), (166, 127, 84), (172, 112, 75), (166, 111, 68), + (160, 111, 62), (161, 116, 61), (162, 121, 60), (166, 117, 55), + (165, 124, 40), (161, 151, 16), (170, 167, 14), (180, 184, 12), + (185, 188, 11), (191, 193, 11), (201, 196, 13), (208, 199, 21), + (230, 201, 44), (233, 198, 58), (237, 196, 73), (226, 189, 90), + (215, 183, 108), (205, 179, 110), (195, 176, 113), (177, 168, 111), + (154, 159, 113), (110, 153, 132), (98, 150, 121), (87, 147, 111), + (83, 142, 99), (79, 138, 88), (73, 135, 72), (77, 137, 68), + (121, 149, 61), (143, 143, 47), (165, 137, 34), (169, 129, 29), + (173, 121, 25), (170, 108, 25), (170, 92, 30), (167, 83, 45), + (162, 79, 58), (138, 66, 66), (119, 62, 64), (100, 59, 63), + (92, 64, 67), (85, 69, 72), (83, 75, 72), (86, 90, 67), + (117, 124, 33), (134, 139, 31), (151, 154, 29), (156, 156, 32), + (161, 159, 35), (175, 165, 47), (195, 169, 65), (213, 175, 84), + (232, 181, 104), (248, 179, 127), (248, 177, 131), (249, 175, 135), + (252, 172, 138), (253, 172, 141), (249, 169, 143), (247, 170, 143), + (243, 163, 142), (240, 154, 143), (238, 145, 144), (238, 138, 150), + (239, 132, 157), (238, 120, 177), (239, 107, 192), (235, 97, 199), + (232, 95, 205), (217, 100, 212), (211, 101, 211), (206, 102, 211), + (187, 99, 194), (164, 94, 176), (136, 89, 153), (112, 93, 129), + (76, 110, 87), (66, 109, 68), (57, 109, 49), (56, 106, 41), + (56, 103, 33), (64, 107, 25), (82, 124, 26), (101, 143, 34), + (122, 168, 55), (146, 188, 98), (147, 188, 106), (149, 189, 115), + (137, 186, 124), (123, 186, 132), (108, 180, 126), (98, 173, 126), + (83, 145, 102), (79, 142, 95), (75, 140, 88), (69, 133, 60), + (71, 134, 45), (92, 131, 31), (119, 133, 22), (148, 143, 22), + (171, 149, 17), (199, 164, 21), (206, 167, 24), (214, 171, 27), + (226, 179, 38), (233, 184, 48), (234, 184, 52), (232, 183, 54), + (239, 183, 56), (240, 184, 61), (241, 185, 66), (238, 186, 74), + (234, 186, 88), (236, 188, 98), (241, 186, 110), (247, 185, 123), + (248, 184, 133), (245, 181, 150), (244, 182, 164), (241, 185, 178), + (237, 187, 190), (224, 186, 193), (208, 180, 199), (195, 168, 197), + (153, 154, 192), (142, 153, 188), (131, 153, 185), (111, 150, 183), + (113, 142, 174), (111, 131, 179), (118, 125, 178), (129, 124, 186), + (135, 130, 196), (159, 142, 197), (181, 154, 207), (205, 166, 208), + (228, 170, 214), (240, 173, 218), (251, 170, 209), (254, 174, 196), + (254, 182, 171), (254, 185, 145), (239, 180, 138), (226, 166, 125), + (220, 160, 110), (219, 160, 89), (233, 169, 53), (230, 173, 42), + (224, 173, 37), (219, 176, 40), (219, 180, 43), (233, 189, 30), + (244, 195, 23), (248, 197, 17), (242, 196, 21), (233, 195, 29), + (227, 191, 45), (228, 177, 65), (231, 158, 78), (229, 143, 92), + (211, 137, 98), (189, 138, 106), (177, 139, 118), (181, 131, 124), + (197, 118, 128), (198, 116, 123), (187, 124, 115), (170, 139, 111), + (158, 153, 108), (160, 157, 103), (166, 160, 95), (173, 167, 92), + (177, 172, 103), (175, 177, 115), (170, 178, 121), (165, 165, 113), + (152, 150, 94), (140, 134, 81), (131, 129, 81), (120, 131, 79), + (111, 134, 71), (95, 129, 57), (79, 117, 38), (71, 113, 34), + (77, 112, 37), (95, 122, 43), (111, 129, 62), (122, 135, 82), + (126, 146, 108), (134, 147, 131), (145, 139, 147), (150, 129, 156), + (154, 117, 158), (150, 116, 162), (141, 121, 159), (130, 121, 157) + ), + +// 546 Elements +((191, 131, 50), (184, 126, 50), (178, 119, 45), (172, 113, 40), + (170, 111, 37), (168, 109, 35), (167, 108, 35), (167, 107, 35), + (169, 108, 39), (163, 115, 50), (158, 122, 62), (144, 131, 78), + (131, 140, 94), (122, 136, 95), (113, 133, 97), (102, 128, 95), + (91, 124, 94), (49, 100, 86), (36, 86, 75), (23, 72, 64), + (16, 58, 52), (9, 44, 41), (7, 42, 38), (5, 40, 35), + (8, 46, 36), (6, 53, 44), (5, 61, 52), (4, 74, 60), + (4, 87, 69), (5, 90, 73), (6, 94, 77), (9, 98, 83), + (10, 100, 88), (15, 120, 104), (24, 132, 117), (34, 145, 131), + (53, 152, 136), (72, 160, 141), (84, 162, 138), (96, 165, 135), + (138, 173, 124), (139, 186, 142), (141, 199, 161), (145, 201, 162), + (149, 204, 163), (153, 199, 155), (158, 195, 147), (135, 190, 153), + (115, 180, 153), (104, 166, 142), (112, 158, 124), (120, 150, 106), + (121, 131, 83), (122, 113, 61), (126, 104, 49), (130, 96, 37), + (145, 82, 9), (140, 77, 6), (135, 72, 4), (127, 66, 3), + (119, 61, 2), (115, 57, 1), (111, 53, 1), (102, 45, 0), + (94, 39, 0), (85, 33, 0), (84, 32, 0), (83, 31, 0), + (82, 31, 0), (82, 31, 0), (81, 32, 0), (83, 34, 0), + (90, 42, 0), (95, 45, 0), (101, 48, 0), (106, 52, 0), + (111, 56, 1), (113, 57, 1), (115, 58, 1), (117, 59, 0), + (118, 58, 0), (114, 54, 1), (103, 51, 1), (93, 49, 1), + (86, 48, 3), (79, 48, 5), (65, 47, 12), (54, 43, 15), + (47, 32, 13), (49, 34, 14), (51, 37, 15), (52, 39, 15), + (54, 42, 16), (64, 45, 17), (77, 45, 13), (89, 43, 6), + (99, 43, 3), (102, 44, 0), (99, 42, 0), (96, 40, 1), + (92, 37, 1), (88, 35, 1), (81, 29, 1), (72, 22, 1), + (61, 13, 1), (60, 11, 1), (59, 10, 1), (59, 11, 1), + (60, 12, 1), (64, 15, 0), (69, 19, 0), (76, 25, 1), + (84, 30, 2), (100, 43, 7), (103, 46, 7), (107, 49, 8), + (113, 55, 7), (117, 59, 6), (120, 61, 6), (124, 65, 9), + (134, 74, 15), (141, 81, 18), (148, 88, 22), (152, 92, 26), + (157, 97, 30), (167, 106, 40), (178, 117, 50), (186, 125, 57), + (190, 128, 58), (188, 123, 52), (186, 121, 51), (185, 120, 50), + (180, 116, 47), (174, 109, 40), (164, 100, 29), (155, 91, 19), + (143, 82, 13), (143, 81, 15), (143, 81, 17), (144, 81, 18), + (145, 82, 19), (145, 84, 19), (146, 87, 20), (151, 90, 23), + (157, 94, 26), (165, 99, 30), (166, 101, 31), (168, 103, 32), + (171, 107, 35), (180, 112, 36), (187, 119, 40), (193, 124, 44), + (199, 132, 55), (200, 133, 55), (201, 134, 56), (202, 135, 56), + (203, 134, 55), (201, 133, 56), (196, 129, 55), (188, 124, 51), + (177, 115, 47), (152, 90, 34), (145, 82, 31), (139, 75, 29), + (123, 62, 22), (106, 50, 18), (88, 39, 12), (70, 27, 7), + (45, 7, 1), (42, 4, 0), (39, 2, 0), (35, 2, 0), + (35, 3, 0), (36, 5, 0), (38, 7, 1), (41, 12, 4), + (40, 19, 13), (42, 32, 26), (42, 53, 42), (46, 75, 60), + (52, 97, 78), (53, 114, 99), (53, 125, 118), (60, 132, 123), + (85, 144, 114), (92, 143, 109), (100, 143, 105), (102, 136, 102), + (107, 119, 88), (114, 101, 66), (119, 85, 41), (126, 73, 20), + (124, 67, 11), (119, 64, 8), (115, 61, 6), (114, 57, 4), + (112, 55, 3), (109, 52, 1), (107, 50, 1), (104, 48, 1), + (101, 43, 2), (98, 38, 2), (93, 33, 1), (86, 27, 1), + (79, 23, 0), (72, 19, 0), (68, 16, 0), (66, 14, 0), + (63, 13, 0), (61, 12, 0), (58, 10, 0), (55, 9, 0), + (56, 9, 0), (56, 11, 0), (57, 15, 3), (53, 20, 6), + (46, 24, 9), (39, 31, 13), (34, 37, 17), (34, 46, 24), + (41, 55, 29), (46, 57, 29), (52, 60, 28), (59, 62, 23), + (61, 65, 23), (75, 67, 24), (90, 66, 20), (104, 64, 16), + (119, 62, 8), (124, 63, 4), (127, 66, 3), (129, 68, 4), + (128, 70, 5), (127, 70, 7), (124, 68, 7), (115, 72, 12), + (103, 79, 22), (87, 86, 32), (74, 90, 42), (69, 79, 40), + (66, 70, 37), (64, 63, 37), (59, 62, 35), (54, 65, 41), + (56, 60, 37), (64, 50, 30), (77, 42, 22), (92, 41, 13), + (106, 46, 13), (119, 58, 15), (132, 70, 19), (145, 83, 25), + (154, 94, 33), (164, 104, 38), (175, 115, 44), (183, 123, 48) + ), + +// 547 Embers +((180, 74, 13), (214, 89, 4), (209, 92, 3), (205, 95, 2), + (187, 87, 2), (169, 80, 2), (157, 73, 1), (145, 67, 1), + (112, 46, 0), (109, 41, 1), (106, 36, 2), (103, 36, 5), + (101, 37, 9), (100, 41, 16), (99, 46, 24), (101, 51, 32), + (103, 56, 40), (102, 84, 67), (105, 96, 79), (109, 108, 91), + (116, 116, 98), (124, 124, 105), (120, 122, 102), (116, 120, 99), + (94, 100, 73), (85, 88, 64), (76, 76, 56), (74, 62, 44), + (72, 48, 33), (78, 44, 29), (84, 40, 26), (94, 37, 22), + (101, 37, 17), (115, 32, 19), (110, 35, 19), (106, 38, 20), + (97, 39, 28), (88, 41, 37), (80, 40, 40), (73, 39, 44), + (60, 43, 57), (57, 41, 59), (55, 40, 62), (55, 41, 61), + (56, 42, 61), (60, 45, 62), (64, 48, 64), (67, 53, 67), + (70, 58, 71), (72, 68, 73), (69, 67, 70), (66, 67, 68), + (61, 62, 59), (57, 58, 50), (53, 56, 45), (50, 55, 41), + (39, 35, 28), (35, 31, 24), (32, 28, 20), (30, 24, 21), + (28, 20, 22), (27, 19, 22), (26, 18, 23), (24, 16, 23), + (22, 16, 22), (25, 15, 19), (28, 15, 18), (31, 15, 18), + (31, 16, 19), (32, 17, 20), (35, 20, 21), (40, 21, 23), + (38, 25, 36), (37, 26, 37), (36, 27, 39), (34, 27, 41), + (33, 27, 43), (31, 26, 41), (30, 25, 40), (27, 23, 35), + (26, 20, 29), (22, 16, 23), (22, 16, 19), (22, 17, 16), + (25, 17, 14), (28, 18, 12), (36, 20, 11), (41, 21, 9), + (53, 27, 5), (57, 27, 5), (62, 28, 5), (62, 27, 6), + (63, 27, 8), (64, 29, 10), (59, 33, 13), (60, 39, 18), + (61, 47, 24), (64, 59, 26), (62, 63, 26), (60, 68, 26), + (60, 68, 25), (61, 68, 25), (64, 64, 22), (72, 58, 17), + (87, 47, 8), (105, 44, 7), (124, 41, 7), (131, 42, 5), + (139, 44, 3), (151, 44, 2), (159, 46, 0), (166, 48, 0), + (169, 51, 0), (161, 49, 1), (157, 47, 1), (153, 46, 1), + (149, 40, 0), (145, 36, 3), (143, 33, 7), (137, 31, 12), + (109, 25, 29), (99, 26, 34), (90, 27, 40), (81, 27, 40), + (73, 27, 41), (54, 25, 45), (38, 23, 44), (33, 21, 41), + (30, 20, 34), (29, 16, 23), (32, 16, 21), (35, 17, 20), + (54, 24, 15), (67, 33, 15), (81, 48, 29), (89, 65, 46), + (123, 96, 61), (126, 109, 77), (130, 122, 93), (130, 126, 101), + (131, 131, 110), (135, 123, 97), (139, 108, 85), (140, 91, 65), + (138, 79, 58), (154, 55, 27), (158, 48, 18), (162, 42, 10), + (165, 35, 7), (165, 35, 1), (162, 33, 2), (158, 31, 0), + (135, 26, 4), (126, 24, 6), (117, 23, 8), (100, 22, 11), + (86, 21, 22), (74, 23, 27), (68, 23, 30), (69, 27, 31), + (77, 33, 38), (92, 56, 59), (97, 64, 62), (102, 72, 66), + (115, 87, 72), (126, 94, 79), (130, 106, 92), (129, 116, 103), + (118, 114, 102), (112, 108, 98), (106, 102, 95), (95, 86, 89), + (81, 73, 76), (67, 59, 65), (53, 46, 52), (43, 34, 44), + (36, 28, 32), (34, 26, 23), (34, 26, 16), (36, 24, 12), + (39, 23, 8), (41, 24, 6), (41, 25, 6), (38, 23, 8), + (33, 14, 9), (31, 13, 11), (29, 13, 13), (25, 14, 18), + (25, 15, 25), (28, 16, 30), (35, 18, 31), (42, 21, 29), + (54, 23, 29), (65, 29, 29), (77, 30, 25), (82, 31, 19), + (84, 28, 16), (79, 28, 12), (76, 26, 10), (67, 24, 8), + (56, 20, 12), (43, 17, 14), (34, 15, 16), (28, 14, 16), + (26, 14, 14), (25, 13, 12), (24, 15, 10), (23, 16, 11), + (22, 14, 9), (24, 13, 10), (23, 14, 9), (20, 15, 11), + (16, 13, 13), (16, 12, 17), (17, 12, 18), (22, 13, 18), + (33, 17, 16), (45, 23, 12), (59, 32, 14), (74, 43, 15), + (90, 57, 18), (104, 74, 27), (113, 88, 44), (117, 93, 47), + (117, 95, 40), (116, 93, 38), (110, 89, 46), (99, 82, 46), + (88, 78, 36), (84, 77, 27), (92, 81, 36), (95, 87, 48), + (98, 96, 61), (98, 107, 68), (112, 113, 80), (132, 112, 82), + (154, 109, 77), (168, 110, 68), (181, 105, 61), (194, 96, 48), + (204, 82, 31), (208, 81, 23), (213, 76, 19), (209, 72, 19), + (201, 62, 12), (185, 61, 12), (174, 58, 10), (158, 54, 13), + (138, 50, 15), (118, 46, 17), (107, 48, 19), (108, 46, 20), + (110, 44, 22), (115, 41, 21), (128, 50, 20), (153, 62, 16) + ), + +// 548 Etomchek-040328-005 +((166, 201, 227), (169, 199, 225), (169, 198, 224), (170, 197, 223), + (167, 197, 224), (165, 197, 225), (164, 197, 225), (164, 197, 226), + (148, 187, 222), (148, 185, 220), (148, 183, 218), (147, 181, 217), + (147, 179, 217), (143, 176, 213), (139, 174, 210), (134, 170, 205), + (130, 167, 201), (107, 142, 173), (100, 132, 158), (93, 122, 144), + (86, 111, 130), (80, 101, 117), (76, 95, 111), (73, 90, 106), + (56, 75, 92), (49, 69, 87), (43, 63, 83), (45, 63, 81), + (47, 64, 80), (50, 66, 82), (54, 68, 84), (61, 76, 92), + (70, 87, 102), (86, 111, 131), (92, 122, 147), (98, 133, 164), + (109, 148, 178), (120, 163, 193), (128, 171, 200), (136, 179, 208), + (167, 205, 228), (177, 213, 232), (188, 221, 237), (190, 224, 241), + (193, 227, 245), (193, 227, 244), (193, 228, 243), (193, 226, 240), + (191, 221, 235), (181, 208, 221), (173, 195, 206), (166, 182, 192), + (153, 167, 176), (141, 152, 161), (134, 144, 153), (127, 137, 145), + (96, 106, 113), (80, 91, 101), (64, 76, 89), (50, 64, 81), + (36, 53, 74), (31, 49, 71), (26, 45, 69), (20, 41, 68), + (18, 40, 69), (21, 46, 78), (22, 50, 85), (24, 55, 93), + (25, 57, 98), (27, 60, 103), (27, 61, 105), (27, 61, 105), + (28, 61, 103), (26, 58, 98), (25, 55, 94), (27, 58, 96), + (29, 61, 99), (31, 63, 101), (33, 65, 104), (39, 70, 107), + (46, 75, 111), (70, 93, 120), (82, 100, 123), (94, 108, 126), + (100, 115, 132), (107, 122, 138), (120, 136, 155), (129, 148, 168), + (139, 165, 194), (143, 171, 201), (147, 177, 209), (147, 177, 210), + (147, 177, 211), (146, 176, 211), (143, 174, 210), (138, 169, 205), + (128, 160, 195), (97, 127, 163), (80, 110, 145), (64, 93, 127), + (57, 85, 118), (51, 78, 110), (40, 65, 96), (33, 56, 86), + (24, 50, 82), (24, 50, 82), (25, 50, 82), (27, 51, 83), + (29, 53, 84), (33, 59, 90), (38, 66, 96), (45, 75, 101), + (52, 88, 113), (64, 114, 146), (66, 119, 153), (69, 125, 161), + (75, 135, 175), (80, 144, 189), (83, 148, 201), (86, 152, 206), + (88, 156, 205), (85, 154, 204), (83, 153, 203), (82, 152, 202), + (81, 151, 201), (79, 149, 202), (75, 145, 204), (70, 137, 202), + (68, 131, 199), (66, 124, 193), (66, 123, 191), (66, 122, 190), + (71, 124, 190), (77, 128, 192), (87, 137, 198), (96, 144, 204), + (111, 157, 213), (114, 158, 213), (118, 160, 214), (118, 160, 212), + (118, 160, 211), (118, 158, 209), (119, 159, 209), (120, 161, 212), + (123, 164, 216), (124, 170, 220), (123, 170, 219), (122, 170, 219), + (120, 170, 218), (118, 169, 217), (117, 170, 216), (117, 173, 217), + (128, 182, 225), (130, 184, 226), (132, 186, 228), (133, 186, 228), + (130, 184, 225), (127, 178, 220), (122, 172, 213), (116, 166, 205), + (115, 162, 200), (116, 156, 193), (115, 154, 190), (115, 152, 188), + (109, 145, 182), (101, 135, 175), (88, 121, 163), (71, 102, 145), + (42, 71, 113), (37, 66, 106), (33, 61, 99), (28, 53, 87), + (25, 46, 76), (24, 43, 71), (22, 40, 64), (19, 34, 54), + (15, 27, 44), (12, 24, 41), (11, 23, 42), (10, 22, 42), + (10, 22, 42), (9, 22, 41), (9, 22, 41), (9, 22, 41), + (8, 17, 32), (10, 19, 35), (12, 22, 39), (18, 30, 51), + (28, 46, 70), (37, 61, 89), (49, 76, 107), (63, 94, 124), + (78, 108, 134), (89, 116, 135), (103, 125, 140), (117, 134, 146), + (133, 149, 158), (148, 165, 173), (163, 180, 191), (178, 198, 209), + (192, 215, 226), (199, 226, 236), (205, 232, 244), (208, 236, 248), + (210, 237, 249), (206, 233, 248), (199, 227, 247), (191, 221, 247), + (182, 216, 244), (170, 208, 240), (157, 198, 238), (144, 190, 235), + (133, 183, 231), (121, 174, 227), (110, 165, 222), (100, 156, 218), + (92, 149, 213), (86, 143, 207), (79, 135, 201), (72, 128, 197), + (68, 125, 194), (65, 122, 194), (63, 123, 195), (62, 123, 197), + (63, 124, 199), (67, 127, 200), (70, 129, 199), (74, 130, 195), + (78, 130, 189), (80, 127, 184), (81, 129, 182), (82, 129, 183), + (81, 129, 184), (82, 130, 185), (83, 132, 187), (86, 135, 189), + (90, 137, 188), (93, 135, 183), (96, 134, 177), (99, 135, 174), + (100, 134, 173), (102, 134, 173), (102, 136, 177), (104, 141, 182), + (107, 148, 189), (112, 153, 195), (117, 157, 197), (121, 161, 200), + (126, 164, 201), (138, 172, 206), (147, 179, 210), (157, 187, 215), + (161, 194, 221), (165, 200, 226), (170, 204, 228), (172, 206, 230) + ), + +// 549 Etomchek-040328-006 +((181, 166, 227), (185, 169, 225), (185, 169, 224), (186, 170, 223), + (184, 167, 224), (182, 165, 225), (182, 164, 225), (182, 164, 226), + (169, 148, 222), (169, 148, 220), (170, 148, 218), (171, 147, 217), + (173, 147, 217), (167, 143, 213), (162, 139, 210), (156, 134, 205), + (151, 130, 201), (126, 107, 173), (116, 100, 158), (106, 93, 144), + (97, 86, 130), (89, 80, 117), (86, 76, 111), (83, 73, 106), + (66, 56, 92), (60, 49, 87), (55, 43, 83), (56, 45, 81), + (57, 47, 80), (60, 50, 82), (64, 54, 84), (71, 61, 92), + (79, 70, 102), (98, 86, 131), (107, 92, 147), (117, 98, 164), + (127, 109, 178), (137, 120, 193), (144, 128, 200), (152, 136, 208), + (179, 167, 228), (187, 177, 232), (196, 188, 237), (199, 190, 241), + (202, 193, 245), (200, 193, 244), (199, 193, 243), (199, 193, 240), + (197, 191, 235), (187, 181, 221), (179, 173, 206), (171, 166, 192), + (158, 153, 176), (146, 141, 161), (139, 134, 153), (132, 127, 145), + (100, 96, 113), (86, 80, 101), (72, 64, 89), (61, 50, 81), + (50, 36, 74), (45, 31, 71), (41, 26, 69), (38, 20, 68), + (37, 18, 69), (43, 21, 78), (46, 22, 85), (49, 24, 93), + (52, 25, 98), (56, 27, 103), (57, 27, 105), (57, 27, 105), + (56, 28, 103), (53, 26, 98), (51, 25, 94), (52, 27, 96), + (54, 29, 99), (56, 31, 101), (59, 33, 104), (64, 39, 107), + (70, 46, 111), (87, 70, 120), (96, 82, 123), (106, 94, 126), + (111, 100, 132), (117, 107, 138), (133, 120, 155), (142, 129, 168), + (158, 139, 194), (163, 143, 201), (168, 147, 209), (169, 147, 210), + (170, 147, 211), (169, 146, 211), (167, 143, 210), (162, 138, 205), + (150, 128, 195), (121, 97, 163), (103, 80, 145), (86, 64, 127), + (79, 57, 118), (72, 51, 110), (60, 40, 96), (53, 33, 86), + (45, 24, 82), (46, 24, 82), (47, 25, 82), (48, 27, 83), + (50, 29, 84), (54, 33, 90), (57, 38, 96), (61, 45, 101), + (66, 52, 113), (80, 64, 146), (83, 66, 153), (87, 69, 161), + (97, 75, 175), (105, 80, 189), (114, 83, 201), (118, 86, 206), + (115, 88, 205), (113, 85, 204), (111, 83, 203), (110, 82, 202), + (109, 81, 201), (110, 79, 202), (109, 75, 204), (112, 70, 202), + (112, 68, 199), (113, 66, 193), (112, 66, 191), (111, 66, 190), + (115, 71, 190), (119, 77, 192), (128, 87, 198), (136, 96, 204), + (148, 111, 213), (151, 114, 213), (155, 118, 214), (153, 118, 212), + (152, 118, 211), (153, 118, 209), (152, 119, 209), (154, 120, 212), + (159, 123, 216), (156, 124, 220), (154, 123, 219), (153, 122, 219), + (149, 120, 218), (148, 118, 217), (145, 117, 216), (142, 117, 217), + (154, 128, 225), (155, 130, 226), (156, 132, 228), (158, 133, 228), + (154, 130, 225), (152, 127, 220), (146, 122, 213), (138, 116, 205), + (138, 115, 200), (139, 116, 193), (138, 115, 190), (138, 115, 188), + (132, 109, 182), (127, 101, 175), (117, 88, 163), (100, 71, 145), + (70, 42, 113), (64, 37, 106), (59, 33, 99), (51, 28, 87), + (45, 25, 76), (43, 24, 71), (38, 22, 64), (32, 19, 54), + (26, 15, 44), (23, 12, 41), (24, 11, 42), (23, 10, 42), + (23, 10, 42), (22, 9, 41), (22, 9, 41), (22, 9, 41), + (18, 8, 32), (21, 10, 35), (24, 12, 39), (32, 18, 51), + (44, 28, 70), (55, 37, 89), (69, 49, 107), (82, 63, 124), + (94, 78, 134), (100, 89, 135), (111, 103, 140), (124, 117, 146), + (138, 133, 158), (151, 148, 173), (169, 163, 191), (183, 178, 209), + (197, 192, 226), (202, 199, 236), (210, 205, 244), (213, 208, 248), + (215, 210, 249), (213, 206, 248), (211, 199, 247), (207, 191, 247), + (199, 182, 244), (189, 170, 240), (183, 157, 238), (173, 144, 235), + (163, 133, 231), (155, 121, 227), (147, 110, 222), (141, 100, 218), + (134, 92, 213), (128, 86, 207), (122, 79, 201), (118, 72, 197), + (114, 68, 194), (112, 65, 194), (111, 63, 195), (111, 62, 197), + (113, 63, 199), (116, 67, 200), (117, 70, 199), (116, 74, 195), + (117, 78, 189), (118, 80, 184), (115, 81, 182), (117, 82, 183), + (117, 81, 184), (118, 82, 185), (119, 83, 187), (120, 86, 189), + (123, 90, 188), (124, 93, 183), (124, 96, 177), (124, 99, 174), + (126, 100, 173), (128, 102, 173), (130, 102, 177), (131, 104, 182), + (133, 107, 189), (138, 112, 195), (142, 117, 197), (146, 121, 200), + (150, 126, 201), (160, 138, 206), (167, 147, 210), (175, 157, 215), + (177, 161, 221), (180, 165, 226), (184, 170, 228), (186, 172, 230) + ), + +// 550 Etomchek-040328-007 +((219, 166, 227), (220, 169, 225), (219, 169, 224), (219, 170, 223), + (219, 167, 224), (219, 165, 225), (219, 164, 225), (220, 164, 226), + (215, 148, 222), (214, 148, 220), (214, 148, 218), (215, 147, 217), + (216, 147, 217), (211, 143, 213), (206, 139, 210), (200, 134, 205), + (195, 130, 201), (167, 107, 173), (152, 100, 158), (137, 93, 144), + (124, 86, 130), (112, 80, 117), (107, 76, 111), (103, 73, 106), + (88, 56, 92), (84, 49, 87), (80, 43, 83), (78, 45, 81), + (77, 47, 80), (80, 50, 82), (83, 54, 84), (90, 61, 92), + (99, 70, 102), (126, 86, 131), (142, 92, 147), (158, 98, 164), + (170, 109, 178), (182, 120, 193), (189, 128, 200), (196, 136, 208), + (217, 167, 228), (221, 177, 232), (226, 188, 237), (230, 190, 241), + (234, 193, 245), (232, 193, 244), (230, 193, 243), (228, 193, 240), + (224, 191, 235), (212, 181, 221), (199, 173, 206), (187, 166, 192), + (173, 153, 176), (159, 141, 161), (151, 134, 153), (143, 127, 145), + (110, 96, 113), (99, 80, 101), (88, 64, 89), (80, 50, 81), + (73, 36, 74), (70, 31, 71), (68, 26, 69), (68, 20, 68), + (69, 18, 69), (78, 21, 78), (85, 22, 85), (92, 24, 93), + (97, 25, 98), (103, 27, 103), (105, 27, 105), (105, 27, 105), + (103, 28, 103), (98, 26, 98), (94, 25, 94), (96, 27, 96), + (98, 29, 99), (100, 31, 101), (103, 33, 104), (106, 39, 107), + (110, 46, 111), (118, 70, 120), (122, 82, 123), (126, 94, 126), + (131, 100, 132), (136, 107, 138), (155, 120, 155), (166, 129, 168), + (192, 139, 194), (199, 143, 201), (206, 147, 209), (207, 147, 210), + (209, 147, 211), (209, 146, 211), (208, 143, 210), (203, 138, 205), + (192, 128, 195), (162, 97, 163), (143, 80, 145), (125, 64, 127), + (117, 57, 118), (109, 51, 110), (95, 40, 96), (86, 33, 86), + (81, 24, 82), (81, 24, 82), (82, 25, 82), (83, 27, 83), + (84, 29, 84), (89, 33, 90), (93, 38, 96), (95, 45, 101), + (104, 52, 113), (131, 64, 146), (137, 66, 153), (144, 69, 161), + (158, 75, 175), (173, 80, 189), (187, 83, 201), (192, 86, 206), + (188, 88, 205), (186, 85, 204), (185, 83, 203), (184, 82, 202), + (183, 81, 201), (186, 79, 202), (189, 75, 204), (193, 70, 202), + (193, 68, 199), (191, 66, 193), (189, 66, 191), (188, 66, 190), + (188, 71, 190), (190, 77, 192), (196, 87, 198), (202, 96, 204), + (212, 111, 213), (213, 114, 213), (214, 118, 214), (212, 118, 212), + (210, 118, 211), (209, 118, 209), (208, 119, 209), (211, 120, 212), + (216, 123, 216), (216, 124, 220), (214, 123, 219), (213, 122, 219), + (210, 120, 218), (209, 118, 217), (206, 117, 216), (204, 117, 217), + (214, 128, 225), (215, 130, 226), (216, 132, 228), (217, 133, 228), + (213, 130, 225), (209, 127, 220), (203, 122, 213), (193, 116, 205), + (190, 115, 200), (187, 116, 193), (185, 115, 190), (183, 115, 188), + (177, 109, 182), (173, 101, 175), (163, 88, 163), (145, 71, 144), + (113, 42, 112), (106, 37, 105), (99, 33, 98), (87, 28, 86), + (76, 25, 75), (71, 24, 69), (64, 22, 64), (54, 19, 54), + (44, 15, 43), (41, 12, 40), (42, 11, 40), (42, 10, 40), + (42, 10, 40), (41, 9, 40), (41, 9, 40), (41, 9, 40), + (32, 8, 30), (35, 10, 33), (39, 12, 37), (51, 18, 48), + (70, 28, 70), (87, 37, 89), (105, 49, 107), (120, 63, 124), + (128, 78, 134), (128, 89, 135), (134, 103, 140), (142, 117, 146), + (153, 133, 158), (167, 148, 173), (187, 163, 191), (203, 178, 209), + (218, 192, 226), (225, 199, 236), (234, 205, 244), (238, 208, 248), + (239, 210, 249), (239, 206, 248), (240, 199, 247), (242, 191, 247), + (237, 182, 244), (232, 170, 240), (233, 157, 238), (229, 144, 235), + (223, 133, 231), (220, 121, 227), (217, 110, 222), (214, 100, 218), + (209, 92, 213), (203, 86, 207), (197, 79, 201), (195, 72, 197), + (192, 68, 194), (192, 65, 194), (193, 63, 195), (195, 62, 197), + (197, 63, 199), (198, 67, 200), (197, 70, 199), (191, 74, 195), + (186, 78, 189), (182, 80, 184), (177, 81, 182), (180, 82, 183), + (181, 81, 184), (182, 82, 185), (184, 83, 187), (184, 86, 189), + (183, 90, 188), (180, 93, 183), (174, 96, 177), (170, 99, 174), + (171, 100, 173), (172, 102, 173), (176, 102, 177), (180, 104, 182), + (184, 107, 189), (190, 112, 195), (192, 117, 197), (195, 121, 200), + (196, 126, 201), (202, 138, 206), (206, 147, 210), (210, 157, 215), + (214, 161, 221), (218, 165, 226), (220, 170, 228), (222, 172, 230) + ), + +// 551 Etomchek-040328-008 +((227, 166, 191), (225, 169, 188), (224, 169, 188), (223, 170, 189), + (224, 167, 188), (225, 165, 187), (225, 164, 187), (226, 164, 187), + (222, 148, 175), (220, 148, 172), (218, 148, 170), (217, 147, 168), + (217, 147, 167), (213, 143, 164), (210, 139, 162), (205, 134, 158), + (201, 130, 155), (173, 107, 130), (158, 100, 121), (144, 93, 113), + (130, 86, 104), (117, 80, 95), (111, 76, 89), (106, 73, 84), + (92, 56, 70), (87, 49, 63), (83, 43, 56), (81, 45, 57), + (80, 47, 58), (82, 50, 60), (84, 54, 63), (92, 61, 71), + (102, 70, 82), (131, 86, 103), (147, 92, 112), (164, 98, 121), + (178, 109, 136), (193, 120, 151), (200, 128, 159), (208, 136, 167), + (228, 167, 195), (232, 177, 203), (237, 188, 211), (241, 190, 214), + (245, 193, 218), (244, 193, 219), (243, 193, 220), (240, 193, 217), + (235, 191, 214), (221, 181, 201), (206, 173, 189), (192, 166, 178), + (176, 153, 163), (161, 141, 148), (153, 134, 141), (145, 127, 134), + (113, 96, 104), (101, 80, 87), (89, 64, 71), (81, 50, 59), + (74, 36, 47), (71, 31, 42), (69, 26, 38), (68, 20, 32), + (69, 18, 31), (78, 21, 36), (85, 22, 39), (93, 24, 43), + (98, 25, 45), (103, 27, 47), (105, 27, 47), (105, 27, 47), + (103, 28, 48), (98, 26, 45), (94, 25, 43), (96, 27, 46), + (99, 29, 49), (101, 31, 51), (104, 33, 53), (107, 39, 58), + (111, 46, 64), (120, 70, 85), (123, 82, 93), (126, 94, 102), + (132, 100, 109), (138, 107, 117), (155, 120, 129), (168, 129, 141), + (194, 139, 156), (201, 143, 161), (209, 147, 167), (210, 147, 166), + (211, 147, 166), (211, 146, 166), (210, 143, 163), (205, 138, 158), + (195, 128, 149), (163, 97, 116), (145, 80, 99), (127, 64, 83), + (118, 57, 75), (110, 51, 67), (96, 40, 56), (86, 33, 47), + (82, 24, 40), (82, 24, 40), (82, 25, 40), (83, 27, 41), + (84, 29, 43), (90, 33, 49), (96, 38, 56), (101, 45, 65), + (113, 52, 77), (146, 64, 101), (153, 66, 105), (161, 69, 110), + (175, 75, 118), (189, 80, 125), (201, 83, 128), (206, 86, 132), + (205, 88, 137), (204, 85, 135), (203, 83, 133), (202, 82, 132), + (201, 81, 131), (202, 79, 128), (204, 75, 124), (202, 70, 114), + (199, 68, 109), (193, 66, 102), (191, 66, 101), (190, 66, 101), + (190, 71, 105), (192, 77, 110), (198, 87, 118), (204, 96, 127), + (213, 111, 140), (213, 114, 142), (214, 118, 144), (212, 118, 144), + (211, 118, 144), (209, 118, 142), (209, 119, 145), (212, 120, 146), + (216, 123, 148), (220, 124, 153), (219, 123, 153), (219, 122, 154), + (218, 120, 154), (217, 118, 153), (216, 117, 153), (217, 117, 157), + (225, 128, 165), (226, 130, 168), (228, 132, 171), (228, 133, 170), + (225, 130, 168), (220, 127, 163), (213, 122, 157), (205, 116, 152), + (200, 115, 148), (193, 116, 143), (190, 115, 141), (188, 115, 139), + (182, 109, 133), (175, 101, 123), (163, 88, 108), (145, 71, 89), + (113, 42, 59), (106, 37, 54), (99, 33, 49), (87, 28, 42), + (76, 25, 37), (71, 24, 33), (64, 22, 33), (54, 19, 28), + (44, 15, 21), (41, 12, 18), (42, 11, 17), (42, 10, 16), + (42, 10, 16), (41, 9, 16), (41, 9, 16), (41, 9, 16), + (32, 8, 12), (35, 10, 14), (39, 12, 17), (51, 18, 24), + (70, 28, 39), (89, 37, 52), (107, 49, 66), (124, 63, 83), + (134, 78, 98), (135, 89, 108), (140, 103, 119), (146, 117, 129), + (158, 133, 145), (173, 148, 161), (191, 163, 175), (209, 178, 193), + (226, 192, 209), (236, 199, 220), (244, 205, 225), (248, 208, 229), + (249, 210, 230), (248, 206, 227), (247, 199, 219), (247, 191, 210), + (244, 182, 206), (240, 170, 197), (238, 157, 184), (235, 144, 175), + (231, 133, 167), (227, 121, 156), (222, 110, 146), (218, 100, 135), + (213, 92, 128), (207, 86, 122), (201, 79, 116), (197, 72, 107), + (194, 68, 104), (194, 65, 101), (195, 63, 100), (197, 62, 100), + (199, 63, 101), (200, 67, 105), (199, 70, 106), (195, 74, 110), + (189, 78, 111), (184, 80, 109), (182, 81, 113), (183, 82, 112), + (184, 81, 112), (185, 82, 113), (187, 83, 114), (189, 86, 119), + (188, 90, 121), (183, 93, 120), (177, 96, 120), (174, 99, 123), + (173, 100, 122), (173, 102, 122), (177, 102, 123), (182, 104, 127), + (189, 107, 134), (195, 112, 140), (197, 117, 144), (200, 121, 147), + (201, 126, 151), (206, 138, 161), (210, 147, 168), (215, 157, 177), + (221, 161, 184), (226, 165, 190), (228, 170, 192), (230, 172, 194) + ), + +// 552 Etomchek-040328-009 +((227, 180, 166), (225, 186, 169), (224, 185, 169), (223, 185, 170), + (224, 183, 167), (225, 181, 165), (225, 181, 164), (226, 181, 164), + (222, 168, 148), (220, 169, 148), (218, 170, 148), (217, 171, 147), + (217, 172, 147), (213, 167, 143), (210, 162, 139), (205, 156, 134), + (201, 150, 130), (173, 126, 107), (158, 115, 100), (144, 105, 93), + (130, 96, 86), (117, 88, 80), (111, 85, 76), (106, 82, 73), + (92, 65, 56), (87, 60, 49), (83, 55, 43), (81, 55, 45), + (80, 56, 47), (82, 60, 50), (84, 64, 54), (92, 70, 61), + (102, 78, 70), (131, 97, 86), (147, 107, 92), (164, 117, 98), + (178, 126, 109), (193, 136, 120), (200, 143, 128), (208, 150, 136), + (228, 178, 167), (232, 187, 177), (237, 196, 188), (241, 198, 190), + (245, 201, 193), (244, 199, 193), (243, 198, 193), (240, 200, 193), + (235, 196, 191), (221, 187, 181), (206, 179, 173), (192, 171, 166), + (176, 158, 153), (161, 146, 141), (153, 139, 134), (145, 132, 127), + (113, 99, 96), (101, 85, 80), (89, 72, 64), (81, 60, 50), + (74, 48, 36), (71, 44, 31), (69, 41, 26), (68, 37, 20), + (69, 36, 18), (78, 42, 21), (85, 45, 22), (93, 48, 24), + (98, 51, 25), (103, 55, 27), (105, 55, 27), (105, 55, 27), + (103, 55, 28), (98, 52, 26), (94, 50, 25), (96, 51, 27), + (99, 53, 29), (101, 55, 31), (104, 58, 33), (107, 63, 39), + (111, 69, 46), (120, 87, 70), (123, 96, 82), (126, 106, 94), + (132, 111, 100), (138, 116, 107), (155, 133, 120), (168, 141, 129), + (194, 157, 139), (201, 162, 143), (209, 167, 147), (210, 167, 147), + (211, 168, 147), (211, 168, 146), (210, 165, 143), (205, 160, 138), + (195, 149, 128), (163, 120, 97), (145, 102, 80), (127, 85, 64), + (118, 78, 57), (110, 71, 51), (96, 59, 40), (86, 52, 33), + (82, 44, 24), (82, 45, 24), (82, 46, 25), (83, 47, 27), + (84, 49, 29), (90, 53, 33), (96, 56, 38), (101, 60, 45), + (113, 65, 52), (146, 79, 64), (153, 82, 66), (161, 86, 69), + (175, 95, 75), (189, 104, 80), (201, 112, 83), (206, 116, 86), + (205, 113, 88), (204, 111, 85), (203, 109, 83), (202, 108, 82), + (201, 107, 81), (202, 108, 79), (204, 107, 75), (202, 110, 70), + (199, 109, 68), (193, 110, 66), (191, 109, 66), (190, 109, 66), + (190, 113, 71), (192, 117, 77), (198, 126, 87), (204, 134, 96), + (213, 147, 111), (213, 150, 114), (214, 153, 118), (212, 152, 118), + (211, 151, 118), (209, 151, 118), (209, 151, 119), (212, 152, 120), + (216, 157, 123), (220, 156, 124), (219, 153, 123), (219, 151, 122), + (218, 148, 120), (217, 146, 118), (216, 143, 117), (217, 140, 117), + (225, 152, 128), (226, 153, 130), (228, 155, 132), (228, 157, 133), + (225, 152, 130), (220, 150, 127), (213, 145, 122), (205, 137, 116), + (200, 136, 115), (193, 138, 116), (190, 137, 115), (188, 137, 115), + (182, 131, 109), (175, 126, 101), (163, 115, 88), (145, 99, 71), + (113, 69, 42), (106, 63, 37), (99, 58, 33), (87, 50, 28), + (76, 44, 25), (71, 44, 24), (64, 37, 22), (54, 31, 19), + (44, 26, 15), (41, 23, 12), (42, 24, 11), (42, 23, 10), + (42, 23, 10), (41, 21, 9), (41, 21, 9), (41, 21, 9), + (32, 18, 8), (35, 20, 10), (39, 23, 12), (51, 32, 18), + (70, 43, 28), (89, 54, 37), (107, 68, 49), (124, 81, 63), + (134, 93, 78), (135, 99, 89), (140, 110, 103), (146, 124, 117), + (158, 137, 133), (173, 151, 148), (191, 169, 163), (209, 183, 178), + (226, 197, 192), (236, 202, 199), (244, 211, 205), (248, 213, 208), + (249, 216, 210), (248, 213, 206), (247, 210, 199), (247, 208, 191), + (244, 198, 182), (240, 188, 170), (238, 182, 157), (235, 171, 144), + (231, 161, 133), (227, 153, 121), (222, 146, 110), (218, 139, 100), + (213, 132, 92), (207, 126, 86), (201, 120, 79), (197, 116, 72), + (194, 112, 68), (194, 110, 65), (195, 109, 63), (197, 109, 62), + (199, 111, 63), (200, 113, 67), (199, 115, 70), (195, 114, 74), + (189, 115, 78), (184, 116, 80), (182, 113, 81), (183, 116, 82), + (184, 115, 81), (185, 116, 82), (187, 118, 83), (189, 119, 86), + (188, 121, 90), (183, 123, 93), (177, 123, 96), (174, 123, 99), + (173, 124, 100), (173, 127, 102), (177, 128, 102), (182, 130, 104), + (189, 132, 107), (195, 137, 112), (197, 141, 117), (200, 145, 121), + (201, 149, 126), (206, 159, 138), (210, 166, 147), (215, 174, 157), + (221, 176, 161), (226, 179, 165), (228, 185, 170), (230, 187, 172) + ), + +// 553 Etomchek-040328-010 +((205, 227, 166), (201, 225, 169), (201, 224, 169), (201, 223, 170), + (201, 224, 167), (201, 225, 165), (201, 225, 164), (201, 226, 164), + (193, 222, 148), (190, 220, 148), (187, 218, 148), (185, 217, 147), + (183, 217, 147), (180, 213, 143), (178, 210, 139), (175, 205, 134), + (172, 201, 130), (146, 173, 107), (135, 158, 100), (125, 144, 93), + (114, 130, 86), (103, 117, 80), (97, 111, 76), (92, 106, 73), + (78, 92, 56), (71, 87, 49), (65, 83, 43), (65, 81, 45), + (66, 80, 47), (68, 82, 50), (70, 84, 54), (78, 92, 61), + (89, 102, 70), (114, 131, 86), (125, 147, 92), (137, 164, 98), + (152, 178, 109), (168, 193, 120), (176, 200, 128), (184, 208, 136), + (209, 228, 167), (216, 232, 177), (223, 237, 188), (227, 241, 190), + (231, 245, 193), (231, 244, 193), (232, 243, 193), (228, 240, 193), + (224, 235, 191), (211, 221, 181), (197, 206, 173), (184, 192, 166), + (168, 176, 153), (153, 161, 141), (145, 153, 134), (138, 145, 127), + (108, 113, 96), (92, 101, 80), (77, 89, 64), (66, 81, 50), + (56, 74, 36), (52, 71, 31), (48, 69, 26), (44, 68, 20), + (43, 69, 18), (49, 78, 21), (54, 85, 22), (59, 93, 24), + (62, 98, 25), (65, 103, 27), (66, 105, 27), (66, 105, 27), + (65, 103, 28), (62, 98, 26), (59, 94, 25), (62, 96, 27), + (65, 99, 29), (67, 101, 31), (69, 104, 33), (74, 107, 39), + (79, 111, 46), (97, 120, 70), (103, 123, 82), (110, 126, 94), + (117, 132, 100), (125, 138, 107), (138, 155, 120), (151, 168, 129), + (168, 194, 139), (174, 201, 143), (181, 209, 147), (181, 210, 147), + (181, 211, 147), (181, 211, 146), (179, 210, 143), (174, 205, 138), + (165, 195, 128), (131, 163, 97), (114, 145, 80), (97, 127, 64), + (89, 118, 57), (81, 110, 51), (69, 96, 40), (59, 86, 33), + (54, 82, 24), (53, 82, 24), (53, 82, 25), (54, 83, 27), + (56, 84, 29), (62, 90, 33), (70, 96, 38), (78, 101, 45), + (92, 113, 52), (120, 146, 64), (126, 153, 66), (132, 161, 69), + (142, 175, 75), (151, 189, 80), (156, 201, 83), (160, 206, 86), + (164, 205, 88), (162, 204, 85), (161, 203, 83), (160, 202, 82), + (159, 201, 81), (157, 202, 79), (155, 204, 75), (145, 202, 70), + (140, 199, 68), (132, 193, 66), (131, 191, 66), (130, 190, 66), + (133, 190, 71), (136, 192, 77), (144, 198, 87), (152, 204, 96), + (164, 213, 111), (165, 213, 114), (166, 214, 118), (166, 212, 118), + (166, 211, 118), (164, 209, 118), (166, 209, 119), (168, 212, 120), + (170, 216, 123), (175, 220, 124), (176, 219, 123), (177, 219, 122), + (177, 218, 120), (176, 217, 118), (177, 216, 117), (181, 217, 117), + (188, 225, 128), (190, 226, 130), (193, 228, 132), (192, 228, 133), + (190, 225, 130), (185, 220, 127), (178, 213, 122), (173, 205, 116), + (168, 200, 115), (161, 193, 116), (158, 190, 115), (156, 188, 115), + (150, 182, 109), (141, 175, 101), (125, 163, 88), (107, 145, 71), + (76, 113, 42), (70, 106, 37), (65, 99, 33), (56, 87, 28), + (49, 76, 25), (44, 71, 24), (43, 64, 22), (36, 54, 19), + (28, 44, 15), (25, 41, 12), (24, 42, 11), (23, 42, 10), + (23, 42, 10), (24, 41, 9), (24, 41, 9), (24, 41, 9), + (18, 32, 8), (20, 35, 10), (23, 39, 12), (31, 51, 18), + (49, 70, 28), (64, 89, 37), (80, 107, 49), (97, 124, 63), + (112, 134, 78), (119, 135, 89), (128, 140, 103), (135, 146, 117), + (151, 158, 133), (166, 173, 148), (181, 191, 163), (200, 209, 178), + (217, 226, 192), (229, 236, 199), (234, 244, 205), (238, 248, 208), + (239, 249, 210), (237, 248, 206), (231, 247, 199), (223, 247, 191), + (221, 244, 182), (214, 240, 170), (203, 238, 157), (196, 235, 144), + (190, 231, 133), (181, 227, 121), (172, 222, 110), (163, 218, 100), + (157, 213, 92), (151, 207, 86), (144, 201, 79), (137, 197, 72), + (133, 194, 68), (132, 194, 65), (131, 195, 63), (132, 197, 62), + (133, 199, 63), (136, 200, 67), (137, 199, 70), (139, 195, 74), + (137, 189, 78), (134, 184, 80), (137, 182, 81), (136, 183, 82), + (136, 184, 81), (137, 185, 82), (139, 187, 83), (143, 189, 86), + (144, 188, 90), (141, 183, 93), (139, 177, 96), (140, 174, 99), + (139, 173, 100), (139, 173, 102), (141, 177, 102), (146, 182, 104), + (154, 189, 107), (159, 195, 112), (162, 197, 117), (166, 200, 121), + (169, 201, 126), (177, 206, 138), (183, 210, 147), (191, 215, 157), + (198, 221, 161), (204, 226, 165), (206, 228, 170), (208, 230, 172) + ), + +// 554 Etomchek-040328-011 +((166, 227, 182), (169, 225, 188), (169, 224, 187), (170, 223, 187), + (167, 224, 185), (165, 225, 183), (164, 225, 183), (164, 226, 183), + (148, 222, 170), (148, 220, 171), (148, 218, 173), (147, 217, 173), + (147, 217, 174), (143, 213, 169), (139, 210, 164), (134, 205, 158), + (130, 201, 153), (107, 173, 128), (100, 158, 117), (93, 144, 107), + (86, 130, 98), (80, 117, 90), (76, 111, 86), (73, 106, 83), + (56, 92, 66), (49, 87, 61), (43, 83, 56), (45, 81, 56), + (47, 80, 57), (50, 82, 61), (54, 84, 65), (61, 92, 71), + (70, 102, 79), (86, 131, 99), (92, 147, 109), (98, 164, 119), + (109, 178, 128), (120, 193, 138), (128, 200, 145), (136, 208, 153), + (167, 228, 180), (177, 232, 189), (188, 237, 198), (190, 241, 200), + (193, 245, 203), (193, 244, 201), (193, 243, 200), (193, 240, 201), + (191, 235, 198), (181, 221, 188), (173, 206, 179), (166, 192, 171), + (153, 176, 159), (141, 161, 147), (134, 153, 139), (127, 145, 132), + (96, 113, 100), (80, 101, 86), (64, 89, 73), (50, 81, 61), + (36, 74, 50), (31, 71, 46), (26, 69, 42), (20, 68, 39), + (18, 69, 38), (21, 78, 43), (22, 85, 46), (24, 93, 50), + (25, 98, 53), (27, 103, 57), (27, 105, 58), (27, 105, 58), + (28, 103, 58), (26, 98, 55), (25, 94, 52), (27, 96, 54), + (29, 99, 56), (31, 101, 58), (33, 104, 60), (39, 107, 65), + (46, 111, 71), (70, 120, 88), (82, 123, 97), (94, 126, 107), + (100, 132, 112), (107, 138, 117), (120, 155, 134), (129, 168, 143), + (139, 194, 159), (143, 201, 164), (147, 209, 169), (147, 210, 170), + (147, 211, 171), (146, 211, 170), (143, 210, 168), (138, 205, 163), + (128, 195, 152), (97, 163, 122), (80, 145, 104), (64, 127, 87), + (57, 118, 80), (51, 110, 73), (40, 96, 61), (33, 86, 54), + (24, 82, 46), (24, 82, 46), (25, 82, 47), (27, 83, 49), + (29, 84, 51), (33, 90, 55), (38, 96, 58), (45, 101, 62), + (52, 113, 67), (64, 146, 82), (66, 153, 85), (69, 161, 89), + (75, 175, 98), (80, 189, 107), (83, 201, 116), (86, 206, 120), + (88, 205, 117), (85, 204, 115), (83, 203, 113), (82, 202, 112), + (81, 201, 111), (79, 202, 112), (75, 204, 111), (70, 202, 114), + (68, 199, 114), (66, 193, 115), (66, 191, 114), (66, 190, 113), + (71, 190, 117), (77, 192, 121), (87, 198, 130), (96, 204, 137), + (111, 213, 150), (114, 213, 153), (118, 214, 157), (118, 212, 155), + (118, 211, 154), (118, 209, 155), (119, 209, 154), (120, 212, 155), + (123, 216, 160), (124, 220, 159), (123, 219, 156), (122, 219, 154), + (120, 218, 151), (118, 217, 149), (117, 216, 147), (117, 217, 144), + (128, 225, 156), (130, 226, 157), (132, 228, 158), (133, 228, 160), + (130, 225, 155), (127, 220, 153), (122, 213, 148), (116, 205, 140), + (115, 200, 139), (116, 193, 140), (115, 190, 139), (115, 188, 139), + (109, 182, 133), (101, 175, 128), (88, 163, 118), (71, 145, 102), + (42, 113, 71), (37, 106, 65), (33, 99, 60), (28, 87, 52), + (25, 76, 46), (24, 71, 46), (22, 64, 38), (19, 54, 33), + (15, 44, 27), (12, 41, 24), (11, 42, 25), (10, 42, 25), + (10, 42, 25), (9, 41, 22), (9, 41, 22), (9, 41, 22), + (8, 32, 19), (10, 35, 21), (12, 39, 24), (18, 51, 34), + (28, 70, 44), (37, 89, 56), (49, 107, 70), (63, 124, 83), + (78, 134, 95), (89, 135, 100), (103, 140, 112), (117, 146, 125), + (133, 158, 138), (148, 173, 152), (163, 191, 170), (178, 209, 184), + (192, 226, 198), (199, 236, 203), (205, 244, 212), (208, 248, 214), + (210, 249, 217), (206, 248, 214), (199, 247, 211), (191, 247, 210), + (182, 244, 200), (170, 240, 190), (157, 238, 184), (144, 235, 175), + (133, 231, 164), (121, 227, 156), (110, 222, 149), (100, 218, 143), + (92, 213, 136), (86, 207, 130), (79, 201, 124), (72, 197, 120), + (68, 194, 116), (65, 194, 114), (63, 195, 114), (62, 197, 114), + (63, 199, 115), (67, 200, 118), (70, 199, 119), (74, 195, 118), + (78, 189, 119), (80, 184, 120), (81, 182, 116), (82, 183, 119), + (81, 184, 119), (82, 185, 120), (83, 187, 121), (86, 189, 122), + (90, 188, 124), (93, 183, 126), (96, 177, 126), (99, 174, 125), + (100, 173, 127), (102, 173, 129), (102, 177, 131), (104, 182, 133), + (107, 189, 134), (112, 195, 140), (117, 197, 144), (121, 200, 147), + (126, 201, 151), (138, 206, 161), (147, 210, 168), (157, 215, 176), + (161, 221, 178), (165, 226, 181), (170, 228, 187), (172, 230, 189) + ), + +// 555 Evening_Sunshine +((24, 79, 66), (49, 87, 56), (53, 88, 53), (57, 90, 51), + (64, 97, 56), (72, 104, 62), (80, 108, 62), (89, 112, 63), + (113, 122, 57), (110, 117, 54), (108, 112, 52), (99, 105, 48), + (90, 98, 45), (84, 91, 39), (79, 85, 33), (75, 80, 29), + (71, 76, 25), (55, 53, 17), (50, 53, 19), (46, 53, 21), + (48, 58, 25), (51, 63, 29), (51, 63, 30), (52, 63, 32), + (58, 78, 53), (54, 91, 66), (51, 104, 80), (41, 102, 88), + (32, 100, 97), (27, 96, 99), (23, 93, 102), (16, 88, 106), + (13, 91, 108), (18, 99, 110), (30, 100, 105), (42, 102, 100), + (62, 106, 89), (82, 110, 78), (93, 115, 72), (105, 120, 66), + (153, 137, 50), (172, 144, 41), (192, 152, 32), (202, 149, 21), + (213, 147, 11), (216, 145, 10), (219, 144, 9), (221, 142, 11), + (224, 136, 12), (209, 112, 5), (192, 95, 4), (175, 79, 4), + (165, 67, 5), (156, 56, 6), (153, 57, 6), (150, 59, 7), + (134, 73, 8), (140, 85, 6), (146, 97, 5), (158, 117, 5), + (170, 138, 5), (175, 146, 7), (180, 155, 9), (196, 172, 8), + (206, 178, 8), (200, 178, 15), (183, 168, 26), (166, 159, 37), + (155, 154, 43), (144, 149, 49), (123, 140, 62), (100, 133, 74), + (61, 117, 93), (47, 110, 97), (33, 104, 102), (29, 102, 104), + (25, 100, 106), (24, 100, 105), (23, 100, 105), (18, 98, 102), + (14, 93, 99), (15, 93, 99), (15, 94, 101), (16, 95, 103), + (14, 92, 102), (12, 90, 101), (9, 86, 101), (10, 85, 102), + (18, 89, 95), (28, 89, 88), (39, 89, 81), (48, 90, 77), + (57, 91, 74), (76, 92, 66), (98, 98, 56), (115, 102, 47), + (136, 107, 39), (166, 124, 30), (178, 129, 24), (190, 134, 18), + (192, 133, 15), (195, 133, 12), (196, 133, 13), (188, 136, 16), + (165, 142, 21), (150, 135, 23), (135, 129, 26), (126, 123, 29), + (117, 118, 32), (95, 108, 35), (78, 100, 39), (62, 90, 38), + (42, 77, 37), (13, 48, 32), (9, 44, 30), (5, 40, 28), + (3, 31, 23), (1, 24, 19), (0, 18, 18), (0, 15, 16), + (1, 19, 22), (1, 21, 26), (2, 24, 31), (2, 25, 31), + (2, 26, 32), (2, 26, 32), (1, 27, 31), (2, 28, 30), + (3, 27, 30), (3, 28, 32), (2, 28, 34), (2, 29, 36), + (2, 31, 39), (4, 36, 41), (4, 40, 44), (5, 44, 49), + (3, 47, 59), (4, 50, 62), (6, 54, 65), (6, 55, 67), + (6, 57, 69), (6, 60, 77), (4, 59, 84), (6, 60, 91), + (9, 66, 95), (12, 77, 107), (10, 79, 109), (9, 81, 111), + (9, 81, 112), (15, 81, 106), (23, 80, 99), (40, 78, 84), + (76, 72, 58), (83, 71, 51), (91, 71, 44), (102, 74, 41), + (109, 80, 40), (113, 85, 47), (113, 90, 56), (109, 93, 60), + (106, 98, 66), (96, 107, 71), (96, 107, 72), (97, 108, 74), + (99, 107, 74), (103, 108, 68), (106, 111, 58), (112, 111, 51), + (120, 111, 48), (117, 110, 48), (115, 110, 49), (103, 107, 55), + (88, 104, 64), (70, 100, 76), (56, 99, 91), (43, 99, 103), + (31, 97, 111), (25, 96, 116), (25, 94, 115), (37, 100, 107), + (56, 109, 99), (74, 123, 88), (96, 139, 78), (110, 149, 70), + (134, 157, 50), (135, 155, 50), (136, 154, 50), (136, 156, 52), + (130, 157, 62), (119, 154, 72), (106, 152, 80), (88, 140, 93), + (68, 129, 105), (50, 123, 117), (37, 120, 128), (30, 124, 135), + (29, 125, 139), (26, 122, 139), (25, 121, 140), (22, 121, 143), + (24, 126, 144), (27, 131, 145), (28, 132, 140), (38, 130, 131), + (51, 129, 123), (76, 129, 109), (102, 133, 98), (124, 136, 85), + (144, 135, 69), (163, 137, 57), (188, 139, 41), (212, 141, 30), + (227, 141, 20), (232, 134, 14), (221, 120, 13), (200, 110, 10), + (176, 96, 11), (149, 84, 10), (128, 71, 8), (105, 49, 7), + (79, 35, 5), (53, 20, 6), (31, 12, 6), (16, 7, 5), + (10, 2, 4), (12, 2, 3), (20, 5, 2), (32, 9, 2), + (51, 15, 3), (72, 23, 4), (91, 33, 6), (116, 48, 8), + (137, 61, 7), (162, 74, 8), (188, 82, 11), (202, 88, 11), + (213, 95, 13), (214, 94, 9), (200, 93, 6), (187, 82, 7), + (164, 69, 7), (139, 61, 12), (119, 53, 19), (94, 48, 27), + (71, 44, 36), (47, 37, 45), (25, 36, 53), (13, 41, 63), + (6, 47, 75), (4, 54, 82), (5, 61, 88), (8, 65, 88), + (8, 61, 80), (7, 60, 74), (8, 60, 67), (11, 65, 64) + ), + +// 556 Evensong +((26, 31, 51), (23, 27, 42), (18, 23, 36), (14, 19, 31), + (14, 18, 29), (15, 17, 28), (14, 16, 26), (13, 15, 24), + (8, 10, 15), (6, 7, 12), (4, 5, 10), (5, 7, 12), + (6, 9, 15), (7, 11, 18), (9, 14, 22), (10, 16, 24), + (11, 18, 27), (14, 21, 31), (16, 22, 32), (18, 24, 34), + (24, 29, 34), (31, 34, 35), (34, 37, 38), (37, 41, 41), + (62, 62, 51), (70, 70, 61), (79, 79, 72), (81, 84, 73), + (84, 89, 75), (80, 86, 76), (76, 83, 77), (69, 75, 75), + (55, 62, 67), (34, 41, 49), (28, 33, 44), (22, 26, 40), + (20, 24, 37), (18, 22, 34), (17, 22, 33), (17, 22, 33), + (18, 24, 35), (19, 26, 37), (21, 28, 39), (22, 29, 42), + (24, 30, 46), (24, 31, 47), (24, 32, 48), (24, 33, 50), + (25, 33, 50), (21, 29, 45), (20, 28, 42), (20, 27, 40), + (18, 25, 38), (17, 24, 36), (16, 23, 35), (16, 23, 35), + (17, 22, 33), (17, 21, 33), (18, 21, 33), (18, 20, 32), + (18, 20, 32), (17, 20, 31), (16, 20, 31), (14, 19, 31), + (13, 19, 31), (6, 11, 22), (4, 8, 18), (3, 6, 14), + (1, 4, 11), (0, 2, 9), (0, 0, 7), (2, 2, 9), + (8, 10, 22), (13, 16, 29), (19, 23, 36), (22, 27, 43), + (26, 32, 51), (27, 34, 53), (29, 36, 55), (30, 38, 56), + (31, 37, 58), (31, 39, 57), (30, 37, 55), (29, 36, 54), + (28, 35, 53), (28, 35, 53), (27, 34, 53), (26, 33, 52), + (24, 29, 49), (21, 26, 45), (19, 23, 42), (16, 20, 38), + (14, 18, 34), (10, 12, 25), (10, 11, 20), (13, 16, 14), + (22, 22, 15), (55, 58, 50), (82, 84, 69), (110, 110, 89), + (127, 129, 109), (145, 149, 130), (182, 186, 166), (206, 207, 174), + (229, 233, 197), (220, 223, 186), (212, 214, 175), (202, 204, 165), + (193, 194, 156), (164, 163, 130), (144, 144, 121), (137, 137, 118), + (133, 132, 117), (139, 137, 112), (143, 142, 113), (148, 148, 115), + (154, 157, 116), (148, 148, 108), (133, 132, 101), (116, 120, 95), + (69, 70, 65), (55, 58, 59), (41, 46, 54), (37, 43, 53), + (34, 40, 52), (32, 37, 54), (35, 41, 56), (41, 46, 59), + (46, 49, 65), (58, 60, 64), (61, 63, 63), (64, 67, 63), + (65, 68, 61), (63, 68, 56), (61, 67, 51), (55, 59, 44), + (40, 44, 35), (33, 36, 31), (26, 29, 28), (23, 27, 28), + (21, 25, 29), (19, 24, 32), (19, 23, 33), (18, 24, 35), + (18, 25, 36), (24, 28, 39), (27, 31, 41), (30, 34, 43), + (35, 39, 45), (42, 45, 48), (49, 49, 54), (49, 55, 59), + (51, 56, 71), (49, 56, 72), (47, 56, 74), (45, 56, 78), + (43, 53, 80), (43, 53, 80), (43, 53, 80), (48, 60, 80), + (66, 74, 78), (94, 100, 85), (105, 110, 85), (116, 120, 86), + (126, 125, 83), (119, 120, 81), (107, 108, 76), (91, 92, 68), + (48, 51, 41), (40, 43, 38), (33, 36, 36), (26, 28, 28), + (18, 20, 20), (13, 16, 20), (11, 14, 21), (10, 13, 19), + (12, 15, 22), (15, 18, 27), (17, 21, 31), (20, 24, 35), + (22, 27, 38), (24, 28, 43), (25, 31, 44), (26, 33, 45), + (31, 37, 44), (32, 38, 43), (34, 40, 43), (37, 42, 42), + (40, 44, 43), (41, 44, 44), (38, 41, 45), (37, 40, 46), + (35, 39, 49), (32, 37, 51), (31, 37, 54), (33, 40, 60), + (36, 44, 66), (37, 46, 70), (38, 48, 72), (38, 47, 70), + (35, 44, 65), (31, 38, 57), (23, 29, 45), (17, 20, 33), + (12, 13, 22), (6, 7, 14), (3, 2, 8), (2, 1, 5), + (3, 3, 5), (6, 7, 10), (7, 10, 15), (9, 14, 17), + (11, 18, 22), (13, 19, 27), (14, 20, 27), (13, 20, 28), + (14, 20, 30), (16, 20, 33), (16, 22, 35), (17, 23, 37), + (19, 25, 39), (19, 25, 40), (19, 26, 40), (21, 27, 38), + (21, 27, 37), (20, 27, 37), (20, 27, 35), (20, 26, 34), + (19, 27, 35), (18, 26, 35), (18, 25, 35), (18, 25, 35), + (20, 26, 35), (22, 27, 34), (23, 26, 34), (21, 25, 31), + (20, 23, 28), (20, 22, 26), (18, 20, 26), (15, 19, 25), + (15, 19, 25), (16, 19, 27), (16, 18, 28), (16, 18, 29), + (16, 19, 29), (17, 19, 30), (17, 19, 31), (17, 20, 32), + (19, 22, 34), (21, 23, 36), (21, 26, 39), (24, 29, 44), + (28, 32, 50), (32, 36, 57), (38, 42, 63), (32, 38, 56) + ), + +// 557 Exceding_Expectations +((111, 93, 84), (86, 52, 41), (85, 46, 35), (85, 41, 29), + (103, 54, 35), (121, 67, 41), (127, 73, 44), (134, 79, 47), + (166, 111, 85), (176, 131, 100), (186, 151, 115), (183, 158, 124), + (181, 166, 134), (170, 161, 135), (160, 156, 136), (153, 150, 130), + (147, 145, 125), (113, 109, 90), (98, 88, 72), (83, 68, 54), + (72, 53, 45), (61, 38, 36), (60, 33, 33), (60, 29, 30), + (69, 27, 31), (80, 39, 45), (91, 51, 60), (105, 66, 68), + (120, 82, 76), (124, 88, 79), (129, 95, 83), (141, 111, 92), + (155, 124, 101), (168, 129, 103), (167, 129, 105), (167, 130, 108), + (169, 130, 109), (171, 130, 111), (172, 130, 111), (174, 131, 111), + (171, 138, 115), (169, 139, 117), (167, 141, 120), (165, 145, 124), + (163, 150, 128), (161, 153, 134), (159, 157, 140), (159, 166, 157), + (163, 174, 167), (169, 186, 175), (174, 186, 177), (179, 187, 180), + (179, 179, 172), (179, 171, 164), (174, 166, 157), (170, 161, 151), + (156, 144, 143), (150, 136, 139), (144, 129, 136), (135, 128, 139), + (127, 127, 142), (124, 127, 143), (122, 128, 144), (123, 129, 149), + (123, 131, 150), (119, 132, 144), (120, 124, 132), (121, 116, 120), + (118, 111, 113), (116, 107, 106), (107, 94, 88), (97, 79, 77), + (87, 50, 49), (89, 48, 44), (91, 47, 39), (100, 52, 44), + (109, 57, 50), (111, 59, 50), (114, 61, 51), (114, 69, 54), + (123, 79, 63), (133, 103, 82), (131, 110, 93), (129, 117, 104), + (136, 125, 105), (143, 134, 106), (151, 146, 112), (154, 149, 116), + (144, 134, 114), (133, 123, 98), (123, 113, 83), (114, 103, 76), + (106, 94, 70), (93, 78, 61), (79, 64, 48), (71, 56, 36), + (66, 49, 28), (62, 46, 24), (60, 45, 24), (59, 45, 24), + (60, 45, 25), (62, 46, 26), (63, 49, 34), (66, 58, 47), + (87, 83, 77), (101, 99, 96), (115, 115, 116), (123, 125, 125), + (132, 135, 135), (147, 154, 147), (158, 166, 157), (160, 171, 165), + (163, 173, 166), (160, 172, 165), (155, 169, 166), (151, 166, 168), + (142, 159, 168), (136, 152, 164), (135, 151, 159), (134, 150, 159), + (130, 148, 151), (127, 142, 140), (124, 136, 130), (123, 134, 126), + (123, 133, 122), (122, 128, 119), (123, 124, 117), (121, 118, 113), + (121, 120, 113), (121, 128, 123), (119, 128, 122), (117, 128, 121), + (111, 126, 117), (104, 126, 112), (102, 122, 109), (101, 115, 101), + (109, 108, 86), (116, 104, 78), (123, 100, 71), (123, 96, 67), + (123, 92, 63), (118, 87, 57), (114, 85, 51), (108, 79, 48), + (96, 69, 46), (78, 74, 62), (79, 80, 68), (81, 87, 75), + (87, 97, 89), (89, 113, 104), (103, 131, 121), (122, 155, 138), + (142, 174, 157), (143, 173, 156), (144, 173, 155), (146, 177, 156), + (146, 175, 155), (137, 164, 150), (129, 144, 135), (116, 123, 116), + (102, 100, 101), (69, 66, 78), (64, 59, 70), (59, 52, 63), + (51, 34, 52), (42, 25, 49), (34, 22, 51), (32, 30, 56), + (34, 45, 60), (35, 47, 62), (37, 49, 65), (42, 57, 76), + (44, 63, 84), (43, 66, 82), (49, 62, 77), (58, 66, 81), + (65, 68, 93), (67, 79, 102), (77, 80, 106), (91, 93, 112), + (105, 103, 125), (121, 127, 143), (139, 145, 157), (154, 163, 166), + (172, 176, 164), (176, 179, 162), (180, 182, 161), (189, 188, 163), + (196, 191, 162), (203, 193, 160), (207, 198, 160), (209, 202, 162), + (213, 202, 167), (215, 199, 168), (213, 206, 172), (209, 216, 176), + (206, 221, 178), (202, 212, 177), (194, 205, 174), (185, 201, 174), + (173, 197, 177), (159, 180, 171), (145, 160, 159), (126, 133, 143), + (106, 111, 132), (85, 88, 115), (69, 69, 97), (57, 49, 79), + (48, 38, 64), (46, 33, 51), (48, 36, 43), (52, 36, 38), + (54, 38, 33), (58, 44, 28), (63, 49, 28), (68, 53, 31), + (71, 55, 29), (74, 59, 30), (87, 65, 35), (107, 73, 43), + (127, 82, 46), (143, 92, 48), (159, 100, 54), (177, 105, 62), + (191, 108, 66), (201, 113, 68), (199, 113, 72), (193, 117, 77), + (182, 119, 81), (180, 127, 88), (182, 131, 95), (181, 143, 107), + (179, 153, 119), (180, 163, 127), (188, 168, 130), (194, 170, 130), + (199, 167, 132), (198, 162, 131), (199, 157, 123), (199, 148, 110), + (199, 138, 98), (197, 129, 91), (194, 122, 81), (193, 117, 77), + (187, 113, 75), (179, 110, 78), (171, 110, 81), (167, 113, 88), + (162, 123, 101), (155, 127, 114), (152, 134, 126), (149, 138, 130), + (149, 147, 136), (134, 131, 123), (124, 114, 108), (108, 94, 87) + ), + +// 558 Explosion +((129, 90, 16), (80, 46, 17), (66, 28, 16), (53, 10, 15), + (77, 20, 12), (102, 31, 10), (114, 36, 9), (126, 41, 9), + (166, 58, 6), (179, 59, 5), (192, 61, 4), (182, 59, 5), + (173, 57, 7), (155, 52, 11), (138, 47, 15), (128, 43, 19), + (118, 39, 23), (73, 22, 40), (55, 18, 44), (38, 15, 48), + (34, 14, 47), (30, 14, 47), (31, 15, 48), (33, 16, 50), + (41, 13, 45), (49, 9, 37), (57, 6, 29), (79, 9, 22), + (101, 13, 15), (111, 18, 14), (122, 24, 13), (140, 37, 11), + (155, 49, 9), (197, 82, 4), (213, 98, 5), (230, 115, 7), + (237, 132, 14), (244, 150, 21), (245, 158, 25), (246, 166, 29), + (247, 187, 45), (248, 194, 55), (250, 202, 66), (250, 207, 70), + (251, 213, 74), (250, 214, 73), (250, 215, 72), (250, 215, 70), + (251, 214, 64), (253, 207, 52), (253, 204, 47), (253, 202, 43), + (253, 204, 42), (253, 206, 42), (253, 207, 43), (254, 209, 45), + (244, 205, 59), (226, 190, 57), (208, 176, 55), (184, 155, 50), + (160, 134, 45), (152, 127, 46), (144, 121, 48), (127, 109, 54), + (109, 93, 55), (68, 55, 52), (59, 49, 57), (51, 43, 62), + (51, 45, 65), (52, 47, 68), (49, 48, 76), (46, 46, 78), + (35, 35, 68), (29, 29, 61), (23, 23, 54), (18, 19, 48), + (14, 15, 42), (12, 13, 39), (11, 11, 36), (9, 8, 31), + (8, 6, 26), (7, 3, 19), (6, 3, 17), (6, 3, 15), + (5, 2, 14), (5, 2, 14), (5, 2, 13), (5, 1, 13), + (5, 2, 15), (4, 2, 16), (4, 3, 18), (4, 3, 19), + (5, 4, 20), (5, 4, 20), (5, 4, 20), (6, 4, 20), + (6, 4, 20), (6, 3, 19), (6, 2, 17), (6, 2, 16), + (6, 2, 15), (6, 2, 15), (7, 2, 14), (9, 1, 14), + (18, 2, 17), (23, 7, 21), (29, 12, 25), (32, 16, 27), + (35, 21, 30), (47, 30, 34), (64, 47, 44), (90, 67, 48), + (113, 89, 58), (153, 132, 71), (162, 142, 75), (171, 153, 80), + (194, 173, 83), (216, 192, 91), (231, 210, 99), (243, 219, 102), + (252, 222, 93), (253, 222, 87), (254, 222, 81), (254, 220, 78), + (254, 218, 76), (254, 211, 68), (253, 203, 57), (253, 199, 46), + (253, 194, 39), (252, 189, 33), (251, 187, 35), (251, 186, 38), + (251, 192, 47), (251, 198, 60), (251, 204, 75), (252, 209, 84), + (246, 212, 98), (229, 203, 103), (212, 194, 108), (200, 185, 108), + (188, 176, 109), (162, 156, 103), (142, 136, 93), (117, 114, 79), + (92, 89, 66), (46, 42, 47), (42, 34, 43), (38, 26, 40), + (39, 16, 32), (49, 12, 23), (70, 11, 14), (90, 16, 10), + (113, 17, 9), (112, 15, 9), (112, 13, 9), (110, 12, 9), + (109, 15, 10), (107, 19, 10), (95, 19, 16), (74, 14, 21), + (51, 8, 26), (20, 4, 28), (16, 4, 28), (13, 5, 29), + (10, 7, 34), (12, 12, 41), (20, 20, 46), (37, 35, 55), + (83, 77, 76), (95, 89, 83), (108, 102, 91), (130, 123, 99), + (157, 145, 106), (181, 163, 110), (204, 178, 109), (225, 186, 106), + (233, 179, 95), (227, 163, 81), (210, 139, 68), (183, 115, 54), + (159, 94, 42), (139, 73, 30), (116, 49, 19), (93, 27, 14), + (53, 2, 13), (52, 1, 14), (51, 1, 15), (65, 7, 13), + (85, 19, 11), (108, 34, 9), (133, 52, 7), (153, 68, 12), + (178, 87, 17), (202, 112, 26), (223, 139, 41), (241, 165, 53), + (248, 185, 71), (252, 200, 86), (253, 214, 102), (253, 226, 120), + (254, 233, 131), (254, 236, 140), (248, 231, 143), (234, 218, 139), + (213, 193, 128), (201, 168, 111), (200, 148, 92), (205, 136, 75), + (208, 130, 61), (192, 116, 49), (167, 94, 43), (148, 72, 38), + (136, 57, 34), (129, 53, 30), (124, 54, 25), (104, 51, 24), + (84, 43, 29), (66, 33, 34), (52, 21, 37), (63, 18, 33), + (79, 25, 23), (102, 38, 17), (127, 55, 14), (143, 72, 17), + (170, 92, 27), (195, 117, 41), (219, 143, 56), (238, 169, 70), + (244, 188, 80), (243, 197, 91), (235, 201, 108), (221, 198, 122), + (203, 190, 134), (186, 180, 142), (166, 161, 137), (144, 139, 129), + (118, 114, 115), (91, 87, 98), (72, 68, 86), (58, 50, 74), + (48, 36, 61), (43, 23, 48), (41, 12, 34), (48, 7, 23), + (69, 9, 17), (93, 19, 12), (119, 34, 9), (142, 54, 9), + (162, 71, 9), (184, 86, 10), (206, 104, 10), (225, 121, 8), + (209, 120, 9), (186, 114, 12), (157, 104, 13), (129, 88, 16) + ), + +// 559 Faded_Denim +((33, 54, 95), (31, 53, 96), (39, 58, 110), (47, 63, 124), + (57, 72, 140), (68, 82, 156), (72, 84, 156), (76, 86, 156), + (88, 97, 158), (88, 97, 159), (89, 98, 160), (88, 96, 156), + (88, 95, 152), (84, 90, 139), (80, 86, 126), (75, 81, 118), + (71, 76, 111), (45, 55, 89), (38, 49, 84), (32, 43, 80), + (32, 43, 80), (32, 43, 80), (33, 44, 82), (34, 45, 84), + (37, 50, 95), (41, 54, 99), (45, 59, 103), (50, 62, 107), + (55, 66, 111), (55, 67, 111), (56, 68, 112), (58, 69, 112), + (59, 68, 111), (58, 66, 108), (57, 67, 110), (56, 68, 112), + (61, 72, 120), (66, 76, 128), (68, 78, 133), (71, 81, 138), + (78, 88, 148), (71, 84, 142), (65, 80, 136), (58, 73, 125), + (52, 66, 115), (51, 63, 110), (50, 61, 106), (45, 56, 98), + (40, 50, 88), (23, 33, 69), (17, 26, 60), (11, 20, 51), + (8, 16, 46), (6, 13, 41), (5, 12, 42), (4, 12, 43), + (4, 11, 43), (3, 9, 41), (3, 7, 39), (3, 5, 36), + (3, 3, 33), (3, 3, 34), (3, 4, 36), (4, 8, 40), + (5, 13, 48), (19, 27, 69), (29, 36, 82), (40, 45, 95), + (47, 51, 100), (54, 58, 106), (60, 66, 111), (62, 72, 112), + (59, 76, 115), (60, 76, 116), (61, 76, 118), (64, 78, 119), + (68, 80, 120), (65, 78, 118), (63, 77, 116), (58, 76, 115), + (48, 68, 111), (43, 60, 112), (41, 56, 109), (39, 52, 107), + (37, 50, 105), (35, 49, 103), (32, 47, 99), (28, 48, 100), + (23, 51, 108), (23, 52, 112), (24, 53, 116), (24, 53, 115), + (24, 54, 115), (25, 56, 118), (29, 63, 124), (33, 68, 134), + (41, 75, 150), (57, 86, 173), (60, 90, 176), (63, 94, 179), + (64, 95, 179), (65, 97, 179), (65, 100, 182), (66, 102, 187), + (71, 108, 195), (70, 107, 194), (70, 107, 194), (68, 106, 191), + (66, 105, 189), (63, 103, 186), (62, 99, 181), (59, 96, 178), + (58, 92, 174), (58, 92, 169), (61, 92, 169), (64, 92, 170), + (73, 93, 171), (80, 98, 174), (94, 107, 181), (100, 115, 189), + (111, 125, 203), (113, 125, 206), (116, 125, 209), (120, 127, 210), + (124, 130, 211), (121, 128, 211), (115, 126, 209), (107, 120, 203), + (99, 113, 197), (85, 96, 181), (83, 93, 178), (81, 91, 175), + (76, 88, 170), (72, 85, 165), (69, 81, 159), (69, 79, 158), + (71, 79, 160), (75, 81, 163), (80, 84, 167), (82, 86, 168), + (84, 88, 169), (88, 93, 175), (93, 96, 179), (91, 98, 183), + (88, 100, 189), (80, 103, 190), (79, 103, 189), (78, 103, 189), + (79, 104, 189), (77, 103, 186), (75, 105, 189), (70, 106, 193), + (59, 107, 198), (58, 107, 200), (57, 108, 203), (59, 109, 205), + (66, 113, 209), (72, 120, 214), (81, 129, 222), (87, 135, 232), + (95, 144, 241), (119, 163, 254), (121, 165, 254), (124, 167, 255), + (131, 170, 254), (135, 168, 252), (127, 162, 246), (136, 162, 245), + (126, 151, 237), (121, 147, 234), (117, 144, 232), (103, 132, 225), + (85, 118, 217), (77, 112, 213), (76, 108, 211), (74, 110, 214), + (75, 114, 218), (75, 118, 221), (77, 119, 223), (75, 121, 223), + (73, 118, 222), (73, 118, 222), (74, 117, 218), (74, 114, 213), + (74, 112, 197), (71, 108, 191), (69, 104, 186), (62, 97, 178), + (57, 91, 169), (52, 82, 158), (47, 78, 150), (43, 74, 143), + (41, 72, 138), (39, 69, 134), (38, 66, 130), (37, 62, 126), + (37, 60, 120), (33, 56, 116), (31, 53, 114), (27, 51, 111), + (24, 48, 108), (27, 47, 110), (29, 49, 114), (33, 53, 120), + (35, 60, 131), (40, 67, 143), (48, 75, 154), (56, 81, 163), + (62, 89, 173), (65, 93, 178), (66, 98, 186), (63, 100, 190), + (62, 98, 189), (61, 96, 185), (60, 93, 177), (60, 89, 166), + (59, 85, 158), (51, 79, 150), (47, 75, 143), (41, 70, 138), + (38, 66, 132), (36, 64, 126), (37, 61, 122), (33, 57, 116), + (33, 53, 110), (30, 47, 102), (23, 42, 94), (16, 35, 83), + (9, 29, 72), (6, 25, 64), (5, 20, 55), (4, 16, 45), + (3, 12, 39), (3, 7, 31), (2, 3, 25), (2, 3, 24), + (2, 4, 26), (3, 10, 32), (4, 15, 41), (5, 24, 53), + (8, 30, 64), (12, 32, 72), (16, 34, 80), (17, 34, 79), + (17, 36, 79), (21, 40, 80), (25, 45, 83), (28, 48, 84), + (29, 50, 85), (29, 49, 81), (28, 47, 73), (24, 39, 60), + (26, 43, 64), (28, 45, 72), (29, 47, 77), (30, 50, 85) + ), + +// 560 Fading_Away +((101, 104, 121), (111, 104, 130), (115, 107, 129), (120, 111, 128), + (121, 110, 125), (122, 110, 123), (121, 105, 124), (121, 101, 125), + (129, 93, 125), (132, 97, 124), (136, 102, 123), (142, 113, 128), + (148, 124, 133), (151, 137, 128), (155, 151, 124), (154, 154, 124), + (154, 158, 125), (145, 161, 129), (140, 154, 123), (135, 147, 118), + (133, 143, 114), (132, 140, 111), (133, 138, 110), (134, 136, 109), + (134, 135, 107), (128, 137, 108), (123, 139, 110), (113, 144, 114), + (103, 150, 118), (96, 152, 120), (89, 154, 122), (79, 154, 126), + (64, 147, 131), (51, 131, 130), (51, 122, 130), (51, 114, 131), + (57, 105, 128), (63, 96, 126), (70, 94, 125), (78, 93, 125), + (99, 110, 123), (108, 117, 123), (117, 124, 124), (125, 127, 123), + (133, 130, 122), (132, 131, 120), (131, 133, 119), (125, 133, 118), + (124, 130, 114), (124, 127, 101), (119, 125, 100), (115, 124, 99), + (113, 124, 100), (111, 124, 102), (110, 125, 102), (109, 126, 103), + (92, 128, 114), (85, 125, 119), (78, 122, 124), (80, 121, 120), + (83, 121, 117), (83, 120, 114), (84, 120, 111), (89, 120, 101), + (100, 115, 91), (126, 110, 74), (130, 111, 63), (135, 112, 52), + (138, 110, 47), (141, 109, 42), (152, 102, 42), (159, 104, 44), + (164, 111, 44), (166, 116, 46), (169, 121, 48), (165, 127, 53), + (161, 134, 58), (157, 137, 65), (154, 141, 72), (146, 152, 84), + (144, 155, 96), (146, 160, 125), (147, 169, 136), (149, 178, 147), + (154, 178, 146), (159, 178, 145), (165, 163, 146), (165, 152, 140), + (163, 136, 129), (163, 123, 122), (163, 110, 116), (164, 105, 110), + (166, 100, 104), (162, 99, 98), (156, 101, 94), (149, 109, 94), + (145, 114, 90), (138, 125, 85), (135, 125, 82), (132, 125, 80), + (132, 123, 79), (133, 122, 78), (140, 121, 81), (143, 124, 82), + (140, 118, 79), (136, 116, 85), (133, 114, 92), (131, 110, 96), + (130, 107, 100), (124, 100, 108), (122, 88, 115), (127, 81, 125), + (137, 76, 132), (141, 69, 132), (145, 68, 134), (149, 67, 137), + (158, 73, 143), (159, 83, 148), (148, 101, 150), (137, 112, 162), + (130, 135, 171), (127, 135, 172), (124, 136, 173), (120, 130, 175), + (116, 125, 177), (112, 112, 167), (111, 102, 155), (108, 92, 143), + (105, 83, 141), (105, 75, 124), (104, 78, 121), (103, 82, 119), + (104, 96, 121), (105, 107, 119), (111, 113, 113), (113, 115, 110), + (118, 112, 116), (122, 106, 117), (127, 100, 118), (127, 99, 116), + (127, 98, 115), (128, 94, 117), (128, 89, 127), (124, 80, 135), + (108, 76, 135), (77, 70, 137), (73, 67, 140), (69, 65, 143), + (61, 62, 143), (54, 63, 140), (51, 60, 140), (55, 56, 143), + (61, 51, 140), (62, 50, 138), (63, 50, 137), (72, 50, 137), + (74, 53, 139), (79, 59, 140), (76, 66, 138), (86, 77, 136), + (94, 85, 133), (93, 98, 132), (91, 96, 133), (89, 95, 134), + (82, 87, 136), (76, 76, 136), (68, 71, 135), (65, 64, 133), + (70, 60, 137), (73, 64, 138), (76, 68, 139), (84, 78, 143), + (95, 95, 155), (108, 108, 165), (117, 126, 177), (129, 135, 184), + (139, 143, 198), (154, 148, 201), (157, 162, 204), (164, 164, 194), + (164, 161, 183), (165, 154, 167), (156, 161, 155), (140, 166, 146), + (119, 159, 138), (120, 161, 140), (121, 163, 142), (121, 174, 154), + (126, 181, 168), (137, 183, 182), (150, 184, 191), (158, 188, 194), + (161, 192, 198), (164, 195, 201), (165, 195, 204), (158, 193, 203), + (146, 190, 200), (131, 187, 199), (128, 177, 204), (129, 169, 207), + (135, 162, 208), (140, 159, 203), (147, 149, 200), (153, 149, 186), + (158, 151, 168), (167, 157, 154), (179, 154, 150), (186, 154, 155), + (181, 156, 160), (178, 159, 167), (181, 162, 173), (190, 165, 186), + (191, 165, 193), (187, 167, 195), (179, 171, 185), (171, 180, 176), + (166, 184, 161), (160, 182, 152), (154, 175, 146), (143, 168, 145), + (137, 165, 144), (134, 155, 143), (136, 146, 147), (134, 137, 150), + (134, 137, 150), (133, 136, 144), (137, 137, 137), (140, 133, 128), + (147, 136, 116), (149, 136, 105), (152, 141, 94), (150, 139, 86), + (152, 142, 80), (154, 141, 73), (155, 146, 74), (144, 151, 79), + (132, 156, 90), (123, 166, 99), (120, 173, 108), (124, 181, 122), + (126, 179, 133), (126, 176, 141), (120, 169, 140), (124, 161, 140), + (133, 146, 140), (138, 129, 139), (130, 119, 133), (117, 105, 127), + (105, 93, 125), (96, 82, 125), (91, 83, 119), (88, 89, 113), + (83, 91, 112), (83, 84, 124), (83, 79, 127), (94, 89, 128) + ), + +// 561 Fiery_Sky +((163, 95, 49), (175, 86, 48), (180, 83, 47), (186, 80, 47), + (171, 76, 42), (156, 73, 38), (150, 68, 35), (144, 64, 33), + (105, 55, 40), (87, 59, 46), (69, 64, 53), (53, 57, 63), + (37, 50, 73), (37, 51, 78), (37, 52, 84), (45, 53, 83), + (53, 55, 82), (89, 63, 71), (107, 70, 60), (126, 78, 49), + (143, 82, 38), (160, 87, 28), (167, 86, 25), (175, 86, 23), + (189, 61, 16), (200, 47, 18), (212, 33, 21), (214, 25, 23), + (217, 17, 26), (212, 16, 27), (207, 15, 28), (204, 13, 37), + (201, 6, 50), (173, 13, 52), (154, 12, 55), (136, 12, 58), + (119, 11, 62), (102, 11, 66), (91, 11, 63), (80, 11, 60), + (47, 14, 61), (47, 12, 56), (48, 10, 51), (58, 10, 43), + (69, 11, 36), (73, 14, 35), (77, 18, 35), (82, 22, 25), + (86, 28, 20), (83, 30, 15), (69, 31, 16), (55, 33, 18), + (48, 31, 25), (42, 30, 32), (43, 29, 32), (44, 28, 33), + (55, 24, 24), (64, 29, 30), (73, 35, 36), (83, 40, 37), + (94, 46, 39), (96, 46, 40), (98, 47, 42), (97, 47, 53), + (94, 43, 68), (89, 36, 81), (90, 28, 75), (91, 21, 69), + (94, 20, 64), (98, 19, 60), (105, 17, 51), (109, 21, 41), + (124, 24, 15), (122, 25, 17), (121, 27, 20), (119, 27, 17), + (118, 28, 15), (112, 27, 15), (107, 27, 16), (95, 23, 26), + (86, 18, 33), (64, 12, 22), (53, 12, 25), (42, 12, 29), + (37, 11, 32), (32, 10, 36), (18, 7, 40), (10, 9, 39), + (12, 22, 54), (15, 19, 66), (19, 16, 78), (22, 18, 82), + (26, 21, 86), (40, 25, 94), (56, 28, 97), (67, 21, 97), + (81, 18, 94), (105, 21, 93), (105, 20, 84), (106, 19, 75), + (112, 21, 71), (118, 24, 67), (134, 41, 66), (140, 54, 65), + (166, 73, 46), (178, 86, 39), (190, 99, 33), (190, 102, 32), + (191, 106, 32), (177, 103, 28), (156, 91, 23), (131, 78, 25), + (104, 70, 39), (63, 50, 56), (58, 44, 56), (54, 39, 56), + (53, 35, 57), (57, 40, 55), (72, 44, 52), (91, 49, 43), + (113, 55, 19), (115, 53, 23), (118, 51, 27), (112, 49, 33), + (107, 47, 39), (91, 38, 48), (69, 28, 59), (52, 20, 70), + (38, 19, 73), (15, 29, 58), (14, 34, 55), (13, 39, 53), + (28, 51, 44), (49, 58, 27), (73, 65, 13), (87, 71, 8), + (116, 73, 10), (122, 71, 9), (129, 69, 9), (122, 67, 9), + (116, 65, 9), (105, 66, 12), (102, 80, 13), (109, 93, 13), + (109, 97, 15), (128, 97, 22), (137, 102, 22), (146, 108, 23), + (158, 116, 26), (164, 117, 29), (168, 119, 26), (173, 125, 23), + (174, 135, 27), (172, 139, 25), (171, 143, 24), (176, 153, 21), + (186, 157, 19), (197, 156, 33), (190, 153, 37), (176, 159, 48), + (160, 158, 54), (151, 125, 62), (146, 122, 60), (142, 119, 59), + (123, 116, 55), (122, 101, 62), (130, 82, 57), (149, 69, 52), + (165, 73, 55), (166, 76, 57), (167, 80, 59), (178, 85, 63), + (182, 89, 60), (185, 96, 59), (178, 103, 52), (177, 114, 44), + (172, 113, 36), (170, 108, 29), (167, 99, 23), (171, 95, 15), + (172, 86, 12), (172, 73, 11), (176, 60, 17), (184, 60, 19), + (207, 72, 17), (212, 69, 17), (217, 66, 17), (218, 63, 17), + (220, 60, 19), (216, 63, 15), (212, 57, 12), (199, 50, 7), + (190, 42, 5), (176, 39, 5), (165, 34, 12), (150, 36, 17), + (146, 39, 22), (141, 43, 25), (139, 41, 31), (136, 40, 40), + (133, 40, 52), (129, 41, 60), (133, 49, 68), (142, 49, 72), + (152, 49, 81), (153, 41, 82), (162, 52, 86), (176, 63, 78), + (191, 77, 71), (190, 79, 54), (187, 88, 44), (189, 100, 33), + (196, 112, 25), (197, 124, 20), (187, 131, 19), (174, 132, 23), + (162, 118, 29), (152, 101, 46), (133, 87, 62), (112, 77, 76), + (86, 63, 85), (64, 47, 97), (43, 33, 100), (39, 24, 101), + (43, 21, 94), (51, 18, 86), (59, 15, 71), (76, 13, 62), + (95, 13, 57), (111, 12, 55), (123, 9, 48), (132, 9, 43), + (140, 12, 38), (149, 22, 39), (158, 32, 35), (168, 45, 33), + (177, 56, 20), (190, 68, 14), (198, 73, 11), (204, 77, 22), + (204, 73, 29), (200, 68, 36), (183, 54, 48), (166, 43, 65), + (145, 31, 78), (123, 22, 84), (96, 12, 92), (77, 8, 97), + (69, 10, 93), (64, 16, 85), (67, 22, 78), (67, 40, 76), + (79, 49, 65), (96, 59, 62), (130, 61, 54), (152, 84, 58) + ), + +// 562 Fiesta +((84, 124, 123), (56, 94, 149), (36, 79, 163), (16, 64, 177), + (17, 63, 165), (18, 62, 153), (23, 64, 150), (29, 66, 148), + (54, 85, 153), (57, 97, 135), (60, 110, 118), (72, 116, 91), + (85, 122, 65), (96, 117, 51), (108, 113, 38), (110, 110, 34), + (113, 107, 30), (123, 85, 16), (127, 71, 9), (131, 57, 3), + (137, 50, 2), (144, 44, 1), (146, 46, 1), (148, 49, 1), + (141, 60, 15), (124, 61, 40), (107, 62, 65), (91, 65, 92), + (75, 68, 119), (69, 73, 129), (64, 79, 139), (54, 94, 161), + (40, 107, 188), (10, 105, 235), (6, 96, 242), (2, 88, 250), + (3, 92, 249), (4, 96, 248), (6, 99, 244), (9, 102, 241), + (20, 103, 212), (23, 108, 195), (27, 113, 179), (29, 123, 154), + (31, 134, 129), (33, 135, 115), (36, 137, 101), (44, 127, 71), + (56, 118, 51), (78, 94, 25), (91, 84, 17), (105, 75, 10), + (121, 76, 16), (138, 78, 22), (143, 83, 29), (148, 88, 37), + (149, 121, 49), (152, 132, 50), (156, 144, 51), (152, 163, 68), + (149, 182, 85), (143, 188, 89), (138, 194, 94), (130, 193, 84), + (117, 184, 71), (89, 158, 61), (80, 151, 60), (71, 144, 60), + (64, 143, 55), (58, 143, 51), (48, 134, 42), (37, 124, 37), + (46, 98, 35), (62, 101, 38), (78, 105, 41), (93, 116, 51), + (108, 127, 61), (114, 130, 67), (121, 133, 73), (123, 139, 81), + (126, 145, 86), (118, 161, 99), (112, 173, 114), (106, 186, 129), + (104, 187, 133), (102, 188, 137), (97, 191, 131), (102, 188, 119), + (136, 185, 112), (153, 167, 102), (171, 150, 93), (177, 140, 81), + (184, 131, 69), (198, 124, 54), (214, 113, 39), (222, 98, 33), + (225, 80, 23), (214, 56, 7), (210, 60, 6), (207, 64, 6), + (203, 66, 7), (200, 68, 8), (185, 79, 14), (169, 88, 24), + (126, 98, 66), (108, 105, 88), (91, 113, 111), (84, 123, 117), + (78, 133, 124), (66, 145, 132), (51, 152, 142), (46, 147, 147), + (38, 142, 144), (32, 134, 105), (31, 131, 93), (31, 128, 81), + (33, 116, 61), (33, 111, 43), (28, 108, 27), (20, 105, 15), + (4, 87, 2), (4, 78, 1), (5, 70, 0), (9, 69, 1), + (14, 69, 2), (29, 72, 2), (49, 69, 2), (67, 57, 1), + (86, 44, 1), (128, 24, 1), (140, 24, 1), (153, 25, 1), + (174, 29, 0), (188, 34, 2), (198, 33, 2), (204, 30, 2), + (206, 27, 3), (197, 26, 4), (188, 26, 5), (183, 22, 4), + (179, 19, 4), (175, 14, 5), (173, 10, 3), (169, 9, 6), + (165, 9, 6), (162, 10, 10), (161, 14, 13), (161, 19, 16), + (159, 30, 26), (147, 42, 39), (135, 57, 51), (122, 68, 60), + (108, 92, 71), (99, 96, 74), (91, 100, 77), (72, 105, 82), + (47, 102, 94), (34, 94, 103), (31, 84, 110), (28, 71, 114), + (26, 63, 107), (7, 42, 85), (5, 37, 81), (3, 32, 78), + (6, 23, 76), (20, 27, 72), (33, 40, 57), (40, 58, 46), + (30, 91, 58), (30, 100, 71), (31, 109, 85), (36, 124, 109), + (40, 145, 127), (39, 160, 135), (28, 163, 142), (19, 162, 146), + (19, 145, 142), (27, 127, 133), (41, 109, 113), (59, 89, 87), + (76, 77, 63), (90, 63, 41), (105, 45, 27), (116, 28, 15), + (129, 13, 5), (124, 17, 4), (120, 21, 4), (106, 30, 8), + (94, 36, 11), (87, 38, 14), (88, 34, 11), (90, 36, 7), + (92, 39, 7), (93, 45, 7), (107, 52, 11), (123, 54, 11), + (144, 57, 8), (163, 57, 7), (176, 56, 6), (193, 53, 9), + (205, 51, 10), (213, 47, 6), (216, 45, 6), (217, 46, 6), + (219, 45, 9), (223, 42, 10), (227, 34, 7), (232, 28, 6), + (236, 24, 4), (238, 27, 3), (239, 30, 4), (238, 31, 2), + (235, 33, 5), (235, 37, 14), (232, 54, 29), (228, 76, 47), + (217, 91, 76), (195, 101, 90), (167, 99, 115), (139, 97, 145), + (114, 103, 151), (95, 100, 169), (77, 99, 151), (62, 84, 135), + (54, 66, 130), (51, 58, 111), (56, 51, 103), (61, 59, 83), + (63, 72, 60), (65, 82, 52), (64, 93, 53), (65, 97, 62), + (62, 102, 73), (52, 110, 78), (45, 121, 86), (34, 133, 94), + (26, 139, 104), (20, 142, 115), (13, 139, 120), (12, 143, 130), + (13, 153, 143), (18, 161, 160), (20, 171, 181), (16, 177, 193), + (9, 178, 206), (5, 176, 220), (6, 172, 231), (7, 171, 239), + (15, 168, 234), (31, 168, 222), (53, 169, 208), (76, 165, 188), + (74, 165, 189), (68, 157, 179), (68, 149, 164), (66, 141, 150) + ), + +// 563 First_Love +((218, 159, 144), (232, 175, 163), (230, 176, 159), (228, 177, 156), + (227, 177, 154), (227, 178, 152), (229, 178, 151), (231, 178, 151), + (233, 179, 149), (233, 183, 151), (234, 188, 154), (235, 191, 156), + (236, 194, 158), (235, 195, 163), (235, 196, 168), (235, 197, 170), + (235, 199, 172), (240, 204, 180), (239, 206, 185), (239, 208, 190), + (239, 208, 190), (240, 208, 191), (241, 205, 188), (243, 202, 186), + (245, 194, 175), (242, 188, 165), (240, 182, 156), (236, 169, 144), + (232, 156, 133), (228, 150, 127), (225, 144, 122), (219, 126, 110), + (213, 112, 105), (210, 99, 107), (208, 101, 109), (207, 104, 111), + (206, 105, 113), (205, 107, 116), (208, 109, 118), (211, 112, 120), + (226, 134, 128), (228, 143, 131), (230, 153, 134), (230, 158, 135), + (231, 163, 136), (230, 162, 135), (230, 161, 135), (228, 158, 134), + (226, 157, 133), (217, 157, 129), (204, 151, 123), (192, 145, 118), + (187, 139, 114), (183, 134, 110), (184, 134, 110), (186, 134, 111), + (186, 142, 124), (190, 150, 135), (194, 158, 147), (206, 170, 159), + (219, 182, 171), (223, 186, 175), (228, 190, 179), (233, 193, 182), + (238, 197, 186), (242, 200, 186), (240, 191, 175), (238, 182, 164), + (236, 176, 157), (234, 171, 150), (232, 160, 138), (228, 151, 124), + (212, 121, 100), (203, 105, 93), (194, 90, 87), (187, 80, 81), + (181, 70, 76), (177, 65, 76), (173, 61, 77), (167, 58, 76), + (164, 61, 83), (166, 81, 108), (167, 89, 114), (168, 98, 121), + (168, 98, 120), (168, 98, 119), (164, 98, 112), (156, 95, 110), + (135, 78, 100), (123, 62, 88), (112, 47, 76), (107, 41, 73), + (103, 36, 70), (99, 27, 67), (94, 24, 65), (92, 21, 61), + (91, 19, 61), (99, 22, 73), (103, 24, 78), (107, 26, 84), + (108, 26, 85), (109, 27, 86), (112, 27, 90), (117, 34, 95), + (132, 59, 109), (145, 72, 112), (158, 85, 115), (165, 90, 116), + (173, 96, 118), (187, 110, 121), (199, 119, 121), (210, 130, 122), + (218, 139, 120), (230, 138, 107), (230, 135, 102), (230, 133, 98), + (227, 123, 92), (217, 113, 85), (207, 103, 85), (198, 91, 81), + (188, 71, 75), (183, 63, 72), (179, 55, 69), (178, 54, 69), + (178, 53, 69), (180, 49, 73), (186, 51, 81), (191, 50, 85), + (193, 48, 87), (193, 62, 85), (192, 67, 85), (192, 72, 86), + (196, 81, 89), (195, 85, 95), (196, 86, 98), (194, 92, 104), + (185, 98, 100), (177, 94, 97), (170, 91, 94), (165, 86, 94), + (161, 81, 95), (148, 70, 88), (132, 58, 81), (113, 45, 74), + (96, 35, 68), (72, 20, 63), (70, 17, 61), (68, 15, 59), + (70, 12, 55), (72, 11, 52), (74, 11, 53), (77, 13, 57), + (78, 14, 64), (78, 12, 62), (78, 11, 60), (78, 11, 56), + (77, 11, 52), (74, 12, 54), (69, 14, 59), (66, 11, 62), + (61, 12, 60), (56, 10, 53), (55, 10, 52), (54, 10, 51), + (54, 7, 47), (53, 7, 44), (50, 4, 35), (54, 2, 33), + (67, 3, 30), (72, 4, 31), (78, 6, 33), (84, 11, 34), + (97, 16, 42), (112, 26, 55), (128, 41, 68), (143, 51, 84), + (153, 57, 90), (164, 65, 91), (172, 75, 97), (183, 94, 103), + (190, 112, 113), (199, 120, 119), (208, 124, 117), (215, 127, 116), + (226, 149, 122), (227, 153, 127), (229, 158, 133), (231, 162, 140), + (232, 165, 144), (233, 169, 148), (234, 172, 151), (232, 173, 153), + (230, 174, 156), (228, 175, 157), (228, 176, 158), (229, 175, 157), + (229, 171, 155), (225, 166, 153), (224, 160, 150), (222, 158, 146), + (223, 157, 143), (224, 156, 141), (223, 154, 142), (225, 151, 141), + (225, 152, 140), (227, 153, 139), (229, 158, 136), (229, 161, 135), + (229, 160, 132), (227, 157, 127), (223, 150, 121), (221, 145, 114), + (215, 135, 109), (208, 124, 103), (202, 114, 98), (194, 105, 91), + (194, 102, 88), (195, 103, 91), (195, 104, 94), (194, 106, 99), + (190, 108, 100), (188, 109, 101), (187, 110, 106), (185, 107, 107), + (178, 102, 109), (169, 94, 102), (161, 85, 95), (153, 76, 90), + (151, 66, 82), (155, 62, 79), (156, 58, 76), (157, 55, 74), + (155, 53, 77), (154, 50, 75), (157, 52, 71), (162, 53, 68), + (161, 51, 67), (154, 48, 72), (144, 42, 76), (132, 35, 77), + (122, 33, 74), (114, 28, 71), (105, 23, 68), (102, 23, 67), + (98, 20, 68), (95, 21, 71), (95, 20, 73), (95, 20, 74), + (109, 32, 74), (120, 37, 72), (137, 56, 81), (157, 74, 93), + (167, 84, 107), (188, 111, 120), (194, 121, 124), (205, 142, 132) + ), + +// 564 Flame +((132, 76, 52), (110, 62, 38), (101, 57, 31), (93, 52, 25), + (108, 66, 34), (124, 80, 43), (136, 90, 50), (148, 100, 58), + (189, 135, 84), (200, 141, 88), (211, 148, 92), (213, 144, 91), + (215, 141, 90), (209, 126, 84), (204, 112, 79), (201, 105, 74), + (198, 98, 70), (178, 77, 47), (171, 70, 38), (164, 63, 29), + (163, 63, 27), (162, 63, 26), (160, 64, 25), (158, 66, 24), + (148, 73, 25), (145, 68, 25), (143, 64, 26), (139, 54, 23), + (135, 45, 20), (133, 42, 19), (132, 40, 19), (130, 40, 19), + (134, 41, 23), (151, 53, 27), (162, 67, 28), (174, 82, 30), + (187, 99, 39), (201, 116, 48), (207, 125, 55), (214, 135, 62), + (230, 169, 81), (234, 176, 90), (239, 183, 99), (238, 185, 106), + (237, 187, 113), (234, 186, 115), (231, 186, 117), (229, 184, 117), + (226, 178, 113), (230, 168, 96), (226, 161, 87), (223, 155, 79), + (218, 146, 68), (213, 138, 57), (211, 133, 51), (209, 128, 45), + (188, 113, 37), (176, 103, 31), (165, 94, 25), (151, 82, 21), + (137, 70, 18), (129, 66, 17), (121, 62, 17), (106, 53, 16), + (93, 46, 11), (82, 34, 9), (82, 33, 9), (82, 33, 10), + (84, 34, 9), (86, 36, 8), (94, 41, 10), (107, 49, 11), + (139, 70, 14), (151, 77, 19), (164, 85, 25), (171, 87, 30), + (178, 89, 36), (179, 88, 35), (181, 88, 35), (177, 84, 33), + (172, 74, 31), (155, 48, 31), (144, 38, 26), (134, 28, 22), + (130, 25, 20), (126, 22, 18), (118, 18, 17), (113, 19, 17), + (110, 26, 20), (114, 33, 24), (119, 40, 29), (122, 45, 32), + (126, 50, 36), (136, 61, 43), (145, 69, 46), (149, 71, 47), + (153, 70, 45), (154, 60, 40), (149, 56, 38), (145, 52, 36), + (141, 50, 34), (138, 48, 33), (128, 44, 30), (124, 41, 26), + (125, 44, 29), (131, 54, 34), (137, 65, 40), (141, 72, 42), + (146, 79, 45), (154, 88, 49), (161, 95, 52), (167, 99, 50), + (174, 98, 47), (176, 87, 41), (174, 83, 39), (172, 79, 38), + (162, 70, 31), (155, 63, 24), (147, 54, 21), (141, 42, 18), + (130, 22, 13), (128, 20, 11), (126, 19, 10), (126, 18, 10), + (127, 18, 11), (128, 14, 10), (135, 11, 8), (148, 13, 5), + (158, 16, 5), (170, 25, 11), (170, 26, 13), (170, 28, 15), + (172, 34, 15), (173, 37, 17), (171, 40, 20), (164, 42, 24), + (139, 39, 26), (125, 36, 23), (111, 33, 21), (105, 30, 20), + (100, 28, 19), (96, 26, 17), (94, 21, 15), (95, 17, 12), + (99, 17, 8), (114, 16, 4), (120, 16, 4), (126, 17, 4), + (135, 22, 4), (140, 31, 3), (144, 34, 3), (144, 35, 3), + (151, 31, 4), (146, 32, 5), (142, 33, 7), (132, 32, 8), + (116, 29, 10), (108, 25, 8), (106, 20, 9), (103, 20, 12), + (106, 26, 16), (119, 50, 31), (124, 57, 35), (129, 65, 40), + (141, 81, 48), (153, 96, 52), (166, 109, 58), (179, 120, 65), + (191, 133, 76), (192, 133, 75), (193, 133, 75), (194, 134, 68), + (197, 131, 62), (192, 126, 59), (190, 121, 58), (190, 119, 60), + (196, 124, 65), (208, 133, 70), (217, 144, 79), (223, 152, 88), + (227, 161, 96), (232, 172, 108), (239, 186, 120), (246, 200, 132), + (251, 217, 150), (251, 218, 151), (252, 220, 152), (251, 221, 154), + (252, 221, 153), (253, 223, 155), (253, 221, 154), (253, 218, 151), + (251, 207, 142), (245, 196, 128), (239, 184, 113), (231, 171, 97), + (225, 162, 87), (218, 149, 75), (211, 136, 63), (204, 124, 50), + (198, 114, 39), (194, 109, 34), (190, 104, 32), (185, 99, 36), + (183, 93, 37), (179, 86, 37), (177, 84, 36), (174, 83, 35), + (168, 80, 38), (163, 80, 40), (158, 78, 42), (155, 80, 42), + (154, 83, 41), (151, 84, 41), (149, 84, 39), (147, 85, 38), + (146, 87, 38), (148, 92, 37), (150, 94, 38), (150, 92, 37), + (149, 90, 37), (145, 87, 36), (143, 87, 35), (140, 88, 36), + (138, 87, 35), (135, 86, 37), (132, 84, 38), (130, 80, 35), + (128, 77, 35), (128, 74, 31), (127, 72, 31), (130, 72, 35), + (133, 75, 35), (140, 80, 40), (151, 88, 44), (159, 97, 50), + (168, 107, 59), (169, 114, 64), (171, 116, 68), (173, 117, 69), + (172, 112, 69), (172, 105, 67), (166, 95, 62), (160, 83, 57), + (155, 77, 52), (152, 72, 49), (154, 71, 47), (158, 69, 51), + (164, 69, 55), (173, 76, 60), (183, 89, 66), (191, 105, 69), + (180, 103, 67), (166, 95, 63), (148, 83, 58), (132, 70, 51) + ), + +// 565 Flying_a_Kite +((90, 150, 101), (83, 161, 102), (69, 169, 104), (56, 177, 107), + (69, 175, 117), (83, 174, 127), (91, 170, 124), (99, 166, 122), + (116, 171, 78), (118, 164, 58), (121, 158, 38), (110, 155, 30), + (100, 152, 23), (101, 153, 26), (103, 154, 29), (105, 150, 36), + (108, 147, 43), (104, 173, 67), (113, 185, 77), (122, 197, 88), + (127, 203, 83), (132, 210, 78), (134, 214, 77), (136, 218, 77), + (135, 202, 68), (126, 200, 58), (118, 199, 49), (110, 203, 57), + (103, 208, 66), (111, 212, 76), (119, 216, 86), (116, 221, 104), + (109, 207, 108), (125, 172, 95), (127, 144, 93), (129, 117, 92), + (132, 96, 68), (136, 75, 45), (135, 72, 34), (135, 70, 24), + (147, 76, 27), (144, 93, 23), (142, 110, 20), (143, 108, 25), + (144, 107, 31), (140, 100, 31), (136, 93, 31), (112, 89, 36), + (103, 74, 49), (94, 58, 53), (76, 70, 65), (58, 82, 78), + (53, 98, 90), (48, 114, 102), (40, 122, 96), (33, 131, 90), + (28, 150, 85), (30, 144, 83), (32, 138, 81), (32, 134, 59), + (32, 131, 37), (28, 120, 34), (25, 110, 31), (28, 86, 37), + (25, 79, 31), (30, 81, 20), (40, 90, 37), (51, 99, 54), + (50, 104, 59), (50, 110, 65), (51, 121, 74), (59, 131, 86), + (82, 138, 115), (86, 117, 123), (90, 97, 132), (114, 84, 127), + (139, 71, 123), (148, 70, 115), (157, 69, 107), (181, 79, 95), + (199, 100, 79), (210, 121, 59), (208, 131, 56), (206, 141, 53), + (206, 146, 62), (206, 152, 71), (204, 164, 92), (203, 169, 101), + (181, 186, 132), (167, 195, 144), (153, 205, 156), (144, 200, 153), + (136, 195, 151), (125, 192, 131), (112, 178, 116), (108, 161, 93), + (102, 146, 75), (121, 158, 40), (135, 164, 36), (149, 170, 33), + (161, 181, 35), (173, 193, 38), (186, 216, 46), (202, 227, 57), + (221, 229, 84), (223, 221, 91), (226, 214, 98), (223, 209, 93), + (221, 205, 88), (224, 196, 78), (221, 177, 69), (213, 164, 65), + (200, 162, 53), (192, 158, 37), (191, 151, 35), (190, 144, 34), + (178, 138, 30), (163, 142, 34), (149, 150, 45), (143, 155, 57), + (130, 157, 84), (119, 171, 106), (108, 186, 129), (107, 191, 139), + (107, 196, 149), (101, 203, 165), (88, 206, 179), (67, 205, 185), + (53, 198, 182), (47, 180, 179), (47, 167, 182), (48, 155, 185), + (57, 124, 186), (60, 95, 179), (91, 82, 178), (115, 67, 188), + (133, 49, 181), (140, 62, 178), (148, 76, 175), (149, 81, 176), + (150, 87, 178), (122, 107, 168), (97, 121, 159), (77, 122, 163), + (66, 103, 182), (36, 108, 189), (33, 107, 189), (31, 107, 190), + (33, 86, 203), (40, 80, 222), (45, 100, 230), (53, 120, 233), + (56, 120, 227), (54, 127, 225), (53, 134, 223), (50, 155, 223), + (42, 171, 222), (46, 171, 212), (55, 164, 198), (75, 166, 197), + (88, 164, 191), (118, 114, 151), (123, 101, 146), (129, 88, 141), + (131, 70, 135), (129, 59, 128), (129, 57, 124), (123, 66, 136), + (135, 111, 176), (146, 124, 184), (157, 137, 193), (171, 168, 195), + (183, 189, 188), (196, 207, 174), (209, 207, 160), (224, 211, 128), + (224, 213, 96), (224, 220, 67), (223, 211, 48), (225, 193, 34), + (220, 174, 28), (210, 161, 36), (207, 151, 42), (205, 139, 53), + (178, 142, 103), (173, 147, 118), (168, 152, 133), (176, 161, 157), + (195, 177, 175), (199, 174, 182), (190, 167, 185), (183, 155, 174), + (190, 165, 163), (187, 155, 143), (170, 148, 126), (153, 151, 110), + (145, 177, 104), (140, 198, 106), (122, 211, 115), (107, 226, 135), + (95, 230, 147), (89, 226, 153), (79, 206, 149), (70, 182, 144), + (62, 151, 140), (56, 128, 140), (50, 107, 145), (40, 84, 144), + (48, 53, 152), (69, 40, 160), (87, 49, 182), (82, 72, 194), + (80, 94, 215), (97, 114, 227), (122, 138, 236), (132, 168, 235), + (134, 201, 237), (143, 221, 241), (159, 231, 243), (173, 238, 243), + (179, 241, 239), (183, 238, 230), (192, 235, 216), (203, 237, 201), + (194, 235, 175), (180, 221, 151), (165, 205, 123), (164, 195, 101), + (158, 193, 69), (154, 186, 50), (148, 177, 40), (149, 167, 47), + (151, 167, 50), (159, 176, 64), (162, 187, 80), (163, 198, 115), + (158, 204, 137), (155, 208, 166), (151, 211, 177), (146, 215, 192), + (135, 216, 200), (126, 208, 214), (115, 199, 216), (107, 190, 211), + (99, 189, 207), (101, 183, 215), (91, 178, 225), (78, 178, 230), + (72, 187, 227), (86, 187, 230), (97, 179, 226), (102, 167, 220), + (115, 161, 198), (134, 158, 169), (118, 154, 129), (101, 149, 106) + ), + +// 566 Foamy_Waves +((40, 46, 134), (48, 54, 142), (51, 57, 146), (55, 61, 151), + (58, 68, 156), (62, 75, 162), (62, 77, 164), (63, 80, 166), + (63, 86, 169), (61, 89, 169), (60, 93, 169), (58, 94, 169), + (56, 95, 169), (54, 95, 167), (52, 96, 166), (50, 95, 165), + (49, 95, 165), (44, 93, 162), (40, 88, 159), (36, 84, 156), + (31, 79, 149), (26, 75, 143), (23, 73, 140), (21, 71, 137), + (13, 64, 126), (11, 62, 122), (10, 61, 119), (10, 64, 119), + (11, 67, 119), (12, 70, 121), (14, 74, 123), (21, 81, 127), + (29, 92, 131), (59, 106, 132), (72, 113, 133), (86, 120, 135), + (100, 130, 138), (115, 140, 141), (122, 141, 138), (130, 142, 136), + (166, 168, 147), (169, 172, 159), (173, 177, 171), (180, 182, 176), + (187, 187, 181), (189, 188, 182), (191, 190, 184), (191, 184, 185), + (191, 184, 188), (185, 173, 180), (182, 163, 167), (179, 153, 154), + (170, 145, 154), (162, 138, 154), (155, 130, 152), (149, 123, 150), + (108, 98, 131), (91, 84, 127), (75, 70, 123), (57, 55, 119), + (40, 41, 115), (33, 37, 113), (26, 33, 111), (18, 27, 100), + (13, 23, 92), (7, 19, 79), (8, 24, 76), (9, 29, 73), + (9, 30, 71), (10, 31, 70), (13, 36, 70), (15, 39, 70), + (15, 45, 71), (14, 45, 69), (14, 46, 67), (13, 45, 64), + (13, 45, 62), (13, 45, 61), (13, 45, 60), (13, 43, 56), + (13, 43, 55), (14, 46, 55), (14, 49, 58), (15, 53, 62), + (16, 54, 63), (17, 55, 64), (18, 55, 67), (18, 56, 69), + (18, 54, 73), (18, 52, 72), (18, 50, 71), (18, 48, 70), + (18, 47, 69), (18, 43, 66), (17, 40, 64), (17, 39, 64), + (15, 36, 66), (14, 35, 74), (15, 37, 79), (17, 39, 85), + (17, 39, 87), (18, 40, 90), (21, 45, 97), (22, 48, 101), + (25, 50, 105), (28, 56, 106), (32, 62, 108), (34, 65, 108), + (36, 68, 108), (39, 72, 108), (40, 73, 107), (41, 78, 108), + (41, 80, 109), (48, 92, 116), (49, 94, 117), (51, 96, 119), + (52, 100, 123), (54, 103, 126), (54, 104, 127), (52, 104, 127), + (47, 104, 123), (43, 101, 119), (40, 98, 116), (38, 97, 113), + (36, 96, 111), (32, 93, 105), (29, 88, 100), (26, 82, 94), + (24, 78, 90), (18, 64, 82), (17, 60, 80), (17, 56, 79), + (14, 53, 77), (13, 46, 73), (11, 38, 70), (6, 32, 67), + (0, 23, 63), (0, 21, 61), (0, 20, 59), (0, 20, 58), + (0, 20, 58), (0, 18, 56), (0, 18, 55), (0, 17, 54), + (0, 17, 54), (0, 11, 52), (0, 10, 51), (0, 10, 51), + (0, 7, 49), (0, 7, 49), (0, 6, 48), (0, 6, 48), + (0, 8, 49), (0, 8, 49), (0, 8, 49), (0, 10, 51), + (0, 11, 52), (0, 13, 54), (0, 14, 56), (0, 15, 58), + (0, 16, 59), (0, 19, 62), (0, 19, 62), (0, 19, 62), + (0, 21, 63), (0, 24, 64), (0, 26, 66), (0, 26, 67), + (0, 34, 73), (0, 34, 74), (0, 35, 75), (0, 36, 78), + (0, 36, 81), (0, 38, 85), (0, 41, 88), (0, 39, 90), + (0, 38, 93), (0, 36, 94), (0, 35, 97), (0, 32, 98), + (0, 31, 100), (0, 27, 103), (0, 24, 105), (0, 23, 108), + (0, 15, 113), (0, 14, 115), (0, 13, 117), (0, 12, 123), + (0, 10, 128), (0, 8, 134), (1, 5, 139), (3, 5, 146), + (9, 7, 151), (17, 10, 157), (20, 13, 162), (24, 14, 168), + (28, 15, 172), (30, 17, 175), (28, 15, 177), (28, 15, 179), + (25, 14, 180), (22, 14, 181), (19, 14, 183), (16, 14, 184), + (14, 14, 184), (15, 17, 184), (15, 23, 183), (15, 26, 180), + (15, 28, 177), (15, 30, 173), (13, 31, 168), (10, 32, 162), + (6, 31, 157), (3, 30, 151), (1, 30, 147), (0, 31, 146), + (0, 31, 145), (0, 31, 145), (0, 31, 145), (0, 29, 146), + (0, 27, 147), (0, 27, 149), (0, 27, 150), (0, 24, 149), + (0, 24, 147), (0, 24, 145), (0, 26, 142), (0, 20, 139), + (0, 23, 138), (0, 22, 137), (0, 16, 137), (0, 16, 137), + (0, 13, 137), (0, 9, 137), (1, 7, 137), (3, 9, 135), + (5, 11, 134), (6, 12, 130), (7, 14, 126), (9, 16, 120), + (10, 16, 113), (10, 16, 109), (10, 16, 105), (11, 17, 104), + (13, 17, 103), (14, 17, 103), (17, 20, 105), (18, 18, 108), + (24, 21, 112), (25, 22, 116), (28, 25, 120), (32, 28, 123), + (33, 30, 124), (33, 32, 127), (35, 35, 128), (37, 40, 131) + ), + +// 567 For_Lenora +((169, 132, 163), (182, 138, 195), (176, 127, 195), (170, 117, 196), + (162, 104, 191), (154, 92, 187), (147, 81, 179), (141, 71, 171), + (111, 41, 143), (99, 39, 127), (88, 37, 112), (79, 39, 108), + (71, 42, 104), (69, 48, 107), (68, 54, 110), (69, 58, 117), + (70, 63, 125), (76, 91, 148), (88, 109, 163), (101, 128, 179), + (122, 143, 189), (144, 159, 199), (153, 167, 204), (163, 175, 210), + (171, 193, 224), (169, 190, 221), (167, 187, 219), (156, 179, 219), + (146, 171, 219), (134, 163, 214), (122, 155, 209), (105, 140, 189), + (93, 125, 166), (78, 117, 133), (64, 115, 108), (51, 113, 83), + (42, 116, 68), (33, 120, 53), (29, 119, 48), (26, 118, 44), + (33, 113, 45), (39, 101, 48), (46, 90, 52), (58, 78, 57), + (70, 67, 62), (75, 62, 63), (81, 58, 65), (80, 52, 71), + (76, 51, 78), (58, 38, 96), (59, 39, 102), (60, 40, 109), + (56, 34, 121), (53, 28, 134), (59, 23, 136), (65, 19, 139), + (91, 22, 134), (88, 19, 130), (86, 17, 127), (90, 15, 119), + (95, 14, 111), (91, 16, 109), (88, 18, 108), (84, 19, 109), + (85, 24, 107), (92, 23, 95), (86, 27, 93), (81, 31, 92), + (80, 33, 88), (80, 36, 85), (78, 34, 76), (68, 27, 65), + (44, 25, 53), (38, 20, 47), (32, 15, 41), (26, 18, 37), + (21, 22, 33), (20, 22, 39), (19, 23, 45), (20, 14, 51), + (20, 14, 53), (34, 19, 69), (49, 12, 83), (64, 5, 98), + (69, 9, 101), (75, 13, 104), (76, 27, 104), (72, 44, 97), + (73, 88, 91), (75, 107, 90), (77, 126, 90), (74, 126, 93), + (72, 126, 97), (72, 126, 97), (80, 110, 103), (94, 94, 114), + (107, 75, 131), (122, 51, 140), (125, 43, 140), (128, 36, 140), + (129, 37, 134), (131, 39, 129), (136, 45, 114), (140, 47, 102), + (131, 37, 94), (121, 29, 81), (112, 21, 69), (108, 22, 64), + (105, 23, 59), (94, 30, 60), (83, 31, 58), (71, 32, 55), + (66, 33, 50), (73, 40, 49), (75, 44, 52), (78, 48, 56), + (89, 56, 66), (113, 69, 79), (137, 77, 98), (159, 98, 115), + (187, 129, 139), (196, 142, 158), (206, 155, 177), (208, 160, 185), + (211, 165, 194), (215, 172, 196), (216, 169, 196), (209, 168, 195), + (192, 164, 194), (160, 146, 156), (153, 138, 144), (147, 130, 133), + (121, 114, 123), (97, 95, 107), (79, 79, 88), (73, 63, 73), + (69, 46, 73), (75, 46, 70), (82, 47, 68), (87, 51, 70), + (93, 55, 72), (102, 59, 86), (111, 68, 104), (118, 79, 123), + (130, 98, 139), (146, 119, 173), (144, 118, 181), (142, 117, 190), + (140, 114, 200), (137, 113, 199), (141, 106, 189), (136, 99, 169), + (114, 74, 130), (108, 71, 120), (103, 68, 111), (96, 71, 85), + (96, 79, 64), (89, 85, 47), (82, 91, 42), (77, 93, 44), + (81, 105, 61), (102, 139, 102), (103, 138, 110), (104, 138, 119), + (100, 128, 137), (93, 121, 147), (91, 126, 147), (91, 134, 143), + (106, 134, 137), (111, 135, 139), (117, 136, 141), (130, 149, 142), + (136, 155, 150), (149, 152, 146), (151, 132, 157), (148, 114, 159), + (131, 91, 162), (118, 71, 140), (98, 49, 121), (80, 37, 96), + (57, 31, 79), (46, 36, 58), (36, 44, 47), (30, 60, 36), + (21, 81, 19), (22, 82, 23), (23, 83, 28), (33, 84, 42), + (50, 88, 55), (71, 91, 57), (96, 90, 69), (121, 89, 84), + (142, 89, 104), (163, 102, 112), (186, 101, 120), (205, 99, 127), + (215, 95, 141), (218, 108, 150), (220, 116, 160), (216, 117, 169), + (210, 120, 182), (206, 130, 193), (205, 145, 202), (200, 154, 211), + (200, 165, 218), (204, 170, 220), (201, 169, 214), (191, 159, 205), + (183, 147, 196), (177, 135, 177), (160, 119, 157), (135, 105, 141), + (114, 92, 133), (106, 83, 124), (100, 75, 120), (100, 76, 125), + (108, 89, 138), (126, 107, 153), (140, 122, 170), (143, 133, 185), + (144, 142, 196), (148, 150, 201), (152, 147, 203), (149, 146, 197), + (143, 141, 195), (142, 140, 196), (146, 132, 199), (162, 134, 197), + (178, 142, 197), (194, 156, 206), (202, 167, 218), (215, 179, 226), + (225, 187, 227), (231, 193, 226), (226, 195, 227), (217, 193, 228), + (199, 189, 222), (182, 172, 205), (162, 154, 188), (145, 140, 167), + (123, 145, 143), (111, 146, 117), (106, 136, 99), (108, 120, 91), + (113, 114, 85), (118, 121, 88), (126, 121, 96), (127, 111, 108), + (133, 96, 118), (139, 85, 126), (144, 81, 130), (146, 80, 129), + (150, 90, 140), (159, 95, 144), (158, 106, 147), (164, 112, 142) + ), + +// 568 For_Stacy +((169, 133, 132), (195, 138, 160), (195, 127, 157), (196, 117, 155), + (191, 104, 147), (187, 92, 140), (179, 81, 128), (171, 71, 116), + (143, 41, 88), (127, 39, 80), (112, 37, 72), (108, 39, 78), + (104, 42, 84), (107, 48, 94), (110, 54, 104), (116, 58, 114), + (123, 63, 125), (122, 76, 148), (131, 88, 163), (140, 101, 179), + (158, 122, 189), (176, 144, 199), (183, 153, 204), (191, 163, 210), + (194, 171, 224), (193, 169, 221), (192, 167, 219), (187, 156, 219), + (183, 146, 219), (173, 134, 214), (163, 122, 209), (141, 105, 189), + (123, 93, 166), (85, 78, 133), (68, 84, 123), (51, 90, 113), + (42, 101, 116), (33, 113, 120), (29, 113, 119), (26, 113, 118), + (33, 113, 113), (39, 101, 101), (46, 90, 89), (56, 80, 75), + (66, 70, 62), (73, 70, 60), (81, 70, 58), (80, 56, 52), + (78, 51, 57), (96, 38, 84), (102, 39, 92), (109, 40, 100), + (121, 34, 112), (134, 28, 125), (136, 23, 118), (139, 19, 111), + (134, 22, 82), (130, 19, 78), (127, 17, 74), (119, 15, 59), + (111, 14, 44), (109, 16, 47), (108, 18, 51), (109, 19, 58), + (107, 24, 58), (95, 23, 37), (93, 27, 44), (92, 31, 51), + (88, 33, 49), (85, 36, 48), (78, 34, 38), (68, 27, 30), + (53, 25, 38), (47, 20, 33), (41, 15, 28), (35, 18, 30), + (30, 21, 33), (33, 20, 39), (37, 19, 45), (51, 14, 50), + (53, 14, 53), (69, 19, 61), (83, 12, 57), (98, 5, 53), + (101, 9, 54), (104, 13, 55), (104, 27, 67), (97, 44, 76), + (73, 73, 91), (75, 96, 108), (77, 120, 126), (74, 114, 126), + (72, 109, 126), (72, 109, 126), (80, 91, 110), (111, 94, 114), + (131, 75, 108), (140, 51, 82), (140, 43, 72), (140, 36, 63), + (135, 37, 57), (131, 39, 51), (136, 54, 45), (140, 72, 47), + (131, 60, 37), (121, 55, 29), (112, 50, 21), (108, 53, 22), + (105, 57, 23), (94, 54, 30), (83, 48, 31), (71, 42, 32), + (66, 44, 33), (73, 59, 40), (75, 62, 44), (78, 65, 48), + (89, 74, 56), (113, 96, 69), (137, 107, 77), (159, 133, 98), + (187, 169, 129), (196, 172, 142), (206, 176, 155), (208, 175, 160), + (211, 175, 165), (215, 185, 172), (216, 183, 169), (209, 176, 168), + (194, 164, 171), (160, 148, 146), (153, 144, 138), (147, 141, 130), + (123, 114, 117), (107, 95, 107), (86, 79, 88), (73, 63, 64), + (73, 46, 54), (77, 50, 50), (82, 55, 47), (87, 62, 51), + (93, 70, 55), (102, 68, 59), (111, 68, 68), (123, 79, 91), + (139, 98, 113), (173, 119, 154), (181, 118, 165), (190, 117, 176), + (200, 114, 187), (199, 113, 188), (189, 106, 167), (169, 99, 142), + (130, 74, 98), (120, 71, 90), (111, 68, 82), (96, 78, 71), + (86, 96, 64), (57, 89, 47), (42, 91, 43), (44, 93, 53), + (61, 105, 78), (102, 139, 133), (103, 133, 135), (104, 128, 138), + (104, 100, 137), (111, 93, 147), (104, 91, 147), (92, 91, 143), + (106, 107, 137), (112, 112, 139), (119, 117, 141), (130, 140, 149), + (136, 144, 155), (146, 152, 148), (157, 132, 142), (159, 114, 132), + (162, 91, 132), (140, 71, 103), (121, 49, 82), (96, 37, 61), + (79, 31, 60), (58, 36, 51), (37, 36, 47), (30, 58, 60), + (19, 81, 69), (21, 82, 74), (23, 83, 79), (33, 82, 84), + (50, 88, 87), (57, 91, 72), (79, 96, 69), (121, 120, 84), + (142, 119, 89), (163, 144, 102), (186, 155, 101), (205, 161, 99), + (215, 151, 95), (218, 159, 108), (220, 161, 116), (216, 148, 117), + (210, 135, 120), (206, 131, 130), (205, 145, 151), (211, 154, 174), + (218, 165, 191), (220, 170, 194), (214, 169, 189), (205, 159, 180), + (196, 147, 168), (177, 135, 141), (160, 119, 122), (141, 105, 116), + (133, 92, 117), (124, 83, 107), (120, 75, 102), (125, 76, 109), + (138, 89, 127), (153, 107, 141), (170, 122, 159), (185, 133, 183), + (190, 142, 196), (192, 148, 201), (200, 147, 203), (193, 146, 197), + (189, 141, 195), (190, 140, 196), (199, 132, 195), (197, 134, 178), + (197, 142, 170), (206, 156, 175), (218, 167, 191), (226, 179, 197), + (227, 187, 195), (231, 193, 194), (227, 195, 201), (228, 193, 210), + (222, 189, 217), (205, 172, 200), (188, 154, 185), (167, 140, 166), + (123, 128, 145), (111, 145, 146), (99, 136, 124), (91, 120, 99), + (88, 114, 85), (90, 121, 88), (105, 126, 96), (127, 127, 108), + (133, 105, 96), (139, 89, 85), (144, 85, 81), (146, 86, 80), + (150, 91, 90), (159, 100, 95), (158, 109, 106), (164, 126, 112) + ), + +// 569 Forest +((45, 71, 45), (42, 66, 42), (39, 61, 41), (36, 56, 41), + (32, 49, 35), (29, 42, 29), (32, 33, 27), (35, 25, 25), + (35, 25, 25), (35, 25, 25), (35, 25, 25), (35, 25, 25), + (35, 25, 25), (30, 30, 25), (25, 36, 25), (25, 36, 25), + (25, 37, 25), (33, 43, 28), (40, 48, 30), (47, 54, 32), + (54, 60, 33), (62, 67, 35), (65, 70, 35), (69, 74, 36), + (80, 84, 39), (84, 88, 41), (89, 93, 43), (92, 96, 44), + (96, 100, 45), (96, 100, 45), (97, 101, 45), (95, 101, 45), + (94, 100, 45), (88, 92, 41), (83, 87, 40), (78, 82, 39), + (72, 77, 37), (67, 72, 36), (63, 70, 36), (60, 68, 36), + (54, 64, 34), (51, 64, 34), (48, 64, 35), (50, 65, 36), + (52, 67, 38), (54, 68, 38), (56, 70, 39), (56, 73, 41), + (54, 75, 43), (57, 79, 44), (57, 79, 44), (58, 80, 44), + (57, 78, 43), (57, 77, 43), (55, 76, 43), (54, 75, 43), + (45, 67, 41), (40, 62, 38), (36, 58, 36), (33, 53, 35), + (31, 49, 35), (30, 47, 34), (29, 45, 34), (27, 41, 34), + (26, 38, 38), (35, 25, 25), (35, 25, 25), (35, 25, 25), + (35, 25, 25), (35, 25, 25), (35, 25, 25), (35, 25, 25), + (25, 37, 25), (26, 40, 29), (28, 43, 33), (31, 48, 36), + (35, 54, 39), (36, 57, 42), (38, 61, 45), (43, 70, 51), + (55, 82, 51), (88, 109, 62), (98, 118, 65), (109, 127, 69), + (113, 130, 70), (118, 133, 72), (119, 136, 71), (117, 136, 71), + (116, 133, 69), (117, 131, 67), (118, 130, 66), (116, 128, 64), + (115, 126, 62), (114, 121, 60), (111, 113, 56), (101, 105, 49), + (86, 91, 44), (65, 70, 34), (61, 64, 31), (57, 59, 28), + (56, 58, 27), (56, 58, 27), (58, 58, 28), (59, 61, 29), + (61, 61, 31), (58, 61, 31), (56, 61, 32), (56, 60, 31), + (56, 59, 31), (56, 59, 31), (58, 58, 30), (59, 59, 29), + (58, 58, 29), (55, 55, 28), (53, 53, 28), (51, 51, 28), + (47, 47, 27), (42, 42, 27), (38, 38, 26), (36, 26, 26), + (35, 25, 25), (35, 25, 25), (35, 25, 25), (35, 25, 25), + (35, 25, 25), (35, 25, 25), (35, 25, 25), (35, 25, 25), + (35, 25, 25), (35, 25, 25), (35, 25, 25), (35, 25, 25), + (35, 25, 25), (35, 25, 25), (25, 36, 25), (36, 36, 25), + (33, 38, 24), (33, 38, 24), (33, 38, 24), (35, 37, 24), + (37, 37, 24), (37, 37, 24), (37, 37, 25), (37, 37, 25), + (37, 37, 25), (30, 40, 25), (31, 40, 25), (33, 41, 25), + (31, 41, 26), (31, 41, 26), (27, 41, 27), (26, 41, 31), + (27, 42, 37), (27, 43, 35), (28, 44, 33), (29, 47, 34), + (31, 51, 39), (34, 56, 38), (37, 62, 37), (40, 67, 43), + (44, 71, 44), (54, 83, 50), (55, 87, 53), (56, 91, 56), + (67, 103, 63), (72, 116, 72), (81, 131, 85), (92, 147, 96), + (115, 178, 120), (120, 184, 122), (125, 191, 125), (129, 200, 143), + (132, 206, 146), (136, 209, 145), (134, 209, 151), (132, 209, 145), + (133, 208, 133), (139, 206, 130), (151, 205, 128), (156, 200, 123), + (155, 193, 117), (152, 184, 109), (137, 169, 101), (123, 153, 89), + (93, 119, 64), (88, 111, 59), (84, 104, 55), (79, 91, 46), + (74, 83, 40), (73, 77, 36), (66, 71, 34), (59, 66, 33), + (52, 62, 32), (49, 57, 31), (44, 54, 32), (42, 53, 32), + (41, 53, 33), (46, 56, 33), (50, 59, 34), (60, 63, 36), + (65, 68, 37), (72, 72, 38), (78, 78, 41), (80, 85, 46), + (89, 94, 50), (97, 107, 58), (108, 121, 66), (115, 134, 74), + (121, 143, 80), (129, 148, 82), (133, 151, 83), (134, 152, 83), + (131, 152, 82), (137, 154, 81), (142, 161, 82), (151, 172, 87), + (158, 184, 95), (163, 195, 103), (171, 205, 112), (184, 212, 114), + (188, 213, 114), (190, 210, 111), (184, 203, 105), (187, 198, 97), + (185, 196, 94), (184, 194, 92), (177, 194, 94), (179, 192, 95), + (174, 190, 98), (171, 186, 98), (157, 177, 95), (146, 164, 88), + (136, 148, 78), (120, 132, 67), (101, 115, 59), (88, 100, 51), + (73, 88, 47), (65, 79, 44), (58, 72, 41), (50, 66, 38), + (41, 60, 37), (35, 56, 39), (33, 52, 33), (32, 51, 32), + (33, 52, 33), (34, 55, 34), (41, 60, 37), (41, 66, 41), + (45, 72, 45), (45, 71, 45), (43, 70, 43), (42, 69, 46), + (42, 68, 45), (42, 67, 42), (44, 66, 40), (41, 66, 41) + ), + +// 570 Frivolous +((36, 180, 78), (49, 157, 77), (71, 156, 68), (93, 155, 59), + (123, 140, 55), (154, 125, 51), (165, 118, 52), (176, 112, 54), + (210, 76, 47), (202, 78, 49), (195, 80, 52), (179, 86, 47), + (163, 93, 43), (157, 103, 43), (152, 113, 44), (145, 121, 41), + (139, 129, 38), (137, 135, 28), (151, 133, 34), (165, 132, 41), + (170, 130, 43), (176, 128, 46), (183, 127, 45), (190, 127, 44), + (212, 131, 44), (221, 129, 44), (230, 128, 45), (225, 126, 38), + (221, 124, 32), (216, 121, 32), (211, 118, 33), (199, 110, 41), + (182, 115, 48), (168, 124, 68), (176, 138, 91), (184, 153, 114), + (194, 167, 136), (205, 182, 159), (215, 189, 170), (226, 196, 181), + (249, 219, 196), (251, 215, 189), (253, 212, 182), (252, 199, 153), + (251, 187, 124), (251, 179, 112), (251, 172, 101), (253, 156, 78), + (249, 139, 58), (242, 122, 24), (236, 120, 25), (230, 119, 27), + (224, 115, 30), (219, 111, 34), (216, 113, 36), (214, 115, 38), + (187, 118, 54), (176, 125, 68), (166, 132, 83), (168, 139, 93), + (170, 147, 104), (172, 154, 110), (174, 162, 117), (176, 183, 135), + (168, 193, 148), (170, 196, 143), (157, 192, 133), (145, 188, 124), + (137, 178, 116), (129, 169, 109), (124, 146, 86), (131, 127, 79), + (156, 86, 55), (172, 78, 50), (188, 71, 46), (208, 72, 46), + (229, 73, 46), (233, 76, 45), (238, 79, 45), (237, 90, 44), + (238, 96, 43), (248, 100, 45), (239, 105, 50), (230, 110, 56), + (224, 112, 57), (219, 115, 59), (207, 122, 63), (188, 134, 72), + (146, 153, 82), (133, 154, 80), (120, 156, 79), (115, 155, 81), + (110, 154, 83), (109, 151, 85), (113, 142, 84), (122, 130, 77), + (137, 116, 75), (176, 95, 72), (193, 95, 75), (210, 95, 79), + (217, 98, 84), (225, 101, 89), (236, 105, 101), (242, 110, 104), + (249, 143, 133), (249, 154, 146), (250, 165, 159), (247, 164, 157), + (245, 164, 156), (239, 159, 149), (234, 162, 145), (233, 160, 136), + (225, 150, 125), (197, 121, 95), (194, 120, 91), (192, 119, 87), + (187, 116, 84), (178, 110, 83), (160, 101, 79), (147, 99, 76), + (126, 92, 63), (119, 87, 62), (112, 82, 62), (108, 79, 63), + (104, 76, 65), (104, 71, 60), (108, 66, 62), (125, 76, 69), + (147, 87, 89), (183, 101, 107), (190, 108, 105), (197, 115, 104), + (214, 129, 102), (230, 135, 100), (243, 134, 99), (247, 137, 91), + (243, 139, 79), (244, 139, 84), (246, 139, 89), (243, 139, 92), + (241, 140, 96), (239, 138, 98), (240, 136, 99), (241, 130, 103), + (238, 118, 105), (219, 82, 97), (212, 73, 93), (206, 65, 90), + (205, 58, 83), (199, 55, 81), (203, 61, 86), (201, 70, 88), + (214, 106, 88), (220, 117, 93), (226, 129, 99), (233, 149, 111), + (231, 165, 112), (220, 173, 104), (208, 172, 96), (193, 169, 99), + (176, 159, 98), (147, 120, 68), (142, 112, 61), (137, 104, 54), + (129, 92, 46), (128, 86, 47), (137, 75, 48), (145, 74, 44), + (148, 100, 55), (157, 108, 63), (166, 117, 71), (183, 133, 77), + (197, 154, 68), (205, 172, 61), (215, 180, 57), (219, 175, 61), + (226, 175, 52), (236, 172, 37), (242, 163, 25), (243, 150, 33), + (236, 141, 46), (234, 134, 52), (236, 123, 50), (234, 114, 51), + (216, 112, 55), (212, 112, 53), (208, 112, 51), (201, 110, 46), + (201, 108, 55), (203, 115, 67), (208, 125, 85), (214, 140, 99), + (220, 155, 111), (222, 179, 124), (218, 187, 126), (202, 186, 130), + (184, 169, 122), (162, 161, 120), (146, 143, 101), (121, 122, 88), + (102, 91, 77), (96, 68, 77), (111, 48, 76), (135, 41, 72), + (151, 38, 68), (171, 45, 64), (190, 56, 66), (212, 69, 68), + (218, 81, 73), (216, 87, 82), (212, 98, 92), (212, 110, 100), + (214, 118, 106), (211, 112, 110), (213, 99, 108), (219, 92, 104), + (231, 89, 99), (240, 82, 90), (237, 70, 79), (227, 61, 71), + (215, 66, 70), (214, 75, 74), (211, 94, 80), (204, 108, 89), + (196, 123, 101), (200, 131, 114), (211, 143, 124), (222, 148, 128), + (226, 148, 132), (230, 134, 136), (235, 117, 138), (241, 106, 131), + (246, 108, 124), (244, 108, 116), (234, 100, 109), (219, 94, 100), + (205, 99, 94), (187, 111, 89), (166, 118, 85), (140, 115, 80), + (117, 108, 76), (102, 105, 74), (91, 112, 72), (85, 116, 74), + (81, 114, 77), (81, 112, 80), (80, 119, 77), (75, 127, 76), + (73, 129, 76), (70, 131, 82), (69, 139, 80), (62, 149, 78), + (52, 152, 74), (43, 145, 77), (38, 148, 79), (38, 166, 78) + ), + +// 571 Fun_Stuff +((41, 88, 87), (43, 107, 62), (54, 105, 64), (66, 103, 66), + (86, 105, 67), (107, 107, 69), (115, 112, 62), (124, 117, 56), + (139, 127, 28), (147, 127, 23), (156, 128, 18), (168, 129, 19), + (181, 130, 20), (183, 126, 18), (185, 123, 17), (182, 120, 19), + (179, 117, 22), (153, 112, 44), (148, 108, 54), (144, 104, 64), + (152, 91, 73), (160, 78, 83), (162, 74, 88), (165, 70, 93), + (161, 77, 108), (159, 81, 106), (157, 86, 105), (155, 87, 105), + (153, 89, 105), (149, 91, 104), (145, 94, 104), (133, 101, 98), + (119, 115, 88), (85, 134, 65), (72, 143, 64), (59, 152, 64), + (48, 151, 57), (38, 151, 51), (37, 150, 47), (37, 149, 43), + (35, 136, 37), (41, 137, 50), (47, 139, 63), (62, 134, 66), + (78, 129, 69), (81, 125, 69), (85, 122, 69), (97, 109, 69), + (106, 95, 79), (114, 77, 92), (125, 73, 86), (136, 69, 80), + (141, 62, 74), (147, 56, 69), (142, 53, 70), (137, 51, 71), + (115, 42, 76), (107, 39, 74), (99, 37, 73), (92, 40, 74), + (85, 43, 76), (81, 44, 78), (78, 45, 81), (72, 50, 88), + (72, 57, 93), (85, 75, 80), (96, 89, 67), (108, 104, 54), + (112, 110, 49), (116, 117, 45), (126, 125, 45), (135, 135, 39), + (155, 151, 27), (162, 154, 18), (170, 157, 10), (164, 151, 11), + (158, 146, 13), (151, 144, 13), (145, 143, 14), (133, 140, 15), + (125, 135, 15), (136, 112, 11), (136, 95, 14), (136, 78, 17), + (130, 74, 20), (125, 71, 23), (107, 70, 28), (98, 68, 33), + (94, 65, 39), (97, 57, 45), (101, 49, 51), (97, 47, 55), + (94, 46, 59), (88, 44, 66), (75, 47, 76), (59, 49, 82), + (53, 53, 86), (51, 57, 97), (54, 50, 100), (58, 43, 104), + (57, 38, 104), (56, 33, 105), (56, 27, 105), (56, 26, 107), + (58, 27, 102), (60, 24, 102), (62, 21, 102), (62, 18, 101), + (63, 15, 101), (65, 12, 102), (73, 16, 97), (82, 23, 89), + (97, 32, 81), (115, 45, 70), (113, 47, 70), (111, 50, 70), + (110, 55, 67), (107, 58, 63), (108, 61, 54), (108, 69, 41), + (103, 73, 26), (91, 72, 25), (79, 72, 24), (73, 69, 23), + (68, 67, 23), (53, 64, 18), (50, 57, 16), (50, 51, 12), + (48, 51, 11), (54, 45, 15), (54, 45, 18), (54, 46, 22), + (55, 42, 32), (59, 37, 42), (61, 35, 51), (63, 33, 59), + (78, 37, 76), (84, 43, 86), (90, 50, 97), (95, 53, 101), + (100, 57, 106), (110, 65, 112), (115, 71, 113), (127, 76, 115), + (135, 86, 114), (159, 111, 118), (165, 117, 116), (172, 124, 115), + (177, 139, 109), (185, 147, 104), (190, 150, 96), (193, 150, 97), + (201, 125, 101), (201, 125, 97), (201, 125, 94), (201, 128, 85), + (200, 130, 66), (193, 134, 51), (183, 130, 47), (172, 117, 43), + (156, 111, 36), (127, 122, 27), (117, 128, 22), (107, 134, 18), + (95, 147, 21), (83, 153, 26), (74, 151, 31), (75, 152, 39), + (67, 149, 51), (64, 149, 56), (62, 150, 62), (62, 150, 74), + (63, 145, 82), (79, 142, 82), (110, 131, 79), (129, 128, 70), + (141, 125, 61), (146, 121, 55), (140, 115, 52), (143, 108, 48), + (155, 93, 44), (162, 78, 44), (172, 70, 44), (182, 68, 42), + (181, 73, 37), (183, 73, 35), (185, 74, 34), (180, 66, 36), + (176, 52, 44), (180, 41, 49), (178, 38, 48), (173, 36, 43), + (171, 42, 34), (162, 46, 21), (145, 42, 17), (132, 31, 16), + (121, 23, 19), (114, 14, 21), (107, 10, 27), (101, 12, 27), + (90, 15, 29), (77, 13, 35), (66, 16, 45), (62, 17, 53), + (56, 17, 63), (58, 16, 71), (57, 16, 75), (56, 13, 76), + (56, 11, 79), (58, 10, 82), (57, 10, 82), (60, 8, 81), + (60, 6, 77), (59, 6, 73), (58, 13, 65), (60, 21, 62), + (64, 32, 53), (68, 41, 44), (73, 47, 37), (73, 46, 34), + (70, 47, 29), (62, 50, 32), (59, 54, 35), (55, 58, 37), + (56, 60, 38), (58, 54, 40), (60, 43, 42), (56, 33, 50), + (51, 26, 59), (46, 21, 68), (46, 17, 75), (47, 14, 82), + (51, 11, 88), (54, 8, 94), (61, 6, 100), (66, 10, 106), + (67, 16, 110), (66, 23, 113), (67, 27, 112), (63, 30, 114), + (66, 25, 114), (74, 23, 112), (78, 24, 113), (80, 25, 114), + (81, 26, 112), (73, 29, 114), (63, 27, 113), (60, 25, 110), + (57, 28, 105), (54, 36, 100), (53, 47, 91), (46, 49, 90), + (40, 49, 93), (37, 51, 97), (36, 57, 101), (38, 65, 99) + ), + +// 572 Getting_a_Tan +((129, 65, 31), (131, 65, 32), (128, 61, 30), (125, 58, 28), + (113, 45, 20), (102, 33, 13), (99, 32, 13), (97, 31, 13), + (91, 27, 10), (88, 26, 10), (85, 26, 10), (81, 27, 10), + (77, 28, 10), (76, 27, 10), (76, 27, 11), (79, 28, 11), + (82, 29, 12), (106, 43, 23), (116, 53, 25), (127, 63, 28), + (136, 70, 29), (145, 78, 31), (149, 79, 31), (154, 81, 32), + (167, 89, 34), (169, 91, 33), (172, 93, 33), (169, 89, 30), + (166, 86, 27), (161, 81, 25), (157, 76, 24), (145, 65, 18), + (134, 57, 15), (113, 43, 10), (102, 37, 11), (92, 32, 12), + (78, 24, 9), (64, 17, 7), (56, 14, 5), (49, 11, 4), + (24, 2, 0), (16, 1, 0), (9, 1, 0), (5, 1, 0), + (2, 1, 0), (1, 1, 0), (1, 1, 0), (2, 1, 0), + (3, 2, 2), (16, 8, 3), (28, 16, 8), (41, 24, 13), + (60, 40, 25), (79, 57, 37), (90, 67, 44), (101, 77, 52), + (144, 116, 78), (160, 126, 80), (176, 137, 82), (186, 143, 85), + (196, 149, 89), (197, 150, 89), (199, 152, 90), (198, 151, 92), + (190, 144, 86), (156, 106, 56), (134, 86, 42), (113, 66, 28), + (103, 58, 24), (94, 50, 21), (76, 39, 16), (60, 28, 11), + (34, 11, 2), (25, 6, 1), (17, 2, 0), (12, 1, 0), + (7, 1, 0), (6, 1, 0), (5, 1, 1), (4, 0, 1), + (3, 0, 1), (4, 0, 1), (4, 0, 1), (4, 0, 1), + (4, 0, 1), (4, 0, 1), (7, 1, 1), (10, 2, 2), + (25, 5, 1), (34, 8, 1), (43, 12, 1), (48, 13, 1), + (54, 15, 1), (63, 20, 2), (72, 25, 2), (84, 31, 5), + (97, 39, 8), (123, 55, 13), (131, 62, 13), (139, 70, 13), + (143, 73, 13), (147, 76, 14), (154, 83, 18), (164, 91, 23), + (186, 114, 46), (196, 130, 61), (206, 146, 76), (209, 154, 85), + (213, 163, 95), (220, 175, 115), (226, 185, 130), (232, 196, 151), + (239, 211, 167), (249, 236, 195), (250, 241, 199), (251, 246, 203), + (253, 251, 203), (251, 245, 195), (248, 237, 181), (246, 225, 167), + (246, 206, 139), (247, 205, 131), (249, 204, 124), (249, 202, 117), + (249, 201, 111), (244, 189, 99), (242, 167, 90), (236, 147, 76), + (232, 131, 69), (237, 117, 61), (233, 113, 58), (230, 109, 55), + (222, 97, 51), (203, 85, 43), (181, 67, 33), (163, 47, 23), + (137, 28, 11), (124, 26, 9), (111, 24, 8), (101, 24, 8), + (91, 24, 8), (72, 20, 7), (61, 17, 5), (54, 15, 5), + (51, 13, 4), (56, 12, 3), (59, 13, 3), (62, 14, 3), + (70, 16, 2), (74, 18, 1), (77, 20, 0), (76, 21, 0), + (78, 23, 2), (80, 25, 3), (83, 27, 5), (88, 31, 9), + (95, 36, 11), (98, 40, 14), (102, 47, 16), (107, 54, 20), + (116, 63, 24), (143, 97, 50), (151, 105, 59), (160, 114, 69), + (177, 135, 85), (193, 154, 98), (208, 167, 105), (214, 176, 110), + (222, 179, 111), (220, 176, 111), (218, 173, 111), (209, 166, 109), + (198, 154, 104), (181, 139, 95), (165, 121, 79), (147, 100, 63), + (129, 78, 48), (108, 57, 33), (88, 38, 20), (67, 25, 14), + (52, 17, 9), (42, 11, 6), (36, 8, 5), (32, 8, 4), + (27, 6, 2), (26, 6, 2), (25, 6, 2), (24, 6, 2), + (22, 4, 3), (20, 4, 4), (19, 4, 5), (18, 4, 6), + (16, 5, 7), (14, 6, 7), (12, 6, 7), (12, 6, 7), + (15, 7, 8), (21, 12, 11), (32, 21, 18), (47, 36, 25), + (67, 52, 36), (89, 71, 51), (111, 92, 68), (133, 112, 87), + (152, 132, 110), (171, 155, 130), (191, 174, 150), (210, 193, 167), + (227, 211, 179), (240, 222, 182), (247, 223, 180), (248, 220, 173), + (248, 211, 162), (248, 197, 149), (248, 186, 138), (246, 177, 125), + (240, 166, 106), (232, 153, 86), (219, 140, 71), (205, 122, 54), + (190, 105, 47), (174, 93, 45), (157, 83, 40), (143, 73, 35), + (126, 68, 33), (111, 61, 27), (98, 54, 24), (90, 50, 24), + (85, 47, 23), (87, 45, 19), (93, 47, 17), (101, 51, 14), + (111, 54, 12), (121, 62, 14), (131, 73, 19), (147, 83, 21), + (163, 97, 27), (180, 114, 37), (195, 134, 49), (207, 150, 61), + (215, 166, 75), (220, 173, 82), (226, 175, 83), (230, 172, 85), + (233, 174, 87), (233, 173, 88), (230, 175, 91), (220, 169, 93), + (211, 160, 88), (204, 145, 80), (201, 139, 78), (198, 128, 71), + (187, 114, 58), (172, 100, 51), (155, 87, 44), (138, 68, 31) + ), + +// 573 gipper +((190, 180, 144), (164, 160, 149), (146, 150, 148), (128, 141, 148), + (114, 129, 137), (101, 117, 126), (91, 110, 123), (82, 104, 121), + (66, 90, 114), (70, 91, 116), (75, 92, 118), (93, 97, 112), + (111, 103, 106), (122, 101, 102), (133, 100, 98), (141, 101, 94), + (149, 102, 91), (180, 104, 83), (185, 103, 77), (190, 103, 71), + (186, 97, 64), (183, 91, 57), (181, 89, 54), (179, 88, 51), + (175, 87, 48), (165, 85, 52), (156, 83, 57), (132, 77, 60), + (108, 71, 64), (99, 69, 65), (90, 67, 66), (72, 64, 67), + (65, 66, 70), (69, 70, 75), (58, 67, 78), (47, 64, 82), + (34, 55, 83), (21, 47, 85), (16, 45, 86), (12, 43, 88), + (29, 49, 88), (36, 53, 89), (43, 58, 90), (43, 58, 91), + (44, 59, 92), (44, 60, 93), (45, 61, 94), (28, 53, 93), + (33, 55, 94), (47, 58, 92), (47, 57, 91), (48, 57, 91), + (39, 53, 90), (30, 49, 90), (23, 46, 90), (16, 44, 90), + (14, 40, 85), (14, 40, 85), (14, 40, 86), (15, 41, 88), + (16, 43, 90), (16, 44, 91), (16, 45, 92), (16, 47, 94), + (16, 48, 95), (16, 50, 98), (16, 50, 98), (17, 50, 98), + (17, 49, 98), (17, 49, 98), (16, 48, 97), (15, 46, 95), + (14, 45, 93), (13, 45, 93), (13, 45, 93), (13, 45, 93), + (13, 45, 94), (13, 45, 94), (13, 45, 94), (14, 45, 95), + (13, 47, 97), (14, 51, 100), (15, 54, 103), (17, 57, 107), + (24, 58, 109), (31, 59, 111), (48, 63, 115), (65, 69, 116), + (100, 86, 123), (111, 97, 125), (122, 109, 127), (129, 110, 130), + (136, 112, 133), (152, 112, 142), (169, 110, 138), (186, 112, 134), + (201, 113, 132), (220, 131, 116), (217, 131, 117), (214, 132, 118), + (208, 127, 117), (203, 122, 116), (188, 112, 114), (170, 99, 115), + (142, 90, 107), (129, 92, 105), (117, 94, 104), (111, 92, 105), + (106, 90, 107), (90, 86, 112), (74, 80, 116), (60, 75, 120), + (46, 71, 123), (26, 70, 125), (25, 69, 124), (25, 69, 124), + (25, 68, 124), (24, 68, 123), (23, 67, 121), (23, 66, 121), + (21, 65, 120), (21, 64, 119), (21, 64, 119), (21, 64, 119), + (21, 64, 119), (22, 64, 118), (22, 63, 117), (21, 63, 115), + (21, 62, 114), (20, 60, 111), (20, 59, 111), (20, 59, 111), + (19, 58, 109), (18, 56, 106), (18, 54, 103), (17, 51, 98), + (15, 45, 87), (15, 41, 83), (15, 38, 79), (14, 36, 77), + (13, 35, 75), (11, 33, 74), (10, 31, 72), (8, 30, 71), + (7, 30, 71), (9, 30, 70), (9, 30, 70), (10, 31, 71), + (10, 32, 73), (11, 33, 76), (16, 32, 79), (29, 35, 81), + (67, 48, 82), (77, 52, 82), (88, 56, 82), (108, 68, 84), + (121, 82, 89), (133, 93, 96), (150, 103, 100), (167, 111, 102), + (184, 120, 101), (215, 134, 89), (211, 135, 90), (208, 137, 92), + (194, 139, 95), (178, 138, 100), (159, 132, 104), (140, 123, 105), + (118, 110, 93), (108, 104, 91), (98, 98, 89), (80, 88, 88), + (64, 82, 91), (58, 76, 95), (56, 69, 102), (57, 65, 110), + (58, 65, 111), (57, 66, 111), (57, 66, 111), (46, 66, 114), + (46, 68, 115), (48, 68, 116), (60, 71, 120), (61, 72, 123), + (60, 73, 124), (54, 72, 124), (48, 71, 125), (35, 68, 122), + (24, 64, 118), (32, 62, 110), (47, 63, 104), (63, 64, 96), + (77, 66, 87), (92, 67, 81), (101, 67, 77), (93, 67, 82), + (88, 65, 82), (89, 65, 83), (89, 63, 83), (89, 63, 79), + (93, 61, 75), (100, 60, 68), (88, 56, 70), (72, 53, 72), + (55, 50, 77), (40, 47, 85), (26, 47, 92), (18, 49, 97), + (19, 51, 101), (32, 50, 104), (47, 53, 110), (64, 60, 116), + (82, 72, 119), (101, 85, 119), (116, 97, 119), (119, 112, 119), + (136, 122, 115), (154, 132, 116), (171, 141, 120), (187, 154, 125), + (206, 165, 120), (223, 169, 113), (221, 176, 107), (217, 176, 97), + (202, 170, 93), (186, 160, 90), (168, 151, 96), (151, 145, 99), + (140, 134, 99), (125, 124, 99), (118, 114, 96), (100, 101, 97), + (83, 88, 96), (67, 78, 100), (50, 72, 105), (35, 65, 109), + (22, 60, 110), (21, 59, 109), (20, 58, 108), (20, 58, 108), + (20, 58, 109), (21, 60, 110), (28, 64, 109), (42, 72, 108), + (58, 82, 108), (74, 96, 109), (93, 109, 112), (112, 123, 118), + (126, 134, 129), (139, 146, 140), (156, 158, 146), (173, 167, 150), + (184, 179, 151), (197, 185, 144), (208, 189, 136), (202, 185, 137) + ), + +// 574 Glade +((71, 113, 64), (30, 66, 27), (16, 53, 21), (3, 40, 16), + (1, 39, 17), (0, 39, 19), (0, 39, 19), (0, 39, 20), + (0, 38, 22), (0, 37, 22), (0, 37, 23), (0, 38, 24), + (0, 39, 26), (0, 38, 25), (0, 38, 25), (0, 38, 25), + (1, 38, 26), (5, 43, 30), (9, 51, 32), (14, 60, 35), + (30, 83, 50), (46, 107, 66), (56, 119, 76), (66, 131, 86), + (102, 169, 102), (130, 185, 109), (158, 201, 116), (160, 195, 109), + (163, 190, 103), (161, 183, 91), (160, 176, 80), (150, 153, 59), + (129, 138, 47), (79, 99, 28), (58, 91, 27), (38, 84, 27), + (32, 85, 31), (26, 86, 35), (33, 91, 37), (40, 96, 40), + (77, 133, 53), (102, 146, 58), (127, 160, 64), (143, 166, 62), + (160, 172, 60), (163, 171, 61), (166, 170, 63), (171, 167, 70), + (171, 162, 67), (157, 144, 64), (147, 140, 64), (137, 136, 64), + (136, 135, 63), (136, 135, 63), (140, 133, 59), (144, 131, 56), + (138, 123, 35), (129, 120, 34), (121, 117, 33), (110, 109, 30), + (100, 102, 28), (92, 101, 27), (84, 101, 27), (77, 107, 27), + (73, 114, 34), (52, 116, 41), (64, 129, 43), (76, 142, 46), + (83, 148, 48), (90, 154, 50), (88, 168, 72), (82, 179, 96), + (109, 203, 121), (110, 201, 122), (112, 200, 124), (96, 185, 117), + (80, 170, 110), (75, 157, 98), (71, 144, 86), (58, 119, 67), + (42, 94, 43), (9, 59, 27), (6, 49, 24), (3, 39, 22), + (2, 37, 21), (2, 36, 20), (1, 35, 18), (0, 34, 16), + (0, 34, 16), (0, 34, 15), (0, 34, 14), (0, 34, 14), + (1, 35, 14), (2, 37, 14), (3, 38, 11), (3, 40, 9), + (4, 44, 9), (15, 67, 22), (31, 89, 37), (47, 112, 52), + (56, 125, 64), (65, 138, 77), (75, 156, 104), (90, 177, 112), + (136, 199, 116), (146, 191, 109), (157, 184, 103), (162, 178, 94), + (167, 173, 86), (179, 169, 68), (190, 163, 48), (198, 163, 47), + (201, 157, 48), (180, 156, 47), (171, 154, 48), (162, 153, 49), + (144, 139, 48), (120, 121, 42), (91, 104, 37), (65, 88, 34), + (35, 67, 30), (26, 63, 31), (17, 60, 32), (15, 58, 32), + (14, 57, 32), (11, 56, 32), (11, 57, 31), (9, 55, 32), + (7, 51, 30), (5, 42, 27), (5, 40, 27), (5, 39, 28), + (5, 38, 27), (4, 38, 26), (6, 39, 26), (7, 39, 26), + (8, 41, 23), (8, 40, 21), (9, 40, 19), (11, 40, 18), + (14, 41, 18), (28, 51, 17), (49, 64, 18), (67, 76, 18), + (81, 79, 19), (109, 94, 16), (110, 96, 14), (111, 99, 13), + (104, 91, 14), (89, 84, 13), (77, 73, 10), (59, 65, 4), + (26, 46, 1), (22, 43, 1), (19, 41, 2), (19, 40, 1), + (22, 41, 0), (27, 38, 0), (25, 36, 1), (25, 35, 2), + (25, 37, 4), (25, 33, 3), (22, 31, 3), (19, 30, 3), + (14, 31, 5), (10, 31, 7), (7, 32, 9), (6, 34, 11), + (16, 49, 21), (24, 55, 24), (33, 61, 28), (49, 75, 34), + (61, 92, 42), (71, 111, 47), (87, 120, 50), (95, 125, 50), + (95, 126, 52), (83, 124, 53), (69, 111, 48), (58, 98, 40), + (46, 83, 31), (36, 72, 28), (29, 62, 23), (30, 61, 21), + (40, 67, 13), (46, 71, 12), (52, 76, 12), (67, 88, 16), + (82, 101, 20), (90, 107, 23), (103, 117, 25), (121, 130, 34), + (144, 151, 43), (161, 166, 55), (176, 182, 66), (187, 192, 77), + (193, 203, 81), (192, 202, 78), (187, 198, 79), (177, 188, 79), + (157, 175, 72), (131, 156, 58), (105, 142, 50), (93, 138, 56), + (89, 149, 76), (85, 160, 95), (77, 174, 113), (80, 183, 119), + (93, 194, 124), (103, 197, 121), (102, 195, 116), (99, 180, 105), + (94, 154, 81), (84, 126, 54), (69, 104, 30), (55, 86, 22), + (42, 68, 20), (28, 51, 18), (16, 42, 17), (9, 35, 17), + (6, 33, 19), (4, 32, 20), (3, 33, 19), (3, 32, 20), + (2, 32, 21), (1, 32, 22), (0, 34, 21), (1, 36, 20), + (2, 37, 19), (2, 36, 16), (2, 36, 13), (3, 36, 12), + (3, 37, 13), (3, 36, 14), (4, 36, 13), (5, 35, 14), + (8, 36, 16), (11, 38, 18), (17, 44, 22), (28, 52, 26), + (39, 61, 28), (48, 65, 23), (50, 74, 23), (51, 80, 24), + (50, 87, 30), (57, 89, 27), (62, 94, 28), (68, 96, 25), + (71, 99, 33), (80, 105, 37), (94, 116, 50), (109, 137, 67), + (122, 149, 78), (110, 138, 69), (96, 115, 53), (74, 108, 57) + ), + +// 575 Glory +((143, 87, 62), (67, 69, 110), (68, 69, 103), (70, 69, 97), + (93, 82, 82), (116, 95, 67), (130, 101, 60), (145, 107, 54), + (160, 132, 42), (162, 138, 46), (165, 144, 50), (158, 149, 69), + (151, 155, 89), (166, 167, 106), (181, 180, 124), (187, 188, 124), + (194, 196, 125), (204, 187, 105), (211, 180, 92), (219, 174, 80), + (217, 154, 71), (215, 135, 63), (212, 133, 68), (210, 131, 74), + (208, 152, 95), (201, 170, 84), (194, 189, 74), (195, 187, 64), + (197, 186, 55), (195, 179, 53), (194, 173, 51), (197, 164, 43), + (198, 162, 46), (203, 170, 67), (206, 181, 60), (209, 193, 54), + (215, 189, 44), (222, 185, 35), (223, 183, 29), (225, 182, 24), + (222, 178, 8), (218, 181, 9), (214, 184, 10), (212, 174, 15), + (211, 165, 21), (210, 161, 20), (209, 157, 20), (204, 137, 20), + (207, 131, 32), (200, 117, 30), (190, 114, 35), (180, 111, 41), + (170, 97, 48), (160, 84, 55), (152, 78, 58), (145, 72, 61), + (135, 42, 55), (139, 45, 52), (144, 48, 50), (153, 62, 39), + (163, 77, 29), (169, 83, 29), (175, 90, 29), (180, 108, 26), + (184, 122, 22), (176, 143, 9), (177, 149, 11), (179, 155, 13), + (173, 155, 12), (168, 156, 12), (165, 142, 18), (170, 128, 37), + (151, 85, 72), (147, 80, 105), (144, 76, 138), (153, 74, 145), + (163, 73, 152), (165, 77, 150), (167, 81, 149), (187, 108, 129), + (189, 122, 98), (184, 146, 54), (183, 154, 51), (182, 162, 49), + (182, 157, 50), (183, 153, 51), (174, 142, 60), (162, 112, 63), + (123, 70, 73), (115, 48, 70), (107, 27, 68), (107, 28, 62), + (108, 29, 57), (118, 23, 55), (126, 14, 41), (135, 18, 27), + (134, 24, 29), (111, 21, 45), (96, 25, 57), (81, 30, 69), + (72, 34, 72), (64, 38, 75), (55, 42, 83), (49, 55, 91), + (40, 67, 107), (43, 63, 115), (46, 60, 123), (47, 56, 125), + (48, 52, 128), (60, 38, 124), (74, 25, 120), (75, 21, 109), + (89, 23, 97), (117, 51, 87), (123, 57, 82), (129, 63, 78), + (147, 80, 81), (139, 97, 81), (130, 105, 83), (115, 101, 91), + (73, 86, 114), (56, 69, 127), (39, 52, 140), (35, 51, 141), + (31, 50, 143), (25, 40, 138), (31, 33, 129), (36, 48, 117), + (29, 37, 107), (50, 34, 94), (53, 29, 91), (57, 25, 88), + (69, 16, 85), (74, 18, 66), (73, 25, 53), (79, 31, 49), + (61, 63, 47), (49, 67, 64), (38, 71, 81), (33, 77, 91), + (29, 83, 102), (15, 77, 116), (18, 66, 126), (34, 56, 152), + (50, 41, 165), (80, 18, 158), (91, 17, 157), (103, 16, 157), + (123, 15, 145), (128, 26, 134), (143, 49, 111), (167, 60, 96), + (178, 93, 69), (184, 97, 62), (190, 101, 55), (192, 90, 47), + (189, 81, 47), (180, 75, 60), (175, 62, 58), (171, 40, 57), + (153, 30, 78), (107, 19, 99), (100, 20, 103), (94, 22, 108), + (75, 30, 126), (72, 30, 131), (91, 39, 124), (105, 54, 114), + (159, 69, 89), (167, 76, 82), (175, 84, 76), (177, 99, 74), + (185, 115, 77), (198, 130, 75), (205, 142, 87), (207, 148, 85), + (218, 150, 65), (231, 152, 57), (226, 140, 46), (216, 134, 26), + (211, 126, 11), (195, 110, 11), (173, 95, 17), (156, 75, 19), + (111, 52, 40), (104, 45, 42), (97, 39, 44), (90, 33, 46), + (87, 34, 50), (91, 46, 43), (109, 55, 37), (132, 58, 33), + (140, 74, 21), (144, 92, 17), (136, 88, 16), (110, 76, 10), + (90, 67, 18), (62, 58, 32), (31, 44, 40), (18, 40, 46), + (18, 44, 56), (30, 50, 50), (46, 51, 35), (69, 45, 32), + (84, 40, 19), (96, 29, 13), (108, 15, 26), (107, 11, 35), + (97, 13, 52), (86, 17, 72), (82, 22, 84), (85, 28, 90), + (95, 42, 89), (106, 58, 77), (118, 53, 65), (130, 52, 50), + (142, 58, 29), (147, 50, 20), (146, 50, 21), (152, 56, 21), + (161, 60, 25), (173, 71, 36), (182, 84, 46), (183, 98, 57), + (181, 110, 79), (178, 124, 109), (168, 132, 111), (151, 124, 107), + (148, 117, 133), (131, 105, 137), (114, 83, 133), (119, 58, 146), + (106, 40, 153), (98, 31, 151), (103, 18, 149), (94, 13, 143), + (89, 11, 132), (88, 10, 122), (88, 17, 119), (90, 35, 122), + (95, 55, 117), (100, 62, 117), (98, 79, 116), (92, 97, 106), + (79, 94, 102), (72, 89, 103), (65, 77, 97), (60, 65, 91), + (66, 53, 88), (82, 34, 83), (103, 30, 71), (122, 39, 57), + (155, 55, 44), (178, 70, 32), (164, 71, 43), (152, 84, 61) + ), + +// 576 Gold_and_Blue +((161, 125, 84), (199, 134, 61), (210, 140, 61), (222, 146, 62), + (221, 143, 62), (221, 140, 63), (217, 137, 60), (214, 135, 58), + (201, 117, 55), (192, 106, 45), (183, 96, 36), (165, 82, 26), + (147, 69, 17), (134, 56, 14), (121, 43, 12), (118, 41, 10), + (115, 39, 9), (92, 48, 15), (87, 52, 20), (82, 56, 26), + (83, 53, 26), (85, 50, 26), (82, 50, 25), (80, 50, 25), + (68, 63, 37), (63, 63, 41), (59, 63, 45), (52, 65, 51), + (46, 68, 57), (44, 72, 64), (42, 76, 71), (34, 82, 82), + (31, 90, 97), (33, 110, 120), (41, 121, 129), (50, 132, 139), + (54, 140, 146), (59, 148, 153), (58, 148, 153), (58, 149, 154), + (64, 136, 141), (59, 130, 134), (55, 124, 127), (49, 114, 119), + (44, 105, 111), (43, 98, 105), (43, 91, 99), (43, 77, 87), + (40, 63, 76), (28, 42, 57), (25, 36, 49), (23, 31, 42), + (24, 28, 37), (26, 26, 32), (28, 26, 32), (30, 27, 32), + (50, 41, 32), (70, 53, 35), (90, 65, 38), (111, 79, 46), + (133, 94, 55), (141, 98, 57), (149, 102, 60), (165, 108, 59), + (176, 111, 54), (181, 109, 49), (173, 100, 45), (165, 92, 42), + (159, 88, 38), (154, 84, 35), (136, 71, 26), (117, 59, 19), + (81, 34, 11), (68, 29, 9), (55, 24, 8), (42, 18, 7), + (30, 13, 6), (24, 10, 6), (18, 8, 7), (12, 10, 12), + (7, 14, 18), (12, 30, 34), (21, 39, 46), (30, 49, 58), + (34, 54, 64), (39, 59, 71), (42, 65, 77), (45, 69, 82), + (45, 64, 78), (45, 60, 74), (46, 57, 70), (44, 54, 66), + (42, 52, 63), (40, 46, 53), (44, 40, 44), (51, 37, 34), + (63, 35, 25), (73, 35, 14), (81, 37, 13), (90, 39, 12), + (93, 38, 10), (96, 37, 9), (97, 31, 7), (85, 25, 3), + (57, 19, 5), (47, 15, 9), (37, 11, 13), (32, 9, 14), + (27, 8, 16), (18, 13, 18), (11, 18, 25), (3, 28, 35), + (2, 38, 48), (1, 56, 70), (2, 59, 74), (3, 63, 78), + (4, 70, 84), (6, 77, 91), (6, 78, 95), (4, 77, 97), + (4, 68, 86), (5, 61, 79), (6, 54, 72), (5, 49, 67), + (4, 45, 63), (2, 37, 52), (0, 31, 40), (0, 24, 32), + (0, 19, 26), (0, 9, 19), (0, 8, 16), (0, 8, 14), + (0, 9, 8), (0, 10, 4), (0, 12, 3), (2, 13, 4), + (14, 24, 15), (21, 32, 23), (28, 41, 32), (31, 43, 35), + (34, 46, 38), (41, 54, 39), (51, 61, 43), (64, 67, 49), + (85, 83, 62), (133, 127, 84), (142, 133, 87), (152, 140, 90), + (160, 142, 87), (166, 137, 85), (173, 134, 89), (177, 145, 97), + (169, 155, 116), (162, 150, 112), (155, 145, 109), (132, 123, 101), + (108, 111, 97), (95, 106, 102), (79, 110, 117), (77, 121, 125), + (75, 127, 133), (92, 138, 147), (97, 145, 155), (103, 153, 163), + (119, 167, 178), (130, 176, 188), (143, 183, 194), (152, 180, 192), + (153, 177, 178), (151, 171, 170), (149, 165, 162), (147, 152, 145), + (148, 136, 122), (147, 124, 103), (140, 115, 82), (134, 104, 62), + (133, 91, 43), (136, 83, 26), (151, 82, 20), (163, 86, 17), + (170, 91, 16), (173, 91, 18), (166, 85, 18), (163, 81, 21), + (166, 82, 26), (169, 85, 30), (173, 88, 34), (177, 91, 40), + (175, 92, 45), (171, 91, 43), (172, 95, 37), (182, 100, 40), + (201, 112, 48), (208, 124, 62), (206, 132, 79), (193, 136, 87), + (176, 135, 95), (165, 132, 99), (150, 123, 98), (127, 114, 103), + (104, 103, 104), (78, 93, 106), (59, 88, 101), (49, 82, 91), + (38, 74, 81), (31, 69, 72), (25, 66, 72), (20, 70, 74), + (23, 76, 79), (27, 80, 83), (33, 83, 86), (39, 81, 90), + (44, 80, 88), (52, 77, 83), (60, 73, 78), (70, 69, 72), + (76, 68, 75), (84, 72, 76), (102, 81, 81), (129, 97, 83), + (156, 119, 87), (174, 138, 101), (180, 156, 121), (182, 170, 142), + (189, 178, 156), (192, 185, 159), (191, 189, 155), (178, 189, 157), + (158, 182, 158), (136, 169, 161), (109, 150, 155), (83, 134, 142), + (58, 127, 137), (41, 123, 127), (35, 127, 129), (29, 123, 129), + (35, 115, 121), (43, 111, 119), (53, 107, 105), (70, 108, 97), + (83, 108, 92), (100, 104, 82), (116, 98, 74), (130, 92, 65), + (146, 95, 59), (150, 98, 62), (153, 109, 75), (149, 120, 88), + (141, 126, 101), (140, 135, 111), (134, 135, 113), (134, 133, 113), + (139, 137, 109), (142, 134, 104), (145, 133, 100), (152, 130, 94) + ), + +// 577 Golden +((148, 110, 66), (145, 114, 70), (137, 107, 64), (129, 101, 58), + (112, 85, 49), (96, 70, 41), (89, 65, 37), (82, 61, 34), + (61, 50, 34), (62, 51, 39), (63, 52, 44), (66, 56, 48), + (70, 61, 52), (71, 66, 61), (73, 72, 70), (77, 76, 75), + (81, 80, 81), (103, 101, 99), (112, 108, 101), (122, 115, 103), + (130, 118, 100), (139, 121, 97), (142, 122, 95), (145, 124, 94), + (149, 118, 80), (147, 113, 70), (146, 109, 60), (137, 102, 58), + (128, 96, 57), (122, 92, 56), (117, 89, 56), (107, 83, 55), + (101, 79, 52), (84, 72, 56), (78, 69, 59), (73, 67, 63), + (72, 68, 65), (72, 70, 68), (72, 70, 69), (73, 71, 71), + (74, 73, 74), (79, 75, 70), (85, 78, 66), (90, 80, 63), + (96, 83, 60), (95, 82, 58), (95, 81, 56), (92, 77, 47), + (90, 74, 35), (93, 71, 23), (97, 74, 24), (102, 77, 26), + (110, 85, 30), (119, 93, 35), (125, 97, 39), (132, 102, 44), + (165, 128, 64), (180, 145, 79), (196, 163, 95), (208, 177, 110), + (220, 191, 125), (224, 195, 127), (229, 199, 129), (230, 204, 131), + (232, 205, 128), (228, 201, 127), (221, 195, 124), (214, 189, 122), + (207, 182, 117), (201, 176, 113), (187, 161, 102), (172, 146, 94), + (146, 124, 91), (131, 113, 89), (116, 102, 87), (102, 91, 82), + (89, 81, 77), (85, 78, 74), (81, 75, 72), (74, 69, 69), + (69, 64, 64), (58, 55, 57), (54, 52, 53), (51, 49, 50), + (50, 48, 49), (49, 48, 48), (49, 48, 48), (48, 48, 49), + (47, 46, 47), (47, 46, 46), (48, 46, 46), (48, 46, 46), + (48, 47, 47), (49, 47, 47), (49, 46, 46), (51, 46, 41), + (52, 46, 36), (57, 49, 32), (57, 49, 34), (58, 49, 36), + (58, 49, 36), (59, 50, 37), (62, 54, 36), (67, 57, 41), + (70, 62, 54), (70, 63, 57), (71, 64, 60), (72, 65, 61), + (73, 66, 62), (76, 69, 65), (78, 72, 68), (83, 75, 71), + (85, 77, 72), (96, 80, 65), (98, 80, 63), (100, 81, 62), + (104, 83, 59), (105, 84, 60), (107, 83, 60), (107, 81, 57), + (96, 73, 47), (88, 68, 45), (81, 64, 44), (77, 61, 44), + (73, 59, 44), (65, 53, 43), (56, 48, 39), (52, 46, 35), + (50, 46, 35), (57, 51, 43), (60, 53, 44), (63, 56, 46), + (73, 63, 49), (83, 72, 58), (97, 85, 67), (114, 99, 80), + (154, 130, 92), (169, 143, 96), (185, 156, 100), (192, 162, 103), + (200, 168, 107), (212, 179, 113), (222, 187, 116), (224, 188, 113), + (216, 184, 113), (193, 162, 102), (187, 156, 100), (182, 151, 99), + (170, 139, 89), (156, 125, 83), (138, 111, 75), (119, 93, 62), + (92, 70, 47), (89, 67, 44), (86, 65, 42), (82, 63, 44), + (80, 64, 47), (78, 66, 54), (76, 69, 63), (77, 73, 70), + (80, 78, 77), (96, 89, 82), (100, 91, 81), (104, 93, 81), + (111, 95, 79), (116, 99, 82), (120, 101, 83), (126, 107, 87), + (136, 114, 87), (138, 116, 89), (140, 118, 92), (143, 121, 95), + (146, 127, 103), (153, 133, 108), (160, 140, 114), (167, 148, 122), + (173, 154, 129), (180, 164, 135), (191, 171, 135), (203, 179, 130), + (211, 185, 128), (214, 185, 123), (214, 185, 121), (213, 182, 120), + (201, 170, 106), (196, 163, 99), (192, 157, 92), (181, 143, 79), + (172, 131, 67), (163, 123, 62), (155, 115, 60), (150, 111, 57), + (148, 108, 55), (149, 108, 50), (155, 113, 49), (163, 120, 53), + (172, 129, 56), (183, 139, 62), (188, 145, 64), (193, 149, 65), + (195, 152, 67), (194, 151, 66), (191, 150, 70), (183, 147, 73), + (173, 141, 76), (163, 135, 78), (153, 127, 77), (144, 121, 80), + (137, 118, 84), (137, 117, 87), (141, 120, 90), (148, 126, 91), + (159, 134, 92), (166, 140, 100), (173, 147, 104), (179, 152, 108), + (181, 155, 110), (182, 155, 107), (179, 154, 111), (172, 150, 113), + (162, 143, 116), (149, 137, 119), (136, 128, 117), (128, 121, 112), + (122, 114, 105), (115, 105, 97), (107, 99, 91), (100, 92, 83), + (94, 86, 74), (91, 82, 67), (87, 76, 61), (82, 73, 58), + (76, 66, 54), (72, 62, 48), (68, 58, 45), (66, 57, 43), + (64, 57, 47), (63, 57, 51), (65, 58, 50), (67, 57, 47), + (70, 57, 43), (72, 58, 39), (73, 59, 36), (79, 61, 33), + (84, 64, 30), (89, 66, 28), (92, 66, 27), (93, 67, 26), + (98, 68, 26), (103, 72, 28), (112, 82, 40), (116, 86, 48), + (132, 101, 58), (144, 110, 64), (149, 110, 59), (160, 120, 67) + ), + +// 578 Golden_Green +((40, 49, 3), (42, 50, 3), (40, 47, 2), (38, 44, 2), + (31, 36, 1), (24, 29, 1), (20, 24, 0), (16, 19, 0), + (4, 6, 0), (2, 3, 0), (0, 1, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 2, 0), + (0, 2, 0), (0, 3, 0), (0, 3, 0), (1, 4, 0), + (1, 4, 0), (2, 5, 0), (3, 6, 0), (4, 8, 0), + (12, 17, 0), (18, 23, 0), (24, 29, 0), (28, 34, 0), + (33, 39, 0), (34, 41, 0), (35, 43, 0), (38, 46, 0), + (40, 49, 1), (45, 55, 1), (47, 57, 1), (49, 60, 1), + (48, 59, 1), (47, 59, 1), (45, 58, 1), (44, 57, 1), + (39, 53, 1), (38, 52, 1), (38, 51, 2), (38, 51, 1), + (39, 52, 1), (40, 53, 1), (41, 54, 1), (43, 57, 1), + (46, 59, 1), (54, 67, 3), (56, 69, 4), (59, 72, 5), + (60, 73, 5), (62, 74, 5), (65, 77, 5), (67, 78, 4), + (73, 84, 3), (74, 86, 4), (76, 89, 5), (77, 90, 5), + (79, 91, 5), (79, 91, 5), (80, 92, 5), (82, 93, 3), + (84, 94, 2), (90, 98, 0), (95, 102, 1), (100, 107, 3), + (105, 111, 5), (110, 116, 7), (122, 126, 12), (133, 134, 16), + (143, 141, 15), (140, 140, 13), (138, 139, 11), (138, 139, 11), + (138, 140, 11), (141, 142, 11), (147, 148, 15), (156, 155, 17), + (163, 160, 21), (165, 161, 21), (159, 156, 17), (153, 151, 13), + (149, 149, 11), (146, 147, 10), (147, 147, 9), (154, 150, 10), + (172, 165, 24), (181, 173, 29), (191, 181, 35), (190, 181, 36), + (189, 181, 37), (181, 175, 32), (172, 168, 26), (166, 163, 23), + (160, 159, 23), (158, 157, 24), (158, 158, 26), (158, 159, 28), + (151, 154, 26), (141, 145, 22), (130, 134, 17), (116, 121, 11), + (87, 92, 2), (77, 83, 1), (68, 74, 1), (64, 70, 1), + (60, 66, 1), (53, 60, 0), (47, 55, 1), (42, 49, 1), + (36, 43, 1), (25, 33, 1), (23, 30, 0), (21, 28, 0), + (19, 27, 0), (18, 28, 0), (20, 31, 0), (24, 36, 0), + (35, 47, 0), (39, 52, 0), (44, 57, 1), (47, 59, 1), + (50, 62, 1), (56, 68, 2), (62, 74, 2), (70, 82, 4), + (82, 92, 10), (105, 113, 18), (108, 116, 19), (112, 119, 20), + (115, 121, 22), (112, 120, 21), (106, 112, 17), (101, 105, 18), + (93, 97, 22), (91, 95, 22), (90, 93, 22), (87, 89, 23), + (80, 84, 20), (69, 75, 14), (55, 63, 9), (43, 51, 8), + (33, 41, 7), (21, 29, 6), (20, 28, 5), (20, 28, 4), + (20, 28, 3), (22, 30, 3), (24, 33, 2), (28, 36, 2), + (35, 43, 2), (36, 44, 2), (38, 46, 3), (41, 48, 2), + (43, 49, 1), (44, 52, 1), (46, 54, 0), (48, 57, 0), + (50, 61, 0), (52, 64, 1), (53, 65, 1), (54, 66, 1), + (54, 67, 1), (53, 66, 2), (54, 66, 4), (55, 68, 5), + (61, 73, 8), (63, 74, 8), (65, 75, 8), (67, 77, 7), + (69, 80, 5), (71, 81, 7), (70, 81, 6), (72, 82, 7), + (73, 83, 8), (73, 82, 8), (73, 81, 7), (73, 81, 4), + (72, 81, 4), (70, 80, 2), (69, 80, 1), (69, 81, 2), + (70, 82, 2), (71, 82, 1), (74, 84, 1), (78, 88, 2), + (82, 92, 2), (85, 95, 2), (86, 98, 2), (86, 99, 2), + (84, 97, 2), (82, 94, 2), (79, 89, 2), (76, 86, 2), + (74, 83, 2), (70, 79, 2), (67, 77, 1), (64, 76, 1), + (61, 73, 2), (58, 69, 2), (56, 66, 2), (55, 63, 2), + (55, 60, 2), (54, 58, 2), (54, 57, 1), (54, 57, 1), + (54, 58, 3), (55, 58, 5), (55, 59, 5), (54, 58, 6), + (53, 56, 6), (50, 52, 6), (46, 47, 5), (42, 43, 4), + (38, 38, 5), (33, 34, 5), (29, 32, 6), (25, 29, 5), + (23, 27, 6), (20, 24, 5), (17, 21, 2), (14, 17, 2), + (11, 13, 1), (8, 10, 1), (5, 7, 0), (3, 6, 0), + (2, 5, 1), (3, 6, 0), (5, 10, 1), (10, 16, 1), + (18, 24, 2), (25, 32, 2), (33, 42, 2), (39, 48, 2), + (42, 51, 2), (44, 52, 2), (41, 51, 2), (43, 52, 3) + ), + + +// 579 Goldenrod +((237, 184, 18), (252, 174, 18), (232, 168, 38), (212, 163, 59), + (196, 147, 89), (180, 131, 120), (166, 128, 136), (153, 126, 153), + (114, 116, 162), (93, 107, 136), (72, 99, 110), (52, 87, 82), + (33, 76, 55), (26, 57, 42), (20, 39, 29), (21, 36, 28), + (22, 34, 28), (27, 28, 25), (25, 29, 26), (24, 30, 28), + (17, 41, 34), (11, 52, 40), (10, 57, 45), (10, 62, 50), + (3, 100, 78), (5, 104, 81), (7, 108, 85), (7, 100, 78), + (8, 92, 71), (13, 84, 65), (19, 76, 59), (34, 72, 49), + (75, 75, 34), (152, 87, 24), (187, 101, 18), (223, 116, 13), + (201, 112, 15), (179, 109, 18), (158, 100, 22), (138, 91, 27), + (63, 84, 48), (48, 86, 64), (33, 88, 81), (53, 107, 106), + (74, 127, 132), (87, 133, 145), (101, 139, 159), (130, 144, 178), + (147, 141, 197), (143, 114, 209), (140, 95, 214), (138, 76, 220), + (129, 61, 214), (121, 46, 208), (115, 41, 199), (109, 37, 191), + (73, 34, 119), (51, 33, 97), (29, 33, 75), (16, 45, 62), + (3, 58, 49), (2, 65, 55), (1, 73, 61), (4, 86, 66), + (2, 93, 64), (5, 102, 62), (4, 87, 54), (3, 72, 47), + (5, 68, 43), (7, 65, 39), (10, 53, 31), (11, 35, 24), + (20, 23, 21), (23, 22, 21), (26, 22, 22), (83, 58, 18), + (140, 95, 14), (136, 93, 16), (132, 91, 19), (182, 119, 13), + (235, 140, 9), (159, 89, 16), (135, 69, 18), (111, 49, 20), + (90, 39, 21), (70, 30, 23), (51, 24, 30), (69, 30, 50), + (77, 50, 95), (86, 54, 127), (96, 58, 159), (92, 53, 167), + (88, 49, 175), (90, 33, 174), (84, 33, 181), (61, 41, 163), + (43, 58, 137), (32, 67, 129), (47, 72, 136), (63, 77, 144), + (78, 74, 156), (93, 72, 168), (118, 82, 190), (138, 99, 185), + (191, 143, 116), (203, 152, 87), (216, 162, 58), (225, 163, 42), + (235, 165, 26), (235, 155, 23), (217, 140, 19), (169, 119, 18), + (124, 86, 19), (59, 49, 16), (43, 37, 17), (28, 25, 19), + (24, 19, 20), (24, 16, 19), (23, 17, 20), (21, 17, 21), + (19, 24, 26), (27, 28, 39), (36, 32, 53), (42, 33, 68), + (49, 34, 83), (54, 38, 92), (46, 62, 105), (40, 90, 124), + (39, 109, 128), (2, 124, 94), (6, 122, 87), (11, 121, 81), + (26, 93, 58), (67, 81, 39), (119, 81, 30), (147, 81, 14), + (232, 126, 10), (242, 141, 11), (253, 156, 13), (252, 159, 14), + (251, 163, 15), (251, 168, 13), (254, 170, 18), (254, 167, 19), + (252, 163, 16), (220, 149, 38), (207, 147, 55), (195, 145, 72), + (190, 125, 106), (176, 114, 141), (153, 112, 184), (155, 98, 222), + (155, 70, 236), (151, 63, 235), (148, 57, 234), (133, 50, 221), + (119, 42, 209), (110, 33, 196), (98, 29, 176), (76, 25, 153), + (60, 21, 121), (44, 20, 81), (40, 18, 69), (37, 17, 57), + (48, 30, 39), (87, 48, 35), (126, 59, 34), (133, 81, 55), + (165, 85, 112), (163, 84, 126), (162, 83, 140), (128, 82, 174), + (119, 62, 188), (120, 39, 187), (96, 42, 168), (70, 55, 140), + (55, 53, 124), (39, 59, 113), (15, 82, 95), (2, 99, 90), + (6, 106, 94), (9, 112, 95), (25, 125, 100), (54, 126, 115), + (67, 88, 100), (73, 87, 98), (80, 87, 97), (82, 63, 83), + (57, 44, 67), (33, 48, 56), (24, 47, 42), (15, 46, 38), + (6, 46, 39), (3, 42, 37), (2, 38, 31), (1, 35, 27), + (2, 33, 24), (2, 32, 20), (1, 34, 23), (1, 42, 27), + (0, 49, 30), (0, 55, 37), (0, 59, 38), (1, 58, 36), + (5, 56, 34), (8, 50, 30), (9, 41, 22), (14, 34, 18), + (18, 28, 18), (19, 24, 17), (20, 22, 17), (21, 21, 16), + (21, 19, 16), (21, 19, 17), (21, 20, 16), (20, 20, 17), + (20, 19, 18), (20, 19, 20), (20, 20, 23), (17, 22, 25), + (13, 29, 28), (12, 35, 39), (8, 41, 47), (4, 53, 50), + (3, 61, 60), (4, 64, 67), (5, 64, 65), (7, 61, 61), + (7, 59, 56), (6, 52, 50), (11, 42, 39), (15, 38, 33), + (18, 42, 35), (31, 57, 46), (58, 73, 71), (81, 87, 93), + (76, 121, 107), (70, 149, 140), (69, 155, 149), (69, 152, 113), + (81, 149, 98), (102, 155, 81), (139, 148, 42), (185, 140, 24), + (224, 146, 15), (246, 156, 12), (251, 163, 16), (253, 166, 17), + (245, 169, 33), (228, 171, 78), (222, 178, 114), (208, 180, 124), + (194, 174, 124), (208, 183, 119), (217, 184, 110), (219, 178, 62) + ), + + +// 580 Grape +((83, 67, 90), (93, 75, 108), (98, 77, 115), (104, 79, 123), + (106, 80, 126), (109, 81, 130), (109, 81, 130), (109, 82, 131), + (110, 83, 129), (109, 81, 125), (108, 80, 122), (101, 82, 121), + (95, 84, 120), (90, 89, 124), (85, 94, 128), (83, 97, 133), + (82, 100, 138), (77, 116, 159), (74, 125, 168), (72, 135, 177), + (69, 138, 185), (66, 142, 193), (66, 141, 192), (66, 141, 192), + (70, 134, 171), (68, 125, 157), (67, 117, 143), (63, 103, 124), + (59, 90, 106), (56, 84, 96), (54, 79, 87), (51, 69, 67), + (47, 63, 54), (41, 54, 42), (39, 54, 41), (38, 54, 40), + (41, 66, 55), (45, 79, 70), (52, 87, 82), (59, 95, 94), + (110, 138, 138), (124, 155, 159), (139, 172, 180), (139, 181, 198), + (139, 190, 217), (139, 191, 221), (140, 193, 225), (150, 196, 224), + (143, 191, 224), (100, 163, 204), (87, 151, 192), (74, 140, 180), + (69, 135, 179), (64, 130, 179), (62, 128, 179), (60, 127, 179), + (60, 126, 171), (66, 125, 168), (72, 125, 166), (76, 123, 163), + (81, 122, 160), (81, 118, 158), (82, 114, 156), (83, 111, 146), + (88, 102, 134), (98, 88, 112), (97, 79, 109), (96, 70, 106), + (95, 67, 104), (94, 65, 103), (99, 63, 109), (103, 65, 112), + (103, 62, 119), (96, 59, 111), (89, 57, 104), (86, 56, 98), + (84, 55, 92), (81, 54, 90), (79, 53, 88), (67, 48, 74), + (57, 43, 64), (52, 39, 55), (56, 39, 59), (60, 40, 63), + (63, 41, 67), (67, 42, 72), (74, 46, 80), (80, 50, 89), + (94, 55, 104), (96, 56, 106), (98, 58, 109), (96, 59, 106), + (94, 60, 104), (87, 61, 97), (80, 59, 90), (73, 56, 82), + (64, 52, 73), (52, 53, 59), (51, 54, 57), (51, 55, 55), + (52, 56, 56), (54, 57, 57), (59, 58, 61), (68, 64, 70), + (87, 76, 94), (90, 89, 111), (93, 102, 128), (93, 108, 136), + (94, 115, 145), (95, 125, 162), (98, 131, 173), (96, 140, 185), + (92, 148, 197), (82, 165, 216), (82, 166, 218), (83, 167, 220), + (86, 170, 221), (90, 171, 222), (97, 175, 222), (115, 182, 223), + (143, 192, 200), (142, 179, 192), (141, 167, 185), (144, 161, 187), + (147, 155, 189), (154, 143, 172), (158, 138, 154), (156, 121, 140), + (140, 100, 128), (118, 66, 132), (117, 63, 131), (117, 61, 130), + (118, 59, 128), (119, 57, 128), (121, 53, 131), (116, 52, 131), + (105, 51, 124), (99, 49, 115), (94, 47, 106), (89, 45, 101), + (84, 43, 96), (71, 40, 82), (57, 36, 71), (46, 36, 58), + (39, 35, 45), (31, 32, 33), (30, 31, 32), (29, 30, 32), + (31, 27, 32), (36, 28, 34), (42, 27, 39), (48, 28, 45), + (66, 36, 67), (70, 39, 73), (75, 43, 80), (79, 57, 97), + (82, 72, 117), (85, 87, 138), (94, 94, 150), (110, 97, 157), + (115, 101, 162), (106, 110, 172), (102, 108, 168), (99, 107, 164), + (102, 102, 151), (105, 92, 135), (106, 85, 121), (99, 80, 113), + (83, 77, 95), (81, 77, 92), (80, 78, 89), (83, 82, 88), + (83, 86, 90), (84, 92, 94), (82, 95, 99), (82, 97, 105), + (86, 98, 110), (88, 100, 116), (91, 100, 119), (88, 96, 119), + (84, 92, 119), (83, 81, 117), (81, 70, 114), (79, 62, 113), + (67, 46, 96), (63, 41, 90), (60, 37, 84), (51, 25, 70), + (40, 19, 64), (36, 17, 58), (31, 21, 53), (34, 28, 51), + (38, 31, 48), (45, 33, 52), (54, 37, 62), (63, 44, 75), + (77, 52, 90), (90, 62, 103), (104, 67, 115), (117, 71, 127), + (124, 79, 138), (123, 89, 153), (117, 100, 165), (110, 109, 174), + (103, 114, 181), (101, 116, 180), (96, 123, 179), (92, 124, 177), + (91, 125, 175), (91, 122, 175), (96, 116, 175), (104, 118, 175), + (112, 125, 176), (118, 131, 177), (119, 131, 178), (114, 127, 173), + (110, 120, 168), (107, 121, 163), (105, 123, 155), (95, 123, 152), + (83, 120, 140), (72, 109, 123), (67, 96, 104), (66, 85, 85), + (63, 75, 72), (59, 66, 62), (52, 61, 53), (46, 56, 46), + (39, 51, 39), (33, 44, 31), (28, 36, 26), (23, 29, 21), + (22, 24, 22), (24, 22, 24), (26, 21, 27), (31, 20, 32), + (34, 19, 37), (42, 18, 44), (52, 22, 52), (59, 26, 62), + (66, 30, 69), (67, 31, 74), (69, 32, 74), (70, 34, 73), + (70, 38, 72), (72, 41, 73), (70, 42, 75), (69, 40, 74), + (67, 41, 70), (66, 43, 65), (67, 48, 63), (68, 52, 65), + (72, 54, 71), (74, 56, 76), (76, 58, 80), (80, 62, 86) + ), + +// 581 Lemon_Grass +((60, 101, 67), (33, 82, 77), (26, 80, 78), (19, 78, 80), + (13, 72, 75), (7, 66, 71), (8, 64, 67), (9, 62, 63), + (13, 51, 40), (21, 48, 34), (30, 45, 28), (38, 45, 21), + (47, 45, 14), (57, 47, 12), (68, 49, 10), (71, 48, 10), + (74, 48, 11), (81, 50, 11), (81, 45, 13), (81, 41, 16), + (82, 42, 22), (83, 44, 28), (84, 46, 32), (85, 48, 36), + (84, 63, 53), (83, 70, 55), (83, 78, 57), (83, 85, 56), + (84, 93, 56), (84, 95, 51), (84, 98, 47), (87, 103, 36), + (97, 107, 27), (126, 124, 15), (139, 134, 13), (152, 144, 12), + (163, 149, 19), (175, 155, 26), (178, 158, 28), (181, 162, 31), + (177, 163, 45), (173, 159, 50), (169, 156, 55), (161, 152, 52), + (154, 149, 50), (148, 145, 50), (143, 141, 51), (134, 129, 52), + (123, 117, 49), (94, 86, 45), (82, 72, 45), (70, 58, 46), + (55, 44, 41), (41, 30, 36), (36, 27, 34), (31, 24, 32), + (20, 24, 23), (15, 26, 18), (11, 29, 13), (18, 37, 11), + (26, 46, 9), (30, 51, 9), (35, 57, 10), (41, 67, 10), + (49, 74, 10), (65, 86, 18), (63, 88, 23), (61, 90, 28), + (58, 90, 32), (56, 91, 37), (53, 93, 51), (46, 90, 61), + (33, 80, 76), (33, 74, 82), (34, 69, 89), (36, 62, 89), + (39, 56, 89), (38, 51, 86), (37, 46, 84), (37, 36, 81), + (39, 35, 73), (36, 44, 64), (31, 46, 54), (27, 49, 45), + (30, 54, 40), (33, 60, 36), (47, 74, 29), (65, 93, 23), + (100, 115, 11), (122, 128, 10), (144, 141, 10), (151, 144, 11), + (159, 148, 12), (165, 149, 15), (164, 147, 19), (164, 148, 21), + (159, 147, 23), (144, 137, 33), (136, 135, 36), (129, 133, 39), + (124, 132, 39), (120, 131, 39), (109, 125, 42), (99, 119, 44), + (77, 105, 44), (69, 97, 44), (62, 90, 44), (62, 87, 44), + (62, 85, 45), (63, 81, 45), (66, 77, 46), (69, 74, 46), + (74, 74, 46), (81, 81, 44), (79, 82, 42), (78, 83, 40), + (72, 85, 35), (69, 88, 34), (70, 95, 36), (75, 104, 37), + (85, 117, 43), (96, 123, 52), (107, 130, 61), (112, 133, 64), + (118, 136, 68), (126, 139, 74), (127, 136, 77), (122, 128, 77), + (113, 118, 75), (97, 94, 64), (93, 87, 59), (89, 80, 55), + (84, 71, 46), (86, 70, 39), (94, 71, 32), (108, 76, 26), + (144, 103, 20), (159, 116, 17), (175, 130, 15), (179, 135, 13), + (184, 141, 12), (186, 147, 11), (181, 147, 9), (172, 144, 8), + (157, 137, 6), (117, 115, 7), (108, 110, 9), (100, 105, 12), + (85, 95, 18), (76, 87, 26), (68, 81, 34), (67, 80, 45), + (73, 82, 69), (75, 82, 73), (78, 82, 77), (83, 82, 81), + (86, 82, 82), (88, 81, 81), (89, 78, 76), (88, 73, 68), + (85, 65, 57), (74, 55, 36), (72, 54, 32), (70, 54, 29), + (66, 52, 23), (62, 51, 19), (59, 53, 19), (60, 59, 22), + (75, 80, 33), (81, 87, 37), (87, 94, 41), (103, 109, 51), + (120, 123, 59), (136, 136, 66), (147, 146, 70), (158, 153, 73), + (164, 157, 72), (165, 156, 68), (159, 148, 61), (150, 140, 54), + (142, 132, 45), (136, 125, 38), (131, 117, 34), (129, 113, 31), + (139, 121, 25), (143, 124, 25), (147, 127, 26), (156, 129, 32), + (166, 137, 38), (176, 145, 43), (180, 155, 47), (177, 155, 53), + (167, 150, 59), (155, 141, 66), (138, 135, 67), (121, 126, 65), + (101, 116, 64), (82, 101, 64), (64, 88, 63), (50, 75, 58), + (40, 67, 52), (34, 58, 48), (29, 52, 46), (26, 48, 44), + (25, 48, 39), (25, 48, 35), (26, 49, 33), (28, 51, 36), + (33, 56, 38), (39, 61, 41), (44, 61, 42), (48, 57, 42), + (52, 52, 43), (58, 49, 42), (65, 47, 39), (73, 43, 32), + (81, 40, 25), (90, 41, 20), (102, 49, 17), (112, 57, 14), + (124, 65, 10), (135, 74, 8), (147, 87, 8), (154, 97, 9), + (158, 102, 8), (160, 103, 6), (163, 107, 5), (164, 110, 6), + (159, 107, 7), (149, 98, 8), (139, 90, 9), (129, 88, 11), + (116, 86, 13), (97, 79, 14), (79, 72, 14), (68, 72, 15), + (61, 78, 14), (57, 85, 13), (58, 91, 11), (67, 99, 9), + (81, 109, 9), (96, 119, 10), (110, 125, 11), (124, 129, 12), + (136, 133, 12), (145, 137, 15), (152, 140, 18), (156, 144, 19), + (157, 147, 19), (155, 150, 20), (148, 149, 24), (140, 148, 28), + (127, 141, 33), (115, 136, 39), (99, 124, 49), (84, 116, 57) + ), + +// 582 Magenta_and_Teal +((171, 65, 180), (173, 49, 158), (176, 50, 150), (179, 51, 142), + (183, 53, 146), (187, 56, 150), (194, 57, 156), (201, 58, 163), + (212, 54, 173), (211, 59, 175), (210, 64, 177), (207, 76, 185), + (205, 89, 193), (199, 102, 202), (193, 115, 211), (188, 119, 214), + (183, 123, 217), (162, 141, 218), (150, 151, 223), (138, 162, 228), + (127, 179, 228), (117, 196, 229), (112, 202, 230), (108, 209, 232), + (109, 229, 218), (116, 228, 209), (124, 228, 201), (127, 219, 188), + (131, 210, 175), (130, 201, 171), (130, 192, 168), (122, 173, 162), + (128, 156, 154), (156, 129, 155), (169, 124, 156), (183, 119, 157), + (185, 111, 157), (188, 104, 158), (185, 99, 156), (182, 94, 155), + (177, 73, 149), (181, 78, 153), (186, 83, 157), (197, 97, 165), + (209, 111, 173), (211, 121, 178), (214, 131, 183), (223, 144, 185), + (226, 159, 179), (230, 175, 174), (229, 182, 179), (228, 189, 184), + (222, 200, 198), (217, 212, 212), (212, 217, 217), (208, 222, 223), + (178, 231, 238), (162, 231, 238), (147, 232, 239), (141, 231, 237), + (135, 231, 235), (134, 230, 234), (134, 230, 234), (134, 230, 234), + (131, 228, 233), (120, 227, 233), (117, 229, 232), (114, 231, 231), + (118, 232, 230), (122, 234, 230), (132, 237, 230), (147, 239, 232), + (178, 242, 231), (183, 244, 233), (188, 246, 235), (182, 246, 238), + (177, 247, 241), (170, 247, 243), (163, 248, 245), (152, 246, 248), + (143, 245, 250), (128, 236, 246), (125, 224, 239), (122, 213, 233), + (114, 208, 228), (107, 204, 223), (92, 192, 214), (85, 178, 204), + (70, 147, 180), (69, 126, 164), (69, 106, 148), (66, 96, 139), + (63, 87, 131), (59, 76, 119), (62, 73, 110), (74, 73, 114), + (93, 82, 113), (128, 104, 115), (137, 111, 104), (146, 119, 94), + (144, 122, 88), (143, 126, 82), (140, 127, 84), (141, 131, 86), + (136, 134, 100), (134, 132, 106), (133, 131, 112), (130, 130, 111), + (127, 129, 110), (121, 120, 110), (108, 119, 115), (100, 117, 120), + (93, 117, 130), (92, 120, 162), (95, 126, 169), (98, 133, 177), + (114, 141, 191), (126, 153, 208), (139, 164, 217), (153, 174, 228), + (182, 171, 237), (199, 163, 238), (216, 156, 240), (223, 149, 238), + (231, 142, 237), (239, 132, 224), (243, 123, 213), (242, 109, 209), + (244, 91, 208), (242, 53, 215), (242, 44, 218), (242, 35, 222), + (243, 26, 220), (243, 25, 213), (241, 24, 209), (238, 25, 204), + (222, 23, 203), (207, 18, 203), (193, 13, 203), (184, 13, 199), + (175, 14, 195), (161, 15, 188), (149, 18, 187), (145, 29, 185), + (140, 44, 183), (143, 74, 181), (143, 81, 178), (144, 89, 176), + (146, 109, 169), (147, 121, 171), (156, 137, 174), (165, 154, 177), + (193, 183, 200), (201, 186, 204), (210, 189, 208), (221, 196, 210), + (229, 198, 209), (237, 197, 206), (242, 196, 198), (240, 195, 196), + (237, 188, 191), (234, 160, 201), (232, 154, 204), (231, 148, 207), + (230, 138, 213), (231, 130, 213), (232, 126, 215), (233, 118, 209), + (235, 100, 210), (233, 93, 210), (231, 87, 211), (225, 77, 211), + (216, 68, 207), (207, 64, 202), (200, 61, 193), (192, 61, 190), + (186, 62, 191), (179, 65, 196), (168, 67, 198), (153, 73, 197), + (138, 79, 196), (126, 90, 193), (112, 102, 193), (108, 115, 198), + (113, 150, 221), (113, 156, 226), (114, 162, 231), (121, 168, 241), + (127, 172, 244), (133, 172, 246), (142, 172, 245), (152, 177, 246), + (164, 181, 246), (168, 186, 242), (173, 190, 241), (174, 192, 238), + (169, 191, 234), (164, 191, 230), (151, 193, 228), (140, 196, 230), + (129, 200, 229), (118, 206, 230), (109, 214, 232), (102, 224, 233), + (101, 230, 231), (102, 236, 229), (107, 240, 228), (115, 243, 225), + (127, 242, 221), (136, 236, 217), (150, 231, 210), (164, 225, 202), + (175, 221, 197), (180, 219, 197), (184, 221, 198), (187, 226, 201), + (184, 228, 205), (180, 228, 205), (171, 226, 202), (156, 220, 197), + (140, 211, 195), (124, 207, 196), (115, 209, 200), (113, 211, 209), + (117, 217, 220), (123, 225, 227), (124, 229, 231), (124, 227, 231), + (118, 226, 231), (111, 225, 228), (107, 220, 227), (111, 220, 228), + (123, 225, 229), (137, 232, 232), (153, 236, 235), (164, 241, 238), + (171, 246, 237), (171, 245, 236), (169, 243, 235), (171, 240, 227), + (173, 232, 221), (173, 219, 211), (173, 209, 205), (177, 205, 200), + (184, 198, 198), (185, 193, 202), (184, 186, 203), (182, 177, 205), + (177, 156, 198), (172, 136, 192), (151, 116, 176), (144, 99, 164), + (135, 88, 159), (137, 79, 163), (144, 78, 172), (150, 71, 173) + ), + +// 583 Mahogany +((49, 9, 15), (40, 6, 12), (30, 3, 9), (21, 0, 7), + (21, 0, 7), (21, 0, 8), (21, 0, 8), (21, 1, 8), + (22, 1, 9), (22, 1, 9), (22, 2, 10), (22, 2, 10), + (22, 2, 10), (22, 2, 10), (23, 2, 10), (23, 1, 10), + (24, 1, 11), (25, 2, 11), (28, 3, 12), (32, 5, 13), + (37, 6, 14), (43, 8, 16), (45, 8, 16), (47, 9, 17), + (52, 11, 17), (53, 11, 18), (55, 12, 19), (57, 12, 19), + (60, 12, 20), (61, 12, 19), (62, 12, 18), (65, 13, 19), + (70, 14, 19), (85, 19, 21), (97, 24, 23), (110, 29, 25), + (119, 35, 28), (128, 42, 31), (133, 46, 33), (138, 51, 36), + (164, 74, 49), (166, 76, 49), (168, 79, 49), (165, 76, 48), + (162, 74, 47), (162, 74, 48), (163, 75, 49), (162, 76, 50), + (158, 71, 47), (145, 57, 40), (141, 54, 39), (137, 52, 39), + (133, 48, 38), (129, 44, 37), (127, 42, 36), (126, 41, 35), + (116, 36, 32), (109, 32, 31), (103, 28, 30), (96, 24, 29), + (90, 21, 28), (86, 19, 27), (82, 18, 27), (74, 14, 23), + (68, 12, 21), (58, 9, 18), (53, 7, 16), (48, 6, 15), + (46, 5, 14), (44, 5, 14), (41, 3, 12), (40, 3, 12), + (40, 2, 10), (39, 2, 10), (38, 2, 10), (37, 2, 9), + (36, 2, 9), (35, 2, 9), (35, 2, 9), (33, 2, 9), + (31, 1, 8), (26, 1, 8), (25, 0, 7), (24, 0, 7), + (24, 0, 7), (25, 0, 7), (27, 0, 6), (30, 1, 8), + (39, 2, 8), (44, 3, 9), (49, 4, 10), (50, 4, 10), + (52, 5, 11), (53, 5, 11), (54, 6, 12), (56, 6, 13), + (57, 6, 12), (58, 8, 18), (57, 8, 19), (57, 9, 20), + (57, 9, 19), (58, 9, 18), (59, 10, 19), (61, 12, 21), + (70, 15, 24), (76, 16, 24), (82, 18, 25), (84, 19, 25), + (87, 20, 25), (92, 21, 23), (98, 23, 25), (103, 24, 26), + (106, 25, 29), (103, 23, 27), (100, 22, 26), (98, 22, 25), + (91, 20, 23), (82, 18, 23), (71, 16, 23), (60, 12, 18), + (41, 7, 14), (34, 5, 11), (28, 3, 9), (26, 2, 8), + (25, 2, 8), (23, 2, 9), (22, 1, 7), (21, 0, 6), + (21, 0, 6), (21, 0, 7), (21, 0, 7), (21, 0, 7), + (21, 0, 7), (22, 0, 7), (23, 0, 8), (24, 0, 8), + (26, 0, 10), (27, 0, 9), (29, 1, 9), (29, 0, 8), + (30, 0, 8), (31, 1, 10), (31, 1, 10), (31, 1, 10), + (31, 0, 8), (30, 1, 10), (29, 1, 9), (29, 1, 9), + (28, 1, 10), (28, 0, 8), (29, 0, 9), (31, 0, 7), + (40, 4, 10), (43, 5, 10), (47, 6, 11), (55, 9, 14), + (64, 11, 15), (71, 12, 14), (77, 14, 14), (81, 17, 16), + (83, 17, 17), (81, 16, 18), (79, 15, 17), (77, 15, 17), + (71, 13, 14), (63, 10, 11), (55, 9, 12), (48, 7, 13), + (38, 4, 10), (37, 3, 9), (37, 3, 9), (37, 3, 9), + (40, 4, 11), (44, 5, 12), (47, 7, 15), (49, 9, 18), + (49, 10, 19), (49, 10, 19), (49, 10, 20), (48, 9, 19), + (46, 9, 18), (42, 8, 17), (36, 7, 16), (31, 5, 14), + (26, 1, 10), (25, 0, 9), (25, 0, 9), (24, 0, 8), + (23, 0, 8), (23, 0, 8), (23, 0, 8), (23, 0, 8), + (24, 0, 8), (23, 0, 8), (23, 0, 6), (24, 1, 9), + (26, 1, 8), (29, 2, 9), (33, 4, 12), (40, 6, 15), + (46, 9, 18), (52, 12, 22), (58, 14, 24), (65, 15, 24), + (74, 17, 25), (83, 20, 29), (88, 22, 29), (91, 24, 33), + (91, 25, 32), (91, 25, 32), (92, 26, 36), (93, 25, 34), + (92, 25, 34), (89, 24, 31), (86, 23, 31), (83, 23, 33), + (80, 21, 31), (79, 19, 29), (78, 18, 28), (79, 16, 24), + (80, 16, 24), (81, 16, 23), (83, 16, 23), (85, 17, 23), + (88, 17, 24), (90, 17, 23), (92, 17, 23), (92, 18, 25), + (91, 17, 22), (91, 17, 22), (88, 15, 18), (83, 13, 17), + (77, 12, 18), (71, 10, 17), (68, 9, 16), (67, 9, 16), + (67, 9, 16), (67, 10, 17), (67, 10, 18), (68, 11, 19), + (69, 12, 20), (71, 13, 22), (71, 13, 22), (69, 13, 22), + (65, 12, 21), (59, 10, 18), (55, 9, 17), (51, 9, 17), + (48, 8, 17), (48, 9, 17), (50, 10, 19), (55, 12, 19), + (52, 11, 18), (48, 9, 15), (44, 8, 14), (41, 7, 14) + ), + +// 584 Marina +((19, 87, 122), (22, 88, 114), (18, 90, 112), (14, 92, 110), + (15, 103, 113), (17, 115, 116), (17, 119, 115), (18, 123, 115), + (13, 138, 116), (14, 139, 117), (16, 141, 118), (20, 135, 122), + (25, 130, 127), (30, 129, 135), (35, 128, 143), (36, 127, 148), + (38, 127, 153), (44, 119, 171), (47, 119, 175), (50, 119, 179), + (51, 120, 175), (52, 122, 172), (56, 123, 167), (61, 124, 163), + (103, 136, 137), (117, 146, 136), (132, 156, 135), (136, 160, 142), + (141, 164, 150), (141, 163, 148), (141, 163, 147), (149, 163, 145), + (139, 161, 147), (101, 149, 168), (84, 139, 166), (67, 129, 164), + (64, 125, 153), (62, 121, 142), (64, 121, 140), (67, 121, 138), + (65, 119, 128), (59, 112, 125), (53, 105, 122), (51, 102, 120), + (50, 100, 119), (46, 97, 117), (43, 94, 115), (29, 82, 114), + (14, 68, 111), (2, 55, 106), (1, 57, 105), (1, 59, 105), + (3, 65, 105), (6, 71, 106), (6, 77, 105), (6, 83, 105), + (5, 106, 109), (6, 114, 109), (7, 123, 110), (7, 130, 105), + (7, 138, 100), (6, 140, 99), (6, 142, 99), (5, 141, 97), + (6, 132, 93), (5, 114, 94), (8, 115, 102), (11, 117, 110), + (15, 119, 113), (20, 121, 116), (32, 129, 127), (47, 133, 132), + (67, 139, 146), (72, 146, 157), (77, 154, 168), (85, 157, 174), + (94, 160, 180), (97, 159, 181), (101, 159, 182), (101, 153, 184), + (97, 149, 192), (91, 144, 204), (95, 147, 206), (100, 151, 208), + (104, 155, 210), (109, 160, 212), (117, 164, 212), (132, 161, 194), + (150, 138, 142), (140, 129, 138), (130, 121, 134), (125, 114, 132), + (121, 108, 130), (114, 111, 118), (107, 93, 95), (98, 89, 89), + (71, 89, 96), (27, 94, 125), (20, 94, 128), (14, 95, 132), + (11, 96, 134), (9, 98, 137), (6, 102, 137), (4, 102, 138), + (4, 87, 136), (4, 84, 138), (5, 82, 140), (6, 83, 142), + (7, 84, 145), (10, 86, 148), (15, 89, 152), (20, 94, 156), + (26, 99, 159), (34, 103, 152), (36, 100, 144), (39, 97, 137), + (42, 91, 123), (42, 86, 111), (42, 81, 105), (35, 78, 97), + (27, 52, 57), (22, 41, 45), (18, 31, 33), (14, 31, 36), + (11, 32, 40), (6, 35, 53), (3, 36, 61), (0, 36, 64), + (1, 41, 72), (0, 60, 105), (0, 65, 114), (1, 71, 123), + (2, 79, 134), (3, 83, 142), (3, 87, 149), (3, 89, 156), + (5, 91, 162), (6, 90, 162), (7, 90, 163), (6, 90, 164), + (6, 90, 166), (7, 94, 173), (18, 102, 178), (35, 118, 188), + (57, 137, 199), (91, 169, 212), (94, 170, 211), (98, 172, 211), + (99, 182, 209), (94, 188, 208), (98, 193, 203), (99, 199, 202), + (97, 187, 190), (90, 182, 188), (83, 178, 187), (75, 170, 186), + (71, 169, 191), (76, 166, 196), (91, 167, 200), (102, 168, 206), + (112, 165, 210), (111, 160, 218), (108, 158, 216), (105, 156, 214), + (95, 149, 210), (86, 139, 205), (78, 133, 200), (72, 129, 197), + (63, 125, 190), (61, 122, 189), (59, 120, 189), (59, 122, 188), + (63, 124, 189), (71, 128, 188), (79, 133, 185), (86, 134, 180), + (88, 132, 176), (82, 128, 170), (78, 124, 163), (75, 123, 151), + (78, 129, 132), (86, 131, 118), (81, 132, 113), (71, 125, 115), + (45, 116, 123), (45, 117, 120), (46, 119, 118), (46, 122, 121), + (42, 119, 129), (35, 114, 144), (26, 107, 157), (23, 102, 163), + (25, 102, 167), (28, 104, 169), (34, 110, 171), (44, 117, 169), + (52, 121, 166), (57, 122, 165), (56, 118, 165), (51, 112, 158), + (50, 107, 146), (53, 102, 128), (60, 93, 111), (68, 78, 95), + (72, 60, 80), (80, 43, 64), (89, 33, 46), (97, 27, 32), + (111, 20, 19), (118, 15, 11), (121, 14, 9), (121, 20, 10), + (110, 32, 20), (107, 42, 34), (103, 54, 44), (98, 64, 54), + (96, 77, 59), (83, 92, 69), (73, 100, 80), (63, 110, 87), + (57, 111, 91), (56, 109, 90), (50, 104, 90), (42, 90, 84), + (26, 80, 73), (17, 71, 59), (10, 64, 53), (6, 57, 54), + (6, 49, 60), (2, 42, 65), (4, 38, 63), (5, 41, 64), + (5, 46, 73), (5, 52, 87), (2, 57, 104), (0, 61, 117), + (0, 65, 123), (0, 67, 128), (0, 68, 126), (1, 67, 125), + (1, 65, 122), (2, 63, 118), (2, 63, 117), (1, 62, 114), + (1, 62, 112), (1, 61, 112), (2, 62, 113), (3, 66, 119), + (4, 73, 126), (7, 80, 134), (10, 87, 138), (16, 95, 139), + (15, 87, 129), (13, 83, 121), (12, 77, 117), (10, 74, 114) + ), + +// 585 Meadow +((153, 129, 176), (154, 126, 170), (168, 135, 178), (183, 144, 187), + (195, 152, 198), (208, 160, 209), (212, 162, 213), (217, 165, 218), + (235, 179, 234), (228, 176, 228), (222, 173, 223), (203, 163, 206), + (185, 153, 190), (164, 147, 168), (143, 142, 146), (127, 140, 128), + (111, 138, 110), (105, 127, 91), (105, 124, 90), (105, 122, 89), + (108, 117, 88), (111, 112, 88), (111, 102, 93), (112, 92, 99), + (111, 76, 119), (103, 70, 111), (95, 64, 103), (84, 58, 94), + (74, 52, 85), (69, 50, 80), (65, 49, 75), (53, 45, 64), + (45, 41, 59), (38, 38, 50), (36, 38, 49), (35, 39, 48), + (34, 39, 45), (34, 39, 42), (34, 37, 41), (34, 36, 40), + (33, 35, 41), (34, 35, 43), (36, 36, 46), (44, 41, 52), + (52, 46, 59), (57, 48, 64), (62, 50, 70), (74, 57, 81), + (87, 64, 94), (110, 81, 117), (115, 86, 121), (120, 91, 126), + (114, 92, 121), (109, 93, 117), (103, 91, 111), (97, 89, 106), + (68, 93, 66), (55, 93, 51), (42, 93, 37), (36, 94, 30), + (31, 96, 24), (32, 96, 25), (34, 97, 27), (38, 97, 36), + (48, 101, 47), (72, 116, 101), (76, 130, 116), (81, 145, 132), + (79, 143, 123), (77, 141, 114), (68, 135, 90), (55, 142, 69), + (33, 138, 34), (39, 135, 23), (45, 133, 13), (43, 131, 7), + (42, 130, 2), (41, 131, 1), (40, 133, 1), (40, 133, 1), + (29, 126, 0), (37, 133, 2), (34, 128, 5), (31, 123, 9), + (34, 118, 15), (37, 113, 22), (45, 109, 35), (49, 99, 46), + (67, 83, 71), (71, 76, 78), (76, 70, 86), (80, 67, 90), + (84, 65, 94), (89, 62, 98), (94, 65, 102), (101, 70, 107), + (109, 78, 117), (130, 95, 135), (134, 98, 140), (139, 102, 145), + (139, 102, 145), (140, 102, 145), (134, 98, 139), (123, 92, 129), + (102, 78, 107), (95, 75, 100), (88, 72, 94), (85, 70, 91), + (82, 69, 89), (75, 67, 85), (77, 66, 88), (78, 67, 88), + (77, 66, 87), (64, 60, 80), (62, 58, 76), (60, 56, 73), + (57, 52, 68), (54, 52, 68), (57, 56, 72), (62, 58, 75), + (92, 70, 101), (106, 79, 114), (120, 89, 128), (128, 94, 136), + (137, 99, 144), (149, 106, 156), (161, 116, 166), (165, 121, 171), + (172, 126, 175), (175, 128, 178), (173, 127, 178), (172, 127, 178), + (172, 126, 177), (169, 126, 174), (162, 125, 167), (152, 124, 160), + (130, 140, 158), (118, 149, 158), (107, 159, 159), (99, 155, 145), + (92, 151, 132), (74, 144, 101), (52, 147, 74), (41, 137, 65), + (32, 134, 44), (34, 137, 14), (33, 128, 15), (32, 119, 17), + (33, 102, 23), (37, 88, 32), (44, 85, 36), (48, 72, 47), + (70, 61, 78), (79, 65, 86), (88, 70, 94), (101, 77, 108), + (99, 75, 106), (102, 79, 110), (101, 82, 109), (95, 83, 106), + (80, 76, 94), (56, 75, 69), (47, 73, 57), (39, 71, 45), + (27, 73, 26), (20, 69, 20), (26, 70, 18), (31, 70, 20), + (39, 69, 32), (45, 70, 37), (51, 72, 43), (57, 72, 54), + (69, 72, 70), (73, 76, 87), (80, 83, 98), (87, 95, 105), + (89, 97, 104), (87, 94, 100), (82, 84, 97), (77, 79, 92), + (71, 77, 85), (66, 71, 76), (62, 62, 71), (70, 61, 75), + (73, 72, 89), (79, 82, 95), (85, 93, 102), (95, 108, 115), + (99, 124, 127), (107, 125, 131), (105, 131, 132), (98, 129, 127), + (87, 124, 120), (85, 111, 111), (84, 93, 100), (79, 76, 91), + (82, 73, 92), (91, 75, 100), (104, 81, 112), (123, 90, 129), + (144, 103, 148), (165, 117, 166), (180, 128, 181), (189, 135, 189), + (192, 140, 192), (195, 142, 195), (196, 142, 196), (188, 138, 191), + (179, 132, 184), (174, 126, 179), (171, 123, 175), (162, 120, 168), + (151, 117, 159), (138, 108, 149), (124, 97, 135), (107, 87, 118), + (89, 79, 99), (72, 72, 82), (57, 66, 63), (40, 55, 41), + (29, 47, 29), (20, 42, 21), (17, 41, 15), (15, 39, 13), + (16, 38, 12), (12, 30, 12), (15, 25, 18), (21, 27, 29), + (24, 30, 31), (25, 28, 30), (25, 25, 34), (34, 32, 45), + (48, 47, 61), (64, 61, 75), (81, 71, 90), (106, 85, 114), + (129, 103, 135), (151, 124, 157), (173, 138, 177), (191, 148, 194), + (205, 154, 206), (208, 158, 212), (213, 160, 215), (208, 162, 211), + (203, 170, 199), (193, 176, 197), (199, 183, 205), (202, 186, 214), + (217, 197, 217), (210, 203, 216), (210, 204, 223), (202, 191, 230), + (199, 177, 222), (193, 164, 214), (180, 153, 202), (169, 140, 191) + ), + +// 586 Mermaid +((70, 122, 117), (80, 108, 100), (81, 102, 97), (82, 97, 94), + (76, 94, 104), (71, 92, 114), (67, 91, 120), (64, 90, 127), + (54, 86, 151), (60, 88, 156), (66, 91, 161), (76, 97, 166), + (87, 103, 172), (95, 110, 177), (103, 117, 183), (104, 121, 185), + (106, 125, 188), (101, 135, 205), (93, 139, 207), (86, 144, 210), + (84, 146, 210), (82, 148, 211), (81, 148, 211), (81, 149, 211), + (74, 129, 204), (73, 121, 202), (73, 114, 200), (66, 102, 198), + (59, 91, 196), (57, 89, 196), (56, 88, 196), (56, 91, 197), + (56, 93, 199), (51, 91, 203), (49, 92, 207), (48, 94, 211), + (41, 87, 213), (34, 80, 216), (31, 78, 217), (28, 76, 218), + (17, 71, 218), (15, 72, 216), (14, 73, 215), (15, 78, 212), + (17, 83, 210), (18, 88, 209), (20, 93, 209), (24, 102, 207), + (26, 108, 203), (34, 121, 193), (38, 126, 186), (43, 131, 179), + (44, 131, 166), (46, 131, 154), (46, 132, 149), (46, 134, 145), + (49, 138, 138), (44, 135, 139), (39, 132, 141), (36, 128, 148), + (34, 124, 156), (31, 119, 160), (29, 115, 165), (23, 103, 172), + (19, 91, 175), (16, 71, 178), (16, 66, 175), (16, 61, 173), + (19, 64, 172), (23, 68, 171), (32, 81, 168), (39, 89, 154), + (55, 116, 126), (63, 132, 118), (71, 148, 110), (78, 155, 113), + (85, 162, 116), (84, 161, 121), (84, 161, 127), (75, 151, 134), + (72, 139, 146), (70, 124, 179), (63, 114, 178), (57, 105, 178), + (56, 103, 174), (56, 101, 171), (57, 103, 161), (56, 106, 145), + (47, 113, 114), (43, 116, 104), (40, 119, 95), (36, 119, 91), + (32, 120, 88), (25, 120, 88), (23, 120, 90), (22, 119, 89), + (20, 118, 86), (28, 107, 77), (37, 101, 69), (47, 95, 61), + (51, 90, 56), (55, 86, 51), (66, 78, 44), (78, 77, 40), + (104, 89, 45), (104, 93, 42), (105, 98, 39), (102, 100, 37), + (99, 103, 35), (91, 106, 34), (82, 110, 37), (73, 114, 42), + (66, 118, 52), (59, 120, 79), (60, 119, 85), (61, 118, 92), + (67, 117, 102), (78, 118, 109), (88, 117, 110), (98, 114, 104), + (114, 108, 76), (119, 107, 63), (125, 107, 50), (126, 107, 46), + (128, 108, 43), (127, 107, 36), (124, 106, 30), (116, 106, 29), + (104, 102, 29), (73, 90, 25), (67, 88, 26), (61, 87, 27), + (53, 85, 33), (46, 83, 40), (39, 75, 42), (39, 67, 44), + (58, 60, 48), (70, 57, 45), (83, 54, 42), (90, 57, 39), + (98, 61, 37), (116, 80, 36), (124, 95, 30), (124, 105, 24), + (119, 117, 21), (103, 146, 26), (96, 148, 29), (90, 150, 33), + (78, 152, 47), (69, 157, 64), (61, 156, 83), (55, 152, 104), + (54, 161, 151), (56, 164, 159), (59, 168, 167), (60, 168, 175), + (54, 167, 175), (46, 164, 163), (42, 159, 141), (40, 150, 117), + (41, 143, 97), (54, 135, 61), (55, 131, 52), (57, 127, 44), + (55, 118, 35), (59, 117, 40), (71, 127, 58), (78, 140, 81), + (72, 142, 118), (71, 143, 127), (70, 144, 137), (74, 154, 162), + (77, 160, 182), (77, 158, 194), (72, 153, 202), (67, 152, 210), + (62, 148, 213), (53, 140, 213), (42, 133, 213), (34, 129, 209), + (29, 125, 199), (24, 118, 186), (22, 111, 170), (24, 106, 152), + (28, 100, 114), (30, 99, 109), (32, 98, 105), (36, 97, 99), + (37, 99, 100), (32, 97, 101), (30, 93, 107), (28, 87, 114), + (26, 84, 120), (22, 79, 119), (21, 71, 113), (24, 60, 101), + (27, 49, 84), (31, 41, 68), (35, 35, 54), (39, 34, 48), + (40, 35, 44), (39, 40, 46), (36, 48, 52), (31, 59, 61), + (26, 70, 68), (21, 79, 69), (17, 84, 66), (17, 88, 61), + (20, 93, 55), (24, 96, 51), (29, 96, 50), (35, 97, 54), + (40, 102, 64), (40, 106, 77), (39, 112, 94), (37, 116, 110), + (37, 122, 125), (33, 127, 138), (30, 132, 150), (29, 136, 158), + (33, 140, 163), (41, 143, 167), (54, 149, 171), (67, 153, 173), + (77, 152, 172), (86, 150, 165), (97, 150, 154), (105, 149, 140), + (106, 145, 123), (104, 145, 104), (103, 145, 85), (100, 145, 67), + (92, 143, 51), (84, 142, 37), (78, 141, 27), (73, 137, 21), + (71, 134, 20), (70, 130, 24), (71, 125, 31), (73, 120, 39), + (78, 116, 49), (86, 109, 59), (91, 104, 65), (94, 100, 68), + (96, 96, 71), (95, 92, 71), (86, 87, 65), (74, 87, 59), + (66, 92, 63), (63, 105, 80), (53, 113, 96), (44, 120, 106), + (40, 123, 113), (46, 130, 127), (51, 132, 135), (60, 130, 132) + ), + +// 587 Mesmerize +((20, 29, 51), (12, 59, 51), (12, 83, 57), (12, 107, 63), + (25, 120, 72), (39, 133, 82), (46, 145, 85), (53, 158, 89), + (77, 150, 120), (84, 151, 127), (91, 153, 135), (95, 148, 139), + (100, 143, 144), (112, 135, 146), (124, 128, 149), (132, 130, 154), + (140, 132, 159), (159, 138, 154), (171, 139, 156), (184, 141, 158), + (190, 145, 154), (197, 149, 151), (201, 146, 153), (206, 144, 156), + (224, 140, 154), (225, 118, 156), (226, 97, 159), (211, 85, 158), + (197, 74, 158), (188, 65, 155), (179, 56, 153), (140, 59, 152), + (100, 64, 147), (50, 65, 111), (40, 73, 101), (30, 81, 92), + (57, 81, 96), (85, 81, 101), (99, 86, 105), (113, 91, 109), + (179, 56, 135), (189, 47, 144), (199, 38, 154), (208, 29, 154), + (218, 21, 154), (216, 30, 155), (214, 39, 157), (228, 48, 159), + (196, 51, 149), (184, 88, 135), (172, 92, 124), (161, 96, 114), + (177, 99, 109), (193, 102, 104), (189, 105, 103), (186, 108, 102), + (161, 112, 115), (159, 124, 120), (157, 136, 125), (171, 133, 134), + (186, 130, 143), (200, 131, 144), (214, 133, 146), (233, 128, 147), + (240, 127, 143), (243, 133, 124), (245, 132, 122), (247, 132, 120), + (241, 134, 121), (236, 136, 122), (227, 127, 127), (218, 123, 133), + (182, 126, 149), (161, 120, 139), (141, 114, 130), (134, 114, 129), + (128, 114, 128), (123, 108, 128), (118, 103, 128), (110, 103, 130), + (122, 101, 137), (127, 85, 150), (129, 92, 150), (131, 100, 150), + (129, 108, 148), (127, 116, 147), (122, 123, 141), (118, 134, 139), + (140, 146, 134), (152, 129, 135), (165, 113, 136), (169, 108, 138), + (174, 104, 141), (177, 99, 154), (170, 92, 165), (161, 89, 166), + (164, 95, 170), (179, 118, 162), (192, 107, 143), (205, 97, 124), + (209, 95, 117), (214, 94, 111), (232, 76, 104), (236, 56, 101), + (245, 44, 107), (244, 45, 115), (244, 46, 124), (239, 48, 128), + (234, 51, 132), (225, 62, 135), (215, 72, 144), (202, 75, 157), + (191, 77, 158), (164, 70, 161), (153, 63, 164), (142, 56, 168), + (128, 41, 170), (116, 34, 167), (91, 44, 166), (81, 41, 163), + (105, 49, 153), (109, 58, 150), (113, 67, 148), (116, 71, 151), + (119, 76, 155), (131, 91, 160), (142, 110, 158), (148, 124, 157), + (167, 134, 150), (197, 133, 135), (198, 128, 131), (200, 123, 128), + (197, 108, 116), (194, 100, 110), (181, 101, 109), (163, 107, 115), + (132, 137, 128), (115, 142, 141), (99, 148, 155), (94, 147, 156), + (89, 146, 158), (111, 129, 163), (132, 125, 160), (148, 128, 146), + (179, 128, 135), (231, 139, 123), (235, 136, 118), (240, 134, 114), + (244, 130, 119), (249, 125, 126), (249, 117, 135), (250, 118, 144), + (246, 142, 154), (246, 144, 157), (246, 146, 160), (248, 149, 161), + (243, 139, 160), (247, 117, 160), (249, 96, 160), (247, 75, 160), + (251, 52, 161), (245, 39, 156), (242, 35, 153), (239, 31, 150), + (235, 38, 141), (224, 51, 134), (210, 52, 134), (202, 54, 132), + (181, 52, 132), (179, 51, 138), (178, 51, 144), (184, 37, 144), + (183, 35, 140), (187, 48, 144), (194, 54, 149), (210, 62, 147), + (223, 84, 138), (222, 109, 134), (229, 126, 133), (241, 134, 131), + (238, 142, 132), (237, 148, 136), (237, 143, 144), (221, 147, 152), + (195, 143, 160), (179, 143, 158), (164, 144, 156), (138, 143, 144), + (106, 120, 124), (73, 92, 103), (60, 71, 92), (71, 48, 96), + (87, 29, 97), (103, 14, 98), (154, 18, 120), (195, 29, 133), + (211, 33, 128), (234, 44, 124), (242, 61, 124), (241, 73, 125), + (246, 75, 120), (246, 82, 117), (244, 93, 110), (237, 107, 104), + (224, 117, 102), (217, 125, 89), (217, 142, 87), (218, 140, 89), + (220, 132, 85), (228, 128, 100), (241, 111, 113), (246, 91, 121), + (241, 74, 134), (234, 65, 149), (225, 54, 161), (208, 43, 167), + (191, 41, 164), (181, 42, 165), (172, 41, 173), (172, 41, 168), + (182, 54, 167), (198, 62, 175), (206, 61, 169), (210, 77, 166), + (216, 88, 168), (205, 83, 167), (192, 83, 164), (185, 84, 158), + (181, 78, 155), (181, 72, 153), (183, 74, 147), (192, 78, 148), + (204, 85, 150), (210, 95, 149), (213, 97, 153), (212, 101, 154), + (196, 104, 150), (178, 95, 147), (153, 96, 146), (109, 97, 136), + (85, 87, 118), (89, 92, 119), (79, 91, 124), (84, 77, 118), + (119, 75, 113), (151, 69, 119), (174, 56, 129), (193, 51, 119), + (205, 50, 104), (205, 48, 103), (168, 44, 96), (126, 42, 80), + (115, 31, 68), (72, 25, 61), (29, 33, 55), (26, 28, 49) + ), + +// 588 Midnight_Wave +((15, 35, 151), (16, 39, 153), (17, 39, 157), (18, 40, 161), + (19, 39, 165), (20, 39, 170), (20, 40, 171), (21, 42, 172), + (23, 47, 173), (22, 44, 171), (21, 41, 170), (20, 35, 167), + (20, 29, 164), (18, 27, 158), (17, 26, 153), (17, 26, 148), + (17, 26, 144), (12, 22, 126), (10, 18, 116), (9, 14, 106), + (7, 11, 94), (5, 8, 83), (4, 7, 77), (3, 6, 72), + (1, 3, 53), (0, 2, 45), (0, 2, 37), (0, 1, 32), + (0, 0, 27), (0, 0, 25), (0, 0, 24), (0, 0, 23), + (0, 0, 23), (0, 1, 25), (0, 1, 28), (0, 1, 31), + (0, 1, 34), (1, 2, 37), (2, 3, 38), (3, 5, 39), + (5, 8, 42), (5, 7, 42), (5, 7, 43), (4, 6, 41), + (4, 6, 39), (4, 6, 38), (5, 7, 37), (6, 9, 36), + (5, 8, 35), (3, 6, 34), (2, 4, 35), (1, 2, 36), + (1, 3, 40), (1, 4, 45), (1, 4, 49), (2, 5, 54), + (6, 16, 79), (13, 30, 94), (20, 44, 109), (41, 66, 126), + (62, 89, 143), (74, 99, 152), (87, 110, 162), (106, 129, 179), + (121, 148, 193), (139, 180, 217), (143, 186, 220), (148, 192, 224), + (148, 190, 224), (148, 188, 224), (144, 177, 221), (128, 158, 213), + (92, 124, 188), (72, 103, 173), (53, 82, 159), (36, 62, 143), + (20, 42, 127), (17, 36, 121), (15, 30, 116), (10, 21, 102), + (7, 15, 88), (3, 7, 66), (2, 5, 58), (1, 3, 50), + (0, 2, 47), (0, 2, 44), (0, 2, 39), (0, 2, 36), + (0, 2, 30), (0, 1, 29), (0, 1, 28), (0, 1, 28), + (0, 2, 28), (1, 2, 28), (1, 2, 28), (1, 2, 28), + (1, 2, 27), (1, 1, 27), (1, 1, 29), (1, 2, 32), + (1, 2, 34), (1, 3, 36), (2, 3, 42), (2, 4, 48), + (2, 5, 61), (3, 7, 71), (5, 10, 82), (6, 12, 87), + (8, 15, 92), (8, 15, 92), (8, 15, 94), (8, 15, 97), + (10, 16, 101), (16, 25, 129), (17, 27, 131), (19, 30, 134), + (21, 33, 137), (20, 34, 139), (20, 31, 137), (16, 25, 136), + (16, 25, 150), (16, 26, 150), (17, 27, 150), (16, 27, 148), + (16, 27, 147), (16, 24, 144), (14, 22, 143), (14, 25, 142), + (16, 34, 142), (26, 59, 148), (29, 65, 150), (32, 72, 152), + (38, 82, 160), (44, 95, 169), (49, 108, 178), (54, 114, 185), + (53, 113, 177), (49, 104, 166), (45, 95, 156), (43, 92, 151), + (42, 90, 146), (41, 83, 144), (37, 72, 142), (33, 65, 140), + (28, 59, 137), (22, 54, 130), (22, 55, 131), (23, 56, 132), + (22, 52, 134), (21, 49, 137), (20, 48, 137), (19, 47, 135), + (18, 49, 120), (17, 46, 114), (16, 44, 109), (13, 33, 97), + (9, 23, 84), (5, 12, 71), (3, 6, 58), (2, 4, 48), + (1, 3, 41), (0, 2, 34), (0, 2, 34), (0, 2, 34), + (0, 2, 35), (0, 1, 37), (0, 2, 40), (0, 2, 43), + (1, 3, 53), (1, 3, 56), (2, 4, 59), (2, 5, 66), + (3, 6, 77), (3, 6, 86), (4, 7, 92), (4, 7, 97), + (4, 7, 100), (4, 7, 100), (4, 8, 102), (4, 9, 105), + (4, 10, 105), (4, 10, 103), (4, 10, 102), (4, 10, 98), + (4, 10, 99), (4, 11, 101), (5, 12, 104), (7, 15, 110), + (9, 19, 118), (12, 22, 125), (15, 25, 132), (17, 27, 141), + (18, 28, 151), (19, 28, 160), (20, 28, 167), (20, 28, 169), + (20, 28, 165), (20, 27, 157), (18, 24, 147), (16, 21, 138), + (14, 17, 128), (11, 13, 117), (8, 10, 105), (6, 7, 91), + (4, 5, 78), (2, 5, 67), (2, 3, 58), (1, 3, 52), + (1, 3, 49), (1, 3, 48), (2, 3, 50), (2, 4, 54), + (3, 5, 56), (3, 5, 58), (3, 6, 60), (3, 6, 59), + (4, 5, 59), (4, 5, 60), (5, 6, 61), (4, 7, 63), + (5, 9, 68), (6, 11, 73), (7, 15, 82), (10, 20, 91), + (15, 29, 102), (18, 40, 112), (23, 50, 122), (28, 57, 135), + (30, 62, 148), (31, 67, 161), (34, 69, 172), (34, 72, 179), + (35, 74, 182), (36, 72, 181), (35, 67, 181), (31, 61, 178), + (27, 50, 172), (23, 43, 166), (19, 35, 160), (17, 29, 153), + (16, 25, 152), (16, 23, 152), (16, 24, 152), (18, 28, 154), + (18, 31, 156), (18, 33, 155), (18, 37, 157), (18, 38, 158), + (18, 38, 157), (19, 38, 157), (18, 38, 156), (17, 37, 155), + (16, 37, 156), (15, 36, 157), (14, 35, 155), (15, 34, 154) + ), + +// 589 Mint +((109, 152, 117), (117, 169, 136), (119, 172, 143), (121, 175, 150), + (121, 173, 147), (122, 172, 145), (121, 171, 144), (120, 171, 143), + (117, 160, 128), (110, 152, 123), (104, 144, 119), (94, 131, 116), + (84, 119, 113), (76, 108, 112), (69, 98, 111), (67, 93, 107), + (65, 89, 104), (69, 86, 104), (73, 91, 105), (78, 96, 107), + (86, 104, 115), (94, 113, 124), (97, 119, 127), (100, 125, 131), + (116, 140, 141), (120, 145, 143), (124, 151, 145), (129, 155, 149), + (135, 159, 154), (137, 162, 154), (139, 165, 155), (146, 175, 164), + (156, 180, 165), (157, 174, 155), (155, 170, 152), (153, 167, 150), + (145, 161, 150), (137, 155, 150), (136, 154, 150), (135, 154, 150), + (130, 148, 149), (123, 147, 140), (117, 146, 132), (111, 146, 126), + (105, 146, 120), (104, 147, 117), (103, 148, 115), (102, 149, 115), + (105, 155, 121), (123, 161, 133), (129, 165, 137), (136, 169, 142), + (139, 169, 142), (142, 169, 142), (142, 168, 141), (143, 167, 141), + (135, 165, 134), (130, 160, 131), (125, 155, 128), (117, 150, 124), + (110, 146, 121), (106, 142, 119), (102, 139, 118), (98, 134, 117), + (93, 131, 112), (93, 137, 110), (99, 140, 108), (105, 144, 106), + (110, 147, 106), (116, 150, 106), (125, 156, 110), (123, 156, 116), + (118, 148, 114), (108, 144, 111), (98, 140, 109), (90, 135, 99), + (82, 131, 90), (79, 129, 87), (77, 127, 85), (71, 123, 80), + (72, 123, 79), (70, 113, 83), (68, 109, 85), (67, 106, 88), + (66, 101, 88), (66, 96, 88), (60, 86, 83), (54, 79, 82), + (55, 68, 83), (56, 70, 86), (57, 72, 89), (58, 74, 90), + (59, 76, 91), (62, 84, 95), (69, 95, 99), (73, 104, 102), + (77, 110, 107), (84, 121, 108), (84, 116, 107), (84, 112, 107), + (84, 110, 106), (84, 109, 106), (88, 108, 105), (93, 113, 105), + (110, 129, 107), (111, 134, 108), (113, 140, 110), (112, 140, 109), + (111, 140, 108), (103, 127, 107), (96, 116, 102), (87, 111, 99), + (73, 97, 92), (57, 74, 74), (51, 71, 72), (45, 69, 70), + (34, 60, 59), (24, 45, 48), (20, 42, 44), (21, 44, 44), + (18, 43, 50), (29, 53, 59), (41, 63, 69), (44, 69, 73), + (47, 75, 78), (56, 85, 85), (70, 97, 95), (78, 105, 103), + (85, 110, 108), (97, 126, 121), (99, 129, 123), (102, 133, 125), + (109, 135, 130), (110, 139, 128), (110, 146, 127), (110, 148, 130), + (108, 148, 129), (105, 147, 130), (103, 146, 131), (103, 144, 133), + (103, 143, 136), (107, 145, 141), (113, 147, 140), (118, 150, 142), + (123, 156, 148), (128, 163, 138), (127, 163, 135), (126, 163, 133), + (123, 161, 123), (121, 158, 115), (119, 155, 108), (114, 150, 102), + (105, 148, 96), (101, 146, 95), (98, 144, 95), (89, 135, 90), + (80, 124, 87), (72, 109, 83), (62, 96, 75), (53, 84, 72), + (53, 76, 73), (56, 88, 85), (62, 95, 92), (68, 102, 100), + (78, 119, 108), (84, 130, 116), (91, 138, 124), (91, 143, 122), + (80, 132, 104), (74, 126, 99), (69, 121, 94), (59, 107, 80), + (50, 98, 67), (48, 92, 69), (48, 85, 71), (49, 86, 67), + (59, 93, 76), (65, 99, 88), (67, 102, 94), (71, 104, 93), + (70, 105, 92), (66, 103, 95), (63, 95, 94), (58, 90, 89), + (57, 95, 87), (59, 97, 86), (61, 99, 85), (70, 108, 88), + (81, 124, 89), (93, 135, 91), (107, 142, 98), (117, 151, 104), + (124, 160, 109), (130, 161, 117), (130, 159, 121), (126, 156, 122), + (124, 149, 127), (115, 141, 127), (104, 133, 124), (100, 126, 121), + (92, 119, 116), (83, 117, 109), (85, 121, 103), (89, 124, 99), + (94, 132, 98), (101, 141, 104), (112, 147, 111), (123, 151, 120), + (129, 152, 133), (130, 151, 143), (131, 148, 147), (132, 144, 149), + (127, 141, 148), (124, 137, 141), (119, 129, 137), (111, 124, 134), + (109, 123, 129), (105, 117, 128), (102, 118, 130), (105, 126, 131), + (106, 130, 133), (110, 137, 135), (115, 146, 136), (114, 150, 140), + (111, 155, 142), (114, 162, 139), (117, 165, 139), (114, 166, 141), + (111, 168, 140), (116, 167, 138), (115, 165, 135), (111, 160, 133), + (110, 150, 131), (105, 144, 128), (104, 136, 125), (102, 125, 121), + (95, 115, 118), (88, 105, 116), (86, 102, 117), (87, 101, 116), + (86, 98, 115), (85, 100, 116), (91, 107, 115), (94, 110, 116), + (93, 113, 119), (93, 116, 119), (91, 116, 120), (90, 116, 120), + (88, 112, 117), (84, 108, 115), (82, 104, 110), (81, 104, 104), + (83, 108, 98), (88, 111, 93), (93, 122, 98), (102, 142, 108) + ), + +// 590 Mistic +((29, 24, 66), (23, 20, 65), (19, 18, 64), (15, 17, 64), + (12, 14, 59), (10, 11, 54), (7, 9, 50), (5, 8, 46), + (7, 12, 36), (12, 19, 35), (18, 26, 34), (24, 32, 41), + (31, 39, 49), (38, 44, 56), (45, 49, 63), (48, 50, 66), + (52, 52, 69), (48, 47, 84), (43, 40, 85), (38, 34, 87), + (36, 33, 92), (35, 32, 98), (34, 32, 101), (34, 33, 105), + (43, 38, 108), (52, 47, 113), (61, 56, 119), (69, 64, 120), + (78, 72, 122), (79, 75, 121), (81, 78, 120), (83, 82, 115), + (82, 85, 111), (79, 85, 106), (77, 81, 101), (75, 77, 97), + (76, 76, 97), (77, 76, 97), (77, 75, 95), (78, 74, 94), + (90, 77, 93), (95, 80, 98), (101, 84, 104), (104, 86, 106), + (108, 88, 109), (109, 91, 113), (110, 94, 117), (115, 98, 127), + (119, 98, 136), (111, 98, 147), (100, 89, 143), (90, 81, 139), + (77, 70, 130), (65, 59, 122), (59, 53, 117), (53, 48, 112), + (38, 37, 87), (42, 40, 82), (46, 43, 78), (54, 50, 81), + (63, 57, 85), (66, 62, 88), (70, 68, 92), (78, 75, 101), + (83, 81, 114), (90, 92, 132), (92, 94, 134), (94, 97, 136), + (97, 99, 136), (100, 101, 137), (108, 105, 144), (117, 111, 149), + (132, 118, 155), (142, 125, 163), (153, 133, 172), (163, 143, 181), + (174, 154, 191), (177, 154, 188), (180, 155, 185), (176, 149, 181), + (175, 152, 186), (167, 142, 168), (148, 127, 151), (129, 112, 135), + (123, 107, 130), (117, 103, 126), (107, 93, 117), (99, 92, 112), + (91, 89, 110), (91, 89, 115), (91, 89, 121), (90, 88, 124), + (90, 87, 128), (87, 85, 130), (85, 83, 129), (80, 81, 124), + (77, 74, 120), (76, 67, 117), (82, 70, 119), (88, 74, 121), + (91, 77, 122), (95, 80, 123), (100, 84, 122), (100, 89, 126), + (92, 84, 120), (87, 82, 113), (83, 81, 106), (83, 79, 103), + (83, 77, 101), (86, 77, 102), (95, 80, 106), (100, 84, 110), + (103, 88, 111), (110, 94, 116), (109, 92, 117), (108, 91, 118), + (100, 85, 119), (90, 80, 120), (89, 79, 123), (91, 81, 125), + (97, 92, 139), (110, 103, 146), (124, 114, 153), (132, 119, 154), + (140, 125, 155), (153, 135, 157), (162, 142, 157), (167, 143, 156), + (168, 140, 156), (164, 139, 150), (159, 136, 146), (154, 134, 143), + (142, 123, 141), (129, 115, 139), (119, 109, 136), (108, 104, 129), + (90, 85, 122), (84, 79, 118), (78, 74, 114), (76, 73, 113), + (75, 73, 113), (75, 75, 115), (75, 76, 114), (76, 77, 113), + (79, 80, 111), (88, 90, 118), (87, 90, 118), (87, 91, 118), + (87, 91, 111), (85, 87, 104), (84, 89, 101), (84, 91, 103), + (88, 91, 104), (89, 92, 103), (90, 93, 103), (93, 98, 106), + (97, 104, 114), (99, 105, 119), (99, 104, 116), (97, 99, 110), + (94, 90, 102), (84, 76, 90), (80, 74, 89), (77, 72, 88), + (73, 63, 86), (72, 53, 84), (68, 49, 81), (62, 49, 84), + (49, 40, 81), (46, 36, 77), (43, 33, 74), (36, 26, 70), + (29, 22, 66), (24, 19, 59), (19, 17, 52), (16, 14, 45), + (14, 16, 46), (21, 26, 49), (32, 36, 54), (44, 47, 58), + (55, 57, 68), (72, 71, 85), (90, 86, 104), (108, 100, 118), + (145, 121, 141), (155, 125, 145), (165, 129, 149), (177, 134, 150), + (182, 138, 149), (182, 137, 148), (178, 135, 148), (171, 128, 146), + (155, 116, 144), (134, 104, 141), (112, 92, 139), (96, 82, 135), + (83, 71, 134), (68, 60, 127), (56, 51, 125), (47, 45, 117), + (43, 41, 112), (38, 36, 106), (35, 34, 104), (31, 34, 101), + (31, 39, 95), (33, 44, 90), (43, 54, 88), (54, 67, 95), + (72, 80, 106), (88, 94, 116), (104, 106, 125), (117, 122, 136), + (131, 132, 149), (145, 141, 161), (153, 144, 168), (160, 151, 170), + (168, 156, 170), (179, 158, 169), (189, 161, 166), (198, 160, 164), + (203, 160, 161), (208, 155, 160), (207, 152, 154), (200, 145, 149), + (189, 142, 144), (184, 137, 139), (175, 130, 132), (150, 112, 126), + (122, 95, 116), (107, 79, 103), (101, 70, 89), (83, 60, 82), + (62, 53, 77), (47, 42, 70), (42, 31, 65), (36, 29, 65), + (30, 31, 69), (27, 33, 72), (27, 26, 72), (27, 22, 69), + (24, 17, 67), (18, 13, 61), (16, 8, 51), (15, 6, 38), + (15, 7, 34), (9, 6, 31), (9, 4, 31), (6, 2, 27), + (7, 3, 30), (5, 5, 37), (9, 9, 47), (14, 11, 53), + (20, 12, 55), (21, 13, 56), (24, 19, 59), (25, 23, 65) + ), + +// 591 Mixed_Berry +((110, 35, 80), (140, 36, 80), (142, 30, 78), (144, 24, 76), + (149, 18, 80), (155, 13, 84), (149, 13, 82), (144, 14, 81), + (103, 12, 83), (80, 9, 80), (57, 7, 78), (48, 13, 71), + (40, 19, 64), (51, 25, 52), (63, 31, 40), (67, 29, 34), + (71, 27, 29), (97, 24, 22), (107, 24, 21), (118, 25, 21), + (125, 21, 22), (132, 18, 23), (137, 19, 25), (143, 20, 28), + (172, 25, 23), (176, 29, 22), (180, 33, 21), (172, 39, 31), + (165, 46, 42), (157, 52, 47), (149, 58, 53), (128, 64, 61), + (99, 58, 70), (59, 59, 89), (57, 51, 82), (56, 44, 75), + (65, 32, 67), (74, 21, 60), (77, 20, 54), (81, 20, 48), + (84, 21, 29), (77, 21, 31), (70, 21, 34), (61, 24, 44), + (53, 28, 54), (51, 26, 58), (49, 25, 62), (51, 20, 70), + (69, 16, 84), (118, 25, 93), (140, 25, 85), (162, 25, 78), + (181, 24, 71), (201, 23, 64), (203, 22, 58), (205, 22, 53), + (195, 18, 47), (185, 14, 49), (176, 11, 51), (162, 13, 58), + (149, 15, 66), (145, 14, 66), (141, 13, 67), (130, 10, 67), + (119, 11, 71), (103, 15, 78), (92, 12, 72), (81, 9, 67), + (76, 8, 70), (71, 8, 74), (61, 14, 78), (54, 21, 83), + (41, 42, 92), (43, 52, 96), (45, 63, 100), (44, 77, 95), + (44, 91, 90), (51, 95, 84), (58, 100, 78), (73, 100, 69), + (78, 92, 62), (94, 74, 47), (111, 64, 50), (129, 55, 53), + (133, 50, 53), (137, 45, 53), (137, 32, 59), (137, 28, 66), + (127, 38, 74), (113, 35, 75), (100, 33, 77), (93, 33, 75), + (87, 33, 73), (75, 40, 74), (63, 51, 80), (58, 50, 85), + (59, 53, 87), (60, 72, 90), (57, 68, 93), (54, 65, 96), + (52, 60, 98), (51, 56, 101), (48, 52, 106), (40, 40, 103), + (24, 19, 80), (19, 17, 74), (15, 16, 68), (12, 19, 61), + (10, 23, 54), (16, 30, 36), (30, 38, 27), (40, 44, 27), + (44, 49, 29), (72, 52, 25), (77, 53, 29), (83, 55, 34), + (82, 56, 46), (72, 59, 50), (67, 59, 45), (58, 67, 39), + (36, 91, 37), (46, 91, 30), (57, 92, 23), (65, 87, 19), + (73, 83, 16), (81, 85, 10), (99, 78, 17), (118, 65, 24), + (128, 50, 34), (124, 42, 44), (121, 39, 47), (118, 36, 50), + (115, 32, 59), (115, 29, 62), (119, 29, 62), (122, 28, 55), + (145, 17, 44), (155, 14, 39), (165, 12, 35), (168, 11, 35), + (171, 10, 36), (177, 13, 37), (184, 14, 36), (186, 18, 34), + (181, 19, 39), (158, 23, 51), (151, 22, 50), (145, 22, 49), + (123, 21, 53), (104, 14, 62), (81, 17, 74), (63, 17, 79), + (34, 27, 91), (31, 35, 93), (29, 44, 96), (26, 62, 93), + (22, 76, 91), (16, 95, 89), (15, 116, 85), (13, 133, 72), + (15, 136, 68), (28, 133, 63), (36, 127, 57), (44, 121, 52), + (67, 106, 48), (88, 87, 43), (116, 70, 45), (145, 51, 43), + (192, 30, 43), (200, 27, 49), (209, 24, 55), (218, 22, 69), + (222, 16, 72), (221, 18, 69), (225, 21, 67), (223, 28, 71), + (219, 23, 63), (212, 16, 49), (211, 12, 38), (213, 16, 36), + (215, 16, 34), (213, 11, 30), (208, 7, 30), (205, 7, 40), + (200, 8, 61), (194, 9, 62), (188, 11, 63), (167, 14, 69), + (150, 15, 82), (130, 22, 91), (110, 37, 90), (87, 56, 82), + (68, 68, 78), (52, 83, 73), (38, 101, 62), (29, 114, 47), + (22, 107, 40), (25, 97, 33), (29, 90, 30), (38, 84, 29), + (44, 69, 37), (56, 54, 43), (72, 49, 49), (86, 51, 56), + (90, 58, 69), (90, 69, 78), (94, 82, 87), (94, 94, 83), + (82, 105, 84), (69, 111, 87), (69, 111, 99), (81, 104, 97), + (92, 98, 88), (103, 87, 78), (125, 74, 75), (155, 57, 73), + (179, 48, 62), (198, 43, 48), (212, 41, 33), (219, 35, 28), + (218, 33, 20), (208, 33, 16), (194, 31, 10), (179, 29, 8), + (170, 27, 7), (166, 26, 9), (162, 20, 10), (157, 18, 10), + (163, 23, 10), (174, 31, 10), (181, 34, 11), (179, 32, 10), + (179, 30, 14), (179, 32, 20), (178, 29, 32), (166, 28, 43), + (156, 20, 57), (143, 20, 67), (129, 16, 81), (109, 21, 93), + (95, 21, 106), (92, 22, 111), (84, 19, 114), (74, 24, 112), + (60, 36, 111), (65, 50, 111), (70, 59, 112), (77, 65, 113), + (74, 67, 111), (78, 70, 107), (89, 68, 102), (98, 68, 99), + (99, 68, 98), (105, 58, 95), (108, 46, 82), (113, 34, 78) + ), + +// 592 More_Blue +((81, 103, 125), (61, 83, 110), (52, 73, 102), (43, 63, 94), + (41, 62, 91), (40, 62, 88), (39, 62, 88), (38, 62, 88), + (36, 63, 90), (35, 63, 95), (34, 63, 100), (30, 61, 103), + (26, 59, 106), (22, 59, 103), (19, 59, 100), (18, 58, 98), + (17, 57, 96), (15, 49, 84), (16, 49, 79), (17, 49, 74), + (19, 49, 75), (22, 50, 77), (22, 50, 76), (22, 51, 76), + (19, 45, 72), (18, 42, 71), (17, 39, 70), (17, 39, 68), + (18, 40, 66), (18, 40, 65), (19, 40, 65), (23, 45, 63), + (30, 50, 68), (46, 67, 82), (53, 76, 90), (60, 86, 98), + (65, 94, 109), (71, 103, 121), (73, 108, 128), (75, 113, 135), + (79, 124, 159), (79, 127, 160), (80, 130, 162), (85, 134, 165), + (91, 139, 168), (92, 140, 171), (94, 142, 174), (92, 142, 175), + (86, 140, 169), (83, 131, 153), (77, 122, 147), (71, 114, 141), + (58, 100, 130), (45, 86, 119), (40, 79, 112), (35, 72, 105), + (25, 50, 84), (19, 39, 74), (14, 28, 64), (11, 22, 52), + (8, 17, 41), (7, 16, 36), (7, 16, 32), (7, 17, 27), + (9, 17, 26), (17, 28, 36), (28, 40, 48), (39, 53, 60), + (47, 62, 68), (56, 72, 76), (73, 90, 94), (88, 110, 117), + (121, 147, 161), (140, 165, 174), (159, 184, 187), (157, 185, 191), + (155, 187, 196), (149, 183, 196), (144, 180, 196), (133, 174, 197), + (127, 164, 187), (100, 131, 153), (78, 110, 135), (56, 89, 118), + (48, 80, 111), (41, 72, 105), (30, 60, 92), (25, 50, 78), + (21, 39, 52), (19, 38, 48), (18, 38, 44), (18, 39, 45), + (18, 40, 47), (20, 44, 51), (26, 53, 58), (35, 60, 67), + (42, 68, 72), (44, 69, 83), (42, 67, 85), (41, 65, 88), + (41, 63, 86), (41, 62, 84), (39, 56, 79), (34, 49, 70), + (19, 29, 53), (15, 24, 45), (11, 20, 37), (10, 20, 34), + (10, 20, 31), (8, 19, 28), (9, 19, 27), (10, 21, 30), + (12, 23, 32), (17, 29, 35), (18, 30, 36), (20, 31, 37), + (21, 31, 40), (22, 31, 43), (21, 31, 45), (19, 29, 45), + (14, 23, 43), (11, 21, 42), (9, 19, 42), (8, 18, 43), + (7, 18, 44), (5, 16, 47), (4, 15, 51), (3, 17, 55), + (2, 18, 59), (2, 21, 63), (2, 20, 63), (3, 19, 63), + (3, 19, 61), (3, 18, 57), (1, 17, 51), (1, 16, 44), + (2, 13, 33), (1, 14, 32), (1, 15, 32), (1, 16, 34), + (1, 18, 36), (1, 23, 43), (3, 29, 53), (2, 35, 64), + (2, 37, 77), (1, 38, 94), (1, 38, 95), (2, 38, 97), + (2, 37, 97), (3, 36, 96), (4, 34, 97), (5, 33, 93), + (11, 36, 85), (13, 38, 83), (16, 40, 81), (18, 43, 78), + (19, 43, 76), (19, 43, 73), (18, 43, 74), (19, 43, 75), + (18, 42, 73), (15, 31, 64), (13, 28, 61), (12, 26, 59), + (10, 24, 57), (7, 27, 60), (8, 28, 64), (11, 32, 70), + (22, 46, 86), (23, 48, 86), (25, 51, 87), (27, 52, 89), + (28, 51, 85), (33, 54, 87), (34, 54, 91), (36, 53, 85), + (35, 50, 79), (32, 46, 69), (30, 45, 62), (25, 47, 65), + (20, 49, 71), (17, 54, 80), (19, 56, 88), (16, 56, 93), + (9, 50, 109), (6, 52, 117), (4, 55, 126), (9, 59, 142), + (15, 65, 149), (19, 71, 150), (26, 68, 146), (29, 72, 143), + (30, 75, 149), (36, 80, 151), (37, 86, 152), (37, 85, 151), + (38, 85, 144), (32, 77, 138), (28, 69, 130), (23, 61, 124), + (14, 49, 120), (9, 43, 117), (4, 38, 115), (1, 37, 112), + (2, 39, 108), (1, 38, 108), (1, 39, 109), (5, 44, 116), + (8, 53, 124), (16, 65, 132), (25, 77, 142), (30, 85, 148), + (37, 91, 156), (39, 99, 162), (40, 105, 168), (47, 111, 173), + (46, 109, 172), (44, 102, 167), (38, 93, 160), (28, 84, 151), + (23, 74, 141), (17, 64, 131), (12, 52, 118), (7, 39, 107), + (2, 29, 98), (1, 22, 95), (1, 21, 99), (2, 26, 105), + (2, 29, 113), (4, 38, 118), (8, 43, 121), (13, 45, 124), + (18, 53, 127), (22, 57, 127), (24, 62, 123), (27, 63, 113), + (30, 60, 99), (31, 56, 88), (32, 53, 78), (31, 51, 73), + (29, 50, 70), (29, 50, 70), (30, 49, 71), (29, 50, 73), + (31, 55, 77), (35, 60, 81), (42, 66, 88), (50, 74, 95), + (58, 80, 102), (69, 93, 110), (83, 105, 117), (91, 112, 127), + (92, 112, 132), (88, 108, 134), (83, 105, 133), (83, 104, 128) + ), + +// 593 Morning_Glories_at_Night +((43, 62, 147), (47, 68, 152), (44, 68, 146), (41, 68, 140), + (37, 69, 130), (34, 70, 120), (34, 72, 114), (34, 75, 109), + (33, 83, 88), (30, 83, 76), (27, 83, 65), (23, 78, 57), + (19, 74, 49), (15, 71, 45), (12, 68, 41), (11, 68, 39), + (10, 69, 37), (11, 67, 34), (11, 63, 36), (11, 60, 38), + (11, 57, 39), (11, 54, 40), (10, 53, 38), (10, 53, 37), + (7, 56, 28), (6, 60, 26), (6, 65, 25), (13, 71, 31), + (20, 77, 38), (22, 78, 45), (25, 80, 53), (28, 82, 64), + (31, 83, 72), (27, 84, 71), (29, 86, 71), (31, 89, 72), + (34, 88, 78), (38, 88, 85), (40, 86, 89), (42, 84, 94), + (42, 73, 103), (39, 70, 99), (37, 68, 96), (37, 67, 89), + (37, 67, 82), (37, 66, 80), (38, 65, 79), (38, 62, 80), + (40, 58, 82), (39, 50, 86), (39, 47, 87), (39, 44, 88), + (38, 40, 87), (38, 37, 86), (37, 36, 84), (36, 36, 83), + (31, 31, 79), (31, 28, 78), (32, 25, 77), (32, 22, 77), + (33, 19, 78), (33, 19, 78), (33, 19, 78), (32, 19, 78), + (30, 21, 77), (31, 24, 75), (30, 25, 73), (29, 26, 72), + (28, 26, 71), (28, 27, 71), (26, 25, 68), (22, 25, 65), + (16, 28, 57), (14, 31, 51), (12, 35, 45), (10, 39, 40), + (8, 44, 35), (7, 45, 32), (6, 46, 30), (6, 47, 30), + (8, 50, 32), (21, 62, 46), (31, 75, 60), (42, 88, 74), + (45, 93, 81), (49, 99, 88), (55, 104, 101), (58, 105, 114), + (60, 98, 138), (64, 98, 147), (68, 98, 156), (70, 99, 159), + (73, 100, 162), (74, 100, 163), (73, 98, 161), (70, 94, 155), + (64, 84, 150), (53, 66, 138), (51, 64, 136), (49, 62, 135), + (50, 64, 134), (52, 66, 134), (56, 71, 132), (62, 76, 130), + (73, 90, 131), (76, 94, 136), (79, 98, 142), (79, 99, 146), + (80, 100, 151), (79, 102, 160), (78, 102, 167), (78, 104, 171), + (79, 105, 171), (81, 106, 172), (80, 104, 173), (79, 103, 174), + (75, 99, 177), (70, 93, 177), (65, 86, 173), (61, 77, 168), + (55, 64, 152), (51, 59, 144), (48, 54, 136), (46, 52, 132), + (44, 51, 129), (39, 46, 119), (35, 41, 111), (30, 35, 101), + (30, 31, 93), (29, 27, 86), (29, 27, 87), (30, 28, 88), + (32, 31, 88), (33, 34, 88), (31, 35, 88), (31, 35, 87), + (30, 38, 85), (33, 40, 85), (36, 43, 85), (37, 44, 84), + (39, 46, 83), (40, 47, 81), (39, 47, 80), (36, 48, 79), + (33, 46, 78), (29, 43, 87), (29, 43, 89), (30, 44, 92), + (35, 47, 99), (40, 51, 106), (47, 59, 111), (52, 66, 117), + (61, 74, 125), (59, 74, 123), (58, 75, 121), (56, 74, 116), + (53, 73, 109), (51, 74, 99), (49, 75, 89), (47, 73, 83), + (48, 71, 79), (36, 61, 74), (32, 58, 73), (29, 55, 72), + (22, 51, 67), (17, 46, 60), (12, 41, 55), (12, 36, 54), + (13, 29, 59), (13, 28, 63), (13, 27, 67), (15, 28, 77), + (18, 27, 83), (21, 28, 87), (24, 29, 90), (24, 29, 90), + (24, 29, 91), (22, 29, 93), (21, 31, 99), (20, 31, 107), + (21, 31, 115), (23, 32, 125), (24, 33, 131), (24, 36, 138), + (25, 40, 144), (26, 43, 144), (27, 46, 145), (32, 53, 145), + (39, 62, 146), (47, 72, 145), (55, 83, 146), (61, 93, 144), + (64, 99, 147), (66, 102, 150), (67, 102, 152), (68, 102, 155), + (68, 103, 156), (69, 103, 157), (71, 103, 155), (69, 103, 155), + (64, 100, 157), (59, 92, 159), (52, 84, 162), (44, 75, 164), + (37, 67, 164), (32, 59, 160), (30, 56, 152), (30, 54, 145), + (30, 51, 138), (30, 50, 135), (31, 48, 134), (29, 47, 131), + (25, 44, 127), (23, 43, 121), (24, 42, 114), (25, 42, 106), + (28, 41, 102), (33, 44, 102), (41, 51, 103), (46, 56, 107), + (50, 65, 110), (55, 76, 112), (58, 85, 113), (61, 91, 115), + (65, 97, 123), (71, 105, 131), (77, 108, 141), (79, 110, 150), + (81, 114, 157), (80, 117, 159), (77, 114, 158), (73, 111, 156), + (71, 106, 154), (70, 101, 153), (69, 95, 152), (68, 92, 150), + (67, 89, 146), (64, 85, 140), (61, 81, 130), (58, 78, 120), + (57, 75, 112), (57, 73, 105), (58, 74, 99), (57, 75, 95), + (55, 74, 93), (55, 74, 93), (53, 74, 92), (49, 72, 96), + (47, 68, 101), (45, 64, 107), (41, 62, 113), (38, 58, 117), + (36, 55, 123), (36, 55, 128), (36, 56, 135), (39, 58, 141) + ), + +// 594 Moss +((139, 139, 109), (75, 80, 59), (56, 60, 45), (37, 40, 31), + (28, 31, 22), (19, 22, 14), (21, 22, 14), (23, 22, 15), + (52, 37, 25), (70, 52, 32), (88, 68, 39), (101, 82, 51), + (115, 97, 63), (117, 101, 63), (119, 106, 63), (115, 107, 65), + (112, 108, 67), (78, 85, 63), (60, 70, 53), (43, 55, 44), + (31, 40, 35), (19, 25, 26), (15, 20, 21), (12, 16, 16), + (12, 4, 4), (14, 2, 2), (17, 1, 0), (22, 2, 1), + (28, 3, 2), (29, 3, 2), (31, 4, 2), (30, 6, 0), + (29, 9, 2), (40, 23, 17), (46, 33, 24), (53, 44, 31), + (62, 57, 44), (71, 71, 57), (77, 76, 62), (84, 82, 68), + (103, 92, 79), (103, 96, 85), (104, 101, 91), (101, 96, 87), + (98, 92, 84), (90, 91, 79), (83, 90, 75), (64, 83, 67), + (49, 74, 56), (27, 53, 33), (18, 46, 27), (10, 39, 22), + (16, 37, 21), (22, 35, 20), (24, 36, 20), (27, 38, 20), + (30, 37, 27), (28, 35, 22), (26, 33, 18), (21, 25, 13), + (17, 18, 9), (15, 14, 7), (14, 11, 6), (15, 8, 3), + (25, 10, 3), (51, 29, 22), (68, 44, 31), (85, 60, 41), + (97, 68, 47), (109, 76, 54), (126, 93, 72), (136, 108, 91), + (149, 133, 105), (145, 132, 101), (142, 132, 98), (131, 121, 94), + (120, 111, 90), (111, 104, 82), (103, 97, 75), (87, 81, 58), + (72, 64, 48), (54, 43, 37), (53, 35, 33), (52, 28, 29), + (53, 30, 30), (54, 33, 32), (56, 43, 39), (66, 55, 47), + (82, 65, 60), (82, 69, 62), (82, 73, 65), (81, 71, 63), + (81, 70, 62), (79, 68, 54), (71, 60, 47), (65, 55, 39), + (60, 46, 34), (58, 43, 22), (62, 48, 29), (67, 54, 37), + (72, 58, 42), (78, 63, 47), (87, 72, 55), (96, 84, 67), + (127, 124, 109), (137, 140, 126), (147, 157, 144), (142, 163, 151), + (137, 170, 159), (135, 187, 170), (130, 192, 169), (136, 194, 174), + (132, 185, 170), (116, 166, 146), (114, 159, 139), (112, 152, 133), + (115, 139, 122), (114, 127, 116), (105, 113, 107), (84, 99, 97), + (50, 80, 75), (36, 66, 67), (22, 52, 60), (16, 45, 53), + (10, 39, 46), (2, 30, 30), (1, 19, 21), (2, 12, 16), + (4, 9, 13), (17, 21, 14), (22, 26, 18), (28, 31, 22), + (39, 42, 33), (46, 54, 43), (54, 64, 51), (57, 73, 59), + (56, 85, 65), (52, 97, 72), (49, 110, 79), (51, 109, 81), + (53, 109, 84), (55, 110, 86), (64, 112, 87), (68, 123, 94), + (81, 124, 99), (113, 120, 103), (118, 123, 105), (124, 126, 107), + (135, 135, 105), (141, 144, 108), (145, 157, 109), (150, 170, 124), + (165, 194, 146), (165, 197, 143), (165, 201, 140), (163, 198, 137), + (156, 199, 135), (153, 190, 140), (138, 185, 135), (124, 175, 132), + (118, 171, 124), (108, 147, 115), (98, 143, 116), (88, 140, 117), + (79, 142, 114), (90, 133, 112), (92, 120, 97), (85, 107, 86), + (62, 83, 61), (57, 74, 56), (52, 66, 51), (47, 56, 47), + (45, 48, 45), (46, 48, 42), (47, 51, 40), (56, 57, 42), + (65, 63, 45), (78, 62, 45), (86, 62, 43), (94, 58, 37), + (93, 57, 30), (92, 51, 22), (92, 43, 18), (94, 36, 18), + (84, 50, 29), (83, 55, 34), (82, 61, 39), (84, 69, 51), + (83, 79, 61), (81, 90, 71), (75, 97, 74), (67, 97, 72), + (57, 100, 64), (48, 100, 55), (42, 93, 50), (42, 84, 46), + (42, 80, 44), (40, 76, 40), (41, 71, 42), (48, 68, 45), + (57, 67, 48), (58, 62, 47), (56, 55, 43), (52, 50, 38), + (48, 44, 29), (41, 34, 20), (36, 26, 13), (28, 19, 8), + (23, 15, 7), (20, 12, 7), (25, 13, 9), (32, 20, 11), + (41, 32, 19), (53, 43, 28), (67, 51, 39), (79, 62, 44), + (88, 77, 53), (99, 88, 59), (108, 95, 65), (112, 100, 69), + (113, 104, 71), (112, 104, 71), (113, 105, 67), (109, 105, 66), + (104, 103, 64), (95, 95, 54), (82, 85, 40), (69, 71, 30), + (53, 60, 28), (40, 49, 20), (27, 38, 9), (17, 27, 0), + (8, 21, 0), (5, 23, 5), (9, 28, 13), (17, 37, 24), + (28, 46, 34), (39, 60, 46), (53, 74, 61), (74, 94, 71), + (100, 111, 82), (121, 124, 90), (137, 137, 105), (153, 154, 108), + (172, 172, 112), (185, 181, 113), (196, 193, 135), (205, 202, 152), + (219, 216, 166), (224, 222, 172), (232, 233, 186), (231, 228, 191), + (225, 220, 180), (208, 203, 171), (192, 192, 159), (170, 169, 146) + ), + +// 595 Moss2 +((82, 100, 57), (88, 105, 60), (85, 102, 60), (82, 100, 61), + (79, 95, 59), (76, 91, 58), (76, 90, 55), (76, 90, 52), + (74, 86, 45), (71, 82, 44), (69, 79, 44), (67, 76, 44), + (65, 73, 45), (63, 69, 41), (61, 66, 37), (58, 63, 34), + (56, 61, 32), (48, 49, 24), (43, 44, 22), (38, 39, 21), + (32, 33, 19), (27, 27, 18), (24, 24, 16), (22, 21, 15), + (14, 12, 8), (11, 10, 6), (9, 9, 4), (8, 10, 6), + (7, 11, 8), (7, 11, 8), (7, 12, 9), (8, 16, 9), + (11, 19, 9), (17, 30, 11), (20, 33, 11), (23, 37, 12), + (25, 36, 11), (27, 36, 11), (28, 37, 11), (30, 38, 12), + (38, 42, 15), (40, 44, 15), (43, 46, 15), (42, 43, 14), + (41, 41, 14), (40, 40, 14), (40, 39, 15), (40, 38, 17), + (43, 38, 18), (43, 40, 19), (40, 37, 18), (37, 34, 17), + (33, 30, 17), (29, 27, 17), (29, 26, 17), (29, 25, 18), + (30, 26, 24), (31, 29, 26), (33, 32, 28), (38, 38, 32), + (44, 44, 36), (47, 47, 38), (51, 51, 40), (61, 59, 46), + (70, 67, 49), (86, 87, 43), (95, 97, 41), (104, 108, 39), + (109, 113, 39), (114, 118, 40), (120, 122, 47), (125, 128, 53), + (126, 131, 55), (124, 132, 54), (123, 133, 53), (119, 129, 60), + (116, 126, 67), (114, 123, 71), (112, 121, 76), (106, 115, 85), + (100, 110, 93), (98, 109, 92), (96, 107, 90), (94, 106, 89), + (93, 104, 88), (92, 102, 88), (90, 98, 88), (89, 96, 85), + (88, 91, 74), (87, 89, 68), (87, 87, 63), (86, 86, 61), + (86, 86, 60), (87, 85, 58), (87, 85, 56), (85, 82, 53), + (83, 81, 52), (79, 81, 54), (82, 87, 58), (85, 94, 62), + (86, 97, 65), (87, 101, 68), (89, 105, 74), (87, 104, 77), + (79, 95, 77), (74, 90, 73), (70, 86, 69), (68, 84, 67), + (67, 82, 65), (62, 76, 60), (54, 68, 55), (47, 60, 48), + (41, 52, 40), (34, 39, 27), (33, 37, 24), (33, 36, 22), + (32, 34, 18), (31, 33, 16), (31, 34, 17), (32, 37, 18), + (39, 42, 25), (43, 44, 26), (47, 47, 28), (47, 49, 28), + (48, 51, 29), (52, 56, 29), (56, 60, 29), (60, 66, 30), + (67, 72, 33), (75, 85, 40), (77, 87, 41), (80, 90, 43), + (83, 94, 40), (87, 100, 40), (92, 105, 41), (99, 112, 46), + (109, 121, 65), (111, 124, 70), (114, 128, 76), (115, 128, 77), + (116, 129, 78), (117, 130, 77), (116, 130, 79), (116, 128, 83), + (112, 125, 83), (104, 111, 79), (102, 107, 76), (100, 103, 73), + (94, 95, 65), (87, 87, 58), (79, 78, 50), (71, 68, 42), + (55, 49, 30), (52, 45, 26), (50, 41, 23), (43, 36, 21), + (38, 33, 20), (35, 32, 21), (34, 35, 23), (33, 38, 26), + (34, 41, 27), (34, 49, 34), (33, 49, 35), (33, 50, 37), + (34, 52, 37), (32, 51, 38), (31, 48, 35), (31, 47, 36), + (28, 45, 40), (29, 46, 41), (31, 48, 43), (34, 52, 45), + (37, 55, 46), (42, 60, 49), (46, 66, 58), (52, 71, 65), + (61, 81, 73), (72, 92, 80), (80, 102, 82), (86, 109, 83), + (90, 117, 86), (89, 117, 85), (86, 114, 82), (84, 110, 77), + (72, 92, 56), (68, 87, 52), (65, 83, 48), (58, 75, 42), + (49, 66, 36), (42, 62, 30), (37, 57, 25), (32, 52, 21), + (31, 47, 18), (32, 43, 18), (32, 38, 20), (32, 38, 21), + (34, 40, 24), (37, 46, 28), (45, 54, 32), (55, 64, 35), + (67, 75, 38), (78, 84, 43), (89, 93, 51), (98, 104, 59), + (109, 113, 69), (116, 120, 76), (127, 132, 81), (136, 142, 84), + (144, 147, 89), (147, 151, 92), (148, 151, 97), (142, 145, 98), + (137, 139, 98), (131, 135, 93), (124, 127, 87), (115, 120, 80), + (107, 113, 75), (96, 103, 70), (82, 91, 69), (72, 83, 67), + (65, 75, 65), (58, 69, 62), (54, 65, 59), (50, 61, 58), + (43, 55, 59), (36, 50, 61), (34, 45, 61), (30, 39, 57), + (30, 36, 49), (31, 35, 45), (32, 34, 41), (29, 33, 38), + (27, 31, 36), (24, 29, 33), (25, 29, 29), (27, 30, 27), + (30, 33, 27), (34, 38, 30), (37, 43, 35), (39, 48, 40), + (43, 53, 46), (48, 60, 51), (53, 69, 54), (57, 74, 58), + (61, 78, 58), (62, 79, 59), (62, 79, 59), (61, 80, 59), + (64, 85, 58), (67, 90, 60), (73, 93, 58), (76, 96, 58), + (77, 95, 59), (76, 94, 58), (76, 93, 56), (77, 95, 56) + ), + +// 596 Motel_Decor +((236, 95, 36), (229, 55, 19), (232, 39, 48), (236, 24, 77), + (231, 34, 94), (227, 44, 111), (235, 47, 113), (244, 50, 116), + (210, 70, 82), (199, 65, 74), (189, 60, 66), (183, 43, 70), + (177, 27, 75), (168, 18, 83), (160, 10, 92), (156, 11, 89), + (152, 12, 86), (116, 28, 82), (100, 33, 75), (85, 39, 69), + (78, 55, 70), (71, 71, 71), (67, 81, 71), (64, 92, 71), + (69, 122, 79), (70, 130, 72), (71, 138, 66), (82, 122, 58), + (94, 107, 51), (95, 100, 43), (97, 94, 36), (95, 77, 25), + (84, 72, 17), (74, 48, 23), (61, 44, 29), (48, 41, 35), + (59, 37, 45), (70, 33, 56), (80, 39, 61), (90, 45, 67), + (160, 97, 116), (193, 146, 101), (227, 195, 87), (205, 218, 88), + (184, 241, 90), (178, 248, 69), (173, 255, 49), (153, 230, 48), + (128, 215, 40), (126, 165, 36), (128, 147, 33), (131, 129, 30), + (114, 104, 37), (97, 80, 45), (89, 73, 45), (81, 66, 45), + (54, 58, 48), (47, 82, 46), (41, 107, 44), (38, 108, 43), + (35, 110, 43), (34, 116, 44), (33, 123, 45), (20, 97, 46), + (14, 69, 38), (19, 44, 35), (21, 36, 27), (23, 29, 19), + (27, 25, 20), (32, 22, 22), (36, 24, 33), (35, 24, 32), + (60, 36, 55), (70, 50, 60), (81, 65, 66), (93, 70, 73), + (105, 76, 81), (100, 73, 80), (96, 71, 79), (95, 64, 82), + (91, 58, 80), (72, 66, 69), (76, 70, 61), (81, 74, 53), + (75, 77, 51), (70, 81, 50), (58, 77, 46), (54, 72, 44), + (40, 58, 45), (51, 46, 51), (63, 35, 58), (75, 37, 62), + (87, 39, 67), (113, 41, 79), (147, 46, 90), (168, 67, 98), + (175, 94, 103), (175, 111, 102), (156, 108, 93), (138, 105, 84), + (124, 93, 75), (111, 82, 67), (89, 70, 58), (72, 59, 41), + (66, 30, 24), (86, 26, 18), (106, 23, 13), (111, 20, 15), + (117, 17, 17), (127, 13, 20), (136, 13, 23), (129, 14, 32), + (132, 17, 49), (151, 29, 92), (164, 36, 104), (178, 43, 116), + (205, 59, 121), (226, 102, 105), (251, 154, 95), (255, 187, 92), + (255, 246, 36), (243, 221, 52), (232, 196, 69), (227, 185, 63), + (222, 174, 58), (199, 137, 67), (168, 102, 77), (151, 90, 80), + (144, 76, 82), (139, 58, 94), (130, 54, 95), (121, 51, 96), + (117, 45, 89), (107, 38, 86), (81, 43, 79), (64, 50, 70), + (46, 41, 71), (45, 35, 63), (44, 30, 55), (46, 22, 57), + (49, 14, 59), (50, 9, 54), (55, 10, 43), (63, 13, 43), + (74, 19, 40), (85, 40, 36), (91, 42, 40), (98, 44, 45), + (108, 40, 48), (116, 58, 43), (121, 67, 54), (125, 76, 70), + (106, 113, 56), (98, 119, 55), (90, 125, 54), (72, 122, 48), + (56, 112, 41), (39, 95, 34), (27, 75, 33), (27, 53, 32), + (25, 35, 34), (23, 35, 39), (23, 40, 36), (23, 46, 33), + (19, 58, 38), (19, 70, 36), (28, 77, 39), (36, 86, 44), + (76, 89, 63), (85, 89, 68), (95, 90, 74), (103, 98, 84), + (123, 100, 89), (147, 98, 92), (110, 74, 85), (90, 59, 67), + (138, 70, 67), (133, 49, 48), (132, 44, 30), (175, 74, 36), + (200, 89, 27), (213, 90, 18), (214, 92, 19), (205, 87, 13), + (177, 53, 10), (170, 51, 14), (164, 50, 18), (159, 58, 30), + (148, 72, 43), (146, 86, 44), (144, 116, 55), (143, 144, 65), + (149, 158, 50), (151, 183, 44), (160, 200, 50), (169, 201, 50), + (172, 219, 46), (200, 216, 33), (205, 178, 27), (182, 154, 30), + (182, 126, 24), (167, 80, 13), (136, 44, 13), (113, 22, 18), + (91, 4, 18), (79, 0, 20), (71, 0, 19), (60, 2, 18), + (49, 0, 24), (43, 1, 30), (40, 7, 35), (30, 7, 39), + (24, 4, 39), (25, 7, 39), (18, 3, 35), (15, 1, 35), + (24, 0, 36), (22, 0, 33), (15, 0, 34), (19, 0, 43), + (18, 4, 44), (8, 18, 39), (3, 32, 39), (8, 34, 40), + (12, 39, 35), (19, 44, 29), (33, 35, 28), (41, 23, 30), + (53, 14, 22), (66, 10, 19), (72, 3, 24), (74, 0, 23), + (71, 3, 28), (74, 9, 32), (79, 10, 33), (80, 15, 29), + (86, 22, 12), (105, 24, 9), (111, 43, 14), (100, 55, 5), + (101, 53, 9), (90, 64, 22), (71, 75, 34), (64, 70, 45), + (55, 60, 49), (55, 66, 53), (55, 69, 54), (51, 69, 51), + (61, 90, 33), (92, 103, 20), (111, 101, 23), (127, 125, 13), + (175, 139, 13), (213, 125, 33), (230, 118, 34), (236, 116, 29) + ), + +// 597 Muddy +((80, 63, 50), (89, 69, 51), (90, 69, 51), (92, 70, 52), + (92, 68, 50), (92, 67, 48), (89, 67, 48), (86, 67, 49), + (84, 69, 53), (86, 71, 54), (89, 74, 56), (90, 76, 59), + (91, 79, 62), (91, 80, 64), (91, 81, 66), (91, 81, 67), + (91, 82, 68), (87, 82, 69), (86, 81, 68), (86, 81, 67), + (86, 80, 65), (86, 80, 63), (86, 80, 63), (86, 80, 64), + (86, 81, 65), (85, 81, 65), (85, 81, 66), (83, 79, 64), + (81, 77, 63), (80, 76, 61), (80, 76, 59), (77, 72, 55), + (75, 68, 51), (69, 63, 45), (65, 61, 45), (62, 59, 45), + (59, 58, 47), (56, 58, 50), (55, 59, 51), (55, 60, 53), + (58, 65, 59), (62, 68, 60), (67, 71, 62), (72, 74, 63), + (78, 78, 64), (82, 80, 65), (86, 82, 67), (94, 86, 70), + (102, 91, 72), (111, 100, 79), (113, 102, 80), (115, 104, 82), + (114, 102, 80), (114, 101, 78), (112, 100, 77), (111, 99, 76), + (108, 95, 72), (106, 91, 68), (104, 88, 65), (99, 83, 63), + (95, 79, 61), (91, 76, 58), (88, 73, 56), (78, 66, 51), + (67, 58, 44), (46, 45, 34), (39, 39, 29), (32, 33, 24), + (29, 30, 22), (27, 28, 20), (23, 24, 16), (20, 20, 13), + (17, 14, 9), (16, 14, 9), (16, 15, 9), (19, 20, 14), + (22, 26, 20), (26, 30, 24), (30, 35, 28), (42, 46, 38), + (55, 58, 51), (82, 83, 77), (94, 93, 87), (106, 104, 97), + (110, 107, 100), (114, 111, 104), (118, 117, 109), (121, 120, 114), + (124, 125, 116), (125, 127, 118), (126, 129, 120), (126, 129, 118), + (127, 129, 117), (129, 129, 115), (129, 126, 111), (126, 121, 105), + (120, 113, 99), (101, 90, 75), (88, 78, 63), (75, 66, 52), + (69, 61, 47), (63, 56, 42), (53, 48, 33), (46, 40, 26), + (40, 31, 17), (40, 29, 15), (41, 27, 13), (41, 26, 12), + (41, 26, 11), (43, 26, 11), (44, 28, 13), (45, 32, 16), + (46, 36, 20), (53, 43, 26), (55, 43, 27), (57, 44, 28), + (62, 47, 30), (63, 48, 31), (66, 49, 31), (68, 49, 30), + (67, 52, 31), (66, 54, 32), (66, 57, 33), (66, 57, 33), + (67, 58, 34), (68, 59, 36), (67, 59, 38), (66, 59, 38), + (64, 56, 37), (57, 51, 34), (54, 49, 32), (51, 48, 31), + (46, 48, 30), (42, 47, 28), (42, 48, 28), (42, 49, 30), + (45, 53, 36), (48, 55, 39), (51, 58, 43), (52, 59, 44), + (53, 60, 46), (55, 61, 47), (55, 62, 48), (56, 64, 47), + (57, 64, 47), (60, 66, 48), (61, 66, 48), (62, 66, 49), + (66, 66, 50), (70, 66, 50), (74, 65, 51), (77, 63, 50), + (79, 63, 46), (79, 62, 45), (79, 62, 45), (78, 63, 44), + (77, 63, 45), (77, 62, 45), (78, 63, 45), (81, 63, 46), + (84, 65, 48), (89, 68, 53), (90, 69, 54), (91, 70, 55), + (92, 74, 58), (91, 77, 61), (90, 80, 65), (88, 82, 68), + (86, 85, 72), (84, 84, 72), (83, 84, 73), (81, 83, 74), + (78, 81, 73), (76, 79, 72), (74, 77, 69), (73, 74, 66), + (72, 71, 63), (69, 68, 59), (67, 65, 56), (64, 61, 51), + (60, 55, 46), (55, 50, 43), (50, 47, 40), (45, 43, 37), + (42, 39, 32), (43, 38, 31), (44, 38, 30), (46, 40, 30), + (50, 42, 31), (53, 45, 32), (58, 49, 36), (64, 55, 41), + (70, 64, 52), (78, 74, 62), (89, 86, 75), (102, 97, 88), + (113, 109, 100), (124, 120, 111), (133, 129, 120), (139, 136, 126), + (143, 140, 129), (149, 146, 134), (155, 151, 140), (162, 159, 146), + (169, 166, 153), (175, 172, 158), (179, 176, 161), (182, 177, 162), + (181, 175, 159), (174, 167, 151), (164, 157, 141), (153, 146, 129), + (144, 136, 118), (137, 128, 109), (132, 123, 102), (129, 120, 96), + (131, 119, 93), (136, 122, 92), (140, 124, 93), (141, 125, 94), + (138, 122, 93), (135, 120, 90), (131, 116, 88), (125, 112, 85), + (119, 108, 82), (112, 103, 80), (110, 100, 75), (108, 98, 74), + (109, 98, 73), (107, 94, 73), (104, 92, 72), (100, 89, 72), + (94, 86, 71), (87, 81, 68), (77, 75, 65), (67, 67, 57), + (57, 59, 49), (51, 52, 41), (46, 45, 35), (40, 40, 30), + (36, 35, 27), (32, 32, 25), (29, 30, 24), (28, 29, 26), + (29, 32, 27), (32, 34, 29), (38, 37, 29), (44, 40, 29), + (44, 41, 30), (45, 41, 31), (46, 41, 32), (49, 42, 33), + (52, 43, 36), (56, 47, 40), (58, 52, 45), (67, 56, 48) + ), + +// 598 Muddy_2 +((99, 79, 67), (82, 66, 53), (91, 76, 64), (100, 86, 75), + (109, 95, 84), (118, 104, 94), (119, 104, 95), (121, 105, 97), + (119, 108, 102), (112, 104, 99), (106, 100, 97), (96, 90, 87), + (87, 81, 78), (79, 73, 70), (72, 65, 62), (68, 60, 56), + (65, 56, 50), (61, 50, 42), (60, 48, 42), (60, 47, 42), + (62, 50, 45), (64, 53, 49), (64, 54, 50), (64, 55, 52), + (71, 55, 50), (75, 53, 44), (79, 51, 39), (77, 48, 36), + (76, 46, 33), (76, 45, 32), (76, 45, 32), (69, 45, 35), + (63, 45, 38), (56, 46, 43), (54, 45, 43), (52, 45, 43), + (52, 45, 41), (53, 45, 40), (53, 44, 39), (53, 43, 38), + (57, 40, 28), (58, 36, 25), (60, 32, 22), (59, 29, 19), + (58, 26, 16), (56, 25, 15), (54, 24, 15), (51, 23, 15), + (46, 21, 13), (37, 23, 15), (34, 22, 15), (32, 21, 16), + (32, 23, 17), (32, 25, 19), (33, 25, 19), (35, 25, 19), + (42, 32, 26), (46, 34, 29), (51, 37, 32), (51, 38, 34), + (52, 40, 37), (50, 39, 36), (49, 38, 35), (44, 35, 31), + (41, 31, 27), (30, 22, 18), (33, 23, 19), (36, 24, 20), + (39, 27, 22), (42, 30, 24), (53, 38, 32), (70, 46, 39), + (95, 62, 47), (111, 70, 50), (128, 78, 54), (140, 86, 55), + (152, 94, 57), (157, 97, 59), (162, 101, 61), (162, 101, 59), + (160, 103, 63), (134, 93, 68), (116, 85, 66), (99, 78, 65), + (93, 75, 64), (88, 72, 63), (79, 66, 58), (75, 60, 52), + (79, 57, 47), (85, 60, 49), (91, 64, 52), (91, 65, 53), + (92, 66, 54), (93, 67, 55), (91, 71, 58), (87, 69, 55), + (80, 61, 48), (70, 48, 34), (69, 43, 29), (69, 39, 24), + (69, 40, 25), (69, 41, 26), (73, 45, 35), (80, 53, 41), + (90, 74, 64), (95, 80, 71), (101, 86, 79), (100, 85, 80), + (99, 85, 81), (96, 82, 78), (90, 77, 73), (83, 68, 67), + (77, 62, 59), (69, 52, 45), (69, 51, 43), (70, 50, 41), + (73, 49, 34), (78, 46, 27), (84, 42, 22), (90, 40, 20), + (93, 43, 22), (94, 47, 31), (96, 52, 40), (96, 57, 45), + (97, 62, 50), (105, 73, 56), (114, 84, 72), (119, 96, 87), + (130, 111, 97), (132, 117, 108), (132, 118, 107), (132, 120, 107), + (126, 114, 100), (115, 98, 90), (104, 87, 79), (90, 77, 70), + (69, 60, 58), (57, 52, 51), (46, 45, 45), (43, 42, 41), + (40, 39, 37), (33, 34, 31), (27, 28, 25), (24, 23, 21), + (23, 21, 17), (18, 16, 11), (18, 15, 10), (19, 14, 10), + (25, 13, 7), (30, 14, 6), (34, 17, 8), (47, 22, 8), + (70, 35, 10), (74, 37, 14), (79, 40, 18), (89, 45, 23), + (100, 52, 23), (108, 53, 20), (110, 55, 26), (114, 57, 31), + (125, 55, 30), (124, 69, 40), (121, 64, 43), (119, 59, 47), + (116, 63, 46), (104, 67, 47), (94, 62, 49), (87, 58, 48), + (83, 61, 51), (82, 61, 51), (82, 61, 51), (82, 60, 50), + (85, 59, 49), (90, 60, 51), (93, 64, 52), (101, 69, 55), + (117, 73, 61), (122, 75, 66), (119, 80, 67), (118, 80, 67), + (112, 72, 62), (98, 65, 55), (83, 57, 47), (70, 48, 34), + (57, 36, 24), (56, 36, 22), (55, 36, 21), (56, 37, 25), + (60, 43, 34), (66, 51, 40), (73, 56, 46), (79, 60, 51), + (83, 63, 52), (84, 61, 52), (83, 60, 52), (80, 56, 49), + (73, 54, 46), (67, 50, 48), (64, 48, 49), (63, 50, 47), + (64, 51, 49), (69, 54, 52), (78, 62, 57), (86, 67, 61), + (93, 74, 64), (100, 77, 68), (99, 76, 70), (94, 76, 68), + (89, 73, 65), (78, 64, 59), (62, 54, 52), (53, 47, 44), + (47, 40, 37), (40, 34, 31), (37, 29, 24), (40, 26, 21), + (44, 26, 23), (48, 28, 24), (54, 30, 26), (56, 32, 29), + (58, 36, 31), (61, 38, 32), (63, 40, 33), (60, 40, 31), + (56, 38, 29), (52, 38, 27), (50, 36, 27), (48, 34, 27), + (47, 35, 27), (51, 38, 31), (56, 40, 36), (61, 45, 40), + (67, 50, 44), (69, 51, 46), (70, 52, 46), (71, 52, 45), + (71, 49, 40), (73, 44, 34), (72, 38, 30), (72, 35, 24), + (68, 30, 16), (61, 23, 12), (54, 19, 9), (43, 17, 7), + (35, 14, 7), (27, 11, 6), (26, 11, 8), (30, 14, 10), + (32, 18, 13), (41, 25, 19), (55, 35, 27), (66, 47, 38), + (85, 64, 55), (98, 75, 66), (87, 64, 55), (91, 68, 56) + ), + +// 599 Muted_Rainbow +((192, 123, 83), (209, 149, 116), (184, 129, 102), (160, 110, 88), + (137, 98, 81), (114, 86, 74), (103, 80, 67), (93, 74, 60), + (83, 79, 44), (80, 75, 36), (78, 72, 28), (75, 70, 32), + (73, 69, 36), (65, 61, 42), (58, 53, 48), (55, 54, 51), + (53, 55, 54), (53, 65, 53), (69, 78, 55), (85, 92, 57), + (94, 93, 48), (104, 95, 40), (105, 94, 39), (106, 93, 39), + (104, 74, 39), (104, 70, 45), (105, 66, 52), (105, 70, 55), + (105, 75, 59), (104, 78, 59), (104, 82, 59), (91, 77, 53), + (70, 74, 46), (46, 75, 50), (38, 76, 51), (31, 78, 52), + (29, 79, 53), (27, 81, 55), (26, 84, 55), (25, 87, 56), + (33, 93, 53), (41, 98, 53), (50, 103, 54), (68, 107, 51), + (87, 111, 49), (95, 105, 50), (104, 100, 51), (121, 97, 52), + (140, 97, 56), (165, 100, 48), (178, 115, 51), (191, 130, 55), + (207, 154, 70), (223, 178, 85), (227, 187, 101), (232, 197, 117), + (248, 226, 113), (232, 202, 110), (217, 179, 107), (185, 145, 85), + (154, 111, 64), (140, 89, 60), (127, 68, 56), (102, 43, 44), + (83, 30, 38), (76, 20, 35), (89, 32, 38), (102, 44, 41), + (108, 51, 40), (114, 58, 40), (129, 74, 43), (156, 101, 47), + (199, 157, 43), (212, 167, 47), (225, 177, 51), (209, 178, 54), + (194, 179, 57), (189, 172, 52), (184, 165, 48), (175, 152, 46), + (153, 136, 38), (150, 109, 21), (139, 93, 22), (129, 78, 23), + (119, 68, 23), (109, 59, 24), (87, 52, 23), (70, 46, 27), + (44, 31, 23), (41, 37, 25), (39, 44, 28), (37, 44, 29), + (35, 44, 30), (43, 47, 36), (53, 50, 46), (59, 53, 56), + (73, 47, 58), (94, 44, 59), (98, 42, 53), (102, 41, 48), + (102, 40, 44), (103, 39, 41), (110, 44, 37), (120, 55, 35), + (154, 69, 30), (167, 85, 27), (181, 102, 24), (189, 109, 25), + (198, 116, 27), (209, 120, 35), (218, 127, 39), (230, 131, 46), + (234, 123, 49), (247, 114, 48), (242, 112, 45), (238, 111, 42), + (233, 123, 32), (222, 122, 23), (199, 115, 21), (178, 114, 32), + (125, 85, 41), (96, 75, 48), (67, 66, 55), (57, 60, 52), + (47, 55, 50), (39, 51, 47), (40, 54, 41), (54, 61, 32), + (87, 60, 29), (149, 66, 28), (161, 62, 30), (173, 59, 32), + (188, 56, 35), (186, 55, 42), (182, 51, 47), (179, 60, 54), + (172, 82, 48), (181, 101, 45), (191, 120, 42), (194, 122, 41), + (198, 125, 40), (201, 136, 37), (197, 145, 30), (182, 140, 33), + (166, 129, 27), (112, 101, 27), (100, 89, 26), (89, 78, 25), + (76, 61, 19), (72, 44, 24), (78, 30, 29), (95, 27, 25), + (144, 46, 35), (161, 51, 36), (178, 57, 37), (207, 85, 39), + (219, 119, 47), (233, 132, 69), (245, 148, 95), (240, 167, 113), + (236, 162, 125), (227, 151, 119), (226, 150, 111), (226, 149, 103), + (214, 142, 75), (203, 135, 56), (198, 132, 40), (190, 126, 33), + (190, 105, 29), (194, 99, 28), (198, 94, 27), (214, 79, 42), + (218, 69, 44), (203, 69, 49), (181, 60, 75), (164, 55, 89), + (127, 65, 92), (84, 65, 93), (76, 60, 90), (68, 65, 80), + (57, 65, 64), (66, 57, 53), (82, 57, 47), (94, 63, 49), + (121, 61, 56), (128, 64, 57), (135, 67, 58), (141, 74, 69), + (143, 79, 72), (147, 84, 76), (164, 99, 85), (177, 113, 98), + (177, 111, 109), (180, 115, 121), (186, 118, 134), (187, 97, 150), + (163, 78, 153), (153, 82, 136), (166, 83, 143), (163, 85, 134), + (170, 100, 113), (177, 118, 113), (164, 130, 103), (158, 135, 87), + (143, 136, 78), (113, 138, 70), (103, 137, 54), (113, 134, 42), + (120, 133, 40), (128, 139, 44), (141, 146, 51), (148, 155, 50), + (139, 146, 56), (123, 131, 63), (101, 137, 56), (74, 125, 56), + (55, 103, 53), (41, 100, 44), (33, 100, 45), (28, 109, 47), + (35, 122, 56), (48, 124, 70), (57, 130, 85), (70, 142, 98), + (86, 148, 93), (82, 145, 81), (69, 139, 77), (64, 130, 69), + (58, 119, 55), (52, 107, 51), (51, 100, 57), (69, 95, 64), + (102, 99, 69), (118, 117, 69), (138, 125, 71), (164, 128, 77), + (170, 127, 80), (169, 118, 83), (173, 112, 84), (180, 95, 82), + (179, 87, 86), (182, 95, 85), (193, 87, 72), (204, 86, 62), + (217, 90, 55), (217, 81, 50), (206, 80, 47), (199, 76, 35), + (174, 62, 31), (143, 59, 40), (129, 64, 44), (119, 60, 39), + (120, 62, 40), (128, 64, 48), (158, 91, 81), (193, 131, 100) + ), + +// 600 Mystery +((80, 11, 0), (64, 6, 0), (58, 4, 0), (52, 3, 0), + (48, 2, 0), (44, 1, 0), (42, 0, 0), (41, 0, 0), + (36, 0, 0), (32, 0, 0), (29, 0, 0), (25, 0, 0), + (22, 0, 0), (20, 0, 0), (18, 0, 0), (18, 0, 0), + (18, 1, 1), (11, 3, 8), (13, 5, 12), (16, 8, 16), + (25, 9, 15), (34, 10, 14), (39, 11, 14), (45, 13, 15), + (74, 24, 19), (92, 29, 18), (111, 34, 17), (125, 42, 23), + (140, 51, 29), (143, 58, 37), (146, 66, 45), (150, 78, 61), + (136, 85, 77), (107, 110, 130), (102, 120, 145), (98, 130, 161), + (87, 122, 153), (77, 114, 145), (73, 109, 141), (70, 105, 137), + (80, 87, 108), (88, 73, 83), (97, 60, 58), (102, 46, 37), + (107, 32, 16), (110, 28, 10), (113, 24, 4), (116, 24, 4), + (118, 24, 3), (124, 24, 2), (126, 24, 1), (129, 24, 0), + (128, 24, 0), (128, 24, 0), (126, 24, 0), (125, 24, 0), + (109, 21, 1), (98, 18, 1), (88, 15, 1), (78, 12, 1), + (68, 10, 1), (62, 9, 1), (57, 8, 1), (46, 6, 1), + (37, 3, 1), (29, 2, 1), (34, 3, 0), (39, 5, 0), + (44, 6, 0), (50, 8, 1), (65, 14, 3), (87, 21, 4), + (115, 40, 20), (117, 49, 31), (120, 59, 42), (119, 59, 42), + (118, 59, 42), (111, 59, 45), (104, 60, 49), (87, 61, 57), + (67, 61, 65), (44, 48, 56), (40, 36, 45), (36, 25, 34), + (36, 22, 30), (36, 19, 27), (37, 18, 25), (44, 15, 20), + (60, 10, 7), (66, 8, 3), (72, 7, 0), (74, 7, 0), + (77, 8, 0), (83, 10, 0), (91, 13, 0), (101, 16, 0), + (113, 20, 0), (134, 28, 0), (144, 30, 0), (155, 33, 0), + (160, 34, 0), (165, 36, 0), (176, 41, 0), (186, 45, 0), + (200, 55, 7), (201, 60, 14), (203, 66, 21), (206, 67, 21), + (209, 69, 21), (216, 70, 19), (220, 69, 17), (213, 70, 21), + (203, 68, 23), (182, 56, 17), (177, 52, 13), (173, 48, 10), + (160, 40, 6), (143, 32, 3), (124, 25, 2), (108, 18, 0), + (82, 10, 1), (73, 7, 1), (64, 5, 1), (60, 4, 1), + (57, 3, 1), (50, 4, 3), (41, 6, 9), (34, 10, 17), + (28, 14, 27), (19, 34, 57), (17, 40, 67), (15, 47, 78), + (9, 53, 85), (5, 52, 88), (3, 48, 82), (3, 47, 79), + (15, 50, 78), (21, 42, 64), (28, 35, 50), (28, 31, 43), + (29, 28, 37), (27, 28, 38), (28, 32, 45), (40, 42, 52), + (55, 50, 59), (92, 66, 65), (95, 67, 65), (98, 68, 66), + (115, 75, 66), (127, 74, 62), (150, 78, 57), (168, 75, 45), + (182, 62, 22), (180, 58, 18), (178, 54, 14), (170, 53, 15), + (150, 49, 17), (130, 46, 19), (110, 41, 20), (90, 34, 19), + (75, 30, 19), (37, 23, 21), (29, 20, 20), (22, 17, 19), + (9, 10, 15), (5, 6, 9), (5, 2, 3), (8, 1, 2), + (24, 3, 2), (30, 4, 2), (36, 5, 2), (52, 10, 2), + (72, 14, 1), (95, 20, 0), (120, 27, 1), (145, 34, 2), + (169, 41, 2), (188, 48, 3), (206, 54, 2), (222, 59, 1), + (235, 63, 2), (246, 67, 3), (250, 69, 4), (250, 71, 5), + (246, 73, 7), (244, 73, 8), (242, 74, 10), (238, 71, 10), + (230, 69, 10), (224, 65, 8), (219, 63, 7), (215, 63, 9), + (215, 63, 9), (215, 62, 7), (217, 61, 5), (218, 58, 1), + (218, 58, 0), (220, 58, 0), (218, 58, 1), (215, 57, 1), + (209, 53, 1), (200, 50, 0), (191, 46, 0), (180, 43, 0), + (171, 39, 0), (163, 36, 0), (157, 33, 0), (153, 30, 0), + (150, 30, 0), (148, 31, 0), (146, 31, 0), (144, 31, 0), + (141, 30, 0), (134, 28, 0), (124, 25, 0), (112, 22, 0), + (102, 19, 0), (93, 16, 0), (85, 14, 1), (79, 12, 1), + (76, 11, 0), (77, 10, 1), (83, 12, 2), (92, 15, 3), + (102, 20, 4), (113, 23, 4), (122, 26, 3), (131, 28, 3), + (136, 30, 3), (137, 29, 4), (134, 27, 4), (127, 25, 2), + (119, 21, 1), (111, 18, 0), (101, 15, 0), (92, 11, 0), + (85, 9, 0), (80, 8, 0), (78, 9, 0), (78, 10, 0), + (79, 10, 0), (80, 8, 0), (83, 8, 0), (86, 8, 0), + (89, 8, 1), (92, 11, 1), (95, 12, 1), (99, 13, 1), + (102, 13, 0), (105, 13, 1), (105, 15, 1), (104, 16, 1), + (102, 17, 1), (99, 17, 0), (94, 15, 0), (87, 14, 0) + ), + +// 601 Neon +((21, 52, 121), (20, 40, 136), (19, 35, 145), (19, 31, 155), + (20, 28, 163), (21, 26, 172), (23, 25, 175), (25, 24, 178), + (37, 20, 187), (44, 18, 190), (52, 17, 193), (61, 15, 192), + (70, 14, 192), (80, 12, 189), (90, 11, 187), (95, 10, 185), + (101, 10, 183), (122, 7, 173), (131, 8, 166), (140, 9, 160), + (147, 11, 153), (155, 14, 147), (158, 15, 144), (162, 16, 142), + (176, 20, 134), (182, 21, 132), (188, 22, 131), (193, 22, 133), + (198, 23, 135), (200, 23, 137), (202, 23, 139), (205, 22, 145), + (208, 21, 151), (209, 18, 164), (208, 17, 170), (208, 16, 176), + (206, 16, 179), (204, 16, 183), (202, 16, 183), (201, 17, 184), + (193, 20, 178), (189, 22, 170), (186, 24, 163), (183, 27, 153), + (180, 30, 144), (179, 31, 139), (178, 33, 135), (176, 36, 129), + (173, 38, 123), (167, 44, 110), (164, 49, 103), (161, 55, 96), + (156, 63, 91), (152, 71, 86), (149, 74, 84), (146, 78, 83), + (136, 94, 78), (132, 100, 72), (128, 106, 67), (126, 112, 60), + (124, 118, 53), (123, 119, 50), (123, 121, 47), (123, 121, 42), + (123, 120, 37), (124, 107, 27), (128, 98, 26), (132, 90, 25), + (134, 85, 26), (136, 81, 28), (142, 71, 33), (147, 62, 39), + (153, 46, 56), (154, 41, 67), (155, 37, 79), (152, 36, 93), + (149, 36, 107), (146, 38, 114), (143, 40, 121), (136, 47, 134), + (128, 56, 146), (114, 81, 165), (108, 94, 169), (102, 108, 173), + (99, 114, 173), (97, 120, 173), (94, 132, 170), (95, 140, 164), + (106, 146, 148), (116, 143, 141), (127, 140, 134), (132, 136, 131), + (137, 133, 128), (146, 123, 123), (158, 114, 120), (170, 100, 117), + (181, 85, 116), (197, 55, 121), (196, 41, 128), (195, 27, 135), + (191, 22, 139), (188, 18, 143), (178, 11, 152), (166, 8, 160), + (135, 15, 174), (119, 25, 179), (103, 36, 185), (95, 42, 187), + (87, 49, 190), (73, 63, 194), (58, 78, 197), (45, 94, 199), + (34, 111, 201), (20, 145, 202), (19, 153, 201), (19, 161, 201), + (23, 175, 198), (32, 187, 191), (46, 195, 185), (63, 202, 176), + (97, 205, 158), (115, 200, 147), (134, 196, 137), (142, 193, 129), + (150, 190, 122), (168, 183, 109), (184, 179, 96), (198, 174, 85), + (209, 171, 75), (220, 166, 62), (218, 164, 60), (217, 163, 58), + (209, 158, 56), (197, 156, 56), (182, 154, 60), (165, 154, 66), + (129, 153, 83), (112, 148, 91), (96, 144, 100), (88, 140, 104), + (80, 137, 108), (64, 127, 116), (50, 118, 124), (37, 108, 132), + (26, 97, 139), (19, 75, 150), (20, 69, 151), (21, 64, 153), + (26, 54, 154), (33, 45, 155), (42, 37, 156), (50, 30, 157), + (66, 17, 161), (70, 14, 162), (75, 12, 164), (83, 8, 167), + (90, 5, 170), (95, 4, 175), (98, 4, 179), (97, 4, 185), + (94, 5, 191), (81, 10, 203), (77, 12, 206), (73, 14, 209), + (65, 20, 215), (56, 28, 221), (47, 36, 227), (38, 45, 231), + (20, 59, 238), (16, 61, 238), (13, 64, 239), (7, 69, 239), + (4, 74, 238), (1, 77, 234), (0, 79, 230), (0, 79, 224), + (1, 76, 216), (3, 71, 208), (5, 64, 199), (8, 58, 189), + (10, 52, 180), (14, 46, 170), (18, 41, 160), (24, 36, 150), + (38, 26, 131), (41, 25, 126), (45, 24, 122), (53, 22, 112), + (60, 22, 102), (67, 24, 92), (74, 26, 83), (81, 28, 74), + (89, 30, 66), (96, 33, 58), (103, 36, 52), (109, 38, 45), + (115, 42, 38), (120, 46, 31), (125, 50, 25), (130, 54, 19), + (136, 58, 15), (141, 61, 12), (147, 63, 10), (153, 66, 9), + (158, 70, 8), (162, 72, 10), (165, 73, 14), (167, 73, 20), + (169, 73, 29), (170, 72, 38), (169, 72, 49), (164, 72, 60), + (157, 75, 71), (148, 80, 82), (139, 84, 92), (129, 90, 105), + (119, 95, 115), (113, 100, 124), (105, 105, 131), (98, 110, 136), + (91, 116, 138), (85, 118, 140), (82, 118, 141), (82, 117, 141), + (85, 114, 140), (91, 108, 138), (97, 101, 136), (102, 95, 133), + (104, 87, 131), (107, 76, 130), (109, 66, 131), (109, 57, 134), + (107, 48, 136), (103, 41, 139), (99, 39, 140), (91, 40, 141), + (82, 43, 142), (73, 48, 143), (64, 55, 144), (54, 62, 144), + (45, 69, 144), (37, 77, 142), (30, 84, 139), (25, 91, 134), + (21, 96, 130), (19, 101, 126), (18, 104, 122), (18, 105, 118), + (19, 104, 113), (20, 100, 109), (21, 94, 106), (22, 87, 104), + (22, 80, 104), (22, 72, 106), (22, 65, 110), (22, 58, 114) + ), + +// 602 Neon_Purple +((192, 57, 254), (205, 58, 253), (198, 59, 246), (192, 60, 240), + (183, 62, 231), (175, 64, 223), (172, 65, 218), (170, 66, 214), + (164, 76, 196), (161, 87, 191), (158, 99, 187), (159, 114, 185), + (160, 130, 183), (160, 139, 184), (161, 149, 186), (161, 150, 184), + (162, 152, 183), (155, 143, 197), (143, 139, 202), (132, 135, 208), + (128, 134, 213), (124, 133, 218), (120, 129, 216), (117, 125, 214), + (106, 98, 213), (94, 85, 211), (83, 72, 209), (76, 62, 211), + (69, 53, 214), (68, 50, 212), (67, 48, 210), (65, 47, 207), + (75, 50, 201), (89, 58, 182), (86, 54, 173), (83, 51, 164), + (77, 45, 155), (71, 39, 147), (68, 36, 144), (65, 33, 141), + (47, 25, 126), (36, 21, 118), (25, 18, 110), (19, 18, 105), + (14, 19, 101), (14, 21, 103), (14, 23, 105), (12, 25, 116), + (13, 32, 128), (10, 38, 165), (12, 36, 177), (15, 35, 190), + (18, 29, 202), (21, 24, 214), (25, 24, 218), (30, 24, 223), + (51, 30, 241), (64, 32, 245), (77, 34, 250), (93, 36, 251), + (110, 39, 253), (118, 40, 253), (126, 41, 253), (138, 43, 253), + (142, 44, 253), (142, 44, 253), (136, 42, 248), (131, 40, 243), + (127, 39, 238), (123, 39, 234), (117, 37, 222), (111, 37, 209), + (99, 40, 188), (93, 41, 182), (88, 43, 177), (82, 41, 176), + (77, 39, 175), (75, 38, 174), (74, 38, 174), (72, 36, 173), + (73, 37, 174), (75, 42, 185), (78, 41, 195), (82, 41, 206), + (82, 40, 212), (82, 40, 219), (85, 37, 230), (89, 35, 239), + (104, 36, 251), (115, 38, 252), (126, 41, 253), (130, 42, 253), + (134, 43, 253), (142, 45, 253), (150, 46, 253), (153, 46, 253), + (153, 46, 252), (146, 45, 246), (137, 44, 240), (129, 43, 235), + (123, 42, 234), (118, 41, 233), (108, 42, 232), (101, 40, 232), + (86, 36, 235), (81, 35, 233), (77, 34, 232), (73, 32, 231), + (70, 30, 231), (65, 32, 231), (62, 32, 234), (62, 32, 236), + (63, 32, 242), (81, 35, 250), (84, 34, 251), (88, 34, 252), + (88, 34, 252), (90, 35, 254), (89, 35, 253), (89, 35, 252), + (90, 38, 245), (91, 40, 238), (93, 43, 232), (95, 46, 230), + (97, 49, 228), (103, 55, 224), (106, 60, 222), (110, 65, 225), + (114, 66, 226), (117, 64, 224), (115, 64, 223), (114, 64, 223), + (114, 64, 222), (111, 61, 218), (105, 63, 219), (100, 60, 220), + (96, 50, 223), (91, 45, 224), (87, 41, 225), (84, 38, 223), + (82, 35, 222), (68, 31, 219), (55, 27, 213), (43, 25, 207), + (33, 22, 200), (19, 19, 191), (20, 19, 188), (21, 19, 186), + (20, 20, 180), (21, 21, 173), (25, 29, 165), (28, 34, 157), + (32, 41, 146), (33, 42, 145), (34, 43, 144), (33, 36, 139), + (35, 32, 135), (42, 36, 132), (51, 41, 131), (63, 48, 130), + (76, 58, 132), (93, 71, 146), (97, 72, 150), (101, 73, 154), + (106, 76, 163), (110, 79, 172), (114, 81, 179), (122, 83, 189), + (142, 87, 209), (149, 87, 212), (156, 88, 215), (167, 89, 223), + (177, 90, 231), (180, 95, 232), (178, 97, 232), (176, 97, 232), + (171, 95, 228), (164, 93, 222), (161, 91, 214), (163, 88, 209), + (161, 89, 203), (155, 92, 197), (149, 96, 193), (141, 94, 185), + (114, 87, 177), (105, 83, 177), (96, 80, 177), (82, 71, 180), + (68, 62, 185), (57, 59, 195), (50, 55, 200), (45, 55, 206), + (38, 46, 212), (32, 47, 216), (26, 45, 221), (21, 48, 225), + (16, 48, 233), (8, 50, 240), (9, 52, 244), (19, 56, 245), + (32, 63, 243), (42, 69, 243), (51, 73, 240), (59, 71, 237), + (66, 74, 237), (74, 71, 238), (87, 82, 240), (107, 89, 241), + (124, 100, 243), (142, 110, 245), (161, 116, 244), (174, 117, 244), + (185, 113, 244), (191, 110, 245), (196, 103, 245), (196, 96, 246), + (192, 94, 249), (189, 89, 250), (184, 81, 252), (178, 73, 253), + (173, 67, 253), (166, 60, 253), (162, 52, 252), (157, 48, 252), + (149, 46, 252), (145, 45, 252), (141, 44, 252), (137, 42, 253), + (133, 41, 253), (124, 39, 252), (117, 37, 247), (114, 35, 240), + (108, 33, 230), (107, 33, 217), (101, 32, 204), (98, 31, 192), + (94, 29, 186), (87, 29, 181), (82, 28, 177), (69, 26, 169), + (55, 25, 166), (42, 22, 160), (32, 21, 156), (23, 19, 156), + (25, 21, 164), (35, 23, 176), (47, 26, 184), (60, 30, 197), + (73, 32, 208), (83, 35, 217), (88, 35, 222), (99, 38, 230), + (114, 41, 240), (132, 46, 245), (153, 51, 249), (173, 54, 252) + ), + +// 603 Night_Flower +((39, 60, 72), (63, 72, 122), (43, 81, 93), (23, 90, 64), + (15, 77, 51), (8, 64, 39), (6, 58, 31), (4, 53, 24), + (4, 49, 21), (9, 48, 24), (14, 47, 28), (29, 39, 54), + (44, 31, 81), (61, 28, 106), (78, 26, 132), (88, 21, 149), + (99, 16, 166), (117, 18, 196), (113, 16, 191), (110, 14, 187), + (99, 11, 178), (89, 8, 169), (85, 6, 161), (81, 4, 154), + (76, 2, 148), (78, 1, 147), (80, 0, 146), (81, 1, 149), + (83, 3, 153), (84, 2, 155), (85, 2, 157), (90, 1, 162), + (96, 4, 166), (115, 10, 185), (120, 16, 188), (126, 22, 191), + (121, 23, 192), (116, 25, 194), (112, 23, 186), (108, 22, 179), + (73, 12, 140), (59, 12, 108), (45, 12, 76), (39, 16, 51), + (33, 21, 26), (29, 23, 21), (26, 25, 16), (21, 28, 14), + (19, 40, 21), (21, 67, 49), (27, 73, 67), (33, 79, 85), + (49, 67, 107), (66, 56, 130), (72, 48, 138), (79, 41, 147), + (93, 6, 164), (86, 7, 145), (79, 8, 126), (61, 10, 99), + (44, 12, 72), (36, 14, 57), (28, 17, 43), (19, 27, 21), + (11, 31, 15), (3, 38, 12), (3, 36, 11), (3, 35, 10), + (3, 33, 9), (3, 32, 9), (3, 26, 8), (4, 22, 8), + (4, 15, 5), (6, 14, 11), (9, 13, 17), (20, 9, 41), + (31, 5, 65), (40, 9, 78), (50, 13, 92), (70, 18, 128), + (93, 16, 164), (129, 34, 207), (132, 33, 211), (136, 32, 215), + (133, 29, 213), (130, 27, 211), (115, 21, 192), (100, 17, 172), + (71, 11, 136), (58, 18, 106), (45, 26, 76), (39, 25, 68), + (34, 24, 61), (26, 31, 45), (19, 42, 25), (14, 42, 22), + (17, 39, 30), (3, 48, 25), (3, 48, 25), (3, 49, 25), + (2, 48, 21), (1, 47, 18), (1, 49, 11), (1, 48, 8), + (0, 43, 1), (0, 38, 1), (0, 34, 2), (0, 32, 2), + (0, 30, 2), (0, 27, 4), (0, 23, 6), (2, 21, 7), + (3, 24, 10), (6, 37, 19), (10, 40, 23), (14, 44, 27), + (25, 54, 34), (34, 62, 45), (35, 73, 57), (34, 82, 66), + (32, 89, 72), (25, 85, 66), (18, 82, 60), (16, 79, 52), + (15, 76, 44), (10, 67, 32), (12, 60, 22), (10, 54, 11), + (6, 49, 4), (3, 45, 4), (3, 44, 4), (3, 43, 5), + (2, 41, 6), (1, 38, 7), (1, 37, 10), (1, 38, 13), + (1, 40, 13), (1, 44, 10), (2, 48, 8), (1, 49, 8), + (1, 51, 8), (2, 52, 9), (4, 53, 15), (6, 61, 22), + (8, 69, 34), (21, 84, 61), (20, 86, 61), (19, 88, 61), + (24, 80, 61), (33, 69, 58), (28, 58, 44), (28, 45, 34), + (36, 20, 44), (38, 16, 55), (41, 12, 67), (56, 15, 84), + (71, 8, 110), (79, 0, 137), (83, 2, 146), (85, 14, 135), + (79, 27, 116), (48, 45, 68), (39, 49, 54), (30, 54, 40), + (23, 55, 28), (15, 53, 18), (8, 47, 13), (7, 40, 14), + (16, 28, 16), (18, 26, 16), (20, 25, 17), (27, 24, 19), + (36, 26, 22), (43, 31, 29), (46, 28, 50), (50, 20, 69), + (54, 23, 71), (54, 26, 73), (53, 23, 71), (47, 17, 64), + (42, 23, 49), (44, 26, 51), (47, 16, 69), (51, 12, 82), + (79, 3, 144), (87, 4, 153), (95, 6, 162), (105, 11, 178), + (116, 19, 192), (127, 27, 205), (132, 35, 214), (132, 41, 216), + (130, 42, 214), (122, 35, 203), (110, 26, 185), (95, 23, 170), + (80, 12, 151), (68, 3, 133), (58, 3, 128), (54, 2, 127), + (59, 1, 123), (54, 3, 122), (42, 8, 106), (46, 13, 82), + (46, 13, 71), (32, 18, 52), (32, 28, 32), (44, 34, 31), + (52, 41, 42), (60, 59, 55), (61, 75, 66), (55, 85, 73), + (54, 90, 76), (41, 89, 70), (25, 85, 57), (16, 72, 44), + (10, 56, 31), (8, 44, 21), (9, 36, 16), (13, 30, 16), + (16, 25, 17), (19, 22, 17), (25, 22, 18), (28, 22, 20), + (25, 23, 18), (26, 21, 16), (25, 18, 15), (19, 18, 12), + (15, 18, 10), (13, 16, 10), (9, 18, 10), (7, 20, 10), + (6, 20, 10), (6, 21, 10), (7, 21, 10), (6, 23, 9), + (7, 25, 10), (7, 25, 9), (6, 27, 9), (6, 31, 11), + (7, 32, 13), (6, 35, 13), (5, 39, 13), (5, 44, 10), + (8, 53, 7), (11, 56, 8), (18, 52, 12), (31, 56, 19), + (39, 58, 26), (48, 52, 41), (54, 49, 57), (49, 42, 58), + (41, 37, 51), (33, 41, 46), (49, 32, 85), (62, 31, 103) + ), + +// 604 Night_Reeds +((69, 72, 71), (44, 58, 44), (26, 43, 27), (9, 28, 10), + (15, 32, 10), (21, 37, 11), (27, 39, 13), (34, 42, 15), + (63, 59, 17), (77, 72, 16), (91, 85, 15), (106, 97, 25), + (122, 109, 35), (129, 111, 48), (137, 114, 61), (135, 114, 63), + (133, 114, 65), (113, 105, 62), (97, 92, 61), (82, 79, 60), + (68, 61, 53), (54, 44, 46), (47, 38, 40), (41, 32, 35), + (19, 20, 12), (14, 16, 8), (10, 12, 4), (8, 11, 3), + (7, 10, 3), (6, 10, 3), (6, 11, 4), (5, 13, 5), + (5, 14, 5), (5, 17, 4), (5, 21, 4), (5, 25, 4), + (7, 28, 4), (10, 32, 5), (12, 33, 5), (14, 35, 5), + (16, 42, 7), (18, 47, 8), (21, 52, 9), (24, 54, 10), + (28, 57, 12), (29, 57, 13), (30, 57, 14), (29, 55, 13), + (28, 54, 13), (26, 52, 14), (24, 51, 12), (22, 51, 11), + (20, 50, 10), (18, 50, 9), (18, 50, 9), (19, 50, 9), + (22, 56, 10), (25, 60, 10), (29, 65, 11), (33, 69, 13), + (37, 74, 16), (41, 76, 17), (45, 79, 18), (55, 84, 21), + (68, 87, 26), (81, 87, 49), (81, 86, 57), (82, 86, 65), + (81, 84, 62), (81, 82, 60), (77, 78, 57), (69, 72, 56), + (54, 63, 59), (43, 60, 47), (32, 57, 36), (27, 56, 25), + (22, 55, 15), (22, 55, 14), (22, 55, 14), (23, 55, 14), + (24, 55, 15), (26, 55, 15), (29, 57, 16), (33, 60, 18), + (35, 62, 20), (38, 65, 22), (48, 74, 25), (65, 85, 39), + (97, 110, 69), (101, 112, 72), (106, 115, 75), (107, 116, 74), + (109, 117, 74), (108, 121, 76), (107, 122, 78), (105, 117, 79), + (92, 104, 69), (59, 82, 37), (47, 75, 26), (36, 68, 15), + (33, 63, 14), (31, 59, 13), (26, 53, 11), (21, 47, 10), + (14, 35, 8), (12, 30, 8), (11, 26, 8), (10, 25, 8), + (9, 25, 9), (9, 26, 10), (11, 28, 10), (15, 33, 9), + (19, 35, 9), (26, 39, 8), (29, 38, 7), (33, 38, 7), + (41, 43, 6), (46, 46, 3), (45, 49, 4), (40, 46, 4), + (36, 30, 5), (32, 28, 4), (29, 26, 4), (24, 24, 3), + (20, 23, 3), (13, 17, 2), (7, 11, 2), (4, 6, 3), + (2, 3, 3), (0, 1, 2), (0, 1, 2), (0, 2, 3), + (0, 3, 4), (0, 4, 5), (0, 6, 6), (2, 6, 7), + (10, 12, 14), (16, 16, 21), (23, 21, 28), (26, 23, 31), + (29, 26, 34), (36, 33, 35), (40, 40, 35), (42, 46, 38), + (46, 51, 38), (52, 58, 41), (51, 59, 39), (50, 60, 37), + (45, 60, 33), (40, 59, 28), (34, 56, 25), (31, 51, 22), + (23, 38, 20), (21, 35, 20), (19, 32, 20), (14, 27, 19), + (11, 22, 18), (7, 18, 17), (5, 14, 16), (4, 12, 15), + (4, 11, 15), (7, 14, 13), (8, 15, 14), (9, 17, 15), + (14, 20, 17), (22, 24, 19), (27, 24, 20), (32, 24, 19), + (31, 23, 18), (31, 23, 18), (32, 24, 19), (30, 19, 19), + (29, 16, 19), (25, 13, 17), (18, 9, 14), (12, 7, 12), + (6, 5, 9), (3, 3, 8), (1, 3, 7), (1, 3, 5), + (0, 4, 4), (0, 5, 3), (0, 7, 2), (0, 9, 1), + (2, 15, 1), (3, 18, 1), (5, 21, 2), (6, 28, 2), + (8, 33, 3), (9, 38, 5), (12, 40, 6), (14, 42, 8), + (15, 45, 9), (16, 45, 9), (15, 44, 10), (13, 41, 10), + (12, 36, 11), (10, 31, 10), (9, 26, 8), (8, 21, 7), + (7, 16, 6), (8, 13, 6), (9, 11, 5), (10, 10, 5), + (11, 11, 5), (12, 11, 6), (15, 14, 8), (21, 18, 10), + (30, 20, 15), (36, 21, 18), (35, 22, 23), (34, 24, 24), + (34, 31, 25), (39, 38, 28), (48, 45, 29), (53, 51, 33), + (58, 59, 33), (60, 68, 31), (58, 76, 30), (60, 81, 27), + (58, 81, 25), (58, 79, 20), (60, 74, 16), (59, 71, 15), + (60, 70, 13), (64, 69, 13), (69, 67, 10), (78, 61, 7), + (85, 55, 6), (87, 53, 5), (91, 55, 12), (91, 60, 16), + (91, 65, 19), (90, 63, 19), (84, 64, 16), (78, 62, 19), + (66, 60, 22), (53, 62, 25), (41, 61, 24), (33, 64, 20), + (30, 63, 17), (28, 61, 15), (27, 58, 15), (25, 54, 14), + (23, 49, 14), (20, 44, 15), (19, 40, 17), (25, 41, 25), + (36, 43, 38), (48, 47, 52), (61, 56, 68), (73, 70, 78), + (68, 65, 71), (65, 63, 69), (61, 60, 64), (56, 54, 62) + ), + +// 605 No_Clue +((115, 83, 92), (119, 81, 103), (122, 82, 107), (125, 83, 112), + (125, 83, 111), (125, 83, 110), (127, 84, 108), (129, 86, 107), + (148, 97, 87), (158, 103, 77), (168, 110, 67), (173, 116, 62), + (179, 123, 57), (181, 132, 51), (183, 141, 45), (183, 144, 42), + (184, 148, 39), (179, 166, 30), (178, 168, 29), (177, 171, 28), + (173, 164, 35), (169, 157, 42), (166, 151, 46), (164, 146, 51), + (152, 122, 73), (144, 113, 81), (137, 105, 89), (132, 97, 97), + (127, 90, 105), (125, 85, 108), (123, 81, 112), (122, 72, 121), + (124, 60, 123), (124, 35, 130), (122, 32, 133), (120, 29, 136), + (117, 34, 134), (115, 40, 132), (115, 44, 130), (116, 49, 129), + (131, 66, 108), (140, 71, 95), (149, 77, 83), (153, 87, 76), + (158, 97, 70), (157, 102, 69), (157, 108, 68), (155, 120, 67), + (154, 131, 66), (156, 142, 66), (163, 141, 63), (170, 141, 61), + (176, 142, 57), (182, 143, 53), (183, 145, 52), (184, 147, 51), + (182, 153, 48), (179, 151, 50), (176, 150, 52), (173, 148, 53), + (170, 147, 54), (169, 146, 54), (169, 145, 54), (169, 144, 55), + (168, 143, 55), (167, 140, 57), (162, 131, 65), (157, 123, 73), + (153, 118, 77), (149, 114, 82), (142, 101, 91), (134, 91, 103), + (118, 77, 127), (110, 69, 136), (102, 61, 145), (96, 50, 155), + (90, 39, 166), (88, 34, 170), (86, 29, 175), (84, 19, 182), + (82, 14, 187), (82, 8, 190), (84, 9, 188), (86, 11, 187), + (87, 11, 187), (88, 11, 187), (91, 9, 188), (92, 8, 189), + (95, 5, 193), (97, 4, 192), (99, 4, 192), (101, 4, 190), + (103, 5, 189), (103, 5, 188), (103, 8, 185), (100, 10, 180), + (95, 13, 172), (83, 16, 156), (78, 21, 149), (74, 27, 142), + (75, 30, 139), (76, 33, 137), (80, 41, 132), (87, 48, 127), + (102, 53, 113), (109, 50, 95), (117, 48, 77), (118, 47, 72), + (120, 47, 68), (126, 45, 63), (131, 43, 63), (135, 44, 67), + (142, 45, 75), (151, 41, 97), (153, 37, 98), (156, 34, 99), + (157, 26, 105), (156, 19, 109), (154, 17, 111), (151, 21, 109), + (148, 40, 106), (147, 52, 103), (147, 64, 100), (148, 70, 97), + (150, 76, 95), (153, 85, 89), (153, 93, 86), (153, 102, 83), + (152, 111, 82), (154, 123, 72), (154, 125, 70), (155, 127, 69), + (158, 130, 68), (160, 126, 68), (161, 119, 70), (162, 111, 72), + (165, 88, 69), (163, 79, 67), (161, 70, 65), (157, 66, 65), + (154, 62, 65), (145, 57, 66), (133, 51, 67), (122, 46, 71), + (114, 41, 69), (106, 28, 68), (105, 28, 68), (105, 29, 69), + (103, 30, 70), (100, 35, 72), (93, 37, 80), (80, 42, 91), + (63, 50, 101), (63, 50, 103), (63, 50, 105), (68, 53, 112), + (75, 58, 115), (85, 62, 119), (92, 67, 124), (99, 76, 128), + (103, 83, 129), (123, 98, 116), (127, 102, 109), (131, 106, 102), + (139, 116, 94), (147, 125, 85), (154, 130, 78), (160, 135, 74), + (164, 140, 70), (165, 140, 68), (166, 141, 67), (167, 141, 65), + (167, 142, 64), (164, 141, 66), (158, 139, 68), (149, 136, 75), + (142, 128, 82), (136, 119, 90), (131, 108, 97), (126, 96, 111), + (119, 87, 123), (113, 79, 131), (106, 72, 137), (93, 64, 146), + (71, 47, 165), (67, 44, 168), (64, 42, 172), (60, 32, 178), + (55, 24, 178), (55, 19, 175), (56, 14, 169), (53, 14, 161), + (49, 13, 153), (47, 14, 144), (45, 18, 136), (45, 19, 131), + (45, 21, 123), (42, 21, 116), (45, 22, 114), (44, 26, 112), + (40, 31, 108), (39, 35, 104), (39, 45, 99), (40, 54, 99), + (41, 68, 97), (39, 79, 92), (42, 84, 95), (47, 86, 101), + (52, 86, 106), (58, 83, 110), (65, 81, 112), (69, 79, 112), + (72, 84, 108), (71, 89, 99), (71, 94, 83), (68, 91, 71), + (74, 86, 63), (75, 81, 62), (84, 64, 69), (88, 53, 80), + (93, 41, 89), (95, 34, 97), (92, 31, 103), (84, 31, 108), + (78, 32, 109), (68, 36, 111), (66, 36, 116), (64, 35, 118), + (64, 33, 119), (65, 32, 121), (65, 35, 124), (69, 36, 129), + (76, 36, 131), (78, 35, 130), (80, 37, 132), (85, 38, 130), + (90, 41, 125), (97, 44, 116), (106, 51, 104), (115, 59, 90), + (128, 62, 73), (137, 65, 62), (142, 69, 57), (145, 68, 59), + (146, 68, 62), (146, 68, 64), (144, 71, 64), (146, 86, 61), + (147, 94, 56), (146, 102, 55), (143, 108, 56), (137, 110, 60), + (131, 106, 65), (125, 98, 70), (114, 87, 79), (114, 85, 88) + ), + +// 606 Nonsense +((141, 166, 81), (171, 172, 77), (179, 186, 75), (188, 200, 74), + (195, 206, 75), (202, 213, 77), (198, 208, 80), (195, 203, 83), + (160, 167, 95), (145, 149, 113), (131, 131, 132), (115, 111, 146), + (100, 92, 160), (81, 75, 165), (63, 59, 170), (56, 52, 168), + (50, 46, 166), (41, 37, 151), (46, 32, 142), (51, 28, 133), + (61, 32, 130), (71, 37, 128), (78, 42, 131), (86, 48, 135), + (118, 78, 160), (134, 95, 173), (150, 113, 187), (163, 137, 191), + (176, 161, 196), (181, 171, 192), (186, 181, 188), (198, 191, 178), + (197, 191, 160), (174, 170, 122), (164, 159, 102), (155, 148, 83), + (141, 127, 73), (127, 107, 64), (114, 94, 62), (101, 82, 61), + (59, 45, 85), (49, 43, 103), (39, 41, 122), (37, 46, 134), + (36, 52, 147), (39, 54, 150), (43, 56, 154), (48, 54, 155), + (56, 55, 152), (66, 60, 145), (74, 56, 142), (83, 52, 140), + (79, 46, 135), (76, 41, 130), (72, 38, 131), (68, 36, 133), + (51, 34, 152), (44, 46, 160), (38, 59, 169), (46, 75, 164), + (54, 92, 160), (58, 98, 156), (63, 104, 153), (68, 117, 145), + (64, 119, 137), (74, 110, 130), (87, 104, 122), (101, 99, 115), + (105, 90, 111), (109, 81, 108), (104, 64, 98), (102, 49, 90), + (109, 34, 65), (107, 25, 58), (106, 16, 52), (96, 22, 55), + (86, 28, 59), (83, 33, 62), (80, 38, 66), (68, 44, 69), + (55, 40, 75), (23, 36, 81), (19, 42, 83), (15, 49, 85), + (14, 48, 82), (14, 48, 79), (14, 49, 65), (10, 38, 49), + (14, 29, 27), (17, 30, 23), (20, 31, 20), (19, 29, 20), + (18, 27, 20), (20, 24, 27), (19, 28, 29), (26, 31, 27), + (32, 32, 26), (38, 27, 38), (41, 27, 43), (44, 28, 48), + (49, 26, 48), (54, 25, 48), (64, 25, 50), (72, 25, 63), + (72, 34, 97), (71, 33, 105), (70, 33, 113), (67, 31, 120), + (65, 30, 128), (59, 33, 147), (45, 35, 172), (37, 46, 191), + (34, 59, 194), (37, 77, 203), (39, 80, 209), (42, 83, 216), + (54, 92, 234), (72, 112, 235), (80, 128, 233), (91, 143, 227), + (111, 171, 228), (124, 178, 223), (137, 186, 218), (137, 183, 214), + (137, 180, 210), (129, 170, 203), (109, 164, 207), (101, 164, 206), + (97, 162, 202), (103, 154, 185), (102, 151, 183), (102, 149, 181), + (95, 149, 167), (92, 146, 152), (84, 129, 136), (87, 121, 113), + (91, 110, 77), (82, 107, 61), (74, 105, 45), (69, 99, 39), + (64, 93, 33), (63, 81, 26), (65, 70, 24), (71, 66, 25), + (72, 68, 34), (73, 73, 62), (76, 71, 70), (79, 69, 79), + (81, 64, 84), (86, 57, 82), (84, 51, 80), (87, 53, 76), + (92, 54, 71), (97, 55, 65), (103, 56, 59), (111, 60, 45), + (120, 65, 35), (131, 67, 28), (133, 67, 31), (136, 58, 31), + (139, 51, 28), (137, 43, 36), (135, 42, 43), (133, 42, 50), + (126, 41, 62), (121, 42, 68), (116, 45, 72), (117, 56, 72), + (117, 76, 78), (112, 80, 78), (107, 85, 78), (94, 88, 74), + (88, 93, 65), (86, 95, 66), (100, 105, 64), (107, 118, 64), + (111, 128, 67), (115, 140, 65), (113, 148, 69), (127, 162, 82), + (142, 183, 96), (159, 198, 113), (173, 214, 133), (175, 224, 145), + (171, 222, 169), (170, 214, 166), (170, 206, 164), (173, 185, 158), + (183, 176, 154), (192, 172, 146), (197, 179, 142), (206, 181, 127), + (204, 173, 103), (210, 169, 83), (215, 176, 62), (216, 193, 52), + (224, 211, 46), (216, 220, 45), (205, 209, 49), (188, 198, 57), + (160, 186, 70), (146, 172, 85), (134, 169, 98), (127, 158, 110), + (129, 153, 119), (122, 154, 134), (129, 152, 158), (135, 156, 170), + (142, 154, 174), (152, 144, 166), (154, 143, 153), (155, 137, 151), + (149, 136, 145), (138, 132, 142), (120, 119, 130), (102, 115, 120), + (90, 114, 120), (82, 127, 120), (84, 146, 127), (89, 161, 130), + (100, 181, 142), (116, 197, 157), (128, 211, 167), (143, 221, 175), + (156, 224, 174), (174, 223, 174), (193, 217, 174), (206, 208, 164), + (215, 202, 150), (212, 195, 129), (215, 189, 107), (223, 183, 96), + (234, 171, 84), (245, 163, 73), (237, 155, 65), (228, 146, 54), + (211, 136, 46), (193, 123, 47), (182, 110, 50), (163, 101, 60), + (148, 99, 77), (128, 94, 86), (107, 90, 90), (89, 87, 90), + (72, 81, 85), (63, 88, 85), (59, 100, 91), (58, 111, 93), + (58, 122, 94), (56, 123, 85), (59, 118, 70), (67, 116, 61), + (76, 116, 57), (91, 122, 66), (104, 140, 73), (122, 156, 79) + ), + +// 607 Oak_Tree +((90, 69, 31), (105, 83, 43), (108, 86, 46), (112, 90, 50), + (111, 94, 55), (110, 98, 61), (109, 100, 62), (109, 102, 63), + (120, 108, 62), (126, 113, 64), (132, 118, 67), (141, 125, 77), + (151, 132, 87), (150, 133, 95), (150, 134, 103), (149, 134, 103), + (149, 134, 104), (133, 114, 104), (129, 115, 96), (126, 117, 88), + (126, 115, 82), (126, 114, 76), (127, 116, 70), (129, 119, 64), + (143, 100, 34), (143, 100, 22), (143, 101, 11), (141, 94, 13), + (139, 88, 16), (133, 88, 16), (127, 89, 16), (110, 83, 21), + (95, 66, 24), (60, 39, 19), (57, 33, 13), (54, 28, 8), + (67, 32, 5), (80, 36, 3), (87, 42, 9), (95, 49, 15), + (120, 70, 40), (116, 77, 56), (113, 84, 72), (116, 95, 79), + (119, 106, 86), (124, 111, 90), (129, 116, 95), (150, 135, 103), + (163, 151, 118), (202, 185, 153), (209, 194, 150), (216, 204, 147), + (222, 199, 129), (228, 194, 112), (224, 193, 102), (220, 192, 93), + (212, 178, 109), (207, 181, 118), (202, 185, 128), (195, 180, 127), + (188, 175, 126), (178, 165, 120), (168, 155, 114), (143, 131, 95), + (120, 110, 77), (81, 73, 59), (65, 60, 47), (50, 47, 36), + (45, 42, 32), (40, 38, 29), (32, 29, 22), (32, 28, 14), + (49, 41, 14), (60, 47, 15), (71, 53, 16), (84, 62, 23), + (97, 72, 30), (100, 73, 33), (104, 74, 36), (90, 67, 36), + (86, 71, 32), (83, 59, 31), (84, 57, 29), (86, 56, 27), + (90, 55, 29), (95, 55, 31), (104, 55, 31), (111, 61, 24), + (105, 65, 34), (99, 69, 34), (93, 73, 35), (89, 73, 39), + (85, 73, 43), (84, 73, 52), (87, 76, 58), (87, 76, 59), + (88, 73, 60), (88, 68, 59), (77, 59, 52), (66, 51, 46), + (60, 46, 41), (55, 42, 36), (42, 32, 30), (34, 25, 25), + (42, 28, 24), (54, 36, 27), (66, 44, 31), (72, 47, 31), + (78, 51, 31), (88, 59, 31), (89, 66, 33), (89, 71, 31), + (90, 73, 30), (79, 70, 35), (77, 69, 36), (75, 69, 38), + (69, 63, 39), (67, 58, 42), (67, 59, 43), (67, 60, 41), + (88, 66, 36), (102, 80, 39), (117, 94, 42), (128, 100, 41), + (140, 107, 41), (153, 118, 42), (157, 115, 46), (157, 120, 46), + (151, 118, 48), (116, 94, 66), (112, 95, 72), (109, 97, 78), + (108, 103, 96), (116, 117, 119), (132, 133, 134), (146, 139, 137), + (169, 159, 137), (172, 154, 121), (176, 149, 106), (175, 147, 102), + (174, 146, 98), (175, 142, 99), (181, 154, 99), (179, 156, 99), + (176, 151, 98), (160, 141, 75), (151, 131, 67), (142, 121, 59), + (128, 101, 39), (104, 79, 29), (85, 63, 26), (74, 55, 24), + (67, 49, 29), (70, 52, 33), (74, 55, 37), (88, 61, 46), + (106, 67, 50), (124, 78, 53), (136, 83, 57), (145, 89, 56), + (148, 98, 54), (139, 86, 56), (136, 83, 55), (134, 80, 54), + (128, 73, 55), (120, 62, 52), (112, 55, 50), (101, 53, 51), + (81, 60, 53), (76, 60, 53), (71, 61, 54), (67, 62, 54), + (66, 63, 55), (63, 63, 49), (60, 58, 41), (59, 52, 36), + (52, 46, 32), (47, 39, 26), (51, 38, 21), (56, 41, 27), + (61, 45, 34), (73, 57, 43), (96, 73, 57), (120, 92, 71), + (143, 120, 91), (148, 123, 91), (153, 127, 92), (149, 132, 90), + (141, 124, 89), (129, 115, 82), (117, 102, 73), (105, 88, 65), + (95, 79, 58), (91, 70, 51), (87, 62, 45), (91, 59, 38), + (105, 61, 27), (113, 65, 23), (118, 72, 25), (124, 75, 20), + (119, 77, 23), (107, 78, 31), (96, 75, 37), (91, 73, 48), + (91, 71, 56), (95, 74, 56), (103, 86, 57), (110, 91, 60), + (114, 91, 56), (114, 97, 54), (111, 99, 55), (106, 92, 53), + (101, 85, 53), (96, 84, 57), (90, 81, 58), (88, 76, 58), + (85, 77, 59), (83, 78, 59), (87, 80, 62), (94, 85, 66), + (96, 88, 69), (95, 92, 74), (95, 95, 75), (88, 91, 71), + (83, 86, 64), (80, 81, 56), (74, 71, 45), (74, 61, 36), + (79, 54, 35), (81, 51, 36), (85, 53, 36), (96, 57, 37), + (106, 66, 39), (115, 80, 44), (128, 93, 48), (145, 104, 54), + (154, 117, 65), (156, 124, 72), (157, 123, 76), (155, 122, 81), + (147, 118, 77), (134, 106, 72), (119, 95, 67), (104, 81, 56), + (87, 66, 46), (74, 57, 36), (66, 50, 26), (62, 48, 21), + (62, 47, 18), (66, 44, 13), (73, 48, 16), (77, 45, 22), + (77, 44, 20), (81, 49, 19), (83, 52, 26), (84, 58, 31) + ), + +// 608 Ocean_Mist +((117, 195, 196), (113, 177, 175), (105, 167, 161), (98, 157, 148), + (88, 144, 130), (79, 131, 113), (75, 124, 104), (72, 117, 96), + (54, 94, 67), (45, 88, 56), (37, 82, 45), (36, 73, 41), + (35, 65, 38), (30, 56, 36), (26, 47, 35), (22, 45, 32), + (18, 43, 29), (17, 32, 32), (17, 28, 37), (18, 24, 43), + (16, 21, 43), (15, 18, 44), (15, 17, 45), (16, 16, 46), + (19, 21, 59), (22, 27, 65), (26, 33, 71), (34, 44, 75), + (42, 56, 80), (47, 64, 80), (52, 72, 81), (59, 84, 84), + (64, 94, 88), (72, 112, 99), (79, 125, 104), (87, 138, 110), + (91, 148, 118), (96, 158, 126), (96, 159, 129), (97, 160, 132), + (93, 156, 135), (90, 160, 137), (88, 164, 140), (87, 160, 136), + (86, 157, 133), (83, 151, 127), (80, 146, 121), (71, 130, 114), + (62, 116, 103), (48, 94, 87), (46, 89, 83), (44, 85, 80), + (42, 81, 75), (41, 77, 71), (39, 75, 67), (38, 74, 64), + (42, 80, 61), (47, 86, 61), (53, 92, 62), (53, 93, 60), + (53, 94, 59), (52, 93, 60), (52, 93, 62), (54, 90, 66), + (56, 85, 73), (49, 70, 76), (45, 61, 76), (42, 52, 77), + (41, 47, 79), (40, 43, 81), (37, 37, 84), (37, 30, 83), + (34, 21, 73), (32, 24, 70), (30, 28, 68), (31, 38, 67), + (33, 48, 67), (35, 53, 67), (38, 59, 68), (45, 69, 68), + (51, 82, 70), (60, 107, 73), (64, 109, 74), (69, 112, 76), + (71, 110, 78), (73, 108, 81), (74, 104, 86), (68, 98, 86), + (50, 75, 77), (45, 62, 76), (40, 49, 75), (37, 43, 74), + (35, 38, 73), (29, 32, 71), (22, 26, 64), (19, 23, 57), + (18, 22, 53), (22, 33, 55), (24, 42, 59), (27, 51, 63), + (29, 54, 64), (31, 57, 66), (39, 61, 69), (48, 62, 73), + (57, 61, 88), (57, 58, 92), (57, 55, 96), (61, 53, 97), + (65, 52, 98), (71, 54, 110), (82, 63, 123), (90, 74, 134), + (98, 92, 148), (117, 120, 161), (120, 127, 159), (124, 134, 158), + (122, 141, 156), (119, 144, 151), (114, 144, 145), (109, 134, 140), + (91, 113, 108), (75, 101, 97), (59, 89, 87), (55, 86, 87), + (51, 84, 88), (54, 88, 86), (63, 92, 84), (71, 100, 85), + (76, 106, 86), (80, 120, 88), (79, 120, 85), (79, 120, 83), + (77, 119, 77), (74, 116, 73), (71, 110, 69), (69, 105, 65), + (52, 80, 57), (46, 72, 56), (40, 64, 55), (41, 65, 55), + (43, 66, 56), (53, 74, 60), (58, 82, 65), (65, 93, 75), + (71, 106, 91), (88, 140, 123), (90, 148, 129), (92, 157, 136), + (98, 170, 145), (101, 179, 155), (98, 182, 157), (96, 181, 159), + (90, 173, 145), (90, 171, 142), (90, 169, 140), (83, 161, 128), + (75, 152, 117), (68, 143, 106), (63, 134, 96), (63, 127, 90), + (62, 124, 86), (62, 116, 83), (62, 115, 84), (63, 115, 86), + (65, 113, 92), (71, 119, 99), (78, 128, 106), (91, 137, 116), + (115, 156, 146), (119, 160, 154), (123, 165, 162), (127, 172, 170), + (130, 177, 175), (126, 177, 175), (123, 169, 174), (118, 163, 171), + (112, 149, 162), (107, 140, 150), (93, 130, 135), (81, 119, 119), + (69, 115, 103), (62, 106, 90), (64, 104, 80), (64, 103, 75), + (59, 112, 73), (58, 113, 72), (57, 115, 71), (61, 120, 71), + (66, 122, 73), (73, 123, 76), (75, 126, 82), (75, 125, 89), + (77, 127, 95), (81, 127, 102), (88, 132, 112), (99, 137, 121), + (109, 141, 133), (121, 145, 145), (127, 144, 152), (127, 149, 156), + (125, 154, 153), (127, 158, 149), (137, 164, 146), (142, 163, 148), + (145, 163, 151), (138, 162, 150), (134, 164, 150), (138, 169, 149), + (144, 174, 156), (153, 186, 175), (161, 191, 189), (170, 198, 207), + (177, 203, 218), (181, 204, 219), (175, 210, 217), (166, 207, 203), + (155, 199, 187), (142, 188, 172), (130, 172, 159), (114, 160, 147), + (97, 148, 134), (82, 132, 122), (68, 116, 110), (56, 98, 104), + (49, 82, 99), (45, 71, 96), (44, 63, 98), (46, 58, 103), + (47, 53, 109), (49, 53, 112), (52, 52, 110), (56, 53, 105), + (61, 58, 104), (58, 58, 103), (56, 60, 104), (53, 59, 106), + (52, 55, 102), (55, 55, 100), (52, 52, 97), (48, 51, 97), + (45, 54, 101), (49, 61, 110), (63, 73, 122), (81, 92, 135), + (98, 110, 152), (112, 128, 165), (120, 149, 179), (126, 170, 191), + (132, 189, 200), (136, 202, 209), (142, 208, 213), (142, 212, 213), + (138, 214, 213), (133, 216, 213), (123, 214, 209), (120, 205, 206) + ), + +// 609 Paige +((91, 86, 67), (89, 83, 64), (92, 86, 64), (95, 90, 65), + (103, 95, 64), (111, 100, 64), (116, 102, 63), (121, 105, 63), + (133, 110, 61), (133, 111, 62), (133, 113, 63), (133, 118, 69), + (134, 123, 76), (141, 132, 83), (148, 141, 90), (154, 146, 94), + (160, 152, 99), (186, 178, 115), (196, 189, 121), (206, 201, 127), + (209, 207, 131), (213, 213, 136), (211, 213, 136), (210, 213, 137), + (196, 198, 133), (185, 187, 128), (174, 176, 123), (162, 165, 117), + (150, 155, 111), (145, 150, 108), (140, 146, 105), (132, 140, 102), + (128, 135, 100), (123, 129, 99), (120, 128, 100), (118, 127, 101), + (116, 128, 103), (115, 129, 105), (115, 130, 105), (115, 131, 106), + (116, 131, 105), (116, 128, 104), (116, 126, 103), (112, 122, 100), + (109, 118, 98), (107, 116, 96), (105, 114, 95), (101, 108, 90), + (96, 101, 83), (86, 85, 67), (80, 76, 62), (75, 68, 58), + (69, 62, 55), (63, 57, 53), (62, 55, 52), (61, 53, 52), + (62, 55, 53), (66, 56, 51), (70, 57, 49), (72, 60, 50), + (75, 63, 51), (75, 63, 51), (75, 64, 52), (73, 63, 50), + (70, 59, 49), (61, 52, 46), (54, 45, 41), (48, 39, 36), + (45, 36, 35), (43, 34, 34), (37, 30, 33), (31, 27, 32), + (21, 21, 31), (18, 18, 31), (16, 16, 32), (13, 14, 31), + (11, 12, 31), (10, 11, 32), (10, 11, 33), (10, 10, 33), + (10, 9, 32), (13, 12, 32), (16, 13, 32), (20, 15, 32), + (22, 17, 32), (24, 19, 32), (28, 24, 33), (35, 30, 34), + (51, 43, 36), (61, 51, 39), (72, 60, 43), (75, 61, 42), + (79, 63, 42), (84, 66, 41), (85, 69, 41), (86, 70, 42), + (85, 71, 43), (82, 72, 46), (83, 75, 50), (85, 78, 55), + (85, 78, 56), (86, 79, 57), (84, 79, 59), (81, 78, 59), + (71, 71, 56), (66, 67, 55), (61, 64, 54), (59, 63, 54), + (58, 62, 55), (56, 62, 57), (56, 62, 61), (56, 62, 63), + (58, 65, 66), (59, 69, 71), (60, 69, 72), (61, 70, 73), + (63, 72, 73), (63, 74, 73), (64, 74, 74), (66, 73, 75), + (68, 73, 73), (71, 76, 73), (75, 80, 73), (79, 83, 74), + (84, 86, 75), (93, 96, 76), (102, 105, 76), (111, 114, 75), + (119, 121, 76), (134, 130, 72), (137, 132, 71), (140, 135, 70), + (147, 139, 69), (155, 145, 72), (164, 153, 78), (172, 162, 84), + (186, 182, 105), (191, 189, 111), (196, 196, 118), (198, 198, 120), + (201, 201, 122), (204, 203, 124), (205, 205, 127), (206, 205, 128), + (206, 203, 128), (204, 201, 132), (203, 201, 132), (202, 201, 133), + (203, 202, 133), (204, 202, 130), (206, 202, 126), (206, 201, 121), + (208, 200, 115), (207, 199, 115), (207, 199, 115), (203, 196, 115), + (200, 196, 117), (199, 195, 118), (199, 195, 118), (198, 194, 115), + (198, 194, 112), (201, 194, 109), (200, 192, 108), (199, 191, 107), + (193, 183, 106), (183, 176, 105), (171, 165, 104), (157, 151, 98), + (128, 121, 85), (121, 115, 81), (115, 110, 78), (106, 100, 71), + (94, 86, 64), (82, 75, 60), (70, 64, 57), (57, 53, 53), + (45, 42, 53), (34, 33, 51), (25, 28, 51), (20, 27, 53), + (19, 28, 56), (22, 32, 58), (26, 37, 60), (31, 44, 62), + (48, 60, 70), (53, 65, 72), (58, 70, 74), (68, 81, 79), + (80, 91, 83), (91, 102, 87), (103, 111, 90), (110, 118, 91), + (115, 122, 93), (118, 123, 92), (120, 122, 91), (119, 120, 90), + (117, 115, 86), (112, 111, 83), (108, 105, 79), (104, 98, 76), + (97, 92, 73), (90, 85, 69), (86, 80, 67), (82, 77, 67), + (81, 75, 65), (81, 75, 65), (81, 77, 63), (85, 76, 60), + (85, 75, 57), (84, 73, 54), (85, 73, 51), (86, 73, 51), + (89, 73, 50), (93, 75, 50), (95, 80, 51), (98, 84, 53), + (97, 84, 53), (95, 81, 52), (90, 77, 49), (81, 71, 48), + (72, 62, 44), (64, 52, 41), (57, 47, 40), (52, 44, 40), + (48, 42, 41), (47, 40, 40), (46, 39, 39), (44, 40, 38), + (42, 40, 37), (41, 38, 34), (42, 37, 32), (43, 36, 32), + (43, 37, 34), (47, 41, 36), (53, 45, 40), (62, 52, 43), + (72, 62, 47), (81, 71, 49), (89, 79, 50), (96, 85, 54), + (95, 87, 59), (93, 89, 63), (90, 88, 69), (85, 86, 72), + (83, 85, 76), (81, 84, 77), (78, 84, 75), (80, 85, 74), + (80, 85, 74), (79, 84, 72), (84, 90, 75), (86, 92, 75), + (87, 92, 75), (89, 92, 73), (90, 90, 73), (91, 88, 68) + ), + +// 610 Paris +((176, 76, 65), (183, 75, 67), (187, 73, 69), (191, 72, 71), + (194, 71, 70), (198, 71, 69), (198, 71, 70), (199, 72, 72), + (196, 82, 72), (197, 94, 76), (199, 107, 81), (206, 118, 87), + (214, 129, 93), (219, 140, 96), (224, 151, 100), (224, 157, 102), + (225, 164, 105), (227, 181, 125), (223, 176, 131), (219, 171, 137), + (206, 169, 140), (194, 168, 144), (187, 170, 145), (181, 172, 147), + (158, 165, 152), (146, 155, 148), (134, 146, 144), (129, 139, 138), + (124, 133, 132), (124, 129, 130), (124, 126, 128), (126, 123, 123), + (131, 114, 118), (136, 100, 106), (125, 95, 100), (114, 90, 95), + (100, 88, 93), (87, 87, 92), (82, 88, 93), (77, 90, 95), + (57, 97, 99), (54, 91, 95), (52, 86, 91), (64, 81, 91), + (76, 77, 91), (80, 77, 91), (84, 77, 92), (93, 70, 84), + (103, 59, 72), (119, 26, 56), (114, 27, 53), (109, 28, 51), + (108, 31, 49), (108, 35, 47), (113, 33, 49), (119, 31, 52), + (127, 50, 68), (137, 62, 72), (147, 75, 76), (163, 78, 81), + (179, 82, 87), (180, 84, 90), (182, 86, 94), (179, 96, 102), + (175, 104, 104), (163, 121, 108), (159, 128, 118), (156, 136, 128), + (158, 143, 133), (161, 150, 138), (165, 167, 142), (167, 184, 147), + (177, 204, 162), (186, 212, 167), (196, 220, 173), (196, 220, 172), + (196, 221, 171), (194, 217, 170), (192, 213, 170), (191, 203, 165), + (195, 198, 161), (200, 189, 156), (199, 183, 153), (199, 178, 150), + (200, 178, 147), (201, 178, 145), (205, 179, 139), (209, 176, 134), + (206, 162, 130), (201, 156, 124), (196, 150, 119), (192, 146, 115), + (188, 143, 112), (182, 133, 105), (176, 123, 97), (173, 115, 95), + (166, 115, 90), (142, 115, 89), (131, 110, 86), (120, 105, 83), + (116, 103, 82), (113, 102, 81), (110, 99, 79), (105, 92, 79), + (103, 87, 72), (111, 87, 70), (120, 88, 68), (125, 86, 69), + (131, 84, 70), (142, 87, 71), (153, 91, 71), (165, 96, 71), + (176, 103, 73), (196, 113, 91), (199, 114, 93), (203, 116, 96), + (210, 116, 96), (214, 112, 95), (216, 107, 93), (218, 107, 97), + (224, 108, 99), (224, 106, 95), (224, 104, 92), (224, 103, 89), + (224, 102, 87), (222, 102, 84), (224, 104, 83), (226, 108, 85), + (227, 113, 86), (231, 120, 81), (231, 120, 80), (232, 121, 79), + (233, 126, 80), (233, 131, 84), (235, 134, 85), (238, 136, 86), + (238, 134, 87), (234, 136, 86), (230, 138, 86), (229, 137, 86), + (228, 137, 87), (225, 134, 90), (222, 131, 96), (220, 129, 98), + (214, 128, 98), (203, 125, 97), (199, 124, 99), (195, 123, 102), + (189, 120, 105), (183, 115, 104), (177, 106, 100), (175, 101, 93), + (174, 98, 88), (174, 98, 86), (174, 98, 85), (176, 95, 84), + (180, 95, 83), (185, 101, 85), (195, 111, 90), (206, 124, 93), + (214, 135, 99), (222, 159, 112), (222, 166, 116), (222, 173, 120), + (226, 184, 127), (230, 189, 132), (230, 192, 139), (228, 192, 142), + (206, 186, 144), (202, 183, 143), (199, 181, 142), (197, 173, 138), + (198, 163, 133), (194, 153, 125), (188, 142, 118), (177, 134, 113), + (171, 125, 106), (166, 119, 99), (159, 114, 95), (152, 109, 93), + (142, 106, 90), (136, 99, 89), (133, 93, 88), (132, 86, 90), + (128, 76, 91), (131, 71, 88), (134, 67, 86), (139, 64, 79), + (146, 57, 73), (149, 54, 69), (146, 52, 67), (145, 47, 60), + (142, 52, 54), (141, 60, 47), (139, 70, 45), (140, 79, 48), + (140, 87, 50), (139, 94, 55), (143, 102, 56), (147, 111, 62), + (156, 120, 71), (165, 133, 84), (170, 149, 97), (178, 159, 110), + (186, 164, 115), (194, 164, 115), (204, 164, 119), (210, 168, 118), + (212, 172, 121), (213, 170, 120), (211, 162, 114), (207, 147, 107), + (202, 134, 100), (193, 123, 97), (185, 114, 95), (175, 115, 98), + (170, 116, 103), (172, 118, 109), (175, 120, 112), (182, 120, 113), + (186, 126, 109), (191, 134, 108), (201, 141, 109), (210, 146, 108), + (219, 143, 105), (223, 141, 99), (223, 141, 97), (223, 141, 101), + (225, 146, 105), (228, 150, 110), (231, 157, 113), (232, 167, 122), + (231, 175, 133), (232, 185, 140), (232, 195, 144), (230, 204, 143), + (229, 210, 139), (219, 211, 136), (212, 205, 130), (208, 196, 123), + (200, 187, 116), (196, 182, 107), (189, 179, 106), (182, 176, 103), + (177, 167, 106), (173, 158, 111), (165, 149, 111), (158, 140, 111), + (153, 139, 108), (147, 129, 104), (146, 119, 103), (143, 106, 99), + (137, 91, 95), (143, 85, 88), (152, 78, 77), (163, 76, 72) + ), + +// 611 Parrot +((156, 101, 8), (97, 91, 9), (73, 88, 14), (50, 85, 20), + (40, 82, 23), (31, 79, 26), (27, 77, 24), (24, 76, 22), + (35, 58, 23), (44, 57, 16), (54, 56, 10), (53, 66, 11), + (52, 76, 12), (44, 89, 16), (36, 103, 20), (33, 109, 21), + (31, 115, 23), (43, 131, 28), (67, 137, 31), (92, 144, 35), + (106, 142, 52), (120, 141, 70), (112, 133, 75), (104, 125, 81), + (64, 111, 102), (48, 98, 92), (32, 86, 82), (53, 95, 66), + (75, 104, 50), (86, 106, 45), (97, 108, 41), (126, 122, 52), + (158, 129, 57), (176, 125, 78), (174, 103, 78), (172, 82, 79), + (154, 69, 70), (136, 56, 62), (135, 42, 60), (134, 29, 58), + (98, 14, 39), (81, 9, 36), (65, 5, 34), (59, 5, 26), + (54, 5, 18), (62, 7, 22), (70, 9, 27), (88, 18, 26), + (107, 34, 24), (146, 63, 18), (155, 87, 21), (165, 112, 25), + (179, 120, 29), (193, 129, 34), (198, 132, 39), (203, 136, 44), + (219, 104, 40), (226, 85, 33), (234, 66, 27), (233, 56, 22), + (232, 47, 18), (236, 52, 23), (240, 57, 29), (234, 74, 30), + (239, 98, 34), (242, 123, 33), (225, 127, 22), (209, 132, 12), + (192, 131, 11), (175, 131, 10), (140, 131, 16), (117, 122, 25), + (51, 130, 49), (51, 113, 60), (51, 96, 71), (52, 92, 67), + (54, 89, 64), (67, 88, 59), (81, 87, 54), (95, 86, 42), + (101, 94, 26), (108, 91, 10), (85, 79, 23), (63, 67, 36), + (56, 55, 38), (49, 43, 40), (39, 28, 57), (34, 22, 73), + (55, 5, 68), (81, 10, 62), (107, 16, 57), (115, 16, 55), + (123, 17, 53), (136, 16, 54), (157, 17, 59), (176, 18, 63), + (191, 13, 55), (206, 20, 55), (204, 21, 50), (202, 23, 45), + (189, 23, 49), (177, 23, 54), (152, 19, 67), (121, 15, 80), + (81, 12, 91), (66, 19, 78), (52, 26, 65), (54, 25, 58), + (57, 25, 52), (58, 29, 32), (48, 30, 13), (42, 22, 6), + (47, 19, 6), (60, 9, 11), (69, 9, 10), (78, 9, 9), + (103, 8, 6), (124, 4, 14), (145, 7, 20), (162, 11, 17), + (165, 18, 59), (160, 19, 69), (156, 20, 79), (145, 24, 79), + (134, 29, 79), (118, 34, 71), (103, 32, 64), (87, 35, 57), + (70, 34, 61), (68, 36, 81), (72, 34, 92), (76, 33, 103), + (81, 37, 123), (81, 62, 141), (84, 88, 149), (93, 108, 143), + (75, 142, 149), (76, 132, 131), (77, 123, 114), (77, 116, 106), + (78, 109, 98), (82, 96, 83), (103, 62, 71), (136, 47, 51), + (157, 48, 32), (177, 52, 22), (180, 60, 15), (184, 69, 9), + (178, 83, 15), (184, 99, 18), (193, 105, 12), (203, 95, 16), + (227, 69, 45), (224, 57, 50), (222, 45, 55), (216, 27, 73), + (204, 37, 91), (180, 30, 102), (146, 19, 105), (119, 39, 106), + (91, 44, 112), (63, 39, 110), (64, 38, 108), (66, 38, 106), + (64, 34, 98), (72, 44, 87), (88, 50, 79), (89, 47, 75), + (101, 62, 73), (100, 57, 74), (99, 53, 76), (94, 43, 79), + (98, 33, 74), (102, 24, 59), (102, 21, 51), (102, 20, 46), + (105, 19, 35), (111, 23, 23), (121, 37, 20), (124, 54, 20), + (125, 70, 15), (143, 82, 12), (164, 103, 12), (176, 119, 22), + (217, 120, 27), (224, 119, 34), (231, 118, 42), (229, 100, 52), + (229, 86, 51), (237, 75, 54), (227, 52, 66), (209, 38, 72), + (202, 39, 65), (194, 43, 64), (177, 52, 66), (161, 73, 72), + (148, 82, 78), (136, 77, 69), (134, 74, 71), (124, 71, 85), + (119, 57, 74), (117, 51, 58), (111, 57, 47), (111, 58, 29), + (103, 58, 24), (106, 56, 22), (114, 53, 23), (112, 62, 38), + (127, 70, 49), (150, 80, 51), (146, 98, 53), (143, 106, 56), + (146, 98, 42), (126, 84, 27), (103, 69, 25), (79, 46, 23), + (50, 27, 20), (38, 18, 24), (35, 13, 37), (33, 12, 50), + (41, 11, 52), (57, 17, 55), (82, 24, 60), (106, 31, 59), + (130, 43, 54), (153, 55, 53), (170, 62, 61), (192, 60, 70), + (197, 61, 81), (190, 69, 92), (192, 75, 92), (187, 75, 110), + (186, 75, 140), (177, 95, 141), (159, 100, 142), (154, 99, 165), + (138, 104, 164), (105, 85, 146), (79, 77, 134), (73, 82, 112), + (69, 69, 86), (57, 50, 63), (57, 52, 50), (59, 55, 52), + (52, 42, 54), (39, 32, 62), (30, 28, 79), (31, 23, 86), + (35, 16, 86), (44, 13, 79), (66, 23, 65), (87, 31, 57), + (117, 43, 42), (155, 65, 28), (151, 77, 26), (142, 89, 19) + ), + +// 612 Pastel_Lime +((29, 138, 35), (49, 165, 65), (56, 176, 79), (64, 188, 94), + (71, 197, 110), (78, 206, 126), (83, 210, 134), (88, 214, 143), + (113, 230, 174), (116, 228, 178), (120, 226, 182), (122, 218, 188), + (125, 210, 195), (131, 208, 197), (138, 206, 199), (141, 206, 197), + (144, 207, 196), (143, 203, 180), (141, 200, 180), (139, 197, 181), + (142, 202, 182), (145, 208, 183), (146, 211, 183), (148, 215, 184), + (136, 234, 181), (122, 236, 183), (109, 238, 185), (101, 234, 182), + (93, 231, 180), (89, 228, 177), (86, 225, 175), (82, 221, 173), + (77, 216, 175), (74, 216, 180), (86, 212, 179), (98, 209, 179), + (115, 204, 178), (133, 200, 178), (140, 196, 177), (148, 193, 177), + (181, 194, 176), (191, 195, 177), (202, 197, 178), (202, 199, 177), + (203, 202, 176), (202, 202, 175), (201, 203, 174), (202, 206, 169), + (201, 209, 162), (196, 207, 168), (188, 209, 177), (181, 212, 186), + (180, 217, 187), (180, 223, 189), (180, 225, 190), (181, 228, 191), + (190, 216, 199), (186, 205, 210), (182, 195, 221), (174, 191, 221), + (166, 188, 222), (160, 189, 219), (154, 190, 217), (154, 193, 214), + (149, 192, 218), (138, 191, 234), (129, 191, 234), (121, 192, 235), + (119, 195, 231), (117, 199, 228), (115, 204, 220), (110, 205, 211), + (99, 206, 203), (96, 200, 202), (93, 195, 202), (105, 187, 198), + (118, 180, 195), (124, 171, 192), (131, 162, 189), (141, 148, 183), + (152, 138, 178), (167, 109, 157), (182, 101, 146), (197, 94, 136), + (204, 92, 130), (211, 91, 125), (217, 94, 114), (216, 96, 105), + (195, 91, 89), (181, 90, 88), (168, 90, 88), (169, 97, 90), + (170, 105, 93), (164, 116, 94), (159, 133, 100), (161, 149, 110), + (161, 157, 119), (167, 173, 140), (174, 179, 141), (181, 186, 143), + (188, 193, 144), (195, 201, 145), (208, 213, 147), (205, 209, 146), + (209, 201, 140), (202, 192, 129), (196, 183, 118), (193, 181, 112), + (190, 180, 107), (180, 176, 97), (172, 166, 89), (161, 158, 79), + (144, 146, 67), (119, 131, 42), (114, 128, 37), (109, 126, 32), + (98, 124, 26), (93, 122, 24), (93, 114, 23), (97, 112, 25), + (120, 81, 23), (129, 77, 23), (139, 73, 23), (141, 72, 22), + (144, 71, 22), (148, 80, 27), (153, 83, 36), (158, 75, 42), + (161, 73, 55), (154, 76, 74), (146, 79, 77), (138, 82, 81), + (119, 94, 90), (104, 88, 92), (82, 86, 96), (72, 87, 95), + (62, 101, 91), (64, 110, 89), (66, 120, 88), (68, 124, 88), + (70, 128, 88), (70, 136, 86), (71, 150, 81), (73, 164, 77), + (76, 175, 72), (91, 186, 77), (94, 187, 80), (98, 189, 83), + (103, 194, 90), (107, 201, 98), (107, 204, 105), (102, 206, 114), + (97, 207, 125), (99, 206, 126), (101, 205, 128), (103, 202, 132), + (103, 199, 133), (102, 195, 140), (95, 192, 151), (79, 186, 161), + (69, 177, 157), (53, 156, 144), (52, 151, 140), (51, 146, 136), + (50, 144, 129), (43, 144, 142), (37, 150, 149), (35, 160, 159), + (42, 174, 170), (47, 179, 169), (53, 184, 168), (64, 194, 175), + (72, 202, 183), (75, 209, 194), (79, 215, 203), (81, 220, 216), + (87, 219, 225), (98, 216, 230), (112, 213, 230), (121, 206, 229), + (125, 203, 224), (128, 202, 220), (128, 200, 216), (132, 197, 213), + (156, 192, 202), (161, 189, 199), (166, 186, 197), (172, 185, 189), + (172, 186, 178), (168, 185, 162), (166, 188, 152), (164, 188, 144), + (159, 188, 146), (149, 193, 152), (138, 196, 162), (119, 194, 158), + (101, 196, 156), (87, 195, 142), (78, 194, 133), (73, 200, 125), + (73, 206, 126), (72, 202, 119), (75, 198, 115), (82, 195, 99), + (91, 184, 91), (106, 176, 86), (126, 175, 87), (144, 167, 92), + (158, 158, 103), (170, 157, 105), (174, 156, 111), (172, 158, 122), + (165, 168, 135), (164, 174, 153), (155, 178, 175), (144, 184, 193), + (132, 189, 201), (116, 199, 205), (94, 211, 204), (83, 221, 204), + (76, 229, 206), (72, 236, 208), (71, 238, 212), (72, 238, 213), + (71, 237, 211), (76, 234, 209), (88, 228, 208), (106, 221, 210), + (127, 208, 206), (143, 188, 196), (151, 175, 183), (153, 162, 172), + (154, 147, 161), (148, 142, 155), (149, 139, 148), (149, 127, 132), + (140, 126, 114), (123, 126, 96), (108, 122, 82), (85, 125, 73), + (71, 135, 75), (63, 136, 76), (56, 136, 69), (52, 139, 62), + (50, 135, 58), (43, 128, 54), (39, 124, 56), (40, 121, 58), + (35, 114, 56), (37, 112, 52), (39, 108, 45), (40, 104, 36), + (38, 104, 30), (38, 108, 24), (32, 114, 22), (27, 124, 26) + ), + +// 613 Peace +((59, 68, 101), (52, 53, 77), (38, 44, 65), (25, 35, 53), + (24, 35, 53), (24, 36, 54), (24, 36, 54), (24, 36, 55), + (26, 38, 58), (26, 39, 61), (26, 41, 65), (26, 42, 68), + (26, 43, 71), (27, 44, 73), (28, 46, 75), (28, 47, 76), + (29, 48, 78), (36, 54, 87), (45, 59, 92), (54, 64, 98), + (72, 71, 105), (91, 78, 113), (103, 84, 118), (116, 91, 124), + (143, 110, 147), (143, 112, 152), (144, 114, 158), (150, 118, 160), + (156, 123, 163), (160, 125, 164), (164, 127, 165), (171, 129, 167), + (170, 127, 166), (156, 118, 152), (151, 111, 145), (146, 104, 138), + (145, 99, 129), (144, 95, 121), (136, 90, 115), (128, 86, 109), + (82, 64, 88), (64, 56, 80), (47, 48, 72), (38, 44, 66), + (30, 40, 61), (28, 39, 60), (26, 39, 59), (25, 39, 59), + (24, 39, 60), (22, 39, 63), (22, 39, 63), (22, 40, 64), + (23, 39, 63), (24, 39, 62), (24, 39, 61), (24, 39, 61), + (24, 39, 61), (25, 39, 62), (26, 40, 63), (27, 42, 64), + (29, 44, 66), (30, 45, 68), (31, 46, 70), (33, 49, 75), + (37, 51, 81), (47, 58, 90), (54, 61, 95), (61, 65, 101), + (66, 67, 104), (72, 70, 107), (80, 74, 112), (86, 76, 116), + (85, 78, 120), (86, 80, 121), (87, 83, 123), (83, 84, 125), + (80, 86, 127), (76, 84, 127), (72, 82, 127), (65, 81, 123), + (61, 78, 120), (57, 78, 120), (61, 79, 121), (65, 80, 122), + (69, 80, 122), (74, 80, 122), (81, 80, 121), (87, 80, 121), + (94, 83, 123), (106, 85, 124), (119, 88, 125), (128, 90, 128), + (138, 93, 131), (156, 107, 141), (168, 117, 152), (180, 128, 160), + (190, 137, 167), (223, 155, 181), (234, 163, 190), (245, 172, 199), + (244, 173, 202), (244, 174, 205), (234, 176, 210), (219, 170, 207), + (186, 147, 190), (169, 137, 183), (153, 128, 176), (142, 124, 173), + (132, 121, 171), (111, 112, 163), (88, 101, 152), (75, 88, 137), + (63, 79, 125), (48, 69, 108), (44, 66, 105), (41, 64, 102), + (36, 60, 96), (33, 56, 91), (32, 53, 85), (31, 51, 80), + (29, 47, 74), (28, 46, 72), (28, 45, 71), (29, 45, 70), + (30, 45, 70), (31, 46, 70), (31, 46, 69), (30, 45, 68), + (29, 44, 68), (30, 46, 70), (30, 46, 71), (31, 47, 73), + (31, 48, 74), (32, 49, 77), (32, 50, 79), (32, 52, 82), + (35, 54, 86), (36, 56, 89), (38, 58, 92), (39, 59, 94), + (40, 61, 96), (43, 65, 103), (46, 69, 109), (48, 74, 116), + (50, 79, 122), (57, 92, 138), (59, 96, 144), (62, 101, 150), + (72, 115, 163), (88, 123, 174), (111, 131, 179), (130, 134, 180), + (138, 130, 172), (136, 127, 169), (134, 124, 166), (134, 119, 158), + (137, 112, 147), (129, 96, 128), (115, 83, 109), (91, 69, 92), + (69, 57, 77), (38, 41, 55), (34, 38, 50), (31, 35, 46), + (25, 30, 39), (22, 27, 36), (23, 27, 35), (22, 27, 35), + (22, 28, 37), (21, 28, 39), (21, 29, 41), (22, 31, 46), + (23, 34, 50), (25, 38, 56), (29, 42, 62), (33, 47, 69), + (41, 54, 81), (54, 62, 91), (76, 73, 105), (103, 92, 122), + (128, 116, 140), (151, 141, 163), (155, 155, 178), (157, 158, 186), + (153, 155, 184), (154, 156, 182), (155, 157, 181), (136, 151, 175), + (111, 137, 163), (84, 114, 146), (56, 90, 126), (44, 73, 109), + (37, 61, 95), (34, 54, 86), (32, 51, 80), (31, 49, 77), + (33, 50, 77), (37, 52, 77), (40, 53, 76), (42, 54, 76), + (42, 54, 76), (41, 53, 77), (42, 54, 78), (40, 54, 79), + (40, 54, 79), (39, 54, 80), (36, 53, 82), (35, 54, 85), + (35, 55, 88), (34, 55, 89), (34, 55, 90), (34, 55, 89), + (36, 55, 87), (37, 55, 84), (36, 53, 80), (35, 50, 75), + (34, 47, 70), (34, 46, 68), (34, 45, 66), (34, 45, 67), + (35, 47, 71), (35, 51, 76), (37, 56, 85), (40, 62, 94), + (43, 67, 103), (44, 71, 109), (46, 74, 113), (47, 75, 116), + (49, 76, 116), (50, 75, 114), (49, 72, 108), (46, 67, 98), + (42, 59, 89), (39, 54, 81), (37, 49, 74), (34, 45, 68), + (32, 42, 62), (29, 39, 57), (27, 37, 55), (25, 37, 56), + (24, 37, 57), (24, 38, 59), (25, 39, 61), (26, 41, 63), + (27, 43, 67), (28, 46, 72), (30, 50, 78), (33, 55, 86), + (36, 61, 96), (40, 67, 104), (57, 75, 114), (67, 80, 121), + (65, 77, 115), (63, 74, 112), (47, 69, 105), (52, 65, 99) + ), + +// 614 Persia +((236, 146, 111), (235, 132, 107), (225, 129, 101), (215, 127, 95), + (200, 122, 89), (185, 117, 84), (179, 113, 84), (174, 109, 84), + (157, 108, 88), (146, 110, 89), (135, 113, 91), (123, 109, 91), + (112, 105, 91), (107, 101, 87), (102, 97, 84), (102, 95, 81), + (103, 94, 78), (100, 82, 59), (104, 71, 49), (109, 60, 39), + (116, 51, 30), (124, 43, 22), (124, 41, 20), (125, 39, 19), + (140, 40, 29), (157, 42, 36), (174, 45, 44), (172, 46, 48), + (170, 48, 53), (162, 49, 55), (155, 51, 57), (146, 59, 63), + (141, 67, 70), (130, 66, 65), (111, 65, 57), (93, 65, 49), + (74, 65, 44), (56, 66, 39), (48, 62, 36), (41, 58, 33), + (34, 50, 22), (40, 46, 19), (47, 43, 17), (56, 35, 15), + (66, 28, 13), (71, 25, 13), (77, 23, 13), (85, 22, 18), + (95, 20, 21), (106, 19, 24), (102, 20, 24), (98, 21, 25), + (87, 25, 27), (76, 29, 29), (73, 34, 32), (70, 39, 35), + (79, 80, 63), (91, 96, 78), (103, 112, 93), (122, 126, 101), + (141, 140, 110), (151, 149, 115), (161, 159, 121), (180, 171, 134), + (197, 179, 143), (210, 173, 140), (203, 165, 134), (196, 157, 129), + (189, 148, 124), (183, 140, 120), (173, 117, 108), (159, 103, 96), + (131, 84, 72), (116, 72, 62), (102, 60, 53), (96, 55, 51), + (90, 50, 49), (91, 54, 51), (93, 58, 53), (96, 69, 58), + (96, 79, 64), (99, 96, 90), (107, 102, 99), (115, 109, 109), + (118, 111, 110), (122, 114, 112), (130, 121, 112), (139, 126, 113), + (159, 137, 116), (165, 142, 119), (171, 148, 122), (172, 150, 123), + (173, 153, 124), (172, 153, 122), (169, 150, 121), (163, 145, 119), + (152, 138, 118), (127, 123, 111), (117, 112, 103), (107, 101, 96), + (104, 97, 93), (101, 93, 91), (101, 91, 92), (103, 95, 97), + (116, 112, 114), (129, 120, 117), (143, 128, 120), (151, 131, 122), + (160, 135, 124), (175, 144, 126), (188, 149, 130), (193, 156, 128), + (192, 158, 123), (167, 143, 105), (158, 136, 100), (150, 130, 96), + (134, 117, 85), (122, 106, 78), (105, 96, 68), (85, 84, 64), + (53, 58, 52), (54, 50, 47), (55, 43, 43), (58, 42, 43), + (61, 42, 43), (67, 46, 48), (77, 54, 54), (89, 67, 61), + (107, 78, 66), (136, 85, 71), (141, 84, 69), (146, 84, 67), + (151, 86, 65), (158, 90, 59), (161, 80, 54), (154, 75, 51), + (118, 52, 37), (98, 46, 33), (79, 40, 29), (70, 39, 30), + (62, 38, 32), (49, 36, 37), (32, 37, 42), (21, 41, 45), + (14, 41, 48), (13, 44, 47), (15, 43, 46), (18, 42, 45), + (27, 45, 41), (37, 46, 38), (46, 48, 39), (52, 51, 40), + (62, 55, 46), (63, 55, 45), (65, 56, 44), (67, 54, 43), + (65, 53, 44), (56, 50, 46), (47, 48, 51), (38, 45, 50), + (28, 37, 42), (20, 20, 25), (22, 19, 24), (24, 19, 23), + (35, 23, 29), (47, 31, 37), (61, 42, 46), (74, 54, 53), + (103, 95, 80), (110, 105, 89), (118, 115, 98), (134, 135, 119), + (146, 145, 130), (151, 157, 141), (154, 164, 146), (156, 167, 146), + (156, 167, 145), (156, 155, 132), (155, 140, 114), (153, 125, 95), + (153, 107, 79), (153, 90, 63), (150, 75, 49), (137, 59, 33), + (104, 36, 12), (98, 31, 11), (92, 26, 10), (84, 19, 13), + (71, 14, 17), (51, 10, 20), (34, 10, 24), (17, 11, 27), + (10, 13, 28), (9, 19, 29), (10, 22, 28), (18, 27, 25), + (32, 31, 23), (51, 38, 23), (73, 50, 24), (93, 61, 30), + (105, 73, 34), (116, 81, 40), (121, 86, 47), (125, 89, 53), + (132, 99, 64), (131, 112, 76), (133, 120, 89), (134, 129, 103), + (134, 131, 112), (141, 134, 116), (147, 137, 119), (158, 132, 117), + (171, 125, 112), (181, 113, 105), (191, 100, 95), (192, 90, 88), + (183, 75, 77), (167, 60, 66), (143, 40, 51), (120, 26, 36), + (100, 17, 29), (79, 13, 26), (62, 17, 27), (42, 17, 27), + (27, 15, 23), (18, 13, 20), (21, 10, 18), (31, 14, 17), + (45, 15, 16), (63, 21, 15), (84, 26, 20), (107, 32, 27), + (130, 42, 36), (149, 50, 40), (161, 60, 38), (173, 67, 38), + (179, 67, 39), (186, 66, 43), (185, 64, 46), (175, 64, 46), + (165, 69, 40), (151, 71, 39), (147, 71, 44), (150, 75, 51), + (157, 80, 63), (166, 92, 71), (175, 107, 80), (183, 122, 91), + (192, 136, 103), (205, 146, 114), (219, 151, 119), (232, 154, 120), + (241, 156, 120), (243, 155, 120), (242, 156, 118), (238, 154, 115) + ), + +// 615 Persia_2 +((236, 205, 111), (235, 193, 107), (225, 188, 101), (215, 183, 95), + (200, 174, 89), (185, 165, 84), (179, 158, 84), (174, 152, 84), + (157, 140, 88), (146, 137, 89), (135, 134, 91), (122, 123, 91), + (109, 112, 91), (104, 107, 87), (99, 102, 84), (99, 102, 81), + (100, 103, 78), (99, 100, 59), (104, 96, 49), (109, 93, 39), + (116, 91, 30), (124, 90, 22), (124, 89, 20), (125, 88, 19), + (140, 92, 29), (157, 98, 36), (174, 105, 44), (172, 103, 46), + (170, 101, 48), (162, 97, 49), (155, 94, 51), (146, 95, 59), + (141, 99, 67), (130, 96, 65), (111, 91, 57), (93, 86, 49), + (68, 76, 44), (43, 66, 39), (38, 62, 37), (33, 58, 36), + (22, 50, 23), (29, 48, 20), (37, 47, 17), (51, 49, 15), + (66, 52, 13), (71, 52, 13), (77, 52, 13), (85, 53, 18), + (95, 53, 20), (106, 55, 19), (102, 54, 20), (98, 53, 21), + (87, 52, 25), (76, 51, 29), (73, 53, 32), (70, 55, 35), + (71, 80, 63), (82, 96, 78), (94, 112, 93), (111, 126, 101), + (128, 141, 110), (136, 151, 115), (144, 161, 121), (168, 180, 134), + (190, 197, 143), (210, 206, 140), (203, 197, 134), (196, 188, 129), + (189, 179, 124), (183, 170, 120), (173, 147, 108), (159, 133, 96), + (131, 111, 72), (116, 97, 62), (102, 83, 53), (96, 76, 51), + (90, 69, 49), (91, 72, 51), (93, 76, 53), (96, 86, 58), + (96, 94, 64), (98, 99, 90), (106, 105, 99), (115, 112, 109), + (118, 115, 110), (122, 119, 112), (130, 129, 112), (139, 138, 113), + (159, 157, 116), (165, 164, 119), (171, 171, 122), (170, 172, 123), + (170, 173, 124), (168, 172, 122), (166, 169, 121), (161, 163, 119), + (150, 152, 118), (124, 127, 111), (115, 116, 103), (107, 106, 96), + (104, 102, 93), (101, 98, 91), (101, 95, 91), (103, 97, 95), + (116, 112, 112), (129, 125, 116), (143, 139, 120), (151, 145, 122), + (160, 152, 124), (175, 167, 126), (188, 177, 130), (193, 187, 128), + (192, 190, 123), (162, 167, 105), (153, 158, 100), (145, 150, 96), + (128, 134, 85), (118, 122, 78), (97, 105, 68), (76, 85, 64), + (52, 58, 54), (53, 53, 48), (55, 48, 43), (58, 49, 42), + (61, 50, 42), (67, 53, 46), (77, 64, 54), (89, 80, 61), + (107, 97, 66), (136, 115, 71), (141, 118, 69), (146, 121, 67), + (151, 127, 65), (158, 137, 59), (161, 131, 54), (154, 123, 51), + (118, 90, 37), (98, 76, 33), (79, 63, 29), (70, 57, 30), + (62, 52, 32), (49, 41, 36), (32, 32, 42), (21, 29, 45), + (14, 25, 48), (13, 28, 47), (15, 28, 46), (18, 29, 45), + (27, 40, 45), (37, 46, 42), (42, 48, 39), (47, 52, 40), + (61, 62, 46), (62, 63, 45), (64, 65, 44), (67, 65, 43), + (65, 63, 44), (56, 54, 46), (48, 47, 51), (38, 39, 50), + (28, 30, 42), (22, 20, 25), (23, 19, 22), (24, 19, 20), + (35, 23, 23), (47, 32, 31), (61, 46, 42), (74, 64, 53), + (100, 103, 80), (106, 110, 89), (112, 118, 98), (126, 135, 119), + (140, 146, 130), (143, 157, 141), (146, 164, 146), (146, 167, 146), + (146, 167, 145), (146, 156, 132), (151, 155, 114), (153, 152, 95), + (153, 142, 79), (153, 132, 63), (150, 121, 49), (137, 107, 33), + (104, 79, 12), (98, 71, 11), (92, 64, 10), (84, 52, 13), + (71, 37, 14), (51, 18, 10), (34, 10, 12), (24, 11, 27), + (15, 10, 28), (9, 9, 29), (10, 13, 28), (18, 24, 27), + (28, 32, 23), (51, 51, 23), (73, 73, 24), (93, 91, 30), + (104, 105, 34), (116, 116, 40), (121, 121, 47), (125, 123, 53), + (132, 131, 64), (125, 131, 76), (126, 133, 89), (125, 134, 103), + (127, 134, 112), (136, 141, 116), (144, 147, 119), (158, 151, 117), + (171, 152, 112), (181, 148, 105), (191, 145, 95), (192, 138, 88), + (183, 124, 75), (167, 104, 60), (143, 78, 40), (120, 60, 26), + (100, 43, 17), (79, 30, 13), (62, 28, 17), (42, 18, 17), + (27, 15, 17), (20, 13, 18), (21, 10, 12), (31, 18, 14), + (45, 28, 15), (63, 43, 15), (84, 56, 20), (107, 69, 27), + (130, 86, 36), (149, 102, 40), (161, 118, 38), (173, 130, 38), + (179, 132, 39), (186, 134, 43), (185, 129, 46), (175, 123, 46), + (165, 127, 40), (151, 123, 39), (147, 120, 44), (150, 122, 51), + (157, 124, 63), (166, 136, 71), (175, 151, 80), (183, 165, 91), + (192, 177, 103), (205, 189, 114), (219, 198, 119), (232, 206, 120), + (241, 213, 120), (243, 213, 120), (242, 213, 118), (238, 212, 115) + ), + +// 616 Persia_3 +((175, 149, 236), (165, 145, 235), (159, 137, 225), (154, 129, 215), + (146, 121, 200), (138, 114, 185), (134, 113, 179), (130, 112, 174), + (126, 113, 157), (125, 113, 146), (124, 113, 135), (117, 111, 123), + (111, 109, 112), (106, 104, 107), (101, 100, 102), (100, 97, 102), + (100, 94, 103), (89, 75, 100), (81, 65, 104), (73, 56, 109), + (66, 49, 116), (59, 42, 124), (57, 40, 124), (56, 39, 125), + (62, 51, 140), (67, 61, 157), (73, 72, 174), (74, 74, 172), + (75, 77, 170), (75, 77, 162), (76, 78, 155), (82, 84, 146), + (89, 90, 141), (87, 86, 130), (81, 75, 111), (75, 64, 93), + (70, 56, 76), (66, 49, 59), (62, 45, 52), (58, 42, 46), + (50, 30, 38), (47, 27, 42), (44, 24, 47), (40, 23, 56), + (36, 23, 66), (34, 24, 71), (33, 25, 77), (35, 31, 85), + (35, 35, 95), (36, 37, 106), (36, 37, 102), (36, 38, 98), + (38, 39, 87), (41, 41, 76), (45, 43, 73), (49, 46, 70), + (80, 76, 79), (96, 93, 95), (112, 111, 111), (126, 122, 126), + (141, 133, 141), (151, 140, 151), (161, 147, 161), (177, 163, 180), + (190, 175, 197), (192, 174, 210), (184, 167, 203), (176, 160, 196), + (168, 154, 189), (161, 149, 183), (141, 136, 173), (126, 121, 159), + (101, 93, 131), (87, 81, 116), (74, 69, 102), (69, 66, 96), + (64, 63, 90), (67, 65, 91), (71, 68, 93), (80, 73, 96), + (87, 79, 96), (99, 99, 99), (107, 107, 107), (115, 115, 115), + (118, 118, 118), (122, 122, 122), (130, 130, 130), (137, 135, 139), + (151, 141, 159), (156, 145, 165), (161, 149, 171), (163, 150, 172), + (165, 152, 173), (164, 150, 172), (161, 148, 169), (156, 145, 163), + (148, 142, 152), (127, 127, 127), (117, 117, 117), (107, 107, 107), + (104, 104, 104), (101, 101, 101), (101, 101, 101), (103, 103, 103), + (116, 116, 116), (129, 129, 129), (143, 143, 143), (148, 146, 151), + (153, 150, 160), (162, 154, 175), (170, 160, 188), (174, 159, 193), + (174, 154, 192), (154, 132, 167), (146, 126, 158), (139, 120, 150), + (125, 106, 134), (114, 97, 122), (100, 85, 105), (84, 77, 85), + (58, 58, 58), (55, 55, 56), (52, 52, 55), (51, 51, 58), + (51, 51, 61), (56, 57, 67), (66, 66, 77), (78, 75, 89), + (91, 83, 107), (103, 93, 136), (103, 91, 141), (103, 90, 146), + (106, 89, 151), (109, 84, 158), (101, 80, 161), (95, 75, 154), + (68, 56, 118), (59, 48, 98), (50, 41, 79), (48, 41, 70), + (46, 42, 62), (44, 44, 49), (40, 42, 38), (41, 45, 28), + (41, 48, 21), (44, 47, 20), (43, 46, 22), (42, 45, 25), + (45, 42, 34), (46, 44, 44), (48, 46, 47), (51, 48, 52), + (59, 56, 62), (59, 55, 63), (60, 54, 65), (60, 53, 67), + (59, 54, 65), (55, 55, 56), (51, 51, 51), (48, 50, 46), + (39, 42, 34), (24, 25, 24), (23, 24, 24), (22, 23, 24), + (28, 31, 35), (38, 41, 47), (51, 53, 61), (65, 65, 74), + (101, 96, 103), (109, 106, 110), (118, 117, 118), (135, 135, 135), + (146, 146, 146), (157, 157, 157), (164, 164, 164), (167, 167, 167), + (167, 167, 167), (156, 156, 156), (150, 139, 155), (137, 119, 153), + (124, 103, 153), (108, 87, 153), (93, 73, 150), (76, 55, 137), + (50, 28, 104), (44, 26, 98), (38, 24, 92), (32, 26, 84), + (25, 26, 71), (18, 25, 51), (15, 25, 34), (15, 27, 19), + (16, 28, 14), (20, 29, 13), (22, 28, 14), (27, 26, 22), + (31, 28, 32), (41, 31, 51), (56, 35, 73), (69, 45, 93), + (81, 50, 105), (90, 58, 116), (97, 66, 121), (100, 73, 125), + (110, 85, 132), (120, 97, 131), (127, 110, 133), (132, 124, 134), + (134, 133, 134), (140, 139, 141), (146, 143, 147), (148, 142, 158), + (147, 139, 171), (140, 134, 181), (130, 126, 191), (121, 119, 192), + (104, 104, 183), (87, 89, 167), (63, 69, 143), (45, 50, 120), + (33, 42, 100), (25, 35, 79), (27, 34, 62), (23, 30, 42), + (19, 23, 27), (16, 20, 18), (13, 18, 21), (19, 20, 31), + (22, 22, 45), (29, 25, 63), (39, 33, 84), (49, 44, 107), + (63, 57, 130), (73, 64, 149), (83, 64, 161), (90, 65, 173), + (91, 67, 179), (93, 73, 186), (92, 75, 185), (89, 74, 175), + (91, 66, 165), (89, 63, 151), (90, 67, 147), (95, 75, 150), + (102, 88, 157), (113, 97, 166), (128, 108, 175), (142, 120, 183), + (156, 134, 192), (168, 147, 205), (176, 154, 219), (181, 157, 232), + (185, 159, 241), (184, 159, 243), (184, 157, 242), (182, 153, 238) + ), + +// 617 Pink +((182, 60, 110), (175, 52, 105), (171, 49, 103), (167, 47, 101), + (165, 46, 99), (163, 46, 98), (162, 46, 97), (162, 46, 96), + (155, 43, 92), (151, 40, 91), (148, 37, 91), (145, 36, 92), + (143, 35, 94), (145, 36, 96), (147, 38, 98), (150, 39, 100), + (154, 41, 102), (170, 47, 106), (176, 49, 106), (182, 51, 107), + (185, 52, 106), (188, 54, 106), (188, 54, 105), (188, 55, 104), + (181, 47, 97), (174, 43, 94), (167, 39, 92), (160, 36, 92), + (154, 33, 92), (151, 32, 92), (149, 31, 93), (145, 30, 94), + (142, 30, 94), (141, 29, 94), (142, 30, 94), (144, 31, 95), + (145, 31, 94), (146, 31, 93), (147, 30, 91), (148, 30, 90), + (151, 30, 85), (152, 31, 83), (154, 33, 81), (159, 35, 81), + (164, 38, 82), (168, 40, 84), (173, 43, 86), (182, 51, 90), + (190, 60, 97), (209, 81, 109), (220, 91, 118), (231, 102, 128), + (237, 112, 140), (243, 122, 152), (245, 126, 157), (247, 130, 163), + (239, 130, 170), (230, 121, 166), (222, 113, 162), (213, 105, 157), + (204, 98, 153), (199, 93, 150), (194, 89, 148), (184, 77, 140), + (173, 65, 129), (159, 55, 117), (157, 53, 117), (156, 52, 117), + (157, 52, 118), (158, 52, 120), (160, 52, 122), (162, 54, 124), + (173, 61, 125), (180, 65, 127), (188, 70, 129), (193, 73, 134), + (198, 76, 139), (201, 78, 141), (204, 81, 143), (208, 89, 150), + (214, 94, 153), (215, 96, 162), (217, 97, 162), (219, 99, 163), + (221, 102, 163), (224, 105, 164), (229, 113, 163), (231, 124, 168), + (239, 153, 180), (244, 165, 184), (249, 177, 189), (250, 178, 189), + (251, 180, 189), (254, 180, 190), (252, 176, 188), (247, 171, 189), + (241, 162, 180), (227, 128, 151), (221, 109, 136), (215, 90, 121), + (211, 83, 115), (208, 77, 110), (199, 69, 102), (191, 62, 95), + (185, 59, 91), (184, 57, 94), (183, 56, 98), (179, 54, 99), + (176, 52, 100), (171, 49, 102), (165, 49, 104), (163, 50, 105), + (161, 51, 108), (159, 49, 114), (159, 49, 115), (159, 49, 116), + (163, 51, 114), (166, 54, 112), (169, 56, 108), (171, 56, 106), + (173, 54, 107), (170, 52, 105), (168, 50, 103), (165, 48, 100), + (162, 46, 98), (155, 40, 95), (148, 36, 95), (141, 31, 97), + (138, 29, 96), (138, 27, 92), (140, 27, 91), (142, 28, 91), + (148, 31, 92), (157, 36, 92), (167, 45, 92), (176, 54, 93), + (190, 61, 94), (190, 59, 92), (191, 58, 91), (189, 58, 90), + (187, 58, 89), (182, 55, 88), (173, 53, 86), (162, 47, 86), + (155, 41, 85), (141, 33, 83), (138, 32, 82), (135, 31, 81), + (131, 29, 83), (129, 30, 86), (128, 32, 88), (126, 31, 90), + (116, 22, 83), (115, 20, 83), (114, 19, 83), (115, 16, 82), + (119, 18, 85), (114, 17, 80), (115, 15, 76), (119, 15, 74), + (128, 15, 74), (145, 21, 82), (147, 23, 82), (149, 25, 83), + (153, 26, 84), (156, 28, 85), (159, 31, 88), (161, 32, 91), + (166, 38, 95), (167, 38, 95), (169, 39, 95), (172, 44, 95), + (174, 47, 98), (174, 52, 100), (176, 56, 102), (177, 58, 100), + (176, 62, 101), (178, 63, 103), (175, 65, 108), (172, 64, 112), + (171, 62, 111), (168, 63, 110), (171, 63, 111), (177, 65, 113), + (191, 67, 120), (195, 68, 120), (199, 70, 121), (204, 72, 123), + (205, 74, 123), (205, 74, 126), (200, 72, 126), (197, 69, 125), + (193, 64, 124), (185, 60, 119), (177, 54, 116), (166, 49, 111), + (160, 42, 106), (158, 37, 102), (158, 34, 96), (158, 32, 90), + (159, 33, 84), (161, 34, 81), (163, 35, 80), (168, 37, 81), + (170, 38, 82), (171, 38, 81), (170, 41, 82), (167, 43, 83), + (167, 46, 87), (167, 47, 92), (167, 47, 95), (165, 50, 98), + (159, 51, 100), (154, 50, 102), (148, 47, 103), (144, 41, 101), + (140, 37, 98), (134, 35, 95), (129, 31, 94), (124, 27, 93), + (121, 22, 89), (123, 18, 85), (125, 17, 81), (128, 17, 78), + (132, 18, 80), (138, 21, 81), (146, 23, 81), (153, 27, 81), + (160, 30, 82), (165, 33, 85), (168, 37, 88), (171, 40, 92), + (173, 44, 98), (175, 49, 105), (177, 54, 113), (181, 60, 120), + (185, 65, 126), (187, 69, 133), (189, 74, 140), (188, 77, 142), + (190, 80, 142), (191, 78, 139), (192, 74, 135), (191, 71, 132), + (188, 67, 127), (187, 66, 122), (188, 65, 115), (190, 63, 110), + (194, 64, 108), (196, 64, 107), (198, 65, 109), (200, 67, 109), + (198, 65, 109), (194, 63, 109), (190, 63, 109), (185, 60, 110) + ), + +// 618 Pollen +((115, 114, 55), (143, 139, 47), (166, 158, 48), (189, 177, 49), + (198, 189, 46), (207, 202, 44), (209, 203, 42), (211, 204, 40), + (216, 200, 47), (205, 191, 43), (194, 182, 39), (173, 160, 38), + (153, 138, 37), (126, 112, 37), (99, 87, 37), (87, 77, 32), + (75, 67, 28), (40, 33, 9), (35, 30, 6), (30, 28, 4), + (37, 35, 10), (45, 43, 17), (52, 49, 22), (59, 55, 27), + (98, 92, 51), (118, 111, 67), (139, 130, 83), (156, 148, 104), + (174, 167, 125), (183, 176, 136), (193, 185, 148), (211, 201, 165), + (219, 210, 171), (217, 210, 159), (215, 204, 148), (214, 199, 137), + (198, 184, 118), (183, 169, 99), (170, 157, 86), (157, 146, 74), + (129, 105, 29), (129, 85, 17), (130, 65, 6), (122, 54, 8), + (115, 44, 10), (107, 41, 9), (100, 38, 9), (101, 32, 10), + (104, 26, 7), (102, 27, 11), (92, 34, 14), (82, 42, 18), + (78, 50, 20), (75, 58, 23), (77, 63, 25), (79, 68, 28), + (96, 91, 42), (111, 96, 48), (126, 101, 55), (142, 103, 57), + (159, 106, 59), (161, 108, 56), (163, 111, 53), (154, 115, 50), + (141, 108, 41), (140, 91, 33), (135, 96, 28), (130, 101, 23), + (121, 102, 22), (113, 104, 21), (104, 97, 19), (96, 89, 20), + (86, 79, 17), (78, 71, 17), (70, 63, 18), (60, 51, 17), + (51, 40, 16), (47, 36, 13), (43, 33, 11), (33, 28, 10), + (30, 27, 12), (38, 40, 22), (49, 51, 29), (61, 63, 37), + (68, 69, 41), (76, 76, 46), (90, 93, 56), (103, 107, 64), + (119, 121, 64), (125, 117, 57), (131, 113, 51), (137, 108, 50), + (144, 104, 50), (147, 97, 47), (142, 93, 41), (130, 90, 33), + (119, 84, 25), (119, 68, 28), (109, 65, 28), (100, 63, 29), + (91, 64, 29), (83, 65, 29), (70, 68, 29), (65, 70, 36), + (65, 66, 39), (66, 66, 43), (67, 66, 47), (67, 68, 51), + (68, 71, 55), (73, 79, 61), (81, 86, 67), (93, 94, 75), + (101, 101, 80), (111, 113, 84), (112, 115, 83), (113, 117, 83), + (118, 121, 81), (124, 128, 83), (131, 135, 89), (139, 142, 93), + (148, 151, 98), (153, 153, 101), (158, 155, 104), (161, 155, 107), + (165, 156, 111), (170, 159, 118), (176, 164, 124), (178, 171, 132), + (181, 174, 135), (176, 166, 136), (173, 163, 134), (171, 160, 132), + (164, 159, 130), (158, 160, 129), (150, 154, 124), (145, 151, 119), + (142, 147, 105), (145, 150, 104), (149, 154, 103), (152, 158, 102), + (155, 162, 101), (163, 170, 104), (179, 184, 105), (194, 197, 104), + (206, 202, 107), (209, 205, 113), (209, 206, 114), (209, 207, 116), + (208, 209, 111), (205, 203, 103), (197, 194, 100), (185, 180, 96), + (156, 149, 89), (150, 141, 82), (145, 134, 76), (131, 119, 64), + (118, 104, 53), (101, 88, 45), (84, 69, 35), (69, 50, 25), + (56, 36, 17), (32, 19, 4), (26, 16, 3), (20, 13, 2), + (11, 6, 1), (6, 3, 2), (5, 3, 4), (11, 9, 9), + (27, 28, 24), (30, 33, 27), (34, 38, 31), (42, 48, 35), + (53, 60, 40), (68, 72, 44), (83, 84, 54), (90, 93, 63), + (97, 98, 70), (98, 102, 73), (102, 106, 71), (108, 109, 69), + (107, 112, 70), (111, 112, 72), (114, 113, 78), (121, 120, 87), + (145, 147, 105), (151, 153, 110), (157, 160, 115), (171, 173, 128), + (186, 184, 140), (197, 196, 148), (208, 206, 157), (209, 208, 159), + (208, 209, 165), (204, 205, 166), (196, 199, 157), (187, 190, 149), + (177, 176, 133), (163, 163, 125), (149, 147, 120), (134, 132, 107), + (118, 120, 96), (108, 110, 77), (97, 100, 64), (87, 88, 55), + (77, 77, 46), (67, 68, 37), (60, 64, 27), (55, 62, 22), + (53, 60, 23), (48, 56, 26), (47, 51, 27), (44, 46, 28), + (42, 45, 27), (42, 45, 27), (39, 44, 30), (40, 46, 32), + (43, 43, 33), (45, 43, 31), (48, 45, 30), (49, 46, 30), + (48, 50, 31), (50, 49, 31), (51, 47, 30), (49, 46, 29), + (46, 42, 28), (38, 42, 25), (34, 41, 22), (35, 41, 19), + (37, 43, 18), (44, 45, 21), (51, 53, 24), (58, 62, 29), + (69, 73, 31), (80, 86, 37), (93, 96, 42), (103, 105, 45), + (107, 109, 45), (106, 107, 41), (100, 100, 39), (89, 90, 37), + (76, 78, 33), (64, 67, 27), (56, 57, 21), (51, 48, 20), + (48, 42, 21), (46, 38, 25), (44, 38, 29), (48, 41, 32), + (55, 49, 35), (63, 56, 37), (70, 64, 40), (75, 69, 40), + (90, 82, 46), (102, 95, 54), (113, 105, 59), (119, 116, 64) + ), + +// 619 Poppies +((174, 44, 42), (206, 26, 41), (178, 23, 48), (151, 21, 55), + (143, 18, 42), (136, 16, 30), (139, 24, 32), (143, 33, 35), + (107, 54, 29), (75, 57, 25), (44, 61, 21), (40, 53, 14), + (36, 45, 8), (60, 47, 5), (84, 49, 3), (100, 50, 8), + (116, 51, 13), (116, 97, 51), (95, 123, 86), (75, 149, 121), + (85, 151, 145), (96, 154, 169), (100, 162, 167), (104, 171, 165), + (175, 112, 143), (190, 83, 116), (205, 55, 90), (205, 48, 69), + (206, 42, 48), (194, 38, 44), (182, 35, 41), (164, 49, 43), + (151, 56, 41), (157, 57, 62), (166, 57, 63), (175, 58, 65), + (168, 74, 51), (161, 91, 38), (162, 105, 38), (163, 120, 39), + (146, 152, 79), (148, 157, 110), (151, 163, 141), (153, 164, 151), + (156, 166, 162), (157, 158, 154), (159, 151, 147), (150, 149, 139), + (138, 131, 124), (94, 119, 94), (67, 108, 74), (40, 97, 54), + (45, 95, 44), (51, 94, 34), (67, 103, 33), (83, 113, 32), + (182, 140, 40), (211, 125, 57), (241, 111, 75), (242, 100, 69), + (244, 89, 63), (241, 103, 57), (239, 118, 52), (219, 122, 23), + (194, 169, 17), (169, 151, 31), (179, 127, 40), (190, 104, 49), + (193, 109, 58), (196, 114, 67), (182, 129, 81), (178, 161, 123), + (145, 175, 125), (121, 170, 98), (97, 165, 72), (71, 160, 53), + (45, 156, 35), (37, 143, 32), (30, 130, 29), (27, 120, 19), + (25, 98, 22), (45, 86, 4), (64, 86, 11), (84, 86, 19), + (96, 81, 16), (109, 77, 14), (147, 65, 25), (175, 44, 21), + (224, 17, 10), (235, 23, 13), (246, 29, 17), (242, 31, 17), + (238, 34, 17), (225, 69, 37), (212, 73, 23), (190, 80, 22), + (172, 83, 8), (124, 92, 25), (95, 98, 42), (67, 105, 59), + (47, 109, 58), (28, 114, 57), (28, 129, 48), (12, 143, 41), + (14, 156, 25), (43, 148, 47), (73, 141, 70), (105, 135, 82), + (138, 130, 94), (179, 104, 120), (213, 105, 127), (225, 112, 137), + (224, 151, 152), (194, 174, 173), (195, 152, 175), (197, 130, 177), + (184, 136, 170), (185, 99, 161), (208, 89, 146), (194, 62, 127), + (192, 47, 84), (184, 46, 79), (177, 46, 74), (174, 52, 70), + (171, 59, 66), (148, 62, 77), (128, 53, 81), (116, 67, 89), + (120, 67, 108), (155, 56, 134), (171, 52, 131), (188, 49, 129), + (202, 37, 140), (222, 36, 154), (232, 41, 165), (243, 43, 167), + (245, 66, 138), (247, 70, 140), (250, 74, 143), (242, 75, 146), + (235, 77, 150), (238, 81, 173), (224, 64, 178), (216, 77, 168), + (217, 65, 161), (195, 42, 130), (188, 36, 124), (181, 31, 118), + (174, 34, 111), (170, 52, 118), (176, 71, 99), (181, 71, 112), + (220, 56, 105), (227, 44, 99), (235, 33, 94), (244, 26, 84), + (235, 9, 59), (221, 34, 42), (209, 41, 48), (188, 87, 42), + (176, 92, 71), (114, 103, 105), (101, 107, 116), (88, 112, 127), + (47, 127, 122), (45, 155, 105), (24, 162, 83), (28, 174, 47), + (43, 166, 23), (51, 168, 26), (59, 171, 29), (88, 161, 15), + (97, 168, 45), (127, 163, 28), (137, 163, 70), (169, 167, 68), + (181, 171, 85), (190, 169, 90), (201, 171, 102), (191, 164, 111), + (191, 156, 130), (185, 143, 123), (200, 140, 142), (201, 122, 131), + (234, 117, 142), (235, 114, 145), (236, 111, 149), (247, 98, 130), + (248, 90, 138), (247, 74, 116), (242, 63, 122), (236, 63, 115), + (239, 49, 124), (226, 34, 126), (219, 23, 125), (223, 17, 107), + (214, 26, 87), (225, 42, 75), (214, 66, 72), (189, 102, 85), + (149, 117, 91), (104, 134, 113), (83, 153, 103), (54, 158, 98), + (68, 173, 79), (63, 182, 61), (67, 169, 67), (54, 165, 69), + (30, 143, 76), (27, 153, 98), (22, 152, 100), (43, 158, 122), + (84, 160, 134), (100, 151, 138), (146, 136, 140), (146, 142, 136), + (167, 140, 132), (167, 145, 123), (188, 159, 118), (211, 152, 120), + (225, 151, 117), (248, 138, 121), (247, 107, 97), (252, 88, 82), + (246, 70, 58), (241, 52, 41), (235, 48, 45), (231, 38, 53), + (232, 24, 84), (236, 32, 105), (231, 38, 134), (237, 54, 137), + (226, 58, 142), (233, 52, 140), (212, 40, 159), (217, 18, 168), + (208, 12, 169), (213, 15, 162), (226, 25, 150), (232, 47, 135), + (233, 62, 130), (193, 77, 117), (154, 73, 90), (90, 71, 66), + (46, 61, 57), (22, 49, 44), (10, 59, 58), (27, 71, 60), + (50, 92, 67), (75, 107, 81), (107, 100, 94), (118, 90, 93), + (117, 49, 95), (122, 47, 78), (108, 35, 67), (78, 44, 58) + ), + +// 620 Produce_Department +((153, 25, 65), (184, 50, 53), (193, 61, 57), (202, 73, 62), + (201, 89, 83), (201, 106, 105), (199, 114, 105), (198, 123, 105), + (192, 136, 85), (183, 142, 98), (175, 149, 111), (154, 148, 112), + (133, 148, 114), (113, 135, 99), (93, 123, 85), (86, 118, 84), + (80, 114, 83), (41, 95, 78), (26, 80, 76), (12, 65, 75), + (14, 51, 63), (17, 38, 52), (21, 32, 45), (26, 27, 38), + (48, 13, 18), (64, 10, 17), (81, 8, 16), (92, 7, 15), + (103, 7, 14), (106, 8, 12), (110, 10, 11), (116, 12, 11), + (123, 14, 14), (118, 13, 25), (110, 13, 29), (103, 13, 34), + (103, 15, 31), (103, 17, 28), (103, 17, 27), (104, 18, 26), + (111, 16, 30), (118, 16, 27), (126, 17, 24), (130, 26, 20), + (134, 35, 17), (133, 39, 19), (133, 43, 21), (128, 52, 31), + (123, 58, 43), (104, 63, 56), (94, 66, 61), (84, 70, 67), + (81, 72, 76), (78, 74, 85), (77, 74, 88), (76, 75, 91), + (66, 71, 98), (63, 70, 109), (60, 70, 120), (63, 72, 124), + (66, 75, 129), (65, 79, 127), (65, 83, 125), (66, 84, 118), + (70, 87, 112), (86, 89, 98), (85, 96, 92), (84, 103, 86), + (84, 107, 82), (84, 111, 79), (84, 123, 68), (86, 123, 59), + (60, 126, 63), (45, 128, 62), (31, 131, 62), (28, 126, 54), + (25, 121, 47), (26, 118, 46), (28, 115, 45), (26, 115, 41), + (26, 119, 41), (24, 125, 43), (29, 129, 55), (34, 133, 67), + (37, 133, 77), (40, 134, 88), (46, 141, 112), (52, 145, 121), + (52, 154, 118), (51, 138, 121), (51, 123, 125), (56, 115, 125), + (62, 107, 126), (68, 104, 122), (74, 103, 106), (75, 103, 89), + (78, 95, 90), (92, 106, 127), (94, 109, 138), (97, 112, 150), + (96, 109, 152), (95, 106, 155), (85, 105, 167), (78, 112, 182), + (75, 107, 192), (73, 86, 175), (71, 66, 158), (71, 59, 146), + (71, 52, 135), (80, 42, 119), (93, 45, 99), (110, 52, 78), + (125, 57, 64), (137, 68, 46), (138, 75, 48), (139, 83, 50), + (143, 104, 50), (145, 126, 66), (157, 142, 86), (158, 156, 110), + (145, 179, 147), (134, 187, 159), (124, 196, 171), (124, 193, 179), + (124, 190, 188), (116, 181, 199), (113, 168, 201), (99, 154, 194), + (86, 141, 180), (74, 99, 164), (72, 89, 157), (71, 79, 150), + (68, 62, 136), (62, 53, 113), (69, 52, 94), (71, 52, 74), + (77, 55, 42), (81, 54, 31), (86, 54, 21), (91, 54, 17), + (97, 54, 13), (112, 55, 11), (125, 55, 9), (134, 51, 11), + (146, 40, 13), (162, 16, 14), (161, 14, 15), (161, 13, 16), + (155, 15, 19), (150, 19, 25), (144, 21, 26), (140, 16, 32), + (121, 16, 44), (115, 18, 47), (110, 21, 51), (98, 31, 55), + (90, 41, 61), (85, 57, 68), (83, 73, 65), (82, 84, 60), + (82, 87, 58), (88, 85, 61), (91, 87, 58), (95, 89, 56), + (97, 94, 43), (99, 92, 37), (99, 83, 33), (100, 67, 40), + (101, 44, 45), (99, 45, 45), (98, 47, 46), (91, 52, 49), + (86, 51, 56), (90, 44, 61), (93, 36, 63), (100, 35, 59), + (109, 45, 58), (116, 50, 58), (123, 45, 57), (129, 38, 57), + (129, 29, 55), (126, 33, 55), (127, 40, 58), (121, 42, 63), + (114, 35, 78), (110, 36, 82), (106, 37, 87), (105, 37, 97), + (100, 38, 103), (100, 39, 106), (97, 34, 108), (89, 37, 106), + (87, 35, 106), (80, 33, 101), (73, 33, 92), (67, 26, 82), + (52, 22, 72), (44, 19, 66), (35, 18, 62), (31, 26, 59), + (34, 37, 59), (34, 46, 61), (31, 52, 68), (28, 56, 76), + (26, 64, 81), (29, 78, 85), (36, 94, 87), (37, 101, 89), + (35, 102, 86), (35, 92, 78), (35, 82, 65), (40, 78, 52), + (43, 75, 42), (42, 76, 33), (42, 69, 25), (43, 55, 20), + (40, 41, 16), (36, 34, 18), (32, 36, 28), (29, 43, 35), + (30, 48, 45), (29, 50, 56), (24, 51, 63), (22, 48, 79), + (23, 48, 89), (33, 49, 96), (46, 56, 103), (44, 59, 92), + (39, 54, 83), (31, 47, 74), (26, 38, 63), (36, 39, 60), + (38, 38, 46), (34, 36, 34), (26, 35, 25), (13, 31, 19), + (9, 35, 20), (11, 42, 16), (14, 46, 17), (15, 52, 19), + (13, 59, 29), (10, 67, 39), (9, 75, 39), (9, 79, 38), + (11, 81, 33), (9, 84, 37), (7, 85, 47), (14, 82, 55), + (20, 79, 63), (32, 68, 65), (45, 58, 64), (57, 50, 67), + (78, 42, 65), (98, 37, 65), (121, 26, 66), (141, 21, 61) + ), + +// 621 Purple +((65, 56, 83), (69, 65, 87), (70, 68, 86), (71, 71, 86), + (73, 76, 86), (76, 82, 87), (72, 77, 84), (69, 73, 81), + (64, 71, 76), (67, 73, 79), (70, 75, 83), (80, 80, 86), + (90, 86, 90), (97, 87, 96), (104, 88, 103), (106, 87, 106), + (109, 87, 109), (113, 82, 119), (112, 79, 119), (112, 76, 119), + (110, 68, 118), (109, 60, 118), (107, 54, 118), (106, 48, 118), + (101, 32, 116), (97, 29, 117), (93, 27, 119), (86, 22, 118), + (80, 18, 118), (75, 17, 119), (71, 16, 120), (65, 14, 122), + (64, 10, 126), (66, 12, 134), (72, 12, 137), (78, 12, 140), + (82, 16, 142), (87, 21, 145), (90, 23, 145), (94, 26, 146), + (106, 48, 145), (116, 57, 149), (127, 66, 154), (131, 65, 155), + (136, 64, 156), (138, 60, 155), (140, 57, 154), (135, 51, 148), + (135, 47, 139), (123, 48, 129), (114, 44, 126), (105, 41, 123), + (95, 30, 116), (86, 19, 110), (78, 12, 101), (71, 6, 93), + (52, 0, 71), (46, 0, 65), (40, 0, 60), (39, 0, 59), + (38, 0, 59), (37, 0, 55), (36, 0, 52), (36, 0, 50), + (35, 0, 51), (37, 0, 57), (38, 0, 63), (40, 0, 69), + (41, 0, 70), (42, 0, 72), (42, 0, 75), (41, 3, 79), + (44, 6, 88), (50, 6, 95), (57, 6, 102), (63, 11, 108), + (70, 16, 114), (71, 20, 115), (72, 24, 117), (74, 26, 119), + (73, 31, 120), (78, 36, 120), (85, 37, 120), (92, 38, 120), + (95, 39, 119), (98, 41, 119), (103, 42, 116), (102, 46, 114), + (96, 43, 105), (94, 35, 100), (92, 28, 95), (91, 25, 91), + (90, 22, 88), (91, 17, 83), (91, 16, 76), (90, 17, 70), + (87, 19, 65), (83, 26, 58), (82, 31, 54), (81, 36, 51), + (80, 37, 49), (80, 39, 48), (78, 43, 44), (73, 49, 43), + (70, 56, 37), (70, 58, 36), (71, 60, 36), (71, 61, 38), + (72, 63, 40), (71, 64, 46), (62, 66, 52), (56, 62, 62), + (50, 53, 64), (46, 35, 65), (47, 32, 66), (49, 30, 68), + (56, 27, 72), (62, 25, 81), (70, 26, 100), (80, 22, 113), + (100, 17, 135), (109, 17, 140), (118, 18, 146), (121, 17, 146), + (125, 16, 147), (137, 19, 152), (145, 20, 158), (154, 16, 164), + (166, 16, 173), (170, 10, 181), (167, 8, 178), (164, 6, 175), + (159, 5, 164), (148, 4, 152), (138, 0, 140), (130, 0, 130), + (119, 0, 119), (115, 0, 116), (112, 0, 114), (110, 0, 111), + (108, 0, 108), (103, 0, 101), (100, 0, 96), (100, 0, 93), + (98, 3, 92), (101, 19, 91), (103, 23, 92), (106, 28, 93), + (109, 38, 95), (114, 47, 102), (117, 53, 104), (118, 58, 108), + (115, 64, 109), (115, 65, 108), (115, 66, 107), (114, 72, 107), + (118, 73, 107), (123, 71, 109), (126, 68, 112), (125, 62, 116), + (120, 54, 116), (109, 35, 112), (106, 31, 110), (103, 28, 109), + (101, 20, 109), (101, 14, 108), (101, 8, 110), (100, 8, 109), + (94, 12, 105), (90, 14, 104), (87, 17, 103), (80, 21, 101), + (76, 27, 97), (74, 31, 100), (75, 36, 100), (74, 42, 101), + (72, 49, 104), (73, 54, 105), (71, 57, 104), (69, 58, 102), + (69, 58, 101), (70, 54, 100), (71, 49, 97), (69, 44, 96), + (66, 32, 94), (64, 28, 92), (63, 25, 91), (60, 20, 86), + (59, 17, 81), (59, 14, 78), (62, 10, 74), (66, 9, 71), + (70, 9, 70), (71, 9, 69), (71, 14, 66), (72, 19, 65), + (71, 27, 68), (70, 35, 69), (71, 42, 68), (74, 49, 70), + (75, 51, 76), (76, 57, 80), (78, 64, 85), (81, 70, 91), + (82, 78, 96), (83, 86, 100), (87, 96, 103), (91, 103, 114), + (92, 107, 118), (94, 118, 122), (98, 125, 125), (107, 126, 135), + (117, 137, 144), (127, 141, 147), (137, 146, 157), (142, 139, 163), + (145, 137, 166), (144, 132, 161), (142, 118, 161), (141, 110, 156), + (139, 100, 149), (139, 91, 147), (132, 79, 145), (128, 66, 141), + (117, 58, 134), (104, 44, 123), (94, 35, 109), (84, 31, 96), + (78, 28, 85), (69, 27, 73), (64, 25, 60), (58, 26, 50), + (51, 27, 41), (47, 31, 38), (43, 34, 35), (43, 38, 32), + (41, 43, 30), (43, 44, 29), (44, 46, 29), (48, 46, 30), + (49, 43, 31), (48, 40, 36), (50, 37, 38), (50, 36, 46), + (51, 34, 52), (51, 35, 58), (53, 38, 62), (56, 43, 65), + (58, 48, 68), (58, 47, 70), (69, 59, 80), (76, 64, 88), + (80, 65, 91), (79, 66, 92), (79, 66, 93), (79, 69, 93) + ), + +// 622 Queen_Anne +((128, 126, 186), (127, 126, 170), (127, 121, 154), (128, 117, 139), + (119, 109, 117), (111, 102, 96), (105, 97, 86), (100, 92, 77), + (74, 73, 39), (62, 66, 24), (51, 59, 9), (44, 54, 7), + (37, 50, 5), (32, 47, 6), (28, 44, 8), (27, 42, 8), + (27, 40, 8), (24, 34, 10), (22, 30, 13), (20, 27, 17), + (22, 27, 22), (25, 27, 28), (29, 29, 28), (33, 32, 29), + (36, 37, 40), (43, 40, 54), (50, 44, 68), (55, 50, 78), + (61, 57, 89), (61, 57, 91), (61, 58, 94), (62, 59, 99), + (59, 57, 97), (54, 57, 81), (54, 57, 69), (54, 58, 58), + (60, 59, 55), (66, 61, 53), (71, 65, 59), (76, 69, 66), + (95, 93, 94), (99, 95, 101), (104, 97, 108), (96, 96, 101), + (89, 95, 95), (85, 94, 91), (81, 93, 87), (70, 84, 74), + (57, 69, 56), (40, 53, 32), (36, 49, 29), (33, 46, 27), + (31, 42, 28), (29, 39, 29), (31, 40, 30), (34, 41, 32), + (38, 41, 47), (42, 45, 50), (47, 50, 54), (51, 55, 64), + (56, 60, 74), (61, 64, 78), (67, 68, 82), (77, 78, 86), + (79, 86, 88), (83, 92, 89), (83, 92, 85), (83, 93, 81), + (81, 93, 74), (79, 93, 67), (79, 93, 65), (79, 91, 68), + (80, 86, 84), (89, 91, 97), (98, 96, 111), (105, 101, 131), + (113, 106, 151), (117, 107, 159), (122, 109, 167), (132, 117, 177), + (135, 124, 185), (148, 136, 204), (157, 144, 207), (167, 153, 210), + (166, 155, 212), (166, 157, 214), (169, 158, 221), (172, 156, 220), + (171, 155, 215), (169, 154, 212), (167, 154, 209), (164, 153, 201), + (162, 153, 194), (166, 151, 178), (171, 154, 167), (175, 156, 172), + (167, 157, 173), (152, 139, 156), (144, 133, 156), (136, 127, 156), + (132, 122, 158), (129, 118, 161), (124, 111, 156), (123, 109, 147), + (133, 128, 140), (134, 125, 130), (135, 123, 120), (129, 120, 113), + (123, 118, 107), (107, 114, 100), (98, 105, 87), (82, 88, 68), + (65, 71, 46), (35, 47, 27), (32, 45, 25), (30, 43, 24), + (28, 40, 21), (25, 37, 18), (23, 34, 16), (22, 31, 17), + (20, 31, 12), (26, 34, 17), (33, 38, 23), (39, 39, 27), + (46, 41, 32), (51, 46, 39), (45, 47, 28), (50, 54, 37), + (60, 58, 46), (58, 59, 58), (56, 60, 63), (55, 61, 68), + (60, 65, 80), (62, 68, 85), (63, 67, 86), (65, 68, 86), + (69, 71, 80), (62, 66, 65), (56, 61, 50), (52, 58, 42), + (48, 55, 35), (40, 50, 23), (34, 44, 17), (28, 40, 15), + (25, 37, 14), (21, 35, 12), (21, 36, 11), (21, 37, 11), + (22, 38, 11), (22, 38, 12), (22, 38, 11), (24, 39, 13), + (27, 42, 15), (26, 42, 15), (26, 43, 15), (25, 41, 16), + (26, 40, 17), (25, 37, 17), (23, 37, 17), (19, 34, 16), + (17, 32, 13), (18, 31, 8), (18, 32, 7), (18, 34, 6), + (20, 36, 6), (23, 40, 7), (27, 44, 11), (31, 51, 12), + (37, 52, 18), (36, 51, 19), (35, 51, 21), (33, 50, 21), + (31, 48, 21), (29, 42, 19), (24, 37, 16), (19, 33, 13), + (15, 29, 10), (12, 22, 9), (11, 18, 8), (12, 19, 11), + (17, 23, 13), (24, 26, 18), (31, 29, 23), (38, 39, 33), + (59, 64, 53), (62, 66, 55), (66, 68, 58), (67, 74, 56), + (67, 78, 56), (66, 81, 56), (64, 77, 56), (57, 72, 48), + (53, 67, 40), (49, 64, 34), (49, 61, 32), (49, 60, 33), + (52, 61, 37), (60, 65, 48), (70, 75, 64), (85, 89, 85), + (102, 106, 107), (123, 125, 136), (137, 136, 164), (143, 142, 186), + (144, 143, 198), (150, 149, 206), (148, 145, 202), (134, 132, 185), + (111, 113, 157), (94, 98, 126), (81, 89, 95), (74, 87, 71), + (71, 87, 51), (81, 93, 37), (96, 102, 29), (108, 108, 32), + (106, 110, 43), (106, 108, 57), (111, 111, 68), (115, 105, 81), + (101, 94, 92), (83, 79, 94), (64, 69, 88), (54, 60, 82), + (44, 51, 78), (43, 49, 70), (40, 47, 58), (39, 47, 46), + (35, 45, 42), (38, 48, 46), (44, 51, 58), (51, 58, 73), + (58, 62, 88), (65, 70, 101), (76, 75, 118), (87, 89, 140), + (101, 99, 158), (109, 106, 166), (115, 108, 167), (114, 112, 164), + (115, 114, 161), (111, 110, 153), (108, 101, 145), (100, 95, 132), + (95, 94, 129), (91, 92, 129), (93, 92, 137), (97, 91, 144), + (108, 98, 159), (117, 105, 176), (124, 116, 191), (124, 119, 200), + (126, 119, 206), (128, 118, 206), (132, 122, 201), (132, 126, 193) + ), + +// 623 Quiet +((89, 51, 90), (95, 51, 100), (96, 52, 108), (98, 54, 116), + (86, 49, 116), (75, 44, 116), (67, 43, 116), (60, 43, 117), + (44, 49, 121), (41, 48, 121), (39, 48, 121), (40, 48, 124), + (42, 49, 127), (45, 45, 124), (49, 41, 122), (51, 38, 121), + (53, 36, 120), (53, 32, 118), (51, 30, 109), (49, 28, 101), + (43, 24, 86), (37, 21, 71), (32, 18, 63), (28, 16, 56), + (18, 10, 29), (11, 6, 18), (5, 3, 7), (5, 3, 7), + (6, 3, 7), (10, 4, 11), (14, 6, 16), (22, 12, 29), + (25, 15, 41), (48, 29, 76), (53, 45, 92), (58, 61, 108), + (58, 64, 111), (59, 68, 115), (62, 67, 116), (66, 66, 117), + (75, 78, 118), (86, 70, 112), (98, 62, 106), (108, 58, 102), + (119, 54, 99), (122, 54, 99), (125, 55, 99), (128, 55, 96), + (129, 51, 94), (118, 47, 82), (112, 43, 79), (106, 40, 76), + (102, 38, 77), (98, 37, 78), (94, 35, 78), (91, 34, 79), + (77, 32, 86), (71, 32, 91), (66, 32, 96), (63, 32, 98), + (61, 32, 100), (61, 32, 100), (61, 32, 101), (62, 32, 100), + (64, 32, 97), (69, 32, 90), (66, 31, 88), (63, 30, 86), + (60, 29, 86), (58, 29, 87), (54, 28, 89), (53, 28, 88), + (51, 28, 88), (53, 28, 86), (56, 29, 85), (63, 29, 78), + (71, 30, 71), (73, 30, 69), (76, 31, 67), (81, 31, 64), + (84, 31, 63), (84, 33, 71), (79, 33, 79), (74, 33, 87), + (71, 32, 90), (69, 32, 94), (62, 31, 100), (54, 29, 102), + (46, 26, 91), (44, 24, 81), (43, 22, 72), (40, 21, 65), + (38, 21, 58), (30, 16, 43), (22, 13, 30), (21, 9, 24), + (17, 9, 17), (11, 7, 19), (16, 8, 25), (22, 10, 32), + (26, 12, 38), (30, 15, 45), (39, 19, 57), (50, 24, 69), + (63, 29, 83), (65, 30, 86), (68, 31, 89), (68, 31, 89), + (68, 32, 89), (69, 32, 90), (68, 32, 90), (68, 32, 90), + (69, 33, 90), (72, 33, 95), (72, 33, 98), (73, 33, 101), + (71, 35, 107), (68, 35, 111), (67, 33, 118), (67, 32, 123), + (60, 34, 125), (63, 33, 121), (67, 33, 117), (70, 33, 114), + (73, 34, 111), (81, 37, 106), (91, 39, 99), (102, 45, 94), + (107, 47, 89), (104, 49, 80), (102, 49, 79), (100, 49, 78), + (93, 43, 75), (80, 42, 73), (69, 37, 68), (59, 32, 65), + (50, 23, 62), (50, 23, 62), (50, 23, 63), (50, 23, 64), + (51, 23, 65), (53, 24, 67), (52, 24, 66), (52, 24, 64), + (50, 23, 63), (47, 21, 58), (43, 20, 53), (40, 20, 49), + (31, 16, 37), (23, 12, 27), (19, 9, 23), (16, 8, 17), + (18, 9, 15), (22, 10, 17), (26, 11, 20), (36, 13, 25), + (52, 19, 34), (66, 24, 48), (79, 29, 60), (86, 31, 68), + (91, 34, 75), (83, 44, 93), (79, 47, 96), (75, 51, 100), + (67, 56, 105), (58, 56, 105), (53, 55, 107), (51, 57, 106), + (53, 54, 101), (54, 49, 99), (56, 45, 97), (61, 38, 89), + (68, 33, 83), (73, 31, 78), (77, 33, 74), (78, 35, 71), + (79, 36, 72), (79, 34, 76), (81, 36, 78), (82, 38, 79), + (80, 40, 83), (76, 37, 89), (73, 35, 94), (73, 33, 93), + (68, 31, 88), (66, 30, 85), (64, 29, 83), (59, 27, 77), + (55, 25, 71), (51, 23, 65), (46, 21, 60), (43, 20, 55), + (41, 19, 52), (41, 18, 52), (43, 20, 55), (46, 22, 61), + (48, 24, 69), (48, 24, 76), (49, 25, 83), (50, 25, 85), + (52, 27, 86), (51, 27, 85), (49, 26, 83), (48, 25, 79), + (50, 26, 76), (54, 26, 74), (58, 27, 74), (58, 28, 75), + (61, 29, 79), (65, 31, 85), (69, 32, 90), (70, 33, 93), + (71, 33, 97), (69, 34, 102), (67, 33, 107), (62, 32, 109), + (62, 32, 112), (59, 32, 114), (60, 34, 115), (59, 33, 114), + (60, 33, 110), (61, 32, 107), (65, 34, 104), (69, 34, 100), + (72, 35, 96), (73, 34, 95), (73, 33, 95), (74, 33, 95), + (77, 34, 95), (85, 39, 97), (98, 46, 98), (112, 55, 99), + (129, 58, 95), (149, 68, 95), (165, 73, 95), (172, 83, 102), + (173, 81, 98), (179, 85, 95), (177, 80, 89), (166, 75, 94), + (144, 64, 96), (127, 58, 97), (114, 52, 92), (106, 46, 91), + (94, 39, 90), (85, 33, 87), (78, 30, 82), (73, 28, 77), + (65, 26, 73), (60, 25, 66), (58, 23, 60), (56, 21, 56), + (56, 24, 56), (52, 25, 56), (63, 34, 69), (71, 41, 78) + ), + +// 624 Rainbow_Sprinkles +((30, 20, 51), (12, 37, 59), (12, 65, 83), (12, 93, 107), + (25, 110, 120), (39, 127, 133), (46, 142, 144), (53, 158, 155), + (77, 135, 150), (84, 133, 151), (91, 132, 153), (95, 124, 148), + (100, 116, 144), (117, 120, 146), (135, 124, 149), (146, 128, 154), + (157, 132, 159), (159, 138, 141), (171, 144, 141), (184, 150, 141), + (190, 163, 145), (197, 176, 149), (201, 173, 146), (206, 170, 144), + (224, 178, 140), (225, 146, 118), (226, 114, 97), (211, 94, 89), + (197, 74, 82), (188, 65, 79), (179, 56, 76), (152, 59, 107), + (147, 64, 143), (72, 50, 111), (51, 46, 101), (30, 42, 92), + (63, 61, 96), (97, 81, 101), (105, 86, 98), (113, 91, 95), + (179, 56, 60), (189, 47, 57), (199, 38, 54), (208, 29, 44), + (218, 21, 34), (216, 30, 40), (214, 39, 47), (228, 48, 48), + (196, 51, 60), (184, 101, 88), (172, 109, 92), (161, 118, 96), + (177, 137, 99), (193, 157, 102), (189, 158, 102), (186, 160, 102), + (161, 139, 112), (159, 147, 118), (157, 156, 125), (171, 154, 127), + (186, 152, 130), (200, 161, 131), (214, 170, 133), (233, 174, 128), + (240, 182, 127), (243, 208, 124), (245, 209, 122), (247, 211, 120), + (241, 208, 121), (236, 206, 122), (227, 189, 127), (218, 172, 123), + (182, 137, 126), (161, 125, 120), (141, 114, 114), (134, 114, 116), + (128, 114, 119), (128, 108, 121), (128, 103, 123), (127, 103, 130), + (137, 101, 130), (150, 85, 133), (150, 92, 135), (150, 100, 138), + (148, 108, 142), (146, 116, 147), (133, 122, 141), (118, 121, 139), + (134, 146, 135), (149, 134, 124), (165, 122, 113), (169, 116, 108), + (174, 110, 104), (177, 99, 105), (170, 92, 117), (166, 89, 124), + (170, 95, 130), (179, 118, 124), (192, 127, 110), (205, 137, 97), + (209, 143, 95), (214, 150, 94), (232, 144, 76), (236, 122, 56), + (245, 104, 44), (244, 96, 45), (244, 89, 46), (239, 85, 48), + (234, 81, 51), (225, 89, 62), (215, 89, 72), (202, 75, 79), + (191, 77, 88), (164, 70, 103), (166, 63, 114), (168, 56, 125), + (170, 41, 133), (167, 34, 136), (166, 44, 166), (157, 41, 163), + (153, 49, 137), (150, 58, 135), (148, 67, 133), (151, 71, 137), + (155, 76, 142), (160, 91, 146), (158, 110, 144), (157, 124, 146), + (167, 138, 134), (197, 171, 133), (198, 168, 128), (200, 165, 123), + (197, 156, 108), (194, 149, 100), (181, 142, 101), (163, 133, 107), + (128, 137, 130), (113, 125, 142), (99, 114, 155), (94, 109, 156), + (89, 104, 158), (125, 111, 163), (154, 125, 160), (148, 128, 134), + (179, 153, 128), (231, 206, 123), (235, 209, 118), (240, 213, 114), + (244, 207, 119), (249, 202, 125), (249, 181, 117), (250, 173, 118), + (246, 194, 142), (246, 194, 144), (246, 195, 146), (248, 199, 149), + (243, 183, 139), (247, 154, 117), (249, 127, 96), (247, 95, 75), + (251, 65, 52), (245, 49, 39), (242, 45, 35), (239, 41, 31), + (235, 57, 38), (224, 74, 51), (210, 68, 52), (202, 66, 54), + (181, 52, 52), (179, 51, 59), (178, 51, 66), (184, 37, 54), + (183, 35, 49), (187, 48, 57), (194, 54, 63), (210, 69, 62), + (223, 116, 84), (222, 154, 109), (229, 183, 126), (241, 203, 131), + (238, 208, 132), (237, 210, 136), (237, 200, 143), (221, 188, 147), + (195, 158, 143), (179, 151, 143), (164, 144, 144), (138, 139, 144), + (106, 109, 124), (73, 73, 103), (68, 60, 92), (96, 48, 91), + (97, 29, 65), (103, 14, 43), (154, 18, 36), (195, 29, 31), + (211, 48, 33), (234, 82, 44), (242, 109, 61), (241, 123, 73), + (246, 135, 75), (246, 148, 82), (244, 169, 93), (237, 188, 104), + (224, 192, 102), (217, 205, 89), (213, 217, 87), (216, 218, 89), + (220, 216, 85), (228, 207, 100), (241, 189, 111), (246, 156, 91), + (241, 116, 74), (234, 85, 65), (225, 54, 57), (208, 43, 65), + (191, 41, 71), (181, 42, 79), (173, 41, 91), (172, 41, 87), + (182, 54, 88), (198, 62, 91), (206, 61, 80), (210, 77, 83), + (216, 88, 88), (205, 83, 91), (192, 83, 97), (185, 84, 96), + (181, 78, 92), (181, 72, 86), (183, 74, 79), (192, 78, 78), + (204, 93, 85), (210, 112, 95), (213, 112, 97), (212, 116, 101), + (196, 115, 104), (178, 95, 96), (153, 96, 111), (133, 97, 136), + (103, 85, 118), (104, 89, 119), (95, 79, 124), (109, 77, 118), + (119, 75, 86), (151, 69, 69), (174, 56, 56), (193, 70, 51), + (205, 91, 50), (205, 90, 48), (168, 69, 44), (126, 56, 42), + (115, 46, 31), (72, 25, 32), (41, 29, 55), (38, 26, 49) + ), + +// 625 Rainforest +((112, 86, 55), (141, 98, 52), (151, 104, 50), (162, 110, 49), + (158, 108, 59), (154, 106, 69), (148, 109, 73), (142, 112, 77), + (86, 125, 100), (67, 110, 109), (49, 95, 118), (37, 90, 107), + (25, 85, 97), (23, 85, 81), (21, 85, 66), (22, 82, 63), + (23, 80, 60), (26, 75, 33), (26, 71, 21), (27, 67, 9), + (30, 65, 8), (33, 63, 7), (33, 62, 7), (34, 62, 7), + (42, 61, 12), (57, 68, 11), (72, 75, 10), (88, 78, 9), + (104, 82, 8), (110, 84, 7), (117, 86, 7), (125, 85, 15), + (133, 86, 27), (121, 84, 50), (120, 77, 49), (120, 70, 49), + (125, 65, 55), (130, 61, 61), (125, 62, 65), (121, 63, 69), + (127, 76, 63), (128, 79, 73), (129, 82, 83), (112, 94, 94), + (96, 106, 105), (91, 114, 103), (86, 123, 102), (75, 112, 110), + (55, 110, 119), (12, 97, 121), (6, 93, 111), (1, 89, 102), + (0, 84, 96), (0, 80, 91), (1, 76, 88), (3, 73, 85), + (34, 56, 67), (54, 54, 61), (75, 52, 55), (89, 47, 51), + (104, 43, 48), (111, 39, 42), (119, 36, 36), (134, 20, 25), + (144, 15, 12), (135, 12, 1), (128, 12, 0), (121, 13, 0), + (115, 15, 0), (110, 17, 0), (93, 26, 0), (78, 32, 1), + (53, 46, 17), (45, 49, 20), (37, 53, 24), (28, 53, 23), + (19, 54, 23), (16, 52, 24), (13, 51, 26), (12, 48, 27), + (12, 44, 27), (14, 39, 15), (17, 35, 10), (21, 31, 6), + (25, 29, 4), (30, 27, 3), (41, 26, 1), (42, 25, 1), + (38, 21, 8), (39, 21, 7), (41, 21, 7), (43, 20, 6), + (45, 19, 6), (48, 19, 10), (51, 16, 20), (40, 26, 27), + (33, 40, 38), (22, 70, 63), (23, 79, 81), (24, 89, 99), + (21, 98, 107), (18, 107, 116), (10, 121, 132), (1, 136, 142), + (5, 135, 154), (8, 130, 151), (11, 125, 149), (10, 123, 146), + (10, 122, 144), (6, 117, 141), (7, 108, 135), (9, 98, 129), + (11, 91, 123), (5, 92, 118), (3, 93, 118), (1, 94, 118), + (1, 94, 118), (12, 87, 109), (25, 81, 96), (35, 79, 85), + (44, 75, 66), (53, 68, 52), (63, 61, 39), (66, 57, 33), + (70, 54, 27), (79, 41, 15), (76, 40, 11), (68, 43, 8), + (62, 39, 11), (45, 41, 29), (41, 43, 35), (37, 45, 41), + (32, 52, 46), (40, 54, 44), (47, 52, 44), (67, 51, 40), + (107, 47, 43), (132, 48, 37), (157, 50, 31), (167, 49, 26), + (177, 49, 22), (195, 43, 12), (199, 30, 10), (198, 31, 9), + (187, 30, 11), (146, 38, 16), (134, 38, 16), (122, 39, 17), + (97, 41, 18), (74, 41, 25), (53, 41, 36), (37, 42, 46), + (19, 60, 61), (18, 63, 64), (18, 66, 67), (26, 67, 67), + (34, 64, 68), (48, 63, 64), (58, 69, 57), (58, 79, 51), + (66, 83, 38), (81, 79, 17), (84, 77, 12), (88, 76, 7), + (82, 81, 4), (80, 82, 1), (78, 85, 0), (81, 80, 0), + (99, 71, 0), (103, 68, 0), (108, 65, 0), (113, 65, 4), + (117, 57, 11), (108, 58, 25), (100, 63, 39), (90, 64, 49), + (76, 70, 62), (69, 64, 69), (49, 61, 80), (29, 61, 86), + (14, 62, 87), (1, 63, 87), (0, 57, 82), (0, 52, 80), + (0, 55, 69), (0, 57, 66), (0, 60, 63), (0, 56, 58), + (0, 52, 57), (0, 48, 57), (0, 50, 58), (2, 56, 53), + (6, 51, 47), (11, 46, 40), (12, 35, 37), (10, 32, 38), + (9, 37, 32), (10, 39, 28), (19, 51, 17), (24, 54, 16), + (27, 65, 26), (25, 81, 35), (22, 90, 41), (22, 103, 45), + (21, 106, 49), (22, 108, 61), (20, 116, 79), (19, 119, 89), + (15, 120, 100), (9, 115, 108), (5, 110, 114), (0, 108, 124), + (0, 108, 125), (0, 109, 123), (2, 103, 119), (13, 95, 110), + (26, 87, 102), (38, 83, 91), (40, 85, 78), (41, 89, 67), + (52, 84, 50), (68, 75, 38), (95, 66, 27), (108, 64, 19), + (119, 75, 14), (133, 76, 8), (147, 76, 8), (167, 72, 11), + (181, 75, 15), (196, 82, 18), (207, 79, 19), (218, 73, 22), + (215, 66, 27), (205, 71, 31), (198, 73, 32), (186, 69, 27), + (181, 62, 22), (172, 48, 18), (154, 48, 16), (139, 46, 14), + (121, 43, 12), (109, 43, 8), (103, 39, 5), (95, 37, 7), + (90, 33, 12), (82, 28, 14), (76, 27, 18), (72, 31, 19), + (65, 38, 26), (59, 45, 41), (53, 50, 49), (51, 53, 61), + (61, 48, 59), (71, 51, 54), (86, 58, 54), (101, 71, 48) + ), + +// 626 Rainy_Day_in_Spring +((74, 101, 72), (82, 108, 82), (78, 97, 75), (75, 87, 68), + (75, 83, 66), (75, 80, 64), (75, 75, 63), (75, 71, 62), + (65, 46, 45), (60, 37, 36), (55, 28, 28), (50, 24, 24), + (46, 21, 20), (41, 22, 18), (36, 24, 17), (35, 27, 17), + (34, 30, 18), (29, 36, 18), (25, 39, 18), (22, 42, 19), + (20, 47, 21), (18, 52, 24), (18, 54, 25), (19, 57, 26), + (24, 63, 30), (24, 64, 31), (24, 65, 33), (26, 64, 33), + (28, 64, 34), (30, 63, 34), (32, 63, 34), (37, 61, 36), + (41, 61, 39), (49, 68, 46), (58, 76, 54), (67, 84, 63), + (76, 84, 68), (85, 84, 74), (85, 82, 74), (86, 81, 74), + (86, 83, 75), (91, 80, 76), (96, 78, 77), (96, 69, 74), + (96, 61, 71), (96, 59, 70), (96, 57, 70), (101, 55, 71), + (105, 55, 73), (102, 58, 76), (98, 61, 76), (95, 64, 77), + (85, 67, 71), (76, 70, 66), (69, 71, 63), (63, 72, 61), + (48, 77, 55), (42, 84, 53), (37, 91, 52), (33, 97, 51), + (30, 104, 51), (31, 103, 51), (33, 102, 52), (35, 101, 53), + (40, 99, 54), (42, 98, 55), (44, 89, 53), (47, 81, 51), + (50, 77, 50), (54, 73, 50), (61, 67, 53), (68, 66, 57), + (86, 68, 71), (94, 75, 80), (102, 82, 89), (109, 96, 98), + (117, 111, 108), (119, 116, 112), (121, 122, 116), (121, 134, 122), + (119, 141, 124), (106, 141, 115), (98, 129, 104), (91, 118, 94), + (85, 110, 88), (80, 103, 82), (66, 85, 67), (55, 67, 53), + (39, 38, 28), (39, 30, 26), (39, 23, 24), (43, 23, 27), + (48, 23, 31), (59, 36, 41), (76, 52, 57), (96, 70, 77), + (116, 91, 100), (158, 125, 140), (177, 138, 158), (196, 152, 177), + (202, 157, 183), (208, 162, 189), (214, 167, 197), (218, 167, 196), + (214, 156, 188), (208, 147, 181), (202, 139, 175), (200, 134, 170), + (199, 130, 165), (191, 130, 160), (188, 129, 157), (190, 127, 157), + (187, 125, 156), (181, 114, 145), (178, 112, 143), (175, 111, 141), + (172, 108, 138), (170, 106, 137), (167, 99, 132), (159, 92, 124), + (138, 77, 103), (129, 71, 94), (120, 65, 86), (115, 62, 82), + (111, 60, 79), (103, 58, 72), (97, 56, 67), (91, 51, 60), + (85, 46, 56), (72, 39, 46), (69, 40, 44), (67, 41, 43), + (62, 43, 39), (60, 44, 39), (60, 44, 39), (59, 44, 40), + (62, 46, 41), (65, 48, 44), (69, 50, 47), (72, 50, 49), + (76, 51, 51), (86, 52, 59), (96, 54, 66), (103, 57, 72), + (112, 61, 79), (134, 73, 97), (140, 77, 102), (146, 81, 107), + (155, 90, 121), (164, 100, 130), (173, 112, 142), (178, 124, 152), + (180, 142, 163), (178, 145, 163), (176, 148, 163), (173, 147, 162), + (175, 149, 165), (174, 153, 166), (173, 155, 167), (169, 167, 166), + (159, 167, 159), (161, 161, 157), (162, 155, 155), (164, 149, 154), + (165, 148, 153), (157, 143, 145), (144, 135, 132), (135, 128, 124), + (119, 93, 102), (117, 86, 98), (115, 80, 94), (110, 74, 87), + (109, 75, 86), (112, 79, 91), (119, 87, 99), (130, 99, 113), + (144, 114, 130), (160, 132, 146), (173, 151, 160), (181, 166, 172), + (184, 179, 179), (186, 189, 185), (183, 193, 186), (176, 197, 181), + (152, 190, 160), (147, 187, 156), (142, 184, 152), (134, 174, 144), + (123, 166, 134), (110, 156, 121), (96, 143, 105), (84, 131, 95), + (80, 119, 88), (77, 113, 85), (76, 107, 81), (75, 97, 74), + (75, 90, 71), (80, 83, 71), (87, 80, 75), (97, 80, 81), + (109, 77, 85), (118, 74, 88), (124, 70, 90), (125, 67, 90), + (122, 66, 88), (116, 62, 81), (107, 58, 73), (94, 54, 63), + (79, 51, 54), (67, 49, 46), (56, 49, 40), (51, 50, 37), + (51, 52, 37), (54, 56, 42), (65, 61, 51), (78, 68, 61), + (97, 77, 77), (117, 86, 94), (135, 99, 112), (156, 111, 131), + (172, 121, 145), (188, 133, 161), (204, 144, 177), (213, 157, 190), + (223, 166, 201), (229, 174, 208), (233, 180, 215), (239, 189, 223), + (238, 199, 227), (238, 206, 229), (234, 211, 226), (231, 213, 223), + (231, 216, 225), (223, 222, 222), (213, 223, 216), (196, 220, 201), + (173, 210, 181), (156, 191, 162), (138, 172, 142), (124, 151, 124), + (109, 129, 106), (89, 109, 88), (72, 87, 70), (59, 66, 54), + (51, 50, 41), (49, 38, 34), (47, 33, 30), (44, 33, 30), + (46, 35, 33), (47, 40, 35), (55, 51, 43), (59, 58, 46), + (59, 64, 49), (59, 73, 52), (58, 75, 51), (66, 90, 62) + ), + +// 627 Rainy_Forset +((118, 126, 87), (157, 130, 79), (169, 125, 69), (182, 121, 59), + (188, 119, 51), (194, 117, 43), (201, 115, 41), (209, 113, 40), + (215, 77, 32), (191, 67, 26), (168, 57, 21), (155, 56, 21), + (143, 55, 22), (133, 54, 23), (124, 53, 25), (115, 53, 25), + (106, 53, 25), (77, 52, 25), (71, 51, 25), (66, 50, 25), + (60, 46, 25), (55, 42, 25), (52, 39, 24), (50, 36, 23), + (49, 33, 19), (47, 34, 19), (46, 35, 19), (50, 40, 24), + (55, 45, 30), (58, 48, 35), (62, 52, 40), (69, 59, 57), + (74, 74, 76), (94, 94, 103), (99, 97, 106), (104, 101, 109), + (113, 111, 115), (123, 121, 121), (130, 124, 123), (137, 127, 126), + (137, 121, 118), (132, 117, 107), (128, 113, 97), (127, 103, 90), + (126, 94, 83), (122, 90, 81), (118, 86, 80), (109, 76, 76), + (94, 67, 69), (74, 43, 42), (70, 38, 33), (67, 33, 25), + (66, 30, 22), (65, 28, 19), (65, 27, 18), (66, 26, 18), + (72, 30, 18), (76, 35, 19), (80, 40, 21), (86, 45, 22), + (93, 50, 23), (96, 53, 23), (99, 56, 23), (103, 57, 25), + (103, 60, 26), (106, 62, 28), (105, 59, 26), (104, 56, 25), + (101, 54, 25), (99, 53, 25), (94, 55, 23), (90, 55, 23), + (82, 57, 23), (79, 59, 24), (76, 62, 26), (72, 64, 27), + (69, 66, 28), (68, 66, 28), (67, 67, 28), (65, 66, 28), + (63, 62, 28), (63, 52, 26), (61, 49, 27), (60, 47, 29), + (58, 48, 32), (57, 50, 36), (56, 56, 49), (62, 69, 70), + (82, 111, 133), (100, 132, 157), (118, 154, 181), (127, 158, 185), + (137, 162, 189), (137, 158, 175), (140, 158, 172), (128, 161, 189), + (138, 155, 174), (144, 114, 111), (125, 88, 82), (106, 63, 53), + (98, 56, 47), (90, 50, 42), (84, 43, 32), (84, 39, 26), + (77, 36, 19), (71, 37, 18), (65, 38, 18), (61, 38, 18), + (57, 38, 18), (52, 38, 18), (46, 33, 18), (42, 35, 19), + (36, 35, 19), (32, 35, 21), (31, 33, 21), (30, 32, 22), + (35, 32, 22), (39, 32, 23), (46, 35, 23), (52, 36, 22), + (66, 36, 22), (75, 39, 22), (84, 42, 22), (89, 45, 22), + (94, 49, 22), (104, 57, 26), (117, 59, 26), (127, 62, 26), + (134, 63, 25), (137, 70, 30), (137, 72, 31), (138, 74, 33), + (143, 79, 39), (147, 82, 43), (148, 83, 46), (144, 82, 53), + (124, 89, 65), (115, 93, 67), (107, 97, 69), (105, 96, 69), + (104, 96, 69), (96, 90, 63), (83, 83, 59), (67, 73, 55), + (52, 65, 47), (40, 55, 38), (41, 55, 38), (43, 56, 38), + (49, 63, 39), (59, 74, 40), (63, 92, 50), (74, 106, 62), + (109, 121, 76), (124, 126, 70), (140, 131, 65), (164, 150, 62), + (191, 170, 60), (216, 175, 70), (238, 175, 87), (255, 168, 90), + (255, 165, 94), (245, 164, 94), (240, 163, 100), (235, 162, 107), + (215, 147, 114), (195, 134, 118), (168, 121, 111), (130, 100, 101), + (83, 66, 76), (80, 59, 69), (77, 53, 63), (79, 45, 47), + (80, 40, 38), (84, 39, 29), (93, 42, 25), (106, 49, 26), + (121, 57, 32), (133, 72, 36), (144, 90, 39), (162, 103, 35), + (171, 114, 33), (181, 114, 33), (188, 111, 38), (192, 117, 40), + (235, 124, 36), (235, 124, 39), (235, 124, 42), (231, 114, 50), + (209, 109, 62), (207, 94, 62), (208, 92, 63), (194, 94, 72), + (177, 97, 80), (150, 106, 97), (121, 101, 101), (101, 92, 96), + (84, 80, 90), (74, 69, 77), (73, 66, 73), (69, 66, 69), + (65, 62, 63), (59, 56, 57), (55, 49, 47), (57, 46, 40), + (62, 50, 35), (66, 56, 33), (72, 62, 35), (74, 69, 38), + (79, 76, 40), (80, 83, 45), (80, 90, 45), (82, 92, 45), + (86, 92, 42), (89, 90, 42), (93, 87, 42), (90, 89, 42), + (86, 89, 42), (87, 92, 39), (86, 94, 39), (89, 96, 40), + (86, 97, 42), (80, 97, 45), (80, 99, 45), (77, 97, 45), + (79, 94, 43), (77, 89, 45), (73, 83, 47), (70, 79, 49), + (67, 74, 56), (70, 69, 56), (72, 62, 59), (73, 56, 60), + (70, 57, 60), (69, 57, 65), (67, 59, 66), (69, 57, 65), + (70, 53, 63), (72, 50, 60), (72, 52, 60), (70, 56, 60), + (70, 63, 60), (73, 69, 62), (77, 73, 60), (82, 74, 60), + (83, 76, 59), (82, 83, 59), (86, 92, 62), (90, 100, 63), + (96, 107, 69), (92, 101, 72), (89, 94, 74), (90, 93, 79), + (90, 94, 83), (101, 106, 86), (103, 111, 90), (107, 118, 89) + ), + +// 628 Red_Light +((46, 21, 37), (45, 26, 32), (42, 24, 31), (39, 22, 31), + (32, 17, 33), (26, 12, 35), (23, 11, 38), (21, 11, 41), + (18, 13, 56), (15, 11, 61), (13, 9, 67), (9, 7, 67), + (6, 5, 68), (3, 3, 66), (0, 2, 64), (0, 4, 62), + (1, 6, 60), (6, 16, 54), (7, 17, 49), (8, 18, 45), + (7, 16, 38), (6, 14, 32), (6, 14, 28), (6, 14, 25), + (6, 16, 16), (7, 17, 14), (8, 18, 12), (7, 15, 12), + (6, 12, 13), (5, 9, 13), (5, 7, 13), (2, 2, 12), + (0, 0, 11), (0, 0, 7), (0, 0, 6), (1, 0, 6), + (4, 2, 6), (7, 4, 7), (11, 6, 7), (15, 8, 8), + (40, 15, 8), (54, 16, 9), (69, 17, 11), (78, 22, 17), + (88, 28, 23), (90, 30, 28), (93, 33, 33), (93, 39, 42), + (92, 43, 49), (92, 36, 57), (88, 32, 58), (84, 29, 59), + (75, 27, 63), (67, 26, 68), (59, 27, 70), (51, 28, 73), + (24, 18, 72), (13, 11, 67), (3, 4, 62), (1, 2, 54), + (0, 0, 47), (0, 0, 44), (0, 0, 41), (0, 0, 35), + (0, 0, 30), (3, 2, 22), (6, 5, 20), (9, 9, 19), + (11, 11, 19), (13, 13, 20), (17, 16, 22), (19, 19, 25), + (25, 24, 27), (27, 26, 28), (29, 29, 29), (29, 29, 32), + (29, 30, 35), (28, 29, 37), (28, 29, 40), (25, 27, 43), + (23, 24, 45), (22, 20, 40), (24, 17, 35), (27, 15, 31), + (31, 13, 29), (36, 11, 28), (46, 7, 24), (59, 4, 22), + (93, 1, 19), (109, 7, 16), (126, 14, 13), (133, 15, 12), + (140, 16, 12), (154, 17, 16), (164, 17, 18), (173, 17, 22), + (181, 13, 21), (185, 15, 21), (178, 16, 19), (171, 17, 17), + (162, 16, 17), (154, 16, 18), (136, 16, 24), (116, 12, 26), + (83, 2, 30), (73, 4, 27), (64, 6, 25), (62, 8, 24), + (60, 10, 23), (58, 17, 23), (55, 24, 22), (53, 29, 22), + (49, 31, 24), (48, 33, 30), (49, 33, 32), (51, 34, 35), + (66, 36, 34), (84, 38, 33), (103, 40, 30), (120, 40, 26), + (149, 31, 24), (156, 25, 24), (164, 20, 25), (171, 18, 25), + (178, 17, 25), (192, 17, 24), (206, 18, 18), (218, 16, 18), + (228, 13, 16), (222, 9, 13), (217, 8, 12), (212, 7, 11), + (197, 9, 12), (182, 15, 11), (169, 22, 14), (159, 28, 17), + (139, 48, 21), (123, 46, 19), (108, 44, 17), (100, 42, 17), + (92, 41, 17), (80, 41, 16), (73, 34, 16), (79, 38, 20), + (87, 42, 20), (101, 41, 14), (105, 38, 14), (109, 35, 15), + (111, 29, 15), (105, 19, 16), (103, 12, 21), (102, 10, 26), + (98, 15, 33), (98, 17, 35), (98, 19, 38), (100, 20, 44), + (102, 25, 52), (101, 32, 55), (100, 37, 54), (100, 38, 53), + (100, 38, 49), (105, 34, 39), (110, 32, 38), (116, 30, 37), + (129, 29, 36), (140, 29, 30), (150, 28, 24), (160, 23, 18), + (159, 18, 8), (157, 17, 8), (155, 17, 8), (151, 18, 12), + (143, 20, 13), (133, 23, 15), (123, 23, 16), (112, 20, 14), + (95, 16, 15), (79, 16, 17), (66, 19, 22), (55, 23, 25), + (46, 29, 27), (39, 35, 31), (38, 38, 32), (35, 38, 31), + (30, 33, 35), (30, 33, 37), (30, 33, 39), (34, 35, 43), + (40, 39, 49), (51, 44, 54), (63, 48, 59), (71, 53, 63), + (70, 50, 67), (66, 46, 69), (61, 39, 69), (52, 33, 68), + (47, 29, 65), (47, 23, 63), (50, 23, 57), (52, 20, 54), + (53, 16, 49), (51, 11, 43), (43, 6, 37), (34, 4, 31), + (27, 0, 26), (24, 0, 19), (23, 0, 14), (23, 0, 10), + (25, 0, 7), (25, 0, 5), (26, 0, 4), (25, 0, 5), + (21, 0, 5), (16, 0, 6), (11, 0, 6), (7, 0, 6), + (3, 0, 5), (1, 0, 5), (0, 0, 5), (1, 0, 4), + (2, 0, 5), (4, 0, 5), (5, 0, 5), (5, 0, 6), + (6, 1, 6), (5, 1, 5), (5, 1, 4), (7, 0, 4), + (11, 0, 4), (18, 1, 3), (25, 0, 4), (33, 0, 4), + (41, 1, 5), (47, 1, 4), (53, 1, 4), (56, 0, 3), + (62, 1, 2), (67, 1, 3), (70, 2, 5), (74, 5, 8), + (78, 8, 11), (81, 11, 14), (79, 14, 17), (78, 16, 21), + (79, 15, 26), (72, 14, 32), (66, 14, 36), (61, 15, 41), + (59, 21, 44), (58, 26, 46), (56, 28, 46), (58, 27, 45), + (56, 25, 43), (53, 22, 41), (48, 17, 40), (47, 17, 38) + ), + +// 629 Riddle +((50, 16, 8), (51, 15, 11), (47, 14, 12), (44, 14, 14), + (39, 16, 17), (34, 19, 20), (31, 18, 22), (29, 17, 25), + (23, 15, 29), (26, 19, 26), (30, 23, 24), (42, 27, 26), + (55, 31, 29), (72, 40, 38), (89, 49, 48), (99, 56, 50), + (109, 63, 53), (146, 92, 62), (164, 110, 80), (182, 129, 98), + (184, 139, 108), (186, 149, 119), (182, 147, 118), (179, 145, 117), + (163, 132, 109), (148, 119, 107), (133, 106, 106), (126, 92, 110), + (120, 78, 115), (122, 72, 119), (125, 66, 123), (122, 52, 124), + (123, 41, 131), (122, 29, 138), (118, 28, 134), (115, 28, 130), + (109, 26, 119), (103, 25, 108), (94, 25, 99), (86, 25, 90), + (56, 25, 46), (49, 25, 37), (42, 26, 29), (51, 25, 41), + (60, 24, 53), (69, 25, 64), (78, 27, 75), (90, 35, 97), + (99, 43, 116), (103, 54, 136), (100, 56, 137), (97, 59, 139), + (86, 67, 132), (75, 75, 125), (70, 80, 120), (65, 85, 115), + (53, 111, 102), (56, 116, 100), (59, 122, 99), (66, 133, 104), + (74, 145, 110), (74, 152, 116), (75, 160, 122), (81, 169, 125), + (86, 171, 120), (81, 153, 89), (66, 145, 76), (52, 138, 63), + (49, 133, 55), (47, 128, 48), (47, 114, 34), (53, 99, 22), + (55, 68, 13), (62, 59, 14), (70, 50, 15), (82, 52, 19), + (95, 54, 24), (101, 57, 31), (107, 60, 38), (118, 63, 57), + (131, 64, 79), (152, 82, 116), (158, 103, 130), (165, 124, 144), + (166, 129, 148), (168, 135, 152), (168, 138, 161), (157, 139, 150), + (128, 139, 115), (113, 133, 97), (99, 127, 79), (91, 121, 70), + (83, 116, 62), (72, 102, 47), (62, 93, 36), (55, 84, 35), + (60, 77, 36), (75, 74, 44), (84, 83, 52), (94, 92, 61), + (101, 97, 67), (108, 102, 74), (116, 114, 85), (123, 127, 97), + (143, 146, 122), (146, 152, 132), (150, 158, 142), (147, 161, 142), + (145, 165, 143), (139, 166, 139), (136, 166, 132), (132, 164, 121), + (131, 158, 114), (136, 150, 102), (139, 148, 100), (142, 146, 99), + (141, 150, 97), (138, 153, 98), (143, 156, 103), (151, 161, 115), + (170, 159, 145), (165, 158, 148), (160, 158, 152), (155, 158, 146), + (150, 158, 141), (136, 151, 128), (124, 141, 113), (109, 129, 100), + (96, 115, 86), (66, 93, 51), (58, 91, 45), (50, 90, 40), + (33, 83, 38), (21, 77, 43), (17, 62, 44), (17, 49, 43), + (20, 40, 48), (21, 38, 55), (23, 37, 62), (25, 35, 60), + (27, 34, 59), (31, 35, 54), (37, 43, 53), (47, 57, 66), + (61, 70, 85), (86, 94, 120), (92, 100, 123), (98, 107, 127), + (107, 120, 132), (122, 131, 139), (134, 139, 145), (141, 139, 149), + (137, 132, 131), (134, 131, 123), (132, 131, 116), (129, 135, 100), + (124, 139, 89), (118, 146, 85), (111, 149, 82), (106, 148, 80), + (106, 151, 80), (103, 153, 79), (101, 153, 81), (100, 153, 83), + (91, 141, 83), (83, 123, 85), (81, 104, 88), (74, 90, 90), + (67, 86, 95), (65, 84, 96), (63, 82, 97), (64, 73, 94), + (62, 65, 93), (61, 66, 88), (62, 74, 81), (64, 84, 77), + (70, 92, 72), (73, 96, 81), (75, 101, 89), (82, 100, 103), + (91, 101, 119), (104, 97, 129), (116, 94, 146), (126, 97, 162), + (159, 98, 196), (166, 98, 203), (173, 98, 211), (183, 96, 217), + (179, 92, 220), (173, 90, 215), (166, 90, 197), (146, 82, 175), + (128, 80, 150), (105, 69, 133), (82, 60, 118), (71, 60, 102), + (50, 47, 74), (34, 38, 45), (19, 25, 25), (8, 17, 11), + (13, 18, 9), (22, 20, 8), (30, 26, 7), (34, 25, 12), + (39, 35, 19), (45, 39, 31), (56, 39, 43), (63, 40, 48), + (61, 33, 50), (57, 32, 47), (49, 32, 46), (47, 30, 52), + (43, 28, 55), (36, 22, 56), (26, 15, 52), (20, 14, 40), + (16, 13, 33), (15, 15, 29), (16, 16, 26), (15, 13, 27), + (19, 13, 26), (27, 9, 23), (38, 11, 20), (52, 17, 16), + (63, 19, 27), (71, 31, 38), (78, 46, 49), (83, 60, 58), + (88, 78, 52), (96, 90, 57), (98, 103, 66), (101, 127, 78), + (103, 144, 89), (101, 163, 89), (104, 173, 86), (104, 172, 90), + (110, 176, 98), (118, 181, 107), (125, 186, 115), (134, 187, 116), + (135, 183, 118), (137, 175, 123), (135, 163, 129), (133, 149, 130), + (126, 130, 118), (111, 114, 97), (100, 100, 79), (85, 86, 66), + (77, 68, 62), (67, 49, 54), (56, 34, 39), (50, 26, 25), + (41, 25, 11), (42, 23, 7), (43, 21, 6), (46, 17, 7) + ), + +// 630 Riverside +((82, 104, 100), (90, 97, 108), (93, 92, 113), (96, 88, 118), + (92, 82, 119), (88, 77, 121), (84, 75, 121), (81, 74, 121), + (67, 70, 115), (66, 68, 111), (65, 67, 107), (66, 66, 103), + (68, 66, 100), (70, 65, 94), (72, 65, 89), (71, 64, 84), + (70, 64, 79), (68, 60, 62), (69, 56, 62), (70, 52, 62), + (73, 50, 67), (76, 48, 73), (77, 47, 77), (79, 47, 81), + (82, 48, 84), (82, 51, 82), (82, 54, 80), (79, 58, 80), + (77, 63, 80), (75, 63, 81), (73, 64, 83), (72, 66, 87), + (72, 63, 92), (78, 65, 101), (86, 69, 102), (94, 74, 104), + (97, 77, 105), (101, 81, 106), (103, 79, 105), (106, 78, 105), + (115, 78, 107), (122, 78, 108), (130, 79, 109), (131, 78, 107), + (132, 78, 106), (130, 76, 103), (128, 75, 100), (123, 74, 94), + (118, 75, 93), (115, 87, 101), (111, 96, 106), (108, 106, 111), + (102, 112, 118), (97, 118, 125), (96, 121, 130), (95, 124, 136), + (97, 135, 164), (101, 143, 180), (105, 151, 197), (109, 158, 204), + (113, 166, 211), (114, 166, 212), (116, 166, 214), (120, 162, 216), + (129, 156, 213), (143, 139, 213), (142, 133, 205), (142, 128, 198), + (140, 124, 191), (139, 120, 185), (132, 109, 175), (133, 101, 164), + (133, 82, 138), (131, 79, 127), (130, 76, 117), (125, 73, 105), + (120, 71, 93), (118, 71, 90), (116, 72, 87), (113, 75, 82), + (118, 78, 80), (128, 92, 83), (135, 100, 85), (142, 109, 87), + (147, 114, 86), (152, 119, 85), (159, 128, 85), (171, 137, 88), + (189, 145, 98), (190, 148, 113), (192, 152, 128), (191, 152, 134), + (191, 152, 141), (187, 150, 153), (182, 147, 165), (180, 141, 163), + (174, 130, 160), (159, 115, 158), (147, 107, 156), (135, 99, 154), + (128, 95, 153), (121, 91, 153), (113, 85, 144), (106, 76, 127), + (99, 68, 96), (98, 65, 83), (97, 62, 70), (97, 61, 66), + (98, 60, 62), (101, 59, 57), (105, 61, 58), (109, 67, 60), + (115, 73, 59), (131, 83, 65), (133, 85, 68), (136, 88, 71), + (142, 91, 74), (145, 90, 80), (144, 91, 86), (140, 91, 85), + (138, 91, 80), (132, 91, 79), (126, 91, 79), (124, 88, 80), + (122, 86, 81), (114, 79, 85), (103, 73, 86), (98, 66, 84), + (93, 59, 78), (86, 56, 68), (85, 56, 67), (85, 56, 67), + (86, 57, 70), (87, 58, 74), (95, 59, 82), (102, 59, 84), + (111, 63, 76), (110, 63, 72), (110, 63, 68), (107, 61, 65), + (104, 60, 63), (101, 58, 66), (101, 56, 69), (102, 59, 74), + (104, 60, 79), (115, 69, 91), (116, 72, 92), (118, 75, 94), + (117, 76, 101), (116, 75, 109), (114, 77, 117), (112, 83, 129), + (120, 97, 154), (124, 103, 160), (128, 110, 167), (134, 123, 176), + (139, 130, 180), (142, 139, 176), (142, 150, 173), (142, 158, 170), + (142, 166, 166), (142, 184, 162), (141, 183, 160), (141, 182, 159), + (137, 180, 154), (135, 177, 147), (135, 175, 138), (134, 171, 129), + (131, 165, 122), (129, 160, 121), (127, 156, 121), (117, 148, 122), + (107, 138, 126), (101, 134, 130), (96, 130, 134), (91, 127, 139), + (89, 125, 143), (89, 121, 143), (88, 118, 143), (86, 114, 145), + (84, 113, 149), (86, 117, 155), (86, 125, 157), (89, 132, 157), + (85, 133, 152), (84, 130, 149), (84, 128, 146), (79, 122, 137), + (77, 114, 134), (75, 109, 136), (79, 109, 139), (81, 110, 143), + (83, 111, 150), (88, 110, 156), (88, 109, 156), (88, 107, 155), + (84, 102, 156), (82, 96, 153), (80, 90, 148), (78, 85, 146), + (80, 78, 150), (81, 74, 149), (82, 71, 143), (84, 71, 139), + (84, 70, 132), (82, 70, 121), (78, 71, 113), (76, 73, 110), + (75, 81, 108), (74, 91, 106), (77, 103, 111), (84, 113, 122), + (92, 125, 131), (98, 132, 142), (102, 138, 157), (105, 144, 168), + (107, 152, 179), (106, 161, 186), (106, 165, 194), (106, 170, 195), + (106, 165, 196), (104, 156, 196), (101, 141, 191), (96, 126, 182), + (90, 116, 170), (83, 105, 158), (79, 98, 144), (76, 90, 129), + (74, 84, 115), (73, 76, 104), (72, 67, 88), (71, 61, 74), + (68, 57, 63), (69, 54, 53), (71, 53, 45), (75, 54, 41), + (80, 56, 41), (87, 56, 41), (93, 60, 42), (95, 65, 44), + (98, 73, 48), (102, 84, 51), (104, 93, 56), (104, 99, 59), + (103, 100, 62), (100, 105, 67), (94, 107, 71), (92, 113, 76), + (93, 121, 81), (96, 132, 86), (100, 138, 86), (103, 138, 84), + (103, 134, 86), (97, 125, 87), (91, 117, 88), (85, 106, 93) + ), + +// 631 Rose_Bush +((162, 149, 111), (153, 149, 103), (150, 125, 97), (148, 101, 92), + (145, 86, 90), (142, 72, 89), (139, 65, 87), (137, 58, 85), + (127, 31, 69), (120, 33, 65), (114, 35, 62), (113, 36, 62), + (113, 38, 63), (113, 39, 64), (113, 40, 65), (113, 40, 66), + (113, 40, 68), (118, 33, 73), (113, 33, 70), (109, 33, 67), + (109, 31, 64), (109, 30, 61), (109, 29, 60), (109, 29, 59), + (113, 34, 59), (118, 34, 62), (124, 35, 65), (122, 40, 63), + (121, 45, 61), (121, 45, 60), (121, 46, 59), (122, 46, 60), + (122, 46, 61), (133, 43, 72), (144, 36, 79), (155, 30, 86), + (159, 28, 89), (163, 27, 92), (161, 29, 91), (159, 32, 91), + (145, 46, 89), (138, 54, 93), (131, 62, 98), (132, 68, 107), + (134, 74, 117), (137, 76, 124), (141, 78, 132), (154, 79, 142), + (166, 86, 152), (185, 101, 162), (187, 111, 168), (190, 121, 175), + (191, 128, 181), (192, 136, 187), (184, 136, 191), (177, 137, 196), + (195, 128, 206), (203, 123, 204), (211, 118, 202), (215, 111, 199), + (219, 105, 197), (219, 103, 194), (219, 102, 192), (220, 96, 184), + (220, 84, 173), (215, 60, 154), (212, 48, 143), (209, 36, 133), + (207, 30, 129), (206, 25, 125), (200, 21, 118), (192, 23, 111), + (182, 33, 100), (179, 39, 98), (177, 46, 97), (175, 54, 97), + (174, 62, 97), (176, 61, 96), (179, 60, 96), (178, 60, 98), + (177, 61, 99), (174, 62, 104), (175, 66, 108), (176, 70, 113), + (176, 72, 117), (177, 74, 122), (178, 83, 132), (186, 84, 138), + (198, 78, 153), (201, 69, 154), (205, 60, 155), (205, 54, 153), + (206, 49, 151), (207, 38, 145), (207, 28, 139), (207, 24, 131), + (206, 21, 125), (188, 28, 114), (180, 31, 110), (173, 34, 106), + (171, 35, 104), (169, 37, 102), (166, 42, 107), (165, 47, 112), + (174, 60, 122), (175, 68, 128), (176, 76, 135), (176, 79, 136), + (177, 82, 137), (177, 85, 138), (177, 89, 138), (175, 94, 146), + (173, 103, 158), (185, 124, 185), (190, 130, 190), (196, 136, 196), + (208, 144, 204), (217, 153, 201), (225, 158, 184), (228, 159, 174), + (219, 148, 148), (208, 148, 137), (197, 148, 127), (191, 151, 121), + (186, 155, 116), (176, 163, 109), (161, 168, 101), (146, 167, 90), + (135, 164, 82), (119, 148, 69), (114, 141, 65), (110, 135, 61), + (96, 123, 51), (84, 109, 44), (71, 96, 38), (60, 84, 30), + (45, 67, 19), (48, 61, 22), (51, 55, 25), (56, 48, 27), + (61, 42, 30), (69, 33, 37), (79, 30, 48), (89, 27, 55), + (99, 27, 64), (120, 23, 80), (122, 25, 83), (125, 27, 87), + (135, 24, 94), (142, 22, 100), (150, 19, 104), (155, 20, 106), + (161, 27, 109), (163, 29, 110), (165, 31, 112), (173, 31, 118), + (175, 36, 119), (172, 42, 118), (164, 46, 114), (159, 43, 110), + (151, 44, 102), (128, 45, 82), (119, 47, 75), (111, 49, 69), + (101, 50, 58), (96, 50, 54), (90, 59, 50), (83, 71, 49), + (77, 66, 47), (76, 64, 46), (75, 62, 45), (70, 60, 41), + (54, 63, 34), (40, 58, 26), (36, 52, 23), (29, 48, 23), + (27, 46, 22), (26, 44, 22), (26, 44, 22), (29, 45, 22), + (45, 39, 23), (53, 32, 22), (62, 24, 20), (68, 20, 18), + (69, 21, 17), (69, 20, 17), (69, 20, 17), (68, 21, 16), + (62, 30, 18), (62, 30, 17), (63, 31, 16), (65, 31, 16), + (70, 26, 15), (71, 26, 16), (72, 25, 15), (71, 23, 18), + (71, 24, 20), (70, 25, 24), (71, 28, 31), (73, 32, 39), + (77, 36, 47), (85, 38, 58), (93, 44, 72), (103, 50, 84), + (112, 57, 96), (117, 68, 105), (123, 73, 103), (128, 76, 103), + (130, 79, 107), (132, 78, 110), (136, 76, 109), (143, 73, 115), + (152, 70, 119), (161, 68, 125), (166, 70, 132), (171, 71, 132), + (174, 69, 126), (175, 66, 118), (173, 58, 110), (167, 51, 100), + (163, 40, 91), (160, 26, 84), (156, 14, 80), (150, 8, 79), + (147, 4, 80), (146, 2, 80), (146, 1, 76), (144, 0, 71), + (136, 1, 67), (128, 4, 63), (126, 1, 54), (127, 0, 52), + (127, 0, 53), (127, 0, 56), (127, 0, 62), (128, 6, 68), + (130, 12, 74), (132, 25, 83), (132, 42, 96), (135, 55, 105), + (144, 68, 109), (156, 75, 117), (169, 83, 125), (182, 92, 139), + (195, 99, 152), (208, 104, 160), (219, 113, 175), (225, 126, 192), + (229, 139, 209), (228, 140, 207), (220, 143, 204), (211, 143, 199), + (202, 145, 189), (193, 143, 155), (183, 161, 132), (175, 156, 122) + ), + +// 632 Rusted +((129, 170, 176), (126, 158, 170), (135, 161, 178), (144, 164, 187), + (152, 172, 198), (160, 180, 209), (162, 182, 213), (165, 185, 218), + (179, 199, 235), (176, 196, 229), (173, 193, 223), (163, 182, 206), + (153, 172, 190), (147, 159, 167), (142, 146, 145), (140, 136, 127), + (138, 127, 110), (127, 100, 91), (124, 97, 90), (122, 94, 89), + (117, 91, 92), (112, 88, 96), (105, 90, 104), (98, 92, 112), + (76, 100, 119), (70, 93, 111), (64, 86, 103), (58, 80, 94), + (52, 75, 85), (50, 71, 80), (49, 68, 75), (45, 63, 64), + (41, 59, 57), (38, 50, 46), (36, 49, 42), (35, 48, 39), + (34, 45, 36), (34, 42, 34), (34, 41, 34), (34, 40, 35), + (33, 41, 36), (34, 43, 39), (36, 46, 42), (41, 51, 50), + (46, 57, 59), (48, 61, 64), (50, 65, 70), (57, 73, 81), + (64, 82, 94), (81, 101, 117), (86, 105, 121), (91, 110, 126), + (92, 110, 121), (93, 110, 117), (91, 107, 111), (89, 104, 106), + (93, 81, 66), (93, 74, 51), (93, 67, 37), (94, 64, 30), + (96, 62, 24), (96, 63, 25), (97, 64, 27), (97, 73, 36), + (101, 79, 47), (103, 116, 72), (110, 130, 76), (117, 145, 81), + (122, 143, 79), (127, 141, 77), (135, 133, 68), (142, 124, 55), + (138, 101, 33), (135, 79, 23), (133, 58, 13), (131, 50, 7), + (130, 42, 2), (131, 43, 1), (133, 45, 1), (133, 46, 1), + (126, 50, 0), (133, 49, 2), (128, 54, 5), (123, 59, 9), + (118, 61, 15), (113, 64, 22), (109, 72, 35), (99, 76, 46), + (83, 81, 67), (76, 83, 76), (70, 86, 86), (67, 86, 90), + (65, 86, 94), (62, 84, 98), (65, 86, 102), (70, 90, 107), + (78, 100, 117), (95, 115, 135), (98, 119, 140), (102, 124, 145), + (102, 123, 145), (102, 123, 145), (98, 118, 139), (92, 111, 129), + (78, 94, 107), (75, 90, 100), (72, 86, 94), (70, 84, 91), + (69, 83, 89), (67, 83, 85), (66, 85, 88), (67, 85, 88), + (66, 84, 87), (60, 80, 77), (58, 76, 74), (56, 73, 71), + (52, 68, 67), (52, 68, 64), (56, 72, 67), (58, 75, 73), + (70, 90, 101), (79, 101, 114), (89, 112, 128), (94, 117, 136), + (99, 122, 144), (106, 131, 156), (116, 139, 166), (121, 145, 171), + (126, 147, 175), (128, 150, 178), (127, 151, 178), (127, 152, 178), + (126, 150, 177), (126, 148, 174), (125, 145, 167), (124, 145, 160), + (130, 158, 138), (128, 158, 122), (126, 159, 107), (129, 155, 99), + (132, 151, 92), (143, 144, 74), (147, 134, 52), (137, 126, 41), + (134, 108, 32), (137, 71, 14), (128, 68, 15), (119, 66, 17), + (102, 63, 23), (88, 62, 32), (85, 59, 36), (72, 62, 47), + (61, 75, 78), (65, 80, 86), (70, 85, 94), (77, 95, 108), + (75, 93, 106), (79, 98, 110), (82, 100, 109), (83, 102, 106), + (76, 94, 92), (69, 75, 56), (70, 70, 47), (71, 65, 39), + (73, 54, 26), (69, 51, 20), (70, 42, 18), (70, 40, 20), + (69, 48, 32), (70, 50, 37), (72, 53, 43), (72, 62, 54), + (72, 72, 69), (73, 87, 79), (80, 98, 88), (87, 105, 90), + (89, 104, 90), (87, 100, 88), (82, 97, 89), (77, 92, 84), + (71, 85, 74), (66, 76, 67), (62, 71, 68), (61, 71, 75), + (72, 89, 84), (78, 95, 86), (85, 102, 88), (95, 115, 95), + (106, 127, 99), (110, 131, 107), (114, 132, 105), (111, 129, 98), + (105, 124, 87), (94, 111, 85), (84, 100, 85), (76, 91, 89), + (73, 90, 92), (75, 93, 100), (81, 100, 112), (90, 110, 129), + (103, 123, 148), (117, 137, 166), (128, 148, 181), (135, 155, 189), + (140, 159, 192), (142, 161, 195), (142, 162, 196), (138, 161, 191), + (132, 156, 184), (126, 151, 179), (123, 146, 175), (120, 144, 168), + (117, 141, 159), (108, 134, 149), (97, 122, 135), (87, 109, 118), + (79, 96, 99), (72, 82, 78), (63, 66, 57), (55, 51, 40), + (47, 41, 29), (42, 35, 20), (41, 29, 15), (39, 27, 13), + (38, 24, 12), (30, 24, 12), (25, 25, 15), (22, 29, 21), + (26, 31, 24), (25, 30, 25), (25, 34, 30), (32, 45, 43), + (47, 61, 57), (61, 75, 73), (71, 87, 90), (85, 104, 114), + (103, 121, 135), (124, 142, 157), (138, 156, 177), (148, 168, 194), + (154, 174, 206), (158, 182, 212), (160, 183, 215), (162, 183, 211), + (170, 178, 203), (176, 188, 197), (183, 197, 205), (186, 209, 214), + (197, 204, 217), (203, 214, 216), (204, 223, 222), (191, 230, 227), + (177, 217, 222), (164, 204, 214), (153, 193, 202), (140, 181, 191) + ), + +// 633 Sachet +((73, 104, 39), (49, 73, 24), (32, 55, 17), (15, 37, 10), + (13, 36, 14), (12, 36, 18), (14, 36, 19), (16, 36, 21), + (29, 65, 32), (44, 83, 38), (59, 102, 45), (73, 117, 49), + (88, 133, 53), (94, 138, 54), (101, 143, 55), (97, 142, 51), + (94, 141, 48), (85, 132, 39), (73, 122, 37), (62, 112, 35), + (61, 110, 36), (60, 109, 37), (57, 106, 36), (54, 104, 36), + (70, 115, 40), (78, 118, 46), (86, 121, 52), (91, 123, 57), + (97, 125, 63), (100, 124, 62), (103, 123, 61), (97, 114, 60), + (85, 113, 57), (76, 105, 59), (66, 99, 63), (57, 93, 67), + (49, 85, 63), (41, 78, 60), (40, 77, 58), (39, 77, 57), + (37, 78, 50), (41, 83, 49), (46, 89, 49), (50, 88, 50), + (54, 87, 51), (51, 84, 49), (49, 81, 47), (48, 78, 42), + (46, 71, 44), (37, 62, 49), (47, 58, 71), (58, 54, 93), + (65, 58, 110), (73, 62, 128), (81, 61, 143), (90, 60, 159), + (110, 98, 158), (123, 115, 153), (136, 132, 148), (142, 142, 137), + (148, 153, 127), (150, 153, 137), (153, 153, 147), (160, 150, 157), + (155, 134, 162), (135, 117, 163), (130, 122, 143), (126, 127, 123), + (127, 129, 111), (128, 132, 99), (135, 143, 82), (139, 155, 74), + (132, 148, 56), (112, 132, 54), (93, 117, 52), (70, 94, 42), + (47, 71, 33), (37, 59, 30), (27, 48, 27), (13, 28, 19), + (7, 21, 15), (3, 20, 14), (8, 30, 17), (14, 40, 21), + (18, 48, 21), (22, 56, 22), (36, 75, 26), (58, 93, 26), + (85, 114, 32), (95, 113, 48), (106, 113, 64), (106, 107, 77), + (106, 102, 91), (101, 85, 104), (96, 78, 114), (91, 79, 125), + (83, 79, 118), (77, 86, 91), (74, 95, 87), (71, 104, 83), + (74, 106, 85), (78, 108, 87), (80, 108, 94), (79, 101, 96), + (89, 109, 97), (95, 114, 90), (102, 120, 84), (111, 127, 82), + (120, 134, 80), (133, 144, 83), (144, 156, 78), (150, 160, 73), + (148, 156, 77), (116, 135, 54), (105, 125, 51), (94, 116, 49), + (69, 98, 38), (50, 80, 27), (34, 62, 23), (24, 51, 22), + (40, 60, 31), (54, 73, 43), (69, 87, 55), (74, 94, 55), + (80, 102, 56), (82, 112, 59), (82, 113, 66), (85, 112, 71), + (86, 105, 75), (116, 114, 125), (127, 123, 137), (139, 132, 149), + (149, 143, 159), (165, 160, 159), (174, 174, 158), (169, 181, 140), + (143, 162, 99), (139, 156, 90), (135, 151, 81), (135, 152, 79), + (135, 153, 77), (133, 151, 74), (144, 159, 72), (156, 170, 69), + (162, 173, 68), (168, 182, 72), (168, 182, 73), (169, 182, 75), + (165, 176, 79), (163, 173, 79), (157, 167, 77), (145, 158, 76), + (125, 134, 69), (116, 129, 64), (108, 124, 60), (89, 111, 55), + (73, 99, 49), (58, 86, 37), (43, 72, 29), (30, 61, 21), + (20, 48, 12), (7, 28, 4), (6, 25, 2), (6, 22, 1), + (3, 16, 0), (0, 12, 0), (1, 14, 0), (3, 17, 1), + (4, 27, 1), (5, 31, 2), (7, 36, 4), (12, 44, 7), + (17, 50, 10), (23, 58, 13), (31, 66, 16), (36, 71, 21), + (39, 74, 26), (49, 80, 27), (58, 85, 26), (67, 89, 29), + (85, 106, 35), (104, 123, 40), (122, 135, 44), (139, 152, 51), + (154, 173, 67), (155, 172, 67), (156, 172, 67), (156, 169, 68), + (157, 173, 71), (157, 176, 73), (159, 173, 71), (167, 177, 74), + (172, 184, 78), (174, 186, 76), (176, 187, 75), (174, 184, 74), + (165, 178, 68), (153, 169, 66), (139, 158, 63), (116, 139, 57), + (100, 126, 62), (96, 127, 66), (100, 129, 77), (122, 150, 109), + (148, 172, 132), (167, 182, 140), (180, 197, 148), (185, 186, 162), + (178, 160, 166), (157, 143, 148), (143, 123, 140), (139, 113, 137), + (136, 124, 124), (145, 138, 114), (153, 155, 99), (157, 172, 88), + (166, 182, 86), (173, 186, 90), (178, 190, 92), (186, 200, 101), + (183, 202, 116), (178, 193, 109), (177, 194, 102), (159, 185, 105), + (132, 159, 86), (107, 131, 61), (82, 105, 49), (55, 80, 36), + (35, 54, 22), (25, 36, 18), (12, 29, 16), (9, 28, 17), + (18, 34, 19), (26, 49, 23), (35, 67, 33), (55, 85, 40), + (75, 101, 40), (89, 113, 43), (103, 120, 50), (112, 121, 48), + (122, 121, 50), (121, 121, 63), (113, 124, 71), (117, 125, 79), + (119, 124, 100), (110, 115, 129), (110, 106, 147), (119, 106, 154), + (116, 94, 165), (108, 87, 162), (111, 98, 144), (112, 108, 128), + (109, 122, 106), (115, 135, 82), (122, 142, 71), (95, 125, 58) + ), + +// 634 Sage +((63, 51, 34), (64, 46, 25), (66, 53, 29), (69, 60, 33), + (76, 73, 44), (83, 86, 55), (87, 93, 60), (91, 100, 66), + (111, 135, 90), (122, 151, 105), (134, 168, 121), (138, 178, 129), + (143, 189, 138), (141, 192, 139), (139, 196, 141), (139, 198, 140), + (139, 201, 140), (137, 198, 134), (130, 192, 124), (124, 186, 114), + (120, 181, 107), (117, 176, 100), (120, 176, 99), (123, 176, 98), + (135, 166, 88), (131, 150, 77), (127, 134, 66), (118, 121, 61), + (109, 109, 57), (105, 102, 53), (101, 96, 50), (94, 80, 36), + (84, 60, 24), (58, 30, 8), (49, 25, 6), (41, 21, 5), + (38, 20, 5), (36, 19, 5), (36, 19, 5), (36, 19, 5), + (41, 22, 6), (40, 22, 6), (40, 23, 6), (37, 24, 7), + (35, 25, 8), (36, 26, 9), (37, 28, 11), (40, 31, 13), + (44, 35, 19), (43, 61, 33), (48, 72, 40), (53, 84, 48), + (58, 87, 52), (63, 90, 57), (63, 92, 56), (64, 95, 56), + (62, 94, 47), (66, 86, 42), (71, 78, 38), (81, 75, 32), + (91, 73, 27), (94, 70, 23), (97, 68, 20), (98, 67, 20), + (96, 66, 21), (103, 81, 37), (107, 92, 46), (111, 104, 55), + (108, 109, 58), (105, 114, 62), (96, 123, 71), (91, 129, 76), + (93, 135, 86), (92, 134, 85), (91, 134, 84), (90, 124, 74), + (90, 114, 65), (88, 106, 60), (87, 98, 55), (81, 81, 45), + (72, 65, 37), (53, 41, 18), (46, 32, 12), (39, 24, 7), + (36, 21, 6), (34, 19, 5), (31, 16, 4), (27, 14, 3), + (28, 15, 3), (31, 19, 4), (35, 23, 5), (37, 25, 6), + (40, 28, 7), (44, 33, 12), (50, 41, 19), (58, 48, 28), + (67, 61, 37), (95, 95, 70), (104, 109, 84), (113, 123, 99), + (113, 126, 101), (114, 129, 103), (118, 130, 107), (116, 130, 106), + (107, 120, 97), (94, 108, 82), (82, 96, 67), (75, 87, 59), + (68, 79, 52), (57, 67, 42), (51, 59, 32), (48, 54, 24), + (50, 53, 19), (51, 56, 17), (53, 58, 18), (55, 61, 20), + (58, 65, 22), (62, 66, 23), (63, 63, 22), (61, 62, 23), + (60, 60, 24), (62, 57, 22), (64, 55, 20), (63, 52, 18), + (63, 50, 17), (65, 44, 13), (64, 40, 11), (65, 37, 9), + (66, 35, 6), (59, 28, 1), (56, 25, 0), (53, 22, 0), + (46, 17, 1), (39, 14, 0), (31, 13, 1), (27, 12, 2), + (22, 14, 4), (22, 17, 5), (23, 20, 6), (25, 21, 7), + (27, 22, 8), (31, 24, 10), (35, 27, 12), (38, 31, 15), + (40, 32, 16), (41, 33, 17), (40, 32, 16), (39, 31, 16), + (36, 30, 15), (34, 29, 14), (30, 27, 13), (26, 24, 10), + (20, 21, 5), (20, 22, 4), (21, 23, 4), (23, 24, 5), + (27, 27, 9), (34, 35, 15), (42, 44, 22), (51, 60, 28), + (60, 77, 35), (82, 109, 58), (87, 116, 66), (93, 124, 74), + (104, 143, 88), (113, 161, 99), (120, 169, 107), (125, 175, 110), + (128, 176, 114), (128, 176, 113), (129, 176, 113), (129, 170, 113), + (125, 159, 107), (119, 142, 96), (111, 125, 83), (103, 112, 70), + (96, 99, 63), (88, 87, 56), (78, 75, 51), (72, 64, 47), + (66, 55, 39), (58, 48, 33), (53, 43, 27), (48, 39, 23), + (51, 41, 25), (52, 43, 25), (53, 46, 26), (55, 50, 25), + (59, 53, 23), (64, 54, 24), (67, 55, 26), (72, 58, 30), + (73, 63, 31), (77, 70, 31), (81, 77, 36), (85, 86, 43), + (87, 96, 54), (87, 108, 65), (88, 119, 69), (88, 129, 75), + (91, 138, 82), (95, 143, 89), (98, 147, 98), (100, 148, 99), + (101, 146, 96), (110, 142, 90), (119, 133, 79), (127, 122, 70), + (129, 108, 59), (123, 95, 47), (120, 84, 37), (118, 75, 27), + (117, 68, 20), (113, 60, 14), (99, 53, 8), (84, 45, 4), + (69, 39, 2), (58, 35, 2), (52, 34, 1), (47, 34, 2), + (46, 35, 4), (46, 39, 7), (47, 41, 9), (49, 43, 9), + (51, 44, 8), (52, 43, 8), (56, 44, 10), (63, 45, 13), + (69, 46, 15), (77, 51, 17), (89, 60, 23), (97, 75, 35), + (109, 92, 53), (121, 110, 73), (130, 127, 91), (148, 144, 108), + (166, 166, 129), (182, 185, 150), (195, 206, 172), (204, 221, 193), + (210, 228, 205), (216, 234, 211), (216, 230, 209), (209, 227, 202), + (205, 223, 197), (198, 215, 187), (185, 205, 175), (170, 186, 160), + (148, 167, 141), (130, 150, 122), (117, 131, 103), (104, 111, 86), + (93, 92, 68), (81, 75, 54), (71, 64, 45), (66, 57, 38) + ), + +// 635 Saturday_Morning +((126, 171, 215), (115, 175, 207), (106, 179, 205), (98, 183, 204), + (101, 182, 200), (104, 182, 197), (110, 179, 194), (117, 177, 191), + (141, 156, 199), (151, 150, 199), (162, 145, 199), (163, 144, 204), + (165, 144, 210), (168, 143, 211), (171, 143, 212), (174, 140, 211), + (177, 138, 211), (181, 125, 189), (188, 125, 172), (196, 126, 155), + (199, 117, 139), (203, 108, 124), (206, 110, 112), (209, 112, 100), + (224, 117, 67), (220, 107, 66), (217, 98, 65), (217, 99, 71), + (217, 101, 77), (215, 100, 83), (213, 99, 90), (210, 103, 113), + (201, 105, 140), (200, 123, 175), (199, 128, 188), (198, 133, 201), + (198, 123, 199), (199, 114, 197), (202, 108, 191), (205, 103, 185), + (210, 91, 157), (210, 93, 146), (210, 96, 136), (212, 110, 138), + (215, 124, 140), (211, 131, 140), (208, 139, 140), (198, 159, 151), + (185, 171, 167), (175, 183, 190), (168, 182, 192), (161, 181, 195), + (149, 179, 199), (138, 178, 203), (131, 180, 203), (125, 182, 203), + (113, 175, 209), (109, 171, 211), (106, 167, 214), (118, 157, 208), + (130, 147, 203), (142, 141, 198), (155, 135, 194), (180, 128, 185), + (197, 123, 177), (228, 107, 158), (239, 103, 152), (251, 99, 147), + (252, 95, 145), (254, 91, 144), (253, 85, 135), (252, 76, 132), + (250, 54, 148), (244, 52, 157), (238, 50, 167), (235, 51, 176), + (233, 53, 186), (231, 59, 192), (229, 65, 199), (222, 80, 211), + (215, 93, 208), (224, 105, 167), (227, 106, 152), (231, 107, 138), + (232, 103, 134), (233, 100, 130), (238, 91, 112), (245, 86, 98), + (242, 78, 106), (241, 77, 114), (241, 76, 123), (240, 78, 130), + (239, 80, 138), (231, 93, 155), (220, 107, 166), (213, 123, 167), + (205, 140, 170), (191, 188, 165), (194, 203, 147), (197, 218, 130), + (196, 220, 123), (196, 222, 116), (192, 220, 117), (199, 218, 114), + (210, 197, 115), (207, 185, 130), (204, 173, 145), (205, 167, 145), + (207, 161, 146), (212, 150, 138), (217, 133, 132), (225, 121, 129), + (231, 108, 125), (244, 82, 99), (246, 78, 95), (249, 74, 92), + (249, 70, 89), (245, 67, 81), (245, 68, 75), (247, 70, 78), + (246, 70, 84), (245, 71, 90), (244, 72, 96), (243, 74, 104), + (242, 77, 112), (236, 79, 130), (224, 87, 145), (218, 94, 156), + (211, 103, 163), (179, 124, 180), (173, 128, 186), (168, 132, 192), + (160, 129, 198), (156, 125, 205), (147, 124, 201), (150, 124, 202), + (175, 104, 195), (189, 99, 188), (203, 94, 181), (209, 95, 177), + (215, 97, 174), (224, 98, 169), (227, 105, 170), (221, 116, 175), + (217, 128, 178), (195, 155, 191), (187, 163, 194), (180, 172, 198), + (172, 180, 200), (166, 184, 202), (162, 180, 204), (157, 181, 210), + (143, 181, 219), (138, 179, 220), (133, 177, 221), (127, 179, 220), + (129, 181, 218), (133, 185, 217), (133, 181, 215), (134, 176, 206), + (142, 166, 197), (163, 150, 166), (171, 145, 159), (180, 141, 153), + (198, 125, 148), (207, 114, 150), (209, 108, 151), (216, 113, 154), + (228, 117, 174), (224, 118, 182), (221, 119, 191), (209, 127, 209), + (192, 138, 218), (179, 149, 222), (171, 160, 223), (163, 164, 223), + (153, 169, 217), (142, 173, 210), (136, 183, 200), (138, 183, 194), + (139, 177, 193), (137, 169, 195), (131, 169, 199), (129, 171, 202), + (122, 163, 212), (122, 159, 218), (122, 156, 224), (121, 155, 236), + (108, 154, 235), (99, 153, 228), (106, 146, 229), (124, 137, 239), + (131, 128, 246), (130, 122, 240), (136, 121, 234), (152, 120, 233), + (171, 123, 234), (180, 125, 233), (179, 130, 227), (176, 132, 224), + (175, 134, 220), (181, 139, 219), (182, 141, 218), (185, 138, 214), + (187, 129, 202), (190, 118, 186), (188, 117, 178), (178, 113, 174), + (173, 110, 171), (165, 102, 166), (157, 107, 173), (142, 105, 186), + (138, 96, 201), (136, 91, 207), (141, 98, 215), (148, 108, 216), + (164, 104, 222), (171, 105, 220), (178, 110, 215), (180, 125, 201), + (184, 138, 196), (181, 148, 197), (182, 154, 202), (179, 156, 203), + (172, 156, 206), (163, 152, 211), (161, 148, 219), (161, 145, 224), + (156, 144, 224), (148, 143, 224), (141, 144, 227), (141, 146, 230), + (140, 149, 229), (141, 154, 229), (139, 160, 228), (139, 164, 228), + (137, 162, 227), (141, 160, 227), (148, 161, 224), (155, 161, 220), + (163, 157, 211), (170, 149, 201), (180, 144, 186), (182, 142, 174), + (184, 145, 171), (175, 144, 172), (168, 138, 175), (152, 124, 177), + (140, 116, 191), (124, 114, 204), (120, 123, 219), (124, 131, 224), + (126, 131, 231), (130, 121, 231), (129, 123, 232), (134, 143, 220) + ), + +// 636 Scattered_Petals +((68, 120, 123), (57, 97, 96), (51, 86, 84), (45, 75, 73), + (40, 63, 61), (36, 52, 50), (35, 48, 45), (34, 45, 40), + (33, 35, 27), (32, 32, 26), (31, 30, 25), (33, 31, 24), + (35, 33, 24), (37, 39, 23), (39, 45, 23), (39, 48, 24), + (40, 51, 26), (42, 55, 32), (43, 58, 35), (45, 62, 38), + (53, 72, 43), (61, 82, 48), (63, 86, 54), (66, 91, 60), + (74, 107, 81), (78, 111, 82), (82, 115, 83), (82, 112, 83), + (82, 110, 83), (80, 107, 83), (78, 104, 83), (69, 92, 77), + (63, 82, 68), (54, 60, 53), (56, 58, 52), (58, 56, 51), + (70, 62, 63), (83, 69, 75), (94, 71, 83), (106, 74, 91), + (150, 82, 117), (151, 86, 117), (153, 90, 117), (148, 85, 114), + (144, 80, 112), (141, 73, 108), (139, 67, 105), (123, 58, 89), + (95, 47, 69), (42, 34, 33), (30, 29, 26), (19, 25, 19), + (14, 22, 16), (10, 20, 13), (11, 21, 13), (12, 23, 14), + (21, 36, 19), (26, 46, 27), (31, 57, 35), (39, 65, 43), + (48, 73, 52), (55, 75, 58), (62, 78, 64), (88, 80, 83), + (114, 88, 103), (157, 104, 146), (166, 116, 157), (176, 129, 168), + (178, 133, 170), (180, 138, 172), (178, 144, 176), (169, 141, 174), + (142, 136, 153), (117, 131, 133), (92, 126, 113), (76, 108, 93), + (60, 91, 73), (57, 83, 67), (55, 76, 61), (51, 64, 51), + (46, 55, 46), (37, 41, 36), (37, 40, 33), (38, 40, 31), + (37, 39, 31), (36, 39, 32), (33, 39, 34), (30, 35, 36), + (30, 36, 35), (29, 41, 38), (29, 47, 42), (30, 50, 45), + (31, 53, 48), (33, 59, 50), (38, 63, 49), (42, 65, 48), + (42, 72, 53), (49, 88, 63), (53, 93, 63), (58, 99, 63), + (58, 103, 65), (58, 107, 68), (62, 117, 77), (69, 131, 91), + (78, 151, 111), (77, 154, 116), (77, 158, 121), (78, 158, 121), + (79, 158, 122), (79, 155, 114), (78, 146, 106), (74, 139, 93), + (69, 129, 81), (64, 109, 57), (61, 104, 52), (59, 99, 48), + (57, 94, 39), (57, 93, 36), (63, 97, 40), (73, 105, 47), + (79, 124, 74), (80, 132, 85), (81, 140, 96), (84, 141, 97), + (87, 142, 99), (87, 142, 101), (89, 142, 102), (87, 146, 100), + (84, 149, 97), (76, 135, 81), (74, 128, 76), (72, 122, 72), + (73, 113, 64), (74, 110, 59), (76, 111, 55), (74, 110, 52), + (67, 95, 46), (62, 85, 45), (58, 75, 44), (56, 72, 43), + (54, 69, 42), (49, 60, 38), (46, 55, 33), (41, 47, 30), + (38, 40, 29), (43, 32, 33), (50, 32, 36), (58, 33, 40), + (80, 34, 51), (102, 35, 59), (107, 37, 58), (105, 42, 56), + (112, 69, 61), (122, 77, 68), (132, 85, 75), (143, 94, 78), + (142, 102, 85), (139, 108, 94), (140, 116, 107), (153, 130, 133), + (175, 137, 152), (204, 137, 186), (212, 131, 190), (220, 126, 195), + (232, 119, 205), (237, 109, 201), (223, 102, 188), (201, 94, 170), + (155, 72, 121), (147, 65, 109), (139, 59, 98), (112, 50, 75), + (86, 43, 56), (59, 37, 37), (37, 33, 25), (39, 44, 24), + (42, 53, 23), (43, 57, 23), (49, 68, 26), (42, 60, 24), + (49, 71, 30), (57, 85, 38), (61, 94, 41), (66, 104, 45), + (52, 84, 41), (48, 79, 40), (45, 75, 40), (39, 65, 38), + (34, 59, 34), (31, 52, 32), (26, 48, 30), (24, 43, 28), + (23, 41, 31), (25, 43, 37), (30, 50, 47), (35, 62, 59), + (41, 76, 70), (51, 96, 84), (62, 115, 103), (72, 135, 124), + (81, 153, 142), (103, 156, 157), (127, 159, 169), (151, 157, 182), + (173, 155, 196), (179, 158, 203), (197, 149, 209), (217, 139, 209), + (235, 125, 210), (250, 115, 214), (247, 115, 213), (232, 118, 203), + (221, 123, 187), (209, 128, 169), (196, 128, 151), (184, 128, 140), + (160, 125, 122), (138, 121, 105), (120, 121, 88), (105, 119, 72), + (96, 114, 63), (86, 106, 53), (73, 93, 47), (62, 82, 44), + (52, 73, 44), (44, 65, 43), (39, 60, 39), (35, 55, 32), + (31, 50, 26), (27, 48, 23), (24, 44, 22), (22, 40, 22), + (23, 40, 19), (25, 40, 19), (29, 47, 18), (32, 54, 20), + (34, 58, 25), (36, 60, 27), (36, 59, 31), (36, 61, 32), + (39, 64, 34), (42, 67, 35), (46, 69, 37), (50, 68, 40), + (60, 67, 45), (78, 73, 61), (104, 80, 80), (124, 89, 98), + (125, 102, 112), (121, 107, 117), (118, 113, 126), (123, 119, 138), + (136, 121, 151), (130, 130, 158), (112, 132, 153), (89, 126, 138) + ), + +// 637 Sea_Mist +((66, 148, 132), (70, 145, 134), (64, 137, 127), (58, 129, 120), + (49, 112, 102), (41, 96, 85), (37, 89, 79), (34, 82, 74), + (34, 61, 57), (39, 62, 57), (44, 63, 57), (48, 66, 61), + (52, 70, 66), (61, 71, 69), (70, 73, 73), (75, 77, 76), + (81, 81, 80), (99, 103, 102), (101, 112, 111), (103, 122, 120), + (100, 130, 126), (97, 139, 132), (95, 142, 134), (94, 145, 137), + (80, 149, 136), (70, 147, 134), (60, 146, 132), (58, 137, 123), + (57, 128, 115), (56, 122, 110), (56, 117, 105), (55, 107, 96), + (52, 101, 92), (56, 84, 79), (59, 78, 74), (63, 73, 69), + (65, 72, 70), (68, 72, 71), (69, 72, 71), (71, 73, 71), + (74, 74, 73), (70, 79, 78), (66, 85, 83), (63, 90, 87), + (60, 96, 92), (58, 95, 91), (56, 95, 91), (47, 92, 89), + (35, 90, 89), (23, 93, 89), (24, 97, 93), (26, 102, 97), + (30, 110, 106), (35, 119, 115), (39, 125, 120), (44, 132, 126), + (64, 165, 155), (79, 180, 172), (95, 196, 190), (110, 208, 203), + (125, 220, 217), (127, 224, 221), (129, 229, 226), (131, 230, 230), + (128, 232, 232), (127, 228, 228), (124, 221, 221), (122, 214, 214), + (117, 207, 207), (113, 201, 200), (102, 187, 184), (94, 172, 167), + (91, 146, 139), (89, 131, 124), (87, 116, 110), (82, 102, 97), + (77, 89, 84), (74, 85, 80), (72, 81, 77), (69, 74, 70), + (64, 69, 65), (56, 58, 55), (52, 54, 52), (49, 51, 49), + (48, 50, 48), (48, 49, 48), (48, 49, 48), (49, 48, 48), + (46, 47, 46), (46, 47, 46), (46, 48, 46), (46, 48, 46), + (47, 48, 47), (47, 49, 47), (46, 49, 46), (41, 51, 48), + (36, 52, 50), (32, 57, 55), (34, 57, 54), (36, 58, 54), + (36, 58, 54), (37, 59, 55), (36, 62, 61), (41, 67, 64), + (54, 70, 66), (57, 70, 66), (60, 71, 67), (61, 72, 68), + (62, 73, 69), (65, 76, 72), (68, 78, 74), (71, 83, 78), + (72, 85, 80), (65, 96, 88), (63, 98, 89), (62, 100, 91), + (59, 104, 95), (60, 105, 96), (60, 107, 95), (57, 107, 94), + (47, 96, 86), (45, 88, 79), (44, 81, 73), (44, 77, 69), + (44, 73, 66), (43, 65, 58), (39, 56, 52), (35, 52, 50), + (35, 50, 50), (43, 57, 54), (44, 60, 57), (46, 63, 60), + (49, 73, 69), (58, 83, 79), (67, 97, 93), (80, 114, 108), + (92, 154, 147), (96, 169, 163), (100, 185, 180), (103, 192, 186), + (107, 200, 193), (113, 212, 206), (116, 222, 215), (113, 224, 219), + (113, 216, 211), (102, 193, 187), (100, 187, 180), (99, 182, 174), + (89, 170, 161), (83, 156, 145), (75, 138, 127), (62, 119, 108), + (47, 92, 82), (44, 89, 79), (42, 86, 76), (44, 82, 73), + (47, 80, 73), (54, 78, 72), (63, 76, 72), (70, 77, 75), + (77, 80, 79), (82, 96, 93), (81, 100, 96), (81, 104, 99), + (79, 111, 103), (82, 116, 108), (83, 120, 111), (87, 126, 118), + (87, 136, 127), (89, 138, 128), (92, 140, 130), (95, 143, 133), + (103, 146, 138), (108, 153, 145), (114, 160, 152), (122, 167, 160), + (129, 173, 166), (135, 180, 176), (135, 191, 187), (130, 203, 198), + (128, 211, 207), (123, 214, 210), (121, 214, 210), (120, 213, 207), + (106, 201, 195), (99, 196, 189), (92, 192, 184), (79, 181, 171), + (67, 172, 160), (62, 163, 150), (60, 155, 141), (57, 150, 136), + (55, 148, 133), (50, 149, 134), (49, 155, 141), (53, 163, 150), + (56, 172, 161), (62, 183, 171), (64, 188, 178), (65, 193, 183), + (67, 195, 187), (66, 194, 186), (70, 191, 183), (73, 183, 176), + (76, 173, 167), (78, 163, 157), (77, 153, 147), (80, 144, 138), + (84, 137, 132), (87, 137, 130), (90, 141, 133), (91, 148, 141), + (92, 159, 152), (100, 166, 157), (104, 173, 165), (108, 179, 171), + (110, 181, 174), (107, 182, 175), (111, 179, 172), (113, 172, 166), + (116, 162, 155), (119, 149, 145), (117, 136, 133), (112, 128, 125), + (105, 122, 119), (97, 115, 110), (91, 107, 103), (83, 100, 96), + (74, 94, 91), (67, 91, 88), (61, 87, 83), (58, 82, 79), + (54, 76, 72), (48, 72, 68), (45, 68, 64), (43, 66, 63), + (47, 64, 61), (51, 63, 60), (50, 65, 62), (47, 67, 62), + (43, 70, 64), (39, 72, 67), (36, 73, 68), (33, 79, 73), + (30, 84, 78), (28, 89, 82), (27, 92, 83), (26, 93, 85), + (26, 98, 87), (28, 103, 92), (40, 112, 101), (48, 116, 105), + (58, 132, 121), (64, 144, 132), (59, 149, 134), (67, 160, 145) + ), + +// 638 Secret +((82, 53, 109), (40, 21, 51), (40, 23, 53), (41, 26, 55), + (39, 23, 55), (38, 21, 55), (37, 22, 53), (36, 23, 51), + (31, 29, 53), (33, 25, 49), (35, 21, 46), (29, 19, 40), + (24, 17, 35), (22, 15, 32), (20, 13, 29), (19, 11, 28), + (19, 10, 27), (24, 10, 35), (25, 12, 33), (26, 15, 32), + (24, 16, 36), (23, 18, 41), (25, 20, 44), (28, 22, 48), + (33, 32, 66), (41, 36, 74), (49, 41, 82), (57, 38, 83), + (65, 36, 84), (63, 35, 79), (62, 34, 75), (55, 26, 80), + (53, 32, 75), (56, 36, 73), (56, 41, 75), (56, 47, 78), + (65, 53, 97), (74, 59, 116), (68, 60, 117), (63, 62, 119), + (43, 42, 84), (38, 35, 69), (34, 28, 54), (31, 26, 51), + (29, 25, 48), (28, 24, 44), (27, 24, 41), (23, 18, 38), + (20, 17, 34), (14, 14, 26), (12, 12, 25), (11, 10, 24), + (14, 10, 25), (18, 11, 27), (17, 10, 25), (16, 10, 24), + (8, 5, 12), (14, 7, 19), (20, 9, 26), (22, 10, 31), + (25, 11, 36), (25, 12, 35), (25, 13, 35), (24, 15, 36), + (21, 18, 35), (22, 19, 36), (22, 21, 39), (22, 23, 43), + (22, 23, 43), (23, 24, 44), (23, 21, 45), (25, 22, 49), + (29, 22, 55), (35, 29, 64), (41, 37, 74), (49, 41, 80), + (58, 46, 86), (70, 49, 98), (83, 52, 111), (99, 56, 135), + (147, 81, 179), (171, 69, 179), (135, 55, 148), (99, 41, 117), + (89, 46, 111), (79, 52, 105), (51, 44, 86), (43, 39, 72), + (26, 25, 56), (21, 21, 47), (17, 18, 38), (16, 17, 36), + (16, 17, 35), (17, 16, 32), (20, 13, 29), (21, 14, 32), + (26, 15, 32), (35, 17, 43), (47, 20, 54), (60, 23, 66), + (63, 27, 70), (67, 31, 75), (68, 30, 77), (73, 37, 85), + (83, 32, 101), (80, 35, 97), (77, 38, 93), (73, 38, 90), + (70, 38, 88), (57, 32, 72), (53, 28, 58), (44, 25, 55), + (41, 24, 56), (46, 22, 56), (49, 23, 61), (53, 25, 66), + (56, 23, 68), (53, 28, 67), (48, 30, 68), (44, 28, 65), + (43, 29, 64), (41, 33, 70), (40, 38, 77), (41, 35, 73), + (42, 32, 69), (33, 28, 60), (29, 26, 55), (26, 22, 47), + (25, 21, 38), (22, 18, 32), (21, 18, 31), (20, 18, 31), + (20, 20, 30), (20, 18, 31), (19, 17, 31), (18, 17, 31), + (15, 14, 28), (15, 13, 28), (16, 12, 29), (17, 13, 29), + (18, 14, 29), (19, 15, 32), (20, 17, 36), (19, 18, 36), + (17, 16, 34), (16, 15, 33), (17, 16, 33), (19, 18, 34), + (20, 17, 36), (20, 19, 37), (21, 19, 41), (18, 17, 48), + (31, 24, 66), (33, 27, 68), (36, 31, 71), (34, 31, 84), + (37, 29, 70), (32, 25, 66), (26, 18, 57), (19, 19, 45), + (17, 18, 36), (14, 14, 26), (12, 12, 24), (10, 10, 22), + (8, 6, 20), (12, 0, 21), (15, 3, 23), (24, 5, 35), + (29, 17, 41), (30, 19, 43), (32, 22, 46), (34, 22, 46), + (34, 22, 44), (29, 20, 39), (29, 17, 39), (31, 21, 45), + (29, 20, 49), (30, 25, 55), (33, 26, 60), (37, 26, 68), + (39, 28, 70), (41, 33, 72), (42, 35, 76), (48, 28, 77), + (36, 22, 58), (34, 20, 53), (32, 19, 49), (29, 16, 42), + (28, 14, 37), (27, 15, 35), (28, 16, 40), (32, 16, 43), + (31, 19, 43), (29, 21, 42), (23, 19, 42), (25, 21, 44), + (32, 19, 47), (34, 19, 52), (43, 19, 53), (48, 0, 68), + (55, 23, 62), (49, 25, 61), (43, 30, 58), (34, 30, 53), + (32, 28, 53), (31, 21, 45), (26, 17, 34), (23, 14, 31), + (22, 9, 27), (19, 13, 25), (17, 14, 25), (18, 14, 28), + (21, 17, 32), (26, 17, 38), (27, 25, 49), (36, 33, 62), + (44, 37, 78), (58, 43, 86), (80, 46, 106), (97, 56, 122), + (100, 66, 142), (92, 65, 132), (78, 65, 121), (88, 54, 114), + (83, 51, 116), (76, 41, 97), (68, 32, 76), (50, 30, 65), + (42, 27, 56), (31, 22, 49), (23, 21, 42), (20, 19, 37), + (20, 17, 36), (21, 18, 37), (22, 17, 40), (28, 22, 50), + (38, 28, 65), (44, 35, 82), (50, 42, 89), (64, 46, 106), + (74, 48, 113), (74, 57, 128), (82, 70, 136), (83, 75, 126), + (87, 78, 135), (98, 89, 134), (103, 82, 175), (129, 76, 182), + (173, 105, 188), (197, 126, 230), (220, 146, 255), (167, 108, 200), + (138, 88, 177), (105, 85, 156), (112, 74, 133), (97, 51, 124) + ), + +// 639 Serenity +((144, 133, 137), (142, 126, 129), (142, 125, 127), (142, 125, 126), + (139, 119, 119), (137, 113, 113), (133, 108, 108), (129, 103, 104), + (107, 80, 85), (97, 70, 77), (87, 60, 69), (81, 54, 63), + (76, 49, 57), (75, 50, 57), (74, 51, 57), (76, 53, 59), + (78, 56, 61), (88, 72, 77), (92, 78, 85), (96, 85, 93), + (100, 90, 97), (104, 96, 101), (105, 96, 102), (106, 97, 104), + (104, 95, 101), (103, 91, 98), (102, 87, 96), (100, 85, 94), + (99, 84, 92), (99, 84, 92), (100, 84, 92), (103, 87, 95), + (104, 92, 99), (113, 102, 107), (114, 104, 108), (116, 106, 110), + (117, 106, 111), (118, 106, 112), (117, 105, 112), (116, 105, 112), + (114, 102, 109), (114, 101, 108), (114, 100, 108), (117, 100, 108), + (121, 101, 108), (122, 101, 108), (124, 102, 109), (128, 103, 109), + (127, 103, 109), (119, 102, 107), (114, 99, 104), (109, 96, 102), + (102, 90, 97), (96, 85, 92), (94, 82, 89), (92, 79, 86), + (84, 65, 73), (83, 58, 66), (83, 52, 60), (83, 53, 61), + (84, 55, 62), (85, 57, 64), (87, 60, 67), (94, 70, 74), + (98, 78, 81), (107, 89, 91), (105, 87, 90), (103, 86, 90), + (101, 85, 89), (99, 84, 89), (94, 82, 86), (86, 75, 81), + (76, 63, 69), (74, 59, 66), (73, 56, 64), (76, 59, 66), + (79, 63, 69), (85, 68, 75), (91, 73, 81), (105, 86, 92), + (119, 103, 107), (150, 134, 138), (157, 144, 147), (165, 154, 157), + (166, 154, 157), (167, 155, 157), (168, 151, 152), (158, 141, 145), + (145, 125, 127), (138, 117, 120), (131, 109, 114), (129, 108, 113), + (127, 107, 112), (126, 107, 113), (124, 107, 113), (122, 107, 112), + (125, 110, 116), (133, 120, 125), (140, 124, 128), (148, 128, 132), + (151, 131, 134), (155, 134, 136), (163, 138, 141), (169, 145, 146), + (182, 163, 164), (186, 169, 170), (190, 176, 177), (188, 176, 177), + (186, 176, 178), (179, 170, 173), (174, 165, 169), (166, 157, 161), + (157, 147, 151), (148, 132, 137), (145, 128, 133), (143, 125, 130), + (137, 117, 122), (135, 109, 114), (129, 103, 108), (122, 99, 103), + (105, 80, 86), (93, 72, 78), (81, 64, 70), (77, 58, 65), + (73, 53, 60), (66, 44, 52), (60, 39, 48), (59, 37, 46), + (61, 38, 47), (76, 52, 60), (80, 56, 63), (84, 61, 67), + (95, 68, 75), (99, 76, 80), (100, 74, 78), (99, 69, 74), + (76, 55, 59), (67, 46, 52), (58, 38, 45), (53, 36, 43), + (48, 35, 41), (43, 30, 39), (42, 26, 36), (39, 25, 34), + (38, 25, 35), (44, 26, 36), (46, 28, 38), (48, 30, 40), + (51, 35, 44), (59, 40, 49), (68, 49, 57), (73, 57, 64), + (87, 72, 78), (89, 75, 81), (92, 79, 85), (97, 83, 89), + (102, 86, 93), (105, 89, 95), (109, 90, 96), (114, 92, 99), + (117, 96, 102), (122, 104, 112), (125, 108, 115), (128, 113, 119), + (133, 121, 126), (139, 128, 134), (146, 136, 142), (153, 144, 149), + (168, 159, 163), (171, 162, 166), (174, 165, 169), (178, 168, 172), + (182, 169, 171), (182, 168, 170), (177, 161, 164), (172, 152, 154), + (164, 144, 145), (154, 135, 134), (146, 123, 124), (136, 113, 115), + (129, 107, 108), (124, 101, 103), (119, 96, 101), (117, 97, 103), + (124, 109, 115), (127, 113, 119), (130, 117, 124), (138, 126, 132), + (149, 134, 139), (157, 142, 146), (159, 146, 151), (162, 148, 153), + (164, 150, 154), (160, 149, 154), (157, 148, 153), (157, 146, 150), + (155, 144, 148), (153, 143, 148), (155, 145, 149), (156, 146, 150), + (158, 149, 153), (164, 153, 157), (171, 155, 158), (173, 156, 159), + (173, 156, 158), (174, 153, 154), (170, 148, 150), (160, 142, 145), + (151, 135, 139), (145, 129, 131), (136, 123, 126), (128, 116, 122), + (125, 113, 118), (124, 113, 118), (126, 114, 118), (127, 115, 120), + (131, 120, 125), (136, 123, 128), (135, 124, 129), (134, 124, 129), + (134, 124, 129), (131, 121, 126), (129, 119, 125), (130, 119, 124), + (132, 122, 127), (138, 128, 133), (147, 137, 142), (159, 149, 153), + (171, 162, 165), (185, 173, 176), (200, 184, 184), (201, 188, 189), + (198, 185, 188), (195, 178, 179), (183, 169, 171), (170, 158, 162), + (160, 146, 151), (154, 138, 143), (151, 132, 136), (150, 127, 133), + (151, 124, 130), (150, 122, 127), (148, 120, 126), (145, 117, 123), + (141, 115, 120), (137, 114, 117), (132, 109, 113), (128, 105, 110), + (125, 103, 108), (123, 101, 107), (123, 104, 110), (125, 108, 115), + (132, 118, 124), (136, 125, 130), (134, 123, 128), (140, 128, 132) + ), + +// 640 Serpent +((36, 70, 44), (26, 82, 55), (26, 80, 55), (27, 79, 56), + (21, 70, 51), (16, 62, 46), (17, 56, 41), (18, 50, 37), + (11, 34, 23), (10, 35, 18), (10, 37, 14), (10, 45, 19), + (10, 54, 24), (10, 62, 31), (10, 70, 38), (9, 68, 38), + (9, 66, 39), (17, 51, 31), (19, 44, 22), (22, 37, 14), + (39, 43, 12), (57, 49, 10), (66, 57, 8), (76, 65, 7), + (107, 73, 5), (101, 69, 2), (96, 66, 0), (77, 49, 1), + (59, 32, 3), (49, 25, 1), (40, 18, 0), (31, 15, 2), + (31, 13, 3), (66, 26, 2), (79, 41, 7), (93, 56, 12), + (95, 66, 25), (98, 77, 38), (88, 81, 45), (78, 85, 52), + (48, 87, 73), (45, 81, 73), (42, 76, 74), (56, 77, 65), + (70, 79, 56), (79, 77, 53), (89, 75, 50), (97, 77, 45), + (92, 80, 45), (75, 91, 58), (55, 83, 57), (35, 76, 57), + (31, 66, 47), (27, 57, 37), (25, 52, 31), (24, 48, 25), + (25, 31, 7), (33, 35, 11), (41, 39, 15), (57, 59, 31), + (73, 80, 47), (86, 94, 54), (99, 108, 62), (125, 117, 62), + (140, 132, 71), (174, 149, 76), (174, 141, 68), (175, 134, 60), + (176, 133, 56), (177, 132, 53), (180, 127, 43), (185, 129, 35), + (196, 131, 20), (192, 131, 20), (189, 132, 20), (178, 125, 20), + (168, 118, 21), (159, 110, 20), (151, 103, 20), (132, 85, 24), + (110, 71, 16), (69, 42, 10), (63, 41, 6), (57, 41, 2), + (63, 43, 3), (70, 45, 4), (89, 53, 7), (104, 68, 11), + (153, 91, 12), (150, 96, 16), (147, 102, 21), (141, 98, 21), + (135, 94, 22), (111, 86, 26), (86, 74, 34), (62, 60, 40), + (41, 47, 41), (13, 32, 31), (9, 23, 26), (5, 15, 21), + (4, 15, 15), (4, 16, 10), (4, 15, 8), (5, 14, 9), + (7, 16, 8), (7, 15, 7), (7, 15, 6), (7, 14, 5), + (7, 13, 4), (5, 9, 2), (3, 6, 1), (3, 4, 2), + (3, 5, 3), (6, 12, 8), (8, 18, 11), (11, 25, 14), + (17, 39, 23), (20, 48, 30), (28, 58, 35), (39, 65, 37), + (49, 65, 34), (56, 61, 29), (64, 57, 25), (69, 55, 26), + (74, 53, 28), (85, 56, 30), (93, 65, 26), (107, 70, 26), + (118, 71, 25), (117, 77, 11), (109, 74, 12), (102, 71, 14), + (90, 61, 10), (70, 50, 7), (49, 43, 13), (36, 37, 13), + (19, 29, 11), (16, 27, 11), (13, 26, 11), (13, 25, 11), + (14, 24, 11), (18, 23, 10), (20, 20, 7), (25, 20, 4), + (38, 25, 3), (84, 44, 2), (92, 52, 3), (101, 60, 5), + (128, 76, 6), (152, 96, 12), (163, 114, 25), (172, 132, 35), + (201, 181, 68), (205, 184, 75), (210, 187, 82), (198, 183, 82), + (206, 194, 83), (209, 182, 78), (190, 154, 62), (183, 142, 49), + (178, 125, 44), (165, 102, 25), (160, 94, 30), (155, 87, 35), + (142, 70, 36), (118, 64, 27), (96, 59, 35), (81, 52, 44), + (43, 63, 46), (40, 66, 49), (38, 69, 53), (41, 73, 50), + (53, 78, 45), (71, 91, 47), (91, 100, 50), (115, 107, 52), + (139, 123, 56), (160, 142, 71), (179, 161, 97), (179, 171, 107), + (178, 173, 98), (192, 174, 99), (174, 165, 96), (156, 151, 70), + (152, 115, 35), (146, 107, 28), (141, 100, 22), (139, 89, 16), + (140, 82, 13), (131, 70, 10), (112, 58, 10), (98, 48, 9), + (87, 42, 10), (73, 40, 11), (68, 42, 13), (82, 55, 15), + (105, 75, 17), (121, 86, 25), (146, 105, 27), (168, 122, 28), + (150, 114, 36), (131, 106, 40), (114, 100, 45), (83, 92, 50), + (53, 78, 49), (40, 66, 51), (40, 62, 49), (37, 58, 43), + (37, 51, 35), (40, 43, 27), (39, 38, 24), (33, 33, 20), + (30, 27, 14), (23, 23, 11), (17, 18, 8), (14, 14, 5), + (8, 14, 4), (5, 14, 2), (5, 14, 0), (4, 17, 1), + (5, 17, 2), (7, 17, 4), (9, 20, 6), (9, 21, 7), + (9, 21, 8), (9, 20, 9), (10, 18, 7), (10, 14, 4), + (13, 10, 4), (16, 11, 5), (21, 18, 8), (25, 27, 15), + (27, 40, 26), (29, 54, 34), (30, 64, 40), (27, 68, 43), + (27, 62, 42), (30, 55, 35), (32, 51, 26), (36, 45, 25), + (38, 44, 24), (39, 45, 21), (37, 49, 25), (35, 49, 24), + (37, 42, 22), (40, 44, 24), (44, 43, 21), (48, 38, 20), + (53, 41, 18), (56, 43, 16), (52, 45, 18), (49, 49, 18), + (48, 49, 18), (44, 51, 22), (38, 59, 30), (36, 67, 36) + ), + +// 641 Sharp +((42, 214, 25), (29, 205, 17), (28, 201, 20), (27, 197, 23), + (27, 194, 34), (28, 192, 45), (26, 186, 52), (25, 181, 59), + (19, 151, 71), (14, 130, 67), (9, 109, 63), (6, 94, 57), + (3, 80, 52), (2, 66, 59), (2, 52, 66), (3, 47, 68), + (5, 42, 71), (19, 32, 71), (30, 45, 73), (42, 58, 75), + (48, 68, 84), (54, 79, 94), (53, 80, 101), (52, 81, 109), + (55, 92, 133), (61, 108, 142), (68, 125, 151), (71, 143, 155), + (74, 162, 160), (69, 166, 159), (65, 170, 158), (54, 166, 152), + (41, 162, 142), (26, 152, 107), (23, 159, 89), (21, 166, 71), + (17, 168, 57), (14, 171, 43), (15, 172, 40), (17, 174, 37), + (43, 179, 30), (62, 184, 29), (81, 190, 28), (99, 194, 31), + (117, 199, 35), (127, 203, 38), (138, 207, 41), (146, 211, 47), + (167, 212, 49), (196, 194, 44), (194, 178, 39), (193, 163, 34), + (179, 148, 32), (165, 133, 30), (156, 126, 30), (147, 119, 31), + (118, 83, 19), (100, 67, 12), (82, 51, 6), (61, 42, 5), + (41, 34, 5), (31, 31, 5), (22, 28, 5), (9, 25, 3), + (2, 22, 3), (0, 15, 1), (0, 26, 2), (0, 37, 3), + (0, 43, 3), (0, 50, 4), (0, 62, 5), (0, 73, 6), + (0, 82, 6), (0, 86, 6), (0, 90, 7), (0, 102, 9), + (0, 114, 12), (0, 118, 19), (0, 122, 26), (0, 128, 45), + (2, 131, 64), (3, 113, 95), (4, 105, 93), (5, 98, 92), + (5, 93, 90), (5, 89, 88), (4, 78, 87), (6, 67, 87), + (10, 42, 99), (14, 37, 95), (19, 32, 91), (19, 33, 82), + (20, 35, 74), (18, 42, 55), (17, 51, 36), (14, 57, 22), + (11, 64, 14), (15, 81, 17), (19, 85, 20), (24, 89, 23), + (24, 89, 23), (24, 89, 23), (22, 87, 22), (16, 84, 18), + (7, 78, 15), (9, 72, 16), (12, 66, 17), (12, 64, 17), + (13, 63, 17), (13, 60, 17), (13, 54, 16), (12, 44, 13), + (6, 38, 8), (1, 26, 4), (1, 25, 3), (1, 24, 2), + (1, 26, 2), (1, 30, 2), (1, 32, 3), (2, 34, 4), + (8, 30, 13), (14, 29, 18), (20, 29, 24), (21, 33, 25), + (23, 38, 27), (22, 50, 28), (21, 62, 27), (19, 74, 24), + (18, 85, 24), (21, 104, 27), (23, 109, 28), (25, 115, 30), + (25, 125, 30), (23, 132, 28), (21, 136, 22), (24, 138, 17), + (46, 122, 8), (65, 116, 8), (85, 110, 8), (94, 110, 7), + (104, 110, 7), (117, 110, 7), (134, 110, 8), (149, 101, 11), + (168, 90, 10), (184, 77, 20), (185, 76, 21), (187, 75, 23), + (182, 77, 25), (173, 83, 26), (158, 84, 30), (146, 76, 27), + (115, 59, 28), (105, 57, 29), (96, 55, 31), (76, 60, 32), + (58, 69, 32), (41, 80, 34), (27, 87, 30), (21, 90, 26), + (15, 90, 20), (7, 100, 15), (6, 104, 14), (5, 108, 13), + (4, 119, 12), (3, 130, 11), (3, 140, 10), (1, 140, 7), + (0, 122, 5), (1, 115, 4), (2, 109, 4), (7, 98, 3), + (15, 90, 3), (28, 84, 2), (46, 82, 1), (66, 85, 1), + (84, 87, 1), (102, 88, 2), (120, 87, 2), (136, 91, 3), + (152, 94, 2), (164, 93, 3), (174, 98, 7), (177, 110, 12), + (171, 130, 17), (164, 136, 18), (157, 142, 19), (145, 153, 19), + (130, 155, 16), (114, 151, 15), (92, 148, 17), (77, 147, 20), + (57, 143, 21), (37, 139, 21), (21, 135, 21), (12, 128, 16), + (7, 117, 11), (1, 104, 7), (0, 91, 6), (0, 80, 5), + (0, 72, 5), (0, 62, 4), (0, 50, 3), (0, 39, 2), + (0, 28, 1), (1, 21, 1), (1, 22, 0), (1, 29, 1), + (1, 41, 2), (1, 54, 3), (2, 67, 7), (3, 80, 12), + (10, 94, 18), (17, 109, 24), (21, 128, 39), (28, 148, 60), + (35, 165, 77), (35, 175, 93), (29, 182, 110), (32, 186, 123), + (36, 182, 130), (33, 175, 139), (31, 168, 156), (39, 157, 162), + (37, 143, 159), (27, 125, 158), (23, 110, 150), (20, 94, 135), + (13, 76, 114), (5, 61, 104), (7, 47, 92), (11, 36, 76), + (19, 31, 62), (32, 26, 47), (51, 28, 31), (72, 36, 14), + (90, 46, 7), (97, 52, 10), (100, 66, 18), (105, 83, 34), + (111, 97, 55), (123, 112, 76), (141, 132, 96), (166, 151, 100), + (170, 158, 98), (166, 172, 97), (152, 183, 93), (130, 186, 93), + (105, 186, 95), (88, 192, 110), (90, 196, 113), (86, 196, 106), + (87, 201, 97), (83, 210, 77), (74, 213, 57), (58, 213, 36) + ), + +// 642 Shy_Violets +((98, 90, 82), (65, 71, 48), (60, 64, 47), (55, 57, 47), + (60, 46, 53), (65, 36, 59), (69, 33, 64), (74, 30, 70), + (84, 26, 80), (80, 38, 75), (76, 51, 70), (74, 61, 63), + (73, 72, 56), (72, 75, 56), (72, 78, 57), (72, 80, 62), + (73, 82, 68), (87, 83, 105), (96, 76, 116), (105, 70, 128), + (103, 69, 131), (101, 69, 135), (97, 72, 135), (94, 75, 136), + (77, 97, 98), (60, 105, 80), (43, 113, 63), (37, 125, 50), + (32, 138, 38), (28, 147, 32), (24, 156, 26), (17, 161, 27), + (18, 170, 28), (44, 160, 19), (50, 150, 27), (57, 140, 36), + (72, 120, 46), (87, 100, 56), (92, 89, 61), (97, 78, 66), + (99, 51, 96), (96, 45, 111), (93, 39, 126), (86, 40, 126), + (79, 41, 126), (75, 42, 124), (72, 43, 123), (73, 41, 123), + (78, 44, 116), (72, 41, 96), (75, 37, 90), (79, 34, 85), + (76, 30, 81), (73, 27, 77), (67, 26, 77), (61, 26, 77), + (45, 27, 71), (37, 36, 63), (30, 45, 55), (23, 60, 49), + (16, 76, 43), (16, 86, 39), (16, 97, 35), (11, 108, 35), + (13, 109, 35), (15, 89, 52), (14, 74, 63), (14, 60, 75), + (16, 51, 80), (19, 42, 86), (28, 28, 93), (31, 20, 94), + (46, 22, 93), (52, 29, 89), (58, 37, 85), (58, 47, 72), + (58, 57, 60), (55, 64, 58), (53, 71, 56), (46, 83, 52), + (46, 90, 41), (44, 95, 35), (53, 92, 45), (63, 89, 55), + (73, 82, 60), (83, 76, 66), (102, 62, 80), (115, 49, 90), + (129, 32, 101), (129, 24, 102), (129, 17, 104), (123, 16, 105), + (117, 16, 106), (99, 12, 97), (76, 11, 90), (63, 23, 76), + (56, 44, 64), (51, 73, 46), (50, 80, 44), (49, 87, 42), + (56, 90, 43), (64, 93, 44), (69, 85, 54), (74, 75, 71), + (86, 63, 123), (105, 67, 140), (124, 72, 157), (128, 75, 158), + (132, 79, 159), (139, 86, 170), (143, 99, 155), (140, 111, 139), + (128, 120, 112), (100, 107, 77), (88, 103, 69), (77, 99, 61), + (60, 93, 49), (55, 80, 49), (58, 64, 53), (64, 49, 61), + (88, 19, 74), (100, 12, 76), (113, 5, 78), (116, 6, 78), + (119, 7, 78), (117, 12, 73), (123, 30, 68), (119, 53, 55), + (114, 71, 46), (99, 79, 43), (95, 81, 43), (91, 84, 44), + (84, 89, 45), (77, 82, 51), (66, 63, 66), (54, 42, 81), + (37, 18, 94), (26, 14, 94), (15, 10, 94), (11, 9, 92), + (7, 8, 91), (7, 5, 92), (14, 4, 92), (28, 6, 92), + (42, 10, 91), (69, 8, 102), (79, 8, 107), (90, 9, 113), + (109, 12, 123), (124, 13, 131), (127, 16, 138), (128, 20, 140), + (123, 27, 131), (122, 27, 126), (121, 28, 122), (119, 31, 109), + (109, 31, 94), (106, 27, 84), (107, 22, 81), (112, 21, 80), + (108, 18, 85), (102, 7, 104), (100, 7, 106), (99, 8, 108), + (91, 11, 112), (86, 11, 113), (84, 9, 113), (84, 10, 108), + (76, 8, 98), (77, 7, 96), (78, 6, 95), (82, 9, 94), + (84, 11, 97), (85, 13, 102), (90, 14, 107), (99, 20, 116), + (113, 32, 134), (129, 43, 153), (142, 57, 170), (156, 69, 181), + (171, 90, 195), (185, 108, 207), (198, 123, 217), (202, 130, 221), + (199, 141, 217), (199, 139, 215), (199, 137, 214), (195, 125, 214), + (189, 112, 213), (176, 101, 208), (164, 89, 198), (148, 75, 187), + (138, 60, 181), (129, 50, 171), (123, 43, 165), (115, 35, 157), + (113, 30, 155), (119, 28, 152), (127, 27, 158), (135, 28, 163), + (144, 30, 167), (156, 41, 173), (168, 50, 181), (177, 55, 180), + (183, 52, 171), (185, 48, 162), (188, 52, 160), (179, 51, 151), + (170, 47, 138), (159, 35, 121), (157, 36, 114), (154, 43, 115), + (148, 46, 119), (138, 45, 122), (124, 45, 123), (122, 52, 130), + (117, 51, 134), (109, 47, 137), (89, 39, 130), (76, 39, 122), + (63, 36, 110), (53, 36, 100), (46, 30, 89), (49, 37, 83), + (42, 38, 90), (32, 35, 96), (21, 25, 98), (26, 27, 94), + (22, 28, 104), (25, 22, 113), (25, 17, 115), (31, 27, 102), + (27, 46, 89), (27, 63, 75), (30, 79, 66), (38, 95, 58), + (47, 103, 56), (61, 106, 56), (80, 105, 70), (101, 110, 85), + (126, 105, 106), (153, 94, 125), (174, 85, 154), (191, 94, 175), + (200, 108, 196), (204, 116, 204), (200, 121, 209), (202, 127, 209), + (206, 136, 213), (207, 138, 211), (201, 138, 206), (198, 127, 194), + (187, 116, 178), (167, 106, 156), (139, 108, 131), (117, 101, 106) + ), + +// 643 Singe +((210, 164, 86), (236, 200, 106), (227, 187, 98), (219, 175, 91), + (190, 140, 75), (161, 106, 59), (148, 90, 50), (136, 74, 42), + (76, 21, 20), (66, 13, 11), (57, 6, 3), (54, 3, 1), + (52, 1, 0), (52, 1, 0), (52, 1, 0), (52, 1, 0), + (52, 1, 0), (67, 13, 13), (88, 33, 19), (110, 53, 26), + (145, 79, 44), (180, 106, 63), (191, 125, 72), (203, 144, 82), + (245, 180, 106), (249, 194, 122), (253, 209, 138), (254, 215, 140), + (255, 222, 142), (254, 221, 140), (254, 220, 139), (254, 222, 132), + (253, 217, 127), (227, 182, 104), (217, 170, 86), (208, 158, 69), + (199, 146, 63), (191, 134, 58), (193, 136, 56), (195, 139, 55), + (219, 168, 74), (216, 168, 78), (213, 169, 83), (208, 162, 78), + (204, 156, 74), (191, 142, 68), (178, 129, 62), (150, 98, 45), + (127, 68, 33), (84, 26, 7), (72, 13, 3), (60, 0, 0), + (56, 0, 0), (52, 1, 0), (52, 1, 0), (52, 1, 0), + (52, 1, 0), (52, 1, 0), (52, 1, 0), (52, 1, 0), + (52, 1, 0), (52, 1, 0), (52, 1, 0), (52, 1, 0), + (52, 1, 0), (52, 1, 0), (52, 1, 0), (52, 1, 0), + (52, 0, 0), (52, 0, 0), (54, 0, 0), (57, 0, 0), + (66, 1, 1), (69, 3, 1), (72, 6, 1), (72, 5, 1), + (72, 4, 1), (69, 5, 1), (67, 6, 1), (62, 3, 0), + (59, 0, 1), (52, 0, 0), (52, 0, 0), (52, 1, 0), + (52, 1, 0), (52, 1, 0), (52, 1, 0), (52, 1, 0), + (52, 1, 0), (51, 1, 0), (51, 1, 0), (49, 1, 0), + (48, 1, 0), (45, 0, 0), (44, 1, 0), (39, 2, 0), + (35, 1, 0), (35, 2, 0), (38, 1, 0), (41, 0, 0), + (42, 0, 0), (44, 0, 0), (47, 0, 0), (50, 1, 0), + (52, 1, 0), (52, 1, 0), (52, 1, 0), (52, 1, 0), + (52, 1, 0), (52, 1, 0), (52, 1, 0), (52, 1, 0), + (52, 1, 0), (52, 1, 0), (52, 1, 0), (52, 1, 0), + (52, 1, 0), (52, 1, 0), (52, 1, 0), (52, 1, 0), + (52, 1, 0), (54, 1, 0), (56, 1, 0), (59, 6, 0), + (62, 11, 0), (75, 20, 0), (93, 29, 0), (112, 52, 8), + (149, 71, 20), (202, 111, 41), (215, 118, 47), (228, 125, 54), + (242, 139, 65), (234, 147, 75), (232, 152, 76), (216, 144, 69), + (176, 119, 57), (149, 86, 41), (123, 53, 26), (112, 46, 21), + (102, 40, 16), (77, 18, 8), (63, 1, 3), (57, 0, 1), + (53, 0, 0), (52, 1, 0), (52, 1, 0), (52, 1, 0), + (52, 1, 0), (52, 1, 0), (52, 1, 0), (52, 1, 0), + (52, 1, 0), (52, 1, 0), (52, 1, 0), (52, 1, 0), + (52, 1, 0), (52, 1, 0), (52, 1, 0), (52, 1, 0), + (52, 1, 0), (52, 1, 0), (52, 1, 0), (52, 1, 0), + (52, 1, 0), (52, 1, 0), (52, 1, 0), (52, 1, 0), + (52, 1, 0), (52, 1, 0), (52, 1, 0), (52, 1, 0), + (52, 1, 0), (52, 1, 0), (52, 1, 0), (52, 1, 0), + (52, 1, 0), (51, 1, 0), (49, 1, 2), (48, 1, 4), + (46, 1, 3), (42, 2, 3), (40, 0, 4), (42, 1, 2), + (44, 0, 0), (46, 0, 0), (48, 0, 0), (51, 1, 0), + (52, 1, 0), (52, 1, 0), (52, 1, 0), (52, 1, 0), + (52, 1, 0), (52, 1, 0), (52, 1, 0), (52, 1, 0), + (52, 1, 0), (51, 0, 0), (51, 0, 0), (51, 0, 0), + (51, 0, 0), (51, 0, 0), (51, 0, 0), (51, 0, 0), + (51, 0, 0), (52, 1, 0), (52, 1, 0), (52, 3, 0), + (57, 5, 0), (63, 13, 1), (71, 23, 4), (92, 37, 12), + (111, 53, 18), (120, 66, 14), (137, 78, 14), (142, 77, 23), + (129, 66, 15), (118, 53, 2), (105, 41, 5), (84, 20, 5), + (71, 8, 1), (67, 5, 3), (63, 0, 2), (58, 1, 1), + (57, 1, 3), (57, 0, 2), (55, 0, 0), (52, 0, 0), + (52, 1, 0), (52, 1, 0), (52, 1, 0), (52, 1, 0), + (52, 1, 0), (52, 1, 0), (52, 1, 0), (52, 1, 0), + (52, 1, 0), (52, 1, 0), (52, 1, 0), (52, 1, 0), + (52, 1, 0), (52, 1, 0), (52, 1, 0), (52, 1, 0), + (52, 1, 0), (52, 1, 0), (52, 1, 0), (52, 0, 0), + (53, 0, 0), (55, 2, 0), (62, 7, 0), (74, 19, 2), + (95, 37, 12), (121, 65, 27), (151, 99, 43), (185, 131, 63) + ), + +// 644 Slate +((72, 72, 92), (81, 81, 100), (83, 83, 103), (85, 85, 106), + (83, 83, 103), (82, 81, 100), (80, 79, 97), (78, 78, 95), + (74, 71, 88), (72, 69, 86), (71, 67, 84), (70, 67, 83), + (70, 67, 82), (69, 67, 83), (68, 67, 84), (67, 67, 84), + (67, 68, 84), (70, 70, 85), (70, 72, 87), (71, 74, 89), + (71, 76, 93), (72, 78, 97), (73, 78, 98), (74, 79, 99), + (74, 82, 103), (74, 82, 103), (74, 82, 103), (73, 81, 103), + (72, 81, 103), (71, 79, 102), (71, 78, 101), (70, 77, 101), + (68, 75, 100), (61, 70, 100), (58, 67, 98), (56, 64, 96), + (52, 61, 92), (49, 59, 88), (47, 57, 87), (46, 56, 86), + (45, 53, 84), (44, 53, 84), (44, 53, 85), (44, 54, 85), + (44, 55, 86), (44, 55, 87), (44, 55, 89), (44, 56, 90), + (44, 56, 90), (41, 55, 92), (39, 53, 92), (38, 52, 92), + (37, 51, 91), (37, 50, 90), (37, 49, 89), (37, 49, 89), + (37, 48, 88), (37, 47, 86), (38, 46, 84), (38, 46, 82), + (39, 46, 81), (40, 45, 80), (41, 45, 79), (41, 45, 79), + (41, 45, 78), (41, 45, 77), (40, 44, 76), (39, 44, 75), + (38, 43, 75), (37, 42, 75), (35, 41, 74), (34, 39, 72), + (35, 38, 68), (35, 38, 67), (35, 38, 66), (36, 38, 64), + (38, 38, 63), (38, 38, 61), (39, 38, 60), (41, 37, 57), + (41, 37, 56), (44, 37, 53), (44, 36, 52), (45, 35, 52), + (45, 35, 52), (46, 35, 52), (48, 35, 52), (50, 37, 52), + (55, 41, 55), (58, 45, 59), (61, 49, 63), (64, 52, 65), + (67, 55, 67), (72, 60, 72), (79, 67, 77), (84, 71, 81), + (88, 75, 84), (96, 82, 84), (98, 84, 83), (100, 86, 82), + (100, 86, 81), (101, 86, 81), (103, 86, 81), (104, 86, 79), + (103, 84, 79), (102, 82, 78), (101, 81, 78), (100, 80, 78), + (100, 79, 78), (97, 78, 79), (97, 77, 81), (96, 75, 82), + (96, 77, 85), (99, 79, 92), (101, 82, 94), (103, 85, 96), + (106, 89, 101), (110, 93, 104), (117, 100, 108), (124, 108, 112), + (136, 119, 121), (137, 121, 123), (139, 124, 125), (139, 123, 125), + (139, 122, 126), (136, 121, 124), (133, 118, 121), (129, 114, 115), + (125, 108, 111), (115, 99, 101), (113, 97, 100), (111, 95, 99), + (106, 89, 96), (103, 86, 95), (99, 84, 95), (96, 79, 93), + (93, 79, 93), (94, 80, 93), (96, 82, 93), (96, 83, 93), + (97, 84, 93), (99, 85, 93), (100, 86, 95), (101, 86, 95), + (101, 86, 93), (100, 86, 93), (99, 85, 92), (99, 85, 92), + (99, 84, 90), (96, 82, 89), (93, 79, 88), (89, 77, 84), + (77, 66, 77), (73, 62, 74), (70, 59, 71), (61, 52, 67), + (56, 46, 61), (52, 42, 57), (48, 39, 55), (45, 38, 53), + (45, 37, 53), (42, 35, 55), (41, 34, 55), (41, 34, 55), + (39, 34, 56), (38, 32, 57), (38, 32, 57), (38, 32, 57), + (38, 32, 59), (38, 33, 59), (38, 34, 59), (38, 34, 60), + (38, 34, 60), (38, 34, 61), (39, 35, 61), (39, 35, 63), + (38, 35, 63), (38, 37, 64), (38, 37, 64), (39, 38, 64), + (39, 38, 66), (41, 39, 64), (42, 39, 66), (42, 39, 66), + (42, 38, 64), (41, 38, 63), (41, 38, 63), (42, 37, 61), + (42, 37, 60), (44, 37, 60), (44, 35, 59), (44, 35, 57), + (44, 35, 57), (44, 35, 56), (44, 34, 56), (44, 34, 55), + (44, 34, 55), (44, 32, 55), (44, 32, 53), (44, 32, 52), + (45, 32, 52), (44, 31, 50), (44, 31, 50), (44, 30, 50), + (42, 30, 49), (42, 28, 49), (44, 30, 48), (45, 30, 48), + (46, 31, 48), (48, 31, 48), (49, 32, 49), (49, 34, 50), + (49, 35, 52), (49, 35, 53), (48, 37, 55), (48, 37, 57), + (46, 38, 59), (46, 39, 60), (48, 41, 61), (48, 42, 63), + (48, 42, 64), (48, 44, 66), (49, 45, 67), (49, 45, 70), + (49, 48, 72), (50, 49, 74), (53, 52, 78), (57, 56, 82), + (60, 61, 88), (64, 66, 93), (66, 68, 97), (67, 71, 99), + (67, 72, 100), (68, 72, 101), (67, 72, 101), (67, 72, 103), + (68, 72, 103), (68, 74, 103), (67, 72, 103), (67, 72, 103), + (64, 71, 101), (63, 71, 100), (61, 68, 99), (60, 67, 96), + (57, 63, 93), (55, 61, 90), (55, 60, 89), (55, 60, 89), + (55, 60, 89), (56, 60, 89), (56, 61, 90), (57, 61, 90), + (59, 63, 89), (60, 63, 90), (64, 66, 89), (68, 68, 90) + ), + +// 645 Slightly_Messy +((81, 121, 23), (87, 118, 22), (89, 115, 22), (92, 113, 23), + (93, 110, 23), (95, 107, 23), (96, 105, 23), (97, 104, 24), + (102, 98, 25), (107, 96, 25), (113, 95, 25), (119, 95, 24), + (126, 96, 24), (133, 96, 22), (140, 97, 21), (142, 97, 20), + (145, 97, 19), (153, 100, 17), (154, 100, 14), (156, 101, 12), + (157, 100, 9), (158, 100, 7), (157, 99, 6), (157, 99, 5), + (152, 99, 3), (148, 100, 4), (145, 102, 5), (144, 103, 10), + (143, 104, 16), (142, 104, 19), (142, 104, 22), (141, 106, 29), + (139, 108, 38), (122, 118, 62), (112, 118, 74), (102, 119, 87), + (92, 115, 94), (83, 112, 101), (77, 111, 103), (71, 110, 106), + (43, 102, 111), (34, 94, 108), (25, 86, 106), (19, 78, 101), + (13, 70, 97), (11, 66, 95), (9, 62, 93), (6, 54, 90), + (3, 47, 88), (2, 36, 86), (6, 33, 88), (10, 31, 90), + (16, 32, 94), (23, 34, 98), (27, 35, 100), (32, 36, 102), + (59, 43, 110), (73, 51, 111), (88, 59, 113), (102, 72, 111), + (116, 85, 110), (122, 92, 109), (129, 100, 108), (142, 112, 107), + (154, 122, 101), (170, 141, 90), (173, 153, 87), (177, 165, 84), + (176, 169, 83), (176, 173, 82), (174, 174, 80), (170, 172, 78), + (160, 163, 74), (151, 158, 73), (143, 153, 72), (130, 144, 72), + (118, 136, 72), (111, 128, 73), (105, 121, 74), (93, 106, 75), + (81, 90, 77), (58, 63, 76), (47, 51, 75), (36, 40, 75), + (32, 35, 74), (28, 30, 73), (24, 21, 68), (21, 15, 62), + (19, 7, 53), (19, 6, 51), (19, 6, 50), (18, 6, 49), + (18, 7, 49), (19, 8, 49), (20, 11, 50), (22, 15, 52), + (25, 22, 53), (37, 39, 55), (47, 46, 56), (57, 54, 58), + (62, 58, 58), (67, 62, 59), (79, 72, 57), (92, 81, 53), + (117, 94, 45), (125, 95, 42), (133, 96, 40), (135, 95, 38), + (138, 94, 37), (141, 91, 35), (143, 86, 34), (142, 80, 36), + (139, 74, 42), (124, 60, 60), (118, 55, 65), (112, 51, 70), + (98, 44, 80), (85, 40, 90), (73, 38, 101), (62, 39, 111), + (43, 43, 128), (37, 47, 132), (32, 52, 137), (31, 56, 137), + (31, 60, 138), (32, 67, 136), (35, 75, 131), (38, 81, 124), + (41, 85, 115), (54, 89, 95), (56, 89, 90), (59, 90, 85), + (63, 89, 73), (64, 87, 60), (65, 85, 48), (66, 80, 39), + (68, 69, 29), (66, 63, 25), (65, 57, 21), (63, 54, 19), + (62, 52, 18), (58, 48, 17), (56, 45, 16), (55, 41, 16), + (55, 37, 17), (55, 29, 22), (54, 27, 23), (54, 26, 25), + (53, 25, 28), (52, 24, 30), (51, 21, 32), (49, 19, 34), + (46, 13, 40), (45, 12, 41), (44, 11, 42), (41, 9, 44), + (40, 9, 45), (39, 8, 46), (37, 7, 48), (36, 6, 50), + (34, 6, 54), (33, 11, 64), (34, 13, 66), (35, 16, 68), + (37, 23, 73), (39, 33, 77), (40, 43, 80), (40, 54, 85), + (41, 74, 97), (41, 79, 99), (42, 84, 102), (43, 94, 102), + (43, 101, 101), (43, 106, 97), (41, 106, 92), (38, 103, 88), + (35, 99, 84), (33, 94, 78), (31, 89, 71), (31, 83, 64), + (31, 76, 57), (34, 68, 50), (36, 60, 46), (40, 54, 43), + (44, 57, 43), (46, 59, 43), (48, 61, 44), (52, 67, 46), + (58, 71, 47), (64, 79, 48), (67, 87, 50), (68, 96, 52), + (66, 103, 53), (65, 107, 53), (64, 110, 53), (65, 110, 53), + (66, 108, 51), (68, 104, 49), (70, 97, 46), (70, 89, 42), + (69, 80, 37), (69, 72, 32), (70, 65, 28), (73, 56, 24), + (75, 46, 20), (77, 36, 16), (78, 27, 13), (79, 21, 10), + (82, 17, 7), (84, 16, 7), (87, 16, 7), (90, 18, 9), + (91, 20, 11), (93, 22, 15), (94, 23, 21), (94, 24, 29), + (94, 26, 38), (93, 30, 48), (91, 33, 57), (87, 36, 67), + (82, 38, 76), (76, 40, 84), (70, 43, 90), (64, 47, 93), + (59, 52, 95), (54, 57, 95), (48, 64, 91), (45, 71, 85), + (43, 77, 75), (43, 82, 65), (46, 86, 55), (48, 90, 45), + (52, 94, 36), (58, 99, 27), (65, 104, 19), (72, 107, 12), + (78, 109, 8), (81, 110, 7), (83, 109, 9), (83, 109, 11), + (82, 109, 14), (81, 109, 16), (80, 110, 18), (79, 110, 21), + (76, 109, 23), (72, 109, 25), (67, 110, 27), (61, 110, 27), + (58, 112, 28), (57, 113, 27), (59, 115, 27), (63, 116, 27), + (67, 117, 26), (70, 119, 26), (74, 120, 25), (77, 121, 24) + ), + +// 646 Smog +((47, 52, 45), (48, 51, 45), (48, 50, 45), (48, 50, 45), + (48, 49, 45), (48, 49, 45), (48, 48, 45), (48, 48, 46), + (48, 47, 45), (46, 46, 44), (45, 45, 44), (43, 43, 42), + (42, 42, 41), (40, 41, 39), (38, 40, 38), (37, 39, 37), + (36, 38, 37), (33, 36, 34), (33, 36, 34), (33, 37, 34), + (36, 39, 36), (39, 42, 39), (42, 45, 42), (46, 49, 45), + (65, 67, 60), (74, 75, 68), (83, 84, 77), (94, 93, 86), + (106, 102, 95), (113, 107, 100), (120, 113, 106), (132, 123, 116), + (140, 129, 123), (141, 127, 123), (139, 123, 121), (137, 119, 119), + (133, 115, 116), (130, 112, 113), (125, 108, 109), (121, 105, 105), + (95, 84, 84), (85, 77, 76), (76, 70, 69), (70, 66, 64), + (64, 62, 59), (61, 60, 56), (58, 58, 54), (53, 54, 50), + (49, 51, 47), (46, 48, 45), (46, 48, 45), (46, 48, 45), + (46, 47, 45), (46, 46, 45), (46, 45, 44), (46, 45, 44), + (44, 45, 43), (43, 44, 42), (42, 44, 41), (41, 43, 40), + (40, 42, 40), (40, 42, 39), (40, 42, 39), (40, 43, 40), + (41, 45, 41), (47, 52, 45), (52, 56, 50), (57, 61, 55), + (59, 64, 57), (62, 67, 60), (68, 73, 65), (72, 78, 69), + (80, 89, 78), (83, 92, 81), (86, 96, 84), (84, 95, 83), + (83, 94, 82), (81, 92, 80), (79, 91, 79), (75, 87, 75), + (71, 83, 72), (68, 78, 68), (67, 75, 66), (66, 73, 64), + (65, 72, 63), (65, 71, 63), (66, 70, 63), (68, 72, 64), + (74, 76, 68), (75, 76, 69), (76, 77, 70), (75, 76, 69), + (75, 75, 69), (72, 74, 68), (70, 73, 66), (67, 71, 64), + (65, 70, 63), (58, 64, 59), (55, 62, 57), (52, 61, 55), + (51, 61, 54), (51, 61, 54), (51, 61, 54), (52, 61, 54), + (54, 64, 56), (55, 65, 57), (57, 67, 58), (58, 67, 58), + (59, 67, 59), (60, 68, 60), (62, 67, 60), (62, 67, 60), + (62, 67, 60), (61, 65, 58), (60, 64, 57), (59, 63, 56), + (57, 60, 54), (55, 57, 52), (54, 56, 50), (52, 55, 49), + (49, 53, 47), (48, 52, 46), (47, 51, 45), (47, 51, 44), + (47, 51, 44), (47, 51, 44), (47, 52, 44), (47, 52, 45), + (47, 52, 45), (48, 51, 45), (48, 51, 45), (48, 51, 45), + (48, 50, 45), (48, 49, 45), (48, 49, 45), (48, 48, 46), + (48, 47, 45), (46, 46, 44), (45, 45, 44), (44, 44, 43), + (43, 44, 42), (42, 42, 41), (40, 41, 40), (38, 40, 38), + (36, 38, 37), (33, 36, 34), (33, 36, 34), (33, 36, 34), + (33, 37, 34), (35, 38, 36), (39, 42, 39), (46, 49, 45), + (65, 67, 60), (69, 71, 64), (74, 76, 69), (83, 84, 77), + (93, 92, 85), (106, 102, 95), (120, 113, 106), (132, 123, 116), + (140, 129, 123), (141, 127, 123), (139, 125, 122), (138, 123, 121), + (137, 119, 119), (135, 116, 117), (130, 112, 113), (121, 105, 105), + (95, 84, 84), (89, 80, 79), (84, 76, 75), (76, 70, 69), + (70, 66, 64), (64, 62, 59), (58, 58, 54), (53, 54, 50), + (49, 51, 47), (47, 49, 45), (46, 48, 45), (47, 48, 45), + (46, 48, 45), (46, 47, 45), (46, 46, 45), (46, 45, 44), + (44, 45, 43), (43, 45, 42), (43, 45, 42), (42, 44, 41), + (41, 44, 40), (40, 42, 40), (40, 42, 39), (40, 43, 40), + (41, 45, 41), (43, 48, 43), (47, 52, 45), (51, 56, 50), + (57, 61, 55), (62, 67, 60), (68, 73, 65), (72, 78, 69), + (76, 84, 74), (80, 89, 78), (83, 93, 82), (86, 96, 84), + (85, 96, 85), (83, 94, 82), (79, 91, 79), (75, 87, 75), + (71, 83, 72), (69, 81, 70), (68, 78, 68), (67, 76, 66), + (66, 73, 64), (65, 71, 63), (66, 70, 63), (68, 72, 64), + (71, 74, 65), (74, 76, 68), (76, 77, 69), (76, 77, 70), + (75, 75, 69), (72, 74, 68), (70, 73, 66), (67, 71, 64), + (65, 70, 63), (62, 67, 61), (58, 64, 59), (55, 62, 57), + (52, 61, 55), (51, 61, 54), (51, 61, 54), (52, 61, 54), + (52, 62, 55), (54, 64, 56), (55, 65, 57), (57, 67, 58), + (59, 67, 59), (60, 68, 60), (62, 67, 60), (62, 67, 60), + (62, 67, 60), (62, 67, 59), (61, 65, 58), (59, 63, 56), + (57, 60, 54), (55, 57, 52), (54, 56, 50), (52, 55, 49), + (50, 54, 47), (49, 53, 47), (48, 52, 46), (47, 51, 45), + (47, 51, 44), (47, 51, 44), (47, 52, 44), (47, 52, 45) + ), + +// 647 Sno_and_Shadows +((8, 19, 22), (11, 20, 32), (8, 16, 34), (6, 12, 36), + (5, 9, 38), (4, 7, 40), (2, 5, 40), (1, 4, 41), + (0, 4, 47), (6, 11, 59), (12, 18, 71), (23, 37, 90), + (34, 57, 109), (59, 78, 129), (85, 100, 149), (93, 111, 155), + (102, 122, 162), (133, 147, 172), (122, 135, 153), (112, 123, 135), + (95, 106, 120), (79, 89, 105), (71, 81, 100), (63, 74, 96), + (38, 51, 96), (37, 52, 98), (37, 54, 101), (29, 49, 98), + (22, 45, 96), (22, 43, 93), (22, 41, 91), (21, 39, 94), + (24, 43, 99), (36, 56, 109), (63, 81, 127), (90, 107, 146), + (118, 134, 169), (146, 161, 193), (165, 177, 202), (184, 194, 212), + (228, 234, 243), (238, 243, 248), (249, 252, 253), (251, 252, 253), + (254, 252, 253), (254, 252, 253), (254, 253, 253), (252, 253, 255), + (245, 247, 251), (225, 230, 238), (210, 214, 226), (195, 199, 214), + (185, 191, 213), (175, 184, 213), (178, 184, 211), (182, 185, 210), + (204, 209, 230), (218, 222, 234), (232, 235, 238), (227, 234, 239), + (223, 234, 241), (216, 227, 235), (209, 221, 230), (186, 202, 216), + (157, 176, 210), (129, 153, 191), (119, 144, 181), (110, 135, 172), + (108, 132, 166), (107, 130, 160), (92, 114, 147), (74, 91, 123), + (41, 53, 83), (31, 45, 69), (22, 38, 56), (21, 37, 53), + (21, 36, 50), (22, 37, 52), (23, 39, 55), (26, 43, 68), + (37, 54, 86), (59, 77, 137), (85, 104, 158), (111, 132, 179), + (122, 144, 191), (134, 157, 204), (163, 182, 215), (185, 198, 223), + (202, 214, 231), (197, 205, 221), (192, 196, 211), (188, 193, 205), + (185, 191, 199), (177, 182, 192), (172, 179, 191), (178, 187, 193), + (188, 194, 198), (216, 222, 225), (226, 231, 235), (236, 240, 245), + (237, 241, 246), (239, 243, 248), (233, 239, 247), (221, 227, 239), + (186, 192, 216), (171, 177, 209), (156, 163, 202), (152, 161, 202), + (148, 159, 203), (142, 155, 208), (151, 162, 213), (169, 179, 226), + (187, 198, 234), (223, 228, 244), (227, 234, 247), (232, 241, 251), + (232, 243, 250), (222, 233, 238), (202, 216, 228), (179, 195, 217), + (141, 154, 171), (128, 141, 164), (116, 128, 158), (115, 125, 154), + (115, 123, 151), (113, 120, 146), (95, 109, 154), (78, 94, 149), + (69, 82, 132), (27, 45, 97), (21, 36, 84), (15, 28, 71), + (9, 18, 54), (8, 15, 42), (8, 13, 34), (7, 12, 32), + (17, 22, 45), (21, 30, 58), (26, 38, 72), (35, 50, 83), + (44, 62, 94), (66, 86, 117), (87, 104, 139), (113, 131, 159), + (140, 154, 176), (189, 198, 201), (190, 199, 201), (192, 201, 202), + (201, 201, 198), (199, 202, 196), (180, 191, 185), (169, 174, 169), + (148, 153, 160), (145, 152, 160), (142, 151, 161), (146, 156, 157), + (147, 159, 160), (143, 156, 165), (137, 147, 151), (118, 127, 130), + (88, 104, 115), (52, 58, 81), (39, 47, 73), (27, 37, 66), + (20, 27, 54), (14, 20, 44), (10, 15, 37), (11, 13, 32), + (11, 18, 39), (14, 21, 46), (17, 25, 53), (23, 33, 70), + (29, 42, 86), (34, 49, 97), (39, 56, 113), (38, 57, 124), + (34, 54, 124), (37, 53, 129), (34, 47, 126), (29, 44, 119), + (34, 49, 126), (51, 59, 130), (74, 82, 137), (99, 111, 162), + (172, 179, 208), (186, 193, 218), (200, 208, 228), (213, 225, 231), + (216, 227, 226), (208, 219, 219), (183, 200, 198), (154, 168, 172), + (120, 134, 149), (89, 103, 134), (70, 82, 118), (50, 64, 103), + (36, 50, 97), (30, 45, 93), (25, 39, 87), (23, 34, 85), + (17, 34, 79), (13, 29, 65), (15, 26, 57), (16, 30, 53), + (15, 32, 44), (15, 31, 35), (16, 27, 30), (12, 22, 28), + (8, 21, 26), (6, 14, 20), (4, 10, 18), (4, 13, 19), + (5, 13, 18), (6, 12, 17), (5, 13, 18), (5, 13, 17), + (5, 11, 15), (5, 8, 15), (5, 8, 13), (4, 8, 12), + (4, 8, 14), (5, 9, 18), (4, 10, 24), (3, 12, 37), + (4, 16, 53), (6, 22, 69), (10, 30, 86), (15, 35, 98), + (18, 39, 104), (23, 43, 99), (25, 43, 93), (22, 41, 89), + (19, 35, 79), (16, 32, 66), (11, 30, 60), (11, 27, 56), + (13, 25, 48), (14, 26, 40), (13, 24, 32), (12, 25, 30), + (13, 28, 32), (15, 28, 30), (13, 26, 29), (10, 23, 30), + (11, 23, 28), (11, 17, 25), (7, 10, 21), (4, 6, 17), + (3, 5, 14), (1, 5, 12), (0, 6, 12), (1, 6, 12), + (3, 9, 13), (6, 18, 19), (8, 21, 22), (7, 16, 18) + ), + +// 648 Snowy_Field +((124, 176, 180), (121, 174, 176), (128, 178, 181), (135, 182, 186), + (133, 176, 179), (131, 170, 173), (131, 166, 169), (131, 162, 166), + (128, 153, 159), (127, 153, 160), (126, 153, 161), (124, 155, 163), + (122, 157, 166), (123, 154, 165), (124, 151, 165), (123, 149, 161), + (122, 147, 158), (122, 125, 135), (124, 113, 123), (127, 102, 111), + (124, 94, 103), (122, 86, 95), (121, 85, 94), (120, 85, 93), + (123, 95, 105), (124, 104, 113), (126, 114, 122), (130, 129, 136), + (134, 144, 151), (138, 150, 156), (142, 156, 161), (146, 169, 172), + (152, 179, 181), (161, 196, 198), (164, 197, 199), (167, 198, 201), + (165, 193, 196), (164, 188, 192), (163, 181, 186), (163, 175, 180), + (143, 145, 152), (129, 127, 134), (115, 109, 116), (101, 94, 102), + (88, 79, 88), (83, 71, 79), (78, 64, 71), (72, 53, 60), + (68, 47, 56), (76, 46, 60), (82, 54, 67), (88, 62, 74), + (95, 75, 86), (103, 88, 99), (107, 96, 106), (111, 104, 114), + (123, 139, 147), (128, 153, 159), (134, 168, 172), (139, 179, 182), + (145, 190, 193), (147, 193, 196), (149, 197, 200), (151, 200, 202), + (153, 203, 203), (151, 198, 199), (145, 187, 189), (139, 177, 180), + (133, 168, 171), (128, 160, 163), (114, 140, 144), (98, 118, 125), + (79, 86, 99), (77, 76, 89), (75, 67, 79), (83, 72, 87), + (91, 78, 95), (98, 85, 101), (105, 93, 108), (119, 107, 121), + (130, 125, 135), (141, 156, 162), (143, 161, 167), (145, 167, 172), + (144, 166, 171), (144, 165, 170), (136, 159, 161), (135, 149, 151), + (133, 118, 127), (129, 105, 113), (125, 92, 100), (121, 86, 94), + (117, 80, 88), (114, 70, 82), (111, 66, 79), (108, 66, 78), + (103, 66, 77), (95, 66, 82), (95, 72, 87), (95, 78, 92), + (95, 80, 93), (96, 83, 95), (97, 86, 97), (97, 91, 99), + (101, 94, 98), (100, 91, 95), (99, 88, 93), (96, 88, 92), + (94, 88, 91), (92, 84, 91), (88, 77, 85), (87, 65, 79), + (83, 62, 75), (92, 68, 81), (94, 68, 82), (96, 69, 83), + (99, 73, 85), (104, 82, 97), (116, 95, 109), (123, 107, 121), + (140, 134, 145), (156, 147, 157), (173, 160, 169), (180, 167, 173), + (187, 174, 178), (199, 185, 185), (213, 195, 191), (228, 204, 197), + (239, 208, 203), (240, 219, 206), (240, 221, 207), (240, 224, 208), + (240, 225, 212), (232, 223, 212), (219, 220, 210), (207, 220, 208), + (188, 210, 204), (184, 203, 197), (181, 197, 191), (181, 195, 190), + (181, 193, 190), (185, 192, 187), (195, 192, 186), (204, 195, 186), + (207, 199, 190), (192, 200, 194), (187, 197, 193), (182, 194, 193), + (170, 187, 189), (152, 177, 180), (133, 169, 173), (123, 157, 166), + (128, 145, 160), (129, 146, 159), (131, 148, 159), (141, 155, 165), + (156, 164, 170), (172, 173, 175), (179, 180, 179), (183, 182, 184), + (185, 185, 183), (181, 175, 165), (180, 170, 162), (180, 166, 159), + (177, 162, 159), (175, 155, 157), (168, 150, 151), (166, 147, 146), + (159, 142, 146), (155, 138, 142), (152, 135, 139), (143, 126, 129), + (135, 118, 123), (125, 109, 118), (119, 104, 114), (116, 102, 110), + (114, 102, 111), (113, 102, 114), (112, 108, 121), (112, 114, 126), + (109, 121, 130), (109, 123, 132), (110, 126, 132), (111, 125, 130), + (100, 113, 123), (98, 110, 119), (97, 107, 116), (97, 101, 110), + (97, 96, 105), (94, 90, 100), (91, 87, 98), (90, 88, 98), + (94, 91, 99), (96, 94, 100), (99, 97, 104), (101, 104, 110), + (108, 107, 117), (116, 111, 122), (123, 116, 129), (127, 125, 134), + (133, 133, 141), (147, 144, 150), (161, 158, 162), (174, 175, 173), + (185, 190, 184), (200, 205, 194), (214, 219, 206), (228, 232, 216), + (238, 239, 223), (245, 244, 226), (249, 245, 227), (250, 246, 225), + (249, 245, 222), (246, 245, 219), (242, 241, 216), (240, 236, 210), + (237, 230, 204), (232, 227, 202), (223, 224, 205), (211, 222, 206), + (200, 217, 205), (195, 215, 205), (186, 212, 209), (176, 211, 210), + (164, 209, 210), (159, 207, 207), (155, 203, 206), (154, 199, 201), + (152, 197, 198), (152, 189, 190), (150, 180, 183), (149, 169, 174), + (146, 162, 167), (146, 151, 156), (149, 139, 145), (154, 130, 138), + (163, 125, 134), (170, 122, 133), (171, 118, 131), (167, 120, 132), + (169, 119, 128), (174, 119, 126), (178, 114, 123), (167, 114, 124), + (155, 115, 122), (144, 116, 118), (144, 114, 116), (144, 114, 117), + (144, 118, 122), (135, 123, 129), (129, 131, 137), (124, 137, 143), + (120, 142, 147), (115, 138, 146), (119, 150, 155), (124, 160, 167) + ), + +// 649 Snuggle +((120, 26, 61), (118, 24, 56), (116, 24, 52), (114, 24, 49), + (121, 20, 46), (129, 17, 43), (134, 15, 41), (140, 14, 40), + (140, 16, 33), (133, 20, 29), (126, 25, 25), (119, 29, 30), + (112, 33, 35), (113, 39, 48), (114, 45, 62), (113, 44, 68), + (112, 44, 74), (107, 46, 92), (101, 43, 95), (95, 40, 98), + (92, 43, 106), (89, 46, 115), (87, 46, 121), (85, 47, 128), + (77, 51, 152), (76, 51, 153), (76, 51, 154), (83, 51, 146), + (90, 51, 138), (98, 53, 133), (107, 56, 128), (120, 62, 123), + (128, 70, 121), (136, 98, 125), (137, 110, 123), (138, 122, 122), + (142, 129, 116), (146, 137, 110), (150, 137, 108), (155, 137, 107), + (160, 145, 118), (161, 150, 128), (163, 156, 138), (155, 160, 145), + (147, 164, 153), (142, 160, 153), (137, 156, 153), (121, 147, 153), + (104, 139, 154), (81, 122, 138), (83, 113, 132), (85, 104, 126), + (91, 91, 115), (98, 79, 104), (100, 73, 100), (103, 67, 97), + (101, 51, 78), (99, 46, 79), (98, 41, 81), (102, 36, 88), + (107, 32, 96), (112, 29, 104), (118, 26, 112), (132, 25, 122), + (145, 24, 129), (158, 27, 132), (161, 30, 131), (164, 33, 130), + (165, 32, 131), (166, 31, 133), (168, 33, 132), (172, 33, 127), + (184, 38, 100), (192, 46, 84), (200, 54, 69), (203, 56, 58), + (207, 59, 48), (207, 58, 45), (207, 58, 42), (206, 57, 38), + (202, 55, 34), (195, 52, 37), (186, 50, 37), (178, 49, 38), + (172, 47, 38), (166, 46, 38), (154, 40, 36), (141, 35, 34), + (133, 18, 39), (129, 16, 39), (126, 14, 39), (123, 14, 40), + (121, 15, 41), (112, 15, 41), (101, 17, 40), (94, 19, 42), + (92, 19, 44), (95, 24, 47), (96, 33, 50), (97, 43, 54), + (94, 49, 53), (91, 56, 53), (81, 69, 55), (73, 80, 66), + (66, 86, 79), (71, 87, 87), (77, 89, 95), (81, 92, 96), + (85, 95, 98), (92, 100, 92), (99, 104, 95), (106, 104, 92), + (112, 101, 88), (119, 76, 90), (121, 71, 94), (123, 66, 98), + (125, 58, 94), (125, 49, 98), (124, 44, 98), (118, 39, 95), + (93, 29, 81), (82, 27, 78), (72, 25, 75), (69, 26, 79), + (66, 27, 83), (69, 38, 97), (76, 48, 112), (82, 66, 124), + (90, 76, 133), (100, 92, 140), (100, 90, 140), (101, 89, 140), + (103, 88, 148), (110, 88, 158), (114, 93, 167), (121, 95, 172), + (133, 99, 174), (133, 94, 172), (134, 89, 171), (136, 87, 171), + (138, 85, 172), (140, 81, 168), (144, 79, 160), (148, 74, 148), + (154, 66, 133), (165, 66, 123), (166, 71, 129), (167, 76, 136), + (165, 89, 150), (160, 108, 163), (151, 127, 171), (138, 137, 172), + (115, 143, 170), (111, 140, 172), (107, 137, 175), (99, 132, 183), + (87, 135, 199), (78, 141, 213), (68, 148, 220), (55, 150, 220), + (46, 150, 222), (45, 132, 213), (44, 124, 211), (44, 117, 209), + (44, 97, 208), (45, 85, 208), (40, 72, 207), (35, 63, 206), + (37, 55, 200), (40, 52, 194), (44, 49, 189), (53, 41, 176), + (65, 36, 164), (75, 33, 155), (86, 26, 146), (99, 21, 137), + (108, 20, 130), (121, 20, 127), (137, 27, 123), (150, 36, 116), + (160, 37, 101), (165, 36, 93), (168, 33, 91), (162, 34, 93), + (152, 38, 110), (151, 47, 120), (150, 56, 131), (156, 67, 138), + (159, 78, 149), (164, 91, 157), (162, 106, 160), (155, 114, 161), + (150, 110, 161), (140, 114, 166), (140, 117, 163), (143, 116, 159), + (152, 118, 153), (165, 117, 140), (174, 121, 125), (186, 114, 112), + (184, 103, 100), (175, 92, 88), (162, 75, 79), (148, 60, 79), + (138, 48, 82), (127, 46, 84), (127, 43, 90), (128, 41, 98), + (126, 35, 108), (120, 30, 113), (113, 24, 117), (103, 25, 121), + (95, 29, 120), (90, 30, 118), (87, 32, 112), (82, 33, 111), + (76, 41, 104), (82, 41, 93), (85, 41, 84), (92, 42, 72), + (101, 44, 65), (111, 44, 60), (118, 42, 64), (114, 49, 72), + (111, 50, 81), (105, 51, 87), (100, 50, 90), (102, 49, 92), + (107, 45, 92), (113, 35, 96), (113, 34, 102), (109, 29, 111), + (103, 26, 116), (94, 25, 114), (84, 24, 111), (73, 21, 104), + (63, 18, 94), (57, 23, 89), (53, 29, 92), (51, 31, 97), + (44, 35, 98), (36, 41, 97), (29, 44, 97), (24, 46, 91), + (20, 47, 86), (19, 52, 86), (26, 50, 87), (35, 49, 89), + (44, 51, 87), (53, 51, 86), (62, 51, 81), (71, 47, 73), + (78, 45, 66), (90, 40, 60), (102, 35, 61), (115, 31, 62) + ), + +// 650 Soap_Bubble +((112, 150, 197), (89, 188, 214), (87, 207, 218), (85, 226, 222), + (103, 230, 220), (122, 234, 219), (131, 230, 217), (141, 226, 216), + (169, 195, 209), (174, 174, 198), (180, 154, 187), (169, 135, 168), + (159, 116, 150), (145, 104, 134), (131, 92, 118), (126, 93, 115), + (121, 95, 112), (97, 114, 125), (86, 129, 130), (76, 144, 135), + (66, 165, 143), (57, 186, 152), (57, 194, 162), (58, 203, 173), + (68, 218, 187), (60, 213, 175), (52, 208, 163), (48, 195, 157), + (44, 182, 152), (42, 176, 156), (40, 171, 160), (37, 158, 159), + (38, 154, 157), (71, 135, 142), (77, 115, 148), (84, 95, 154), + (91, 92, 152), (99, 90, 150), (112, 91, 143), (126, 93, 136), + (152, 105, 135), (150, 106, 146), (149, 107, 158), (169, 107, 157), + (190, 108, 156), (197, 108, 152), (204, 108, 149), (210, 118, 135), + (205, 115, 132), (218, 116, 125), (224, 115, 111), (231, 115, 97), + (228, 110, 85), (226, 105, 74), (223, 103, 77), (220, 101, 81), + (209, 97, 119), (202, 91, 134), (196, 85, 149), (195, 81, 161), + (195, 77, 173), (198, 78, 175), (201, 79, 178), (197, 97, 181), + (189, 116, 177), (172, 156, 159), (168, 171, 151), (165, 186, 143), + (156, 194, 142), (147, 202, 141), (123, 204, 139), (99, 213, 138), + (75, 223, 140), (61, 220, 149), (48, 218, 158), (51, 206, 165), + (55, 195, 173), (66, 187, 170), (77, 179, 167), (101, 174, 171), + (124, 161, 174), (159, 126, 191), (180, 104, 197), (201, 83, 203), + (207, 77, 207), (213, 72, 211), (223, 69, 226), (216, 71, 237), + (207, 60, 241), (203, 60, 236), (200, 61, 232), (197, 65, 227), + (194, 70, 223), (193, 79, 206), (188, 91, 189), (175, 106, 168), + (156, 127, 149), (120, 158, 115), (108, 159, 93), (97, 161, 72), + (88, 161, 64), (79, 161, 56), (71, 170, 53), (76, 166, 62), + (107, 136, 74), (118, 115, 84), (129, 95, 94), (132, 92, 105), + (135, 89, 116), (138, 87, 129), (136, 87, 132), (125, 85, 122), + (123, 89, 118), (127, 127, 120), (128, 136, 119), (129, 146, 119), + (128, 159, 110), (138, 167, 110), (152, 179, 120), (170, 194, 129), + (198, 220, 147), (202, 221, 159), (207, 222, 171), (207, 220, 177), + (208, 218, 183), (212, 207, 198), (214, 199, 204), (206, 189, 201), + (202, 178, 206), (189, 175, 220), (191, 168, 223), (193, 161, 226), + (192, 143, 217), (194, 114, 205), (185, 93, 186), (178, 87, 172), + (184, 80, 149), (195, 64, 127), (206, 49, 106), (209, 43, 97), + (212, 38, 88), (220, 31, 87), (224, 32, 96), (223, 37, 101), + (217, 36, 112), (177, 35, 117), (169, 35, 123), (161, 36, 129), + (146, 41, 139), (129, 41, 154), (104, 40, 172), (73, 44, 178), + (42, 59, 186), (40, 63, 187), (39, 67, 188), (42, 71, 195), + (43, 73, 198), (48, 69, 194), (69, 66, 179), (97, 63, 155), + (123, 66, 130), (161, 75, 99), (168, 81, 96), (176, 88, 93), + (199, 103, 82), (219, 126, 72), (231, 146, 68), (237, 158, 73), + (233, 181, 113), (233, 185, 124), (233, 189, 136), (236, 190, 148), + (236, 178, 154), (239, 159, 160), (237, 138, 168), (228, 119, 184), + (217, 96, 192), (207, 80, 199), (192, 64, 203), (175, 51, 205), + (152, 42, 215), (124, 30, 222), (104, 32, 232), (83, 42, 237), + (59, 84, 244), (56, 89, 242), (54, 95, 241), (56, 108, 237), + (55, 123, 232), (46, 143, 225), (41, 173, 224), (42, 189, 222), + (61, 201, 220), (79, 200, 220), (92, 200, 211), (103, 209, 199), + (108, 216, 187), (121, 226, 174), (135, 229, 172), (146, 230, 163), + (147, 232, 145), (140, 235, 129), (127, 236, 110), (116, 235, 107), + (111, 229, 108), (96, 229, 105), (84, 229, 101), (71, 228, 102), + (67, 231, 109), (80, 227, 120), (98, 226, 130), (123, 228, 137), + (141, 230, 148), (159, 235, 163), (170, 234, 173), (174, 235, 185), + (177, 233, 195), (178, 228, 204), (169, 219, 217), (153, 197, 222), + (131, 177, 230), (102, 153, 234), (87, 131, 238), (67, 113, 242), + (50, 91, 241), (46, 72, 241), (44, 54, 239), (55, 43, 242), + (70, 35, 244), (81, 33, 244), (91, 42, 236), (98, 49, 223), + (102, 61, 204), (105, 61, 189), (112, 57, 176), (132, 64, 159), + (144, 71, 143), (155, 97, 122), (160, 117, 108), (160, 130, 101), + (175, 134, 102), (189, 135, 106), (202, 141, 114), (214, 146, 128), + (214, 154, 143), (214, 145, 161), (216, 129, 173), (214, 112, 178), + (214, 90, 180), (208, 80, 182), (195, 76, 189), (190, 65, 194), + (166, 77, 194), (149, 90, 194), (134, 108, 187), (109, 140, 192) + ), + +// 651 Sophia +((170, 128, 57), (151, 105, 51), (145, 99, 50), (139, 93, 49), + (129, 82, 45), (120, 71, 42), (117, 67, 40), (115, 63, 39), + (113, 55, 43), (116, 60, 46), (120, 66, 49), (126, 73, 48), + (133, 80, 48), (141, 85, 48), (149, 91, 49), (154, 95, 52), + (159, 100, 55), (175, 116, 67), (179, 118, 68), (184, 121, 69), + (181, 122, 72), (178, 124, 76), (175, 124, 78), (172, 125, 80), + (167, 123, 83), (164, 124, 85), (162, 125, 88), (158, 130, 86), + (155, 135, 85), (155, 136, 84), (155, 137, 84), (161, 136, 83), + (163, 131, 83), (160, 121, 75), (152, 110, 67), (145, 100, 59), + (135, 86, 55), (125, 73, 52), (118, 67, 52), (111, 61, 53), + (98, 53, 49), (94, 50, 45), (91, 47, 42), (85, 44, 44), + (80, 42, 47), (79, 42, 45), (78, 42, 43), (78, 43, 38), + (79, 41, 27), (73, 27, 17), (66, 21, 12), (59, 15, 8), + (56, 12, 5), (54, 10, 3), (56, 9, 3), (58, 8, 4), + (67, 6, 6), (72, 10, 6), (78, 14, 6), (77, 17, 8), + (77, 20, 10), (76, 20, 11), (75, 20, 13), (75, 21, 16), + (77, 24, 15), (65, 30, 11), (58, 28, 11), (52, 27, 11), + (52, 26, 12), (53, 25, 13), (61, 31, 16), (71, 41, 21), + (103, 76, 38), (119, 89, 48), (135, 102, 59), (144, 112, 72), + (154, 122, 86), (159, 130, 96), (165, 138, 106), (176, 156, 126), + (186, 174, 148), (197, 187, 157), (198, 186, 158), (199, 186, 159), + (200, 190, 162), (201, 194, 165), (209, 206, 163), (217, 220, 155), + (228, 217, 133), (224, 204, 122), (220, 191, 111), (216, 187, 105), + (213, 184, 100), (201, 167, 91), (190, 154, 82), (178, 130, 75), + (159, 107, 69), (133, 77, 68), (126, 76, 75), (120, 76, 83), + (120, 79, 91), (120, 82, 99), (124, 93, 116), (133, 106, 135), + (153, 133, 159), (166, 146, 161), (179, 159, 163), (184, 165, 160), + (190, 171, 157), (197, 171, 155), (198, 168, 143), (199, 158, 125), + (198, 145, 107), (186, 119, 76), (179, 110, 72), (173, 102, 69), + (157, 86, 64), (145, 73, 61), (137, 62, 60), (128, 56, 63), + (111, 50, 75), (107, 55, 81), (103, 61, 87), (102, 64, 89), + (102, 68, 92), (104, 76, 98), (105, 83, 103), (110, 88, 105), + (119, 97, 112), (133, 109, 131), (134, 111, 134), (136, 113, 137), + (138, 110, 135), (141, 109, 130), (138, 109, 126), (139, 102, 127), + (137, 93, 121), (133, 92, 113), (129, 92, 105), (127, 91, 103), + (126, 90, 101), (127, 91, 98), (133, 93, 96), (143, 98, 92), + (152, 110, 90), (164, 128, 92), (166, 130, 92), (168, 132, 93), + (169, 131, 89), (167, 129, 79), (160, 121, 71), (154, 110, 62), + (138, 88, 62), (133, 85, 61), (129, 82, 61), (116, 76, 60), + (105, 69, 55), (96, 59, 50), (89, 48, 47), (79, 39, 43), + (68, 34, 38), (42, 29, 25), (39, 26, 23), (36, 24, 21), + (30, 17, 17), (27, 10, 13), (25, 10, 8), (28, 14, 5), + (49, 31, 12), (55, 35, 13), (62, 39, 15), (73, 47, 17), + (86, 53, 18), (102, 62, 24), (114, 69, 29), (122, 77, 35), + (124, 82, 40), (125, 82, 46), (127, 82, 53), (129, 82, 60), + (130, 83, 63), (131, 83, 61), (130, 81, 62), (133, 78, 61), + (147, 75, 62), (149, 74, 58), (151, 73, 54), (153, 72, 50), + (154, 71, 43), (160, 72, 45), (166, 78, 50), (170, 82, 52), + (167, 88, 56), (162, 90, 53), (157, 92, 54), (152, 93, 55), + (145, 90, 53), (135, 85, 54), (124, 75, 48), (113, 66, 39), + (99, 54, 32), (83, 42, 21), (65, 31, 17), (52, 19, 13), + (50, 14, 10), (54, 11, 10), (61, 13, 9), (66, 17, 11), + (69, 20, 15), (78, 26, 21), (90, 31, 32), (103, 35, 43), + (114, 40, 50), (122, 43, 51), (130, 48, 51), (140, 52, 56), + (147, 59, 66), (146, 67, 78), (144, 78, 87), (147, 91, 89), + (157, 107, 89), (174, 124, 92), (186, 138, 98), (192, 152, 108), + (192, 162, 116), (189, 173, 122), (187, 182, 128), (187, 188, 133), + (192, 192, 147), (196, 196, 157), (196, 196, 172), (192, 199, 186), + (190, 204, 194), (192, 208, 199), (200, 220, 196), (207, 222, 192), + (209, 217, 188), (207, 212, 187), (201, 198, 181), (195, 191, 176), + (183, 182, 163), (176, 166, 150), (165, 151, 147), (158, 134, 143), + (156, 122, 146), (151, 121, 146), (157, 124, 140), (164, 129, 134), + (171, 133, 124), (180, 135, 112), (184, 136, 104), (184, 138, 92), + (189, 147, 88), (192, 154, 86), (190, 156, 78), (186, 149, 70) + ), + +// 652 Strawberries +((108, 0, 9), (116, 2, 9), (117, 3, 9), (119, 4, 10), + (118, 4, 10), (117, 5, 11), (116, 4, 11), (115, 4, 12), + (103, 5, 11), (97, 5, 12), (92, 6, 13), (89, 5, 13), + (87, 4, 14), (85, 3, 13), (84, 2, 12), (83, 1, 12), + (83, 1, 12), (83, 0, 12), (83, 0, 12), (83, 0, 12), + (81, 2, 14), (80, 5, 16), (78, 7, 18), (77, 10, 21), + (68, 20, 26), (61, 20, 25), (55, 21, 25), (51, 21, 25), + (48, 21, 25), (47, 21, 25), (47, 22, 26), (48, 23, 25), + (49, 23, 27), (50, 17, 17), (55, 11, 13), (61, 6, 9), + (67, 3, 7), (74, 1, 5), (76, 0, 5), (79, 0, 5), + (85, 0, 6), (90, 0, 7), (95, 0, 8), (98, 0, 8), + (101, 0, 9), (102, 0, 10), (103, 0, 11), (104, 1, 14), + (106, 3, 18), (106, 24, 35), (111, 41, 49), (116, 59, 63), + (129, 79, 84), (142, 99, 105), (148, 107, 112), (155, 115, 119), + (153, 143, 147), (146, 150, 150), (140, 158, 154), (142, 158, 152), + (145, 159, 151), (142, 155, 148), (140, 151, 145), (133, 139, 136), + (118, 123, 120), (83, 87, 79), (77, 72, 62), (71, 57, 45), + (71, 51, 40), (71, 46, 36), (70, 35, 31), (72, 27, 27), + (83, 18, 21), (92, 13, 19), (102, 8, 17), (112, 4, 16), + (122, 1, 15), (126, 0, 15), (130, 0, 15), (134, 1, 17), + (136, 2, 19), (134, 6, 20), (129, 5, 18), (125, 5, 17), + (121, 5, 16), (117, 6, 16), (107, 8, 16), (94, 12, 18), + (73, 16, 16), (68, 14, 14), (63, 13, 12), (61, 11, 11), + (60, 9, 10), (58, 10, 11), (55, 11, 10), (54, 11, 9), + (55, 10, 7), (57, 4, 5), (56, 3, 5), (55, 3, 6), + (54, 4, 6), (53, 6, 6), (54, 8, 8), (59, 10, 10), + (70, 9, 13), (76, 8, 13), (82, 8, 13), (84, 8, 13), + (86, 9, 14), (92, 10, 17), (101, 12, 19), (109, 11, 23), + (118, 9, 24), (130, 8, 21), (131, 8, 20), (133, 8, 19), + (137, 8, 19), (141, 9, 22), (143, 11, 27), (146, 22, 34), + (161, 54, 55), (170, 71, 64), (179, 88, 73), (185, 94, 80), + (191, 100, 87), (190, 115, 96), (192, 126, 107), (183, 133, 112), + (171, 134, 109), (149, 130, 101), (141, 127, 98), (134, 124, 95), + (127, 116, 87), (118, 101, 80), (110, 82, 67), (102, 59, 49), + (103, 27, 25), (112, 20, 21), (121, 13, 17), (126, 11, 16), + (132, 9, 16), (146, 6, 14), (160, 3, 13), (171, 1, 12), + (179, 0, 12), (182, 0, 12), (179, 0, 12), (176, 0, 12), + (168, 1, 12), (159, 1, 12), (149, 1, 12), (140, 1, 12), + (120, 0, 11), (115, 0, 11), (111, 0, 11), (102, 0, 10), + (93, 0, 10), (87, 0, 9), (82, 0, 10), (78, 0, 10), + (77, 0, 9), (77, 0, 7), (77, 0, 6), (77, 0, 5), + (78, 0, 5), (77, 0, 5), (76, 0, 5), (77, 0, 6), + (83, 1, 5), (86, 1, 5), (90, 1, 5), (97, 1, 7), + (103, 3, 8), (109, 4, 11), (110, 7, 16), (111, 16, 19), + (112, 28, 27), (123, 26, 29), (133, 26, 28), (146, 24, 27), + (154, 19, 26), (159, 16, 24), (156, 28, 29), (161, 27, 30), + (174, 22, 29), (178, 18, 28), (182, 15, 27), (188, 3, 23), + (186, 4, 23), (185, 3, 24), (181, 3, 23), (179, 3, 23), + (177, 4, 24), (174, 3, 25), (170, 3, 25), (168, 3, 25), + (166, 2, 23), (166, 2, 20), (167, 3, 20), (169, 4, 20), + (171, 5, 21), (170, 8, 23), (165, 15, 27), (166, 31, 36), + (168, 47, 47), (169, 65, 61), (170, 80, 73), (170, 89, 78), + (156, 89, 77), (145, 92, 79), (134, 93, 76), (127, 94, 78), + (122, 94, 79), (124, 90, 77), (119, 79, 68), (114, 64, 59), + (108, 47, 44), (105, 32, 34), (104, 19, 28), (105, 11, 23), + (108, 10, 22), (111, 21, 32), (114, 33, 43), (115, 44, 53), + (115, 48, 60), (117, 49, 61), (124, 40, 55), (129, 41, 54), + (137, 44, 59), (145, 49, 64), (147, 51, 67), (147, 49, 66), + (151, 37, 56), (152, 23, 42), (154, 12, 32), (158, 7, 27), + (157, 5, 25), (150, 4, 26), (141, 7, 26), (129, 10, 25), + (116, 13, 25), (102, 14, 25), (90, 14, 23), (81, 12, 23), + (73, 12, 23), (66, 13, 23), (62, 14, 24), (58, 15, 24), + (56, 15, 21), (58, 11, 19), (61, 7, 17), (68, 4, 16), + (75, 2, 13), (83, 2, 12), (92, 2, 12), (100, 1, 11) + ), + +// 653 Summer +((125, 67, 47), (88, 47, 13), (76, 44, 14), (64, 41, 15), + (51, 36, 16), (39, 31, 18), (39, 29, 14), (39, 27, 10), + (47, 22, 6), (63, 32, 4), (80, 43, 3), (96, 50, 9), + (113, 57, 15), (133, 70, 24), (153, 84, 33), (161, 88, 43), + (169, 92, 53), (190, 138, 79), (198, 152, 96), (207, 167, 114), + (204, 164, 115), (202, 161, 116), (185, 155, 118), (168, 150, 120), + (136, 109, 95), (122, 105, 85), (109, 102, 75), (116, 101, 64), + (123, 100, 53), (130, 103, 52), (137, 107, 52), (147, 119, 49), + (154, 134, 56), (188, 165, 84), (199, 186, 107), (210, 207, 131), + (216, 209, 151), (223, 212, 171), (226, 218, 172), (230, 224, 174), + (226, 213, 177), (213, 202, 163), (201, 191, 149), (186, 172, 126), + (171, 153, 104), (165, 145, 97), (159, 137, 91), (148, 118, 75), + (149, 113, 54), (171, 122, 35), (177, 130, 37), (184, 138, 40), + (182, 144, 55), (181, 150, 71), (173, 145, 76), (166, 141, 81), + (141, 118, 93), (130, 100, 81), (119, 82, 70), (116, 75, 55), + (114, 69, 40), (114, 68, 32), (115, 67, 25), (105, 64, 19), + (91, 66, 18), (59, 60, 18), (48, 56, 25), (37, 53, 32), + (35, 52, 32), (34, 51, 32), (41, 51, 36), (58, 56, 43), + (91, 73, 57), (99, 81, 66), (107, 90, 75), (100, 86, 74), + (93, 82, 73), (85, 76, 70), (77, 71, 67), (64, 63, 49), + (50, 44, 33), (25, 23, 15), (23, 24, 15), (21, 25, 15), + (22, 29, 17), (24, 34, 20), (38, 51, 30), (54, 62, 45), + (77, 75, 52), (87, 68, 51), (98, 62, 50), (97, 61, 53), + (97, 61, 56), (92, 66, 55), (87, 67, 58), (83, 78, 74), + (88, 95, 96), (103, 126, 112), (105, 130, 117), (108, 135, 123), + (109, 134, 120), (110, 134, 117), (102, 129, 109), (92, 122, 97), + (99, 121, 95), (118, 131, 105), (138, 142, 115), (145, 149, 120), + (152, 157, 126), (165, 176, 131), (174, 174, 136), (166, 166, 125), + (154, 166, 110), (126, 150, 103), (120, 146, 102), (114, 143, 101), + (105, 142, 99), (97, 144, 105), (87, 137, 102), (77, 118, 87), + (57, 83, 55), (61, 64, 41), (66, 46, 27), (69, 47, 24), + (73, 49, 22), (91, 50, 19), (107, 54, 27), (112, 67, 29), + (114, 79, 35), (106, 89, 50), (107, 96, 60), (108, 104, 71), + (114, 117, 89), (122, 131, 93), (142, 150, 104), (177, 165, 112), + (210, 199, 103), (224, 196, 98), (238, 194, 93), (232, 192, 92), + (227, 191, 91), (220, 181, 89), (215, 158, 85), (208, 146, 82), + (198, 141, 79), (187, 146, 80), (183, 147, 84), (179, 148, 89), + (180, 156, 100), (181, 174, 116), (177, 185, 135), (187, 195, 163), + (205, 227, 200), (204, 229, 205), (204, 231, 210), (215, 233, 210), + (213, 221, 199), (200, 193, 181), (185, 173, 156), (172, 155, 133), + (167, 127, 114), (159, 109, 66), (156, 105, 61), (153, 101, 57), + (151, 97, 49), (149, 93, 46), (132, 85, 49), (115, 79, 54), + (82, 66, 58), (76, 70, 61), (71, 74, 64), (69, 87, 77), + (73, 103, 91), (83, 124, 106), (86, 150, 132), (107, 175, 151), + (133, 182, 154), (136, 186, 165), (148, 189, 169), (161, 177, 156), + (163, 160, 134), (163, 141, 111), (158, 128, 99), (150, 115, 80), + (136, 96, 64), (134, 98, 66), (133, 100, 69), (140, 106, 67), + (149, 116, 61), (153, 123, 60), (158, 116, 47), (158, 118, 29), + (149, 117, 24), (133, 94, 23), (117, 70, 22), (99, 59, 23), + (85, 49, 28), (77, 41, 34), (71, 38, 37), (75, 43, 42), + (82, 55, 45), (86, 61, 46), (94, 66, 43), (95, 67, 42), + (86, 59, 43), (73, 51, 33), (64, 43, 29), (52, 36, 35), + (47, 37, 36), (51, 41, 38), (57, 46, 49), (66, 58, 55), + (72, 70, 57), (72, 82, 63), (78, 86, 68), (92, 96, 67), + (102, 114, 64), (113, 124, 73), (139, 138, 84), (163, 156, 93), + (182, 176, 110), (197, 190, 127), (202, 194, 139), (206, 197, 155), + (210, 198, 163), (203, 195, 159), (201, 187, 159), (208, 189, 155), + (213, 197, 141), (225, 198, 134), (233, 200, 132), (236, 204, 124), + (239, 204, 116), (231, 195, 117), (221, 183, 119), (210, 177, 116), + (202, 162, 119), (204, 153, 134), (209, 159, 149), (207, 161, 165), + (209, 175, 180), (215, 192, 196), (204, 201, 204), (193, 209, 202), + (181, 213, 201), (160, 202, 191), (156, 184, 177), (155, 175, 162), + (134, 162, 145), (127, 141, 124), (140, 126, 105), (141, 115, 92), + (133, 99, 84), (132, 91, 78), (134, 78, 53), (133, 64, 43) + ), + +// 654 Summer_Fire +((254, 222, 57), (253, 233, 58), (246, 226, 59), (240, 220, 60), + (231, 209, 62), (223, 198, 64), (218, 195, 65), (214, 192, 66), + (196, 181, 76), (191, 176, 87), (187, 171, 99), (185, 169, 114), + (183, 168, 130), (184, 167, 139), (186, 166, 149), (184, 166, 150), + (183, 167, 152), (197, 163, 143), (202, 152, 137), (208, 141, 132), + (213, 134, 128), (218, 128, 124), (216, 125, 120), (214, 123, 117), + (213, 122, 98), (211, 113, 85), (209, 105, 72), (211, 99, 62), + (214, 93, 53), (212, 91, 50), (210, 90, 48), (207, 90, 47), + (201, 97, 50), (182, 108, 58), (173, 104, 54), (164, 100, 51), + (155, 93, 45), (147, 87, 39), (144, 84, 36), (141, 81, 33), + (126, 62, 25), (118, 50, 21), (110, 39, 18), (105, 30, 16), + (101, 21, 14), (103, 20, 14), (105, 19, 14), (116, 14, 12), + (128, 13, 14), (165, 10, 15), (177, 15, 15), (190, 20, 15), + (202, 33, 18), (214, 47, 21), (218, 54, 22), (223, 61, 24), + (241, 82, 30), (245, 96, 32), (250, 110, 34), (251, 125, 36), + (253, 141, 39), (253, 148, 40), (253, 156, 41), (253, 169, 43), + (253, 173, 44), (253, 172, 44), (248, 166, 42), (243, 161, 40), + (238, 157, 39), (234, 153, 39), (222, 144, 37), (209, 136, 37), + (188, 122, 40), (182, 115, 41), (177, 108, 43), (176, 103, 41), + (175, 98, 39), (174, 96, 38), (174, 94, 38), (173, 93, 36), + (174, 94, 37), (185, 98, 42), (195, 102, 41), (206, 106, 41), + (212, 108, 40), (219, 110, 40), (230, 115, 37), (239, 121, 35), + (251, 137, 36), (252, 147, 38), (253, 157, 41), (253, 162, 42), + (253, 167, 43), (253, 175, 45), (253, 181, 46), (253, 184, 46), + (252, 183, 46), (246, 177, 45), (240, 168, 44), (235, 159, 43), + (234, 153, 42), (233, 148, 41), (232, 138, 42), (232, 129, 40), + (235, 114, 36), (233, 110, 35), (232, 106, 34), (231, 102, 32), + (231, 99, 30), (231, 94, 32), (234, 93, 32), (236, 92, 32), + (242, 96, 32), (250, 114, 35), (251, 117, 34), (252, 120, 34), + (252, 122, 34), (254, 123, 35), (253, 123, 35), (252, 121, 35), + (245, 122, 38), (238, 122, 40), (232, 122, 43), (230, 123, 46), + (228, 124, 49), (224, 128, 55), (222, 131, 60), (225, 133, 65), + (226, 138, 66), (224, 142, 64), (223, 140, 64), (223, 139, 64), + (222, 138, 64), (218, 134, 61), (219, 129, 63), (220, 125, 60), + (223, 122, 50), (224, 119, 45), (225, 116, 41), (223, 113, 38), + (222, 111, 35), (219, 98, 31), (213, 84, 27), (207, 71, 25), + (200, 61, 22), (191, 46, 19), (188, 46, 19), (186, 47, 19), + (180, 45, 20), (173, 44, 21), (165, 42, 25), (157, 41, 28), + (146, 40, 32), (145, 41, 33), (144, 42, 34), (139, 45, 33), + (135, 51, 32), (132, 57, 36), (131, 65, 41), (130, 75, 48), + (132, 88, 58), (146, 105, 71), (150, 109, 72), (154, 114, 73), + (163, 119, 76), (172, 124, 79), (179, 129, 81), (189, 137, 83), + (209, 160, 87), (212, 167, 87), (215, 175, 88), (223, 188, 89), + (231, 199, 90), (232, 201, 95), (232, 199, 97), (232, 195, 97), + (228, 190, 95), (222, 184, 93), (214, 180, 91), (209, 181, 88), + (203, 178, 89), (197, 171, 92), (193, 164, 96), (185, 155, 94), + (177, 128, 87), (177, 119, 83), (177, 111, 80), (180, 99, 71), + (185, 86, 62), (195, 76, 57), (200, 67, 50), (206, 58, 45), + (212, 56, 38), (216, 45, 32), (221, 35, 26), (225, 25, 21), + (233, 16, 17), (240, 8, 15), (244, 9, 16), (245, 19, 24), + (243, 32, 32), (243, 44, 42), (240, 58, 51), (237, 73, 59), + (237, 83, 66), (238, 98, 71), (240, 112, 82), (241, 129, 89), + (243, 145, 100), (245, 162, 110), (244, 181, 116), (244, 194, 117), + (244, 205, 113), (245, 212, 110), (245, 217, 103), (246, 219, 96), + (249, 216, 94), (250, 213, 89), (252, 208, 81), (253, 204, 73), + (253, 200, 67), (253, 196, 60), (252, 192, 52), (252, 186, 48), + (252, 181, 46), (252, 176, 45), (252, 172, 44), (253, 168, 42), + (253, 163, 41), (252, 157, 39), (247, 150, 37), (240, 145, 35), + (230, 138, 33), (217, 133, 33), (204, 128, 32), (192, 122, 31), + (186, 117, 29), (181, 111, 29), (177, 105, 28), (169, 91, 26), + (166, 77, 25), (160, 64, 22), (156, 52, 21), (156, 44, 19), + (164, 47, 21), (176, 59, 23), (184, 71, 26), (197, 85, 30), + (208, 100, 32), (217, 112, 35), (222, 117, 35), (230, 129, 38), + (240, 144, 41), (245, 163, 46), (249, 182, 51), (252, 202, 54) + ), + +// 655 Summer_Skies +((122, 101, 184), (121, 121, 183), (125, 131, 185), (130, 141, 188), + (132, 148, 193), (135, 156, 199), (136, 158, 200), (137, 160, 202), + (137, 153, 192), (127, 145, 183), (118, 137, 174), (108, 131, 166), + (99, 126, 159), (93, 120, 158), (87, 114, 158), (82, 110, 158), + (78, 106, 158), (61, 90, 164), (53, 85, 163), (46, 81, 163), + (43, 77, 163), (41, 74, 164), (42, 74, 163), (44, 75, 162), + (65, 84, 167), (78, 89, 173), (91, 94, 179), (101, 100, 187), + (112, 106, 196), (115, 110, 199), (118, 114, 202), (128, 123, 204), + (137, 132, 206), (156, 153, 209), (163, 165, 210), (171, 178, 211), + (174, 192, 216), (178, 206, 221), (177, 210, 223), (177, 215, 226), + (165, 224, 231), (156, 222, 227), (148, 221, 223), (142, 213, 220), + (136, 206, 218), (133, 203, 215), (131, 200, 212), (122, 189, 205), + (116, 182, 200), (94, 168, 190), (80, 157, 182), (67, 146, 174), + (56, 135, 163), (46, 124, 153), (42, 119, 148), (38, 115, 143), + (34, 92, 123), (34, 81, 115), (34, 70, 107), (32, 60, 102), + (30, 51, 97), (29, 48, 94), (28, 45, 92), (26, 42, 90), + (23, 41, 92), (13, 56, 97), (12, 66, 102), (12, 76, 108), + (13, 81, 113), (15, 87, 118), (18, 97, 129), (23, 107, 140), + (40, 125, 161), (48, 133, 173), (57, 141, 186), (60, 153, 196), + (63, 166, 206), (63, 172, 209), (64, 178, 213), (64, 190, 221), + (61, 206, 228), (53, 223, 238), (52, 226, 239), (52, 229, 241), + (53, 228, 241), (55, 227, 242), (58, 224, 242), (59, 225, 240), + (64, 218, 232), (66, 217, 221), (69, 217, 210), (67, 218, 204), + (65, 219, 199), (62, 222, 190), (60, 222, 187), (64, 221, 187), + (72, 220, 186), (90, 222, 189), (97, 216, 193), (105, 210, 198), + (111, 206, 194), (117, 203, 190), (120, 195, 185), (119, 185, 179), + (114, 165, 167), (111, 154, 161), (108, 144, 156), (106, 142, 153), + (105, 140, 151), (104, 130, 151), (105, 119, 158), (109, 108, 161), + (110, 100, 163), (108, 95, 161), (106, 93, 161), (105, 92, 161), + (95, 87, 159), (88, 86, 156), (79, 89, 153), (73, 94, 151), + (77, 105, 156), (79, 115, 159), (81, 125, 163), (82, 131, 164), + (84, 138, 165), (89, 148, 171), (90, 157, 181), (91, 169, 190), + (86, 180, 199), (72, 204, 211), (70, 209, 213), (68, 214, 216), + (64, 217, 222), (61, 222, 227), (61, 229, 229), (65, 230, 228), + (83, 235, 237), (90, 236, 239), (97, 238, 242), (98, 238, 242), + (99, 238, 242), (99, 239, 243), (95, 239, 243), (90, 237, 244), + (84, 238, 243), (77, 241, 241), (79, 241, 241), (82, 242, 242), + (90, 241, 243), (101, 241, 243), (115, 240, 244), (131, 242, 245), + (151, 245, 249), (153, 244, 249), (156, 243, 249), (153, 240, 247), + (147, 233, 244), (141, 226, 241), (138, 223, 238), (136, 219, 235), + (137, 214, 231), (148, 212, 228), (150, 212, 227), (153, 213, 227), + (157, 217, 228), (158, 219, 228), (159, 220, 229), (156, 219, 230), + (155, 220, 231), (155, 218, 230), (155, 217, 229), (155, 215, 228), + (155, 213, 229), (153, 210, 227), (151, 205, 226), (145, 199, 222), + (137, 191, 218), (126, 186, 215), (114, 181, 212), (106, 178, 209), + (102, 173, 206), (102, 175, 203), (105, 174, 204), (112, 177, 204), + (134, 174, 204), (136, 171, 202), (139, 169, 200), (141, 159, 195), + (133, 153, 191), (123, 149, 186), (112, 142, 182), (102, 141, 177), + (90, 144, 175), (80, 153, 173), (74, 162, 175), (74, 174, 177), + (75, 180, 177), (81, 183, 176), (88, 181, 173), (93, 181, 174), + (99, 174, 178), (108, 166, 180), (111, 159, 181), (109, 155, 179), + (105, 149, 178), (103, 139, 175), (96, 132, 170), (91, 129, 166), + (88, 122, 156), (89, 121, 146), (91, 109, 137), (102, 100, 137), + (117, 95, 140), (133, 95, 144), (144, 100, 152), (161, 104, 160), + (172, 107, 167), (180, 112, 176), (182, 118, 181), (185, 133, 183), + (183, 140, 178), (184, 146, 178), (189, 154, 180), (195, 161, 185), + (201, 174, 193), (207, 185, 203), (212, 192, 213), (220, 195, 221), + (221, 198, 231), (218, 208, 239), (210, 218, 242), (198, 223, 242), + (185, 223, 240), (172, 219, 235), (160, 210, 226), (148, 198, 219), + (135, 186, 213), (126, 172, 207), (122, 158, 207), (121, 145, 205), + (115, 132, 200), (105, 120, 193), (93, 107, 187), (80, 100, 181), + (68, 94, 173), (59, 96, 171), (47, 96, 166), (44, 97, 163), + (47, 93, 163), (61, 89, 167), (72, 83, 170), (83, 79, 172), + (93, 75, 176), (105, 80, 180), (113, 80, 179), (124, 93, 185) + ), + +// 656 Summer_Tulips +((179, 133, 66), (205, 125, 44), (204, 117, 30), (203, 110, 16), + (197, 106, 11), (192, 102, 7), (188, 99, 6), (185, 97, 5), + (178, 97, 5), (176, 98, 7), (175, 100, 9), (176, 105, 18), + (177, 110, 27), (176, 116, 37), (175, 123, 48), (177, 125, 50), + (180, 127, 53), (186, 126, 44), (186, 122, 35), (186, 118, 26), + (172, 114, 30), (159, 111, 35), (157, 112, 38), (155, 113, 42), + (113, 112, 70), (112, 115, 77), (111, 119, 84), (109, 120, 87), + (107, 122, 90), (110, 123, 91), (113, 125, 92), (121, 124, 87), + (133, 120, 72), (153, 108, 43), (162, 101, 27), (172, 94, 12), + (171, 86, 9), (170, 79, 6), (169, 74, 6), (168, 69, 7), + (169, 58, 7), (171, 56, 6), (173, 55, 6), (175, 65, 6), + (178, 75, 7), (179, 77, 7), (180, 80, 7), (186, 94, 17), + (187, 114, 29), (198, 136, 56), (207, 145, 64), (216, 154, 73), + (216, 154, 73), (217, 154, 74), (214, 153, 74), (212, 153, 75), + (185, 142, 76), (168, 140, 82), (152, 139, 89), (142, 137, 92), + (133, 136, 96), (130, 136, 97), (127, 137, 99), (133, 138, 97), + (144, 143, 102), (180, 146, 104), (200, 155, 108), (220, 164, 112), + (226, 164, 112), (233, 164, 112), (240, 163, 110), (239, 172, 97), + (222, 159, 68), (208, 149, 55), (195, 140, 43), (188, 135, 36), + (182, 130, 29), (181, 126, 31), (181, 122, 34), (182, 124, 33), + (185, 129, 34), (183, 129, 48), (174, 129, 55), (166, 129, 63), + (162, 128, 65), (159, 127, 67), (158, 121, 60), (161, 111, 46), + (168, 90, 24), (172, 79, 15), (176, 68, 6), (176, 70, 5), + (176, 72, 5), (178, 74, 6), (178, 70, 5), (175, 73, 5), + (175, 74, 7), (171, 57, 7), (167, 50, 8), (163, 44, 9), + (161, 41, 10), (160, 39, 11), (158, 37, 9), (157, 37, 9), + (146, 47, 9), (149, 55, 8), (152, 64, 7), (150, 66, 7), + (148, 68, 8), (152, 66, 8), (155, 65, 8), (154, 66, 10), + (159, 64, 8), (157, 71, 11), (157, 76, 11), (157, 81, 11), + (151, 93, 20), (148, 101, 37), (145, 112, 49), (137, 121, 63), + (142, 135, 92), (145, 139, 94), (149, 143, 97), (152, 142, 94), + (155, 141, 92), (159, 138, 83), (164, 132, 72), (167, 125, 57), + (175, 121, 40), (187, 122, 27), (186, 123, 29), (186, 124, 32), + (189, 132, 39), (188, 137, 52), (181, 141, 68), (176, 145, 80), + (173, 150, 91), (176, 152, 92), (179, 154, 94), (182, 154, 92), + (185, 155, 90), (186, 152, 84), (191, 145, 72), (199, 140, 54), + (196, 129, 40), (190, 108, 17), (182, 107, 19), (174, 107, 21), + (161, 102, 32), (150, 107, 47), (132, 115, 63), (121, 119, 77), + (118, 130, 96), (120, 132, 97), (123, 134, 99), (133, 138, 103), + (149, 145, 109), (176, 156, 119), (201, 166, 124), (216, 172, 125), + (224, 172, 132), (217, 171, 124), (207, 166, 122), (197, 162, 120), + (174, 153, 109), (166, 147, 104), (160, 144, 98), (154, 139, 90), + (157, 136, 84), (156, 135, 83), (156, 134, 82), (152, 132, 81), + (148, 135, 86), (144, 138, 93), (141, 139, 96), (137, 141, 101), + (134, 144, 107), (135, 145, 108), (133, 145, 107), (130, 144, 108), + (129, 143, 106), (126, 142, 105), (122, 139, 103), (118, 134, 99), + (112, 127, 94), (110, 125, 93), (108, 123, 92), (107, 122, 90), + (107, 121, 89), (108, 122, 89), (117, 124, 89), (129, 127, 84), + (141, 126, 75), (159, 125, 61), (175, 124, 46), (187, 121, 34), + (197, 119, 21), (200, 119, 16), (196, 119, 24), (190, 121, 32), + (177, 124, 45), (168, 128, 62), (168, 132, 70), (165, 135, 75), + (166, 138, 77), (177, 141, 71), (185, 143, 61), (191, 145, 55), + (201, 146, 49), (205, 142, 41), (203, 139, 39), (209, 140, 35), + (213, 134, 30), (208, 129, 30), (206, 131, 28), (211, 134, 28), + (213, 138, 33), (213, 144, 40), (224, 151, 52), (228, 157, 64), + (229, 160, 73), (230, 163, 79), (226, 164, 79), (221, 161, 77), + (214, 159, 74), (208, 158, 67), (208, 155, 64), (210, 150, 72), + (209, 142, 78), (210, 139, 81), (216, 141, 90), (214, 143, 95), + (214, 144, 94), (219, 150, 99), (222, 160, 97), (229, 162, 91), + (230, 164, 88), (225, 163, 81), (224, 158, 75), (215, 157, 71), + (205, 153, 66), (202, 147, 60), (202, 146, 55), (204, 148, 52), + (207, 148, 50), (215, 150, 49), (223, 155, 49), (225, 155, 58), + (223, 151, 71), (219, 154, 79), (215, 158, 84), (206, 150, 89), + (187, 145, 90), (177, 149, 90), (186, 144, 93), (182, 135, 81) + ), + +// 657 Sunbathing +((217, 135, 3), (250, 167, 1), (251, 164, 1), (252, 161, 2), + (251, 163, 2), (251, 166, 3), (250, 164, 3), (249, 163, 3), + (221, 132, 3), (193, 108, 2), (165, 84, 2), (141, 69, 5), + (117, 54, 9), (88, 40, 13), (59, 26, 18), (53, 25, 18), + (48, 25, 18), (84, 51, 20), (91, 63, 24), (99, 76, 29), + (98, 83, 42), (98, 90, 56), (99, 100, 71), (101, 110, 87), + (65, 126, 147), (69, 135, 167), (73, 145, 187), (105, 163, 176), + (137, 181, 165), (141, 180, 158), (145, 180, 152), (181, 193, 130), + (214, 190, 94), (226, 176, 50), (191, 172, 76), (157, 168, 102), + (139, 143, 100), (121, 119, 99), (115, 114, 98), (109, 109, 98), + (120, 123, 105), (140, 120, 76), (160, 118, 47), (192, 131, 27), + (225, 145, 7), (234, 150, 4), (243, 155, 2), (246, 162, 4), + (247, 163, 7), (251, 154, 11), (240, 134, 12), (230, 114, 13), + (199, 95, 18), (169, 76, 24), (158, 68, 23), (147, 61, 23), + (78, 21, 27), (51, 18, 32), (24, 15, 38), (14, 18, 33), + (5, 22, 28), (4, 21, 29), (3, 20, 30), (6, 20, 34), + (11, 24, 27), (36, 27, 25), (64, 41, 26), (93, 55, 28), + (110, 64, 29), (128, 73, 30), (154, 86, 34), (180, 104, 32), + (233, 144, 22), (242, 151, 21), (252, 159, 21), (251, 159, 15), + (250, 160, 10), (249, 160, 8), (249, 161, 6), (248, 161, 7), + (243, 162, 10), (195, 144, 17), (160, 130, 40), (126, 117, 63), + (116, 117, 77), (106, 117, 91), (76, 107, 111), (48, 86, 123), + (53, 87, 123), (74, 92, 110), (96, 98, 97), (99, 91, 84), + (102, 85, 71), (112, 74, 43), (118, 71, 16), (126, 78, 6), + (134, 81, 3), (156, 83, 10), (169, 92, 16), (183, 101, 22), + (195, 106, 21), (208, 112, 20), (211, 107, 21), (191, 95, 20), + (139, 63, 25), (104, 44, 25), (69, 25, 26), (52, 18, 25), + (35, 12, 25), (18, 6, 23), (8, 3, 26), (2, 1, 24), + (0, 2, 20), (0, 3, 11), (0, 3, 10), (0, 3, 9), + (0, 3, 9), (1, 4, 10), (5, 4, 9), (10, 4, 9), + (30, 6, 17), (58, 26, 14), (86, 47, 11), (99, 57, 10), + (113, 68, 9), (140, 79, 15), (172, 95, 16), (196, 111, 20), + (206, 119, 21), (172, 102, 31), (157, 97, 43), (142, 92, 55), + (120, 87, 86), (88, 91, 116), (56, 100, 139), (23, 107, 167), + (4, 120, 200), (2, 113, 182), (1, 106, 165), (1, 100, 147), + (1, 95, 130), (0, 80, 104), (0, 56, 70), (0, 32, 41), + (0, 21, 14), (8, 19, 2), (14, 19, 3), (20, 19, 5), + (45, 33, 4), (74, 57, 3), (109, 83, 2), (138, 100, 5), + (201, 142, 5), (214, 153, 4), (228, 165, 4), (245, 176, 6), + (252, 180, 12), (251, 177, 19), (243, 173, 31), (205, 171, 61), + (171, 167, 99), (124, 147, 136), (103, 139, 142), (83, 132, 148), + (53, 116, 151), (25, 104, 154), (21, 89, 132), (13, 69, 113), + (17, 31, 65), (16, 29, 58), (15, 27, 51), (10, 21, 52), + (8, 17, 55), (6, 19, 66), (4, 32, 86), (5, 48, 110), + (7, 67, 132), (5, 87, 151), (1, 112, 171), (2, 123, 188), + (6, 121, 189), (6, 108, 179), (4, 98, 155), (7, 84, 131), + (29, 43, 71), (40, 41, 56), (52, 39, 41), (83, 49, 22), + (116, 67, 9), (142, 81, 4), (167, 100, 1), (196, 120, 1), + (223, 136, 3), (227, 138, 3), (212, 124, 1), (184, 106, 0), + (159, 86, 1), (133, 74, 2), (103, 55, 3), (68, 36, 6), + (40, 18, 10), (21, 13, 14), (11, 11, 18), (6, 16, 27), + (3, 20, 43), (2, 29, 65), (0, 42, 95), (2, 65, 124), + (3, 90, 152), (3, 112, 176), (1, 129, 201), (1, 141, 216), + (5, 140, 215), (13, 132, 189), (33, 126, 157), (65, 131, 126), + (99, 127, 100), (128, 121, 68), (156, 119, 40), (189, 142, 25), + (221, 165, 17), (242, 182, 13), (251, 185, 9), (253, 189, 16), + (253, 193, 15), (253, 192, 13), (255, 180, 5), (250, 158, 6), + (234, 131, 7), (209, 106, 6), (187, 86, 4), (174, 65, 1), + (163, 49, 3), (155, 42, 3), (152, 46, 3), (157, 53, 0), + (160, 62, 0), (160, 66, 0), (155, 68, 0), (146, 62, 0), + (124, 58, 0), (97, 45, 0), (65, 28, 0), (40, 10, 0), + (20, 3, 2), (10, 1, 5), (3, 2, 6), (2, 2, 6), + (7, 2, 7), (16, 2, 8), (34, 8, 10), (59, 28, 10), + (98, 61, 7), (128, 80, 4), (157, 87, 4), (180, 98, 3) + ), + +// 658 Sunny_Field +((117, 176, 112), (110, 170, 116), (110, 170, 127), (111, 171, 138), + (110, 175, 144), (110, 179, 150), (110, 183, 151), (111, 187, 152), + (127, 195, 155), (135, 202, 153), (143, 209, 152), (148, 208, 154), + (153, 208, 157), (155, 209, 158), (157, 210, 159), (154, 210, 157), + (151, 210, 156), (153, 197, 144), (149, 193, 136), (145, 189, 128), + (141, 177, 113), (137, 166, 99), (130, 156, 91), (124, 147, 84), + (87, 107, 58), (69, 87, 46), (51, 68, 34), (42, 64, 32), + (34, 61, 31), (36, 64, 33), (39, 68, 36), (50, 77, 37), + (58, 87, 48), (74, 113, 77), (72, 114, 75), (71, 116, 73), + (59, 113, 72), (48, 110, 71), (44, 106, 66), (40, 102, 62), + (21, 81, 41), (16, 75, 32), (11, 69, 24), (11, 58, 19), + (12, 48, 15), (10, 45, 13), (8, 43, 12), (11, 40, 7), + (19, 44, 9), (41, 57, 16), (55, 68, 17), (70, 80, 18), + (83, 90, 28), (97, 101, 38), (103, 107, 42), (109, 113, 47), + (112, 128, 69), (107, 128, 78), (103, 129, 88), (91, 127, 89), + (79, 125, 91), (76, 121, 90), (74, 118, 90), (64, 110, 88), + (58, 109, 79), (44, 118, 65), (45, 117, 58), (46, 117, 51), + (46, 116, 48), (46, 115, 46), (42, 112, 41), (39, 107, 37), + (43, 92, 28), (41, 86, 28), (39, 81, 29), (44, 89, 35), + (49, 97, 41), (53, 101, 45), (58, 106, 50), (66, 111, 57), + (77, 119, 63), (86, 130, 86), (83, 132, 90), (81, 135, 94), + (79, 135, 90), (78, 136, 87), (75, 135, 81), (66, 132, 79), + (64, 140, 75), (75, 145, 71), (86, 150, 68), (89, 155, 72), + (93, 160, 77), (99, 167, 89), (109, 175, 95), (105, 180, 99), + (96, 182, 105), (76, 182, 103), (60, 176, 100), (45, 171, 97), + (38, 170, 97), (31, 169, 97), (27, 167, 98), (29, 169, 97), + (44, 162, 94), (50, 158, 91), (57, 155, 89), (58, 154, 89), + (60, 154, 90), (60, 153, 86), (61, 148, 82), (56, 148, 81), + (53, 148, 83), (41, 156, 94), (41, 156, 99), (42, 156, 104), + (50, 153, 111), (58, 155, 112), (65, 154, 111), (68, 148, 107), + (71, 132, 91), (69, 131, 79), (68, 130, 67), (64, 127, 60), + (61, 124, 53), (55, 121, 44), (47, 117, 41), (39, 111, 40), + (31, 103, 39), (25, 90, 35), (24, 87, 32), (24, 84, 30), + (26, 74, 30), (34, 74, 33), (41, 75, 39), (56, 87, 44), + (120, 109, 61), (144, 131, 75), (168, 153, 90), (179, 160, 101), + (190, 168, 113), (211, 172, 124), (220, 182, 133), (216, 192, 139), + (203, 200, 148), (166, 189, 160), (154, 185, 161), (142, 182, 163), + (115, 180, 158), (98, 175, 153), (83, 163, 142), (72, 151, 132), + (49, 134, 100), (46, 128, 90), (44, 122, 80), (42, 110, 66), + (39, 105, 49), (37, 104, 40), (39, 106, 32), (45, 105, 31), + (52, 110, 29), (86, 125, 41), (95, 130, 48), (104, 136, 56), + (122, 142, 72), (147, 157, 92), (178, 166, 102), (200, 182, 112), + (214, 201, 135), (214, 203, 139), (215, 206, 143), (208, 210, 145), + (197, 217, 142), (169, 219, 145), (142, 220, 149), (119, 216, 152), + (110, 214, 148), (101, 214, 148), (95, 213, 145), (91, 210, 143), + (93, 205, 131), (95, 200, 122), (94, 192, 111), (90, 180, 103), + (67, 152, 79), (60, 148, 73), (54, 144, 68), (48, 134, 63), + (42, 132, 60), (36, 129, 61), (28, 136, 63), (29, 137, 65), + (27, 129, 64), (26, 128, 65), (25, 134, 74), (34, 147, 90), + (36, 143, 98), (42, 139, 102), (48, 137, 107), (56, 146, 118), + (56, 162, 128), (53, 171, 129), (55, 170, 122), (57, 159, 110), + (60, 156, 103), (64, 159, 99), (69, 160, 96), (73, 155, 92), + (77, 155, 93), (87, 160, 98), (95, 168, 107), (100, 174, 119), + (104, 182, 127), (111, 191, 137), (117, 197, 140), (124, 202, 145), + (130, 210, 145), (139, 215, 145), (144, 217, 141), (147, 217, 134), + (147, 212, 125), (144, 201, 114), (147, 189, 103), (146, 178, 95), + (145, 164, 91), (137, 152, 87), (142, 147, 86), (143, 150, 87), + (144, 156, 96), (139, 166, 104), (145, 175, 110), (155, 185, 114), + (158, 194, 123), (162, 205, 135), (163, 208, 140), (173, 202, 143), + (181, 195, 145), (195, 199, 148), (205, 205, 146), (213, 208, 145), + (222, 204, 145), (227, 204, 147), (229, 208, 145), (223, 217, 143), + (220, 223, 144), (214, 229, 152), (205, 228, 156), (193, 228, 163), + (180, 230, 165), (171, 232, 169), (163, 227, 162), (157, 220, 154), + (145, 212, 141), (133, 204, 133), (124, 193, 121), (120, 184, 118) + ), + +// 659 Sunset +((189, 106, 106), (165, 81, 91), (155, 71, 87), (146, 62, 83), + (137, 51, 81), (129, 41, 80), (123, 36, 79), (117, 31, 78), + (89, 23, 63), (76, 19, 54), (63, 16, 45), (54, 14, 39), + (45, 13, 34), (44, 12, 33), (43, 12, 33), (43, 12, 32), + (44, 12, 32), (49, 12, 34), (53, 11, 34), (57, 10, 35), + (64, 9, 31), (72, 9, 27), (79, 9, 26), (87, 9, 26), + (115, 16, 22), (132, 24, 24), (149, 32, 26), (162, 41, 32), + (175, 50, 39), (181, 53, 40), (187, 57, 42), (200, 61, 44), + (213, 62, 41), (218, 72, 33), (220, 78, 31), (223, 84, 30), + (217, 87, 31), (212, 91, 32), (208, 89, 32), (204, 88, 33), + (184, 74, 31), (167, 66, 29), (151, 59, 27), (136, 53, 24), + (121, 47, 21), (112, 45, 19), (104, 44, 18), (90, 37, 15), + (81, 28, 13), (68, 19, 13), (67, 27, 22), (67, 35, 31), + (75, 50, 42), (83, 65, 54), (86, 72, 59), (90, 79, 65), + (112, 94, 82), (124, 100, 84), (136, 107, 87), (151, 116, 90), + (167, 125, 93), (177, 131, 94), (188, 137, 96), (203, 149, 99), + (213, 156, 102), (223, 142, 95), (218, 128, 84), (214, 114, 74), + (210, 106, 68), (207, 99, 63), (206, 88, 50), (205, 86, 39), + (205, 91, 33), (207, 93, 34), (209, 96, 35), (208, 100, 39), + (208, 105, 44), (208, 105, 43), (208, 105, 43), (207, 108, 42), + (205, 112, 45), (204, 124, 53), (206, 133, 58), (209, 142, 63), + (210, 146, 66), (212, 151, 70), (215, 157, 73), (218, 162, 74), + (213, 161, 75), (205, 152, 71), (198, 144, 68), (193, 138, 66), + (188, 132, 64), (175, 120, 60), (159, 109, 56), (146, 101, 51), + (132, 92, 46), (107, 79, 36), (95, 71, 32), (84, 63, 29), + (78, 58, 27), (73, 54, 25), (59, 43, 19), (46, 32, 15), + (31, 14, 7), (31, 11, 4), (31, 8, 2), (34, 7, 2), + (37, 7, 3), (51, 9, 4), (65, 10, 6), (77, 9, 6), + (88, 8, 7), (107, 7, 9), (110, 7, 8), (114, 8, 8), + (117, 6, 7), (121, 7, 7), (120, 8, 8), (117, 8, 7), + (108, 6, 7), (100, 4, 7), (92, 3, 7), (86, 2, 6), + (80, 2, 5), (69, 0, 3), (55, 0, 3), (45, 0, 4), + (39, 1, 5), (38, 8, 6), (41, 11, 7), (44, 14, 8), + (52, 21, 10), (65, 31, 12), (75, 41, 14), (89, 51, 19), + (117, 69, 35), (132, 76, 43), (147, 84, 52), (154, 84, 54), + (161, 85, 57), (175, 86, 59), (186, 85, 59), (196, 85, 59), + (204, 86, 62), (211, 84, 76), (213, 84, 79), (215, 84, 82), + (220, 86, 88), (223, 89, 93), (226, 92, 99), (228, 93, 102), + (232, 98, 109), (232, 102, 110), (233, 106, 112), (233, 113, 115), + (236, 127, 119), (238, 141, 125), (241, 158, 133), (243, 175, 142), + (242, 186, 154), (248, 208, 164), (246, 208, 164), (245, 209, 164), + (241, 206, 160), (238, 197, 153), (232, 186, 143), (228, 178, 135), + (210, 150, 123), (207, 143, 119), (205, 136, 116), (197, 122, 108), + (187, 108, 98), (180, 95, 85), (172, 81, 71), (167, 69, 63), + (161, 59, 53), (156, 50, 50), (153, 49, 49), (150, 49, 49), + (149, 54, 49), (153, 61, 49), (156, 70, 48), (159, 76, 54), + (168, 89, 56), (169, 92, 55), (171, 96, 55), (169, 99, 56), + (165, 100, 55), (161, 100, 56), (150, 98, 53), (140, 94, 53), + (132, 88, 48), (130, 80, 43), (130, 72, 37), (129, 64, 30), + (126, 53, 24), (127, 45, 20), (124, 34, 18), (119, 28, 21), + (116, 22, 26), (117, 18, 31), (122, 15, 32), (131, 14, 33), + (143, 12, 32), (156, 14, 32), (171, 13, 28), (181, 18, 29), + (186, 23, 32), (190, 31, 39), (193, 41, 42), (192, 49, 46), + (194, 54, 48), (192, 60, 48), (187, 61, 43), (181, 65, 36), + (174, 64, 31), (167, 65, 31), (161, 67, 29), (151, 69, 29), + (144, 68, 29), (141, 66, 27), (135, 61, 26), (126, 58, 24), + (117, 51, 21), (104, 44, 19), (93, 37, 16), (80, 32, 13), + (70, 26, 11), (65, 18, 8), (65, 11, 6), (66, 8, 6), + (70, 5, 4), (70, 4, 3), (71, 4, 3), (72, 6, 3), + (73, 9, 7), (74, 15, 11), (82, 24, 17), (94, 39, 27), + (111, 55, 38), (128, 69, 47), (145, 83, 57), (162, 96, 63), + (178, 107, 72), (185, 115, 80), (194, 120, 85), (202, 132, 92), + (211, 144, 99), (217, 148, 105), (221, 148, 113), (222, 149, 117), + (225, 148, 119), (219, 140, 121), (211, 125, 116), (199, 113, 112) + ), + +// 660 Surfer +((21, 75, 192), (8, 98, 234), (5, 102, 240), (2, 106, 247), + (3, 108, 246), (4, 111, 246), (4, 112, 246), (5, 113, 247), + (3, 119, 252), (5, 119, 249), (8, 119, 246), (12, 112, 234), + (17, 105, 222), (20, 92, 204), (24, 80, 186), (26, 75, 178), + (29, 70, 171), (27, 58, 163), (25, 57, 165), (23, 57, 168), + (21, 63, 174), (20, 70, 180), (17, 75, 187), (14, 80, 195), + (2, 105, 233), (2, 113, 242), (2, 121, 252), (2, 121, 252), + (2, 122, 253), (2, 121, 253), (3, 121, 254), (5, 120, 254), + (8, 120, 253), (21, 99, 224), (31, 84, 197), (41, 69, 170), + (53, 62, 149), (65, 55, 128), (69, 49, 116), (74, 43, 105), + (93, 13, 50), (96, 7, 37), (99, 2, 25), (93, 4, 35), + (88, 7, 45), (84, 11, 55), (80, 16, 65), (67, 31, 94), + (60, 44, 116), (35, 64, 162), (24, 77, 187), (14, 90, 212), + (10, 102, 228), (7, 115, 244), (5, 118, 248), (4, 122, 252), + (0, 125, 254), (0, 128, 254), (0, 131, 254), (0, 132, 254), + (1, 134, 255), (1, 134, 254), (1, 134, 254), (2, 134, 254), + (2, 130, 254), (5, 116, 244), (9, 104, 226), (13, 93, 209), + (18, 86, 197), (23, 80, 185), (38, 66, 159), (53, 52, 135), + (83, 27, 85), (99, 18, 61), (116, 10, 37), (130, 6, 22), + (144, 2, 8), (147, 1, 5), (151, 1, 3), (155, 1, 1), + (159, 1, 1), (165, 1, 1), (168, 1, 1), (172, 1, 1), + (174, 2, 0), (177, 3, 0), (184, 4, 0), (188, 4, 0), + (191, 2, 1), (191, 3, 1), (191, 4, 1), (189, 4, 0), + (188, 4, 0), (177, 4, 1), (165, 2, 2), (153, 1, 4), + (143, 1, 6), (132, 1, 7), (125, 0, 8), (119, 0, 9), + (117, 0, 9), (115, 0, 9), (118, 0, 8), (124, 0, 7), + (137, 0, 6), (137, 1, 6), (137, 2, 7), (135, 2, 9), + (133, 3, 11), (126, 5, 22), (117, 9, 38), (105, 16, 59), + (90, 25, 82), (59, 37, 122), (52, 37, 126), (46, 38, 130), + (39, 37, 134), (39, 37, 133), (45, 37, 127), (58, 35, 117), + (90, 23, 79), (106, 15, 56), (123, 8, 34), (130, 5, 26), + (138, 3, 18), (151, 1, 8), (165, 1, 4), (176, 1, 2), + (184, 1, 2), (190, 0, 1), (189, 0, 1), (189, 1, 2), + (189, 1, 2), (193, 1, 2), (202, 7, 1), (211, 13, 0), + (218, 60, 1), (220, 84, 2), (223, 109, 4), (228, 111, 5), + (233, 114, 6), (244, 119, 10), (231, 119, 26), (207, 135, 52), + (178, 146, 83), (137, 143, 131), (125, 130, 140), (113, 117, 149), + (88, 102, 170), (60, 87, 189), (35, 83, 197), (34, 79, 187), + (50, 57, 141), (54, 51, 131), (59, 45, 122), (68, 31, 97), + (79, 19, 70), (89, 10, 46), (99, 4, 25), (106, 2, 16), + (111, 1, 13), (112, 0, 10), (110, 0, 11), (109, 0, 13), + (101, 2, 23), (93, 4, 34), (83, 9, 50), (74, 14, 64), + (59, 19, 84), (57, 18, 83), (56, 18, 83), (55, 17, 86), + (56, 18, 84), (61, 18, 82), (71, 17, 75), (84, 14, 59), + (98, 8, 43), (112, 4, 26), (117, 1, 17), (122, 0, 12), + (130, 0, 7), (135, 0, 4), (142, 0, 2), (142, 0, 1), + (139, 0, 3), (139, 0, 3), (139, 0, 3), (146, 0, 2), + (153, 0, 0), (158, 0, 0), (165, 0, 0), (172, 0, 0), + (185, 6, 0), (197, 12, 0), (207, 18, 0), (219, 25, 0), + (225, 25, 1), (235, 31, 3), (244, 37, 6), (250, 43, 7), + (254, 49, 6), (254, 50, 6), (254, 48, 5), (249, 43, 7), + (239, 37, 8), (229, 30, 7), (218, 26, 6), (214, 24, 3), + (208, 18, 2), (198, 12, 2), (188, 6, 1), (178, 0, 2), + (178, 0, 1), (182, 0, 1), (192, 6, 1), (202, 12, 1), + (208, 17, 1), (213, 17, 1), (214, 10, 2), (217, 11, 1), + (216, 12, 3), (210, 18, 7), (192, 20, 17), (165, 19, 35), + (137, 22, 59), (113, 25, 85), (94, 36, 109), (73, 44, 130), + (52, 53, 151), (30, 60, 170), (17, 63, 184), (15, 63, 186), + (17, 61, 182), (25, 58, 175), (23, 56, 166), (21, 52, 159), + (24, 43, 140), (29, 33, 122), (42, 23, 105), (50, 18, 90), + (56, 18, 86), (66, 17, 77), (77, 15, 65), (91, 11, 52), + (103, 7, 37), (114, 5, 29), (122, 4, 22), (125, 3, 19), + (125, 3, 19), (114, 5, 29), (102, 14, 49), (90, 26, 76), + (73, 39, 106), (61, 50, 128), (44, 57, 150), (30, 65, 171) + ), + +// 661 Tequila +((197, 113, 40), (197, 107, 47), (196, 104, 48), (195, 102, 49), + (195, 100, 47), (196, 98, 46), (198, 97, 46), (200, 97, 46), + (205, 96, 43), (205, 92, 43), (205, 88, 44), (203, 83, 42), + (201, 79, 41), (197, 72, 38), (194, 65, 36), (193, 62, 34), + (193, 59, 33), (192, 59, 37), (191, 62, 47), (190, 66, 57), + (192, 76, 69), (194, 86, 81), (194, 91, 86), (194, 96, 92), + (191, 107, 111), (191, 115, 119), (191, 124, 128), (191, 131, 135), + (191, 139, 142), (192, 142, 144), (193, 146, 147), (195, 152, 152), + (197, 158, 154), (201, 162, 158), (202, 158, 158), (204, 155, 158), + (205, 151, 153), (207, 147, 149), (207, 144, 144), (207, 142, 140), + (206, 130, 117), (207, 123, 103), (209, 117, 90), (206, 107, 81), + (204, 98, 72), (201, 93, 70), (199, 89, 69), (195, 82, 68), + (193, 78, 66), (190, 69, 61), (190, 69, 57), (190, 69, 53), + (188, 72, 54), (186, 76, 56), (184, 79, 59), (183, 82, 63), + (175, 93, 87), (174, 95, 99), (173, 97, 111), (176, 100, 115), + (180, 104, 120), (183, 105, 122), (187, 107, 124), (192, 112, 127), + (197, 117, 128), (203, 128, 132), (203, 126, 134), (203, 125, 136), + (202, 122, 133), (201, 120, 131), (196, 113, 125), (192, 103, 116), + (185, 84, 95), (180, 78, 82), (175, 73, 69), (174, 68, 60), + (174, 63, 51), (174, 62, 47), (175, 61, 43), (175, 60, 40), + (174, 59, 42), (176, 58, 58), (175, 60, 66), (175, 63, 75), + (176, 63, 80), (177, 63, 85), (181, 62, 95), (186, 62, 97), + (192, 62, 95), (193, 62, 94), (195, 63, 94), (195, 63, 94), + (195, 64, 95), (195, 66, 94), (197, 66, 92), (199, 64, 97), + (203, 61, 94), (203, 51, 79), (201, 46, 67), (200, 41, 56), + (197, 39, 51), (195, 38, 46), (190, 36, 36), (188, 35, 25), + (194, 39, 16), (199, 43, 15), (204, 48, 14), (206, 50, 13), + (209, 53, 13), (212, 58, 13), (214, 62, 14), (213, 63, 14), + (214, 63, 14), (213, 67, 14), (213, 70, 15), (214, 73, 17), + (214, 82, 23), (214, 92, 31), (214, 102, 42), (214, 112, 54), + (216, 125, 76), (217, 127, 85), (218, 129, 94), (219, 129, 98), + (221, 130, 103), (223, 131, 111), (225, 134, 120), (224, 138, 132), + (221, 143, 145), (214, 154, 172), (213, 153, 178), (212, 153, 184), + (210, 147, 192), (211, 138, 199), (212, 133, 202), (214, 131, 202), + (213, 131, 206), (208, 134, 205), (204, 137, 205), (202, 139, 202), + (200, 141, 200), (198, 139, 190), (196, 129, 181), (193, 121, 170), + (190, 113, 157), (182, 99, 134), (181, 94, 129), (180, 90, 125), + (176, 88, 117), (172, 89, 107), (172, 92, 96), (173, 89, 86), + (179, 76, 63), (180, 72, 56), (182, 68, 50), (184, 60, 39), + (186, 51, 30), (187, 44, 25), (186, 39, 22), (186, 38, 19), + (189, 38, 20), (196, 45, 26), (198, 48, 29), (201, 52, 33), + (208, 58, 42), (213, 66, 52), (218, 74, 64), (220, 82, 76), + (222, 94, 97), (222, 96, 100), (223, 98, 104), (221, 104, 109), + (219, 113, 117), (217, 119, 124), (219, 127, 130), (220, 135, 140), + (220, 144, 151), (219, 151, 164), (218, 156, 177), (218, 161, 187), + (218, 162, 193), (218, 164, 198), (216, 164, 201), (217, 164, 200), + (220, 166, 197), (221, 167, 197), (222, 168, 197), (223, 168, 197), + (223, 171, 201), (224, 172, 203), (225, 171, 207), (225, 170, 211), + (226, 168, 211), (227, 164, 208), (229, 159, 203), (228, 154, 195), + (227, 145, 183), (223, 136, 171), (217, 128, 159), (211, 121, 148), + (205, 113, 138), (202, 109, 128), (201, 107, 118), (199, 103, 110), + (194, 100, 102), (186, 97, 91), (176, 91, 81), (166, 82, 71), + (155, 74, 61), (143, 65, 51), (132, 57, 45), (124, 54, 37), + (121, 53, 35), (118, 50, 34), (116, 54, 33), (116, 56, 37), + (118, 62, 43), (121, 68, 52), (123, 73, 60), (123, 75, 71), + (124, 77, 81), (129, 81, 92), (139, 83, 103), (147, 89, 108), + (155, 91, 114), (162, 95, 116), (170, 97, 117), (175, 99, 115), + (178, 98, 116), (179, 98, 116), (181, 98, 115), (186, 98, 114), + (190, 99, 110), (192, 95, 105), (193, 92, 101), (198, 88, 93), + (200, 85, 81), (201, 82, 70), (199, 79, 60), (196, 77, 51), + (192, 75, 42), (191, 76, 33), (191, 75, 26), (191, 76, 24), + (195, 77, 23), (197, 76, 21), (198, 75, 19), (197, 75, 19), + (198, 76, 22), (197, 79, 25), (197, 88, 27), (196, 94, 28), + (195, 100, 30), (197, 107, 32), (199, 111, 37), (200, 114, 39) + ), + +// 662 Thistle +((153, 156, 146), (160, 169, 153), (167, 172, 161), (174, 176, 170), + (167, 173, 162), (161, 170, 154), (160, 168, 154), (159, 166, 155), + (175, 163, 168), (183, 153, 181), (191, 144, 194), (192, 142, 188), + (194, 140, 182), (183, 138, 161), (173, 136, 140), (158, 132, 132), + (144, 129, 124), (109, 117, 75), (101, 107, 72), (94, 98, 70), + (100, 87, 88), (107, 76, 107), (119, 75, 120), (131, 75, 134), + (167, 100, 177), (179, 119, 188), (192, 139, 200), (192, 153, 198), + (193, 168, 197), (186, 172, 186), (179, 176, 175), (158, 173, 150), + (135, 155, 133), (94, 117, 87), (78, 103, 69), (62, 90, 51), + (60, 88, 46), (58, 87, 41), (61, 90, 39), (64, 93, 37), + (75, 111, 25), (76, 115, 26), (77, 120, 27), (75, 117, 23), + (73, 114, 20), (67, 111, 19), (61, 108, 19), (53, 101, 20), + (49, 96, 21), (49, 92, 29), (53, 93, 36), (57, 95, 43), + (66, 101, 50), (76, 108, 58), (78, 109, 62), (81, 110, 67), + (85, 108, 75), (85, 108, 74), (85, 109, 74), (82, 102, 72), + (79, 95, 71), (76, 91, 68), (73, 88, 65), (65, 82, 60), + (57, 77, 60), (51, 56, 58), (42, 51, 52), (34, 47, 46), + (30, 46, 45), (27, 46, 44), (26, 44, 44), (31, 47, 41), + (40, 58, 50), (46, 59, 57), (53, 61, 65), (63, 58, 74), + (73, 56, 84), (73, 56, 88), (74, 56, 93), (71, 58, 92), + (69, 55, 88), (65, 48, 83), (70, 55, 89), (76, 63, 96), + (79, 71, 99), (83, 79, 103), (92, 96, 102), (101, 101, 112), + (127, 117, 143), (137, 114, 151), (148, 111, 159), (151, 101, 164), + (154, 92, 170), (161, 82, 181), (167, 84, 188), (176, 80, 197), + (179, 63, 203), (171, 52, 195), (165, 65, 186), (159, 78, 177), + (153, 80, 172), (148, 82, 167), (143, 88, 155), (142, 104, 142), + (155, 143, 153), (160, 159, 152), (165, 176, 151), (166, 180, 149), + (168, 184, 148), (166, 182, 146), (160, 181, 137), (152, 176, 123), + (142, 174, 103), (120, 157, 66), (114, 150, 60), (109, 144, 54), + (98, 140, 46), (85, 128, 39), (79, 121, 40), (76, 109, 44), + (77, 97, 62), (79, 98, 71), (82, 100, 80), (83, 100, 81), + (84, 101, 82), (92, 105, 83), (97, 105, 86), (98, 112, 84), + (94, 119, 76), (94, 121, 61), (96, 122, 60), (98, 123, 59), + (106, 135, 60), (117, 151, 67), (132, 166, 78), (147, 176, 102), + (179, 198, 149), (189, 208, 160), (199, 218, 172), (201, 218, 171), + (204, 218, 171), (204, 212, 172), (207, 212, 178), (204, 213, 188), + (201, 210, 183), (187, 175, 163), (183, 165, 167), (179, 155, 172), + (173, 138, 183), (169, 119, 183), (156, 98, 173), (138, 76, 151), + (104, 48, 112), (98, 45, 106), (92, 42, 101), (77, 40, 79), + (56, 33, 56), (38, 33, 35), (28, 33, 24), (25, 37, 17), + (20, 35, 12), (18, 34, 11), (20, 37, 11), (22, 40, 12), + (27, 47, 11), (26, 48, 11), (27, 43, 14), (24, 38, 15), + (22, 43, 16), (22, 44, 22), (23, 45, 28), (26, 44, 47), + (35, 46, 65), (48, 48, 81), (64, 54, 95), (77, 64, 110), + (84, 72, 116), (88, 76, 117), (91, 80, 110), (96, 83, 104), + (90, 85, 90), (80, 81, 75), (67, 75, 61), (62, 67, 60), + (61, 56, 62), (61, 52, 64), (61, 48, 67), (64, 39, 78), + (70, 35, 88), (79, 38, 96), (89, 37, 106), (97, 37, 120), + (109, 29, 137), (115, 30, 142), (115, 26, 140), (107, 30, 135), + (102, 26, 133), (96, 27, 121), (83, 22, 102), (65, 24, 82), + (46, 25, 66), (32, 24, 51), (26, 25, 37), (26, 29, 31), + (29, 40, 33), (35, 45, 41), (55, 55, 56), (77, 74, 70), + (102, 97, 91), (118, 123, 109), (140, 139, 131), (155, 161, 143), + (166, 174, 151), (163, 185, 148), (159, 185, 146), (150, 181, 141), + (142, 173, 132), (129, 160, 119), (118, 145, 111), (106, 126, 109), + (98, 111, 114), (96, 96, 120), (99, 87, 127), (100, 78, 130), + (102, 70, 134), (105, 61, 137), (113, 62, 135), (120, 71, 126), + (122, 83, 118), (122, 91, 115), (120, 97, 115), (119, 105, 118), + (113, 105, 120), (112, 99, 128), (114, 91, 136), (117, 91, 147), + (115, 93, 152), (121, 93, 158), (130, 92, 157), (138, 100, 155), + (145, 121, 155), (161, 147, 162), (177, 164, 173), (189, 181, 180), + (199, 195, 188), (215, 211, 200), (227, 219, 216), (233, 228, 229), + (234, 229, 234), (229, 228, 230), (212, 217, 215), (191, 203, 192), + (166, 182, 162), (160, 174, 159), (159, 172, 163), (163, 167, 169) + ), + +// 663 Tribal +((106, 84, 41), (99, 83, 51), (98, 85, 56), (98, 88, 61), + (97, 87, 65), (96, 87, 69), (97, 88, 69), (98, 90, 70), + (120, 100, 69), (125, 103, 66), (131, 106, 63), (132, 105, 57), + (134, 105, 52), (119, 93, 46), (105, 81, 40), (98, 75, 36), + (91, 70, 33), (81, 54, 22), (89, 57, 18), (98, 60, 15), + (113, 71, 13), (128, 83, 11), (129, 84, 11), (130, 86, 11), + (123, 85, 12), (122, 84, 10), (121, 84, 9), (125, 87, 10), + (130, 90, 12), (136, 94, 12), (143, 99, 13), (156, 108, 15), + (168, 117, 20), (172, 128, 34), (172, 132, 41), (172, 136, 49), + (170, 138, 58), (168, 141, 67), (165, 140, 71), (163, 140, 75), + (151, 140, 99), (146, 141, 113), (142, 143, 128), (140, 146, 144), + (138, 150, 161), (139, 151, 164), (141, 152, 168), (133, 148, 176), + (128, 146, 180), (98, 126, 183), (86, 119, 182), (75, 112, 181), + (69, 108, 179), (64, 105, 178), (62, 100, 174), (60, 96, 171), + (52, 80, 147), (42, 68, 132), (33, 57, 117), (21, 48, 109), + (10, 40, 101), (7, 38, 99), (4, 37, 98), (1, 34, 97), + (1, 34, 97), (1, 36, 100), (2, 37, 103), (3, 39, 106), + (3, 37, 101), (3, 36, 97), (3, 35, 92), (3, 33, 89), + (3, 32, 87), (7, 33, 85), (12, 34, 83), (23, 42, 84), + (35, 50, 85), (42, 54, 81), (49, 58, 77), (63, 65, 68), + (78, 72, 57), (98, 80, 28), (111, 87, 23), (124, 95, 18), + (130, 99, 19), (137, 104, 20), (152, 116, 22), (167, 129, 28), + (201, 162, 41), (210, 174, 50), (219, 186, 60), (221, 190, 65), + (224, 195, 70), (227, 200, 77), (221, 195, 80), (204, 186, 87), + (189, 176, 92), (159, 152, 91), (144, 141, 91), (129, 131, 92), + (126, 128, 91), (123, 125, 91), (116, 115, 85), (99, 101, 80), + (63, 70, 66), (45, 52, 54), (27, 34, 42), (18, 26, 38), + (9, 18, 34), (1, 9, 26), (1, 5, 17), (1, 2, 11), + (1, 1, 7), (1, 1, 5), (1, 1, 5), (1, 1, 5), + (1, 1, 5), (1, 1, 5), (2, 1, 5), (2, 1, 5), + (11, 5, 5), (21, 11, 4), (31, 18, 4), (36, 22, 4), + (42, 26, 4), (53, 33, 4), (64, 40, 4), (73, 45, 4), + (66, 41, 4), (63, 38, 4), (63, 38, 3), (63, 38, 3), + (63, 38, 3), (63, 38, 2), (65, 39, 2), (73, 45, 2), + (55, 35, 2), (44, 27, 2), (33, 20, 3), (27, 16, 2), + (22, 13, 2), (11, 6, 2), (3, 0, 3), (3, 0, 3), + (3, 0, 3), (3, 0, 4), (3, 0, 4), (4, 0, 5), + (3, 0, 5), (3, 0, 5), (3, 0, 6), (3, 0, 6), + (3, 0, 5), (3, 0, 5), (3, 0, 5), (3, 0, 5), + (3, 0, 6), (3, 1, 7), (9, 6, 7), (18, 13, 8), + (29, 20, 8), (51, 35, 11), (54, 38, 12), (58, 41, 14), + (67, 48, 16), (70, 50, 19), (77, 57, 22), (87, 64, 27), + (111, 82, 31), (118, 86, 31), (126, 91, 31), (139, 100, 32), + (153, 110, 35), (162, 118, 37), (170, 127, 39), (176, 134, 44), + (179, 138, 45), (182, 144, 47), (187, 148, 50), (191, 150, 50), + (194, 152, 51), (197, 154, 50), (201, 158, 49), (204, 163, 50), + (204, 164, 53), (202, 163, 54), (200, 162, 56), (188, 153, 57), + (171, 142, 60), (153, 129, 62), (137, 117, 63), (122, 107, 65), + (110, 99, 67), (98, 90, 67), (89, 83, 66), (78, 73, 63), + (63, 62, 60), (49, 50, 58), (36, 40, 54), (24, 29, 50), + (14, 22, 46), (6, 16, 43), (2, 13, 40), (10, 15, 36), + (20, 19, 31), (28, 20, 25), (28, 18, 20), (28, 17, 15), + (29, 17, 11), (38, 22, 8), (42, 26, 7), (55, 34, 6), + (72, 48, 7), (95, 65, 7), (112, 81, 9), (127, 92, 8), + (134, 100, 12), (144, 110, 13), (147, 115, 14), (149, 116, 13), + (152, 118, 14), (160, 122, 13), (170, 129, 13), (170, 129, 11), + (162, 123, 12), (151, 116, 13), (138, 108, 12), (124, 97, 12), + (109, 86, 12), (93, 72, 11), (86, 65, 12), (71, 54, 15), + (64, 48, 17), (60, 44, 17), (60, 43, 17), (60, 43, 17), + (64, 46, 17), (70, 51, 15), (83, 62, 14), (91, 68, 16), + (101, 77, 18), (111, 84, 18), (122, 92, 18), (132, 98, 18), + (140, 102, 17), (143, 101, 13), (143, 100, 9), (138, 94, 6), + (129, 89, 6), (118, 82, 7), (109, 77, 10), (104, 76, 14), + (106, 78, 18), (105, 77, 23), (105, 78, 28), (105, 82, 34) + ), + +// 664 Trippy +((0, 86, 253), (0, 120, 253), (0, 129, 253), (0, 138, 253), + (0, 144, 251), (0, 151, 249), (0, 155, 242), (0, 160, 235), + (3, 174, 171), (22, 175, 146), (41, 177, 122), (71, 174, 112), + (101, 172, 102), (115, 157, 74), (129, 143, 47), (128, 133, 33), + (127, 124, 19), (126, 115, 57), (118, 99, 77), (110, 83, 97), + (82, 75, 84), (54, 67, 71), (39, 66, 72), (25, 66, 73), + (4, 53, 110), (14, 45, 125), (24, 38, 141), (26, 31, 140), + (28, 25, 140), (25, 21, 137), (22, 18, 134), (25, 11, 130), + (26, 7, 127), (29, 2, 114), (19, 2, 90), (9, 2, 67), + (6, 4, 44), (3, 6, 22), (6, 5, 15), (10, 5, 9), + (17, 4, 12), (13, 6, 23), (10, 9, 34), (11, 13, 37), + (13, 18, 40), (15, 18, 41), (17, 18, 42), (14, 27, 71), + (7, 34, 104), (0, 46, 142), (0, 42, 134), (0, 39, 127), + (0, 44, 144), (0, 50, 161), (0, 52, 169), (0, 55, 177), + (0, 65, 126), (0, 72, 104), (0, 80, 82), (3, 82, 73), + (7, 84, 65), (13, 90, 57), (19, 97, 49), (33, 114, 30), + (55, 125, 13), (95, 96, 8), (116, 87, 26), (137, 78, 44), + (139, 77, 49), (142, 76, 55), (147, 70, 54), (134, 52, 45), + (124, 27, 52), (101, 19, 53), (79, 11, 54), (54, 6, 36), + (29, 1, 18), (24, 1, 12), (20, 1, 7), (12, 1, 0), + (7, 0, 0), (1, 1, 0), (0, 1, 0), (0, 1, 0), + (0, 1, 0), (0, 1, 1), (0, 1, 3), (0, 1, 11), + (0, 8, 42), (0, 19, 66), (0, 30, 90), (0, 37, 100), + (0, 44, 111), (0, 54, 133), (0, 64, 139), (1, 71, 130), + (4, 85, 125), (22, 115, 108), (28, 123, 87), (34, 131, 66), + (32, 134, 52), (30, 137, 39), (27, 142, 27), (29, 142, 40), + (33, 142, 103), (24, 141, 117), (15, 141, 132), (11, 133, 135), + (7, 126, 138), (0, 107, 144), (0, 86, 147), (0, 70, 139), + (0, 61, 126), (0, 34, 75), (0, 27, 61), (0, 20, 48), + (0, 8, 33), (5, 3, 34), (11, 2, 48), (16, 3, 66), + (12, 4, 110), (12, 4, 135), (12, 5, 161), (15, 5, 173), + (19, 6, 185), (27, 8, 206), (32, 9, 224), (37, 8, 222), + (33, 7, 212), (25, 5, 162), (23, 5, 153), (22, 5, 144), + (32, 5, 122), (31, 4, 97), (24, 2, 68), (15, 1, 38), + (0, 1, 6), (0, 2, 3), (0, 3, 1), (0, 3, 1), + (0, 3, 1), (0, 5, 5), (0, 8, 11), (0, 11, 27), + (0, 17, 46), (0, 35, 97), (0, 43, 107), (0, 51, 118), + (0, 69, 145), (0, 90, 170), (0, 103, 191), (0, 120, 217), + (0, 162, 241), (0, 172, 242), (0, 183, 243), (0, 194, 237), + (0, 187, 229), (0, 181, 216), (4, 177, 186), (11, 177, 156), + (22, 182, 128), (28, 148, 90), (27, 134, 76), (27, 120, 62), + (23, 97, 37), (25, 87, 16), (33, 76, 1), (28, 66, 1), + (12, 32, 1), (7, 25, 1), (3, 19, 2), (4, 16, 2), + (11, 24, 2), (23, 37, 1), (40, 52, 1), (58, 67, 1), + (73, 81, 1), (90, 97, 1), (97, 115, 0), (102, 133, 0), + (107, 152, 0), (111, 164, 0), (120, 174, 0), (121, 187, 8), + (90, 203, 43), (79, 202, 57), (69, 202, 71), (55, 187, 85), + (47, 172, 96), (52, 160, 93), (41, 143, 96), (29, 126, 103), + (14, 100, 104), (0, 69, 98), (0, 47, 78), (0, 28, 57), + (0, 16, 40), (0, 10, 35), (0, 5, 38), (0, 2, 45), + (0, 2, 53), (0, 2, 59), (0, 6, 58), (4, 10, 55), + (12, 17, 55), (23, 24, 54), (35, 23, 50), (47, 23, 43), + (60, 20, 27), (77, 27, 14), (98, 31, 5), (116, 31, 0), + (129, 27, 0), (134, 13, 2), (134, 11, 3), (133, 10, 3), + (130, 10, 3), (124, 10, 2), (117, 3, 2), (100, 4, 3), + (80, 6, 3), (61, 6, 3), (46, 6, 2), (42, 4, 1), + (42, 4, 7), (42, 6, 15), (45, 6, 25), (50, 5, 31), + (65, 3, 26), (88, 3, 23), (110, 9, 22), (131, 21, 25), + (145, 39, 31), (163, 56, 25), (181, 81, 18), (197, 105, 8), + (210, 129, 2), (199, 144, 2), (185, 140, 1), (169, 132, 9), + (152, 121, 19), (137, 121, 32), (116, 115, 45), (89, 102, 61), + (65, 77, 89), (44, 48, 118), (26, 32, 148), (16, 21, 170), + (6, 23, 186), (0, 26, 208), (0, 34, 228), (0, 41, 245), + (0, 48, 253), (0, 56, 253), (0, 60, 253), (0, 71, 254) + ), + +// 665 Tropic +((111, 42, 86), (103, 43, 110), (97, 43, 117), (91, 43, 125), + (85, 42, 130), (79, 42, 135), (76, 41, 135), (74, 41, 135), + (71, 38, 133), (71, 37, 131), (71, 36, 129), (71, 33, 128), + (72, 31, 127), (70, 28, 125), (69, 26, 123), (67, 25, 122), + (66, 24, 121), (65, 23, 110), (67, 26, 100), (69, 29, 90), + (75, 33, 79), (82, 38, 68), (86, 41, 63), (91, 45, 59), + (114, 65, 49), (126, 76, 40), (139, 88, 31), (152, 100, 21), + (166, 112, 12), (172, 118, 8), (179, 124, 4), (191, 137, 1), + (202, 145, 0), (222, 163, 0), (229, 170, 0), (236, 177, 0), + (241, 181, 0), (247, 185, 0), (248, 188, 0), (250, 192, 0), + (254, 199, 0), (254, 201, 0), (255, 204, 0), (255, 204, 0), + (255, 204, 0), (255, 204, 0), (255, 204, 0), (255, 204, 0), + (255, 204, 0), (255, 200, 0), (255, 193, 0), (255, 187, 0), + (255, 183, 0), (255, 179, 0), (255, 174, 0), (255, 170, 0), + (255, 168, 5), (255, 163, 8), (255, 158, 11), (255, 153, 14), + (255, 148, 17), (255, 146, 18), (255, 145, 19), (255, 139, 22), + (255, 136, 25), (255, 133, 33), (255, 134, 38), (255, 135, 43), + (255, 136, 44), (255, 137, 46), (255, 139, 50), (255, 139, 51), + (251, 143, 54), (247, 144, 54), (243, 145, 54), (238, 145, 54), + (234, 145, 55), (231, 143, 56), (229, 141, 58), (224, 137, 66), + (215, 132, 77), (192, 114, 100), (177, 99, 109), (162, 84, 118), + (155, 77, 121), (148, 70, 125), (139, 58, 135), (135, 47, 150), + (120, 29, 173), (111, 23, 184), (103, 17, 195), (99, 14, 197), + (96, 12, 200), (91, 7, 201), (93, 4, 201), (91, 2, 199), + (95, 2, 195), (109, 6, 183), (117, 9, 172), (125, 13, 162), + (129, 16, 155), (134, 19, 149), (137, 27, 132), (144, 35, 117), + (161, 55, 96), (170, 65, 84), (180, 75, 72), (185, 81, 66), + (191, 88, 60), (201, 100, 46), (210, 109, 32), (217, 119, 22), + (222, 129, 16), (231, 146, 9), (232, 148, 7), (234, 150, 6), + (236, 151, 4), (239, 152, 2), (240, 156, 0), (240, 156, 0), + (237, 162, 0), (233, 163, 0), (230, 165, 0), (228, 164, 0), + (227, 163, 0), (222, 159, 0), (216, 155, 1), (210, 151, 2), + (203, 146, 3), (189, 140, 4), (186, 138, 4), (184, 136, 5), + (179, 130, 5), (174, 126, 6), (170, 118, 6), (166, 110, 7), + (158, 96, 9), (154, 86, 9), (151, 77, 9), (150, 73, 9), + (149, 70, 10), (148, 64, 12), (146, 56, 15), (143, 47, 21), + (140, 41, 28), (131, 20, 38), (128, 17, 43), (125, 14, 49), + (119, 9, 60), (113, 4, 73), (106, 1, 87), (106, 0, 108), + (94, 0, 138), (92, 0, 145), (91, 0, 152), (88, 0, 166), + (86, 0, 179), (85, 0, 190), (86, 0, 199), (87, 1, 208), + (94, 3, 214), (109, 10, 223), (116, 12, 224), (123, 15, 225), + (136, 20, 224), (148, 25, 219), (161, 30, 212), (168, 36, 201), + (174, 49, 164), (179, 53, 157), (184, 58, 150), (192, 65, 137), + (200, 72, 123), (206, 79, 111), (209, 83, 98), (210, 92, 88), + (208, 98, 81), (201, 99, 81), (193, 98, 83), (183, 94, 88), + (173, 85, 91), (164, 81, 100), (156, 80, 110), (153, 76, 111), + (150, 71, 116), (150, 70, 116), (150, 69, 116), (149, 67, 116), + (149, 65, 115), (148, 67, 114), (151, 69, 107), (159, 74, 101), + (168, 77, 89), (179, 82, 79), (190, 91, 71), (199, 93, 58), + (207, 99, 45), (211, 105, 35), (215, 114, 31), (216, 118, 27), + (217, 120, 24), (218, 123, 22), (219, 126, 19), (220, 124, 15), + (221, 123, 11), (223, 123, 8), (225, 126, 4), (226, 125, 2), + (226, 125, 2), (226, 122, 4), (225, 116, 7), (225, 107, 11), + (224, 99, 16), (224, 93, 22), (224, 87, 29), (225, 77, 36), + (227, 70, 43), (230, 63, 48), (233, 49, 46), (234, 42, 48), + (235, 39, 55), (235, 37, 63), (236, 37, 67), (236, 38, 74), + (239, 39, 75), (242, 40, 80), (246, 40, 78), (250, 43, 70), + (253, 47, 67), (254, 53, 59), (255, 66, 60), (255, 78, 59), + (255, 87, 54), (255, 96, 48), (255, 104, 40), (255, 111, 33), + (255, 113, 25), (255, 116, 17), (255, 113, 12), (254, 115, 9), + (251, 114, 9), (248, 113, 9), (244, 111, 9), (240, 106, 11), + (235, 101, 12), (230, 96, 13), (225, 85, 15), (219, 75, 19), + (211, 67, 24), (202, 60, 32), (190, 57, 42), (174, 44, 44), + (158, 43, 52), (143, 42, 62), (130, 41, 70), (119, 41, 79) + ), + +// 666 True_Blue +((0, 19, 94), (0, 18, 93), (0, 17, 92), (0, 16, 92), + (0, 19, 93), (1, 22, 94), (2, 24, 95), (3, 26, 97), + (5, 28, 95), (8, 28, 86), (11, 29, 77), (13, 28, 71), + (16, 27, 65), (14, 23, 61), (12, 20, 58), (11, 18, 57), + (11, 16, 56), (12, 14, 53), (8, 12, 60), (4, 11, 68), + (2, 12, 76), (1, 14, 85), (1, 16, 88), (2, 18, 91), + (5, 26, 104), (6, 29, 113), (8, 33, 122), (8, 35, 126), + (8, 38, 130), (8, 38, 131), (8, 39, 133), (8, 37, 131), + (8, 33, 132), (6, 27, 129), (4, 27, 125), (2, 27, 121), + (2, 27, 120), (2, 27, 120), (4, 28, 121), (7, 30, 122), + (19, 48, 137), (19, 52, 138), (19, 56, 140), (19, 54, 138), + (19, 53, 137), (20, 52, 135), (21, 52, 134), (21, 49, 124), + (18, 42, 110), (5, 23, 79), (2, 16, 70), (0, 10, 62), + (0, 6, 58), (0, 3, 54), (0, 2, 53), (0, 1, 52), + (0, 0, 55), (0, 0, 59), (0, 1, 63), (0, 1, 67), + (0, 2, 72), (0, 2, 73), (0, 3, 74), (0, 4, 75), + (0, 4, 76), (1, 6, 82), (3, 9, 89), (6, 12, 97), + (7, 14, 104), (8, 17, 111), (12, 25, 122), (16, 36, 133), + (20, 56, 147), (19, 64, 158), (19, 72, 170), (19, 82, 176), + (19, 93, 183), (20, 100, 184), (21, 107, 186), (21, 110, 194), + (20, 107, 201), (16, 86, 203), (14, 82, 202), (12, 79, 201), + (12, 77, 201), (12, 75, 202), (17, 70, 199), (16, 58, 195), + (14, 41, 176), (10, 38, 167), (6, 35, 158), (6, 33, 154), + (7, 31, 150), (8, 30, 141), (10, 26, 134), (9, 19, 127), + (5, 14, 120), (2, 10, 110), (3, 12, 106), (4, 14, 102), + (4, 14, 100), (5, 14, 98), (4, 17, 95), (4, 19, 93), + (7, 22, 83), (9, 22, 74), (12, 22, 66), (12, 22, 63), + (12, 22, 61), (10, 22, 59), (8, 20, 57), (7, 17, 56), + (8, 16, 53), (9, 14, 56), (8, 13, 57), (7, 12, 58), + (3, 10, 62), (1, 10, 64), (2, 11, 66), (4, 15, 69), + (19, 34, 87), (25, 42, 98), (31, 50, 109), (30, 51, 109), + (30, 53, 109), (33, 54, 104), (36, 55, 105), (40, 57, 105), + (41, 56, 105), (28, 42, 81), (24, 35, 73), (21, 28, 65), + (16, 19, 52), (13, 12, 45), (10, 9, 41), (7, 7, 40), + (2, 2, 44), (1, 2, 45), (0, 2, 47), (0, 2, 46), + (0, 2, 45), (0, 2, 43), (0, 1, 40), (0, 1, 36), + (0, 2, 32), (0, 3, 25), (0, 2, 24), (0, 2, 24), + (0, 0, 25), (0, 1, 31), (0, 2, 38), (0, 3, 47), + (0, 4, 64), (0, 4, 68), (1, 4, 73), (1, 4, 79), + (1, 4, 83), (2, 4, 85), (1, 4, 86), (1, 4, 86), + (0, 6, 86), (1, 13, 89), (2, 16, 92), (3, 20, 96), + (6, 30, 106), (13, 44, 118), (24, 60, 134), (36, 79, 151), + (77, 124, 189), (87, 135, 196), (98, 147, 204), (112, 158, 215), + (118, 166, 224), (106, 170, 230), (107, 178, 237), (113, 193, 243), + (118, 195, 245), (120, 193, 245), (100, 181, 241), (77, 168, 235), + (62, 165, 232), (58, 161, 228), (58, 155, 227), (58, 141, 224), + (42, 106, 198), (37, 98, 186), (32, 91, 175), (23, 75, 154), + (18, 57, 135), (11, 43, 116), (7, 30, 99), (5, 23, 81), + (2, 19, 68), (1, 16, 61), (0, 19, 61), (0, 23, 64), + (2, 29, 71), (6, 34, 82), (7, 39, 96), (8, 43, 110), + (7, 47, 121), (6, 48, 128), (7, 48, 136), (8, 42, 139), + (8, 39, 139), (7, 36, 138), (4, 32, 133), (2, 30, 131), + (1, 25, 130), (2, 23, 127), (5, 24, 122), (12, 30, 117), + (21, 39, 117), (27, 51, 123), (32, 60, 132), (32, 62, 136), + (32, 62, 134), (35, 60, 129), (35, 59, 127), (33, 61, 130), + (28, 57, 135), (20, 48, 138), (14, 37, 136), (8, 27, 138), + (5, 20, 142), (2, 19, 144), (1, 19, 147), (1, 20, 146), + (0, 21, 145), (1, 19, 147), (2, 19, 143), (2, 19, 137), + (1, 19, 124), (1, 18, 106), (0, 14, 90), (1, 9, 74), + (2, 6, 62), (2, 4, 50), (4, 4, 41), (5, 4, 34), + (5, 4, 30), (6, 4, 32), (5, 5, 36), (5, 6, 42), + (6, 8, 48), (5, 9, 56), (6, 9, 68), (5, 10, 81), + (3, 11, 91), (3, 14, 97), (1, 18, 100), (0, 21, 103), + (2, 19, 104), (2, 17, 103), (2, 16, 100), (1, 16, 96) + ), + +// 667 Tryst +((165, 198, 195), (171, 198, 186), (185, 202, 186), (200, 207, 187), + (209, 204, 183), (219, 202, 179), (219, 197, 173), (219, 192, 167), + (197, 157, 133), (181, 140, 116), (166, 124, 99), (158, 113, 89), + (150, 103, 80), (150, 98, 78), (150, 94, 76), (151, 93, 76), + (153, 93, 76), (155, 97, 77), (157, 105, 82), (160, 113, 88), + (164, 121, 95), (169, 130, 103), (174, 133, 106), (179, 137, 110), + (190, 142, 115), (190, 135, 110), (191, 129, 105), (179, 119, 95), + (168, 109, 86), (160, 102, 81), (152, 96, 76), (137, 84, 66), + (126, 76, 60), (113, 55, 45), (114, 48, 40), (115, 41, 36), + (115, 35, 30), (115, 30, 25), (116, 32, 24), (117, 35, 24), + (119, 48, 27), (125, 52, 28), (131, 57, 30), (136, 51, 28), + (141, 46, 26), (141, 44, 22), (142, 42, 19), (141, 41, 17), + (139, 44, 14), (144, 59, 10), (142, 60, 15), (141, 61, 21), + (139, 62, 30), (137, 64, 40), (135, 68, 45), (134, 72, 50), + (131, 90, 67), (133, 95, 67), (136, 101, 68), (129, 97, 71), + (122, 93, 74), (118, 92, 75), (115, 91, 77), (104, 85, 85), + (93, 83, 93), (93, 85, 86), (89, 79, 81), (86, 74, 76), + (84, 70, 72), (82, 67, 69), (78, 59, 63), (72, 52, 63), + (60, 45, 60), (57, 48, 60), (54, 51, 61), (58, 56, 60), + (62, 62, 60), (65, 63, 61), (68, 65, 63), (75, 69, 67), + (80, 69, 68), (83, 71, 67), (85, 72, 67), (87, 73, 67), + (87, 71, 67), (88, 69, 67), (92, 69, 67), (98, 67, 65), + (115, 67, 64), (121, 72, 65), (127, 77, 67), (128, 77, 68), + (130, 77, 70), (133, 81, 74), (134, 81, 75), (135, 83, 76), + (137, 84, 75), (146, 96, 77), (153, 99, 81), (160, 103, 86), + (163, 104, 88), (166, 106, 90), (172, 111, 93), (178, 114, 92), + (186, 122, 92), (184, 124, 94), (183, 126, 96), (183, 128, 99), + (183, 130, 102), (188, 137, 108), (194, 146, 116), (201, 156, 122), + (210, 169, 133), (220, 192, 154), (220, 196, 159), (221, 200, 165), + (223, 206, 172), (225, 212, 179), (227, 216, 182), (230, 219, 187), + (228, 224, 195), (224, 221, 195), (220, 219, 195), (218, 215, 192), + (216, 212, 190), (212, 203, 180), (208, 193, 168), (200, 179, 157), + (189, 171, 149), (174, 155, 130), (173, 152, 124), (172, 150, 119), + (171, 145, 108), (173, 138, 94), (173, 125, 80), (166, 113, 68), + (140, 85, 49), (131, 78, 42), (122, 71, 36), (119, 70, 34), + (116, 69, 32), (114, 66, 29), (111, 66, 31), (102, 63, 37), + (89, 64, 45), (73, 66, 56), (72, 68, 58), (71, 70, 61), + (76, 76, 65), (88, 84, 72), (100, 92, 79), (109, 103, 90), + (126, 123, 106), (129, 126, 108), (133, 130, 111), (141, 131, 112), + (149, 127, 109), (156, 117, 104), (157, 108, 103), (157, 103, 103), + (157, 100, 102), (147, 101, 103), (144, 100, 101), (142, 99, 99), + (136, 93, 93), (126, 86, 89), (114, 79, 87), (104, 73, 82), + (82, 68, 77), (77, 68, 75), (73, 69, 73), (69, 66, 65), + (69, 64, 59), (71, 60, 54), (78, 60, 50), (86, 62, 44), + (97, 64, 42), (104, 69, 40), (113, 72, 36), (124, 77, 33), + (138, 82, 34), (155, 92, 37), (171, 104, 39), (189, 114, 44), + (211, 129, 53), (211, 127, 52), (211, 126, 51), (203, 120, 50), + (194, 115, 48), (181, 110, 45), (173, 104, 45), (165, 102, 49), + (159, 101, 51), (152, 93, 47), (146, 84, 44), (146, 75, 40), + (141, 69, 37), (140, 69, 35), (143, 77, 37), (152, 93, 46), + (161, 109, 52), (172, 125, 60), (186, 139, 65), (196, 149, 72), + (204, 156, 77), (211, 163, 80), (216, 172, 86), (214, 176, 90), + (205, 179, 92), (191, 178, 87), (176, 174, 84), (161, 164, 80), + (146, 153, 77), (134, 150, 72), (128, 142, 75), (123, 136, 75), + (119, 130, 76), (116, 127, 77), (115, 124, 76), (116, 116, 78), + (119, 119, 75), (129, 123, 78), (141, 129, 81), (153, 131, 87), + (164, 136, 90), (171, 138, 92), (174, 133, 93), (172, 124, 89), + (165, 117, 83), (155, 113, 76), (147, 101, 74), (142, 94, 70), + (135, 86, 65), (132, 81, 62), (133, 73, 57), (135, 67, 50), + (133, 68, 43), (134, 72, 45), (139, 77, 51), (147, 88, 55), + (157, 101, 63), (173, 114, 75), (189, 128, 85), (203, 140, 90), + (210, 153, 99), (209, 161, 114), (202, 168, 122), (188, 174, 127), + (176, 177, 134), (167, 179, 147), (164, 182, 154), (165, 186, 164), + (171, 193, 179), (175, 195, 191), (173, 197, 197), (168, 199, 195) + ), + +// 668 Tumbleweed +((85, 75, 65), (84, 76, 61), (88, 78, 62), (93, 81, 64), + (111, 93, 71), (129, 106, 78), (134, 111, 82), (140, 116, 86), + (146, 122, 90), (147, 119, 84), (148, 117, 78), (138, 111, 77), + (129, 105, 76), (115, 94, 71), (101, 83, 67), (97, 80, 64), + (93, 77, 62), (91, 81, 69), (95, 87, 76), (100, 94, 83), + (105, 99, 88), (110, 105, 93), (111, 106, 94), (113, 107, 95), + (116, 111, 98), (111, 106, 93), (106, 102, 89), (97, 90, 79), + (89, 79, 69), (85, 74, 63), (82, 69, 57), (76, 63, 47), + (70, 60, 41), (64, 56, 35), (63, 53, 31), (63, 51, 27), + (61, 52, 30), (59, 53, 33), (59, 53, 36), (59, 54, 39), + (59, 54, 47), (57, 53, 50), (55, 52, 53), (54, 52, 54), + (54, 52, 56), (55, 52, 56), (56, 53, 56), (57, 55, 54), + (61, 58, 53), (73, 63, 51), (78, 66, 51), (84, 70, 51), + (87, 74, 52), (90, 78, 53), (90, 77, 53), (91, 77, 54), + (88, 74, 59), (81, 71, 59), (75, 68, 59), (64, 60, 54), + (54, 53, 50), (50, 48, 47), (46, 44, 45), (39, 36, 38), + (32, 29, 31), (21, 19, 20), (20, 18, 19), (19, 17, 18), + (20, 17, 17), (21, 18, 17), (25, 22, 18), (28, 25, 19), + (34, 30, 21), (35, 31, 19), (37, 32, 17), (36, 31, 15), + (35, 30, 14), (34, 28, 13), (33, 26, 13), (32, 23, 12), + (30, 21, 11), (28, 21, 17), (31, 23, 20), (34, 25, 24), + (36, 26, 25), (38, 28, 27), (43, 33, 30), (47, 38, 32), + (52, 40, 26), (49, 37, 22), (47, 34, 18), (43, 32, 17), + (40, 31, 17), (36, 29, 14), (31, 24, 10), (27, 22, 6), + (21, 17, 3), (14, 11, 8), (15, 12, 12), (16, 13, 16), + (17, 14, 17), (18, 16, 18), (20, 18, 18), (22, 19, 19), + (25, 21, 25), (27, 23, 25), (29, 26, 26), (29, 27, 26), + (30, 28, 27), (31, 30, 28), (32, 32, 31), (35, 34, 33), + (37, 36, 34), (41, 36, 32), (41, 35, 31), (41, 35, 30), + (40, 32, 28), (38, 31, 28), (36, 30, 29), (37, 30, 29), + (37, 29, 31), (35, 29, 33), (34, 30, 35), (34, 32, 37), + (35, 35, 40), (39, 40, 45), (43, 44, 48), (46, 45, 50), + (48, 45, 50), (51, 52, 54), (53, 54, 55), (56, 56, 57), + (61, 60, 62), (68, 64, 65), (71, 66, 70), (72, 70, 73), + (73, 72, 76), (73, 70, 74), (73, 68, 73), (71, 67, 71), + (70, 66, 69), (67, 61, 64), (61, 57, 58), (56, 51, 51), + (51, 46, 47), (48, 41, 41), (47, 41, 40), (47, 41, 40), + (47, 42, 40), (47, 43, 42), (48, 45, 45), (52, 48, 51), + (60, 58, 64), (62, 60, 65), (64, 63, 67), (69, 69, 70), + (73, 72, 70), (79, 75, 68), (87, 76, 66), (92, 75, 60), + (95, 74, 56), (85, 65, 40), (82, 62, 38), (79, 59, 36), + (75, 54, 30), (71, 49, 30), (67, 46, 30), (59, 43, 31), + (47, 41, 40), (47, 43, 43), (47, 45, 47), (53, 51, 53), + (60, 56, 60), (67, 62, 67), (74, 69, 74), (84, 77, 76), + (94, 85, 78), (101, 89, 75), (105, 89, 70), (103, 84, 66), + (98, 78, 57), (93, 72, 49), (84, 63, 40), (74, 53, 28), + (54, 37, 14), (53, 35, 12), (52, 33, 11), (52, 37, 17), + (59, 44, 26), (72, 58, 44), (88, 80, 63), (114, 103, 82), + (133, 125, 100), (150, 142, 112), (162, 152, 123), (162, 157, 128), + (169, 161, 129), (166, 160, 130), (159, 154, 124), (149, 144, 117), + (134, 130, 106), (125, 123, 95), (122, 118, 89), (123, 118, 92), + (126, 122, 101), (133, 128, 110), (139, 135, 120), (145, 141, 122), + (148, 145, 126), (149, 147, 128), (148, 147, 131), (147, 144, 133), + (142, 140, 131), (136, 132, 126), (128, 125, 115), (119, 117, 106), + (112, 110, 98), (107, 105, 91), (103, 98, 87), (99, 95, 81), + (94, 91, 75), (88, 87, 70), (82, 81, 63), (76, 74, 55), + (70, 66, 51), (63, 60, 48), (55, 54, 44), (48, 47, 41), + (42, 40, 34), (38, 32, 28), (34, 26, 24), (29, 22, 20), + (24, 17, 16), (20, 15, 11), (19, 12, 8), (18, 12, 5), + (19, 14, 7), (21, 16, 11), (24, 21, 16), (29, 27, 21), + (33, 34, 25), (40, 41, 32), (46, 47, 40), (52, 52, 47), + (59, 57, 54), (65, 62, 58), (70, 66, 61), (74, 70, 66), + (78, 74, 70), (83, 77, 72), (90, 82, 74), (93, 84, 75), + (88, 79, 70), (84, 74, 66), (77, 69, 64), (78, 69, 62) + ), + +// 669 Type_AB_Positive +((116, 19, 18), (115, 19, 18), (105, 22, 19), (95, 26, 20), + (82, 25, 19), (70, 24, 18), (64, 23, 17), (58, 23, 17), + (40, 27, 18), (37, 27, 19), (35, 28, 20), (39, 28, 20), + (43, 28, 20), (52, 28, 21), (62, 28, 22), (67, 26, 22), + (73, 25, 23), (105, 27, 26), (116, 28, 27), (127, 29, 28), + (131, 33, 34), (136, 38, 40), (139, 38, 40), (143, 38, 40), + (155, 34, 34), (153, 34, 34), (151, 34, 35), (148, 35, 35), + (146, 36, 36), (148, 34, 34), (151, 33, 32), (160, 27, 25), + (166, 26, 23), (169, 29, 27), (171, 30, 28), (174, 32, 29), + (180, 32, 28), (187, 33, 28), (189, 35, 28), (191, 37, 29), + (195, 37, 29), (195, 37, 29), (195, 37, 29), (188, 37, 30), + (182, 37, 32), (175, 37, 33), (168, 38, 34), (153, 37, 34), + (137, 37, 34), (105, 35, 31), (89, 33, 31), (74, 32, 32), + (65, 30, 29), (56, 29, 27), (54, 28, 26), (53, 28, 25), + (49, 30, 25), (48, 29, 25), (47, 28, 25), (46, 25, 24), + (45, 23, 23), (44, 25, 23), (44, 27, 24), (40, 29, 25), + (37, 29, 23), (31, 24, 20), (30, 24, 19), (30, 24, 19), + (30, 25, 19), (31, 26, 20), (34, 27, 20), (39, 29, 20), + (53, 28, 18), (64, 25, 17), (76, 23, 17), (88, 23, 18), + (100, 24, 19), (102, 22, 18), (105, 20, 17), (107, 20, 13), + (107, 20, 13), (102, 21, 16), (92, 19, 16), (82, 18, 16), + (76, 17, 15), (70, 17, 15), (61, 18, 14), (56, 21, 16), + (55, 26, 23), (59, 26, 25), (63, 27, 28), (63, 27, 28), + (64, 27, 28), (65, 27, 25), (66, 29, 24), (67, 33, 26), + (68, 38, 29), (71, 44, 34), (73, 52, 38), (76, 61, 43), + (77, 63, 44), (78, 66, 45), (79, 66, 48), (76, 47, 47), + (73, 54, 51), (69, 55, 48), (66, 57, 45), (62, 47, 41), + (58, 37, 37), (53, 31, 31), (45, 27, 27), (41, 26, 25), + (41, 28, 25), (49, 30, 25), (50, 29, 25), (52, 29, 25), + (56, 31, 25), (60, 33, 25), (63, 33, 26), (64, 31, 26), + (60, 32, 23), (58, 31, 21), (57, 31, 19), (58, 31, 18), + (59, 32, 18), (60, 30, 16), (66, 29, 16), (75, 27, 18), + (89, 25, 17), (123, 30, 19), (131, 30, 19), (139, 30, 19), + (155, 32, 21), (171, 31, 22), (186, 35, 25), (197, 37, 26), + (204, 37, 26), (203, 37, 26), (202, 38, 26), (201, 38, 26), + (200, 38, 27), (195, 35, 26), (185, 34, 26), (174, 28, 23), + (158, 27, 21), (128, 29, 23), (119, 30, 24), (111, 31, 25), + (95, 26, 24), (79, 24, 21), (65, 23, 21), (53, 22, 20), + (42, 32, 26), (42, 32, 27), (43, 32, 29), (51, 37, 35), + (63, 41, 43), (83, 58, 60), (102, 57, 61), (119, 54, 59), + (134, 55, 54), (158, 61, 58), (162, 60, 56), (167, 59, 55), + (169, 47, 47), (160, 42, 38), (142, 30, 20), (128, 28, 18), + (99, 27, 18), (91, 25, 17), (83, 23, 16), (71, 24, 15), + (65, 25, 14), (63, 27, 14), (67, 28, 15), (75, 25, 17), + (87, 25, 19), (102, 27, 18), (115, 26, 18), (122, 26, 17), + (125, 24, 17), (125, 23, 18), (122, 24, 18), (118, 26, 19), + (95, 25, 16), (87, 25, 17), (80, 26, 18), (65, 25, 18), + (54, 27, 17), (45, 31, 18), (38, 29, 18), (34, 32, 20), + (27, 31, 19), (22, 29, 20), (25, 29, 22), (31, 31, 23), + (35, 30, 25), (41, 36, 28), (47, 35, 30), (53, 36, 33), + (59, 37, 33), (64, 38, 32), (70, 42, 31), (75, 43, 30), + (77, 42, 30), (77, 40, 29), (72, 34, 25), (66, 31, 22), + (62, 28, 20), (59, 27, 18), (57, 25, 17), (57, 25, 17), + (56, 23, 16), (59, 20, 15), (64, 18, 14), (69, 17, 13), + (77, 20, 12), (82, 21, 11), (85, 25, 11), (89, 28, 11), + (86, 27, 11), (82, 27, 12), (75, 24, 12), (67, 27, 13), + (61, 30, 15), (54, 31, 16), (47, 31, 18), (40, 28, 18), + (34, 25, 19), (31, 25, 19), (27, 30, 20), (23, 29, 21), + (24, 28, 21), (27, 27, 21), (27, 21, 27), (27, 21, 27), + (24, 21, 28), (24, 21, 28), (28, 21, 28), (28, 20, 22), + (29, 20, 24), (28, 20, 22), (28, 20, 20), (27, 20, 20), + (28, 25, 20), (28, 25, 20), (28, 22, 20), (30, 22, 19), + (33, 19, 19), (41, 22, 19), (52, 21, 19), (67, 22, 18), + (81, 21, 19), (94, 20, 20), (102, 25, 21), (110, 23, 21) + ), + +// 670 Underwater_Day +((29, 150, 138), (65, 164, 138), (81, 173, 150), (98, 183, 163), + (115, 186, 168), (133, 190, 173), (133, 186, 175), (133, 182, 178), + (123, 169, 157), (104, 159, 154), (86, 149, 151), (69, 142, 154), + (53, 136, 157), (58, 135, 169), (64, 134, 181), (66, 130, 186), + (69, 127, 192), (60, 144, 186), (46, 138, 182), (32, 132, 179), + (18, 120, 174), (5, 109, 170), (12, 103, 166), (19, 98, 162), + (58, 72, 150), (82, 71, 148), (107, 70, 146), (114, 74, 147), + (121, 79, 148), (115, 84, 147), (110, 89, 147), (94, 98, 145), + (73, 108, 147), (34, 120, 138), (33, 126, 140), (33, 133, 143), + (37, 131, 140), (41, 129, 137), (45, 127, 133), (49, 126, 129), + (39, 101, 118), (40, 93, 108), (42, 86, 98), (42, 85, 98), + (43, 84, 98), (42, 88, 98), (41, 93, 98), (39, 97, 97), + (36, 104, 104), (43, 113, 115), (57, 105, 113), (72, 98, 112), + (95, 96, 111), (119, 95, 111), (128, 96, 108), (138, 98, 105), + (144, 97, 132), (137, 109, 148), (130, 121, 165), (116, 121, 168), + (102, 121, 172), (92, 121, 168), (83, 122, 165), (66, 116, 148), + (57, 109, 115), (48, 84, 71), (48, 66, 48), (49, 48, 26), + (48, 42, 22), (47, 36, 18), (33, 35, 11), (25, 41, 7), + (12, 47, 41), (10, 60, 58), (8, 73, 76), (22, 76, 103), + (36, 79, 131), (46, 83, 133), (56, 88, 136), (77, 85, 139), + (90, 81, 138), (87, 58, 118), (73, 45, 102), (60, 32, 86), + (49, 26, 76), (39, 20, 67), (32, 18, 49), (29, 12, 33), + (39, 16, 16), (60, 27, 42), (81, 38, 68), (97, 46, 79), + (114, 54, 90), (140, 86, 117), (159, 97, 151), (181, 95, 165), + (177, 109, 163), (160, 104, 152), (131, 110, 143), (102, 116, 135), + (96, 121, 136), (91, 127, 138), (79, 143, 156), (74, 159, 155), + (92, 165, 176), (105, 158, 176), (118, 151, 177), (117, 144, 177), + (116, 138, 177), (118, 129, 168), (116, 118, 150), (106, 100, 140), + (93, 83, 112), (57, 53, 75), (52, 47, 70), (47, 41, 66), + (39, 44, 67), (31, 55, 83), (35, 54, 90), (43, 54, 102), + (51, 86, 143), (61, 86, 146), (71, 87, 150), (71, 95, 150), + (71, 103, 151), (82, 119, 148), (91, 123, 142), (87, 119, 131), + (83, 120, 132), (110, 103, 141), (112, 101, 145), (115, 100, 150), + (140, 119, 158), (160, 122, 164), (154, 119, 165), (153, 137, 168), + (126, 144, 148), (111, 139, 147), (97, 135, 147), (90, 134, 143), + (83, 134, 140), (75, 135, 142), (62, 140, 149), (53, 134, 152), + (56, 124, 152), (86, 128, 168), (100, 126, 171), (115, 125, 175), + (139, 131, 185), (165, 144, 191), (176, 150, 194), (172, 162, 198), + (149, 153, 184), (139, 150, 182), (130, 147, 180), (117, 147, 176), + (119, 137, 172), (118, 125, 174), (119, 117, 169), (134, 112, 154), + (143, 111, 147), (137, 106, 135), (136, 110, 131), (135, 115, 127), + (123, 117, 127), (111, 114, 127), (110, 120, 124), (115, 122, 112), + (109, 121, 110), (109, 122, 107), (109, 124, 105), (97, 126, 113), + (74, 127, 118), (55, 116, 115), (40, 102, 117), (28, 87, 108), + (12, 61, 83), (10, 39, 67), (12, 24, 51), (5, 11, 31), + (3, 9, 21), (4, 11, 13), (7, 11, 8), (9, 13, 9), + (12, 8, 4), (15, 8, 4), (19, 9, 5), (18, 9, 2), + (20, 8, 4), (23, 9, 8), (21, 14, 9), (21, 20, 22), + (29, 26, 40), (39, 32, 53), (50, 45, 72), (64, 59, 98), + (85, 63, 126), (97, 78, 151), (101, 101, 165), (110, 109, 180), + (114, 120, 207), (124, 162, 218), (143, 183, 210), (159, 175, 217), + (178, 191, 233), (193, 196, 229), (200, 190, 212), (202, 177, 202), + (189, 155, 183), (173, 163, 146), (159, 164, 112), (141, 134, 90), + (125, 137, 81), (97, 150, 81), (78, 141, 84), (62, 140, 100), + (33, 139, 111), (20, 137, 105), (11, 123, 93), (5, 101, 78), + (12, 86, 71), (29, 75, 67), (50, 77, 66), (67, 83, 74), + (89, 86, 77), (113, 96, 83), (110, 101, 90), (100, 94, 73), + (94, 88, 48), (68, 81, 52), (49, 74, 50), (39, 68, 32), + (28, 64, 44), (36, 62, 65), (52, 55, 61), (65, 46, 58), + (87, 38, 64), (111, 33, 57), (115, 27, 38), (124, 21, 39), + (133, 34, 56), (126, 53, 72), (125, 65, 105), (134, 93, 146), + (147, 119, 177), (144, 137, 205), (129, 155, 231), (134, 159, 229), + (130, 157, 213), (97, 152, 205), (70, 148, 184), (59, 150, 165), + (43, 141, 155), (26, 133, 146), (14, 136, 142), (16, 143, 139) + ), + +// 671 Venice +((79, 14, 7), (81, 38, 30), (94, 53, 45), (107, 69, 61), + (129, 91, 72), (152, 114, 84), (161, 122, 92), (170, 131, 100), + (199, 156, 129), (191, 161, 137), (184, 166, 145), (160, 173, 152), + (137, 181, 160), (119, 180, 165), (101, 179, 171), (95, 173, 170), + (90, 168, 169), (73, 158, 167), (75, 161, 170), (78, 164, 173), + (83, 157, 167), (89, 150, 161), (92, 145, 156), (95, 140, 151), + (100, 130, 139), (94, 120, 129), (88, 110, 119), (84, 96, 106), + (81, 82, 93), (82, 75, 86), (84, 68, 80), (80, 66, 75), + (78, 63, 69), (69, 70, 79), (80, 68, 75), (91, 67, 72), + (96, 74, 79), (102, 81, 86), (96, 92, 98), (90, 103, 111), + (120, 119, 108), (140, 120, 98), (161, 121, 88), (166, 125, 91), + (172, 130, 94), (175, 132, 90), (178, 134, 87), (181, 138, 89), + (177, 143, 91), (156, 141, 106), (158, 141, 104), (161, 142, 103), + (164, 145, 107), (167, 148, 111), (167, 151, 116), (167, 154, 122), + (190, 170, 126), (199, 170, 115), (208, 171, 105), (207, 168, 99), + (206, 165, 93), (203, 158, 90), (201, 151, 88), (191, 129, 77), + (179, 107, 64), (141, 73, 35), (117, 53, 25), (94, 34, 16), + (85, 27, 13), (76, 21, 11), (62, 8, 10), (50, 11, 14), + (21, 18, 21), (19, 21, 21), (18, 24, 22), (28, 33, 26), + (39, 43, 31), (43, 43, 33), (47, 43, 35), (58, 41, 30), + (71, 32, 26), (94, 34, 25), (95, 35, 40), (96, 36, 55), + (98, 36, 60), (101, 37, 66), (113, 43, 72), (124, 56, 63), + (121, 70, 79), (117, 71, 95), (113, 72, 112), (115, 73, 111), + (118, 75, 111), (123, 80, 96), (121, 74, 84), (109, 60, 80), + (100, 44, 74), (101, 25, 62), (103, 20, 49), (106, 15, 36), + (104, 13, 30), (102, 11, 24), (95, 8, 15), (85, 14, 18), + (72, 33, 35), (64, 43, 48), (57, 54, 61), (52, 58, 68), + (48, 62, 76), (40, 69, 89), (37, 82, 102), (38, 96, 116), + (40, 107, 123), (49, 105, 125), (50, 101, 119), (52, 97, 114), + (55, 85, 102), (52, 75, 91), (49, 69, 76), (45, 60, 66), + (49, 39, 38), (50, 36, 39), (52, 33, 40), (50, 37, 45), + (48, 41, 51), (44, 52, 59), (46, 61, 66), (46, 70, 79), + (47, 81, 91), (29, 97, 109), (26, 97, 108), (24, 98, 108), + (25, 100, 110), (30, 96, 110), (38, 93, 116), (45, 89, 123), + (57, 88, 138), (68, 94, 149), (80, 100, 160), (86, 104, 165), + (92, 109, 170), (97, 113, 176), (99, 117, 178), (102, 130, 182), + (102, 132, 183), (91, 142, 171), (83, 145, 168), (75, 148, 166), + (62, 158, 169), (52, 168, 180), (43, 176, 187), (37, 177, 187), + (21, 174, 181), (18, 174, 181), (16, 174, 182), (14, 173, 182), + (19, 169, 180), (20, 164, 173), (25, 151, 161), (31, 140, 151), + (36, 130, 141), (41, 124, 135), (41, 124, 134), (41, 124, 134), + (41, 124, 134), (36, 125, 133), (31, 128, 135), (26, 132, 138), + (20, 141, 149), (18, 141, 149), (16, 142, 150), (16, 141, 148), + (16, 141, 147), (17, 142, 147), (21, 143, 150), (22, 143, 150), + (26, 137, 145), (29, 131, 138), (29, 125, 129), (27, 121, 123), + (24, 117, 119), (19, 111, 114), (17, 108, 110), (12, 103, 108), + (7, 105, 108), (8, 104, 108), (9, 104, 108), (14, 106, 110), + (20, 107, 115), (24, 112, 120), (30, 118, 126), (36, 123, 132), + (41, 127, 136), (46, 130, 139), (48, 131, 140), (49, 131, 141), + (50, 130, 140), (50, 129, 137), (55, 122, 132), (60, 112, 129), + (66, 101, 127), (71, 94, 121), (74, 92, 110), (78, 88, 97), + (79, 86, 94), (80, 82, 94), (80, 80, 100), (75, 85, 99), + (71, 89, 95), (64, 98, 96), (57, 104, 100), (52, 109, 111), + (46, 115, 119), (44, 117, 123), (43, 121, 127), (42, 123, 130), + (43, 125, 132), (44, 126, 134), (44, 127, 136), (45, 127, 136), + (45, 127, 137), (45, 127, 137), (45, 127, 138), (46, 127, 139), + (47, 129, 139), (50, 129, 140), (53, 128, 140), (59, 125, 144), + (65, 122, 150), (71, 122, 159), (79, 121, 166), (82, 120, 167), + (86, 117, 168), (88, 115, 167), (93, 114, 168), (107, 118, 171), + (122, 124, 166), (136, 129, 163), (150, 140, 154), (157, 148, 145), + (170, 154, 139), (183, 160, 126), (193, 159, 116), (200, 159, 105), + (197, 143, 89), (195, 126, 78), (187, 107, 64), (178, 85, 50), + (168, 75, 40), (153, 53, 25), (142, 33, 14), (126, 17, 10), + (111, 2, 5), (98, 2, 5), (88, 2, 5), (81, 3, 3) + ), + +// 672 Victoria +((103, 95, 129), (114, 85, 111), (123, 80, 103), (132, 75, 96), + (140, 73, 89), (148, 71, 83), (151, 72, 80), (154, 74, 77), + (174, 79, 64), (180, 75, 59), (187, 72, 54), (189, 71, 53), + (191, 70, 53), (187, 73, 55), (183, 76, 57), (178, 77, 57), + (174, 78, 58), (152, 66, 61), (140, 60, 60), (129, 55, 60), + (117, 52, 60), (106, 50, 60), (100, 49, 60), (94, 48, 60), + (72, 43, 60), (66, 42, 59), (60, 42, 58), (63, 42, 55), + (67, 42, 53), (71, 42, 53), (76, 43, 53), (87, 41, 54), + (100, 41, 53), (113, 41, 53), (114, 41, 53), (116, 42, 53), + (119, 41, 56), (122, 40, 59), (123, 40, 62), (124, 40, 65), + (118, 44, 75), (108, 49, 80), (99, 55, 86), (91, 59, 92), + (84, 64, 99), (82, 64, 101), (81, 65, 104), (78, 66, 104), + (75, 66, 104), (73, 67, 99), (72, 67, 99), (72, 67, 99), + (70, 66, 98), (69, 66, 97), (68, 65, 96), (68, 65, 96), + (68, 63, 92), (69, 60, 93), (70, 57, 95), (67, 56, 97), + (64, 55, 100), (62, 55, 101), (61, 55, 102), (59, 58, 104), + (60, 57, 104), (63, 58, 105), (66, 62, 108), (70, 66, 111), + (74, 70, 114), (78, 75, 117), (90, 88, 124), (100, 100, 130), + (116, 114, 135), (117, 116, 136), (118, 118, 138), (122, 122, 140), + (127, 127, 143), (130, 128, 140), (134, 130, 137), (133, 130, 137), + (128, 125, 134), (111, 107, 128), (107, 103, 128), (103, 100, 128), + (102, 100, 128), (102, 100, 128), (102, 100, 127), (101, 98, 128), + (88, 90, 125), (82, 84, 121), (77, 78, 117), (75, 75, 116), + (73, 72, 115), (72, 67, 112), (72, 64, 110), (71, 60, 105), + (70, 57, 98), (64, 48, 88), (65, 47, 88), (66, 47, 89), + (68, 48, 91), (70, 50, 94), (75, 56, 96), (81, 66, 98), + (97, 89, 104), (107, 102, 113), (118, 115, 122), (123, 121, 127), + (128, 127, 133), (134, 136, 140), (135, 137, 146), (136, 140, 145), + (134, 140, 143), (125, 128, 140), (121, 124, 139), (118, 120, 138), + (107, 106, 137), (99, 97, 132), (91, 90, 126), (82, 81, 121), + (73, 72, 115), (71, 70, 114), (70, 69, 113), (71, 69, 111), + (72, 69, 110), (75, 70, 107), (81, 73, 102), (88, 73, 97), + (94, 71, 93), (108, 66, 84), (108, 63, 81), (109, 61, 78), + (108, 58, 70), (105, 53, 64), (100, 49, 59), (98, 48, 57), + (96, 45, 57), (93, 45, 57), (91, 45, 57), (88, 44, 57), + (85, 44, 57), (81, 44, 57), (82, 44, 56), (87, 46, 56), + (94, 51, 54), (105, 58, 54), (105, 60, 56), (106, 62, 58), + (108, 64, 64), (108, 65, 70), (112, 66, 74), (112, 65, 75), + (102, 63, 80), (97, 62, 82), (93, 61, 84), (80, 59, 88), + (73, 57, 91), (72, 53, 90), (73, 50, 84), (78, 46, 79), + (88, 42, 76), (106, 48, 70), (111, 50, 69), (117, 53, 68), + (128, 61, 65), (141, 65, 61), (156, 71, 59), (170, 73, 58), + (191, 80, 57), (192, 83, 57), (194, 87, 58), (194, 89, 59), + (194, 92, 58), (186, 91, 57), (178, 86, 52), (165, 81, 49), + (151, 77, 48), (135, 72, 49), (124, 67, 51), (112, 65, 54), + (101, 60, 53), (89, 55, 53), (80, 50, 54), (70, 47, 58), + (67, 53, 74), (68, 56, 78), (70, 60, 83), (74, 67, 91), + (78, 73, 99), (82, 75, 104), (84, 79, 109), (86, 82, 116), + (88, 85, 119), (88, 88, 121), (88, 89, 120), (86, 85, 117), + (83, 81, 110), (77, 76, 103), (73, 73, 97), (69, 70, 93), + (68, 68, 91), (69, 67, 91), (71, 66, 91), (71, 65, 90), + (74, 69, 91), (82, 74, 88), (93, 82, 85), (107, 92, 83), + (123, 102, 83), (137, 110, 82), (147, 115, 81), (154, 116, 75), + (156, 111, 69), (154, 107, 65), (151, 103, 63), (144, 97, 63), + (136, 94, 66), (127, 89, 69), (118, 79, 71), (105, 67, 72), + (93, 56, 75), (79, 46, 79), (69, 40, 85), (63, 38, 91), + (63, 38, 96), (65, 37, 99), (69, 38, 99), (74, 39, 100), + (76, 43, 103), (79, 47, 104), (82, 53, 108), (83, 58, 112), + (84, 59, 110), (85, 58, 106), (83, 58, 102), (81, 57, 97), + (78, 59, 94), (77, 64, 94), (79, 69, 91), (88, 72, 89), + (100, 76, 84), (109, 81, 79), (113, 85, 81), (115, 91, 87), + (112, 96, 97), (114, 102, 107), (119, 105, 115), (128, 112, 117), + (133, 116, 121), (133, 118, 124), (127, 118, 131), (116, 116, 136), + (107, 112, 142), (104, 108, 143), (101, 103, 140), (100, 100, 135) + ), + +// 673 Violet +((50, 27, 100), (48, 28, 96), (50, 28, 96), (53, 28, 97), + (56, 30, 100), (59, 33, 104), (59, 34, 104), (60, 36, 105), + (59, 34, 105), (59, 34, 106), (59, 34, 108), (58, 33, 106), + (58, 33, 105), (58, 32, 101), (58, 31, 98), (58, 31, 97), + (58, 32, 97), (61, 39, 96), (63, 41, 94), (65, 44, 93), + (69, 48, 95), (73, 52, 97), (76, 54, 98), (80, 57, 100), + (89, 62, 107), (93, 66, 114), (98, 70, 122), (105, 80, 134), + (113, 90, 146), (117, 96, 152), (122, 103, 159), (134, 114, 171), + (140, 124, 181), (146, 138, 196), (148, 143, 198), (151, 148, 201), + (152, 148, 201), (153, 148, 202), (152, 148, 202), (152, 148, 203), + (150, 149, 206), (151, 150, 208), (153, 152, 211), (156, 154, 214), + (160, 157, 217), (160, 159, 216), (160, 161, 216), (158, 160, 214), + (154, 155, 205), (146, 136, 190), (141, 131, 189), (136, 127, 188), + (132, 125, 186), (129, 124, 185), (129, 123, 184), (129, 122, 184), + (130, 124, 198), (136, 133, 206), (143, 143, 215), (151, 151, 218), + (159, 160, 221), (162, 163, 222), (165, 166, 224), (173, 172, 226), + (181, 178, 230), (187, 182, 228), (179, 173, 217), (172, 165, 207), + (168, 158, 202), (165, 152, 197), (159, 138, 189), (154, 125, 183), + (130, 102, 168), (122, 95, 163), (115, 89, 158), (120, 93, 163), + (126, 98, 169), (129, 104, 173), (132, 110, 177), (137, 122, 187), + (144, 137, 197), (165, 161, 212), (171, 168, 218), (178, 176, 225), + (178, 177, 226), (178, 178, 228), (176, 175, 228), (172, 169, 225), + (160, 147, 209), (150, 132, 197), (140, 117, 186), (134, 110, 179), + (129, 104, 172), (118, 90, 161), (108, 78, 150), (101, 69, 139), + (96, 63, 132), (93, 64, 124), (96, 72, 128), (99, 80, 132), + (103, 86, 136), (107, 92, 141), (114, 105, 152), (121, 117, 163), + (134, 135, 181), (134, 135, 183), (134, 135, 185), (132, 132, 183), + (130, 130, 182), (124, 121, 175), (117, 109, 165), (105, 94, 150), + (93, 78, 136), (79, 54, 112), (78, 51, 108), (78, 49, 105), + (77, 47, 98), (76, 48, 94), (77, 51, 93), (78, 54, 97), + (85, 65, 109), (87, 69, 112), (90, 73, 116), (90, 72, 117), + (91, 72, 118), (94, 70, 121), (94, 69, 125), (97, 69, 129), + (99, 69, 132), (103, 68, 134), (104, 69, 135), (105, 71, 137), + (110, 79, 143), (118, 90, 152), (126, 104, 163), (133, 117, 172), + (143, 140, 191), (153, 154, 202), (164, 168, 214), (169, 173, 220), + (175, 179, 227), (183, 188, 235), (187, 194, 240), (192, 197, 241), + (197, 200, 242), (208, 205, 248), (209, 206, 248), (211, 207, 249), + (214, 210, 250), (217, 216, 248), (218, 220, 249), (220, 223, 251), + (218, 223, 251), (217, 222, 251), (217, 222, 251), (213, 220, 251), + (210, 219, 252), (206, 215, 252), (203, 210, 249), (201, 207, 247), + (201, 204, 245), (199, 200, 244), (200, 199, 243), (201, 198, 243), + (202, 197, 241), (203, 195, 239), (199, 191, 233), (188, 180, 225), + (175, 157, 206), (171, 152, 201), (168, 148, 197), (159, 140, 187), + (147, 132, 177), (125, 106, 154), (116, 96, 147), (108, 85, 137), + (105, 79, 131), (103, 77, 128), (94, 63, 116), (88, 55, 112), + (83, 49, 109), (80, 45, 109), (74, 43, 108), (69, 38, 107), + (61, 35, 107), (61, 36, 109), (62, 38, 112), (62, 42, 117), + (64, 42, 119), (67, 41, 121), (69, 39, 119), (73, 42, 120), + (77, 48, 122), (81, 52, 123), (86, 53, 126), (91, 57, 127), + (96, 61, 130), (101, 71, 136), (107, 83, 142), (114, 94, 152), + (122, 108, 165), (131, 121, 178), (142, 134, 192), (153, 149, 204), + (166, 163, 214), (178, 176, 225), (187, 187, 234), (193, 194, 240), + (197, 198, 244), (200, 200, 245), (201, 199, 245), (199, 197, 242), + (194, 190, 234), (187, 179, 225), (178, 170, 215), (170, 160, 208), + (162, 154, 202), (158, 153, 199), (156, 151, 197), (156, 153, 196), + (158, 155, 200), (159, 154, 200), (162, 158, 202), (164, 160, 205), + (165, 162, 208), (165, 163, 210), (161, 157, 207), (155, 148, 201), + (148, 139, 193), (143, 133, 189), (141, 130, 187), (140, 128, 186), + (141, 128, 187), (141, 126, 186), (144, 130, 190), (150, 135, 195), + (156, 142, 198), (163, 148, 201), (169, 149, 203), (171, 151, 205), + (170, 150, 207), (163, 149, 207), (154, 144, 202), (146, 135, 196), + (137, 125, 188), (126, 113, 182), (114, 103, 176), (97, 92, 168), + (83, 79, 159), (71, 67, 147), (62, 54, 137), (55, 46, 128), + (49, 40, 121), (46, 35, 114), (47, 31, 107), (49, 28, 102) + ), + +// 674 Violet_Fog +((135, 103, 140), (117, 84, 121), (113, 73, 114), (109, 63, 108), + (103, 60, 103), (97, 58, 99), (92, 56, 95), (88, 55, 91), + (76, 47, 79), (66, 44, 71), (57, 41, 64), (46, 39, 56), + (35, 38, 49), (32, 37, 46), (29, 36, 43), (28, 36, 42), + (28, 36, 42), (24, 37, 40), (23, 37, 39), (22, 37, 38), + (21, 36, 37), (21, 35, 37), (21, 34, 36), (21, 34, 36), + (25, 31, 37), (29, 31, 40), (33, 32, 43), (44, 35, 51), + (55, 39, 59), (60, 41, 64), (66, 43, 69), (74, 46, 77), + (80, 49, 84), (102, 65, 108), (110, 72, 118), (118, 80, 128), + (116, 82, 130), (115, 84, 132), (115, 83, 132), (116, 83, 132), + (118, 84, 129), (111, 80, 121), (104, 76, 114), (94, 68, 103), + (84, 60, 93), (81, 57, 89), (79, 54, 85), (76, 48, 78), + (68, 48, 72), (55, 49, 65), (60, 53, 71), (65, 57, 78), + (72, 66, 89), (79, 76, 100), (83, 83, 107), (87, 90, 115), + (112, 117, 140), (125, 124, 153), (138, 131, 167), (143, 135, 174), + (148, 140, 182), (148, 142, 182), (149, 144, 183), (151, 140, 179), + (149, 131, 171), (126, 102, 144), (111, 92, 129), (96, 83, 114), + (91, 77, 106), (87, 72, 99), (73, 62, 84), (60, 52, 68), + (38, 45, 51), (37, 42, 50), (37, 40, 49), (39, 40, 52), + (41, 41, 56), (45, 43, 59), (50, 45, 63), (59, 49, 72), + (69, 51, 78), (82, 52, 88), (84, 52, 89), (86, 53, 90), + (87, 54, 91), (88, 56, 92), (95, 57, 96), (101, 62, 105), + (110, 70, 121), (110, 75, 123), (110, 81, 125), (112, 85, 128), + (114, 90, 131), (121, 94, 139), (129, 95, 145), (128, 93, 145), + (122, 87, 135), (99, 76, 110), (90, 69, 101), (82, 63, 93), + (79, 60, 90), (76, 58, 87), (72, 57, 86), (69, 60, 87), + (67, 66, 89), (65, 69, 88), (64, 72, 87), (63, 73, 87), + (62, 74, 87), (64, 75, 87), (65, 77, 89), (66, 80, 91), + (68, 84, 91), (71, 88, 94), (71, 88, 95), (72, 89, 97), + (75, 90, 105), (77, 91, 106), (76, 92, 105), (76, 88, 101), + (67, 69, 89), (58, 59, 78), (50, 49, 67), (46, 45, 61), + (42, 41, 55), (36, 33, 44), (34, 27, 41), (33, 25, 40), + (32, 22, 40), (31, 21, 38), (30, 21, 38), (30, 21, 38), + (30, 22, 37), (29, 21, 39), (27, 21, 38), (27, 20, 37), + (26, 21, 34), (26, 22, 34), (26, 23, 34), (26, 23, 34), + (26, 24, 34), (27, 25, 35), (27, 25, 34), (27, 25, 35), + (27, 26, 35), (27, 29, 36), (27, 29, 36), (27, 29, 36), + (27, 30, 36), (26, 29, 36), (25, 29, 36), (26, 30, 37), + (27, 34, 40), (27, 34, 40), (27, 35, 40), (27, 36, 41), + (27, 37, 41), (28, 37, 42), (29, 37, 43), (30, 37, 44), + (30, 37, 44), (31, 35, 44), (31, 34, 44), (32, 34, 44), + (35, 32, 44), (37, 31, 45), (41, 30, 47), (50, 33, 54), + (68, 41, 69), (72, 43, 72), (77, 45, 76), (74, 44, 73), + (74, 46, 75), (74, 48, 76), (74, 50, 78), (81, 57, 86), + (81, 61, 89), (79, 67, 91), (78, 72, 92), (78, 77, 94), + (82, 84, 101), (89, 91, 112), (96, 100, 123), (104, 107, 134), + (117, 115, 148), (117, 116, 150), (118, 117, 153), (115, 118, 154), + (111, 117, 152), (110, 113, 150), (108, 109, 147), (104, 104, 141), + (93, 99, 131), (82, 92, 117), (72, 84, 105), (65, 78, 95), + (60, 71, 88), (54, 64, 79), (49, 58, 69), (43, 51, 60), + (39, 46, 54), (37, 43, 52), (37, 41, 50), (38, 39, 49), + (38, 37, 47), (38, 36, 46), (36, 35, 45), (34, 36, 44), + (33, 36, 45), (32, 36, 45), (33, 37, 45), (34, 37, 46), + (33, 37, 46), (33, 37, 46), (33, 37, 46), (33, 36, 46), + (34, 34, 45), (34, 33, 44), (34, 32, 43), (35, 30, 41), + (35, 29, 40), (35, 29, 40), (36, 29, 41), (38, 33, 43), + (47, 36, 49), (58, 39, 57), (67, 43, 66), (76, 46, 75), + (80, 52, 82), (88, 56, 91), (97, 59, 99), (99, 60, 102), + (98, 58, 100), (92, 57, 97), (84, 56, 94), (80, 56, 93), + (75, 57, 89), (72, 57, 87), (74, 60, 88), (76, 65, 92), + (83, 72, 100), (91, 79, 106), (103, 86, 117), (118, 92, 132), + (135, 101, 149), (155, 114, 170), (172, 125, 183), (182, 129, 189), + (186, 131, 194), (184, 130, 191), (182, 135, 193), (184, 141, 195), + (175, 135, 185), (167, 128, 176), (155, 113, 160), (139, 106, 145) + ), + +// 675 Watermelon +((92, 42, 30), (108, 66, 42), (106, 72, 54), (105, 79, 66), + (111, 83, 75), (117, 88, 85), (119, 94, 83), (122, 101, 82), + (106, 119, 84), (95, 118, 85), (85, 117, 87), (75, 108, 74), + (65, 100, 61), (52, 88, 48), (40, 76, 35), (36, 70, 34), + (33, 64, 33), (39, 48, 31), (46, 46, 30), (53, 45, 29), + (51, 48, 29), (49, 51, 29), (49, 52, 29), (50, 53, 30), + (54, 53, 28), (50, 57, 29), (46, 61, 30), (44, 71, 31), + (42, 82, 33), (44, 84, 32), (47, 87, 31), (51, 92, 32), + (54, 93, 32), (59, 101, 34), (60, 101, 33), (62, 101, 33), + (61, 96, 32), (61, 91, 32), (63, 87, 31), (65, 83, 31), + (79, 64, 30), (88, 54, 31), (97, 45, 33), (109, 37, 31), + (121, 30, 29), (128, 28, 29), (135, 26, 29), (145, 25, 29), + (146, 26, 30), (140, 31, 30), (134, 42, 29), (129, 54, 29), + (122, 70, 28), (115, 87, 28), (113, 91, 29), (111, 95, 31), + (89, 108, 33), (79, 106, 31), (70, 104, 30), (64, 94, 29), + (58, 84, 29), (53, 78, 28), (48, 72, 28), (38, 61, 26), + (29, 48, 25), (22, 29, 24), (21, 26, 23), (21, 23, 23), + (20, 23, 22), (20, 23, 22), (21, 23, 23), (25, 23, 23), + (42, 22, 24), (53, 20, 24), (64, 19, 25), (77, 17, 25), + (90, 15, 25), (96, 15, 25), (102, 15, 26), (112, 13, 27), + (115, 14, 27), (104, 15, 26), (95, 16, 25), (86, 17, 25), + (81, 17, 24), (76, 17, 24), (70, 18, 24), (66, 20, 23), + (81, 21, 23), (96, 19, 23), (112, 18, 23), (120, 20, 24), + (129, 23, 25), (146, 24, 28), (162, 27, 31), (175, 25, 32), + (180, 20, 32), (168, 24, 31), (157, 25, 32), (146, 27, 33), + (141, 24, 33), (136, 22, 33), (123, 20, 28), (113, 18, 26), + (106, 22, 25), (115, 25, 25), (125, 28, 25), (130, 28, 25), + (135, 29, 25), (145, 27, 25), (157, 27, 26), (175, 29, 31), + (189, 33, 31), (208, 36, 29), (208, 34, 28), (209, 33, 28), + (209, 28, 31), (201, 24, 32), (195, 22, 32), (184, 21, 30), + (159, 18, 25), (145, 14, 24), (131, 10, 24), (123, 9, 23), + (116, 9, 23), (99, 9, 22), (83, 13, 22), (69, 14, 20), + (59, 15, 20), (45, 19, 21), (41, 21, 22), (38, 23, 23), + (36, 28, 26), (40, 34, 29), (52, 40, 34), (68, 50, 35), + (84, 73, 40), (88, 83, 43), (93, 94, 47), (95, 95, 45), + (98, 97, 44), (94, 98, 45), (84, 96, 42), (74, 97, 37), + (61, 95, 37), (39, 77, 31), (33, 71, 30), (27, 66, 29), + (19, 55, 26), (16, 49, 25), (16, 43, 23), (17, 39, 22), + (16, 32, 20), (16, 30, 20), (16, 29, 20), (17, 26, 20), + (18, 26, 19), (19, 28, 20), (19, 30, 20), (20, 33, 22), + (22, 36, 24), (39, 39, 26), (46, 39, 25), (53, 39, 25), + (68, 38, 25), (84, 39, 26), (102, 33, 29), (117, 30, 29), + (141, 16, 26), (144, 16, 26), (148, 16, 26), (151, 13, 27), + (151, 13, 27), (146, 12, 29), (139, 9, 28), (130, 10, 27), + (121, 12, 27), (112, 14, 27), (102, 17, 27), (93, 19, 27), + (84, 19, 26), (75, 20, 24), (65, 21, 23), (55, 21, 22), + (39, 22, 22), (36, 22, 22), (33, 22, 22), (28, 24, 21), + (24, 26, 21), (23, 29, 23), (24, 32, 24), (30, 32, 26), + (39, 31, 26), (48, 29, 27), (56, 29, 28), (58, 32, 29), + (57, 32, 29), (56, 32, 29), (55, 27, 27), (55, 23, 25), + (53, 21, 24), (46, 21, 23), (38, 23, 22), (30, 24, 22), + (28, 25, 21), (32, 24, 21), (38, 23, 21), (46, 23, 21), + (52, 24, 23), (58, 31, 24), (63, 41, 26), (68, 53, 28), + (76, 65, 30), (83, 74, 34), (88, 84, 41), (90, 95, 49), + (87, 104, 54), (82, 109, 58), (78, 109, 57), (73, 102, 56), + (69, 95, 61), (63, 85, 58), (55, 72, 58), (46, 60, 49), + (38, 47, 39), (30, 37, 35), (26, 30, 29), (23, 25, 26), + (22, 24, 24), (25, 23, 22), (29, 24, 21), (32, 26, 23), + (38, 34, 27), (48, 50, 40), (65, 66, 53), (84, 84, 67), + (100, 97, 80), (114, 112, 97), (132, 139, 126), (148, 158, 147), + (163, 173, 157), (174, 164, 148), (181, 149, 137), (188, 141, 132), + (192, 130, 132), (184, 124, 125), (174, 98, 102), (161, 71, 76), + (154, 48, 52), (151, 34, 41), (144, 36, 40), (133, 47, 37), + (125, 53, 36), (109, 49, 33), (97, 46, 28), (95, 37, 31) + ), + +// 676 Whisp +((179, 160, 155), (199, 173, 168), (210, 184, 179), (222, 195, 190), + (214, 185, 180), (207, 175, 171), (203, 171, 167), (200, 167, 163), + (180, 156, 152), (170, 145, 140), (160, 134, 129), (150, 125, 120), + (141, 117, 111), (129, 103, 97), (117, 90, 83), (114, 81, 77), + (112, 73, 71), (103, 56, 55), (98, 55, 54), (93, 54, 54), + (95, 56, 56), (97, 59, 58), (97, 64, 62), (97, 69, 66), + (100, 90, 85), (106, 100, 93), (113, 111, 101), (122, 117, 109), + (132, 123, 118), (135, 127, 121), (138, 132, 125), (142, 137, 130), + (140, 135, 128), (133, 126, 120), (127, 121, 115), (121, 116, 110), + (119, 113, 105), (117, 110, 100), (117, 110, 100), (117, 110, 101), + (127, 117, 108), (132, 120, 112), (138, 123, 116), (140, 125, 118), + (143, 127, 121), (143, 128, 121), (143, 129, 121), (142, 128, 123), + (141, 125, 123), (137, 120, 119), (136, 118, 117), (136, 117, 115), + (141, 116, 115), (147, 115, 116), (149, 115, 116), (152, 116, 116), + (150, 114, 112), (149, 116, 113), (149, 118, 114), (141, 114, 112), + (134, 111, 111), (129, 109, 108), (125, 107, 106), (116, 106, 104), + (111, 104, 104), (105, 98, 100), (102, 94, 97), (99, 91, 94), + (97, 89, 91), (95, 88, 89), (91, 81, 81), (85, 74, 73), + (67, 53, 52), (56, 42, 40), (46, 31, 29), (43, 29, 28), + (40, 28, 28), (41, 30, 31), (43, 33, 34), (51, 42, 43), + (67, 55, 58), (115, 103, 101), (141, 127, 124), (168, 152, 148), + (179, 162, 157), (191, 172, 166), (209, 189, 184), (222, 204, 198), + (234, 213, 206), (232, 208, 203), (231, 203, 200), (227, 199, 196), + (224, 195, 192), (217, 187, 183), (210, 181, 179), (214, 182, 179), + (217, 186, 181), (223, 192, 189), (226, 199, 195), (229, 207, 201), + (230, 207, 202), (231, 208, 203), (230, 205, 202), (223, 197, 193), + (191, 175, 168), (175, 160, 154), (159, 145, 141), (152, 137, 134), + (145, 130, 127), (129, 116, 111), (117, 107, 100), (109, 96, 91), + (110, 88, 84), (110, 82, 77), (110, 82, 78), (111, 83, 80), + (119, 84, 81), (125, 88, 83), (132, 94, 87), (136, 101, 96), + (150, 115, 110), (152, 121, 117), (155, 128, 124), (158, 129, 126), + (161, 131, 129), (161, 133, 131), (161, 133, 131), (153, 130, 130), + (147, 125, 123), (131, 110, 106), (126, 105, 102), (121, 101, 98), + (109, 90, 87), (95, 80, 78), (81, 69, 66), (70, 59, 58), + (54, 43, 42), (50, 39, 37), (47, 36, 33), (50, 38, 35), + (54, 41, 38), (64, 49, 45), (78, 61, 56), (93, 72, 68), + (113, 88, 85), (152, 122, 118), (157, 127, 124), (163, 132, 130), + (170, 138, 136), (172, 137, 137), (166, 132, 132), (153, 125, 124), + (117, 98, 95), (106, 90, 86), (96, 82, 78), (75, 67, 64), + (60, 55, 52), (49, 45, 43), (43, 39, 36), (41, 35, 36), + (48, 37, 40), (63, 49, 50), (67, 51, 51), (71, 53, 53), + (82, 60, 59), (93, 69, 66), (97, 75, 72), (97, 75, 69), + (90, 67, 59), (86, 64, 57), (83, 62, 56), (77, 59, 53), + (71, 57, 50), (70, 56, 50), (69, 55, 50), (68, 54, 51), + (65, 54, 52), (65, 55, 54), (67, 54, 55), (65, 51, 53), + (58, 45, 48), (51, 41, 44), (46, 35, 38), (45, 33, 35), + (45, 35, 35), (47, 38, 37), (50, 41, 40), (57, 48, 47), + (62, 54, 52), (64, 58, 56), (67, 61, 59), (69, 63, 61), + (70, 65, 62), (69, 65, 61), (70, 66, 60), (71, 64, 61), + (73, 66, 64), (79, 69, 68), (89, 77, 73), (96, 82, 79), + (100, 86, 84), (104, 90, 87), (106, 91, 86), (107, 89, 84), + (102, 82, 78), (94, 76, 71), (82, 66, 60), (70, 56, 53), + (59, 43, 44), (52, 35, 38), (46, 31, 31), (44, 32, 31), + (46, 33, 34), (55, 41, 41), (65, 51, 48), (78, 65, 59), + (92, 73, 67), (105, 82, 75), (117, 84, 80), (126, 87, 84), + (131, 90, 88), (131, 95, 91), (129, 96, 93), (129, 96, 94), + (129, 99, 97), (128, 107, 104), (127, 115, 112), (130, 123, 119), + (136, 129, 129), (147, 139, 139), (161, 150, 150), (177, 162, 160), + (188, 171, 172), (198, 180, 182), (207, 188, 189), (216, 193, 192), + (216, 193, 191), (210, 186, 186), (202, 177, 176), (191, 166, 165), + (181, 155, 153), (165, 142, 140), (151, 132, 129), (139, 123, 120), + (130, 118, 115), (120, 111, 108), (113, 109, 105), (109, 105, 103), + (107, 104, 102), (105, 101, 99), (106, 100, 97), (109, 98, 95), + (115, 102, 100), (119, 103, 101), (138, 122, 120), (157, 139, 133) + ), + +// 677 Whisper +((32, 70, 66), (16, 29, 31), (13, 28, 30), (10, 27, 30), + (10, 33, 35), (10, 39, 41), (12, 42, 44), (14, 46, 48), + (13, 50, 52), (13, 48, 50), (14, 47, 48), (12, 38, 41), + (10, 30, 34), (9, 25, 28), (9, 21, 22), (9, 20, 21), + (9, 19, 20), (13, 18, 16), (16, 19, 15), (19, 20, 15), + (25, 22, 14), (32, 25, 14), (33, 27, 16), (34, 29, 18), + (42, 35, 23), (42, 37, 25), (42, 39, 28), (39, 38, 27), + (37, 38, 27), (34, 36, 25), (32, 34, 24), (28, 31, 22), + (25, 27, 18), (18, 20, 13), (15, 18, 13), (13, 17, 13), + (12, 17, 15), (11, 18, 17), (11, 19, 19), (11, 21, 22), + (14, 33, 33), (18, 49, 48), (23, 65, 64), (32, 81, 78), + (42, 97, 92), (42, 105, 99), (42, 114, 106), (37, 120, 118), + (38, 119, 113), (24, 86, 85), (19, 71, 68), (14, 56, 52), + (14, 44, 41), (14, 33, 30), (13, 31, 27), (13, 30, 25), + (12, 22, 22), (18, 24, 21), (24, 26, 21), (32, 30, 22), + (40, 34, 23), (44, 35, 23), (48, 37, 24), (52, 40, 26), + (54, 44, 28), (44, 39, 27), (40, 37, 25), (36, 35, 23), + (35, 33, 21), (34, 31, 19), (39, 31, 16), (47, 36, 18), + (66, 54, 26), (76, 62, 34), (86, 71, 42), (97, 80, 49), + (109, 89, 56), (114, 95, 61), (120, 101, 67), (144, 115, 75), + (151, 128, 88), (151, 139, 88), (131, 134, 86), (111, 130, 84), + (100, 116, 71), (90, 102, 59), (62, 84, 49), (43, 66, 42), + (21, 35, 24), (17, 29, 23), (14, 24, 23), (13, 23, 23), + (12, 22, 24), (12, 22, 24), (16, 24, 26), (18, 27, 29), + (16, 30, 32), (22, 39, 42), (23, 41, 43), (24, 43, 45), + (27, 46, 48), (31, 50, 51), (44, 54, 51), (49, 61, 46), + (65, 93, 67), (62, 99, 73), (60, 105, 79), (57, 103, 80), + (55, 102, 81), (50, 96, 82), (40, 78, 72), (32, 60, 55), + (32, 50, 45), (30, 36, 28), (30, 35, 27), (31, 34, 27), + (32, 35, 26), (31, 33, 24), (28, 31, 23), (27, 30, 23), + (24, 28, 21), (21, 26, 20), (19, 24, 19), (17, 22, 18), + (15, 21, 17), (10, 19, 15), (8, 16, 13), (6, 14, 13), + (5, 13, 13), (6, 14, 14), (6, 15, 15), (7, 16, 16), + (8, 18, 19), (6, 20, 22), (6, 21, 23), (7, 21, 23), + (5, 18, 21), (4, 15, 17), (3, 12, 14), (2, 10, 12), + (2, 9, 10), (0, 7, 8), (0, 7, 8), (2, 7, 6), + (3, 7, 6), (4, 11, 11), (5, 11, 11), (6, 11, 11), + (6, 13, 14), (5, 15, 16), (6, 15, 16), (6, 16, 16), + (8, 17, 19), (9, 19, 19), (10, 21, 20), (15, 25, 22), + (18, 32, 29), (22, 42, 38), (28, 51, 44), (37, 55, 49), + (44, 61, 53), (50, 59, 53), (50, 56, 50), (50, 54, 47), + (46, 51, 43), (43, 45, 39), (36, 43, 38), (31, 44, 40), + (30, 51, 44), (33, 55, 44), (36, 59, 44), (36, 58, 40), + (34, 58, 44), (38, 60, 42), (39, 56, 34), (33, 48, 35), + (35, 51, 38), (39, 56, 43), (42, 60, 46), (50, 71, 52), + (55, 83, 63), (52, 92, 69), (51, 95, 68), (51, 99, 74), + (41, 93, 73), (40, 91, 72), (40, 89, 72), (37, 85, 80), + (37, 85, 79), (39, 88, 81), (47, 97, 87), (63, 104, 88), + (69, 102, 82), (71, 97, 78), (78, 94, 78), (71, 87, 69), + (52, 77, 64), (42, 76, 73), (37, 90, 86), (30, 107, 105), + (32, 117, 114), (48, 129, 119), (54, 139, 131), (49, 131, 123), + (55, 113, 104), (52, 99, 91), (40, 80, 75), (41, 62, 60), + (45, 55, 52), (45, 54, 44), (60, 57, 42), (79, 66, 49), + (93, 81, 53), (115, 103, 66), (151, 145, 113), (149, 174, 149), + (127, 166, 140), (150, 176, 152), (149, 184, 163), (117, 155, 131), + (107, 123, 103), (105, 100, 78), (100, 87, 59), (87, 77, 54), + (69, 61, 45), (52, 49, 36), (39, 42, 31), (30, 35, 26), + (24, 29, 23), (20, 25, 20), (18, 24, 19), (21, 25, 21), + (25, 27, 21), (28, 30, 21), (28, 32, 23), (28, 32, 25), + (27, 34, 24), (25, 31, 24), (22, 30, 25), (22, 31, 26), + (23, 30, 27), (22, 32, 31), (19, 34, 36), (19, 36, 39), + (21, 39, 40), (23, 41, 41), (28, 43, 40), (38, 43, 37), + (47, 45, 33), (52, 52, 33), (56, 60, 40), (58, 64, 45), + (55, 79, 64), (53, 94, 78), (43, 74, 64), (36, 66, 63) + ), + +// 678 Wintergrass +((161, 147, 99), (150, 137, 77), (153, 144, 92), (156, 151, 108), + (167, 158, 121), (179, 166, 134), (182, 168, 137), (185, 171, 141), + (190, 172, 141), (175, 161, 126), (160, 150, 112), (147, 142, 94), + (135, 134, 77), (127, 124, 57), (120, 115, 38), (123, 114, 34), + (126, 114, 30), (134, 115, 20), (138, 115, 21), (143, 116, 23), + (142, 114, 25), (142, 112, 28), (139, 111, 28), (136, 110, 29), + (119, 105, 47), (115, 106, 53), (112, 108, 60), (119, 115, 73), + (126, 123, 87), (134, 128, 94), (142, 133, 102), (155, 143, 113), + (164, 147, 117), (150, 142, 118), (137, 131, 104), (124, 120, 91), + (111, 110, 73), (98, 101, 56), (101, 100, 50), (105, 100, 44), + (119, 101, 25), (128, 107, 23), (138, 113, 21), (142, 118, 24), + (146, 123, 27), (144, 124, 31), (143, 126, 35), (141, 128, 43), + (136, 125, 51), (133, 124, 48), (134, 123, 42), (136, 122, 36), + (140, 122, 26), (144, 122, 17), (143, 120, 14), (142, 119, 11), + (129, 112, 7), (121, 105, 7), (114, 98, 8), (108, 96, 9), + (103, 95, 10), (101, 94, 11), (99, 93, 13), (101, 92, 12), + (104, 92, 16), (95, 89, 21), (92, 88, 26), (89, 87, 31), + (87, 88, 33), (86, 89, 35), (85, 92, 40), (90, 95, 40), + (104, 111, 37), (106, 111, 33), (108, 111, 30), (105, 107, 33), + (103, 104, 36), (99, 102, 36), (96, 100, 37), (89, 93, 42), + (86, 90, 47), (83, 86, 50), (80, 83, 46), (78, 81, 42), + (77, 81, 40), (77, 81, 38), (78, 82, 37), (76, 83, 39), + (87, 94, 49), (101, 104, 65), (116, 115, 81), (126, 122, 89), + (137, 129, 97), (157, 143, 112), (174, 156, 124), (186, 167, 128), + (186, 170, 121), (190, 162, 79), (184, 152, 57), (178, 142, 35), + (177, 137, 27), (176, 133, 19), (169, 127, 16), (160, 122, 16), + (139, 109, 21), (125, 108, 26), (112, 107, 32), (110, 105, 33), + (109, 104, 34), (100, 101, 36), (92, 98, 38), (93, 97, 35), + (95, 94, 31), (92, 90, 34), (91, 89, 32), (90, 89, 31), + (88, 87, 30), (86, 85, 31), (84, 84, 29), (87, 84, 28), + (100, 90, 22), (113, 96, 20), (127, 102, 18), (131, 106, 16), + (135, 110, 14), (152, 119, 12), (167, 127, 15), (168, 133, 24), + (172, 141, 45), (183, 153, 87), (183, 155, 98), (184, 158, 109), + (184, 161, 130), (186, 164, 136), (179, 158, 130), (163, 148, 116), + (126, 123, 93), (109, 109, 76), (92, 96, 60), (86, 92, 55), + (81, 88, 50), (68, 78, 40), (60, 73, 33), (59, 69, 23), + (53, 66, 19), (44, 64, 28), (45, 65, 29), (47, 66, 30), + (50, 75, 38), (54, 78, 42), (58, 82, 47), (63, 88, 51), + (70, 96, 57), (70, 96, 60), (71, 97, 63), (77, 99, 66), + (83, 105, 65), (86, 107, 65), (96, 110, 58), (106, 113, 48), + (107, 111, 42), (109, 104, 31), (108, 101, 32), (108, 99, 34), + (109, 99, 36), (110, 101, 42), (112, 105, 49), (120, 112, 49), + (133, 125, 51), (137, 125, 47), (141, 126, 43), (147, 126, 40), + (153, 131, 39), (162, 131, 35), (164, 131, 44), (166, 138, 63), + (171, 146, 79), (163, 148, 88), (149, 143, 101), (137, 139, 108), + (124, 131, 96), (105, 116, 84), (86, 104, 79), (75, 96, 68), + (73, 91, 60), (73, 91, 60), (73, 91, 60), (77, 94, 58), + (88, 98, 54), (100, 102, 49), (109, 107, 46), (116, 109, 43), + (126, 111, 37), (133, 115, 32), (135, 119, 28), (141, 121, 26), + (144, 120, 24), (146, 122, 23), (150, 123, 24), (152, 121, 26), + (153, 122, 30), (152, 123, 34), (148, 122, 40), (145, 123, 47), + (142, 125, 54), (142, 129, 69), (147, 136, 85), (156, 142, 98), + (163, 148, 111), (165, 150, 115), (173, 152, 103), (179, 153, 85), + (170, 148, 72), (157, 142, 55), (152, 135, 37), (143, 132, 34), + (127, 128, 41), (113, 122, 45), (105, 116, 47), (99, 112, 50), + (93, 106, 51), (88, 101, 50), (86, 98, 49), (84, 93, 46), + (78, 89, 44), (71, 81, 42), (61, 70, 39), (49, 63, 35), + (44, 57, 30), (50, 57, 37), (51, 59, 37), (56, 64, 32), + (70, 75, 37), (82, 86, 41), (93, 95, 38), (104, 100, 35), + (112, 107, 36), (122, 116, 40), (132, 124, 45), (140, 130, 59), + (149, 139, 81), (162, 149, 96), (172, 154, 114), (183, 163, 132), + (197, 172, 143), (205, 178, 147), (210, 184, 154), (212, 186, 159), + (212, 187, 157), (211, 188, 157), (209, 187, 159), (206, 181, 155), + (197, 173, 145), (193, 170, 141), (187, 162, 121), (169, 148, 95) + ), + + +// 679 Wooden +((92, 74, 63), (75, 57, 57), (70, 54, 54), (66, 51, 51), + (62, 49, 48), (59, 48, 45), (57, 48, 43), (56, 49, 42), + (54, 48, 42), (51, 55, 48), (49, 63, 54), (55, 74, 67), + (62, 86, 81), (69, 94, 81), (77, 102, 81), (90, 104, 79), + (104, 107, 78), (129, 101, 72), (132, 97, 64), (136, 94, 56), + (132, 87, 50), (129, 80, 45), (125, 79, 42), (122, 78, 39), + (104, 75, 39), (91, 69, 40), (78, 63, 42), (71, 59, 41), + (64, 56, 40), (61, 57, 40), (58, 58, 41), (55, 55, 41), + (53, 47, 42), (39, 51, 47), (44, 48, 42), (50, 46, 38), + (49, 48, 35), (48, 50, 33), (48, 49, 32), (48, 48, 31), + (46, 38, 25), (42, 36, 24), (39, 35, 23), (35, 29, 23), + (32, 23, 23), (30, 22, 22), (28, 21, 21), (24, 18, 24), + (17, 22, 22), (12, 20, 20), (12, 19, 18), (13, 19, 16), + (15, 22, 18), (17, 26, 21), (19, 27, 25), (22, 29, 29), + (27, 30, 37), (29, 34, 39), (31, 38, 42), (31, 34, 40), + (31, 31, 39), (30, 32, 38), (29, 33, 38), (27, 30, 37), + (27, 31, 35), (31, 35, 27), (36, 35, 28), (41, 35, 30), + (42, 35, 30), (44, 36, 31), (48, 42, 31), (51, 47, 32), + (55, 43, 30), (54, 44, 29), (53, 45, 28), (49, 42, 25), + (45, 40, 23), (43, 39, 22), (42, 38, 22), (38, 36, 21), + (33, 29, 19), (20, 24, 15), (20, 21, 13), (21, 19, 12), + (20, 15, 10), (19, 12, 9), (17, 11, 8), (15, 10, 7), + (16, 9, 6), (15, 10, 7), (15, 11, 8), (16, 13, 9), + (18, 16, 10), (21, 23, 14), (29, 23, 17), (34, 29, 19), + (39, 34, 21), (50, 38, 27), (54, 39, 27), (58, 40, 27), + (59, 41, 26), (60, 42, 26), (61, 40, 27), (61, 42, 28), + (64, 45, 29), (65, 48, 31), (66, 52, 34), (67, 53, 34), + (68, 54, 35), (69, 56, 39), (72, 59, 43), (75, 65, 49), + (78, 71, 52), (80, 75, 56), (82, 75, 56), (85, 76, 57), + (92, 80, 59), (97, 82, 60), (104, 88, 61), (113, 93, 65), + (131, 110, 79), (142, 115, 80), (154, 121, 81), (156, 124, 82), + (158, 128, 84), (149, 127, 86), (145, 117, 82), (140, 107, 75), + (135, 100, 67), (104, 84, 54), (97, 77, 52), (90, 71, 51), + (80, 64, 49), (72, 61, 49), (67, 64, 47), (65, 62, 47), + (56, 60, 45), (57, 56, 45), (58, 53, 45), (58, 52, 44), + (59, 51, 43), (57, 48, 39), (57, 43, 34), (57, 39, 30), + (58, 40, 27), (63, 40, 21), (65, 41, 19), (68, 43, 18), + (74, 44, 18), (77, 48, 20), (80, 51, 24), (85, 57, 27), + (97, 61, 31), (97, 62, 33), (98, 64, 35), (99, 66, 41), + (99, 70, 43), (100, 71, 46), (97, 73, 47), (94, 72, 50), + (86, 69, 53), (57, 76, 63), (54, 77, 65), (52, 79, 67), + (49, 78, 66), (48, 76, 68), (46, 71, 65), (45, 69, 61), + (51, 61, 45), (53, 57, 42), (56, 53, 40), (54, 45, 36), + (50, 47, 34), (43, 51, 36), (36, 54, 39), (35, 55, 39), + (30, 54, 40), (30, 54, 39), (30, 52, 40), (30, 49, 34), + (31, 43, 27), (38, 36, 22), (36, 29, 18), (34, 24, 18), + (31, 21, 13), (30, 19, 13), (29, 18, 13), (26, 15, 15), + (24, 14, 16), (22, 15, 15), (24, 18, 15), (28, 16, 17), + (32, 20, 22), (38, 26, 31), (48, 37, 43), (66, 50, 50), + (86, 72, 67), (103, 98, 80), (108, 113, 89), (118, 106, 88), + (123, 115, 88), (126, 119, 88), (119, 116, 86), (104, 94, 73), + (89, 79, 59), (76, 74, 51), (65, 70, 49), (52, 65, 49), + (51, 62, 47), (52, 62, 46), (62, 65, 46), (75, 63, 42), + (89, 62, 37), (95, 57, 30), (92, 55, 27), (87, 50, 22), + (87, 50, 18), (82, 42, 13), (70, 37, 11), (53, 34, 11), + (45, 34, 13), (42, 31, 14), (44, 29, 11), (44, 31, 10), + (47, 32, 13), (54, 35, 16), (61, 36, 17), (65, 40, 18), + (69, 42, 23), (71, 47, 29), (73, 47, 32), (72, 50, 32), + (74, 46, 32), (73, 50, 32), (73, 48, 32), (70, 46, 32), + (68, 42, 30), (64, 40, 30), (62, 39, 29), (58, 36, 30), + (54, 33, 28), (49, 32, 27), (44, 35, 26), (42, 34, 26), + (40, 35, 27), (36, 40, 30), (31, 44, 34), (35, 50, 38), + (40, 57, 40), (53, 63, 44), (62, 68, 49), (80, 77, 56), + (90, 82, 59), (90, 82, 58), (83, 72, 57), (86, 74, 60) + ), + +// 680 Wooden_2 +((59, 44, 27), (70, 50, 29), (75, 53, 30), (80, 57, 32), + (83, 59, 33), (87, 62, 34), (87, 63, 34), (88, 64, 35), + (88, 66, 35), (87, 64, 34), (86, 63, 34), (83, 61, 33), + (80, 59, 32), (76, 56, 30), (73, 54, 29), (70, 52, 28), + (68, 51, 28), (58, 45, 25), (52, 41, 23), (47, 37, 22), + (41, 33, 20), (36, 29, 19), (33, 27, 18), (31, 26, 18), + (24, 21, 16), (21, 19, 15), (19, 18, 15), (18, 17, 15), + (18, 17, 15), (17, 16, 15), (17, 16, 15), (17, 16, 15), + (17, 16, 15), (17, 16, 16), (17, 16, 16), (18, 17, 16), + (20, 17, 16), (22, 18, 17), (23, 19, 17), (24, 20, 17), + (31, 24, 19), (36, 26, 20), (41, 29, 22), (47, 32, 23), + (54, 36, 25), (57, 37, 25), (60, 39, 25), (64, 41, 26), + (67, 42, 27), (72, 47, 28), (75, 49, 28), (79, 52, 29), + (86, 56, 31), (93, 61, 33), (97, 63, 33), (101, 66, 34), + (117, 78, 38), (124, 85, 39), (132, 92, 41), (140, 105, 49), + (149, 118, 57), (154, 124, 62), (159, 131, 68), (171, 144, 74), + (181, 151, 79), (195, 164, 85), (199, 165, 83), (204, 167, 82), + (205, 168, 82), (206, 169, 83), (206, 170, 89), (207, 176, 93), + (205, 175, 95), (201, 170, 92), (197, 166, 90), (192, 157, 81), + (187, 149, 72), (184, 144, 68), (182, 139, 65), (180, 137, 63), + (181, 137, 61), (180, 135, 59), (176, 132, 56), (172, 130, 54), + (169, 127, 52), (166, 125, 51), (158, 117, 48), (148, 110, 44), + (134, 100, 39), (128, 95, 37), (122, 91, 36), (118, 88, 35), + (115, 86, 34), (107, 80, 32), (98, 73, 31), (86, 64, 29), + (74, 56, 27), (58, 45, 24), (55, 43, 24), (52, 41, 24), + (52, 41, 24), (53, 41, 24), (55, 42, 25), (57, 43, 26), + (59, 45, 27), (57, 44, 27), (56, 43, 27), (54, 42, 26), + (53, 42, 26), (51, 40, 26), (50, 39, 26), (49, 39, 25), + (49, 39, 25), (53, 41, 26), (54, 42, 26), (55, 43, 27), + (58, 44, 27), (60, 46, 28), (64, 49, 29), (69, 52, 30), + (80, 60, 32), (85, 63, 33), (91, 67, 35), (93, 68, 35), + (96, 70, 36), (99, 72, 36), (101, 74, 37), (103, 76, 37), + (105, 77, 38), (107, 79, 38), (106, 79, 38), (106, 79, 39), + (106, 79, 40), (105, 79, 39), (103, 78, 38), (102, 77, 38), + (105, 80, 37), (109, 81, 38), (113, 82, 40), (114, 82, 41), + (116, 83, 42), (117, 83, 43), (116, 82, 43), (113, 80, 42), + (110, 79, 41), (102, 75, 37), (100, 73, 36), (99, 72, 36), + (95, 69, 35), (91, 64, 34), (83, 59, 33), (75, 52, 31), + (56, 41, 26), (51, 38, 24), (47, 36, 23), (41, 33, 22), + (38, 32, 21), (38, 31, 21), (39, 32, 22), (43, 35, 23), + (48, 38, 24), (59, 45, 26), (62, 48, 27), (66, 51, 28), + (74, 57, 30), (83, 63, 32), (94, 69, 34), (104, 74, 36), + (101, 73, 35), (99, 71, 34), (98, 70, 34), (94, 67, 33), + (89, 64, 32), (82, 61, 30), (77, 58, 29), (82, 60, 29), + (76, 55, 28), (69, 51, 26), (61, 45, 24), (53, 39, 22), + (43, 32, 20), (32, 25, 18), (21, 19, 16), (21, 19, 16), + (20, 19, 16), (19, 18, 16), (19, 18, 16), (19, 18, 16), + (18, 17, 16), (18, 17, 15), (18, 17, 16), (18, 17, 16), + (19, 18, 16), (20, 19, 16), (22, 20, 16), (24, 22, 17), + (27, 23, 18), (29, 25, 18), (31, 27, 19), (32, 28, 20), + (33, 29, 20), (35, 30, 20), (36, 31, 21), (38, 33, 21), + (42, 35, 22), (46, 38, 23), (50, 41, 25), (56, 45, 26), + (61, 49, 27), (66, 52, 28), (72, 56, 29), (76, 59, 30), + (80, 62, 31), (84, 64, 31), (87, 67, 32), (91, 69, 34), + (95, 72, 36), (100, 76, 37), (106, 80, 38), (111, 84, 41), + (116, 87, 42), (118, 88, 43), (118, 89, 43), (115, 88, 44), + (111, 85, 44), (105, 80, 43), (99, 76, 40), (94, 73, 39), + (89, 69, 38), (84, 66, 37), (79, 62, 36), (74, 59, 34), + (69, 55, 33), (63, 50, 31), (56, 45, 29), (51, 41, 26), + (46, 37, 24), (42, 34, 22), (38, 32, 20), (35, 29, 19), + (33, 28, 19), (32, 27, 19), (30, 26, 19), (30, 26, 19), + (30, 26, 19), (31, 27, 19), (33, 28, 19), (35, 28, 19), + (38, 29, 19), (40, 31, 20), (42, 32, 21), (44, 33, 22), + (46, 34, 22), (48, 36, 23), (51, 38, 24), (54, 41, 26) + ), + +// 681 Wooden_3 +((95, 69, 38), (68, 47, 22), (53, 33, 11), (38, 20, 1), + (33, 17, 0), (28, 15, 0), (25, 14, 0), (23, 13, 1), + (15, 9, 1), (13, 7, 0), (12, 5, 0), (12, 5, 0), + (12, 5, 0), (14, 6, 0), (17, 7, 0), (19, 7, 0), + (21, 8, 0), (29, 12, 0), (31, 13, 0), (34, 15, 0), + (34, 15, 0), (35, 16, 0), (35, 15, 0), (35, 15, 0), + (32, 14, 1), (31, 14, 2), (30, 14, 3), (33, 18, 7), + (36, 23, 12), (40, 28, 18), (44, 33, 24), (57, 47, 38), + (74, 65, 57), (103, 96, 86), (117, 112, 102), (132, 128, 119), + (146, 144, 136), (161, 160, 154), (165, 164, 158), (169, 169, 163), + (168, 166, 160), (162, 158, 149), (156, 150, 138), (144, 135, 122), + (132, 120, 107), (123, 110, 97), (115, 101, 88), (99, 84, 68), + (87, 70, 52), (63, 41, 21), (53, 31, 12), (43, 21, 3), + (41, 20, 2), (39, 19, 1), (39, 19, 0), (40, 19, 0), + (43, 21, 0), (46, 24, 3), (50, 27, 6), (61, 36, 12), + (72, 45, 18), (78, 51, 21), (85, 57, 24), (96, 64, 25), + (105, 70, 27), (115, 79, 32), (114, 78, 30), (113, 78, 29), + (111, 74, 26), (109, 71, 23), (103, 65, 18), (95, 59, 15), + (81, 51, 17), (83, 54, 22), (85, 57, 28), (94, 66, 36), + (104, 75, 44), (108, 80, 47), (113, 86, 51), (122, 94, 60), + (130, 103, 67), (139, 108, 71), (138, 106, 69), (137, 105, 67), + (135, 104, 66), (133, 103, 65), (129, 100, 63), (127, 99, 63), + (124, 96, 63), (117, 91, 60), (110, 86, 57), (106, 82, 53), + (102, 79, 50), (92, 73, 46), (85, 66, 43), (78, 59, 39), + (67, 49, 32), (47, 29, 13), (43, 24, 10), (39, 19, 7), + (38, 18, 6), (38, 18, 6), (38, 17, 4), (38, 18, 3), + (39, 18, 3), (38, 17, 3), (38, 16, 3), (36, 15, 2), + (35, 15, 2), (34, 14, 1), (32, 13, 0), (31, 12, 0), + (31, 11, 0), (32, 13, 1), (33, 14, 2), (34, 15, 3), + (39, 22, 10), (48, 33, 21), (61, 45, 31), (77, 59, 41), + (107, 83, 51), (125, 102, 69), (144, 121, 87), (154, 132, 100), + (164, 143, 113), (183, 164, 136), (191, 174, 145), (200, 184, 151), + (205, 187, 155), (211, 194, 165), (208, 191, 163), (205, 189, 162), + (193, 178, 153), (178, 160, 136), (162, 139, 108), (145, 120, 86), + (114, 85, 48), (99, 70, 37), (84, 56, 26), (77, 49, 20), + (70, 43, 15), (61, 35, 8), (55, 29, 3), (52, 26, 3), + (55, 27, 4), (66, 38, 13), (70, 42, 17), (75, 46, 21), + (83, 54, 27), (93, 62, 34), (100, 70, 41), (107, 78, 50), + (120, 93, 65), (123, 94, 66), (126, 96, 67), (125, 96, 64), + (118, 89, 58), (110, 81, 52), (100, 73, 44), (92, 63, 39), + (87, 59, 32), (69, 40, 15), (65, 36, 11), (62, 33, 7), + (55, 26, 3), (52, 25, 3), (49, 23, 3), (46, 21, 2), + (42, 18, 0), (40, 17, 0), (39, 17, 0), (36, 17, 1), + (35, 16, 1), (35, 16, 1), (36, 17, 2), (40, 19, 3), + (45, 26, 8), (55, 37, 15), (68, 48, 23), (80, 59, 32), + (94, 67, 38), (102, 75, 48), (114, 87, 58), (125, 102, 73), + (149, 131, 105), (152, 135, 111), (155, 139, 117), (162, 143, 120), + (168, 148, 121), (171, 153, 122), (174, 154, 120), (174, 153, 119), + (174, 149, 115), (174, 145, 107), (173, 141, 98), (169, 134, 89), + (161, 126, 79), (152, 116, 74), (142, 106, 69), (130, 94, 60), + (117, 85, 53), (104, 75, 45), (94, 66, 37), (86, 59, 34), + (75, 49, 25), (66, 40, 18), (59, 34, 13), (57, 34, 12), + (63, 40, 18), (69, 46, 23), (74, 49, 26), (80, 51, 27), + (86, 59, 31), (98, 69, 37), (111, 81, 46), (120, 91, 55), + (128, 97, 62), (132, 105, 73), (141, 118, 86), (152, 131, 101), + (162, 144, 115), (171, 153, 126), (176, 159, 135), (179, 166, 145), + (184, 171, 152), (186, 173, 156), (186, 173, 152), (184, 167, 143), + (180, 161, 134), (177, 155, 126), (173, 148, 119), (166, 143, 111), + (157, 134, 101), (143, 122, 92), (130, 108, 79), (116, 93, 67), + (104, 83, 57), (96, 74, 48), (90, 70, 46), (87, 66, 44), + (89, 66, 44), (94, 71, 45), (102, 77, 47), (113, 87, 55), + (124, 98, 65), (136, 108, 72), (150, 119, 77), (158, 126, 79), + (161, 128, 79), (161, 128, 83), (158, 127, 83), (155, 124, 81), + (143, 112, 67), (129, 97, 53), (114, 83, 44), (101, 71, 35) + ), + +// 682 Woodland +((67, 42, 19), (78, 38, 13), (86, 38, 10), (94, 39, 7), + (105, 43, 6), (116, 47, 5), (119, 48, 4), (122, 49, 3), + (117, 44, 3), (108, 39, 2), (100, 34, 1), (90, 31, 3), + (81, 29, 6), (76, 26, 7), (72, 24, 8), (72, 24, 9), + (72, 25, 10), (70, 27, 8), (72, 28, 9), (74, 30, 10), + (72, 32, 10), (71, 34, 10), (70, 34, 10), (70, 34, 11), + (62, 36, 11), (60, 38, 14), (59, 41, 18), (64, 49, 24), + (69, 57, 30), (70, 61, 35), (72, 66, 41), (75, 72, 45), + (73, 72, 46), (62, 66, 40), (57, 55, 31), (53, 45, 22), + (54, 40, 16), (56, 36, 11), (59, 35, 11), (62, 34, 11), + (68, 30, 11), (72, 31, 11), (76, 32, 11), (79, 34, 12), + (82, 36, 13), (84, 36, 12), (86, 37, 12), (83, 38, 12), + (82, 40, 14), (75, 44, 18), (72, 43, 18), (69, 43, 18), + (65, 45, 18), (62, 48, 18), (63, 48, 17), (64, 49, 16), + (62, 58, 19), (68, 66, 21), (74, 74, 24), (78, 76, 25), + (83, 78, 27), (87, 77, 27), (92, 76, 28), (91, 80, 28), + (87, 76, 29), (78, 75, 36), (70, 77, 42), (62, 79, 48), + (59, 77, 47), (57, 75, 47), (53, 77, 47), (48, 71, 41), + (41, 55, 27), (37, 54, 24), (34, 54, 21), (34, 57, 22), + (34, 61, 23), (35, 65, 28), (37, 69, 34), (45, 80, 47), + (54, 93, 54), (69, 113, 95), (67, 127, 105), (65, 142, 115), + (72, 145, 130), (79, 149, 145), (74, 153, 146), (72, 150, 113), + (79, 137, 113), (69, 120, 80), (60, 103, 48), (52, 94, 45), + (45, 86, 42), (33, 71, 33), (33, 56, 23), (37, 48, 19), + (40, 42, 15), (52, 31, 11), (51, 31, 12), (51, 32, 14), + (50, 32, 14), (50, 33, 15), (46, 36, 16), (43, 39, 16), + (37, 47, 19), (37, 51, 20), (37, 56, 21), (41, 58, 23), + (45, 60, 26), (60, 66, 31), (74, 76, 34), (93, 77, 32), + (114, 73, 28), (133, 70, 21), (132, 65, 17), (132, 61, 14), + (125, 56, 9), (114, 50, 9), (99, 47, 10), (85, 45, 9), + (65, 45, 17), (62, 51, 27), (60, 58, 37), (63, 61, 42), + (67, 65, 48), (73, 77, 53), (80, 86, 58), (92, 93, 67), + (101, 105, 63), (106, 112, 49), (108, 113, 46), (110, 115, 44), + (107, 116, 36), (99, 104, 33), (88, 90, 28), (71, 82, 26), + (49, 63, 25), (43, 58, 22), (38, 54, 20), (41, 54, 19), + (44, 54, 19), (50, 55, 18), (57, 53, 13), (69, 49, 11), + (81, 51, 9), (96, 49, 9), (98, 49, 8), (101, 50, 8), + (101, 49, 7), (100, 51, 9), (96, 53, 13), (92, 52, 15), + (95, 56, 16), (97, 56, 15), (100, 56, 15), (107, 56, 14), + (113, 57, 12), (116, 58, 12), (117, 60, 14), (113, 60, 16), + (107, 60, 20), (100, 75, 29), (100, 78, 30), (100, 81, 32), + (96, 87, 30), (100, 93, 30), (101, 92, 28), (95, 85, 24), + (91, 69, 16), (87, 65, 15), (84, 62, 14), (82, 58, 11), + (80, 55, 11), (76, 49, 13), (74, 44, 10), (71, 35, 8), + (69, 24, 9), (68, 17, 8), (69, 15, 10), (72, 21, 13), + (77, 26, 14), (88, 36, 15), (99, 56, 27), (108, 75, 41), + (134, 124, 44), (139, 134, 51), (145, 144, 59), (145, 139, 59), + (145, 135, 51), (145, 140, 48), (138, 118, 46), (132, 92, 39), + (125, 85, 33), (120, 80, 29), (124, 77, 23), (129, 70, 18), + (131, 63, 11), (133, 64, 7), (130, 63, 8), (123, 65, 6), + (112, 64, 10), (95, 61, 17), (78, 64, 18), (64, 63, 22), + (53, 55, 25), (49, 52, 21), (46, 45, 19), (45, 37, 16), + (50, 30, 11), (55, 23, 10), (58, 18, 9), (61, 15, 8), + (63, 13, 7), (66, 14, 9), (66, 18, 10), (65, 23, 11), + (66, 26, 12), (63, 32, 14), (58, 37, 12), (55, 41, 13), + (54, 49, 18), (56, 61, 23), (60, 68, 28), (68, 76, 31), + (81, 87, 36), (87, 94, 43), (88, 101, 46), (87, 105, 42), + (83, 97, 36), (77, 87, 36), (73, 81, 32), (69, 68, 21), + (69, 53, 20), (72, 46, 20), (74, 49, 22), (74, 51, 23), + (77, 53, 21), (80, 59, 23), (81, 59, 22), (83, 58, 18), + (82, 56, 15), (83, 52, 14), (85, 50, 13), (84, 49, 11), + (84, 50, 9), (85, 54, 12), (87, 62, 15), (86, 70, 17), + (86, 74, 15), (84, 75, 13), (78, 76, 16), (72, 70, 16), + (67, 60, 12), (72, 59, 18), (72, 57, 25), (57, 44, 20) + ), + +// 683 Yellow_Silk +((222, 187, 42), (223, 201, 66), (215, 201, 67), (208, 202, 69), + (188, 192, 71), (168, 182, 74), (166, 176, 69), (164, 170, 65), + (167, 157, 52), (164, 157, 51), (162, 158, 51), (164, 158, 45), + (166, 159, 39), (164, 156, 36), (163, 154, 33), (163, 150, 30), + (163, 147, 28), (168, 138, 28), (166, 137, 32), (165, 136, 37), + (163, 136, 38), (162, 136, 39), (158, 139, 38), (155, 142, 38), + (161, 145, 28), (159, 140, 24), (158, 136, 21), (167, 121, 17), + (177, 106, 14), (175, 98, 18), (174, 90, 23), (183, 68, 25), + (189, 47, 25), (184, 37, 19), (181, 42, 20), (179, 47, 21), + (161, 40, 18), (144, 33, 16), (136, 35, 16), (129, 38, 17), + (90, 12, 29), (72, 11, 36), (54, 11, 43), (63, 20, 56), + (73, 29, 69), (79, 39, 79), (86, 49, 90), (113, 64, 94), + (128, 65, 89), (157, 86, 79), (171, 94, 63), (186, 102, 47), + (198, 117, 44), (211, 133, 41), (219, 148, 41), (227, 164, 41), + (236, 194, 45), (238, 200, 46), (240, 206, 48), (211, 186, 51), + (182, 167, 54), (169, 148, 53), (157, 130, 53), (150, 119, 69), + (104, 101, 82), (75, 74, 84), (60, 65, 82), (45, 57, 80), + (44, 62, 70), (44, 68, 61), (53, 57, 43), (65, 67, 45), + (117, 112, 45), (127, 122, 48), (138, 133, 52), (143, 137, 51), + (149, 141, 50), (154, 138, 49), (159, 135, 48), (167, 134, 43), + (175, 131, 38), (189, 122, 31), (191, 126, 29), (193, 130, 27), + (193, 130, 31), (194, 131, 35), (190, 140, 44), (182, 152, 51), + (172, 162, 82), (158, 147, 77), (144, 133, 72), (134, 120, 77), + (125, 107, 82), (94, 79, 76), (81, 53, 46), (78, 33, 37), + (76, 30, 29), (117, 45, 27), (144, 67, 31), (171, 90, 35), + (178, 101, 48), (186, 112, 61), (197, 115, 76), (199, 139, 90), + (207, 172, 141), (200, 174, 136), (193, 176, 132), (193, 169, 126), + (193, 163, 120), (181, 142, 86), (146, 124, 52), (120, 105, 30), + (116, 107, 23), (109, 100, 7), (111, 108, 12), (114, 117, 17), + (133, 133, 26), (152, 140, 26), (164, 147, 31), (173, 148, 39), + (210, 149, 55), (221, 137, 63), (233, 125, 72), (236, 125, 78), + (240, 126, 85), (233, 126, 95), (214, 118, 93), (193, 122, 92), + (173, 126, 85), (142, 133, 68), (139, 131, 64), (137, 130, 60), + (136, 128, 46), (140, 135, 43), (147, 137, 42), (153, 133, 37), + (190, 137, 59), (204, 146, 76), (218, 155, 93), (219, 161, 98), + (221, 167, 103), (217, 182, 107), (188, 188, 104), (170, 173, 100), + (177, 153, 87), (144, 128, 101), (148, 120, 101), (152, 113, 102), + (161, 115, 104), (155, 149, 126), (158, 178, 123), (168, 199, 117), + (216, 231, 119), (222, 236, 120), (229, 241, 121), (243, 239, 120), + (250, 235, 115), (251, 235, 117), (251, 232, 111), (250, 232, 102), + (252, 233, 104), (253, 231, 115), (252, 231, 124), (252, 232, 134), + (241, 230, 151), (229, 230, 163), (210, 229, 180), (178, 212, 185), + (139, 179, 188), (126, 176, 180), (113, 173, 172), (115, 158, 160), + (134, 167, 163), (160, 180, 155), (184, 180, 138), (207, 195, 122), + (233, 202, 113), (239, 196, 102), (224, 190, 87), (206, 182, 74), + (186, 180, 65), (172, 177, 66), (171, 178, 77), (185, 185, 74), + (215, 203, 72), (226, 208, 70), (238, 214, 69), (252, 220, 60), + (252, 221, 58), (244, 211, 55), (232, 195, 48), (216, 180, 40), + (190, 156, 31), (161, 128, 22), (135, 105, 12), (111, 76, 4), + (82, 48, 0), (72, 51, 0), (77, 53, 0), (84, 38, 5), + (103, 57, 13), (119, 76, 18), (142, 74, 26), (162, 86, 37), + (169, 104, 44), (182, 120, 61), (197, 141, 75), (210, 165, 71), + (220, 188, 74), (235, 203, 82), (247, 213, 74), (249, 219, 66), + (249, 222, 68), (252, 225, 71), (253, 223, 78), (251, 221, 89), + (240, 210, 90), (227, 195, 82), (227, 174, 73), (215, 149, 59), + (191, 132, 40), (182, 114, 21), (176, 97, 11), (168, 95, 6), + (157, 102, 8), (147, 103, 15), (147, 107, 20), (148, 114, 30), + (144, 110, 35), (137, 104, 31), (135, 86, 25), (135, 58, 20), + (137, 46, 13), (140, 32, 4), (129, 15, 0), (129, 24, 0), + (143, 45, 4), (147, 60, 8), (143, 75, 17), (151, 92, 33), + (162, 113, 42), (163, 126, 56), (154, 126, 69), (152, 136, 65), + (161, 145, 62), (159, 148, 59), (163, 150, 46), (181, 147, 37), + (191, 143, 35), (190, 144, 36), (190, 144, 40), (193, 144, 40), + (190, 143, 38), (188, 148, 41), (197, 156, 45), (210, 171, 43) + ), + +// 684 Zinfandel +((131, 89, 66), (114, 86, 62), (107, 88, 64), (101, 91, 66), + (91, 89, 64), (81, 87, 63), (77, 85, 61), (73, 83, 60), + (55, 66, 46), (56, 67, 47), (58, 69, 49), (71, 75, 53), + (85, 82, 57), (98, 88, 61), (112, 94, 65), (115, 95, 66), + (119, 97, 68), (129, 100, 71), (129, 100, 71), (130, 101, 71), + (134, 100, 71), (138, 99, 72), (139, 98, 71), (140, 97, 71), + (138, 88, 65), (125, 81, 60), (113, 75, 55), (104, 71, 54), + (96, 68, 53), (96, 69, 55), (96, 70, 58), (101, 76, 64), + (113, 85, 72), (136, 105, 84), (144, 110, 87), (152, 115, 91), + (161, 122, 97), (170, 129, 103), (175, 132, 105), (180, 136, 108), + (203, 155, 119), (211, 159, 121), (219, 164, 124), (225, 166, 126), + (231, 169, 129), (232, 171, 131), (233, 174, 134), (234, 179, 142), + (234, 185, 150), (236, 198, 169), (237, 203, 177), (239, 209, 186), + (240, 214, 194), (241, 220, 203), (241, 222, 207), (241, 225, 212), + (240, 236, 228), (240, 237, 232), (241, 239, 237), (241, 239, 237), + (241, 239, 237), (241, 239, 236), (241, 239, 236), (241, 240, 236), + (241, 240, 236), (241, 239, 235), (240, 236, 228), (239, 234, 221), + (238, 231, 216), (238, 228, 212), (236, 222, 201), (234, 214, 189), + (226, 192, 170), (218, 179, 157), (211, 166, 145), (203, 153, 133), + (195, 141, 121), (193, 137, 115), (192, 133, 109), (191, 127, 97), + (191, 122, 93), (183, 114, 89), (177, 109, 87), (171, 105, 85), + (170, 103, 83), (169, 102, 82), (171, 103, 83), (179, 107, 85), + (190, 120, 93), (191, 126, 96), (193, 132, 100), (192, 134, 100), + (192, 136, 100), (191, 139, 103), (196, 141, 105), (203, 142, 108), + (207, 146, 111), (209, 156, 121), (203, 157, 120), (197, 158, 119), + (194, 156, 118), (191, 154, 117), (185, 147, 114), (179, 138, 110), + (172, 126, 104), (168, 125, 102), (164, 124, 101), (164, 124, 101), + (164, 124, 101), (164, 125, 103), (165, 126, 103), (167, 126, 104), + (171, 127, 107), (179, 132, 111), (181, 133, 111), (184, 134, 111), + (184, 135, 113), (181, 134, 111), (174, 133, 108), (164, 132, 105), + (143, 125, 93), (132, 115, 85), (121, 106, 77), (114, 100, 72), + (108, 94, 68), (95, 82, 59), (82, 72, 53), (70, 68, 47), + (64, 67, 44), (69, 74, 46), (74, 77, 49), (79, 80, 52), + (93, 86, 59), (107, 90, 66), (120, 97, 74), (133, 104, 80), + (161, 122, 96), (174, 135, 109), (188, 148, 123), (195, 156, 131), + (202, 164, 140), (213, 179, 156), (224, 191, 170), (233, 203, 182), + (239, 209, 191), (244, 223, 208), (244, 227, 212), (245, 231, 217), + (245, 238, 226), (246, 243, 233), (245, 249, 239), (239, 250, 237), + (231, 240, 220), (228, 236, 215), (225, 232, 210), (217, 222, 199), + (210, 212, 187), (204, 199, 178), (193, 187, 165), (181, 172, 150), + (173, 159, 134), (159, 138, 111), (156, 135, 106), (153, 132, 101), + (153, 127, 97), (153, 125, 97), (154, 124, 98), (157, 127, 100), + (171, 142, 121), (174, 147, 126), (177, 153, 131), (185, 167, 144), + (194, 180, 158), (201, 192, 170), (208, 200, 178), (217, 211, 190), + (225, 219, 202), (232, 225, 208), (236, 228, 211), (239, 230, 212), + (238, 233, 216), (238, 233, 216), (238, 233, 216), (237, 236, 222), + (237, 237, 222), (237, 236, 219), (238, 235, 217), (235, 236, 214), + (233, 236, 212), (230, 232, 205), (227, 229, 203), (224, 226, 200), + (223, 223, 198), (224, 216, 191), (223, 209, 181), (222, 204, 174), + (220, 193, 162), (217, 183, 149), (214, 171, 136), (212, 157, 124), + (210, 146, 114), (207, 136, 104), (204, 129, 97), (196, 119, 91), + (183, 111, 84), (169, 104, 76), (158, 95, 70), (151, 92, 69), + (146, 94, 71), (147, 100, 75), (150, 109, 84), (151, 122, 97), + (152, 134, 110), (151, 143, 120), (154, 154, 132), (156, 165, 142), + (165, 171, 147), (178, 179, 151), (193, 189, 158), (208, 197, 165), + (217, 202, 170), (226, 205, 175), (228, 208, 181), (229, 203, 178), + (225, 196, 170), (219, 189, 159), (214, 182, 149), (208, 174, 138), + (205, 168, 130), (200, 165, 128), (196, 163, 127), (190, 161, 129), + (183, 160, 127), (177, 159, 126), (171, 157, 125), (168, 157, 124), + (169, 159, 123), (170, 159, 123), (173, 159, 125), (173, 159, 124), + (172, 158, 123), (169, 155, 122), (165, 150, 117), (163, 148, 112), + (162, 140, 105), (163, 131, 99), (163, 124, 92), (163, 116, 86), + (164, 110, 82), (162, 103, 78), (158, 102, 75), (157, 108, 77), + (155, 107, 78), (153, 106, 77), (144, 100, 72), (137, 94, 68) + ), + +// 685 040412 +((0, 110, 219), (0, 110, 222), (8, 107, 223), (16, 105, 225), + (19, 103, 225), (23, 102, 226), (24, 100, 225), (26, 99, 225), + (42, 89, 224), (39, 90, 220), (37, 91, 217), (36, 86, 212), + (36, 82, 208), (39, 83, 195), (43, 85, 183), (46, 88, 179), + (50, 91, 175), (68, 106, 162), (73, 117, 156), (78, 128, 151), + (88, 136, 144), (98, 145, 138), (104, 149, 134), (110, 154, 131), + (119, 169, 117), (118, 168, 120), (117, 168, 124), (120, 168, 120), + (123, 169, 117), (127, 167, 113), (131, 166, 109), (138, 158, 102), + (140, 149, 89), (130, 151, 60), (132, 154, 46), (135, 158, 33), + (147, 163, 19), (159, 168, 5), (164, 168, 4), (170, 169, 4), + (180, 165, 5), (175, 160, 8), (170, 156, 11), (166, 143, 16), + (163, 130, 21), (157, 121, 21), (152, 113, 21), (142, 99, 21), + (133, 86, 22), (113, 72, 16), (111, 71, 8), (109, 70, 0), + (107, 66, 0), (106, 63, 0), (102, 62, 0), (99, 61, 0), + (84, 64, 0), (79, 61, 0), (75, 58, 0), (65, 57, 5), + (56, 56, 11), (49, 53, 18), (42, 51, 26), (28, 54, 40), + (14, 58, 54), (2, 70, 82), (3, 78, 94), (5, 86, 107), + (5, 89, 113), (5, 93, 120), (5, 102, 133), (5, 110, 145), + (1, 126, 170), (0, 132, 183), (0, 138, 196), (0, 146, 210), + (0, 155, 224), (0, 160, 231), (0, 165, 238), (0, 179, 243), + (0, 194, 246), (0, 218, 236), (0, 224, 227), (0, 231, 219), + (0, 232, 214), (0, 233, 210), (0, 232, 198), (7, 228, 184), + (15, 212, 156), (18, 200, 145), (21, 189, 134), (21, 183, 130), + (21, 177, 126), (25, 169, 124), (30, 158, 117), (33, 148, 109), + (33, 138, 100), (33, 127, 82), (34, 127, 67), (36, 127, 53), + (38, 127, 46), (40, 127, 39), (39, 128, 25), (40, 121, 16), + (32, 103, 12), (26, 98, 16), (21, 93, 21), (18, 91, 21), + (16, 89, 21), (9, 82, 21), (2, 71, 22), (0, 58, 29), + (0, 53, 29), (0, 58, 29), (0, 64, 25), (0, 71, 22), + (0, 81, 19), (0, 92, 12), (0, 100, 7), (0, 109, 7), + (0, 131, 0), (0, 141, 0), (0, 152, 0), (0, 153, 0), + (0, 155, 0), (2, 152, 0), (5, 152, 0), (7, 152, 0), + (8, 155, 0), (8, 148, 0), (8, 144, 0), (8, 141, 0), + (7, 133, 0), (5, 124, 0), (5, 116, 0), (4, 114, 0), + (5, 116, 0), (4, 114, 0), (4, 112, 0), (3, 110, 0), + (2, 109, 0), (1, 116, 0), (0, 116, 0), (0, 119, 0), + (0, 120, 0), (0, 119, 9), (0, 117, 14), (0, 116, 19), + (0, 112, 26), (0, 103, 35), (0, 96, 42), (0, 88, 49), + (0, 68, 71), (0, 66, 76), (0, 65, 81), (0, 64, 88), + (0, 65, 96), (0, 65, 100), (0, 70, 105), (8, 70, 107), + (21, 72, 110), (47, 84, 106), (53, 86, 102), (60, 89, 99), + (72, 98, 91), (79, 103, 84), (91, 105, 81), (96, 107, 82), + (109, 106, 79), (114, 105, 79), (120, 105, 79), (131, 103, 84), + (142, 99, 85), (156, 102, 84), (170, 106, 88), (186, 112, 86), + (200, 117, 85), (214, 130, 81), (224, 141, 78), (232, 154, 70), + (235, 168, 61), (232, 182, 54), (225, 194, 44), (215, 211, 40), + (190, 226, 57), (183, 228, 61), (177, 231, 65), (165, 235, 82), + (152, 235, 96), (140, 232, 110), (127, 231, 121), (117, 228, 135), + (113, 224, 149), (106, 218, 161), (99, 212, 172), (100, 205, 176), + (96, 200, 173), (89, 196, 170), (81, 183, 169), (72, 169, 166), + (70, 159, 166), (65, 148, 162), (63, 140, 159), (58, 133, 155), + (54, 126, 154), (57, 123, 151), (61, 119, 148), (61, 117, 142), + (71, 113, 135), (82, 109, 133), (93, 105, 131), (103, 98, 128), + (107, 89, 130), (116, 79, 130), (124, 70, 130), (135, 60, 130), + (144, 50, 128), (149, 42, 127), (148, 39, 123), (148, 39, 119), + (141, 44, 116), (135, 51, 109), (127, 61, 110), (123, 74, 117), + (117, 82, 124), (106, 89, 137), (95, 95, 149), (84, 96, 162), + (75, 96, 172), (68, 93, 182), (64, 91, 193), (53, 86, 203), + (42, 85, 214), (30, 86, 226), (21, 89, 232), (8, 92, 235), + (0, 100, 238), (0, 109, 240), (0, 117, 245), (0, 126, 252), + (0, 135, 255), (0, 144, 255), (0, 149, 255), (0, 154, 255), + (0, 156, 255), (0, 156, 255), (0, 155, 255), (0, 149, 255), + (0, 144, 252), (0, 138, 242), (0, 131, 233), (0, 126, 225), + (0, 121, 219), (0, 120, 218), (0, 120, 218), (0, 114, 218) + ), + +// 686 040412-000 +((171, 102, 133), (150, 79, 120), (137, 65, 111), (125, 51, 103), + (128, 47, 103), (132, 44, 104), (132, 43, 104), (133, 43, 105), + (132, 51, 106), (135, 59, 109), (138, 67, 112), (142, 75, 115), + (147, 84, 119), (151, 94, 123), (156, 105, 128), (159, 110, 130), + (163, 115, 133), (180, 127, 143), (186, 129, 146), (193, 132, 149), + (197, 134, 151), (202, 136, 153), (204, 136, 154), (206, 137, 155), + (212, 140, 158), (216, 140, 160), (220, 141, 163), (223, 141, 165), + (227, 142, 167), (228, 142, 167), (229, 142, 167), (230, 141, 168), + (232, 141, 169), (235, 141, 171), (235, 142, 171), (236, 143, 171), + (236, 144, 171), (237, 146, 171), (238, 146, 171), (239, 147, 172), + (241, 150, 173), (241, 150, 173), (241, 151, 173), (239, 150, 172), + (237, 150, 171), (234, 149, 170), (232, 148, 169), (225, 145, 165), + (216, 142, 161), (193, 132, 149), (178, 126, 141), (163, 120, 134), + (147, 113, 126), (131, 106, 118), (124, 103, 114), (117, 100, 111), + (92, 89, 99), (83, 85, 94), (74, 81, 90), (69, 79, 87), + (65, 77, 85), (64, 76, 84), (63, 75, 84), (62, 74, 83), + (62, 74, 83), (64, 74, 84), (66, 74, 85), (69, 75, 86), + (70, 75, 86), (71, 75, 87), (72, 76, 88), (74, 78, 89), + (78, 80, 91), (80, 80, 92), (82, 81, 93), (84, 81, 94), + (86, 82, 95), (87, 82, 95), (88, 82, 95), (90, 81, 96), + (93, 79, 97), (100, 73, 98), (103, 70, 99), (106, 68, 100), + (107, 67, 100), (108, 66, 100), (110, 65, 100), (111, 64, 100), + (110, 65, 100), (107, 66, 99), (105, 68, 99), (103, 69, 98), + (101, 70, 98), (98, 71, 97), (94, 73, 96), (92, 77, 96), + (92, 80, 97), (98, 88, 101), (105, 91, 104), (112, 95, 108), + (116, 97, 110), (121, 100, 113), (130, 105, 117), (139, 109, 122), + (152, 115, 128), (153, 115, 129), (154, 116, 130), (152, 115, 129), + (151, 115, 128), (146, 112, 126), (138, 109, 122), (131, 106, 118), + (124, 103, 114), (115, 100, 110), (114, 99, 110), (114, 99, 110), + (116, 100, 111), (120, 102, 112), (126, 104, 116), (134, 108, 120), + (153, 115, 129), (160, 118, 132), (167, 122, 136), (169, 122, 137), + (172, 123, 138), (173, 124, 139), (173, 124, 139), (172, 123, 138), + (168, 122, 137), (158, 117, 132), (153, 115, 129), (149, 114, 127), + (140, 110, 123), (131, 106, 118), (123, 103, 114), (116, 100, 111), + (100, 94, 103), (92, 90, 99), (85, 87, 95), (83, 86, 94), + (81, 85, 93), (78, 83, 91), (77, 81, 91), (76, 80, 90), + (75, 79, 90), (78, 78, 90), (79, 77, 90), (81, 77, 91), + (84, 77, 93), (87, 77, 94), (90, 76, 95), (93, 75, 96), + (99, 72, 98), (101, 71, 98), (103, 70, 99), (108, 66, 100), + (112, 62, 101), (116, 59, 102), (120, 55, 102), (125, 51, 103), + (128, 48, 104), (132, 44, 104), (132, 44, 104), (132, 44, 104), + (133, 43, 104), (133, 43, 104), (132, 44, 104), (130, 46, 104), + (126, 49, 103), (125, 50, 103), (124, 52, 103), (121, 55, 102), + (119, 61, 103), (121, 68, 106), (127, 76, 109), (135, 84, 115), + (143, 91, 120), (152, 101, 126), (163, 112, 132), (176, 121, 140), + (190, 129, 148), (203, 134, 154), (214, 138, 160), (222, 141, 164), + (232, 141, 169), (232, 140, 169), (233, 140, 170), (234, 139, 170), + (233, 137, 170), (232, 136, 169), (231, 135, 169), (231, 135, 169), + (231, 135, 169), (232, 136, 169), (233, 138, 170), (235, 140, 170), + (236, 142, 171), (237, 144, 172), (239, 146, 172), (240, 148, 173), + (241, 149, 173), (241, 150, 173), (242, 150, 173), (241, 150, 173), + (241, 149, 173), (241, 149, 173), (241, 149, 173), (241, 149, 173), + (240, 148, 173), (240, 148, 172), (238, 148, 172), (236, 148, 171), + (234, 147, 169), (229, 146, 167), (224, 144, 164), (216, 141, 161), + (207, 138, 156), (196, 133, 150), (184, 128, 144), (170, 122, 137), + (155, 116, 130), (140, 110, 123), (125, 104, 115), (112, 98, 109), + (99, 93, 102), (87, 88, 96), (77, 84, 91), (68, 80, 87), + (62, 78, 84), (58, 76, 82), (54, 74, 80), (52, 73, 79), + (50, 73, 78), (50, 72, 77), (49, 72, 77), (49, 72, 77), + (49, 72, 77), (50, 72, 78), (51, 72, 78), (53, 73, 79), + (55, 74, 80), (58, 75, 82), (62, 77, 84), (68, 79, 86), + (74, 82, 90), (84, 86, 94), (94, 91, 100), (108, 97, 107), + (124, 103, 114), (140, 110, 123), (159, 118, 132), (174, 124, 139), + (171, 121, 138), (168, 116, 135), (163, 109, 132), (161, 102, 129) + ), + +// 687 040412-001 +((100, 88, 103), (127, 94, 112), (138, 92, 116), (150, 91, 120), + (156, 90, 121), (162, 89, 123), (162, 86, 120), (163, 83, 118), + (154, 62, 107), (145, 52, 101), (136, 43, 95), (127, 38, 90), + (118, 34, 85), (111, 33, 82), (104, 32, 80), (101, 32, 79), + (99, 33, 78), (87, 38, 76), (81, 40, 74), (75, 43, 73), + (70, 44, 71), (66, 45, 70), (64, 45, 69), (62, 46, 68), + (59, 45, 66), (59, 45, 66), (59, 45, 66), (59, 45, 66), + (60, 45, 66), (60, 45, 66), (60, 45, 66), (58, 46, 65), + (56, 47, 65), (51, 49, 63), (49, 51, 63), (47, 54, 64), + (46, 56, 65), (46, 59, 67), (47, 59, 68), (48, 59, 69), + (55, 59, 72), (57, 58, 72), (59, 58, 73), (59, 56, 72), + (59, 54, 71), (59, 53, 71), (59, 53, 71), (58, 51, 69), + (57, 50, 67), (56, 47, 65), (57, 47, 66), (59, 48, 68), + (62, 48, 70), (66, 49, 72), (66, 48, 71), (67, 47, 71), + (67, 47, 71), (65, 48, 71), (63, 50, 71), (58, 50, 68), + (53, 51, 66), (50, 51, 64), (48, 52, 63), (44, 52, 61), + (42, 55, 62), (44, 61, 64), (45, 62, 65), (46, 63, 66), + (47, 63, 67), (49, 64, 68), (53, 64, 71), (57, 64, 74), + (66, 62, 77), (70, 62, 79), (74, 62, 82), (78, 62, 84), + (83, 63, 86), (84, 60, 85), (85, 58, 85), (88, 55, 85), + (91, 53, 86), (96, 53, 88), (95, 49, 86), (95, 46, 84), + (95, 45, 84), (95, 45, 84), (95, 46, 84), (96, 48, 86), + (105, 48, 88), (116, 54, 94), (127, 60, 100), (133, 65, 104), + (140, 71, 109), (150, 81, 116), (161, 86, 122), (174, 91, 128), + (188, 98, 134), (209, 116, 148), (212, 121, 151), (215, 127, 155), + (214, 128, 154), (213, 130, 154), (209, 130, 153), (206, 129, 155), + (203, 131, 163), (201, 131, 164), (199, 131, 166), (198, 129, 165), + (197, 127, 164), (196, 124, 162), (194, 117, 160), (191, 110, 156), + (186, 102, 151), (173, 83, 131), (168, 77, 125), (164, 72, 120), + (153, 61, 108), (139, 53, 100), (126, 45, 92), (115, 40, 86), + (97, 36, 77), (90, 36, 75), (84, 36, 73), (83, 36, 73), + (82, 37, 73), (83, 39, 75), (91, 41, 78), (100, 46, 83), + (112, 52, 89), (141, 69, 107), (148, 73, 111), (155, 78, 116), + (169, 89, 124), (178, 97, 129), (183, 104, 137), (184, 108, 142), + (173, 112, 142), (161, 108, 135), (150, 104, 129), (143, 98, 125), + (136, 93, 121), (125, 84, 115), (112, 75, 107), (100, 66, 97), + (92, 61, 90), (83, 48, 79), (83, 45, 78), (83, 43, 77), + (83, 38, 75), (85, 36, 75), (88, 34, 75), (92, 32, 76), + (101, 29, 79), (103, 28, 79), (105, 27, 80), (108, 26, 81), + (111, 25, 82), (111, 25, 82), (109, 26, 81), (107, 27, 80), + (102, 29, 79), (91, 33, 76), (88, 35, 76), (86, 38, 76), + (80, 42, 75), (74, 46, 75), (70, 50, 75), (68, 50, 74), + (69, 52, 76), (70, 52, 76), (72, 52, 77), (76, 51, 79), + (81, 48, 80), (86, 44, 80), (91, 41, 81), (94, 39, 81), + (96, 38, 81), (95, 38, 81), (93, 40, 81), (89, 44, 80), + (86, 48, 80), (85, 54, 81), (85, 57, 82), (86, 57, 84), + (95, 55, 84), (97, 54, 85), (100, 54, 86), (107, 53, 89), + (111, 48, 90), (117, 41, 91), (120, 35, 88), (123, 29, 86), + (127, 27, 86), (126, 26, 86), (125, 26, 86), (125, 28, 85), + (128, 31, 86), (134, 37, 90), (141, 45, 95), (147, 56, 101), + (151, 66, 107), (151, 75, 110), (149, 81, 112), (147, 85, 112), + (142, 90, 113), (135, 91, 111), (126, 89, 107), (115, 85, 102), + (106, 76, 96), (101, 69, 91), (96, 59, 86), (93, 51, 83), + (92, 44, 81), (91, 38, 79), (92, 36, 78), (94, 34, 78), + (96, 32, 77), (99, 29, 78), (101, 29, 78), (105, 30, 80), + (110, 34, 83), (119, 42, 89), (132, 52, 98), (147, 63, 109), + (163, 75, 119), (178, 87, 128), (190, 98, 140), (201, 110, 153), + (210, 120, 166), (217, 129, 176), (222, 136, 180), (221, 139, 184), + (217, 138, 185), (211, 135, 186), (201, 131, 185), (198, 126, 177), + (194, 119, 169), (183, 114, 161), (170, 108, 151), (154, 106, 145), + (147, 105, 140), (148, 101, 137), (151, 101, 138), (148, 100, 136), + (138, 99, 132), (129, 100, 130), (123, 98, 127), (120, 98, 125), + (116, 96, 123), (108, 93, 117), (100, 89, 110), (93, 85, 105), + (83, 80, 97), (78, 76, 92), (78, 76, 93), (85, 79, 94) + ), + +// 688 040412-002 +((42, 85, 77), (18, 49, 50), (17, 49, 50), (16, 50, 50), + (15, 49, 49), (14, 49, 49), (13, 48, 48), (12, 47, 48), + (11, 46, 46), (10, 45, 45), (10, 44, 45), (10, 44, 45), + (10, 44, 45), (11, 44, 45), (13, 44, 46), (14, 44, 46), + (15, 44, 46), (17, 39, 42), (17, 35, 38), (17, 31, 34), + (16, 29, 31), (15, 27, 29), (15, 27, 29), (15, 28, 30), + (21, 40, 41), (29, 50, 49), (37, 61, 57), (43, 74, 67), + (50, 87, 77), (54, 93, 81), (59, 99, 86), (64, 110, 97), + (68, 120, 112), (79, 145, 143), (85, 157, 162), (91, 170, 181), + (97, 182, 193), (103, 194, 206), (104, 198, 210), (106, 202, 214), + (103, 195, 207), (101, 192, 204), (100, 189, 201), (100, 190, 202), + (101, 191, 203), (101, 190, 202), (101, 189, 201), (99, 185, 197), + (96, 179, 191), (85, 155, 167), (77, 145, 154), (70, 135, 141), + (65, 128, 132), (61, 122, 124), (58, 118, 118), (55, 114, 113), + (55, 100, 94), (56, 98, 90), (57, 96, 86), (59, 101, 91), + (61, 107, 97), (61, 110, 102), (61, 114, 107), (64, 120, 110), + (64, 119, 109), (58, 106, 97), (51, 92, 84), (45, 78, 71), + (41, 71, 66), (38, 65, 61), (30, 54, 52), (23, 45, 45), + (19, 36, 38), (19, 36, 38), (20, 37, 39), (21, 39, 42), + (23, 42, 45), (24, 44, 47), (25, 46, 49), (28, 53, 53), + (34, 60, 58), (42, 72, 66), (47, 77, 69), (53, 83, 72), + (53, 84, 73), (54, 85, 74), (53, 83, 73), (50, 80, 71), + (40, 72, 68), (36, 68, 66), (33, 65, 65), (32, 64, 65), + (31, 64, 66), (30, 66, 68), (30, 70, 72), (33, 76, 77), + (34, 81, 82), (37, 90, 90), (37, 90, 90), (38, 90, 90), + (37, 89, 89), (36, 88, 88), (34, 83, 84), (30, 78, 79), + (25, 68, 69), (24, 67, 68), (24, 67, 68), (25, 69, 70), + (27, 72, 72), (31, 77, 78), (37, 84, 84), (41, 92, 92), + (45, 98, 98), (50, 104, 105), (48, 104, 105), (47, 104, 105), + (49, 107, 108), (50, 110, 110), (51, 112, 112), (54, 117, 118), + (69, 136, 142), (75, 144, 152), (81, 153, 162), (83, 155, 165), + (86, 158, 169), (86, 157, 169), (81, 147, 158), (75, 135, 145), + (66, 119, 128), (48, 86, 91), (44, 80, 84), (40, 74, 77), + (34, 63, 66), (30, 57, 58), (26, 53, 54), (23, 51, 53), + (22, 51, 52), (22, 53, 52), (23, 55, 53), (23, 55, 54), + (24, 56, 55), (26, 57, 58), (30, 62, 61), (33, 68, 67), + (37, 74, 73), (45, 90, 87), (48, 94, 89), (51, 98, 92), + (53, 102, 97), (54, 105, 99), (55, 106, 97), (54, 103, 95), + (50, 96, 94), (48, 95, 93), (47, 94, 92), (47, 93, 94), + (46, 95, 98), (46, 99, 100), (46, 101, 102), (44, 101, 101), + (44, 101, 101), (44, 95, 94), (43, 92, 91), (42, 90, 89), + (41, 87, 87), (41, 83, 82), (39, 78, 78), (37, 75, 75), + (33, 67, 68), (32, 65, 67), (31, 64, 66), (30, 60, 63), + (29, 58, 62), (28, 59, 62), (32, 61, 65), (35, 64, 70), + (35, 69, 72), (37, 73, 74), (41, 74, 75), (39, 73, 72), + (35, 69, 70), (34, 65, 64), (31, 61, 61), (27, 58, 61), + (26, 63, 65), (26, 65, 67), (26, 68, 69), (28, 74, 75), + (33, 83, 84), (38, 92, 92), (44, 100, 100), (48, 107, 108), + (52, 114, 114), (57, 117, 119), (58, 117, 120), (55, 115, 116), + (52, 106, 109), (47, 96, 99), (41, 85, 85), (33, 71, 73), + (26, 59, 63), (26, 54, 58), (25, 54, 57), (28, 57, 63), + (36, 68, 76), (46, 86, 92), (57, 104, 112), (70, 126, 135), + (81, 147, 158), (91, 170, 181), (101, 190, 202), (105, 199, 212), + (105, 198, 211), (102, 192, 204), (95, 178, 189), (85, 156, 167), + (73, 132, 143), (63, 113, 122), (55, 99, 106), (48, 89, 94), + (45, 84, 87), (43, 84, 86), (41, 87, 87), (42, 91, 90), + (46, 97, 97), (48, 102, 103), (49, 105, 106), (53, 109, 107), + (56, 112, 107), (58, 111, 106), (61, 112, 103), (63, 115, 104), + (64, 117, 105), (67, 121, 107), (68, 125, 111), (66, 127, 116), + (64, 128, 121), (66, 131, 124), (64, 131, 127), (62, 129, 130), + (62, 129, 130), (61, 129, 129), (60, 126, 126), (58, 123, 123), + (59, 120, 117), (57, 116, 111), (54, 111, 109), (52, 106, 103), + (51, 101, 96), (48, 95, 93), (49, 92, 89), (52, 92, 87), + (53, 97, 90), (59, 104, 93), (52, 89, 81), (40, 76, 72) + ), + +// 689 040412-005 +((48, 130, 119), (77, 132, 126), (88, 143, 127), (99, 154, 128), + (111, 176, 108), (123, 198, 88), (128, 204, 81), (134, 211, 75), + (146, 207, 66), (148, 199, 66), (150, 192, 67), (146, 184, 66), + (143, 176, 66), (128, 159, 70), (113, 143, 75), (105, 138, 77), + (98, 134, 79), (77, 105, 98), (70, 93, 114), (64, 81, 130), + (49, 68, 145), (34, 55, 160), (31, 52, 165), (28, 49, 170), + (44, 42, 161), (56, 44, 145), (68, 46, 129), (61, 43, 131), + (55, 41, 133), (55, 39, 137), (56, 37, 141), (61, 32, 156), + (72, 21, 155), (106, 20, 113), (103, 19, 101), (101, 18, 90), + (84, 17, 112), (68, 17, 134), (69, 17, 142), (71, 17, 151), + (70, 31, 161), (71, 38, 162), (73, 45, 163), (57, 49, 180), + (42, 54, 198), (34, 55, 208), (26, 57, 219), (12, 60, 232), + (7, 62, 235), (5, 67, 237), (4, 66, 237), (3, 66, 237), + (3, 67, 237), (3, 68, 237), (4, 69, 237), (5, 70, 237), + (5, 76, 236), (5, 79, 238), (6, 83, 240), (21, 91, 238), + (37, 99, 236), (46, 104, 233), (55, 109, 230), (71, 118, 222), + (82, 126, 212), (93, 127, 198), (94, 125, 191), (96, 124, 184), + (96, 123, 180), (97, 123, 176), (93, 124, 166), (84, 122, 160), + (59, 106, 163), (45, 93, 169), (31, 81, 175), (28, 71, 179), + (25, 61, 184), (33, 61, 183), (41, 62, 182), (60, 68, 180), + (79, 74, 179), (106, 89, 181), (120, 86, 185), (135, 84, 190), + (141, 85, 190), (148, 86, 190), (151, 84, 187), (146, 82, 183), + (118, 81, 172), (104, 68, 173), (91, 55, 174), (82, 48, 174), + (74, 41, 174), (55, 28, 176), (37, 23, 173), (21, 23, 169), + (5, 23, 163), (0, 28, 151), (0, 27, 149), (0, 27, 147), + (0, 26, 147), (0, 25, 147), (0, 25, 148), (2, 26, 149), + (26, 30, 154), (42, 29, 157), (59, 28, 160), (68, 27, 161), + (77, 27, 163), (90, 26, 163), (99, 28, 169), (115, 31, 173), + (134, 37, 177), (166, 65, 174), (170, 75, 167), (175, 85, 161), + (174, 106, 143), (171, 122, 126), (170, 131, 112), (170, 129, 97), + (172, 115, 97), (169, 113, 96), (167, 112, 96), (160, 114, 98), + (153, 116, 100), (136, 105, 98), (121, 84, 104), (108, 61, 115), + (92, 42, 128), (88, 26, 140), (88, 27, 137), (88, 29, 135), + (85, 29, 122), (83, 28, 106), (83, 23, 92), (82, 22, 94), + (116, 29, 93), (135, 42, 90), (155, 56, 88), (162, 62, 84), + (170, 68, 81), (169, 85, 81), (168, 103, 81), (166, 115, 84), + (167, 135, 84), (171, 171, 78), (170, 180, 72), (169, 190, 67), + (165, 208, 51), (157, 216, 36), (148, 224, 23), (141, 229, 9), + (124, 222, 15), (117, 216, 24), (111, 211, 34), (98, 199, 53), + (94, 193, 73), (93, 192, 89), (93, 191, 96), (98, 197, 105), + (99, 198, 114), (95, 192, 119), (97, 194, 120), (100, 196, 121), + (111, 199, 115), (124, 207, 117), (137, 212, 120), (140, 213, 120), + (127, 183, 124), (120, 178, 123), (114, 174, 122), (100, 164, 135), + (84, 154, 150), (72, 148, 165), (77, 148, 174), (76, 140, 182), + (78, 142, 172), (78, 146, 161), (76, 154, 144), (63, 159, 128), + (64, 174, 119), (60, 174, 126), (62, 176, 130), (63, 176, 137), + (60, 171, 142), (57, 170, 143), (54, 170, 145), (39, 159, 163), + (26, 145, 185), (14, 132, 209), (4, 119, 233), (0, 103, 242), + (0, 95, 243), (0, 89, 241), (1, 81, 237), (2, 73, 233), + (7, 68, 228), (20, 65, 223), (33, 68, 212), (46, 80, 188), + (61, 92, 164), (74, 105, 141), (79, 118, 119), (93, 129, 102), + (104, 140, 95), (111, 158, 74), (120, 175, 53), (124, 191, 36), + (112, 193, 32), (101, 187, 33), (96, 174, 53), (98, 158, 73), + (103, 143, 89), (115, 144, 90), (122, 135, 101), (119, 136, 96), + (117, 138, 97), (121, 139, 98), (129, 136, 101), (143, 152, 93), + (157, 155, 102), (162, 163, 99), (155, 167, 100), (137, 170, 99), + (123, 176, 92), (109, 189, 75), (94, 192, 72), (85, 198, 68), + (85, 194, 71), (74, 184, 78), (71, 178, 81), (69, 179, 70), + (61, 183, 54), (53, 193, 41), (50, 193, 41), (46, 186, 50), + (44, 178, 69), (43, 171, 90), (42, 165, 104), (39, 166, 117), + (30, 158, 139), (19, 148, 158), (10, 140, 178), (3, 131, 196), + (0, 122, 204), (0, 119, 201), (0, 115, 196), (0, 110, 190), + (0, 104, 184), (0, 97, 178), (0, 92, 173), (0, 83, 167), + (0, 79, 159), (6, 88, 148), (19, 100, 131), (34, 114, 118) + ), + +// 690 040412-006 +((42, 112, 82), (71, 97, 64), (77, 84, 59), (83, 72, 55), + (92, 65, 50), (101, 58, 46), (106, 54, 44), (112, 51, 43), + (129, 66, 44), (136, 69, 39), (144, 72, 35), (134, 66, 39), + (125, 61, 43), (114, 56, 48), (104, 52, 53), (97, 51, 58), + (91, 50, 63), (77, 46, 73), (76, 49, 69), (76, 52, 65), + (74, 52, 63), (72, 52, 62), (72, 50, 62), (73, 48, 62), + (74, 35, 74), (81, 26, 80), (89, 18, 86), (104, 13, 83), + (120, 9, 81), (128, 6, 79), (136, 4, 78), (152, 1, 72), + (166, 0, 67), (191, 0, 65), (192, 0, 70), (194, 0, 76), + (188, 3, 79), (183, 7, 82), (177, 11, 82), (171, 15, 83), + (145, 31, 83), (133, 40, 85), (121, 49, 88), (109, 54, 95), + (98, 60, 102), (90, 63, 106), (82, 66, 111), (67, 74, 119), + (50, 83, 126), (25, 101, 121), (20, 112, 113), (16, 123, 105), + (23, 127, 96), (31, 132, 88), (34, 133, 83), (38, 135, 79), + (47, 138, 67), (47, 138, 60), (48, 139, 54), (48, 139, 54), + (48, 140, 54), (48, 140, 55), (48, 141, 56), (48, 142, 59), + (49, 144, 64), (45, 144, 82), (38, 141, 92), (31, 138, 103), + (27, 137, 108), (23, 136, 113), (16, 134, 121), (9, 130, 129), + (11, 130, 129), (21, 130, 121), (31, 130, 113), (40, 123, 104), + (50, 116, 96), (51, 112, 92), (53, 108, 88), (48, 98, 87), + (46, 93, 79), (46, 95, 59), (55, 101, 46), (64, 107, 34), + (70, 108, 29), (77, 109, 24), (87, 111, 15), (91, 109, 15), + (86, 103, 19), (80, 108, 19), (74, 114, 19), (72, 120, 18), + (71, 126, 17), (69, 133, 21), (69, 141, 26), (69, 146, 30), + (69, 149, 34), (64, 147, 42), (65, 148, 38), (67, 149, 35), + (67, 149, 34), (67, 149, 33), (66, 148, 33), (64, 149, 33), + (55, 146, 42), (48, 137, 45), (41, 129, 48), (41, 125, 46), + (41, 122, 44), (43, 114, 37), (51, 104, 30), (64, 100, 21), + (78, 97, 13), (96, 99, 10), (98, 98, 10), (101, 97, 10), + (106, 94, 11), (103, 90, 12), (106, 79, 14), (116, 67, 18), + (137, 48, 32), (148, 48, 38), (160, 49, 44), (159, 52, 46), + (159, 56, 49), (148, 66, 56), (134, 75, 61), (125, 78, 66), + (124, 78, 71), (125, 61, 85), (132, 55, 87), (139, 50, 89), + (141, 42, 88), (140, 40, 88), (135, 47, 84), (124, 57, 77), + (121, 84, 59), (127, 87, 54), (133, 90, 49), (139, 87, 45), + (145, 85, 41), (147, 78, 37), (146, 72, 32), (136, 69, 30), + (124, 69, 28), (108, 94, 18), (104, 100, 18), (100, 106, 19), + (104, 116, 14), (97, 120, 14), (85, 120, 21), (72, 117, 31), + (41, 109, 55), (40, 107, 59), (40, 106, 64), (42, 99, 72), + (56, 95, 77), (72, 94, 73), (84, 89, 75), (96, 84, 77), + (105, 73, 85), (113, 59, 93), (117, 53, 93), (122, 47, 94), + (133, 36, 94), (149, 28, 86), (163, 20, 78), (177, 13, 68), + (191, 7, 55), (191, 10, 51), (192, 13, 48), (191, 19, 40), + (190, 28, 31), (191, 38, 23), (190, 48, 15), (189, 55, 7), + (185, 65, 3), (180, 75, 1), (175, 85, 0), (167, 94, 0), + (160, 105, 0), (153, 116, 0), (146, 127, 0), (141, 135, 0), + (133, 150, 0), (131, 152, 0), (130, 154, 0), (126, 157, 0), + (122, 158, 0), (118, 159, 0), (115, 160, 0), (113, 160, 0), + (112, 161, 0), (113, 160, 0), (116, 155, 0), (117, 144, 4), + (120, 132, 11), (125, 121, 20), (130, 108, 30), (134, 96, 38), + (137, 85, 46), (137, 77, 51), (135, 72, 52), (128, 61, 54), + (119, 53, 58), (110, 47, 64), (102, 42, 73), (94, 39, 83), + (87, 38, 97), (81, 39, 109), (72, 49, 117), (64, 55, 123), + (52, 63, 126), (39, 71, 127), (26, 78, 128), (15, 85, 128), + (15, 89, 133), (20, 89, 138), (26, 90, 144), (36, 87, 149), + (47, 83, 152), (56, 78, 155), (56, 77, 154), (48, 77, 149), + (47, 76, 144), (47, 68, 138), (49, 59, 130), (58, 50, 122), + (73, 40, 109), (96, 30, 101), (109, 26, 91), (110, 28, 84), + (101, 35, 79), (89, 42, 78), (73, 50, 76), (57, 58, 80), + (48, 62, 78), (50, 62, 78), (52, 60, 73), (62, 62, 71), + (62, 65, 69), (59, 69, 71), (50, 76, 76), (36, 85, 86), + (22, 92, 97), (9, 98, 109), (0, 102, 117), (0, 105, 122), + (0, 107, 123), (3, 97, 118), (3, 91, 114), (3, 87, 110), + (7, 91, 102), (14, 96, 96), (23, 101, 90), (34, 103, 84) + ), + +// 691 040412-007 +((108, 129, 87), (98, 136, 98), (113, 138, 101), (128, 140, 105), + (134, 123, 114), (140, 106, 123), (122, 105, 130), (105, 105, 138), + (105, 105, 140), (122, 103, 133), (139, 101, 126), (141, 95, 117), + (144, 90, 108), (146, 81, 99), (148, 73, 91), (148, 68, 87), + (148, 64, 84), (148, 46, 70), (148, 40, 64), (148, 34, 58), + (148, 31, 58), (148, 28, 58), (148, 27, 58), (149, 27, 58), + (147, 27, 59), (143, 27, 59), (139, 27, 59), (132, 27, 59), + (126, 28, 59), (123, 27, 59), (120, 27, 60), (115, 26, 62), + (112, 25, 63), (108, 22, 67), (107, 20, 69), (107, 18, 71), + (107, 18, 71), (107, 18, 71), (107, 19, 70), (107, 21, 70), + (109, 32, 76), (109, 39, 82), (110, 47, 88), (110, 57, 97), + (111, 68, 106), (108, 72, 111), (105, 77, 117), (90, 86, 123), + (86, 114, 128), (87, 145, 138), (87, 155, 141), (87, 165, 144), + (84, 175, 147), (82, 185, 151), (80, 189, 153), (79, 193, 155), + (76, 202, 154), (76, 202, 149), (76, 203, 144), (77, 197, 137), + (79, 192, 131), (79, 187, 127), (79, 183, 123), (77, 176, 113), + (75, 168, 104), (73, 151, 88), (72, 143, 78), (71, 135, 68), + (73, 132, 65), (76, 129, 63), (82, 120, 58), (84, 111, 53), + (81, 94, 44), (78, 86, 43), (75, 79, 42), (71, 73, 41), + (67, 67, 40), (64, 66, 41), (62, 65, 42), (64, 57, 43), + (64, 44, 44), (64, 41, 55), (64, 40, 56), (65, 39, 58), + (65, 39, 58), (65, 39, 58), (65, 39, 58), (65, 39, 58), + (67, 40, 52), (70, 39, 53), (74, 39, 54), (76, 38, 54), + (78, 37, 55), (83, 36, 56), (88, 36, 56), (92, 41, 56), + (97, 45, 54), (104, 65, 52), (110, 74, 53), (116, 84, 54), + (119, 87, 55), (122, 90, 57), (129, 94, 59), (135, 94, 64), + (143, 102, 75), (144, 109, 78), (146, 116, 82), (147, 120, 82), + (148, 125, 83), (147, 128, 81), (144, 136, 80), (140, 140, 77), + (134, 138, 72), (119, 131, 68), (116, 129, 68), (113, 127, 69), + (104, 124, 65), (100, 122, 65), (102, 120, 64), (104, 118, 64), + (108, 117, 58), (110, 115, 56), (113, 113, 54), (113, 111, 54), + (114, 109, 54), (113, 107, 56), (115, 104, 57), (118, 99, 59), + (123, 90, 60), (132, 80, 63), (133, 77, 63), (134, 75, 63), + (137, 69, 65), (138, 64, 68), (136, 63, 72), (134, 60, 75), + (125, 49, 78), (120, 44, 77), (116, 40, 76), (113, 38, 74), + (110, 37, 73), (104, 36, 68), (98, 34, 65), (92, 33, 62), + (88, 32, 61), (79, 31, 62), (78, 31, 62), (78, 31, 63), + (77, 31, 62), (78, 31, 63), (79, 30, 63), (81, 31, 62), + (89, 32, 61), (91, 34, 61), (93, 36, 61), (97, 40, 60), + (104, 44, 60), (112, 47, 60), (120, 49, 59), (129, 50, 56), + (137, 51, 54), (155, 53, 51), (158, 55, 50), (162, 58, 50), + (165, 66, 51), (170, 74, 52), (173, 85, 55), (174, 97, 59), + (174, 124, 69), (173, 129, 71), (173, 135, 73), (173, 141, 76), + (175, 143, 77), (176, 141, 75), (177, 139, 74), (178, 137, 73), + (177, 131, 74), (176, 126, 74), (173, 121, 75), (167, 120, 77), + (159, 119, 78), (151, 118, 78), (144, 118, 77), (137, 115, 73), + (136, 107, 64), (138, 105, 63), (140, 103, 62), (143, 100, 60), + (144, 100, 62), (143, 104, 66), (139, 110, 72), (134, 123, 77), + (120, 133, 82), (103, 135, 83), (96, 137, 83), (100, 137, 83), + (113, 136, 85), (129, 135, 87), (140, 124, 89), (147, 112, 90), + (153, 107, 91), (156, 100, 93), (153, 94, 96), (149, 89, 100), + (145, 81, 101), (142, 72, 99), (139, 63, 92), (136, 54, 84), + (132, 46, 77), (131, 41, 68), (130, 36, 62), (130, 37, 59), + (130, 39, 61), (128, 44, 64), (126, 50, 69), (124, 54, 75), + (123, 57, 77), (122, 60, 80), (123, 60, 79), (125, 59, 75), + (129, 58, 72), (136, 57, 69), (143, 58, 69), (150, 62, 69), + (157, 68, 68), (161, 74, 71), (165, 79, 74), (170, 84, 76), + (173, 85, 75), (176, 85, 70), (181, 80, 64), (185, 71, 59), + (190, 70, 52), (196, 70, 47), (196, 66, 45), (192, 67, 45), + (186, 71, 45), (179, 76, 45), (171, 82, 44), (163, 86, 42), + (154, 85, 41), (146, 83, 39), (144, 85, 36), (143, 78, 34), + (142, 72, 32), (141, 67, 32), (141, 60, 34), (140, 56, 35), + (133, 50, 38), (129, 49, 41), (123, 51, 47), (119, 63, 52), + (114, 76, 59), (112, 91, 66), (112, 109, 72), (104, 120, 79) + ), + +// 692 040412-008 +((58, 76, 155), (56, 80, 157), (54, 82, 159), (53, 85, 161), + (50, 89, 164), (47, 94, 167), (44, 97, 169), (42, 100, 171), + (35, 110, 180), (33, 113, 182), (31, 117, 185), (30, 118, 186), + (30, 120, 187), (29, 122, 188), (29, 125, 190), (29, 126, 190), + (29, 127, 190), (29, 125, 190), (30, 123, 188), (31, 121, 187), + (34, 117, 185), (38, 114, 183), (39, 111, 181), (41, 108, 179), + (46, 96, 167), (50, 88, 160), (54, 80, 153), (59, 70, 147), + (65, 61, 141), (69, 59, 139), (73, 57, 137), (80, 53, 133), + (86, 50, 131), (97, 46, 127), (100, 44, 124), (104, 43, 121), + (104, 42, 118), (105, 42, 116), (106, 41, 115), (108, 41, 114), + (109, 34, 112), (109, 32, 109), (110, 30, 106), (111, 28, 107), + (113, 27, 108), (114, 26, 107), (116, 26, 106), (116, 26, 106), + (117, 25, 106), (116, 25, 100), (118, 25, 96), (120, 25, 93), + (121, 25, 89), (123, 25, 86), (123, 25, 85), (124, 25, 84), + (127, 25, 82), (127, 25, 81), (127, 25, 80), (124, 25, 80), + (121, 25, 80), (120, 25, 80), (119, 25, 80), (114, 25, 82), + (110, 25, 84), (104, 25, 84), (104, 28, 90), (104, 31, 96), + (103, 34, 100), (102, 38, 105), (102, 45, 110), (100, 51, 117), + (92, 61, 129), (86, 65, 133), (80, 69, 137), (74, 73, 140), + (68, 77, 143), (66, 79, 144), (64, 82, 145), (58, 90, 149), + (53, 98, 156), (43, 116, 169), (40, 125, 176), (38, 135, 184), + (38, 139, 188), (38, 144, 192), (41, 152, 200), (41, 163, 207), + (41, 169, 212), (42, 166, 210), (43, 164, 208), (44, 160, 207), + (46, 157, 206), (46, 152, 200), (49, 144, 196), (47, 136, 192), + (49, 129, 190), (56, 117, 184), (58, 112, 181), (61, 108, 179), + (63, 104, 177), (66, 101, 176), (70, 94, 173), (74, 89, 171), + (84, 82, 168), (88, 79, 166), (92, 76, 164), (93, 74, 162), + (94, 73, 160), (98, 68, 157), (104, 64, 153), (106, 58, 151), + (109, 57, 147), (104, 51, 140), (102, 51, 139), (101, 51, 139), + (93, 53, 137), (86, 54, 137), (77, 57, 139), (68, 60, 139), + (56, 65, 139), (52, 67, 139), (49, 70, 139), (47, 69, 137), + (46, 68, 136), (45, 68, 136), (46, 69, 136), (46, 73, 137), + (43, 77, 140), (43, 84, 144), (42, 84, 143), (41, 84, 143), + (38, 82, 140), (35, 81, 139), (31, 80, 139), (29, 78, 136), + (25, 70, 133), (25, 70, 133), (25, 70, 133), (25, 71, 134), + (25, 72, 135), (25, 77, 137), (25, 80, 140), (25, 80, 140), + (26, 78, 140), (31, 76, 136), (32, 72, 132), (33, 68, 129), + (35, 56, 123), (38, 43, 114), (41, 35, 106), (45, 30, 100), + (49, 26, 97), (51, 26, 96), (53, 26, 96), (57, 26, 96), + (65, 27, 94), (73, 27, 93), (82, 26, 92), (92, 25, 89), + (97, 25, 85), (110, 25, 76), (113, 25, 74), (116, 25, 73), + (120, 25, 70), (123, 25, 70), (125, 25, 68), (125, 25, 70), + (127, 25, 72), (127, 25, 72), (128, 25, 72), (128, 25, 73), + (131, 25, 73), (132, 25, 73), (135, 25, 73), (136, 25, 73), + (137, 25, 74), (137, 25, 74), (137, 25, 76), (136, 25, 80), + (135, 25, 82), (132, 25, 88), (129, 25, 93), (125, 25, 101), + (114, 25, 120), (109, 27, 123), (104, 29, 127), (96, 34, 135), + (85, 42, 140), (73, 50, 147), (60, 58, 153), (54, 69, 160), + (47, 84, 165), (42, 93, 172), (35, 102, 177), (31, 112, 183), + (26, 120, 188), (25, 128, 194), (25, 135, 196), (25, 137, 199), + (25, 137, 199), (25, 136, 199), (25, 135, 196), (25, 129, 194), + (26, 125, 190), (27, 120, 184), (30, 116, 179), (31, 109, 173), + (31, 104, 168), (30, 96, 164), (30, 90, 159), (30, 84, 152), + (30, 74, 147), (29, 68, 140), (30, 58, 135), (33, 47, 129), + (37, 41, 123), (41, 35, 120), (43, 35, 117), (45, 35, 119), + (42, 39, 120), (38, 46, 123), (34, 53, 127), (31, 60, 129), + (27, 62, 132), (26, 64, 135), (25, 64, 136), (26, 60, 136), + (29, 58, 136), (33, 57, 136), (38, 54, 139), (41, 54, 140), + (43, 58, 143), (46, 65, 147), (46, 70, 152), (46, 78, 157), + (45, 86, 164), (42, 94, 169), (41, 98, 173), (39, 101, 175), + (39, 101, 175), (41, 98, 173), (42, 94, 171), (46, 90, 167), + (49, 85, 163), (53, 80, 159), (51, 84, 160), (50, 85, 161), + (50, 88, 161), (49, 88, 161), (50, 88, 161), (50, 88, 161), + (50, 85, 161), (51, 85, 161), (53, 85, 161), (54, 85, 160) + ), + +// 693 040412-010 +((105, 129, 103), (109, 131, 103), (110, 132, 103), (112, 133, 103), + (114, 134, 103), (116, 135, 103), (116, 135, 103), (117, 136, 103), + (120, 137, 102), (121, 137, 101), (123, 138, 101), (124, 138, 100), + (126, 138, 100), (127, 138, 99), (128, 138, 98), (128, 138, 97), + (129, 138, 97), (131, 138, 95), (131, 138, 94), (132, 138, 93), + (133, 138, 92), (134, 138, 92), (134, 138, 91), (134, 138, 91), + (135, 137, 90), (135, 137, 89), (136, 137, 88), (135, 135, 86), + (134, 133, 84), (132, 132, 82), (131, 131, 81), (128, 128, 77), + (126, 126, 74), (120, 121, 68), (117, 118, 65), (115, 116, 63), + (112, 114, 60), (109, 112, 57), (108, 110, 56), (107, 109, 55), + (102, 105, 51), (99, 103, 49), (97, 101, 47), (94, 99, 45), + (92, 97, 43), (90, 96, 42), (89, 95, 42), (87, 93, 40), + (84, 91, 39), (79, 87, 36), (77, 85, 35), (75, 84, 34), + (72, 82, 33), (70, 81, 33), (69, 80, 32), (68, 79, 32), + (63, 76, 31), (61, 74, 31), (59, 73, 31), (57, 72, 31), + (55, 71, 31), (54, 70, 31), (53, 70, 31), (52, 69, 31), + (50, 68, 32), (47, 66, 33), (45, 65, 33), (44, 65, 34), + (43, 64, 34), (42, 64, 35), (41, 64, 36), (40, 64, 36), + (38, 63, 38), (37, 63, 39), (36, 63, 40), (35, 62, 41), + (34, 62, 42), (33, 62, 42), (33, 62, 43), (32, 62, 44), + (31, 62, 45), (30, 62, 46), (29, 62, 47), (29, 62, 48), + (28, 62, 48), (28, 63, 48), (28, 63, 49), (27, 63, 50), + (26, 63, 51), (26, 63, 51), (26, 64, 52), (25, 64, 52), + (25, 64, 53), (25, 65, 53), (25, 65, 54), (25, 66, 54), + (25, 66, 55), (25, 68, 56), (26, 69, 57), (28, 71, 59), + (30, 72, 60), (32, 74, 62), (35, 77, 65), (38, 80, 68), + (45, 85, 74), (48, 87, 76), (51, 90, 79), (52, 91, 80), + (54, 93, 81), (58, 95, 83), (61, 98, 86), (64, 100, 88), + (67, 103, 89), (73, 107, 93), (74, 108, 93), (76, 109, 94), + (79, 112, 96), (82, 114, 97), (84, 116, 98), (87, 118, 100), + (92, 121, 102), (94, 122, 102), (97, 124, 103), (98, 125, 103), + (99, 126, 104), (102, 127, 105), (104, 129, 105), (106, 130, 105), + (105, 129, 103), (109, 131, 103), (110, 131, 103), (111, 132, 103), + (112, 133, 103), (114, 134, 103), (116, 135, 103), (117, 136, 103), + (120, 137, 102), (121, 137, 101), (123, 138, 101), (123, 138, 100), + (124, 138, 100), (126, 138, 100), (127, 138, 99), (128, 138, 98), + (129, 138, 97), (131, 138, 95), (131, 138, 94), (131, 138, 94), + (132, 138, 93), (133, 138, 92), (134, 138, 92), (134, 138, 91), + (135, 137, 90), (135, 137, 89), (136, 137, 89), (136, 137, 88), + (137, 136, 88), (134, 133, 84), (131, 131, 81), (128, 128, 77), + (126, 126, 74), (120, 121, 68), (118, 120, 66), (117, 119, 65), + (115, 116, 63), (112, 114, 60), (109, 112, 57), (107, 109, 55), + (102, 105, 51), (100, 104, 50), (99, 103, 49), (97, 101, 47), + (94, 99, 45), (92, 97, 43), (89, 95, 42), (87, 93, 40), + (84, 91, 39), (82, 89, 37), (79, 87, 36), (77, 86, 35), + (75, 84, 34), (72, 82, 33), (70, 81, 33), (68, 79, 32), + (63, 76, 31), (62, 75, 31), (61, 75, 31), (59, 73, 31), + (57, 72, 31), (55, 71, 31), (53, 70, 31), (52, 69, 31), + (50, 68, 32), (48, 67, 32), (47, 66, 33), (45, 66, 33), + (44, 65, 34), (42, 64, 35), (41, 64, 36), (40, 64, 36), + (39, 63, 37), (38, 63, 38), (37, 63, 39), (36, 63, 40), + (35, 62, 41), (34, 62, 42), (33, 62, 43), (32, 62, 44), + (31, 62, 45), (31, 62, 46), (30, 62, 46), (29, 62, 47), + (29, 62, 48), (28, 63, 48), (28, 63, 49), (27, 63, 50), + (27, 63, 50), (26, 63, 51), (26, 64, 52), (26, 64, 52), + (25, 64, 53), (25, 65, 53), (25, 65, 54), (25, 66, 54), + (25, 66, 55), (25, 67, 55), (25, 68, 56), (25, 68, 56), + (28, 71, 59), (32, 74, 62), (35, 77, 65), (38, 80, 68), + (42, 82, 71), (45, 85, 74), (48, 88, 76), (51, 90, 79), + (54, 93, 81), (58, 95, 83), (61, 98, 86), (64, 100, 88), + (67, 103, 89), (70, 105, 91), (73, 107, 93), (76, 109, 94), + (79, 112, 96), (82, 114, 97), (84, 116, 98), (87, 118, 100), + (90, 119, 101), (92, 121, 102), (95, 123, 102), (97, 124, 103), + (99, 126, 104), (102, 127, 105), (104, 129, 105), (106, 130, 105) + ), + +// 694 040412-011 +((126, 48, 55), (118, 44, 69), (114, 43, 73), (110, 42, 78), + (106, 41, 80), (103, 40, 83), (101, 39, 84), (99, 38, 86), + (92, 38, 92), (87, 36, 89), (83, 34, 87), (77, 33, 85), + (72, 33, 83), (70, 32, 80), (69, 31, 78), (68, 30, 77), + (67, 30, 76), (63, 30, 71), (63, 30, 69), (63, 30, 67), + (63, 30, 63), (63, 30, 59), (62, 30, 57), (62, 30, 55), + (66, 29, 54), (67, 28, 56), (69, 28, 58), (71, 27, 59), + (73, 27, 60), (74, 26, 60), (75, 26, 61), (77, 26, 62), + (79, 25, 64), (83, 24, 67), (85, 23, 68), (88, 23, 70), + (90, 22, 71), (93, 21, 73), (94, 21, 73), (96, 21, 74), + (101, 19, 78), (104, 18, 80), (107, 18, 82), (110, 17, 83), + (113, 16, 85), (114, 15, 85), (116, 15, 85), (119, 14, 87), + (122, 14, 89), (129, 12, 88), (132, 11, 88), (136, 10, 88), + (139, 9, 88), (143, 8, 88), (145, 7, 86), (147, 7, 85), + (154, 5, 83), (157, 4, 81), (161, 3, 79), (165, 2, 75), + (169, 1, 71), (170, 0, 70), (172, 0, 69), (176, 2, 66), + (180, 4, 61), (187, 6, 52), (190, 8, 46), (194, 10, 41), + (195, 11, 39), (197, 12, 38), (201, 15, 29), (204, 17, 22), + (211, 33, 16), (214, 40, 14), (218, 48, 12), (220, 56, 10), + (223, 65, 9), (224, 69, 8), (226, 74, 8), (228, 81, 6), + (231, 87, 4), (234, 100, 2), (236, 107, 1), (238, 115, 0), + (238, 118, 0), (239, 122, 0), (240, 126, 0), (241, 131, 0), + (242, 144, 0), (242, 147, 0), (243, 150, 0), (243, 153, 0), + (243, 156, 0), (243, 160, 0), (243, 161, 0), (243, 162, 1), + (242, 165, 2), (241, 168, 5), (240, 169, 6), (239, 170, 8), + (238, 169, 9), (238, 168, 10), (237, 166, 12), (235, 165, 15), + (229, 163, 19), (225, 161, 19), (221, 159, 19), (219, 158, 19), + (217, 157, 20), (212, 156, 21), (208, 152, 21), (204, 149, 24), + (199, 147, 24), (190, 139, 26), (187, 137, 27), (185, 135, 29), + (180, 129, 31), (176, 125, 31), (171, 118, 33), (166, 113, 35), + (156, 98, 39), (151, 92, 40), (146, 86, 41), (144, 83, 41), + (142, 80, 42), (137, 72, 44), (133, 63, 45), (128, 58, 46), + (126, 48, 55), (118, 44, 69), (116, 43, 71), (114, 43, 73), + (110, 42, 78), (106, 41, 81), (103, 40, 83), (99, 38, 86), + (92, 38, 92), (87, 36, 89), (83, 34, 87), (80, 34, 86), + (78, 34, 85), (72, 33, 83), (69, 32, 80), (69, 31, 78), + (67, 30, 76), (63, 30, 71), (62, 29, 70), (61, 29, 69), + (63, 30, 67), (65, 30, 65), (63, 30, 59), (62, 30, 55), + (66, 29, 54), (66, 29, 56), (67, 29, 59), (69, 28, 58), + (71, 27, 58), (73, 27, 60), (75, 26, 61), (77, 26, 62), + (79, 25, 64), (83, 24, 67), (84, 24, 68), (85, 24, 69), + (88, 23, 70), (90, 22, 71), (93, 21, 73), (96, 21, 74), + (101, 19, 78), (102, 18, 79), (104, 18, 80), (107, 18, 82), + (110, 17, 83), (113, 16, 85), (116, 15, 85), (119, 14, 87), + (122, 14, 89), (126, 13, 87), (129, 12, 88), (132, 11, 88), + (136, 10, 88), (139, 9, 88), (143, 8, 88), (147, 7, 85), + (154, 5, 83), (156, 4, 82), (158, 4, 82), (161, 3, 79), + (165, 2, 75), (169, 1, 71), (172, 0, 69), (176, 2, 66), + (180, 4, 61), (183, 5, 58), (187, 6, 52), (190, 8, 49), + (194, 10, 41), (197, 12, 38), (201, 15, 29), (204, 17, 22), + (208, 23, 17), (211, 33, 16), (215, 42, 14), (218, 48, 12), + (221, 57, 10), (223, 65, 9), (226, 74, 8), (228, 81, 6), + (231, 87, 4), (233, 95, 3), (234, 100, 2), (236, 108, 1), + (238, 115, 0), (239, 122, 0), (240, 126, 0), (241, 131, 0), + (242, 137, 0), (242, 144, 0), (243, 147, 0), (243, 150, 0), + (243, 156, 0), (243, 160, 0), (243, 161, 0), (243, 162, 1), + (242, 165, 2), (242, 165, 3), (241, 168, 5), (240, 168, 7), + (239, 170, 8), (238, 168, 10), (237, 166, 12), (235, 165, 15), + (233, 164, 17), (229, 163, 19), (225, 161, 19), (221, 159, 19), + (217, 157, 20), (212, 156, 21), (208, 152, 21), (204, 149, 24), + (199, 147, 24), (195, 143, 26), (190, 139, 26), (185, 135, 29), + (180, 129, 31), (176, 125, 31), (171, 118, 33), (166, 113, 35), + (161, 106, 36), (156, 98, 39), (151, 94, 40), (146, 86, 41), + (142, 80, 42), (137, 72, 44), (133, 63, 45), (128, 58, 46) + ), + +// 695 040412-012 +((185, 134, 154), (177, 127, 143), (172, 123, 137), (168, 120, 132), + (164, 116, 126), (160, 113, 121), (158, 111, 118), (156, 110, 115), + (147, 102, 104), (143, 98, 98), (139, 95, 93), (134, 91, 87), + (130, 88, 81), (123, 83, 74), (116, 78, 67), (112, 76, 64), + (109, 74, 61), (95, 65, 49), (89, 61, 44), (83, 58, 39), + (78, 54, 35), (73, 51, 31), (70, 49, 29), (67, 48, 27), + (57, 42, 21), (52, 39, 18), (47, 37, 16), (43, 35, 15), + (40, 34, 14), (39, 33, 14), (39, 33, 15), (38, 33, 15), + (37, 32, 16), (35, 31, 17), (34, 30, 18), (33, 30, 19), + (32, 30, 19), (31, 30, 20), (30, 29, 20), (30, 29, 21), + (28, 28, 22), (27, 27, 23), (26, 27, 24), (25, 26, 24), + (24, 26, 25), (23, 26, 25), (23, 26, 26), (23, 26, 27), + (22, 26, 28), (21, 27, 30), (21, 27, 31), (21, 28, 33), + (21, 29, 34), (21, 31, 36), (21, 32, 37), (21, 33, 38), + (22, 37, 42), (22, 39, 44), (23, 41, 47), (24, 44, 49), + (26, 47, 52), (26, 48, 53), (27, 50, 55), (28, 53, 57), + (29, 57, 60), (31, 63, 65), (32, 66, 67), (33, 69, 70), + (34, 70, 71), (35, 72, 73), (36, 75, 76), (37, 78, 78), + (39, 84, 84), (40, 87, 86), (41, 91, 89), (42, 94, 91), + (44, 97, 94), (44, 98, 95), (45, 100, 97), (46, 103, 100), + (48, 106, 102), (52, 111, 108), (55, 113, 111), (58, 116, 114), + (59, 117, 115), (61, 119, 116), (65, 121, 119), (69, 123, 122), + (77, 127, 128), (82, 129, 131), (87, 131, 134), (89, 132, 135), + (92, 133, 137), (97, 135, 141), (103, 136, 144), (108, 138, 147), + (114, 139, 150), (125, 143, 156), (130, 144, 159), (136, 146, 162), + (139, 147, 164), (142, 148, 166), (148, 149, 169), (153, 151, 172), + (164, 154, 178), (170, 155, 181), (176, 157, 184), (178, 158, 185), + (181, 159, 187), (187, 161, 191), (192, 162, 193), (197, 163, 196), + (201, 164, 198), (207, 165, 200), (208, 165, 200), (210, 165, 200), + (211, 164, 199), (212, 163, 198), (212, 162, 197), (212, 161, 195), + (210, 157, 189), (207, 154, 185), (205, 152, 181), (203, 150, 178), + (202, 149, 176), (198, 145, 171), (194, 142, 165), (189, 138, 160), + (185, 134, 154), (177, 127, 143), (174, 125, 140), (172, 124, 137), + (168, 120, 132), (164, 117, 126), (160, 113, 121), (156, 110, 115), + (147, 102, 104), (143, 98, 98), (139, 95, 93), (136, 93, 90), + (134, 92, 87), (130, 88, 81), (123, 83, 74), (116, 78, 67), + (109, 74, 61), (95, 65, 49), (92, 63, 46), (89, 61, 44), + (83, 58, 39), (79, 55, 35), (73, 51, 31), (67, 48, 27), + (57, 42, 21), (54, 41, 19), (52, 40, 18), (47, 37, 16), + (42, 35, 14), (40, 34, 14), (39, 33, 15), (38, 33, 15), + (37, 32, 16), (35, 31, 17), (34, 31, 17), (34, 31, 18), + (33, 30, 19), (32, 30, 20), (31, 30, 20), (30, 29, 21), + (28, 28, 22), (27, 28, 22), (27, 28, 23), (26, 27, 24), + (25, 27, 24), (24, 26, 25), (23, 26, 26), (23, 26, 27), + (22, 26, 28), (21, 26, 29), (21, 27, 30), (21, 27, 31), + (21, 28, 33), (21, 30, 35), (21, 31, 36), (21, 33, 38), + (22, 37, 42), (22, 38, 43), (23, 39, 44), (23, 41, 47), + (24, 44, 49), (26, 47, 52), (27, 50, 55), (28, 53, 57), + (29, 57, 60), (30, 60, 62), (31, 63, 65), (32, 66, 68), + (33, 69, 70), (35, 72, 73), (36, 75, 76), (37, 78, 78), + (38, 81, 81), (39, 84, 84), (40, 87, 86), (41, 91, 89), + (42, 94, 92), (44, 97, 94), (45, 100, 97), (46, 103, 100), + (48, 106, 102), (50, 108, 105), (52, 111, 108), (55, 114, 111), + (58, 116, 114), (61, 119, 116), (65, 121, 119), (69, 123, 122), + (73, 125, 125), (77, 127, 128), (82, 129, 131), (87, 131, 134), + (92, 133, 137), (97, 135, 141), (103, 136, 144), (108, 138, 147), + (114, 139, 150), (120, 141, 153), (125, 143, 156), (131, 144, 159), + (136, 146, 162), (142, 148, 166), (148, 149, 169), (153, 151, 172), + (159, 152, 175), (164, 154, 178), (170, 156, 181), (176, 157, 184), + (181, 159, 187), (187, 161, 191), (192, 162, 193), (197, 163, 196), + (201, 164, 198), (205, 165, 199), (207, 165, 200), (210, 165, 200), + (211, 164, 199), (212, 163, 198), (212, 162, 197), (212, 161, 195), + (212, 159, 192), (210, 157, 189), (208, 154, 185), (205, 152, 181), + (202, 149, 176), (198, 145, 171), (194, 142, 165), (189, 138, 160) + ), + +// 696 040412-013 +((64, 11, 92), (58, 10, 86), (55, 9, 82), (52, 9, 79), + (49, 8, 76), (46, 8, 73), (45, 8, 72), (44, 9, 71), + (39, 9, 65), (37, 9, 62), (35, 10, 60), (33, 10, 58), + (31, 11, 56), (28, 12, 54), (26, 13, 52), (25, 13, 51), + (25, 14, 50), (29, 14, 56), (30, 14, 59), (32, 14, 62), + (34, 13, 65), (37, 13, 69), (38, 13, 70), (39, 14, 72), + (42, 14, 78), (44, 14, 81), (46, 14, 84), (47, 14, 87), + (49, 15, 90), (50, 14, 91), (52, 14, 93), (54, 14, 97), + (55, 15, 100), (59, 14, 106), (60, 14, 109), (62, 15, 112), + (64, 15, 115), (67, 15, 118), (68, 15, 119), (69, 15, 121), + (72, 17, 126), (74, 17, 128), (76, 18, 131), (77, 19, 133), + (78, 20, 135), (79, 20, 136), (80, 20, 138), (82, 22, 140), + (84, 22, 142), (87, 24, 146), (88, 26, 147), (90, 28, 149), + (92, 29, 150), (94, 31, 152), (94, 32, 153), (94, 33, 154), + (98, 36, 157), (99, 38, 158), (101, 40, 159), (102, 42, 160), + (103, 44, 161), (103, 45, 161), (104, 46, 162), (106, 48, 163), + (107, 51, 164), (110, 55, 165), (111, 58, 166), (112, 61, 167), + (113, 62, 167), (114, 63, 167), (115, 66, 167), (115, 69, 168), + (118, 74, 169), (119, 76, 169), (121, 79, 170), (122, 81, 170), + (123, 84, 171), (123, 85, 171), (124, 87, 171), (124, 90, 172), + (126, 93, 172), (128, 98, 173), (128, 101, 173), (128, 104, 174), + (128, 105, 174), (129, 106, 175), (130, 108, 175), (132, 111, 175), + (132, 115, 176), (132, 117, 176), (132, 119, 176), (132, 119, 176), + (133, 120, 176), (129, 122, 176), (131, 123, 176), (131, 123, 175), + (133, 124, 175), (131, 126, 174), (136, 125, 173), (141, 125, 172), + (142, 125, 171), (143, 125, 171), (142, 125, 170), (146, 124, 169), + (156, 122, 167), (158, 121, 166), (160, 120, 165), (161, 119, 164), + (163, 119, 163), (162, 117, 162), (162, 114, 154), (161, 113, 154), + (160, 110, 150), (157, 104, 145), (156, 103, 143), (156, 102, 142), + (155, 99, 140), (153, 95, 139), (152, 91, 134), (150, 88, 133), + (146, 81, 128), (144, 76, 125), (143, 72, 123), (142, 70, 122), + (141, 69, 122), (140, 65, 118), (138, 61, 116), (136, 58, 115), + (135, 53, 111), (131, 46, 108), (130, 44, 106), (130, 42, 105), + (128, 38, 103), (126, 35, 100), (125, 30, 98), (123, 27, 96), + (119, 19, 92), (117, 15, 89), (116, 12, 87), (115, 10, 86), + (115, 9, 85), (114, 6, 84), (113, 4, 82), (112, 2, 80), + (111, 0, 79), (109, 0, 77), (109, 0, 76), (109, 0, 76), + (108, 0, 77), (108, 0, 76), (108, 0, 75), (108, 0, 75), + (108, 0, 74), (108, 0, 74), (108, 0, 74), (108, 0, 74), + (108, 0, 74), (109, 0, 74), (109, 0, 74), (110, 0, 74), + (111, 0, 74), (112, 0, 74), (112, 1, 74), (113, 2, 74), + (115, 3, 76), (116, 6, 77), (117, 9, 77), (119, 11, 79), + (122, 19, 83), (123, 20, 83), (124, 22, 84), (126, 26, 86), + (128, 29, 87), (130, 34, 88), (132, 38, 90), (133, 41, 92), + (135, 45, 93), (137, 49, 94), (139, 52, 96), (141, 57, 96), + (143, 60, 98), (145, 64, 99), (147, 67, 100), (148, 71, 101), + (152, 79, 102), (153, 81, 102), (154, 83, 102), (156, 87, 102), + (158, 90, 102), (159, 94, 103), (161, 97, 102), (163, 100, 102), + (164, 103, 103), (165, 109, 104), (167, 113, 105), (168, 115, 107), + (169, 121, 108), (170, 123, 110), (171, 126, 110), (171, 128, 111), + (172, 128, 112), (173, 132, 113), (173, 131, 114), (173, 132, 115), + (174, 130, 116), (174, 132, 117), (174, 130, 118), (174, 128, 119), + (174, 127, 120), (174, 123, 120), (173, 120, 123), (173, 119, 129), + (172, 118, 132), (172, 116, 135), (171, 115, 140), (170, 114, 143), + (169, 111, 147), (168, 109, 149), (167, 106, 152), (166, 103, 154), + (165, 101, 156), (163, 98, 159), (162, 94, 160), (159, 91, 161), + (157, 88, 161), (154, 84, 161), (153, 82, 160), (151, 78, 160), + (148, 75, 160), (147, 72, 160), (144, 68, 160), (143, 65, 160), + (140, 62, 160), (139, 58, 160), (138, 55, 159), (135, 51, 159), + (134, 48, 159), (132, 45, 159), (131, 41, 159), (128, 38, 159), + (123, 35, 154), (118, 33, 149), (115, 31, 144), (110, 29, 139), + (105, 27, 135), (101, 25, 130), (97, 23, 126), (92, 22, 121), + (88, 20, 117), (84, 19, 113), (80, 18, 109), (78, 16, 105), + (74, 15, 101), (69, 14, 98), (67, 14, 94), (64, 13, 91) + ), + +// 697 040412-014 +((50, 131, 83), (52, 132, 87), (52, 133, 87), (52, 134, 87), + (52, 134, 87), (53, 134, 88), (54, 134, 88), (55, 134, 88), + (56, 132, 89), (56, 131, 89), (57, 131, 89), (57, 129, 88), + (57, 128, 88), (57, 127, 86), (57, 126, 84), (57, 124, 84), + (57, 123, 84), (56, 119, 80), (56, 117, 78), (57, 115, 76), + (57, 113, 75), (57, 111, 75), (57, 110, 73), (57, 110, 72), + (57, 106, 70), (56, 104, 68), (55, 102, 67), (55, 100, 65), + (56, 98, 63), (55, 97, 62), (55, 97, 61), (56, 94, 58), + (55, 93, 57), (54, 89, 54), (54, 87, 53), (55, 85, 53), + (56, 82, 51), (58, 79, 50), (57, 78, 49), (57, 78, 49), + (55, 73, 47), (54, 71, 45), (54, 69, 44), (54, 67, 42), + (55, 65, 40), (54, 63, 40), (53, 62, 40), (51, 60, 38), + (49, 58, 37), (46, 53, 35), (44, 50, 33), (43, 48, 32), + (41, 46, 30), (39, 44, 28), (38, 42, 27), (38, 41, 27), + (36, 36, 24), (34, 32, 23), (32, 29, 22), (30, 27, 20), + (28, 25, 19), (26, 22, 19), (25, 20, 20), (25, 20, 20), + (25, 20, 20), (25, 20, 20), (25, 20, 20), (25, 20, 20), + (25, 20, 20), (25, 20, 20), (25, 20, 20), (25, 20, 20), + (25, 20, 20), (25, 20, 20), (25, 20, 20), (25, 20, 20), + (25, 20, 20), (25, 20, 20), (25, 20, 20), (19, 19, 27), + (19, 19, 31), (20, 17, 41), (22, 18, 47), (24, 19, 53), + (25, 20, 56), (27, 21, 60), (31, 25, 66), (36, 28, 74), + (42, 37, 90), (46, 41, 98), (51, 45, 106), (52, 46, 110), + (54, 48, 114), (57, 54, 122), (62, 57, 130), (65, 60, 139), + (68, 65, 147), (76, 73, 163), (79, 77, 170), (83, 81, 178), + (85, 82, 182), (88, 84, 186), (91, 89, 194), (93, 93, 202), + (97, 97, 207), (96, 96, 201), (95, 95, 196), (94, 95, 192), + (94, 96, 188), (93, 94, 180), (93, 95, 172), (92, 93, 164), + (89, 95, 155), (89, 95, 141), (89, 95, 138), (89, 96, 136), + (89, 99, 130), (88, 97, 124), (86, 105, 114), (96, 108, 83), + (96, 102, 63), (92, 98, 53), (89, 95, 44), (87, 93, 39), + (85, 91, 34), (85, 89, 27), (84, 90, 22), (88, 93, 22), + (89, 95, 26), (96, 102, 30), (98, 103, 32), (101, 104, 34), + (103, 107, 37), (107, 110, 40), (110, 114, 43), (114, 116, 47), + (121, 123, 51), (124, 125, 54), (128, 128, 57), (130, 130, 59), + (132, 132, 61), (135, 135, 64), (139, 136, 66), (141, 139, 70), + (145, 143, 71), (151, 146, 77), (152, 148, 78), (153, 150, 79), + (155, 152, 82), (157, 154, 85), (159, 156, 86), (160, 158, 88), + (163, 160, 93), (163, 161, 94), (164, 162, 95), (165, 161, 97), + (165, 163, 99), (167, 161, 99), (167, 163, 100), (167, 163, 102), + (167, 163, 103), (165, 163, 106), (165, 163, 107), (165, 163, 108), + (164, 162, 108), (163, 163, 109), (161, 161, 109), (159, 161, 110), + (157, 160, 113), (155, 159, 113), (153, 159, 113), (150, 159, 114), + (151, 157, 114), (145, 156, 115), (145, 156, 115), (141, 155, 118), + (136, 155, 118), (126, 153, 119), (119, 153, 119), (119, 152, 127), + (118, 151, 135), (116, 151, 139), (116, 149, 149), (115, 143, 149), + (111, 144, 148), (110, 140, 148), (109, 137, 148), (107, 137, 147), + (106, 138, 145), (104, 132, 144), (101, 135, 141), (100, 131, 140), + (97, 131, 139), (96, 133, 136), (93, 129, 134), (91, 131, 131), + (90, 128, 128), (87, 127, 124), (84, 124, 122), (80, 123, 114), + (79, 120, 109), (75, 118, 105), (73, 116, 99), (71, 114, 94), + (68, 111, 91), (65, 108, 89), (61, 107, 83), (59, 104, 79), + (57, 102, 73), (54, 101, 70), (51, 98, 66), (48, 95, 62), + (46, 94, 57), (42, 91, 56), (40, 89, 52), (37, 86, 48), + (33, 85, 44), (32, 83, 41), (30, 81, 39), (29, 79, 36), + (26, 79, 35), (25, 78, 32), (23, 77, 31), (22, 77, 29), + (21, 77, 29), (21, 77, 28), (20, 77, 28), (20, 77, 28), + (20, 77, 28), (20, 78, 28), (20, 79, 28), (20, 79, 29), + (20, 81, 31), (21, 83, 32), (21, 85, 35), (23, 86, 35), + (24, 89, 39), (26, 91, 40), (27, 94, 43), (28, 95, 47), + (30, 98, 47), (30, 101, 50), (32, 102, 52), (34, 104, 55), + (35, 107, 56), (36, 108, 60), (39, 111, 63), (39, 114, 64), + (40, 115, 67), (42, 118, 68), (43, 120, 71), (44, 123, 74), + (45, 124, 77), (47, 127, 78), (48, 128, 80), (49, 130, 82) + ), + +// 698 040412-015 +((130, 49, 119), (131, 50, 117), (131, 51, 117), (132, 53, 117), + (133, 53, 119), (134, 53, 122), (134, 53, 121), (134, 53, 120), + (134, 55, 122), (133, 56, 121), (132, 57, 121), (131, 57, 120), + (130, 57, 119), (128, 57, 117), (127, 57, 115), (126, 57, 116), + (126, 57, 118), (122, 58, 114), (120, 57, 113), (118, 56, 113), + (116, 56, 111), (114, 56, 110), (112, 56, 108), (111, 57, 107), + (108, 56, 107), (105, 56, 105), (102, 57, 104), (100, 56, 102), + (99, 56, 101), (96, 56, 99), (94, 56, 98), (92, 55, 97), + (86, 56, 94), (81, 56, 90), (78, 54, 88), (75, 53, 86), + (72, 52, 84), (70, 52, 82), (66, 51, 80), (63, 50, 79), + (58, 47, 75), (54, 45, 73), (51, 44, 71), (49, 43, 68), + (48, 43, 66), (45, 41, 65), (43, 40, 65), (43, 40, 62), + (41, 38, 60), (35, 35, 56), (33, 34, 53), (32, 33, 50), + (30, 31, 47), (29, 30, 45), (28, 29, 44), (28, 28, 44), + (25, 28, 38), (23, 29, 36), (22, 30, 35), (20, 25, 32), + (19, 21, 29), (19, 22, 28), (19, 24, 28), (20, 25, 23), + (20, 25, 23), (20, 25, 23), (20, 25, 23), (20, 25, 23), + (20, 25, 23), (20, 25, 23), (20, 25, 23), (20, 25, 23), + (20, 25, 23), (20, 25, 23), (20, 25, 23), (20, 25, 23), + (20, 25, 23), (20, 25, 23), (20, 25, 23), (20, 25, 23), + (27, 24, 19), (36, 31, 18), (41, 37, 17), (46, 44, 16), + (49, 46, 17), (53, 49, 19), (60, 55, 21), (66, 61, 25), + (82, 74, 33), (90, 81, 37), (98, 88, 41), (102, 92, 43), + (106, 96, 45), (114, 102, 48), (122, 107, 54), (130, 115, 57), + (139, 123, 60), (155, 136, 68), (162, 141, 73), (170, 147, 78), + (174, 150, 79), (178, 154, 81), (186, 162, 84), (194, 168, 89), + (207, 178, 96), (205, 176, 96), (203, 175, 96), (199, 172, 95), + (196, 169, 95), (188, 161, 94), (180, 155, 93), (172, 148, 93), + (164, 144, 92), (147, 125, 88), (144, 123, 88), (141, 121, 89), + (136, 116, 89), (130, 109, 89), (124, 105, 88), (114, 87, 86), + (76, 74, 106), (65, 67, 102), (54, 60, 98), (49, 55, 96), + (44, 51, 95), (34, 43, 91), (27, 39, 89), (22, 34, 90), + (22, 36, 93), (29, 44, 98), (29, 43, 100), (30, 43, 102), + (34, 49, 104), (37, 52, 107), (40, 55, 110), (43, 58, 114), + (48, 67, 119), (51, 70, 122), (55, 74, 126), (56, 75, 127), + (57, 76, 128), (61, 80, 132), (64, 83, 135), (66, 88, 139), + (70, 91, 141), (75, 97, 148), (76, 99, 149), (77, 102, 151), + (79, 101, 153), (82, 104, 155), (85, 107, 157), (86, 108, 159), + (91, 112, 161), (92, 113, 162), (93, 115, 163), (95, 116, 164), + (97, 120, 165), (99, 119, 165), (99, 123, 167), (100, 122, 167), + (102, 124, 167), (104, 125, 167), (105, 124, 166), (106, 124, 165), + (108, 125, 165), (108, 125, 164), (109, 123, 163), (109, 123, 161), + (111, 122, 160), (112, 122, 160), (113, 122, 160), (113, 119, 159), + (114, 117, 159), (114, 120, 157), (115, 115, 156), (115, 115, 156), + (122, 118, 155), (127, 118, 155), (137, 119, 153), (144, 119, 153), + (152, 119, 152), (151, 118, 143), (151, 116, 138), (149, 116, 125), + (149, 112, 114), (148, 111, 115), (148, 111, 117), (148, 110, 109), + (147, 107, 108), (145, 106, 109), (144, 105, 104), (141, 101, 106), + (140, 100, 101), (139, 97, 100), (136, 96, 104), (134, 93, 99), + (131, 91, 102), (128, 90, 100), (127, 87, 100), (124, 84, 97), + (123, 80, 101), (120, 79, 101), (118, 75, 99), (116, 73, 102), + (114, 71, 102), (111, 68, 99), (108, 65, 96), (107, 61, 97), + (104, 59, 96), (102, 57, 98), (101, 54, 98), (98, 51, 96), + (95, 48, 93), (92, 46, 94), (91, 42, 90), (88, 40, 89), + (83, 37, 86), (82, 33, 85), (79, 32, 83), (77, 30, 81), + (72, 29, 79), (73, 26, 79), (71, 25, 78), (70, 23, 77), + (69, 22, 77), (70, 21, 77), (69, 21, 77), (69, 20, 77), + (69, 20, 77), (69, 20, 77), (70, 20, 78), (71, 20, 79), + (72, 20, 79), (76, 20, 81), (78, 21, 83), (82, 21, 85), + (81, 23, 86), (87, 24, 89), (88, 26, 91), (92, 27, 94), + (95, 28, 94), (97, 30, 98), (101, 30, 100), (102, 32, 101), + (104, 34, 102), (107, 35, 105), (108, 36, 103), (111, 39, 106), + (114, 39, 109), (115, 40, 107), (118, 42, 112), (120, 43, 112), + (123, 44, 114), (124, 45, 113), (127, 47, 118), (128, 48, 117) + ), + +// 699 040412-016 +((81, 115, 124), (85, 126, 131), (86, 132, 134), (87, 138, 138), + (86, 141, 138), (85, 144, 139), (84, 145, 139), (84, 147, 140), + (81, 152, 140), (79, 153, 140), (78, 155, 140), (76, 155, 138), + (75, 156, 137), (73, 156, 136), (72, 157, 136), (71, 156, 135), + (70, 156, 135), (66, 154, 131), (64, 152, 127), (62, 151, 124), + (60, 148, 122), (58, 146, 120), (57, 145, 119), (56, 144, 118), + (51, 137, 111), (48, 133, 107), (46, 129, 104), (43, 124, 99), + (41, 119, 94), (39, 116, 91), (38, 113, 89), (35, 108, 85), + (33, 102, 81), (28, 91, 72), (26, 86, 68), (25, 81, 65), + (24, 76, 62), (24, 72, 59), (23, 70, 58), (23, 68, 57), + (23, 60, 53), (23, 56, 51), (24, 53, 50), (24, 48, 48), + (24, 43, 46), (23, 40, 44), (23, 38, 43), (22, 32, 40), + (21, 26, 37), (22, 20, 35), (26, 19, 38), (31, 19, 41), + (37, 19, 44), (43, 20, 48), (45, 20, 50), (48, 20, 52), + (60, 22, 58), (63, 21, 60), (67, 20, 62), (70, 19, 63), + (73, 19, 65), (74, 19, 65), (75, 19, 65), (78, 18, 67), + (80, 18, 67), (83, 18, 69), (84, 18, 69), (85, 19, 69), + (85, 19, 68), (85, 19, 67), (86, 19, 68), (86, 20, 67), + (86, 21, 65), (85, 22, 64), (85, 23, 64), (83, 24, 62), + (82, 26, 61), (81, 26, 59), (80, 27, 58), (79, 29, 58), + (76, 30, 54), (72, 33, 50), (71, 34, 48), (70, 35, 46), + (69, 35, 45), (69, 36, 44), (70, 36, 44), (70, 39, 42), + (75, 50, 44), (79, 56, 46), (84, 62, 49), (86, 64, 50), + (88, 67, 51), (92, 72, 54), (97, 79, 57), (101, 83, 59), + (105, 88, 62), (114, 97, 67), (117, 98, 68), (120, 99, 69), + (122, 101, 70), (125, 103, 72), (129, 105, 74), (133, 107, 76), + (142, 110, 80), (146, 112, 82), (151, 115, 85), (153, 115, 86), + (155, 116, 87), (159, 119, 90), (163, 121, 93), (167, 125, 97), + (169, 123, 97), (172, 120, 100), (172, 119, 100), (173, 119, 101), + (174, 118, 102), (175, 117, 104), (175, 117, 105), (176, 116, 107), + (177, 119, 111), (177, 119, 113), (177, 119, 115), (176, 119, 116), + (176, 119, 117), (177, 121, 120), (177, 123, 122), (177, 125, 125), + (177, 127, 127), (176, 133, 134), (175, 134, 135), (174, 136, 137), + (173, 139, 141), (171, 142, 143), (169, 146, 147), (167, 149, 151), + (161, 156, 156), (158, 159, 158), (155, 162, 160), (153, 163, 161), + (152, 165, 163), (148, 166, 163), (145, 168, 165), (142, 169, 165), + (138, 169, 164), (131, 168, 163), (129, 167, 161), (127, 167, 160), + (124, 166, 160), (120, 164, 158), (116, 162, 154), (112, 159, 150), + (104, 153, 144), (102, 151, 142), (100, 149, 140), (96, 145, 136), + (92, 140, 130), (88, 135, 126), (84, 129, 119), (80, 123, 114), + (75, 116, 106), (66, 102, 92), (64, 98, 88), (62, 95, 85), + (58, 88, 78), (55, 82, 72), (51, 77, 65), (48, 72, 60), + (43, 64, 50), (42, 62, 48), (41, 61, 47), (39, 58, 43), + (37, 56, 39), (36, 55, 37), (35, 54, 35), (35, 55, 34), + (34, 55, 33), (34, 56, 32), (35, 58, 32), (36, 60, 32), + (37, 62, 33), (37, 65, 33), (38, 68, 34), (40, 72, 35), + (42, 80, 39), (43, 82, 40), (44, 85, 41), (45, 90, 43), + (47, 95, 45), (48, 99, 47), (50, 103, 49), (51, 106, 51), + (52, 109, 53), (53, 112, 53), (54, 114, 55), (55, 115, 57), + (55, 116, 57), (55, 117, 57), (55, 117, 57), (55, 117, 57), + (55, 117, 58), (55, 117, 58), (54, 116, 58), (53, 114, 56), + (52, 112, 55), (51, 110, 55), (50, 107, 54), (48, 103, 50), + (47, 99, 49), (44, 95, 47), (42, 90, 45), (40, 84, 42), + (37, 79, 40), (35, 73, 37), (33, 68, 35), (31, 63, 33), + (29, 59, 32), (28, 55, 30), (27, 52, 30), (26, 48, 28), + (26, 46, 29), (25, 43, 27), (26, 42, 30), (26, 40, 30), + (26, 39, 30), (27, 38, 32), (28, 37, 33), (29, 37, 35), + (30, 36, 37), (30, 35, 38), (30, 34, 39), (30, 33, 40), + (31, 34, 42), (32, 34, 44), (34, 35, 46), (36, 37, 49), + (38, 39, 53), (40, 41, 56), (43, 44, 60), (45, 47, 64), + (48, 51, 68), (50, 53, 71), (52, 56, 75), (55, 60, 79), + (57, 63, 82), (59, 67, 86), (61, 70, 89), (63, 74, 93), + (66, 79, 96), (68, 83, 100), (70, 87, 103), (72, 92, 107), + (74, 95, 110), (76, 101, 114), (78, 106, 117), (80, 111, 121) + ), + +// 700 040412-017 +((0, 68, 38), (0, 57, 27), (0, 53, 23), (0, 50, 20), + (0, 48, 19), (0, 46, 18), (0, 45, 18), (0, 45, 18), + (1, 44, 21), (1, 44, 23), (1, 45, 25), (2, 46, 28), + (3, 48, 31), (3, 49, 34), (4, 51, 37), (4, 51, 39), + (4, 52, 41), (6, 55, 47), (6, 56, 49), (7, 58, 52), + (8, 58, 53), (9, 59, 55), (9, 59, 55), (10, 59, 56), + (11, 58, 55), (11, 57, 53), (11, 57, 52), (11, 55, 50), + (12, 54, 48), (12, 53, 46), (12, 52, 45), (12, 51, 42), + (12, 49, 39), (12, 46, 32), (12, 45, 28), (13, 44, 25), + (14, 43, 23), (16, 43, 21), (17, 43, 20), (18, 43, 19), + (24, 45, 16), (28, 48, 15), (33, 51, 15), (39, 55, 16), + (45, 59, 17), (48, 62, 18), (52, 65, 19), (60, 71, 22), + (68, 78, 25), (87, 93, 33), (97, 101, 37), (107, 110, 42), + (117, 118, 47), (128, 127, 52), (133, 131, 54), (138, 136, 57), + (156, 153, 66), (163, 160, 70), (171, 167, 74), (176, 172, 77), + (182, 178, 80), (183, 179, 81), (185, 181, 82), (186, 183, 84), + (186, 184, 85), (179, 182, 85), (172, 179, 83), (166, 176, 82), + (162, 173, 80), (158, 171, 79), (148, 166, 76), (138, 160, 73), + (119, 149, 67), (108, 142, 65), (97, 136, 63), (86, 129, 61), + (75, 123, 59), (69, 120, 58), (64, 117, 58), (54, 112, 57), + (44, 107, 56), (28, 101, 57), (23, 100, 59), (18, 100, 62), + (16, 100, 64), (14, 100, 66), (11, 102, 71), (9, 104, 76), + (5, 110, 87), (3, 113, 93), (1, 117, 99), (0, 119, 102), + (0, 122, 106), (0, 128, 113), (0, 134, 121), (0, 142, 129), + (0, 149, 137), (2, 162, 153), (3, 168, 160), (4, 175, 168), + (4, 178, 171), (5, 181, 174), (6, 186, 180), (7, 191, 185), + (9, 199, 194), (10, 201, 196), (11, 204, 198), (11, 204, 198), + (12, 204, 199), (12, 204, 198), (13, 202, 196), (13, 199, 192), + (14, 195, 187), (13, 184, 173), (12, 180, 168), (12, 177, 164), + (11, 169, 155), (11, 161, 145), (10, 152, 134), (9, 143, 124), + (6, 124, 102), (5, 115, 91), (4, 106, 81), (3, 101, 76), + (3, 97, 71), (2, 89, 61), (2, 81, 53), (1, 74, 45), + (0, 68, 38), (0, 57, 27), (0, 55, 25), (0, 53, 23), + (0, 50, 20), (0, 47, 19), (0, 46, 18), (0, 45, 18), + (1, 44, 21), (1, 44, 23), (1, 45, 25), (1, 45, 26), + (2, 46, 28), (3, 48, 31), (3, 49, 34), (4, 51, 37), + (4, 52, 41), (6, 55, 47), (6, 56, 48), (7, 57, 50), + (7, 58, 52), (8, 58, 54), (9, 59, 55), (10, 59, 56), + (11, 58, 55), (11, 58, 54), (11, 58, 54), (11, 57, 52), + (12, 55, 50), (12, 54, 48), (12, 52, 45), (12, 51, 42), + (12, 49, 39), (12, 46, 32), (12, 45, 30), (12, 45, 29), + (13, 44, 25), (14, 43, 23), (16, 43, 21), (18, 43, 19), + (24, 45, 16), (26, 46, 15), (28, 48, 15), (33, 51, 15), + (38, 55, 16), (45, 59, 17), (52, 65, 19), (60, 71, 22), + (68, 78, 25), (78, 85, 29), (87, 93, 33), (97, 101, 38), + (107, 110, 42), (118, 118, 47), (128, 127, 52), (138, 136, 57), + (156, 153, 66), (160, 156, 68), (164, 160, 70), (171, 167, 74), + (177, 173, 77), (182, 178, 80), (185, 181, 82), (186, 183, 84), + (186, 184, 85), (183, 183, 85), (179, 182, 85), (174, 179, 84), + (166, 176, 82), (158, 171, 79), (148, 166, 76), (138, 160, 73), + (128, 155, 70), (119, 149, 67), (108, 142, 65), (97, 136, 63), + (86, 129, 61), (75, 123, 59), (64, 117, 58), (54, 112, 57), + (44, 107, 56), (35, 103, 56), (28, 101, 57), (23, 100, 59), + (18, 100, 62), (14, 100, 66), (11, 102, 71), (9, 104, 76), + (7, 106, 82), (5, 110, 87), (3, 113, 93), (1, 117, 99), + (0, 122, 106), (0, 128, 113), (0, 134, 121), (0, 142, 129), + (0, 149, 137), (1, 156, 145), (2, 162, 153), (3, 169, 161), + (4, 175, 168), (5, 181, 174), (6, 186, 180), (7, 191, 185), + (8, 196, 190), (9, 199, 194), (10, 202, 197), (11, 204, 198), + (12, 204, 199), (12, 204, 198), (13, 202, 196), (13, 199, 192), + (14, 195, 187), (13, 189, 180), (13, 184, 173), (12, 177, 164), + (11, 169, 155), (11, 161, 145), (10, 152, 134), (9, 143, 124), + (7, 134, 113), (6, 124, 102), (5, 115, 91), (4, 106, 81), + (3, 97, 71), (2, 89, 61), (2, 81, 53), (1, 74, 45) + ), + + // 701 Spectrum // AV: why did nobody add this before?! + ((255, 0, 0), (255, 4, 0), (255, 8, 0), (255, 16, 0), +(255, 20, 0), (255, 28, 0), (255, 32, 0), (255, 40, 0), +(255, 45, 0), (255, 53, 0), (255, 57, 0), (255, 65, 0), +(255, 69, 0), (255, 77, 0), (255, 81, 0), (255, 89, 0), +(255, 93, 0), (255, 101, 0), (255, 105, 0), (255, 113, 0), +(255, 117, 0), (255, 125, 0), (255, 130, 0), (255, 134, 0), +(255, 142, 0), (255, 146, 0), (255, 154, 0), (255, 158, 0), +(255, 166, 0), (255, 170, 0), (255, 178, 0), (255, 182, 0), +(255, 190, 0), (255, 194, 0), (255, 202, 0), (255, 206, 0), +(255, 215, 0), (255, 219, 0), (255, 227, 0), (255, 231, 0), +(255, 239, 0), (255, 243, 0), (255, 251, 0), (251, 255, 0), +(247, 255, 0), (239, 255, 0), (235, 255, 0), (227, 255, 0), +(223, 255, 0), (215, 255, 0), (210, 255, 0), (202, 255, 0), +(198, 255, 0), (190, 255, 0), (186, 255, 0), (178, 255, 0), +(174, 255, 0), (166, 255, 0), (162, 255, 0), (154, 255, 0), +(150, 255, 0), (142, 255, 0), (138, 255, 0), (130, 255, 0), +(125, 255, 0), (121, 255, 0), (113, 255, 0), (109, 255, 0), +(101, 255, 0), (97, 255, 0), (89, 255, 0), (85, 255, 0), +(77, 255, 0), (73, 255, 0), (65, 255, 0), (61, 255, 0), +(53, 255, 0), (49, 255, 0), (40, 255, 0), (36, 255, 0), +(28, 255, 0), (24, 255, 0), (16, 255, 0), (12, 255, 0), +(4, 255, 0), (0, 255, 0), (0, 255, 0), (0, 255, 8), +(0, 255, 12), (0, 255, 20), (0, 255, 24), (0, 255, 32), +(0, 255, 36), (0, 255, 45), (0, 255, 49), (0, 255, 57), +(0, 255, 61), (0, 255, 69), (0, 255, 73), (0, 255, 81), +(0, 255, 85), (0, 255, 93), (0, 255, 97), (0, 255, 105), +(0, 255, 109), (0, 255, 117), (0, 255, 121), (0, 255, 125), +(0, 255, 134), (0, 255, 138), (0, 255, 146), (0, 255, 150), +(0, 255, 158), (0, 255, 162), (0, 255, 170), (0, 255, 174), +(0, 255, 182), (0, 255, 186), (0, 255, 194), (0, 255, 198), +(0, 255, 206), (0, 255, 210), (0, 255, 219), (0, 255, 223), +(0, 255, 231), (0, 255, 235), (0, 255, 243), (0, 255, 247), +(0, 255, 255), (0, 247, 255), (0, 243, 255), (0, 235, 255), +(0, 231, 255), (0, 223, 255), (0, 219, 255), (0, 210, 255), +(0, 206, 255), (0, 198, 255), (0, 194, 255), (0, 186, 255), +(0, 182, 255), (0, 174, 255), (0, 170, 255), (0, 162, 255), +(0, 158, 255), (0, 150, 255), (0, 146, 255), (0, 138, 255), +(0, 134, 255), (0, 125, 255), (0, 121, 255), (0, 117, 255), +(0, 109, 255), (0, 105, 255), (0, 97, 255), (0, 93, 255), +(0, 85, 255), (0, 81, 255), (0, 73, 255), (0, 69, 255), +(0, 61, 255), (0, 57, 255), (0, 49, 255), (0, 45, 255), +(0, 36, 255), (0, 32, 255), (0, 24, 255), (0, 20, 255), +(0, 12, 255), (0, 8, 255), (0, 0, 255), (0, 0, 255), +(4, 0, 255), (12, 0, 255), (16, 0, 255), (24, 0, 255), +(28, 0, 255), (36, 0, 255), (40, 0, 255), (49, 0, 255), +(53, 0, 255), (61, 0, 255), (65, 0, 255), (73, 0, 255), +(77, 0, 255), (85, 0, 255), (89, 0, 255), (97, 0, 255), +(101, 0, 255), (109, 0, 255), (113, 0, 255), (121, 0, 255), +(125, 0, 255), (130, 0, 255), (138, 0, 255), (142, 0, 255), +(150, 0, 255), (154, 0, 255), (162, 0, 255), (166, 0, 255), +(174, 0, 255), (178, 0, 255), (186, 0, 255), (190, 0, 255), +(198, 0, 255), (202, 0, 255), (210, 0, 255), (215, 0, 255), +(223, 0, 255), (227, 0, 255), (235, 0, 255), (239, 0, 255), +(247, 0, 255), (251, 0, 255), (255, 0, 251), (255, 0, 243), +(255, 0, 239), (255, 0, 231), (255, 0, 227), (255, 0, 219), +(255, 0, 215), (255, 0, 206), (255, 0, 202), (255, 0, 194), +(255, 0, 190), (255, 0, 182), (255, 0, 178), (255, 0, 170), +(255, 0, 166), (255, 0, 158), (255, 0, 154), (255, 0, 146), +(255, 0, 142), (255, 0, 134), (255, 0, 130), (255, 0, 125), +(255, 0, 117), (255, 0, 113), (255, 0, 105), (255, 0, 101), +(255, 0, 93), (255, 0, 89), (255, 0, 81), (255, 0, 77), +(255, 0, 69), (255, 0, 65), (255, 0, 57), (255, 0, 53), +(255, 0, 45), (255, 0, 40), (255, 0, 32), (255, 0, 28), +(255, 0, 20), (255, 0, 16), (255, 0, 8), (255, 0, 4)), + +// 702 Alice_3D_grass_and_sky +((12, 12, 12), (9, 40, 19), (8, 66, 29), (7, 91, 37), +(5, 112, 43), (3, 129, 49), (1, 141, 54), (0, 149, 59), +(0, 151, 60), (0, 148, 61), (0, 139, 60), (0, 127, 54), +(0, 109, 48), (1, 88, 39), (3, 64, 32), (6, 39, 22), +(12, 12, 12), (13, 38, 18), (14, 63, 25), (16, 86, 31), +(17, 106, 38), (18, 123, 44), (17, 134, 48), (17, 141, 53), +(16, 143, 54), (15, 140, 54), (13, 132, 52), (13, 120, 48), +(11, 103, 43), (11, 84, 38), (11, 61, 30), (10, 37, 21), +(12, 12, 12), (17, 43, 15), (25, 72, 19), (30, 100, 23), +(35, 123, 26), (38, 143, 28), (38, 156, 29), (35, 165, 29), +(34, 167, 29), (30, 164, 27), (26, 154, 26), (23, 140, 25), +(21, 120, 23), (18, 97, 22), (15, 70, 19), (12, 42, 15), +(12, 12, 12), (27, 41, 18), (42, 69, 26), (55, 95, 32), +(66, 117, 38), (73, 136, 42), (76, 149, 45), (77, 157, 46), +(76, 159, 46), (70, 156, 44), (66, 147, 42), (56, 133, 37), +(47, 115, 33), (37, 93, 28), (27, 67, 22), (17, 40, 15), +(12, 12, 12), (36, 46, 16), (59, 79, 20), (80, 109, 25), +(97, 134, 31), (111, 156, 35), (118, 171, 39), (126, 181, 42), +(125, 183, 44), (121, 180, 44), (113, 169, 44), (101, 153, 41), +(85, 132, 36), (69, 106, 32), (51, 76, 26), (31, 45, 18), +(12, 12, 12), (41, 45, 12), (71, 76, 15), (96, 104, 17), +(115, 129, 20), (132, 149, 23), (144, 164, 25), (149, 173, 27), +(151, 175, 29), (146, 172, 29), (138, 162, 30), (123, 147, 29), +(104, 126, 26), (84, 101, 23), (61, 73, 20), (36, 43, 15), +(12, 12, 12), (48, 49, 8), (85, 85, 7), (114, 118, 7), +(141, 146, 7), (161, 169, 7), (177, 186, 7), (183, 196, 9), +(186, 199, 10), (180, 195, 11), (170, 184, 12), (154, 167, 12), +(130, 143, 13), (103, 115, 13), (75, 82, 12), (43, 48, 11), +(12, 12, 12), (48, 41, 5), (82, 71, 2), (113, 98, 0), +(140, 123, 0), (162, 143, 0), (178, 157, 0), (189, 170, 0), +(191, 172, 0), (188, 172, 0), (176, 161, 0), (160, 146, 0), +(137, 128, 2), (110, 103, 4), (79, 74, 6), (46, 42, 9), +(12, 12, 12), (32, 59, 56), (52, 105, 99), (71, 147, 139), +(86, 185, 177), (99, 216, 208), (108, 239, 232), (112, 254, 245), +(114, 255, 252), (110, 255, 249), (103, 243, 237), (93, 221, 217), +(80, 190, 186), (64, 153, 151), (47, 109, 106), (29, 62, 59), +(12, 12, 12), (35, 56, 53), (59, 98, 96), (81, 138, 135), +(99, 173, 172), (114, 202, 199), (124, 224, 223), (130, 239, 239), +(131, 244, 244), (128, 240, 241), (120, 227, 228), (108, 206, 207), +(93, 175, 179), (74, 143, 144), (53, 100, 103), (32, 56, 59), +(12, 12, 12), (38, 56, 42), (65, 97, 73), (90, 135, 105), +(111, 168, 132), (128, 196, 155), (140, 215, 174), (147, 228, 182), +(149, 231, 190), (146, 227, 188), (136, 213, 179), (123, 194, 165), +(105, 168, 145), (84, 135, 117), (61, 97, 84), (35, 56, 49), +(12, 12, 12), (44, 54, 42), (76, 94, 72), (105, 131, 99), +(127, 163, 123), (145, 189, 142), (156, 208, 158), (164, 220, 168), +(166, 223, 174), (163, 219, 173), (152, 206, 166), (138, 187, 154), +(118, 160, 134), (94, 128, 110), (68, 92, 80), (39, 53, 45), +(12, 12, 12), (57, 59, 39), (100, 103, 66), (136, 144, 92), +(172, 180, 116), (197, 209, 135), (216, 230, 150), (224, 243, 160), +(226, 247, 164), (221, 242, 162), (205, 228, 154), (184, 207, 140), +(155, 177, 122), (123, 141, 99), (86, 101, 72), (49, 57, 41), +(12, 12, 12), (57, 51, 35), (100, 86, 61), (140, 125, 85), +(174, 153, 105), (202, 180, 123), (223, 201, 136), (236, 214, 145), +(239, 218, 149), (235, 217, 148), (221, 204, 140), (200, 188, 128), +(171, 160, 112), (137, 129, 90), (98, 93, 66), (56, 52, 38), +(12, 12, 12), (62, 54, 32), (109, 93, 54), (153, 130, 74), +(191, 164, 92), (222, 190, 107), (245, 212, 119), (255, 224, 127), +(255, 225, 131), (255, 224, 129), (243, 216, 122), (220, 197, 112), +(188, 169, 97), (150, 135, 79), (107, 96, 58), (60, 52, 35), +(12, 12, 12), (62, 43, 29), (109, 78, 48), (152, 108, 65), +(189, 135, 80), (220, 159, 94), (242, 173, 104), (255, 186, 111), +(255, 186, 115), (253, 187, 113), (238, 178, 108), (215, 162, 100), +(184, 138, 87), (146, 112, 71), (104, 81, 52), (59, 47, 32)), + +// 703 Alice_3D_Gems +((0, 0, 0), (1, 32, 25), (2, 64, 50), (3, 96, 76), +(4, 128, 101), (5, 160, 126), (6, 192, 152), (7, 224, 177), +(32, 20, 0), (16, 36, 9), (10, 64, 28), (11, 96, 53), +(12, 128, 78), (13, 160, 104), (14, 192, 130), (15, 224, 154), +(64, 40, 0), (58, 68, 17), (32, 72, 18), (19, 96, 30), +(20, 128, 56), (21, 160, 81), (22, 192, 107), (23, 224, 130), +(96, 61, 0), (100, 99, 25), (75, 104, 26), (48, 108, 27), +(28, 128, 33), (29, 160, 57), (30, 192, 84), (31, 224, 108), +(128, 81, 0), (132, 119, 32), (117, 136, 34), (91, 140, 35), +(65, 144, 36), (39, 160, 37), (38, 192, 61), (39, 224, 85), +(160, 101, 0), (164, 140, 32), (162, 168, 42), (133, 172, 43), +(108, 176, 44), (81, 180, 45), (55, 192, 46), (47, 224, 61), +(192, 122, 0), (196, 161, 32), (200, 198, 50), (176, 204, 51), +(151, 208, 52), (125, 212, 53), (97, 216, 54), (72, 224, 55), +(224, 142, 0), (228, 179, 32), (232, 218, 58), (219, 236, 59), +(192, 240, 60), (168, 244, 61), (140, 248, 62), (113, 252, 63), +(56, 0, 64), (29, 4, 65), (8, 12, 66), (12, 51, 96), +(16, 89, 128), (20, 127, 160), (24, 167, 192), (28, 205, 224), +(72, 0, 48), (72, 32, 73), (46, 40, 74), (44, 71, 96), +(48, 109, 128), (52, 147, 160), (56, 185, 192), (60, 224, 224), +(80, 0, 25), (81, 32, 50), (82, 64, 76), (76, 91, 96), +(80, 128, 126), (84, 160, 152), (86, 192, 178), (87, 224, 204), +(96, 0, 3), (100, 35, 32), (104, 73, 64), (105, 108, 91), +(92, 128, 104), (93, 160, 129), (94, 192, 155), (95, 224, 181), +(128, 17, 0), (132, 55, 32), (136, 94, 64), (140, 132, 96), +(121, 144, 100), (101, 160, 106), (102, 192, 132), (103, 224, 158), +(160, 37, 0), (164, 76, 32), (168, 114, 64), (172, 152, 96), +(164, 176, 108), (137, 180, 109), (111, 192, 110), (111, 224, 134), +(192, 57, 0), (196, 95, 32), (200, 134, 64), (204, 172, 96), +(207, 208, 116), (181, 212, 117), (154, 216, 118), (128, 224, 119), +(224, 78, 0), (228, 117, 32), (232, 154, 64), (236, 192, 96), +(240, 231, 124), (223, 244, 125), (197, 248, 126), (169, 252, 127), +(113, 0, 128), (87, 4, 129), (59, 8, 130), (33, 12, 131), +(16, 25, 132), (20, 64, 160), (24, 102, 192), (28, 139, 224), +(136, 0, 120), (128, 32, 137), (102, 40, 138), (75, 44, 139), +(49, 48, 140), (52, 84, 160), (56, 122, 192), (60, 161, 224), +(144, 0, 96), (145, 32, 122), (145, 64, 146), (119, 76, 147), +(92, 80, 148), (84, 104, 160), (88, 142, 192), (92, 180, 224), +(152, 0, 73), (153, 32, 98), (154, 64, 124), (155, 96, 150), +(135, 112, 156), (116, 124, 160), (120, 162, 192), (124, 201, 224), +(160, 0, 50), (161, 32, 75), (162, 64, 101), (163, 96, 127), +(164, 128, 152), (151, 148, 165), (152, 183, 192), (156, 221, 224), +(168, 0, 28), (169, 32, 52), (170, 64, 78), (172, 96, 104), +(176, 128, 130), (180, 165, 160), (174, 192, 180), (175, 224, 206), +(192, 0, 6), (196, 32, 32), (200, 71, 64), (204, 109, 96), +(208, 147, 128), (212, 185, 160), (210, 216, 182), (184, 224, 183), +(224, 14, 0), (228, 51, 32), (232, 89, 64), (236, 129, 96), +(240, 167, 128), (244, 205, 160), (248, 244, 190), (227, 252, 191), +(170, 0, 192), (143, 4, 193), (116, 8, 194), (88, 12, 195), +(64, 16, 196), (37, 20, 197), (24, 38, 198), (28, 77, 224), +(200, 0, 190), (184, 32, 201), (159, 40, 202), (131, 44, 203), +(105, 48, 204), (80, 52, 205), (56, 58, 206), (60, 95, 224), +(208, 0, 170), (209, 32, 195), (201, 64, 210), (175, 76, 211), +(148, 80, 212), (123, 84, 213), (94, 88, 214), (92, 116, 224), +(216, 0, 144), (217, 32, 171), (218, 64, 195), (217, 96, 219), +(191, 112, 220), (165, 116, 221), (139, 120, 222), (124, 137, 224), +(224, 0, 123), (225, 32, 148), (226, 64, 172), (227, 96, 199), +(228, 128, 223), (208, 148, 229), (181, 152, 230), (156, 157, 231), +(232, 0, 100), (233, 32, 126), (234, 64, 149), (235, 96, 175), +(236, 128, 200), (237, 160, 226), (224, 184, 238), (198, 188, 239), +(240, 0, 76), (241, 32, 102), (242, 64, 126), (243, 96, 152), +(244, 128, 178), (245, 160, 203), (246, 192, 228), (240, 220, 247), +(248, 0, 53), (249, 32, 79), (250, 64, 104), (251, 96, 130), +(252, 128, 155), (253, 160, 180), (254, 192, 206), (255, 224, 231)) + + +); + +const CMapNames: array[0..NMAPS] of string = +( + '000_south-sea-bather', + '001_sky-flesh', + '002_blue-bather', + '003_no-name', + '004_pillows', + '005_mauve-splat', + '006_facial-treescape 6', + '007_fasion-bug', + '008_leafy-face', + '009_mouldy-sun', + '010_sunny-harvest', + '011_peach-tree', + '012_fire-dragon', + '013_ice-dragon', + '014_german-landscape', + '015_no-name', + '016_living-mud-bomb', + '017_cars', + '018_unhealthy-tan', + '019_daffodil', + '020_rose', + '021_healthy-skin', + '022_orange', + '023_white-ivy', + '024_summer-makeup', + '025_glow-buzz', + '026_deep-water', + '027_afternoon-beach', + '028_dim-beach', + '029_cloudy-brick', + '030_burning-wood', + '031_aquatic-garden', + '032_no-name', + '033_fall-quilt', + '034_night-blue-sky', + '035_shadow-iris', + '036_solid-sky', + '037_misty-field', + '038_wooden-highlight', + '039_jet-tundra', + '040_pastel-lime', + '041_hell', + '042_indian-coast', + '043_dentist-decor', + '044_greenland', + '045_purple-dress', + '046_no-name', + '047_spring-flora', + '048_andi', + '049_gig-o835', + '050_rie02', + '051_rie05', + '052_rie11', + '053_etretat.ppm', + '054_the-hollow-needle-at-etretat.ppm', + '055_rouen-cathedral-sunset.ppm', + '056_the-houses-of-parliament.ppm', + '057_starry-night.ppm', + '058_water-lilies-sunset.ppm', + '059_gogh.chambre-arles.ppm', + '060_gogh.entrance.ppm', + '061_gogh.the-night-cafe.ppm', + '062_gogh.vegetable-montmartre.ppm', + '063_matisse.bonheur-vivre.ppm', + '064_matisse.flowers.ppm', + '065_matisse.lecon-musique.ppm', + '066_modigliani.nude-caryatid.ppm', + '067_braque.instruments.ppm', + '068_calcoast09.ppm', + '069_dodge102.ppm', + '070_ernst.anti-pope.ppm', + '071_ernst.ubu-imperator.ppm', + '072_fighting-forms.ppm', + '073_fog25.ppm', + '074_geyser27.ppm', + '075_gris.josette.ppm', + '076_gris.landscape-ceret.ppm', + '077_kandinsky.comp-9.ppm', + '078_kandinsky.yellow-red-blue.ppm', + '079_klee.insula-dulcamara.ppm', + '080_nile.ppm', + '081_picasso.jfille-chevre.ppm', + '082_pollock.lavender-mist.ppm', + '083_yngpaint.ppm', + '084_cl-gold-orange-green from classlady1.ugr', + '085_cl-gold-rose', + '086_cl-lavender-purple-blues-black', + '087_cl-yellow_mixed-brown-gold', + '088_cl-dark_reds-white-grays', + '089_cl-gold-dark_reds-browns-blues', + '090_cl-golds-browns', + '091_cl-purples-browns-blues-tans', + '092_cl-oranges-browns-whites', + '093_cl-blues-greens-whites', + '094_cl-tans-yellows-browns', + '095_cl-golds-browns2', + '096_cl-pastels', + '097_multi_color_1 from ron1.ugr (classylady & ron)', + '098_oranges', + '099_multi_color_2', + '100_rw-yellow-orange', + '101_rw-multi-color-2', + '102_rw-blue-with-red', + '103_rw-blue-with-red-2', + '104_rw-blues-3', + '105_rw-reds-pinks-blues', + '106_rw-browns-greens-reds-bule', + '107_rw-browns-pinks-reds-blues', + '108_rw-reds-greens-blues-pinks-yellows-browns', + '109_rw-greens-light-to-dark', + '110_rw-blues-reds-purples', + '111_rw-multi-5', + '112_rw-blues-black-purple', + '113_rw-multi-colors-6', + '114_rw-multi-reds-oranges', + '115_rw-yellows-browns-goldish', + '116_rw-multi-blues-with-gray', + '117_rw-greens-multi', + '118_rw-browns-orange-yellow-with-blues', + '119_rw-reds-blues-greens-pinks', + '120_rw-reds-browns-golds-tans', + '121_dg009', + '122_dg016', + '123_dg031', + '124_dg085', + '125_dg086', + '126_dg089', + '127_Apophysis-040426-1crabgrass from pat phillips patrx.deviantart.com', + '128_Apophysis-040426-12bs1fl', + '129_Apophysis-040426-1cometnuc', + '130_Apophysis-040426-1passionscross', + '131_Apophysis-040426-1butterflyflower', + '132_Apophysis-040426-1Watcher', + '133_Apophysis-040426-1knotted', + '134_Apophysis-040426-1artdeco', + '135_Apophysis-040426-1expl_orange2a', + '136_Apophysis-040426-1heartFlowers', + '137_Apophysis-040426-1H-bird1g', + '138_Apophysis-040426-1Emergence2', + '139_Apophysis-040426-1Egg', + '140_Apophysis-040426-1PenEgg', + '141_Apophysis-040426-1kaosGothic', + '142_Apophysis-040426-1KQNova', + '143_Apophysis-040426-1kaosframe', + '144_Apophysis-040426-147KaosRing', + '145_Apophysis-040426-147Fighting_Fish', + '146_Apophysis-040426-147ReachingMoon', + '147_Apophysis-040426-163KaosScepter', + '148_Apophysis-040426-163KSphere', + '149_Apophysis-040426-163KInterseed', + '150_Apophysis-040426-163XmasFlwers', + '151_Apophysis-040426-163Shield', + '152_Apophysis-040426-163AlienFlwers', + '153_Apophysis-040426-163AlienFlwers4', + '154_Apophysis-040426-163butterflyflwer1', + '155_Apophysis-040426-163ButterflySherbert', + '156_Apophysis-040426-163BFlyGate4', + '157_Apophysis-040426-163BFlyGate4Inv', + '158_Apophysis-040426-163CeltCross', + '159_Apophysis-040426-163Egg4d', + '160_Apophysis-040426-163FlowerFerns', + '161_Apophysis-040426-163FlowerFernsInv', + '162_Apophysis-040426-163FlwrFernsInv', + '163_Apophysis-040426-163FloralCascade2', + '164_Apophysis-040426-163FlowerBurst', + '165_Apophysis-040426-163MaltesePurple', + '166_Apophysis-040426-163Mycelialg', + '167_Apophysis-040426-163MyceliaInv', + '168_Apophysis-040426-163MrryGRnd', + '169_Apophysis-040426-163SprngFlwrs', + '170_Apophysis-040426-163SprngFlwersInv', + '171_Apophysis-040426-163DemMask', + '172_Apophysis-040426-163ResurectTree', + '173_Apophysis-040426-163GldBlue', + '174_Apophysis-040426-163WrldBndr', + '175_Apophysis-040426-163GrnPrpl', + '176_Apophysis-040426-163SphPart2', + '177_Apophysis-040426-163StAmF', + '178_Apophysis-040426-163StCosOwl', + '179_Apophysis-040426-163StGenie', + '180_Apophysis-040426-163St', + '181_Apophysis-040426-163StSatAngel', + '182_Apophysis-040427-1knotted', + '183_Apophysis-040427-4AlngSpder', + '184_Apophysis-040427-4AlienFlwerBwl', + '185_Apophysis-040427-4AlienFlwrBwl_inv', + '186_Apophysis-040427-4AmusePrk', + '187_Apophysis-040427-4AmusePrkInv', + '188_Apophysis-040427-4AmythIceInv', + '189_Apophysis-040427-4AmythIce', + '190_Apophysis-040427-4AngOrchid', + '191_Apophysis-040427-4Leaves', + '192_Apophysis-040427-4Bdlnds', + '193_Apophysis-040427-4BnnySurp', + '194_Apophysis-040427-4BorgEY', + '195_Apophysis-040427-4BB4', + '196_Apophysis-040427-4BflyWindw2', + '197_Apophysis-040427-4BflyWndw3', + '198_Apophysis-040427-4ChalLghtDrknss', + '199_Apophysis-040427-4ChalicDrknsIce', + '200_Apophysis-040427-4CactusFlwer', + '201_Apophysis-040427-4ChrryBlssmT', + '202_Apophysis-040427-4ChrryBlssm2', + '203_Apophysis-040427-4CircAmbr', + '204_Apophysis-040427-4CsmcOwl', + '205_Apophysis-040427-4DblBeetle', + '206_Apophysis-040427-4DrkMantis', + '207_Apophysis-040427-4HolidyBull', + '208_Apophysis-040427-4DrkFlorCnpy', + '209_Apophysis-040427-4DethstrDemis', + '210_Apophysis-040427-4DethstrDems', + '211_Apophysis-040427-4DeerDemMsk', + '212_Apophysis-040427-4CrouchDragn', + '213_Apophysis-040427-4CopprMapleleaf', + '214_Apophysis-040427-4Circulations', + '215_Apophysis-040427-4DmnContaind', + '216_Apophysis-040427-4DmnCntndWP', + '217_Apophysis-040427-4DmnDimensn', + '218_Apophysis-040427-4SatnFlorlSwag', + '219_Apophysis-040427-4DDragHeart', + '220_Apophysis-040427-4DimesPathsE', + '221_Apophysis-040427-4DimensPathsE2', + '222_Apophysis-040427-4DimensPathE2', + '223_Apophysis-040427-4Doodles', + '224_Apophysis-040427-4Doodles2', + '225_Apophysis-040427-4doodles3', + '226_Apophysis-040427-4Doodle3inv', + '227_Apophysis-040427-6DoublEagles2', + '228_Apophysis-040427-6Equinox', + '229_Apophysis-040427-6Equinox2', + '230_Apophysis-040427-6BluBrd', + '231_Apophysis-040427-6BluBrdInv', + '232_Apophysis-040427-6FaerieKng', + '233_Apophysis-040427-6FireDemnOrch', + '234_Apophysis-040427-6CsmcLottoWhl', + '235_Apophysis-040427-6DreamFaeriRlm', + '236_Apophysis-040427-6EyeUniv', + '237_Apophysis-040427-6FaeriRob', + '238_Apophysis-040427-6FaeriRob2', + '239_Apophysis-040427-6FaeriRobDet', + '240_Apophysis-040427-6FlakWhorls', + '241_Apophysis-040427-11FlarCelebrat', + '242_Apophysis-040427-11SpacTrees', + '243_Apophysis-040427-11FloralQult', + '244_Apophysis-040427-20FlwrFrnsBFly', + '245_Apophysis-040427-24FracrameE', + '246_Apophysis-040427-24FNouveau', + '247_Apophysis-040427-24GuardFaeriR', + '248_Apophysis-040427-24GoldenRays', + '249_Apophysis-040427-24HunterSunset', + '250_Apophysis-040427-25IntoWeave', + '251_Apophysis-040427-26AlienMind', + '252_Apophysis-040427-26ISpher4', + '253_Apophysis-040427-26ISph2', + '254_Apophysis-040427-26ISph11', + '255_Apophysis-040427-43HeartFlwr', + '256_Apophysis-040427-43JunglThron', + '257_Apophysis-040427-44jawa', + '258_Apophysis-040427-51KaosGrn', + '259_Apophysis-040427-51KaosFish', + '260_Apophysis-040427-51KKlown', + '261_Apophysis-040427-51KaosEgg', + '262_Apophysis-040427-51LavLace', + '263_Apophysis-040427-51mudding', + '264_Apophysis-040427-51pane;', + '265_Apophysis-040427-51RiftAO', + '266_Apophysis-040427-51ylwAlien', + '267_Apophysis-040427-51elecforest', + '268_Apophysis-040427-51ReachMoon', + '269_Apophysis-040427-51satPhlox', + '270_Apophysis-040427-51SnikRchg', + '271_Apophysis-040427-51SmwhrDream', + '272_Apophysis-040427-51eyepuzzl', + '273_Apophysis-040427-51SpherInBlm', + '274_Apophysis-040427-51SunrisSpacTim', + '275_Apophysis-040427-51synaps', + '276_Apophysis-040427-51StPeacocl', + '277_Apophysis-040427-51TmplWatrs2', + '278_Apophysis-040427-51TeddyScare', + '279_Apophysis-040427-51kaosGardenr', + '280_Apophysis-040427-51Thatway4', + '281_Apophysis-040427-51ThatwayGrn', + '282_Apophysis-040427-51TreeLife1', + '283_Apophysis-040427-51TreeLife', + '284_Apophysis-040427-51triflwr', + '285_Apophysis-040427-51mitosis', + '286_Apophysis-040427-51triflwer', + '287_Apophysis-040427-51yggF', + '288_Apophysis-040427-51Gwrap', + '289_Apophysis-040428-1Gradient1', + '290_Apophysis-040428-3Gradient2', + '291_Apophysis-040602-1', + '292_Apophysis-040531-100figurine_2abcd', + '293_Apo-040627-1_chickadee_pix', + '294_2u0026t.jpg from bTomchek', + '295_2u0007t.jpg', + '296_2u0010t.jpg', + '297_2u0015t.jpg', + '298_2u0017pp1t.jpg', + '299_2u0017t.jpg', + '300_2u0018t.jpg', + '301_2u0020pp1t.jpg', + '302_2u0020t.jpg', + '303_2u0024t.jpg', + '304_gradient0000.jpg', + '305_0t0507.jpg', + '306_0t0524.jpg', + '307_0t0533.jpg', + '308_0u0075.jpg', + '309_0u0298.jpg', + '310_0u0298pp1.jpg', + '311_0u0303.jpg', + '312_0u0333.jpg', + '313_0u0752.jpg', + '314_0u0768.jpg', + '315_0u0795.jpg', + '316_1u0214.jpg', + '317_1u0215.jpg', + '318_1u0216.jpg', + '319_1u0216pp1.jpg', + '320_3m0001.jpg', + '321_3m0004.jpg', + '322_3m0005.jpg', + '323_3m0006.jpg', + '324_3m0007.jpg', + '325_3m0008.jpg', + '326_3m0009.jpg', + '327_3m0010.jpg', + '328_3m0011.jpg', + '329_3m0012.jpg', + '330_3m0013.jpg', + '331_3m0014.jpg', + '332_3m0015.jpg', + '333_3m0016.jpg', + '334_3m0018.jpg', + '335_4u0002.jpg', + '336_4u0003.jpg', + '337_4u0004.jpg', + '338_4u0005.jpg', + '339_4u0006.jpg', + '340_4u0007.jpg', + '341_4u0008.jpg', + '342_4u0009.jpg', + '343_4u0009b.jpg', + '344_4u0010.jpg', + '345_4u0011.jpg', + '346_4u0012.jpg', + '347_4u0013.jpg', + '348_4u0019.jpg', + '349_4u0022.jpg', + '350_k2u0217.jpg', + '351_ku0213.jpg', + '352_ku0215.jpg', + '353_s00026.jpg', + '354_s00043.jpg', + '355_s00118.jpg', + '356_s00138.jpg', + '357_s00149.jpg', + '358_vchira_0001.jpg', + '359_vchira_0003.jpg', + '360_vchira_0012.jpg', + '361_vchira_0013.jpg', + '362_vchira_0014.jpg', + '363_vchira_0015.jpg', + '364_vchira_17.jpg', + '365_vchira_18pp1.jpg', + '366_vchira_19.jpg', + '367_vchira_28.jpg', + '368_vchira_2pp1.jpg', + '369_00017', + '370_040208-115', + '371_040221-00', + '372_040221-11', + '373_040221-12', + '374_040221-13', + '375_040221-14', + '376_040221-19', + '377_040221-2', + '378_040221-21', + '379_040221-22', + '380_040221-23', + '381_040221-24', + '382_040221-25', + '383_040221-26', + '384_040221-27', + '385_040221-28', + '386_040221-29', + '387_040221-30', + '388_040221-31', + '389_040221-32', + '390_040221-33', + '391_040221-34', + '392_040221-35', + '393_040221-36', + '394_040221-37', + '395_040221-38', + '396_040221-39', + '397_040221-40', + '398_040221-41', + '399_040221-42', + '400_040221-43', + '401_040221-44', + '402_040221-45', + '403_040221-46', + '404_040221-47', + '405_040221-48', + '406_040221-49', + '407_040221-50', + '408_040221-51', + '409_040221-52', + '410_040221-53', + '411_040221-54', + '412_040221-55', + '413_040221-56', + '414_040221-57', + '415_040221-58', + '416_040221-59', + '417_040221-60', + '418_040221-61', + '419_040221-62', + '420_040221-63', + '421_040221-64', + '422_040221-71', + '423_040221-74', + '424_040221-78', + '425_040221-80', + '426_040221-81', + '427_040221-84', + '428_040221-85', + '429_040221-86', + '430_040221-88', + '431_040221-89', + '432_040221-90', + '433_040221-91', + '434_040221-92', + '435_040221-93', + '436_040221-94', + '437_040221-95', + '438_040221-96', + '439_040221-97', + '440_040221-98', + '441_040221-99', + '442_040222', + '443_040222-00', + '444_040222-01', + '445_040222-02', + '446_040222-03', + '447_040222-05', + '448_040222-06', + '449_040222-07', + '450_040222-08', + '451_040222-09', + '452_040222-10', + '453_040222-11', + '454_040222-12', + '455_040222-13', + '456_040222-15', + '457_040222-16', + '458_040222-17', + '459_040222-18', + '460_040222-19', + '461_040222-20', + '462_040222-21', + '463_040222-22', + '464_040222-23', + '465_040222-24', + '466_040222-25', + '467_040222-26', + '468_040222-27', + '469_040222-28', + '470_040222-29', + '471_040223', + '472_040224', + '473_040225', + '474_040226', + '475_040227', + '476_040228', + '477_10000', + '478_Apophysis-040208-115d', + '479_Apophysis-040208-115e', + '480_Apophysis-040208-115g', + '481_Apophysis-040208-115h', + '482_Apophysis-040208-115i', + '483_Apophysis-040208-115j', + '484_Apophysis-040208-115k', + '485_A_Bit_Confused', + '486_Afternoon_Shadows', + '487_Air', + '488_Angora', + '489_Antique', + '490_Arizona', + '491_Autumn_Garden', + '492_Autumn_Leaves', + '493_Autumn_Mountains', + '494_Awakening', + '495_Baby', + '496_Banana', + '497_Beach', + '498_Beautiful', + '499_Before_Dawn', + '500_Beginning_to_Thaw', + '501_Beige', + '502_Berry_Bush', + '503_Biology_Class', + '504_Birthday_Party', + '505_Bistro', + '506_Blossoms', + '507_Blue_Velvet', + '508_Bluebells', + '509_Blush', + '510_Bluster', + '511_Boquet_of_Roses', + '512_Brushed_Silver', + '513_Bubblegum', + '514_California', + '515_Canyon', + '516_Carnations', + '517_Carnival', + '518_Carpenter', + '519_Cellist', + '520_Cherry', + '521_Circus', + '522_City_Street', + '523_Clash', + '524_Clouds', + '525_Copper', + '526_Coral', + '527_Cotton_Flower', + '528_Country_Garden', + '529_Creamsicle', + '530_Cricket_Music', + '531_Dark_Rainbow', + '532_Dark_Rose', + '533_Dark_Turquoise', + '534_Dark_Waters', + '535_Darkness', + '536_Davinci', + '537_Daylight_Fading', + '538_Dinosaurs', + '539_Dragon', + '540_Dust_Bunny', + '541_Dynasty', + '542_Easter', + '543_Easter_2', + '544_Easter_3', + '545_Egg_Hunt', + '546_Elements', + '547_Embers', + '548_Etomchek-040328-005', + '549_Etomchek-040328-006', + '550_Etomchek-040328-007', + '551_Etomchek-040328-008', + '552_Etomchek-040328-009', + '553_Etomchek-040328-010', + '554_Etomchek-040328-011', + '555_Evening_Sunshine', + '556_Evensong', + '557_Exceding_Expectations', + '558_Explosion', + '559_Faded_Denim', + '560_Fading_Away', + '561_Fiery_Sky', + '562_Fiesta', + '563_First_Love', + '564_Flame', + '565_Flying_a_Kite', + '566_Foamy_Waves', + '567_For_Lenora', + '568_For_Stacy', + '569_Forest', + '570_Frivolous', + '571_Fun_Stuff', + '572_Getting_a_Tan', + '573_gipper', + '574_Glade', + '575_Glory', + '576_Gold_and_Blue', + '577_Golden', + '578_Golden_Green', + '579_Goldenrod', + '580_Grape', + '581_Lemon_Grass', + '582_Magenta_and_Teal', + '583_Mahogany', + '584_Marina', + '585_Meadow', + '586_Mermaid', + '587_Mesmerize', + '588_Midnight_Wave', + '589_Mint', + '590_Mistic', + '591_Mixed_Berry', + '592_More_Blue', + '593_Morning_Glories_at_Night', + '594_Moss', + '595_Moss2', + '596_Motel_Decor', + '597_Muddy', + '598_Muddy_2', + '599_Muted_Rainbow', + '600_Mystery', + '601_Neon', + '602_Neon_Purple', + '603_Night_Flower', + '604_Night_Reeds', + '605_No_Clue', + '606_Nonsense', + '607_Oak_Tree', + '608_Ocean_Mist', + '609_Paige', + '610_Paris', + '611_Parrot', + '612_Pastel_Lime', + '613_Peace', + '614_Persia', + '615_Persia_2', + '616_Persia_3', + '617_Pink', + '618_Pollen', + '619_Poppies', + '620_Produce_Department', + '621_Purple', + '622_Queen_Anne', + '623_Quiet', + '624_Rainbow_Sprinkles', + '625_Rainforest', + '626_Rainy_Day_in_Spring', + '627_Rainy_Forset', + '628_Red_Light', + '629_Riddle', + '630_Riverside', + '631_Rose_Bush', + '632_Rusted', + '633_Sachet', + '634_Sage', + '635_Saturday_Morning', + '636_Scattered_Petals', + '637_Sea_Mist', + '638_Secret', + '639_Serenity', + '640_Serpent', + '641_Sharp', + '642_Shy_Violets', + '643_Singe', + '644_Slate', + '645_Slightly_Messy', + '646_Smog', + '647_Sno_and_Shadows', + '648_Snowy_Field', + '649_Snuggle', + '650_Soap_Bubble', + '651_Sophia', + '652_Strawberries', + '653_Summer', + '654_Summer_Fire', + '655_Summer_Skies', + '656_Summer_Tulips', + '657_Sunbathing', + '658_Sunny_Field', + '659_Sunset', + '660_Surfer', + '661_Tequila', + '662_Thistle', + '663_Tribal', + '664_Trippy', + '665_Tropic', + '666_True_Blue', + '667_Tryst', + '668_Tumbleweed', + '669_Type_AB_Positive', + '670_Underwater_Day', + '671_Venice', + '672_Victoria', + '673_Violet', + '674_Violet_Fog', + '675_Watermelon', + '676_Whisp', + '677_Whisper', + '678_Wintergrass', + '679_Wooden', + '680_Wooden_2', + '681_Wooden_3', + '682_Woodland', + '683_Yellow_Silk', + '684_Zinfandel', + '685_040412', + '686_040412-000', + '687_040412-001', + '688_040412-002', + '689_040412-005', + '690_040412-006', + '691_040412-007', + '692_040412-008', + '693_040412-010', + '694_040412-011', + '695_040412-012', + '696_040412-013', + '697_040412-014', + '698_040412-015', + '699_040412-016', + '700_040412-017', + '701_Spectrum', + '702_Alice_3D_Grass-and-Sky', + '703_Alice_3D_Gems' +); + +implementation + +end. + + diff --git a/Core/BaseVariation.pas b/Core/BaseVariation.pas new file mode 100644 index 0000000..ac356c4 --- /dev/null +++ b/Core/BaseVariation.pas @@ -0,0 +1,226 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit BaseVariation; + +interface + +type + TCalcFunction = procedure of object; + +type + TBaseVariation = class + + protected + procedure CalcFunction; virtual; abstract; + + public + vvar: double; + FTx, FTy: ^double; + FPx, FPy: ^double; + FTz, FPz: ^double; + + // more params :) + color : ^double; + a, b, c, d, e, f : double; + + class function GetName: string; virtual; abstract; + class function GetInstance: TBaseVariation; virtual; abstract; + + function GetNrVariables: integer; virtual; + function GetVariableNameAt(const Index: integer): string; virtual; + + function GetVariable(const Name: string; var Value: double): boolean; virtual; + function SetVariable(const Name: string; var Value: double): boolean; virtual; + function ResetVariable(const Name: string): boolean; virtual; + + function GetVariableStr(const Name: string): string; virtual; + function SetVariableStr(const Name: string; var strValue: string): boolean; virtual; + + procedure Prepare; virtual; + + procedure GetCalcFunction(var Delphi_Suxx: TCalcFunction); virtual; + end; + + TBaseVariationClass = class of TBaseVariation; + +type + TVariationLoader = class + public + Supports3D, SupportsDC : boolean; + + function GetName: string; virtual; abstract; + function GetInstance: TBaseVariation; virtual; abstract; + function GetNrVariables: integer; virtual; abstract; + function GetVariableNameAt(const Index: integer): string; virtual; abstract; + end; + +type + TVariationClassLoader = class (TVariationLoader) + public + constructor Create(varClass : TBaseVariationClass); + function GetName: string; override; + function GetInstance: TBaseVariation; override; + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + private + VariationClass : TBaseVariationClass; + end; + +const + PI2 = 6.283185307179586476925286766559; // AV + PI_2 = 1.5707963267948966192313216916398; // AV + +function fmod(x, y: double) : double; +procedure SinhCosh(const v: double; var sh, ch: double); // AV + +implementation + +uses SysUtils; + +function fmod(x, y: double) : double; +begin + Result := frac(x / y) * y; +end; + +procedure SinhCosh(const v: double; var sh, ch: double); +// AV: calcs both hyperbolic sine and cosine +var ep, en: double; +begin + ep := 0.5 * exp(v); + en := 0.25 / ep; // 0.5 * exp(-v); + sh := ep - en; + ch := ep + en; +end; + +{ TBaseVariation } + +/////////////////////////////////////////////////////////////////////////////// +function TBaseVariation.GetNrVariables: integer; +begin + Result := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TBaseVariation.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; +end; + +function TBaseVariation.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; +end; + +function TBaseVariation.ResetVariable(const Name: string): boolean; +var + zero: double; +begin + zero := 0; + Result := SetVariable(Name, zero); +end; + +/////////////////////////////////////////////////////////////////////////////// +function TBaseVariation.GetVariableStr(const Name: string): string; +var + value: double; +begin + if GetVariable(Name, value) then + Result := Format('%.6g', [value]) + else + Result := ''; +end; + +function TBaseVariation.SetVariableStr(const Name: string; var strValue: string): boolean; +var + v, oldv: double; +begin + if GetVariable(Name, oldv) then begin + try + v := StrToFloat(strValue); + SetVariable(Name, v); + except + v := oldv; + end; + strValue := Format('%.6g', [v]); + Result := true; + end + else Result := false; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TBaseVariation.GetVariableNameAt(const Index: integer): string; +begin + Result := '' +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TBaseVariation.Prepare; +begin +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TBaseVariation.GetCalcFunction(var Delphi_Suxx: TCalcFunction); +begin + Delphi_Suxx := CalcFunction; // -X- lol +end; + +/////////////////////////////////////////////////////////////////////////////// +{ TVariationClassLoader } + +constructor TVariationClassLoader.Create(varClass : TBaseVariationClass); +begin + VariationClass := varClass; +end; + +function TVariationClassLoader.GetName: string; +begin + Result := VariationClass.GetName(); +end; + +function TVariationClassLoader.GetInstance: TBaseVariation; +begin + Result := VariationClass.GetInstance(); +end; + +function TVariationClassLoader.GetNrVariables: integer; +var + hack : TBaseVariation; +begin + hack := GetInstance(); + Result := hack.GetNrVariables(); + hack.Free(); +end; + +function TVariationClassLoader.GetVariableNameAt(const Index: integer): string; +var + hack : TBaseVariation; +begin + hack := GetInstance(); + Result := hack.GetVariableNameAt(Index); + hack.Free(); +end; + +end. diff --git a/Core/Bezier.pas b/Core/Bezier.pas new file mode 100644 index 0000000..23bcae0 --- /dev/null +++ b/Core/Bezier.pas @@ -0,0 +1,94 @@ +unit Bezier; + +interface + +uses Math; + + +type + BezierPoint = record + x, y: double; + end; + BezierRect = record + x0, y0, x1, y1: double; + end; + + BezierPoints = array [0..3] of BezierPoint; + BezierWeights = array [0..3] of double; + +procedure BezierCopy(src: BezierPoints; var tgt: BezierPoints); +procedure BezierSetRect(var points: BezierPoints; flip: boolean; rect: BezierRect); +procedure BezierUnsetRect(var points: BezierPoints; flip: boolean; rect: BezierRect); + +procedure BezierSolve(t: double; src: BezierPoints; w: BezierWeights; var solution: BezierPoint); +function BezierFunc(t: double; src: BezierPoints; w: BezierWeights): double; + +implementation + procedure BezierCopy(src: BezierPoints; var tgt: BezierPoints); + var + i, n: integer; + begin + n := Length(src); + for i := 0 to n - 1 do + tgt[i] := src[i]; + end; + procedure BezierSetRect(var points: BezierPoints; flip: boolean; rect: BezierRect); + var + i, n: integer; + f: double; + begin + n := Length(points); + for i := 0 to n - 1 do + begin + if (flip) then f := 1 - points[i].y + else f := points[i].y; + + points[i].x := points[i].x * (rect.x1 - rect.x0) + rect.x0; + points[i].y := f * (rect.y1 - rect.y0) + rect.y0; + end; + end; + procedure BezierUnsetRect(var points: BezierPoints; flip: boolean; rect: BezierRect); + var + i, n: integer; + f: double; + begin + if ((rect.x1 - rect.x0) = 0) or ((rect.y1 - rect.y0) = 0) then Exit; + + n := Length(points); + for i := 0 to n - 1 do + begin + points[i].x := (points[i].x - rect.x0) / (rect.x1 - rect.x0); + points[i].y := (points[i].y - rect.y0) / (rect.y1 - rect.y0); + + if (flip) then points[i].y := 1 - points[i].y; + end; + end; + + procedure BezierSolve(t: double; src: BezierPoints; w: BezierWeights; var solution: BezierPoint); + var + s, s2, s3, t2, t3, nom_x, nom_y, denom: double; + begin + s := 1 - t; + s2 := s * s; s3 := s * s * s; + t2 := t * t; t3 := t * t * t; + + nom_x := w[0] * s3 * src[0].x + w[1] * s2 * 3 * t * src[1].x + + w[2] * s * 3 * t2 * src[2].x + w[3] * t3 * src[3].x; + nom_y := w[0] * s3 * src[0].y + w[1] * s2 * 3 * t * src[1].y + + w[2] * s * 3 * t2 * src[2].y + w[3] * t3 * src[3].y; + denom := w[0] * s3 + w[1] * s2 * 3 * t + w[2] * s * 3 * t2 + w[3] * t3; + + if (IsNaN(nom_x)) or (IsNaN(nom_y)) or (IsNaN(denom)) then Exit; + if denom = 0 then Exit; + + solution.x := nom_x / denom; + solution.y := nom_y / denom; + end; + function BezierFunc(t: double; src: BezierPoints; w: BezierWeights): double; + var + p: BezierPoint; + begin + BezierSolve(t, src, w, p); + Result := p.y; + end; +end. diff --git a/Core/Chaotica.pas b/Core/Chaotica.pas new file mode 100644 index 0000000..7eb1db6 --- /dev/null +++ b/Core/Chaotica.pas @@ -0,0 +1,300 @@ +unit Chaotica; + +interface + +uses Global, RegularExpressionsCore, RegexHelper, Classes, SysUtils, XFormMan, Windows, + ShellAPI, Forms, ControlPoint, Translation; + +function C_GetPathOf(filename: string; usex64: boolean): string; +function C_SupportsDllPlugins(usex64: boolean): boolean; +function C_IsDllPluginBlacklisted(filename: string; usex64: boolean): boolean; +function C_IsVariationNative(name: string; usex64: boolean): boolean; +function C_IsDllPluginInstalled(filename: string): boolean; + +procedure C_SyncDllPlugins; +procedure C_InstallVariation(name: string); +procedure C_ExecuteChaotica(flamexml: string; plugins: TStringList; usex64: boolean); + +implementation + +uses Main; + +(* // AV: rewrote and moved to Global unit +function CheckX64: Boolean; +var + SEInfo: TShellExecuteInfo; + ExitCode: DWORD; + ExecuteFile, ParamString, StartInString: string; +begin + {$ifdef Apo7X64} + Result := true; + exit; + {$endif} + + ExecuteFile := ExtractFilePath(Application.ExeName) + 'chk64.exe'; + FillChar(SEInfo, SizeOf(SEInfo), 0); + SEInfo.cbSize := SizeOf(TShellExecuteInfo); + + with SEInfo do begin + fMask := SEE_MASK_NOCLOSEPROCESS; + Wnd := Application.Handle; + lpFile := PChar(ExecuteFile) ; + nShow := SW_SHOWNORMAL; + end; + + if ShellExecuteEx(@SEInfo) then + begin + repeat + Application.ProcessMessages; + GetExitCodeProcess(SEInfo.hProcess, ExitCode); + until (ExitCode <> STILL_ACTIVE) or Application.Terminated; + Result := (ExitCode = 0); + end else begin + Result := false; + end; +end; +*) + +function C_GetPathOf(filename: string; usex64: boolean): string; +begin + Result := ChaoticaPath + '\' + filename; +end; + +function C_SupportsDllPlugins(usex64: boolean): boolean; +const + re_root : string = '.*?'; + re_attrib : string = 'supports_dll_plugins="(.*?)"'; +var + xml_file : TStringList; + xml_text, attrib, value : string; +begin + if usex64 then begin + Result := false; + Exit; + end; + + xml_file := TStringList.Create; +// AV: for compatibility with new Chaotica versions + if not FileExists(ChaoticaPath + '\variation_compatibility.xml') then + begin + xml_file.Add('' + #13#10 + ''); + xml_file.SaveToFile(ChaoticaPath + '\variation_compatibility.xml'); + xml_file.Clear; + end; + xml_file.LoadFromFile(C_GetPathOf('variation_compatibility.xml', false)); + xml_text := xml_file.Text; + xml_file.Free; + + attrib := GetStringPart(xml_text, re_root, 1, 'supports_dll_plugins="false"'); + value := GetStringPart(attrib, re_attrib, 1, 'false'); + + Result := (value = 'true'); +end; + +function C_IsDllPluginBlacklisted(filename: string; usex64: boolean): boolean; +var + i: integer; + blacklist: TStringList; +begin + blacklist := TStringList.Create; + if not FileExists(ChaoticaPath + '\plugin_dll_blacklist.txt') then + begin + blacklist.Add('avMobius.dll'); + blacklist.Add('Cross.dll'); + blacklist.Add('Epispiral.dll'); + blacklist.Add('EpispiralVariationPlugin.dll'); + blacklist.Add('FlowerVariationPlugin.dll'); + blacklist.Add('Lissajous.dll'); + blacklist.Add('Mandelbrot.dll'); + blacklist.Add('ShapeVariationPlugin.dll'); + blacklist.Add('slinky.dll'); + blacklist.Add('Spirograph.dll'); + blacklist.Add('Square.dll'); + blacklist.Add('Stretchy Pants.dll'); + blacklist.Add('Waffle.dll'); + blacklist.SaveToFile(ChaoticaPath + '\plugin_dll_blacklist.txt'); + end; + + blacklist.LoadFromFile(C_GetPathOf('plugin_dll_blacklist.txt', usex64)); + + for i := 0 to blacklist.Count - 1 do begin + if LowerCase(filename) = LowerCase(blacklist.Strings[i]) then begin + Result := true; + blacklist.Free; + Exit; + end; + end; + + blacklist.Free; + Result := false; +end; + +function C_IsVariationNative(name: string; usex64: boolean): boolean; +const + re_root : string = '(.*?)'; + re_var : string = ''; +var + xml, var_name : string; + xml_file : TStringList; + find_var : TPerlRegEx; + found_var : boolean; +begin + + xml_file := TStringList.Create; + // AV: for compatibility with new Chaotica versions + if not FileExists(ChaoticaPath + '\variation_compatibility.xml') then + begin + xml_file.Add('' + #13#10 + ''); + xml_file.SaveToFile(ChaoticaPath + '\variation_compatibility.xml'); + xml_file.Clear; + end; + xml_file.LoadFromFile(C_GetPathOf('variation_compatibility.xml', false)); + xml := xml_file.Text; + xml_file.Free; + + find_var := TPerlRegEx.Create; + find_var.RegEx := re_var; + find_var.Options := [preSingleLine, preCaseless]; + find_var.Subject := GetStringPart(xml, re_root, 1, ''); + found_var := find_var.Match; + + while found_var do begin + var_name := String(find_var.Groups[1]); + found_var := find_var.MatchAgain; + + if LowerCase(name) = var_name then begin + find_var.Destroy; + Result := true; + Exit; + end; + end; + + find_var.Destroy; + Result := false; +end; + +function C_IsDllPluginInstalled(filename: string): boolean; +var + path : string; +begin + path := C_GetPathOf('plugins\' + filename, false); + Result := FileExists(path); +end; + +//////////////////////////////////////////////////////////////////// + +procedure C_InstallVariation(name: string); +var + filename: string; +begin + filename := GetFileNameOfVariation(name); + + if (filename = '') then Exit; + if C_IsDllPluginInstalled(filename) then Exit; + + CopyFile(PCHAR(filename), PCHAR(C_GetPathOf('plugins\' + + ExtractFileName(filename), false)), false); +end; + +procedure C_SyncDllPlugins; +var + src_dir: string; + tgt_dir: string; + + searchResult: TSearchRec; +begin + src_dir := PluginPath; + tgt_dir := C_GetPathOf('Plugins', false); + + if (not DirectoryExists(src_dir)) then Exit; + if (not DirectoryExists(tgt_dir)) then Exit; + //CreateDir(ChaoticaPath + '\Plugins'); + + // First clear all plugins on Chaotica side + if FindFirst(tgt_dir + '\*.dll', faAnyFile, searchResult) = 0 then + begin + repeat + DeleteFile(PCHAR(tgt_dir + '\' + searchResult.Name)) ; + until (FindNext(searchResult) <> 0); + SysUtils.FindClose(searchResult); + end; + + // Then copy all plugins from Apophysis to Chaotica + if FindFirst(src_dir + '*.dll', faAnyFile, searchResult) = 0 then + begin + repeat + if not C_IsDllPluginBlacklisted(searchResult.Name, false) + then CopyFile( + PCHAR(src_dir + '\' + searchResult.Name), + PCHAR(tgt_dir + '\' + searchResult.Name), + false); + until (FindNext(searchResult) <> 0); + SysUtils.FindClose(searchResult); + end; +end; + +procedure C_ExecuteChaotica(flamexml: string; plugins: TStringList; usex64: boolean); +var + i: integer; + name, fname: string; + fails: TStringList; + txt: TStringList; + fin_usex64: boolean; +begin + fails := TStringList.Create; + + {$ifdef Apo7X64} + fin_usex64 := true; + {$else} + fin_usex64 := usex64 and CheckX64; // currently useless... + for i := 0 to plugins.Count - 1 do begin + name := GetFileNameOfVariation(plugins.Strings[i]); + if (name = '') then name := plugins.Strings[i]; + fin_usex64 := fin_usex64 and C_IsVariationNative(name, usex64); + end; + + for i := 0 to plugins.Count - 1 do begin + name := GetFileNameOfVariation(plugins.Strings[i]); + if (name = '') then name := plugins.Strings[i]; // assume built-in + + if not C_IsVariationNative(name, fin_usex64) then begin // not native -> try install + if C_SupportsDllPlugins(fin_usex64) then // dll unsupported -> fail + fails.Add(plugins.Strings[i]) + else if C_IsDllPluginBlacklisted(name, fin_usex64) then // dll supported and blacklisted -> fail + fails.Add(plugins.Strings[i]); + //else C_InstallVariation(plugins.Strings[i]); // dll supported and not blacklisted -> install + // ^^^ this is done on Apophysis startup now! + end; + end; + {$endif} + + name := C_GetPathOf('chaotica.exe', fin_usex64); + if (not FileExists(name)) then begin + messagebox(0, PCHAR(TextByKey('main-status-nochaotica')), + PCHAR('Apophysis AV'), MB_ICONHAND); + Exit; + end; + + if (fails.Count > 0) then begin + messagebox(0, PCHAR(TextByKey('main-status-oldchaotica')), + PCHAR('Apophysis AV'), MB_ICONHAND or MB_OK); + end; + + // TODO: add directory cleaning + fname := GetEnvironmentVariable('TEMP') + '\chaotica_export.flame'; + txt := TStringList.Create; + + txt.Text := flamexml; + txt.SaveToFile(fname); + + txt.Free; + fails.Free; + + //if fin_usex64 then MessageBox(0, PCHAR('DBG:x64'), PCHAR(''), MB_OK) + //else MessageBox(0, PCHAR('DBG:x86'), PCHAR(''), MB_OK) ; + + ShellExecute(application.handle, PChar('open'), pchar(name), + PChar('"' + fname + '"'), PChar(ExtractFilePath(name)), SW_SHOWNORMAL); +end; + +end. diff --git a/Core/Global.pas b/Core/Global.pas new file mode 100644 index 0000000..8d37eff --- /dev/null +++ b/Core/Global.pas @@ -0,0 +1,764 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit Global; + +interface + +uses + Windows, SysUtils, Classes, SyncObjs, Controls, Graphics, Math, + cmap, ControlPoint, Xform, CommDlg; + +type + EFormatInvalid = class(Exception); + // AV: chanded the name to avoid conflicts with XForm + TMatrix2 = array[0..1, 0..1] of double; + +{ Weight manipulation } +{ Triangle transformations } +function triangle_area(t: TTriangle): double; +function transform_affine(const t: TTriangle; const Triangles: TTriangles): boolean; +function line_dist(x, y, x1, y1, x2, y2: double): double; +function dist(x1, y1, x2, y2: double): double; +procedure MultMatrix(var s: TMatrix2; const m: TMatrix2); +{ Parsing functions } +function GetVal(token: string): string; +function ReplaceTabs(str: string): string; +{ Palette and gradient functions } +//function GetGradient(FileName, Entry: string): string; +{ Misc } +function det(a, b, c, d: double): double; +function solve3(x1, x2, x1h, y1, y2, y1h, z1, z2, z1h: double; + var a, b, e: double): double; +function OpenSaveFileDialog(Parent: TWinControl; + const DefExt, + Filter, + InitialDir, + Title: string; + var FileName: string; + MustExist, + OverwritePrompt, + NoChangeDir, + DoOpen: Boolean): Boolean; +procedure LoadThumbnailPlaceholder(ThumbnailSize : integer); +function GetEnvVarValue(const VarName: string): string; +function Round6(x: double): double; +function MiddleColor(const clOne, clTwo: TColor): TColor; // AV +function CheckX64: Boolean; // AV + +const + APP_NAME: string = 'Apophysis AV'; + APP_VERSION: string = 'Phoenix Edition'; + {$ifdef Apo7X64} + APP_BUILD: string = ' - 64 bit'; + {$else} + APP_BUILD: string = ' - 32 bit'; + {$endif} + MAX_TRANSFORMS: integer = 100; + prefilter_white: integer = 1024; + eps: double = 1E-10; + White_level = 200; + FT_BMP = 1; FT_PNG = 2; FT_JPG = 3; + + //clyellow1 = TColor($17FCFF); + //clplum2 = TColor($ECA9E6); + //clSlateGray = TColor($837365); +const + crEditArrow = 20; + crEditMove = 21; + crEditRotate = 22; + crEditScale = 23; + +const + SingleBuffer : boolean = + {$ifdef Apo7X64} + false + {$else} + true + {$endif}; + +var + MainSeed: integer; + MainTriangles: TTriangles; // ControlPoint.TTriangles; + Transforms: integer; // Count of Tranforms + EnableFinalXform: boolean; + AppPath: string; // Path of application file + OpenFile: string; // Name of currently open file + CanDrawOnResize: boolean; + PreserveWeights: boolean; + AlwaysCreateBlankFlame : boolean; + // StartupCheckForUpdates : boolean; + TBWidth1 : integer; + TBWidth2 : integer; + TBWidth3 : integer; + TBWidth4 : integer; + TBWidth5 : integer; + ThumbnailPlaceholder : TBitmap; + WarnOnMissingPlugin : boolean; + EmbedThumbnails : boolean; + RandomizeTemplates: boolean; + LanguageFile : string; + AvailableLanguages : TStringList; + PluginPath : string; + + // AV: GUI Theme Stuff + CurrentStyle: string; + // theme-aware system colors + WinColor, BrightColor, MidColor, TextColor: TColor; + IsDarkTheme, IsLightMenu: boolean; + + { UPR Options } + + UPRSampleDensity: integer; + UPRFilterRadius: double; + UPROversample: integer; + UPRAdjustDensity: boolean; + UPRColoringIdent: string; + UPRColoringFile: string; + UPRFormulaIdent: string; + UPRFormulaFile: string; + UPRWidth: Integer; + UPRHeight: Integer; + ImageFolder: string; + UPRPath: string; // Name and folder of last UPR file + cmap_index: integer; // Index to current gradient + Variation: TVariation; // Current variation // ControlPoint.TVariation; + NumTries, TryLength: integer; // Settings for smooth palette + SmoothPaletteFile: string; + + { Editor } + + UseFlameBackground, UseTransformColors: boolean; + HelpersEnabled: boolean; + EditorBkgColor, ReferenceTriangleColor: integer; + GridColor1, GridColor2, HelpersColor, FlipColor: integer; + ExtEditEnabled, TransformAxisLock, RebuildXaosLinks: boolean; + ShowAllXforms: boolean; + EditorPreviewTransparency: integer; + EnableEditorPreview: boolean; + AllowResetCoefs, AllowResetLinear: boolean; // AV + + { Display } + + defSampleDensity, defPreviewDensity: Double; + defGamma, defBrightness, defVibrancy, defContrast, // AV + defFilterRadius, defGammaThreshold: Double; + defOversample: integer; + FUSE: byte; // AV: moved from ControlPoint and changed to variable + RhombTR, SquareTR, HexTR: single; // AV: tile radii + + { Render } + + renderDensity, renderFilterRadius: double; + renderOversample, renderWidth, renderHeight: integer; + // renderBitsPerSample: integer; + renderPath: string; + JPEGQuality: integer; + renderFileFormat: integer; + InternalBitsPerSample: integer; + EmbedFlame, SaveInFlame: boolean; // AV + + NrTreads: Integer; + UseNrThreads: byte; // AV: currently holds Nr CPU cores + + PNGTransparency: integer; + ShowTransparency: boolean; + + MainPreviewScale: double; + ExtendMainPreview: boolean; + + (* + StoreEXIF : boolean; + StoreParamsEXIF : boolean; + ExifAuthor : string; + *) + + { Defaults } + + LastOpenFile: string; + LastOpenFileEntry: integer; + RememberLastOpenFile: boolean; + UseSmallThumbnails: boolean; + ClassicListMode: boolean; + ConfirmDelete: boolean; // Flag confirmation of entry deletion + OldPaletteFormat: boolean; + ConfirmExit: boolean; + ConfirmStopRender: boolean; + ConfirmClearScript: boolean; + SavePath, SmoothPalettePath: string; + RandomPrefix, RandomDate: string; + RandomIndex: integer; + FlameFile, GradientFile, GradientEntry, FlameEntry: string; + ParamFolder: string; + prevLowQuality, prevMediumQuality, prevHighQuality: double; + defSmoothPaletteFile: string; + BrowserPath: string; // Stored path of browser open dialog + EditPrevQual, MutatePrevQual, AdjustPrevQual: byte; // Integer; + ThumbPrevQual: byte; // AV + randMinTransforms, randMaxTransforms: integer; + mutantMinTransforms, mutantMaxTransforms: integer; + KeepBackground: boolean; + RandBackColor: integer; // AV + randGradient: Integer; + randGradientFile: string; + randColorBlend: byte; // AV + EqualStripes: boolean; + defFlameFile: string; + defScriptFile: string; // AV + SetEngLayout: boolean; // AV + ScreenShotPath: string; // AV + AutoSaveXML, ApplyFlatten: boolean; // AV + + PlaySoundOnRenderComplete: boolean; + RenderCompleteSoundFile: string; + + SaveIncompleteRenders: boolean; + ShowRenderStats, ShowRenderImage: boolean; + LowerRenderPriority: boolean; + + SymmetryType: integer; + SymmetryOrder: integer; + SymmetryNVars: integer; + Variations: array of boolean; + FavouriteVariations: array of boolean; + + MainForm_RotationMode: byte; // integer; + PreserveQuality: boolean; + FlameEnumMode: byte; // AV + + { For random gradients } + + MinNodes, MaxNodes, MinHue, MaxHue, MinSat, MaxSat, MinLum, MaxLum: integer; + //ReferenceMode: integer; + BatchSize: Integer; + // Compatibility: integer; //0 = original, 1 = Drave's + Favorites: TStringList; + Script: string; + ScriptPath: string; + // SheepServer, SheepNick, SheepURL, SheepPW, + flam3Path, helpPath: string; + ExportBatches, ExportOversample, ExportWidth, ExportHeight, ExportFileFormat: Integer; + ExportFilter, ExportDensity: Double; + ExportEstimator, ExportEstimatorMin, ExportEstimatorCurve: double; + ExportJitters: integer; + ExportGammaTreshold: double; + OpenFileType: TFileType; +// ResizeOnLoad: Boolean; + ShowProgress: Boolean; + defLibrary: string; + LimitVibrancy: Boolean; + DefaultPalette: TColorMap; + + ChaoticaPath: string; + UseX64IfPossible: boolean; + + AutoOpenLog: Boolean; + AutoSaveEnabled: Boolean; + AutoSaveFreq: integer; + AutoSavePath: string; + + LineCenterColor : integer; + LineThirdsColor : integer; + LineGRColor : integer; + EnableGuides : boolean; + +implementation + +function GetEnvVarValue(const VarName: string): string; +var + BufSize: Integer; // buffer size required for value +begin + // Get required buffer size (inc. terminal #0) + BufSize := GetEnvironmentVariable( + PChar(VarName), nil, 0); + if BufSize > 0 then + begin + // Read env var value into result string + SetLength(Result, BufSize - 1); + GetEnvironmentVariable(PChar(VarName), + PChar(Result), BufSize); + end + else + // No such environment variable + Result := ''; +end; + +procedure LoadThumbnailPlaceholder(ThumbnailSize : integer); +var + placeholderIcon: TBitmap; +const + pi_width = 48; + pi_height = 48; +begin + placeholderIcon := TBitmap.Create; + placeholderIcon.Handle := LoadBitmap(hInstance, 'THUMB_PLACEHOLDER'); + // AV: replaced a local variable by the global one + ThumbnailPlaceholder.PixelFormat := pf32bit; + ThumbnailPlaceholder.HandleType := bmDIB; + ThumbnailPlaceholder.Width := ThumbnailSize; + ThumbnailPlaceholder.Height := ThumbnailSize; + + with ThumbnailPlaceholder.Canvas do begin + Brush.Color := $000000; + FillRect(Rect(0, 0, ThumbnailPlaceholder.Width, ThumbnailPlaceholder.Height)); + Draw(round(ThumbnailSize / 2 - pi_width / 2), round(ThumbnailSize / 2 - pi_height / 2), placeholderIcon); + end; + + placeholderIcon.Free; +end; + +function MiddleColor(const clOne, clTwo: TColor): TColor; // AV +begin + Result := (((clOne and $ff) + (clTwo and $ff)) shr 1 ) + + ((((clOne shr 8) and $ff) + ((clTwo shr 8) and $ff)) shr 1 ) shl 8 + + ((((clOne shr 16) and $ff) + ((clTwo shr 16) and $ff)) shr 1 ) shl 16; +end; + +{ IFS } + +function det(a, b, c, d: double): double; +begin + Result := (a * d - b * c); +end; + +function Round6(x: double): double; +// Really ugly, but it works +begin + // --Z-- this is ridiculous: + // Result := StrToFloat(Format('%.6f', [x])); + // and yes, this is REALLY ugly :-\ + Result := RoundTo(x, -6); +end; + +procedure MultMatrix(var s: TMatrix2; const m: TMatrix2); // AV: moved from Main +var + a, b, c, d, e, f, g, h: double; +begin + a := s[0, 0]; + b := s[0, 1]; + c := s[1, 0]; + d := s[1, 1]; + e := m[0, 0]; + f := m[0, 1]; + g := m[1, 0]; + h := m[1, 1]; +{ + [a, b][e ,f] [a*e+b*g, a*f+b*h] + [ ][ ] = [ ] + [c, d][g, h] [c*e+d*g, c*f+d*h] +} + s[0, 0] := a * e + b * g; + s[0, 1] := a * f + b * h; + s[1, 0] := c * e + d * g; + s[1, 1] := c * f + d * h; +end; + +function solve3(x1, x2, x1h, y1, y2, y1h, z1, z2, z1h: double; + var a, b, e: double): double; +var + det1: double; +begin + det1 := x1 * det(y2, 1.0, z2, 1.0) - x2 * det(y1, 1.0, z1, 1.0) + + 1 * det(y1, y2, z1, z2); + if (det1 = 0.0) then + begin + Result := det1; + EXIT; + end + else + begin + a := (x1h * det(y2, 1.0, z2, 1.0) - x2 * det(y1h, 1.0, z1h, 1.0) + + 1 * det(y1h, y2, z1h, z2)) / det1; + b := (x1 * det(y1h, 1.0, z1h, 1.0) - x1h * det(y1, 1.0, z1, 1.0) + + 1 * det(y1, y1h, z1, z1h)) / det1; + e := (x1 * det(y2, y1h, z2, z1h) - x2 * det(y1, y1h, z1, z1h) + + x1h * det(y1, y2, z1, z2)) / det1; + a := Round6(a); + b := Round6(b); + e := Round6(e); + Result := det1; + end; +end; + +function dist(x1, y1, x2, y2: double): double; +//var +// d2: double; +begin +(* + { From FDesign source + { float pt_pt_distance(float x1, float y1, float x2, float y2) } + d2 := (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2); + if (d2 = 0.0) then + begin + Result := 0.0; + exit; + end + else + Result := sqrt(d2); +*) + + // --Z-- This is just amazing... :-\ + // Someone needed an 'FDesign source' - to compute distance between two points??!? + + Result := Hypot(x2-x1, y2-y1); +end; + +function line_dist(x, y, x1, y1, x2, y2: double): double; +var + a, b, e, c: double; +begin + if ((x = x1) and (y = y1)) then + a := 0.0 + else + a := sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1)); + if ((x = x2) and (y = y2)) then + b := 0.0 + else + b := sqrt((x - x2) * (x - x2) + (y - y2) * (y - y2)); + if ((x1 = x2) and (y1 = y2)) then + e := 0.0 + else + e := sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); + if ((a * a + e * e) < (b * b)) then + Result := a + else if ((b * b + e * e) < (a * a)) then + Result := b + else if (e <> 0.0) then + begin + c := (b * b - a * a - e * e) / (-2 * e); + if ((a * a - c * c) < 0.0) then + Result := 0.0 + else + Result := sqrt(a * a - c * c); + end + else + Result := a; +end; + +function transform_affine(const t: TTriangle; const Triangles: TTriangles): boolean; +var + ra, rb, rc, a, b, c: double; +begin + Result := True; + ra := dist(Triangles[-1].y[0], Triangles[-1].x[0], + Triangles[-1].y[1], Triangles[-1].x[1]); + rb := dist(Triangles[-1].y[1], Triangles[-1].x[1], + Triangles[-1].y[2], Triangles[-1].x[2]); + rc := dist(Triangles[-1].y[2], Triangles[-1].x[2], + Triangles[-1].y[0], Triangles[-1].x[0]); + a := dist(t.y[0], t.x[0], t.y[1], t.x[1]); + b := dist(t.y[1], t.x[1], t.y[2], t.x[2]); + c := dist(t.y[2], t.x[2], t.y[0], t.x[0]); + if (a > ra) then + Result := False + else if (b > rb) then + Result := False + else if (c > rc) then + Result := False + else if ((a = ra) and (b = rb) and (c = rc)) then + Result := False; +end; + +function triangle_area(t: TTriangle): double; +var + base, height: double; +begin + try + base := dist(t.x[0], t.y[0], t.x[1], t.y[1]); + height := line_dist(t.x[2], t.y[2], t.x[1], t.y[1], + t.x[0], t.y[0]); + if (base < 1.0) then + Result := height + else if (height < 1.0) then + Result := base + else + Result := 0.5 * base * height; + except on E: EMathError do + Result := 0; + end; +end; + +{ Parse } + +function GetVal(token: string): string; +var + p: integer; +begin + p := Pos('=', token); + Delete(Token, 1, p); + Result := Token; +end; + +function ReplaceTabs(str: string): string; +{Changes tab characters in a string to spaces} +var + i: integer; +begin + for i := 1 to Length(str) do + begin + if str[i] = #9 then + begin + Delete(str, i, 1); + Insert(#32, str, i); + end; + end; + Result := str; +end; + +(* +{ Palette and gradient functions } + +function RGBToColor(Pal: TMapPalette; index: integer): Tcolor; +begin + { Converts the RGB values from a palette index to the TColor type ... + could maybe change it to SHLs } + Result := (Pal.Blue[index] * 65536) + (Pal.Green[index] * 256) + + Pal.Red[index]; +end; + +procedure rgb2hsv(const rgb: array of double; out hsv: array of double); +var + maxval, minval: double; + del: double; +begin + Maxval := Max(rgb[0], Max(rgb[1], rgb[2])); + Minval := Min(rgb[0], Min(rgb[1], rgb[2])); + + hsv[2] := maxval; // v + + if (Maxval > 0) and (maxval <> minval) then begin + del := maxval - minval; + hsv[1] := del / Maxval; //s + + hsv[0] := 0; + if (rgb[0] > rgb[1]) and (rgb[0] > rgb[2]) then begin + hsv[0] := (rgb[1] - rgb[2]) / del; + end else if (rgb[1] > rgb[2]) then begin + hsv[0] := 2 + (rgb[2] - rgb[0]) / del; + end else begin + hsv[0] := 4 + (rgb[0] - rgb[1]) / del; + end; + + if hsv[0] < 0 then + hsv[0] := hsv[0] + 6; + + end else begin + hsv[0] := 0; + hsv[1] := 0; + end; +end; + +procedure hsv2rgb(const hsv: array of double; out rgb: array of double); +var + j: integer; + f, p, q, t, v: double; +begin + j := floor(hsv[0]); + f := hsv[0] - j; + v := hsv[2]; + p := hsv[2] * (1 - hsv[1]); + q := hsv[2] * (1 - hsv[1] * f); + t := hsv[2] * (1 - hsv[1] * (1 - f)); + + case j of + 0: begin rgb[0] := v; rgb[1] := t; rgb[2] := p; end; + 1: begin rgb[0] := q; rgb[1] := v; rgb[2] := p; end; + 2: begin rgb[0] := p; rgb[1] := v; rgb[2] := t; end; + 3: begin rgb[0] := p; rgb[1] := q; rgb[2] := v; end; + 4: begin rgb[0] := t; rgb[1] := p; rgb[2] := v; end; + 5: begin rgb[0] := v; rgb[1] := p; rgb[2] := t; end; + end; +end; + +function GetGradient(FileName, Entry: string): string; +var + FileStrings: TStringList; + GradStrings: TStringList; + i: integer; +begin + FileStrings := TStringList.Create; + GradStrings := TStringList.Create; + try + try + FileStrings.LoadFromFile(FileName); + for i := 0 to FileStrings.count - 1 do + if Pos(Entry + ' ', Trim(FileStrings[i])) = 1 then break; + GradStrings.Add(FileStrings[i]); + repeat + inc(i); + GradStrings.Add(FileStrings[i]); + until Pos('}', FileStrings[i]) <> 0; + GetGradient := GradStrings.Text; + except on exception do + Result := ''; + end; + finally + GradStrings.Free; + FileStrings.Free; + end; +end; +*) + +function CheckX64: Boolean; // AV +var + IsWow64Process: + function(hProcess: THandle; out Wow64Process: boolean): boolean; stdcall; + Wow64Process: boolean; +begin + IsWow64Process := GetProcAddress(GetModuleHandle('kernel32.dll'), 'IsWow64Process'); + + Wow64Process := False; + if Assigned(IsWow64Process) then + Wow64Process := IsWow64Process(GetCurrentProcess, Wow64Process) and Wow64Process; + + Result := Wow64Process; +end; + +function ReplaceStr(Str, SearchStr, ReplaceStr: string): string; +begin + while Pos(SearchStr, Str) <> 0 do + begin + Insert(ReplaceStr, Str, Pos(SearchStr, Str)); + system.Delete(Str, Pos(SearchStr, Str), Length(SearchStr)); + end; + Result := Str; +end; + +function SplitFilter(const fText: String; const fSep: Char; fTrim: Boolean=false; fQuotes: Boolean=false): TStringList; +var vI: Integer; + vBuffer: String; + vOn: Boolean; +begin + Result:= TStringList.Create; + vBuffer:=''; + vOn:=true; + for vI:=1 to Length(fText) do + begin + if (fQuotes and(fText[vI]=fSep)and vOn)or(Not(fQuotes) and (fText[vI]=fSep)) then + begin + if fTrim then vBuffer:=Trim(vBuffer); + if vBuffer='' then vBuffer:=fSep; // !!! e.g. split(',**',',')... + if vBuffer[1]=fSep then + vBuffer:=Copy(vBuffer,2,Length(vBuffer)); + Result.Add(vBuffer); + vBuffer:=''; + end; + if fQuotes then + begin + if fText[vI]='"' then + begin + vOn:=Not(vOn); + Continue; + end; + if (fText[vI]<>fSep)or((fText[vI]=fSep)and(vOn=false)) then + vBuffer:=vBuffer+fText[vI]; + end else + if fText[vI]<>fSep then + vBuffer:=vBuffer+fText[vI]; + end; + if vBuffer<>'' then + begin + if fTrim then vBuffer:=Trim(vBuffer); + Result.Add(vBuffer); + end; +end; + +function OpenSaveFileDialog(Parent: TWinControl; + const DefExt, + Filter, + InitialDir, + Title: string; + var FileName: string; + MustExist, + OverwritePrompt, + NoChangeDir, + DoOpen: Boolean): Boolean; +// uses commdlg +var + ofn: TOpenFileName; + szFile: array[0..260] of Char; + fa, fa2: TStringList; + h,i,j,k,c : integer; + cs, s : string; +begin + Result := False; + FillChar(ofn, SizeOf(TOpenFileName), 0); + with ofn do + begin + lStructSize := SizeOf(TOpenFileName); + hwndOwner := Parent.Handle; + lpstrFile := szFile; + nMaxFile := SizeOf(szFile); + if (Title <> '') then + lpstrTitle := PChar(Title); + if (InitialDir <> '') then + lpstrInitialDir := PChar(InitialDir); + StrPCopy(lpstrFile, FileName); + lpstrFilter := PChar(ReplaceStr(Filter, '|', #0)+#0#0); + fa := splitFilter(Filter, '|'); + + k := 0; + c := (fa.Count div 2); + for i := 0 to c - 1 do begin + j := 2 * i + 1; + cs := LowerCase(fa.Strings[j]); + fa2 := splitFilter(cs, ';'); + for h := 0 to fa2.Count - 1 do begin + cs := fa2.Strings[h]; + s := '*.' + LowerCase(DefExt); + if (cs = s) then k := i; + end; + fa2.Free; //AV: fixed multiple memory leaks! + end; + fa.Free; // AV: fixed memory leak! + + nFilterIndex := k + 1; + if DefExt <> '' then + lpstrDefExt := PChar(DefExt); + end; + + if MustExist then ofn.Flags := ofn.Flags or OFN_FILEMUSTEXIST; + if OverwritePrompt then ofn.Flags := ofn.Flags or OFN_OVERWRITEPROMPT; + if NoChangeDir then ofn.Flags := ofn.Flags or OFN_NOCHANGEDIR; + + if DoOpen then + begin + if GetOpenFileName(ofn) then + begin + Result := True; + FileName := StrPas(szFile); + end; + end + else + begin + if GetSaveFileName(ofn) then + begin + Result := True; + FileName := StrPas(szFile); + end; + end +end; // function OpenSaveFileDialog + +end. + diff --git a/Core/Translation.pas b/Core/Translation.pas new file mode 100644 index 0000000..8450110 --- /dev/null +++ b/Core/Translation.pas @@ -0,0 +1,1127 @@ +{ + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina +} + +unit Translation; + +interface + +uses Global, Classes, Forms, LibXmlParser, LibXmlComps, SysUtils, RegexHelper; + +procedure ListLanguages; +procedure LanguageInfo(path: string; var name, localName: string); +function LanguageAuthor(path: string): string; +procedure Add(key, value: string); +procedure LoadLanguage(path:string); +procedure LoadEnglish(); +function TextByKey(key:string):string; + +type + TParser = class + public + constructor Create; + destructor Destroy; override; // AV: added to clean up the memory + + procedure ListXmlScannerStartTag(Sender: TObject; TagName: string; Attributes: TAttrList); + procedure ListXmlScannerEndTag(Sender: TObject; TagName: string); + procedure ListXmlScannerEmptyTag(Sender: TObject; TagName: string; Attributes: TAttrList); + procedure ListXmlScannerContent(Sender: TObject; Content: string); + private + currentTagname: string; + parentTagnames: TStringList; + end; + + TKeyValuePair = class + public + key: string; + value: string; + end; + + TDictionary = array of TKeyValuePair; +var + language: TDictionary; + defaultlanguage: TDictionary; + tokenCount: integer; + ListXmlScanner: TEasyXmlScanner; + parser: TParser; + +implementation + +procedure ListLanguages; +var + searchResult: TSearchRec; + langpath: string; +begin + if FindFirst(ExtractFilePath(Application.ExeName) + 'Languages\*.xml', faAnyFile, searchResult) = 0 then + begin + repeat + AvailableLanguages.Add(ExtractFilePath(Application.ExeName) + 'Languages\' + searchResult.Name); + until (FindNext(searchResult) <> 0); + SysUtils.FindClose(searchResult); + end; +end; + +procedure LanguageInfo(path: string; var name, localName: string); +const + exp1 = '\stitle="([^"]*)"'; + exp2 = '\slocalized-title="([^"]*)"'; +var + langxml : string; + sl: TStringList; +begin + sl := TStringList.Create; + sl.LoadFromFile(path); + langxml := sl.Text; + sl.Destroy; + + name := GetStringPart(langxml, exp1, 1, ''); + localname := GetStringPart(langxml, exp2, 1, ''); +end; + +function LanguageAuthor(path: string): string; +const + exp = '\sauthor="([^"]*)"'; +var + langxml : string; + sl: TStringList; +begin + sl := TStringList.Create; + sl.LoadFromFile(path); + langxml := sl.Text; + sl.Destroy; + + Result := GetStringPart(langxml, exp, 1, ''); +end; + +procedure LoadEnglish(); +begin + //TODO: + //render-status-renderhibernated + + Add('common-ok', 'OK'); + Add('common-cancel', 'Cancel'); + Add('common-apply', 'Apply'); + Add('common-yes', 'Yes'); + Add('common-no', 'No'); + Add('common-lowquality', 'Low Quality'); + Add('common-mediumquality', 'Medium Quality'); + Add('common-highquality', 'High Quality'); + Add('common-copy', 'Copy'); + Add('common-paste', 'Paste'); + Add('common-cut', 'Cut'); + Add('common-delete', 'Delete'); + Add('common-rename', 'Rename'); + Add('common-undo', 'Undo'); + Add('common-redo', 'Redo'); + Add('common-width', 'Width'); + Add('common-height', 'Height'); + Add('common-size', 'Size'); + Add('common-pixels', 'Pixels'); + Add('common-keepaspect', 'Maintain aspect ratio'); + Add('common-destination', 'Destination'); + Add('common-filename', 'File name'); + Add('common-browse', 'Browse...'); + Add('common-quality', 'Quality'); + Add('common-filterradius', 'Filter Radius'); + Add('common-density', 'Density'); + Add('common-oversample', 'Oversample'); + Add('common-gamma', 'Gamma'); + Add('common-brightness', 'Brightness'); + Add('common-contrast', 'Contrast'); + Add('common-vibrancy', 'Vibrancy'); + Add('common-background', 'Background'); + Add('common-gammathreshold', 'Gamma Threshold'); + Add('common-start', 'Start'); + Add('common-pause', 'Pause'); + Add('common-resume', 'Resume'); + Add('common-close', 'Close'); + Add('common-clear', 'Clear'); + Add('common-enabled', 'Enabled'); + Add('common-disabled', 'Disabled'); + Add('common-minimum', 'Minimum'); + Add('common-maximum', 'Maximum'); + Add('common-resetlocation', 'Reset location'); + Add('common-openwav', 'Open the audiofile...'); + Add('common-genericopenfailure', 'Unable to open "%s".'); + Add('common-genericsavefailure', 'Unable to save "%s".'); + Add('common-genericcopyfailure', 'Cannot copy file.'); + Add('common-openpngerror1', 'Error loading flame parameters from the "%s" image.'); + Add('common-openpngerror2', 'Could not find flame parameters in the "%s" image.'); + Add('common-openpngerror3', 'Error reading flame parameters from the "%s" image.'); + Add('common-loaderror', 'Cannot load plugin from %s: variation "%s" already exists!'); + Add('common-loaderror1', 'There were problems with some of the plugins:'); + Add('common-noparamfile', 'The file does not exists.'); + Add('common-invalidformat', 'Invalid format.'); + Add('common-confirmexit', 'Do you really want to exit? All unsaved data will be lost!'); + Add('common-confirmdelete', 'Are you sure you want to permanently delete "%s"? '); + Add('common-confirmrename', 'After renaming "%s", all changes made to this flame can be lost. Do you want to continue?'); + Add('common-deletecurrent', 'All changes made to the current flame will be lost!'); + Add('common-dragpanelhint', 'Click and drag to change value'); + Add('common-trace-title', 'Trace log'); + Add('common-trace-main', 'Main'); + Add('common-trace-fullscreen', 'Fullscreen'); + Add('common-trace-notrace', 'No trace'); + Add('common-trace-minimal', 'Minimal trace'); + Add('common-trace-fulltrace', 'Full trace'); + Add('common-trace-pausing', 'Pausing render'); + Add('common-trace-resuming', 'Resuming render'); + Add('common-trace-terminating', 'Terminating render'); + Add('common-trace-stopping', 'Stopping render'); + Add('common-trace-saving', 'Saving image...'); + Add('common-trace-creating-simple', 'Creating image...'); + Add('common-trace-creating-detailed', 'Creating image with quality: %f...'); + Add('common-trace-rendering-oneslice', 'Rendering...'); + Add('common-trace-rendering-multipleslices', 'Rendering slice %d of %d...'); + Add('common-trace-allocating', 'Allocating %n Mb of memory...'); + Add('common-trace-notenoughmemory', 'ERROR: Not enough memory for this render!'); + Add('common-statistics-title-oneslice', 'Render Statistics:'); + Add('common-statistics-title-multipleslices', 'Render Statistics for the last slice:'); + Add('common-statistics-maxpossiblebits', 'Max possible bits: %2.3f'); + Add('common-statistics-maxred', 'Max Red: %2.3f bits'); + Add('common-statistics-maxgreen', 'Max Green: %2.3f bits'); + Add('common-statistics-maxblue', 'Max Blue: %2.3f bits'); + Add('common-statistics-maxcounter', 'Max Count: %2.3f bits'); + Add('common-statistics-pointhitratio', 'Point hit ratio: %2.2f%%'); + Add('common-statistics-averagespeed', 'Average speed: %n iterations per second'); + Add('common-statistics-purerenderingtime', 'Pure rendering time:'); + Add('common-seconds', 'second(s)'); + Add('common-minutes', 'minute(s)'); + Add('common-hours', 'hour(s)'); + Add('common-days', 'day(s)'); + Add('common-suspendtodisk', 'Suspend to disk'); + Add('common-resumefromdisk', 'Resume from disk'); + Add('common-filter-flamefiles', 'Apophysis Flame Library (*.flame;*.xml)'); + Add('common-filter-gradientfiles', 'Gradient files (*.gradient;*.ugr)'); + Add('common-filter-fractintfiles', 'Fractint maps (*.map)'); + Add('common-filter-uprfiles', 'UltraFractal parameters (*.upr)'); + Add('common-filter-templatefiles', 'Apophysis Template Library (*.template;*.flame)'); + Add('common-filter-undofiles', 'Apophysis Undo Parameters (*.undo;*.apo)'); + Add('common-filter-scriptfiles', 'Apophysis Script (*.aposcript;*.asc)'); + Add('common-filter-allimages', 'All images (*.bmp;*.dib;*.jpg;*.jpeg)'); + Add('common-filter-bitmap', 'Windows Bitmap (*.bmp;*.dib)'); + Add('common-filter-jpeg', 'JPEG (*.jpg;*.jpeg)'); + Add('common-filter-png', 'Portable Network Graphics (*.png)'); + Add('common-filter-allfiles', 'All files (*.*)'); + Add('common-open-apoimage', 'Import Apophysis parameters from the image...'); + Add('common-favscriptadded', 'The script "%s" was added to your favourites list.'); + Add('common-favscriptexists', 'The script "%s" already exists in your favourites list.'); + Add('common-screenshot-saved', 'The screenshot "%s" was successfully saved in "%s" directory.'); + Add('common-screenshot-error', 'Cannot save the screenshot.'); + Add('common-translation', 'translation contributed by:'); + Add('common-pluginlink', 'Apophysis Plugins (download)'); + Add('common-thirdparty', 'This application was created using:'); + Add('common-donate', 'Donate'); + Add('common-donatehint', 'If you really like Apophysis, please, donate a dime for its future development'); + Add('splash-loadingui', 'Loading user interface...'); + Add('splash-loadingsettings', 'Loading settings...'); + Add('splash-loadingplugins', 'Loading plugins...'); + Add('splash-initrenderer', 'Initializing renderer...'); + Add('splash-initcolormap', 'Initializing gradients...'); + Add('splash-initbatch', 'Creating fractal batch...'); + Add('splash-execstartupscript', 'Executing "autoexec.asc"...'); + Add('transitions-title', 'Transform Transitions'); + Add('transitions-matrix', 'Probability matrix'); + Add('transitions-transform', 'Transform:'); + Add('transitions-inpercents', ' Show probabilities in percents'); + Add('adjustment-title', 'Adjustment'); + Add('adjustment-common-depthblur', 'Depth Blur'); + Add('adjustment-common-pitch', 'Pitch'); + Add('adjustment-common-yaw', 'Yaw'); + Add('adjustment-common-roll', 'Roll'); + Add('adjustment-common-height', 'Height'); + Add('adjustment-common-perspective', 'Perspective'); + Add('adjustment-common-scale', 'Scale'); + Add('adjustment-hint-depthblur', 'Strength of blurring from edges'); + Add('adjustment-hint-pitch', 'Angle (in degrees) of rotation around X-axis'); + Add('adjustment-hint-yaw', 'Angle (in degrees) of rotation around Z-axis'); + Add('adjustment-hint-roll', 'Angle (in degrees) of rotation around Y-axis'); + Add('adjustment-hint-height', 'Height of the 3D-camera'); + Add('adjustment-hint-perspective', 'Strength of a perspective distortion'); + Add('adjustment-hint-scale', 'Scale factor for the flame'); + Add('adjustment-hint-resetzoom', 'Reset camera zooming without changing flame size and position'); // AV + Add('adjustment-tab-camera-title', 'Camera'); + Add('adjustment-tab-camera-zoom', 'Zoom'); + Add('adjustment-tab-camera-xpos', 'X-Position'); + Add('adjustment-tab-camera-ypos', 'Y-Position'); + Add('adjustment-tab-camera-rotation', 'Rotation'); + Add('adjustment-tab-camera-resetzoom', 'Reset zoom'); // AV + Add('adjustment-tab-rendering-title', 'Rendering'); + Add('adjustment-tab-rendering-istransparent', 'Transparent'); + Add('adjustment-tab-gradient-title', 'Gradient'); + Add('adjustment-tab-gradient-palettehint', 'Right-click for context menu, Double click to randomize, Drag to rotate gradient, Alt + Drag to choose the fragment, Ctrl + Drag to stretch the palette'); + Add('adjustment-tab-gradient-moderotate', 'Rotate'); + Add('adjustment-tab-gradient-modehue', 'Hue'); + Add('adjustment-tab-gradient-modesaturation', 'Saturation'); + Add('adjustment-tab-gradient-modeluminance', 'Luminance'); // AV + Add('adjustment-tab-gradient-modebrightness', 'Brightness'); + Add('adjustment-tab-gradient-modecontrast', 'Contrast'); + Add('adjustment-tab-gradient-modeblur', 'Blur'); + Add('adjustment-tab-gradient-modefrequency', 'Frequency'); + Add('adjustment-tab-gradient-preset', 'Preset'); + Add('adjustment-tab-gradient-reset', 'Reset'); + Add('adjustment-tab-gradient-current', 'Current'); + Add('adjustment-tab-gradient-start', 'Start'); + Add('adjustment-tab-gradient-last', 'Last'); + Add('adjustment-tab-gradient-modehint', 'Click for menu'); + Add('adjustment-tab-gradient-copyhint', 'Copy gradient to clipboard'); + Add('adjustment-tab-gradient-selectedhint', 'Change the selected color area'); + Add('adjustment-tab-gradient-pastehint', 'Paste gradient from clipboard'); + Add('adjustment-tab-gradient-presethint', 'Click to choose random preset'); + Add('adjustment-tab-size-title', 'Image size'); + Add('adjustment-tab-size-preset', 'Change the image size according to the preset'); + Add('adjustment-tab-size-savepreset', 'Save current size as a preset'); + Add('adjustment-tab-size-presets', 'Size presets'); + Add('adjustment-tab-size-resizemain', 'Resize main window'); + Add('adjustment-tab-size-custom', 'Custom'); + Add('adjustment-tab-size-ratio', 'Aspect ratio'); //AV + Add('adjustment-tab-size-output', 'Settings'); + Add('adjustment-tab-curves-title', 'Curves'); + Add('adjustment-tab-curves-reset', 'Reset'); + Add('adjustment-tab-curves-selected', 'Selected curve:'); + Add('adjustment-tab-curves-overall', 'Overall'); + Add('adjustment-tab-curves-red', 'Red'); + Add('adjustment-tab-curves-green', 'Green'); + Add('adjustment-tab-curves-blue', 'Blue'); + Add('adjustment-popup-quality-instantpreview', 'Instant preview'); + Add('adjustment-popup-gradient-randomize', 'Randomize'); + Add('adjustment-popup-gradient-adjustbyslider', 'Adjust colors using slider'); + Add('adjustment-popup-gradient-invert', 'Invert'); + Add('adjustment-popup-gradient-reverse', 'Reverse'); + Add('adjustment-popup-gradient-invertsel', 'Invert selected colors'); + Add('adjustment-popup-gradient-reversesel', 'Reverse fragment'); + Add('adjustment-popup-gradient-interprgb', 'Interpolate RGB values between end points'); + Add('adjustment-popup-gradient-interphsv', 'Interpolate HSV values between end points'); + Add('adjustment-popup-gradient-randomizesel', 'Randomize the selected color area'); + Add('adjustment-popup-gradient-setcolor', 'Set the color for the selected area...'); + Add('adjustment-popup-gradient-swaprgb', 'Swap RGB values...'); + Add('adjustment-popup-gradient-copysel', 'Copy color fragment'); + Add('adjustment-popup-gradient-pastesel', 'Paste color fragment'); + Add('adjustment-popup-gradient-mixcolors', 'Mix colors of copied and selected fragments '); + Add('adjustment-popup-gradient-grayscale', 'Greyscale'); + Add('adjustment-popup-gradient-sepia', 'Sepia'); + Add('adjustment-popup-gradient-removedark', 'Brighten dark areas'); + Add('adjustment-popup-gradient-symmetry', 'Add symmetry...'); + Add('adjustment-popup-gradient-flipleft', 'Flip the left half to the right'); + Add('adjustment-popup-gradient-flipright', 'Flip the right half to the left'); + Add('adjustment-popup-gradient-smoothize', 'Smoothize'); + Add('adjustment-popup-gradient-smoothizesel', 'Smoothize the selected color area'); + Add('adjustment-popup-gradient-smooth', 'Smooth Palette...'); + Add('adjustment-popup-gradient-browser', 'Gradient Browser...'); + Add('adjustment-popup-gradient-saveasugr', 'Save Gradient...'); + Add('adjustment-popup-gradient-saveasmap', 'Save as Map File...'); + Add('adjustment-popup-gradient-saveasdefault', 'Save as default'); + Add('adjustment-popup-gradient-adjustfragment', 'Adjust color fragment...'); + Add('editor-title', 'Transform Editor'); + Add('editor-common-transform', 'Transform:'); + Add('editor-common-name', 'Name:'); + Add('editor-common-weight', 'Weight:'); + Add('editor-common-finalxformlistitem', 'Final'); + Add('editor-common-fromprefix', 'from %d'); + Add('editor-common-toprefix', 'to %d'); + Add('editor-tab-variations-title', 'Variations'); + Add('editor-tab-variations-name', 'Name'); + Add('editor-tab-variations-value', 'Value'); + Add('editor-tab-variations-search', 'Search:'); // AV + Add('editor-tab-variations-order', 'Edit the Order...'); // AV + Add('editor-tab-variations-orderhint', 'Adjust the order of variations for the chosen transform'); // AV + Add('editor-tab-variations-togglehideunused', ' Hide unused variations'); + Add('editor-tab-variations-toggleshowall', ' Show all variations'); // AV + Add('editor-tab-variations-togglefavourites', ' Favourite variations'); // AV + Add('editor-tab-variables-title', 'Variables'); + Add('editor-tab-variables-name', 'Name'); + Add('editor-tab-variables-value', 'Value'); + Add('editor-tab-variables-toggleshowall', 'Show all variables'); + Add('editor-tab-variables-reset', 'Reset'); + Add('editor-tab-chaos-title', 'Xaos'); + Add('editor-tab-chaos-path', 'Path'); + Add('editor-tab-chaos-modifier', 'Weight modifier'); + Add('editor-tab-chaos-viewasto', 'View links as "to"'); + Add('editor-tab-chaos-viewasfrom', 'View links as "from"'); + Add('editor-tab-triangle-title', 'Triangle'); + Add('editor-tab-triangle-pivot', 'Pivot Point'); + Add('editor-tab-triangle-modelocal', 'Local'); + Add('editor-tab-triangle-modeworld', 'World'); + Add('editor-tab-triangle-tolocal', 'Toggle local (affine) pivot cooordinates'); + Add('editor-tab-triangle-toworld', 'Toggle world (cartesian) pivot cooordinates'); + Add('editor-tab-triangle-resetpivot', 'Reset pivot point'); + Add('editor-tab-triangle-pickpivot', 'Pick pivot point using mouse'); + Add('editor-tab-triangle-rotateleft', 'Rotate triangle counter-clockwise'); + Add('editor-tab-triangle-rotateright', 'Rotate triangle clockwise'); + Add('editor-tab-triangle-moveup', 'Move triangle up'); + Add('editor-tab-triangle-movedown', 'Move triangle down'); + Add('editor-tab-triangle-moveleft', 'Move triangle left'); + Add('editor-tab-triangle-moveright', 'Move triangle right'); + Add('editor-tab-triangle-scaledown', 'Scale triangle down'); + Add('editor-tab-triangle-scaleup', 'Scale triangle up'); + Add('editor-tab-triangle-autoweight', 'Auto-balance weights'); + Add('editor-tab-triangle-reflection', 'Reflection Axis'); + Add('editor-tab-triangle-fliptriangle', 'Flip triangle'); + Add('editor-tab-triangle-flipx', 'Set the X-axis as a reflection line'); + Add('editor-tab-triangle-flipy', 'Set the Y-axis as a reflection line'); + Add('editor-tab-triangle-flipxy', 'Set the main XY-diagonal as a reflection line'); + Add('editor-tab-triangle-hideline', 'Hide line'); + Add('editor-tab-triangle-showline', 'Show line'); + Add('editor-tab-triangle-showlinehint', 'Draw or hide the reflection axis for the selected triangle'); + Add('editor-tab-triangle-fliptrianglehint', 'Flip triangle through a line'); + Add('editor-tab-triangle-resetflip', 'Reset point coordinates to (0,0)'); + Add('editor-tab-triangle-transforms', 'Geometric Operations'); + Add('editor-tab-triangle-transformshint', ' Hotkey A - apply to all vectors, hotkey X - apply to OX-vector only, hotkey Y - apply to OY-vector only, hotkey O - apply to O-vector only'); + Add('editor-tab-triangle-coordinates', 'Coordinates'); + Add('editor-tab-triangle-menuhint', 'Adjust the transformation tools...'); + Add('editor-tab-triangle-pivot1x', 'Pivot point abscissa in the chosen coordinate system'); + Add('editor-tab-triangle-pivot1y', 'Pivot point ordinate in the chosen coordinate system'); + Add('editor-tab-triangle-pivot2x', 'Second point abscissa in the chosen coordinate system'); + Add('editor-tab-triangle-pivot2y', 'Second point ordinate in the chosen coordinate system'); + Add('editor-tab-transform-title', 'Transform'); + Add('editor-tab-transform-reset', 'Reset transform'); + Add('editor-tab-transform-resethint', 'Reset all vectors to default position'); + Add('editor-tab-transform-affine', 'Affine coefficients'); + Add('editor-tab-transform-postaffine', 'Post-affine coefficients'); + Add('editor-tab-transform-swapaffine', 'Swap matrices'); + Add('editor-tab-transform-swapaffinehint', 'Swap pre- and post-affine coefficients'); + Add('editor-tab-transform-conjugate', 'Conjugate'); + Add('editor-tab-transform-conjugatehint', 'Calculate the invert matrix and write the result into the second matrix'); + Add('editor-tab-transform-coordsystem', 'Coordinate system'); + Add('editor-tab-transform-rectangular', 'Rectangular'); + Add('editor-tab-transform-rectangularhint', 'Show vectors in rectangular (cartesian) coordinates'); + Add('editor-tab-transform-polar', 'Polar (deg)'); + Add('editor-tab-transform-polarhint', 'Show vector in polar coordinates'); + Add('editor-tab-transform-resetpost', 'Reset post transform'); + Add('editor-tab-transform-resetposthint', 'Reset all post-transform vectors to default position'); + Add('editor-tab-transform-autozscale', 'Auto-calculate pre_zscale'); + Add('editor-tab-transform-resetxhint', 'Reset vector X'); + Add('editor-tab-transform-resetyhint', 'Reset vector Y'); + Add('editor-tab-transform-resetohint', 'Reset vector O'); + Add('editor-tab-color-title', 'Colors'); + Add('editor-tab-color-transformcolor', 'Transform color'); + Add('editor-tab-color-colorspeed', 'Color speed'); + Add('editor-tab-color-opacity', 'Opacity'); + Add('editor-tab-color-directcolor', 'Direct color'); + Add('editor-tab-color-togglesolo', 'Solo'); + Add('editor-tab-color-togglesoloformat', 'Solo transform #%d'); + Add('editor-tab-color-varpreview', 'Variation preview'); + Add('editor-tab-color-previewrange', 'Range'); + Add('editor-tab-color-previewdepth', 'Depth'); + Add('editor-tab-color-previewdensity', 'Density'); + Add('editor-tab-color-previewrangehint', 'Area to which variations are applied'); + Add('editor-tab-color-previewdepthhint', 'Number of recursive calculations'); + Add('editor-tab-color-previewdensityhint', 'Frequency of the grid nodes'); + Add('editor-tab-color-preview', 'Preview'); + Add('editor-grid-type', 'Grid Type'); + Add('editor-grid-typehint', 'Coordinate system for the grid'); + Add('editor-grid-polar', 'Polar'); + Add('editor-grid-bipolar', 'Bipolar'); + Add('editor-grid-elliptic', 'Elliptic'); + Add('editor-grid-rectangular', 'Rectangular'); + Add('editor-toolbar-newflame', 'New blank flame'); + Add('editor-toolbar-newtransform', 'Add a new transform'); + Add('editor-toolbar-addlinkedtransform', 'Add linked post-transform'); + Add('editor-toolbar-addlinkedpretransform', 'Add linked pre-transform'); + Add('editor-toolbar-duplicatetransform', 'Duplicate transform'); + Add('editor-toolbar-removetransform', 'Remove the selected transform'); + Add('editor-toolbar-modeselect', 'Selection mode'); + Add('editor-toolbar-modemove', 'Movement mode'); + Add('editor-toolbar-moderotate', 'Rotation mode'); + Add('editor-toolbar-modescale', 'Scale mode'); + Add('editor-toolbar-toggleworldpivot', 'Toggle world pivot'); + Add('editor-toolbar-rotate90ccw', 'Rotate 90° counter-clockwise'); + Add('editor-toolbar-rotate90cw', 'Rotate 90° clockwise'); + Add('editor-toolbar-fliph', 'Flip transform horizontal'); + Add('editor-toolbar-flipv', 'Flip transform vertical'); + Add('editor-toolbar-togglevarpreview', 'Show variation preview'); + Add('editor-toolbar-toggleposttransform', 'Enable/edit affine post-transform'); + Add('editor-toolbar-togglefinaltransform', 'Enable final transform'); + Add('editor-toolbar-pihint', 'Insert math constant into the selected text field'); + Add('editor-toolbar-pimenu', 'Insert fraction of'); + Add('editor-toolbar-squareroots', 'Insert square root...'); + Add('editor-toolbar-squareroot', 'Square root of the number'); + Add('editor-toolbar-goldenratio', 'Insert Golden ratio'); + Add('editor-toolbar-invert', 'Invert the number'); + Add('editor-toolbar-square', 'Square the number'); + Add('editor-toolbar-multiply', 'Multiply by 2'); + Add('editor-toolbar-divide', 'Divide by 2'); + Add('editor-toolbar-calccos', 'Calculate cosine of the value'); + Add('editor-toolbar-calcsin', 'Calculate sine of the value'); + Add('editor-toolbar-calctan', 'Calculate tangent of the value'); + Add('editor-toolbar-usedegrees', 'Use degrees'); + Add('editor-toolbar-showchaos', 'Show chaotic transitions structure...'); + Add('editor-popup-panel-autozoom', 'Zoom automatically'); + Add('editor-popup-panel-toggleextendededit', 'Toggle extended edit mode'); + Add('editor-popup-panel-locktransformaxes', 'Lock transform axes'); + Add('editor-popup-panel-allfliph', 'Flip all horizontally'); + Add('editor-popup-panel-allflipv', 'Flip all vertically'); + Add('editor-popup-panel-allflipline', 'Flip all through a line'); + Add('editor-popup-quality-autoreset', 'Auto-reset location'); + Add('editor-popup-transform-resetposition', 'Reset position'); + Add('editor-popup-transform-resetrotation', 'Reset rotation'); + Add('editor-popup-transform-resetscale', 'Reset scale'); + Add('editor-popup-transform-resetflip', 'Reset reflection'); + Add('editor-popup-transform-copycoords', 'Copy triangle coordinates'); + Add('editor-popup-transform-pastecoords', 'Paste triangle coordinates'); + Add('editor-popup-transform-copywhole', 'Copy whole transform'); + Add('editor-popup-transform-pastewhole', 'Paste transform(s)'); + Add('editor-popup-transform-resetentiretriangle', 'Reset triangle'); + Add('editor-popup-chaos-rebuildlinks', 'Rebuild chaos links'); + Add('editor-popup-chaos-clearall', 'Clear all current modifiers (reset to zero)'); + Add('editor-popup-chaos-setall', 'Set all current modifiers to 1'); + Add('editor-popup-chaos-showmenu', 'More...'); + Add('editor-popup-chaos-random', 'Randomize all current modifiers'); + Add('editor-popup-chaos-normalize', 'Normalize transition matrix'); + Add('editor-popup-chaos-randomize', 'Randomize transition matrix'); + Add('editor-popup-chaos-reset', 'Reset transition matrix'); + Add('editor-popup-chaos-clearabove', 'Clear modifiers above selected'); + Add('editor-popup-chaos-clearbelow', 'Clear modifiers below selected'); + Add('editor-popup-chaos-container', 'Add container transform'); + Add('editor-popup-chaos-keepweight', 'Inherit original weights'); + Add('editor-popup-chaos-invert', 'Invert current settings'); + Add('editor-popup-triangle-rotateall', 'Rotate all vectors'); + Add('editor-popup-triangle-rotatex', 'Rotate only X-axis'); + Add('editor-popup-triangle-rotatey', 'Rotate only Y-axis'); + Add('editor-popup-triangle-rotateo', 'Rotate only O-vector'); + Add('editor-popup-triangle-scaleall', 'Scale all vectors'); + Add('editor-popup-triangle-scalex', 'Scale only X-axis'); + Add('editor-popup-triangle-scaley', 'Scale only Y-axis'); + Add('editor-popup-triangle-scaleo', 'Scale only O-vector'); + Add('editor-popup-triangle-squaregrid', 'Move along a square lattice'); + Add('editor-popup-triangle-hexgrid', 'Move along a triangular lattice'); + Add('editor-popup-triangle-invertstep', 'Invert current Move step'); + Add('editor-popup-triangle-arcsin', 'Calculate arcsin of the scale factor'); + Add('editor-popup-triangle-display', 'Display internally modified values'); + // Add('editor-status-zoomformat', 'Zoom: %f'); + Add('editor-status-xformat', 'X: %f'); + Add('editor-status-yformat', 'Y: %f'); + Add('editor-status-rotateformat', 'Rotate: %3.2f° Inner angle: %3.2f°'); + Add('editor-status-rotateformat2', 'Rotate: %3.2f° Local axis: %3.2f°'); + Add('editor-status-rotateformat3', 'Rotate: %3.2f°'); + Add('editor-status-scaleformat', 'Distance: %3.3f Scale: %3.2f%%'); + Add('editor-status-scaleformat2', 'Scale: %3.2f%%'); + Add('editor-status-moveformat', 'Move: %3.3f ; %3.3f'); + Add('editor-status-moveformat2', 'Move: %3.3f ; %3.3f'); + Add('editor-status-transformformat', 'Transform #%d'); + Add('editor-status-zoomformat', 'Zoom: %f'); + Add('editor-status-angle', 'Current angle'); // AV + Add('editor-status-selecton', 'Select ON'); + Add('editor-status-selectoff', 'Select OFF'); + Add('editor-status-warnscale', 'Current scale factor is out of range! The value inserted into the "Scale" field must be less than 100 percents.'); + Add('editor-status-warninvert', 'The affine determinant is too small for this operation.'); + Add('editor-status-nonumfield', 'No active numeric field found. Please select a numeric field before opening the menu.'); + Add('export-title', 'Export to flam3'); + Add('export-paramoptions-title', 'Parameter options'); + Add('export-paramoptions-bufferdepth', 'Buffer depth'); + Add('export-paramoptions-strips', 'Strips'); + Add('export-paramoptions-estimatorradius', 'DE radius'); + Add('export-paramoptions-estimatorcurve', 'DE curve'); + Add('export-paramoptions-estimatormin', 'DE minimum'); + Add('export-paramoptions-dorender', 'Render'); + Add('export-paramoptions-warningtitle', 'WARNING'); + Add('export-paramoptions-warningtext', 'Fractals created with this version of Apophysis are not supported by flam3! To render 2D-only fractals, download the latest version of flam3 from'); + Add('favscripts-title', 'Favourite scripts'); + Add('favscripts-hint', 'User''s Favourite scripts list'); + Add('favscripts-add', 'Add'); + Add('favscripts-remove', 'Remove'); + Add('favscripts-moveup', 'Move up'); + Add('favscripts-movedown', 'Move down'); + Add('fullscreen-popup-rendermore', 'Render more'); + Add('fullscreen-popup-stoprender', 'Stop render'); + Add('gradientbrowser-title', 'Gradient Browser'); + Add('selectcolors-title', 'Palette Interval Selection'); + Add('selectcolors-start', 'Start palette index:'); + Add('selectcolors-last', 'Last palette index:'); + Add('postprocess-title', 'Post-process render'); + Add('postprocess-save', 'Save'); + Add('postprocess-fittowindow', 'Fit to window'); + Add('render-title', 'Render flame'); + Add('render-common-gotofolder', 'Open target folder...'); + Add('render-tab-settings-title', 'Settings'); + Add('render-tab-output-title', 'Output'); + Add('render-presets-title', 'Presets'); + Add('render-presets-save', 'Save current preset'); + Add('render-presets-delete', 'Delete the selected preset'); + Add('render-prestatus-saveerror-preset', 'Cannot save preset settings.'); + Add('render-resourceusage-title', 'Resource usage'); + Add('render-resourceusage-infotext', 'The render process will use %u MB of %u MB available physical memory'); + Add('render-resourceusage-infotext2', 'Apophysis will try to use %u processor cores (%u available) - change this in the options'); + Add('render-resourceusage-limit', 'Memory limit'); + Add('render-resourceusage-nolimit', 'No limit'); + Add('render-resourceusage-bufferdepth', 'Buffer depth'); + Add('render-output-title', 'Output options'); + Add('render-output-saveparams1', 'Save parameters in the flame-file'); + Add('render-output-saveparams2', 'Save parameters in the PNG-image'); + Add('render-completion-title', 'Completion options'); + Add('render-completion-postprocess', 'Post-process after rendering'); + Add('render-completion-shutdown', 'Shut down the computer after rendering'); + Add('render-completion-playsound', 'Play sound after rendering'); + Add('render-completion-saveincomplete', 'Save incomplete renders'); + Add('render-status-rendererror-log', 'Rendering failed!'); + Add('render-status-rendererror-message', 'Error while rendering!'); + Add('render-status-saveerror-log', 'Error saving image!'); + Add('render-status-saveerror-message1', 'An error occured while saving the image:'); + Add('render-status-saveerror-message2', 'Check your free disk space and try again.'); + Add('render-status-totaltime', 'Total time:'); + Add('render-status-renderterminated', 'Rendering terminated!'); + Add('render-status-renderhibernated', 'Rendering paused and progress saved!'); + Add('render-status-elapsed', 'Elapsed'); + Add('render-status-remaining', 'Remaining'); + Add('render-status-slicestatus', 'Slice %d of %d'); + Add('render-status-notenoughmemory1', 'You do not have enough memory for this render. Do you want to continue anyway?'); + Add('render-status-notenoughmemory2', 'You do not have enough memory for this render. Please use a lower Maximum memory setting. Do you want to ignore this problem and continue?'); + Add('render-status-nofilename', 'Please enter a file name.'); + Add('render-status-fileexists-message1', '"%s" already exists'); + Add('render-status-fileexists-message2', 'Do you want to replace it?'); + Add('render-status-pathdoesnotexist', 'The directory does not exist.'); + Add('render-status-invaliddensity', 'Invalid Sample Density value'); + Add('render-status-invalidfilterradius', 'Invalid Filter Radius value'); + Add('render-status-invalidoversample', 'Invalid Oversample value'); + Add('render-status-invalidwidth', 'Invalid image width'); + Add('render-status-invalidheight', 'Invalid image height'); + Add('render-status-maxmemorytoosmall', 'Maximum memory value is too small. Do you want to continue anyway?'); + Add('render-status-shuttingdownrender', 'Shutting down previous render...'); + Add('render-status-log-title', 'Rendering "%s"'); + Add('render-status-log-size', 'Size: %dx%d'); + Add('render-status-log-quality', 'Quality: %g'); + Add('render-status-log-oversampling', 'Oversample: %d, Filter: %g'); + Add('render-status-log-bufferdepth', 'Buffer depth: %s'); + Add('render-status-log-memorylimit', 'Memory limit: %d MB'); + Add('render-status-log-largepng-message1', '*** WARNING *** You have selected PNG format and an image size which exceeds 20 megapixels'); + Add('render-status-log-largepng-message2', 'PNG format with extreme high-resolution images is not recommended!'); + Add('render-status-log-largepng-message3', 'To avoid slowdown (and possible memory problems) use BMP file format instead.'); + Add('render-status-confirmstop', 'Do you want to stop the current render?'); + Add('render-status-dosnapshot', 'Do snapshot'); + Add('render-status-dosnapshothint', 'Save current state as a picture'); + Add('messages-title', 'Messages'); + Add('messages-openautomatically', 'Automatically open this window'); + Add('mutation-title', 'Mutation'); + Add('mutation-directions', 'Directions'); + Add('mutation-speed', 'Speed'); + Add('mutation-trend', 'Trend'); + Add('mutation-keepnumberoftransforms', 'Keep transform count'); + Add('mutation-randomtrend', 'Random'); + Add('mutation-maintainsymmetry', 'Maintain symmetry'); + Add('mutation-previous', 'Previous'); + Add('options-title', 'Settings '); + Add('options-selectplugins', 'Please, specify the plugin folder'); + Add('options-restartnotice', 'You must restart Apophysis AV to make your changes have effect.'); + Add('options-tab-general-title', 'General '); + Add('options-tab-general-language', 'Language file'); + Add('options-tab-general-multithreading', 'Multithreading '); + Add('options-tab-general-multithreading-off', 'Off '); + Add('options-tab-general-bufferdepth', 'Buffer depth '); + Add('options-tab-general-jpegquality', 'JPEG quality '); + Add('options-tab-general-pngtransparency', 'PNG transparency '); + Add('options-tab-general-showextendedstatistics', 'Show extended render statistics '); + Add('options-tab-general-showrenderimage', 'Show the rendered image '); + Add('options-tab-general-confirmdelete', 'Confirm deleting flames '); + Add('options-tab-general-confirmexit', 'Confirm exit '); + Add('options-tab-general-confirmrenderstop', 'Confirm stop rendering '); + Add('options-tab-general-confirmclearscript', 'Confirm clear script '); + Add('options-tab-general-oldgradientformat', 'Use old gradient format '); + Add('options-tab-general-templaterandcolor', 'Randomize gradient for templates '); + Add('options-tab-general-alwaysblankflame', 'Disable templates '); + Add('options-tab-general-autosavepasted', 'Automatically save new and pasted flames '); + Add('options-tab-general-enablemissingpluginswarning', 'Warn on missing plugins '); + Add('options-tab-general-enablethumbnailembedding', 'Enable thumbnail embedding '); + Add('options-tab-general-setenglayout', 'Set English keyboard layout'); + Add('options-tab-general-rotatemode', 'Rotation mode '); + Add('options-tab-general-rotateimage', 'Rotate image '); + Add('options-tab-general-rotateframe', 'Rotate frame '); + Add('options-tab-general-zoommode', 'Zooming mode '); + Add('options-tab-general-preservequality', 'Preserve quality '); + Add('options-tab-general-preservespeed', 'Preserve speed '); + Add('options-tab-general-enummode', 'Enumerating mode '); + Add('options-tab-general-enum0', 'Script-compatible (zero-based) '); + Add('options-tab-general-enum1', 'Standart (start from 1) '); + Add('options-tab-general-guides', 'Guidelines '); + Add('options-tab-general-enableguides', 'Enable guides '); + Add('options-tab-general-guidecentercolor', 'Center '); + Add('options-tab-general-guidethirdscolor', 'Thirds '); + Add('options-tab-general-guidegoldenratiocolor', 'Golden ratio '); + //Add('options-tab-general-singleprecision', 'Use single-precision buffers '); + Add('options-tab-general-onrendercomplete', 'On render complete '); + Add('options-tab-general-playsound', 'Play sound '); + Add('options-tab-general-soundfile', 'Sound file: '); + Add('options-tab-general-playhint', 'Play'); + Add('options-tab-general-autoflatten', 'Apply flattening to old flames'); + Add('options-tab-general-pluginpath', 'Plugin folder '); + Add('options-tab-editor-title', 'Editor '); + Add('options-tab-editor-editorgraph', 'Graph '); + Add('options-tab-editor-editordefaults', 'Defaults '); + Add('options-tab-editor-usetransformcolor', 'Use transform color '); + Add('options-tab-editor-helperlines', 'Show helper lines '); + Add('options-tab-editor-alwaysshowbothtransformtypes', 'Always show both transform types '); + Add('options-tab-editor-backgroundcolor', 'Background '); + Add('options-tab-editor-gridcolors', 'Grid '); + Add('options-tab-editor-referencecolor', 'Reference '); + Add('options-tab-editor-helpercolors', 'Helpers '); + Add('options-tab-editor-extendededit', 'Extended edit mode '); + Add('options-tab-editor-locktransformaxes', 'Lock transform axes '); + Add('options-tab-editor-rebuildxaoslinks', 'Rebuild links after deleting'); + Add('options-tab-editor-enablepreview', 'Enable background preview'); + Add('options-tab-editor-previewtransparency', 'Transparency'); + Add('options-tab-editor-resetcoefs', 'Reset affine values by double-click'); + Add('options-tab-editor-resetlinear', 'Reset linear when other variation is set'); + Add('options-tab-display-title', 'Display '); + Add('options-tab-display-rendering', 'Rendering '); + Add('options-tab-display-previewdensity', 'Preview density '); + Add('options-tab-display-mainpreview', 'Main window preview '); + Add('options-tab-display-extendpreviewbuffer', 'Extend preview buffer '); + Add('options-tab-display-extenspreviewbufferlabel', 'Buffer extension '); + Add('options-tab-display-showtransparency', 'Show transparency '); + Add('options-tab-display-usesmallthumbs', 'Use small thumbnails (like Apophysis 2.09) '); + Add('options-tab-display-fuse', 'Skipped iterations'); + Add('options-tab-display-tileradius', 'Tile radius'); + Add('options-tab-random-title', 'Random '); + Add('options-tab-random-numberoftransforms', 'Number of transforms '); + Add('options-tab-random-mutationtransforms', 'Mutation transforms '); + Add('options-tab-random-randombatch', 'Random batch '); + Add('options-tab-random-forcedsymmetry', 'Forced symmetry '); + Add('options-tab-random-batchsize', 'Batch size '); + Add('options-tab-random-titleprefix', 'Title prefix '); + Add('options-tab-random-keepbackground', ' Keep the current background color'); + Add('options-tab-random-symtype', 'Type'); + Add('options-tab-random-symorder', 'Order'); + Add('options-tab-random-symlimit', 'Limit'); + Add('options-tab-random-type-none', 'None'); + Add('options-tab-random-type-bilateral', 'Bilateral'); + Add('options-tab-random-type-rotational', 'Rotational'); + Add('options-tab-random-type-dihedral', 'Dihedral'); + Add('options-tab-random-onrandom', 'On random flame use... '); + Add('options-tab-random-userandom', 'Random preset gradient'); + Add('options-tab-random-usedefault', 'Default gradient '); + Add('options-tab-random-usecurrent', 'Current gradient '); + Add('options-tab-random-randomcalculated', 'Random gradient '); + Add('options-tab-random-randomfromfile', 'Random from file '); + Add('options-tab-random-filetouse', 'Gradient file to use '); + Add('options-tab-variations-title', 'Variations '); + Add('options-tab-variations-random', 'Random choise '); + Add('options-tab-variations-faves', 'Favourites '); + Add('options-tab-variations-setall', 'Set all '); + Add('options-tab-variations-clearall', 'Clear all '); + Add('options-tab-variations-invert', 'Invert selection'); + Add('options-tab-gradient-title', 'Gradient '); + Add('options-tab-gradient-numberofnodes', 'Number of nodes '); + Add('options-tab-gradient-smoothpalette', 'Smooth palette '); + Add('options-tab-gradient-huebetween', 'Hue range '); + Add('options-tab-gradient-satbetween', 'Saturation range '); + Add('options-tab-gradient-lumbetween', 'Luminance range '); + Add('options-tab-gradient-numtries', 'Number of tries '); + Add('options-tab-gradient-trylength', 'Try length '); + Add('options-tab-gradient-colorblend', 'Color blending type '); + Add('options-tab-gradient-rgbblend', 'RGB blend '); + Add('options-tab-gradient-hsvblend', 'HSV blend '); + Add('options-tab-gradient-noblend', 'No blending '); + Add('options-tab-gradient-equalstripes', 'Use equal width of gradient color stripes'); + Add('options-tab-upr-title', 'UltraFractal '); + Add('options-tab-upr-paramdefaults', 'Parameter defaults '); + Add('options-tab-upr-coloralgorithm', 'Coloring algorithm '); + Add('options-tab-upr-uprsize', 'Image size '); + Add('options-tab-upr-formula', 'Formula '); + Add('options-tab-upr-identifier', 'Identifier '); + Add('options-tab-upr-adjustdensity', 'Adjust sample density '); + Add('options-tab-environment-title', 'Environment'); + Add('options-tab-environment-defaultparams', 'Default parameters '); + Add('options-tab-environment-smoothpalette', 'Smooth palette '); + Add('options-tab-environment-functionlib', 'Scripting function library '); + Add('options-tab-environment-exportrenderer', 'Export renderer '); + Add('options-tab-environment-helpfile', 'Help file '); + Add('options-tab-environment-screenshots', 'Screenshot folder '); + Add('options-tab-environment-defaultscript', 'Default script file '); + Add('options-tab-environment-screenshotshint', 'Select a folder for Apophysis screenshots: '); + Add('options-tab-environment-rememberlastopen', 'Remember last open parameters '); + Add('options-tab-environment-autosave', 'Enable autosave '); + Add('options-tab-environment-savefrequency', 'Save frequency '); + Add('options-tab-environment-usex64chaotica', 'Use 64-bit version if possible'); + Add('preview-title', 'Preview'); + Add('preview-keepframe', 'Saving images with boarders'); + Add('preview-pause', 'Pause the animation'); + Add('preview-resume', 'Resume the animation'); + Add('save-title', 'Save'); + Add('save-name', 'Fractal name'); + Add('save-namepal', 'Palette name'); + Add('save-oldformat', 'Use old format'); + Add('save-newformat', 'Use new format'); + Add('save-type-parameters', 'Save Parameters'); + Add('save-type-allparameters', 'Save All Parameters'); + Add('save-type-template', 'Save Template'); + Add('save-type-gradient', 'Save Gradient'); + Add('save-type-exportupr', 'Export UPR'); + Add('save-status-notitle', 'No item name given.'); + Add('save-status-invalidfilename', 'Invalid file name.'); + Add('save-status-alreadyexists', '"%s" in "%s" already exists. Do you want to replace it?'); + Add('save-status-alreadyexists2', '"%s" already exists. Do you want to replace it?'); + Add('save-status-alreadyexists3', 'The flame "%s" already exists. Please, select another name.'); + Add('savepreset-title', 'Save preset'); + Add('savepreset-name', 'Name'); + Add('savepreset-notitle', 'No preset name given.'); + Add('script-title', 'Script Editor'); + Add('script-rendering', 'Rendering image "%s"...'); + Add('script-break', 'Break'); + Add('script-new', 'New script'); + Add('script-open', 'Open'); + Add('script-save', 'Save'); + Add('script-run', 'Run'); + Add('script-pause', 'Pause'); + Add('script-stop', 'Stop'); + Add('script-faves', 'Add to favourites'); + Add('script-line', 'Line'); + Add('script-position', 'Position'); + Add('script-confirmclear', 'Are you really want to delete the script? All unsaved changes will be lost!'); + Add('script-codeblocks', 'Show code blocks'); + Add('script-codeblock', 'Active code block renaming'); + Add('script-codeblockrename', 'Insert new caption: '); + Add('script-codeblockhints', 'Show code blocks in hints'); + Add('script-commentout', 'Comment out the selection by...'); + Add('script-surround', 'Surround the selection by...'); + Add('script-clipboardview', 'Add code blocks from the clipboard'); + Add('script-codeblockhint', 'Select a block and drag it into the Script editor'); + Add('script-findreplace', 'Find and replace...'); + Add('script-textnotfound', 'The search is finished. The text is not found at the script.'); + Add('script-collapsecode', 'Collapse all blocks of code'); + Add('script-expandcode', 'Expand all blocks of code'); + Add('script-compileerror', 'Script: COMPILE ERROR'); + Add('script-runtimeerror', 'Script: RUNTIME ERROR'); + Add('script-status-default', 'Press Ctrl + "Space" for automathic code completion '); + Add('script-status-compileerror', 'Fail to run the script'); + Add('script-status-runtimeerror', 'Script execution failed'); + Add('script-status-break', 'Execution stopped by user.'); + Add('script-status-executing', 'Executing current script...'); + Add('script-status-stopped', 'Infinite loop was stopped'); + Add('script-status-syntaxerror', 'Syntax error'); + Add('script-status-noclassmember', 'Unknown member identifier'); + Add('script-status-noidentifier', 'Unknown identifier or variable is not declared'); + Add('script-status-constassign', 'Cannot assign a value to constant'); + Add('script-status-varnotarray', 'Variable is not an array'); + Add('script-status-noformfile', 'Cannot find form file'); + Add('script-status-unknownmethod', 'Unknown method or routine'); + Add('script-status-toomanyparams', 'Too many parameters for method'); + Add('script-status-notenoughparams', 'Not enough actual parameters for method'); + Add('script-status-expectparams', 'Expected # parameters'); + Add('script-status-expectvar', 'Method # expects variable reference'); + Add('script-status-notassign', 'Assign to method # is not allowed'); + Add('script-status-propnotfunc', 'Property # cannot be called as a method'); + Add('script-status-outofrange', 'Transform index is out of range!'); + Add('script-status-varoutofrange', 'The index or parameter value is out of range.'); + Add('script-status-notransforms', 'Not enough transforms to perform the operation.'); + Add('script-status-toomanytransforms', 'Too many transforms to perform the operation.'); + Add('script-status-paused', 'Script execution is paused'); + Add('script-status-cancelrender', 'Render was cancelled by user.'); + Add('splash-loadingtext', 'Loading'); + Add('template-title', 'Templates'); + Add('template-filename', 'Source template file: '); + Add('main-common-title-lite', 'Lite Version'); + Add('main-common-title-t500', 'High-Memory Version'); + Add('main-common-randombatch', 'Random Batch'); + Add('main-menu-file-title', 'File'); + Add('main-menu-file-new', 'New'); + Add('main-menu-file-open', 'Open the flame...'); + Add('main-menu-file-loadpng', 'Load parameters from PNG...'); + Add('main-menu-file-loadpnghint', 'Open the PNG-image that containing flame parameters'); + Add('main-menu-file-restoreautosave', 'Restore last autosave'); + Add('main-menu-file-autosavehint', 'Open the last automatically saved fractal project'); + Add('main-menu-file-saveparams', 'Save parameters...'); + Add('main-menu-file-saveallparams', 'Save all parameters...'); + Add('main-menu-file-saveallhint', 'Save parameters of all fractals to a file'); + Add('main-menu-file-smoothpalette', 'Smooth palette...'); + Add('main-menu-file-smoothpalettehint', 'Create a smooth color gradient from an image'); + Add('main-menu-file-gradientbrowser', 'Gradient browser...'); + Add('main-menu-file-gradientbrowserhint', 'Browse saved fractal palettes libraries...'); + Add('main-menu-file-exportupr', 'Export UPR...'); + Add('main-menu-file-exportflame', 'Export to flam3...'); + Add('main-menu-file-exportchaotica', 'Export to Chaotica...'); + Add('main-menu-file-importgimp', 'Import GIMP parameters...'); + Add('main-menu-file-exportuprhint', '*** OUTDATED *** Save the flame in UltraFractal''s parameters format. 3D-properties are not supported!'); + Add('main-menu-file-exportflamehint', '*** OUTDATED *** Export the current flame parameters in a FLAM3 format. 3D-properties are not supported!'); + Add('main-menu-file-exportchaoticahint', 'Export the current fractal to Chaotica software. 3D-properties are not supported!'); + Add('main-menu-file-importgimphint', '*** OUTDATED *** Import GIMP parameters, which were created using the Flame filter'); + Add('main-menu-file-randombatch', 'Random batch'); + Add('main-menu-file-exit', 'Exit'); + Add('main-menu-file-randombatchhint', 'Create and load a file consist of random fractal parameters'); + Add('main-menu-file-exithint', 'Quit and close Apophysis'); + Add('main-menu-edit-title', 'Edit'); + Add('main-menu-edit-saveundo', 'Save undo stack...'); + Add('main-menu-edit-copyasupr', 'Copy as UPR'); + Add('main-menu-edit-copy', 'Copy the flame XML-parameters to the clipboard'); + Add('main-menu-edit-paste', 'Paste the flame XML-parameters from cripboard'); + Add('main-menu-edit-copyuprhint', 'Copy the UltraFractal-parameters of the flame to the clipboard '); + Add('main-menu-view-title', 'View'); + Add('main-menu-view-fullscreen', 'Full screen'); + Add('main-menu-view-editor', 'Editor'); + Add('main-menu-view-adjustment', 'Adjustment'); + Add('main-menu-view-gradient', 'Gradient'); + Add('main-menu-view-mutation', 'Mutation'); + Add('main-menu-view-imagesize', 'Image size'); + Add('main-menu-view-messages', 'Messages'); + Add('main-menu-view-curves', 'Curves'); + Add('main-menu-flame-title', 'Flame'); + Add('main-menu-flame-reset', 'Reset location'); + Add('main-menu-flame-randomize', 'Randomize all parameters'); + Add('main-menu-flame-randomizehint', 'Randomize all parameters of the current fractal flame'); + Add('main-menu-flame-changeweights', 'Change weight distribution...'); + Add('main-menu-flame-changecolors', 'Change color distribution...'); + Add('main-menu-flame-randomweights', 'Randomize weights'); + Add('main-menu-flame-equalweights', 'Equalize weights'); + Add('main-menu-flame-randomweightshint', 'Randomize transform weights (probabilities)'); + Add('main-menu-flame-equalweightshint', 'Set all weights (transform probabilities) to the same value'); + //Add('main-menu-flame-computeweights', 'Compute weights'); + Add('main-menu-flame-calculateweights', 'Calculate weights'); + Add('main-menu-flame-normweights', 'Normalize weights'); + Add('main-menu-flame-calculateweightshint', 'Compute transform weights in accordance to their scale factors'); + Add('main-menu-flame-normweightshint', 'Set transform weights to their total sum equals to 1.0'); + Add('main-menu-flame-calculatecolors', 'Calculate color values'); + Add('main-menu-flame-randomizecolors', 'Randomize color values'); + Add('main-menu-flame-resetcolors', 'Reset color values'); + Add('main-menu-flame-calculatecolorspeed', 'Calculate color speed'); + Add('main-menu-flame-randomizecolorspeed', 'Randomize color speed'); + Add('main-menu-flame-resetcolorspeed', 'Reset color speed'); + Add('main-menu-flame-calccolorshint', 'Distribute transform color parameters evenly'); + Add('main-menu-flame-randcolorshint', 'Randomize transform color parameters, but keep the existing color palette'); + Add('main-menu-flame-calccolorspeedhint', 'Calculate color speed values based on transform weights and contraction factors'); + Add('main-menu-flame-randcolorspeedhint', 'Randomize a speed of changing colors from the current palette'); + Add('main-menu-flame-resetcolorspeedhint', 'Reset all color speed values to zero'); + Add('main-menu-flame-resetcolorshint', 'Reset all color values to zero (make the fractal monochrome)'); + Add('main-menu-flame-flatten', 'Apply flatten'); + Add('main-menu-flame-flattenhint', 'Apply "flatten" variation for all pseudo-3D transforms'); + Add('main-menu-flame-unflatten', 'Unflatten'); + Add('main-menu-flame-unflattenhint', 'Reset "flatten" variation for all transforms'); + Add('main-menu-flame-rendertodisk', 'Render flame...'); + Add('main-menu-flame-renderallflames', 'Render all flames...'); + Add('main-menu-flame-resumeunfinished', 'Resume unfinished render process...'); + Add('main-menu-flame-generatereport', 'Summarize flame...'); + Add('main-menu-flame-reporthint', 'Show some basic information about the current fractal'); + Add('main-menu-flame-addtile', 'Add equiaffine tile...'); + Add('main-menu-flame-addsymmetry', 'Add equiaffine symmetry...'); + Add('main-menu-flame-rhombustile', 'Rhombus'); + Add('main-menu-flame-squaretile', 'Square'); + Add('main-menu-flame-hextile', 'Hexagonal'); + Add('main-menu-flame-symorder', ', order...'); + Add('main-menu-flame-template', 'Save as template...'); + Add('main-menu-flame-templatehint', 'Save the fractal as a template for future flames'); + Add('main-menu-variation-title', 'Variation'); + Add('main-menu-variation-random', 'Random'); + Add('main-menu-variation-builtin', 'Built-in'); + Add('main-menu-variation-plugins', 'Plugins'); + Add('main-menu-variation-randomhint', 'Randomly selected variation'); + Add('main-menu-variation-builtinhint', 'The list of built-in variations'); + Add('main-menu-variation-pluginshint', 'The list of dinamically loaded variations'); + Add('main-menu-script-title', 'Script'); + Add('main-menu-script-run', 'Run script'); + Add('main-menu-script-run2', 'Run "%s"'); + Add('main-menu-script-run3', 'Load and run the "%s" script.'); + Add('main-menu-script-directory', 'Directory'); + Add('main-menu-script-directoryhint', 'Scripts from default directory'); + Add('main-menu-script-more', 'More'); + Add('main-menu-script-stop', 'Stop script'); + Add('main-menu-script-open', 'Open...'); + Add('main-menu-script-openhint', 'Open a saved script file'); + Add('main-menu-script-edit', 'Edit script'); + Add('main-menu-script-managefaves', 'Manage favourites...'); + Add('main-menu-script-flametoscript', 'Generate script from flame'); + Add('main-menu-script-managefaveshint', 'Show the Favourite Scripts Manager'); + Add('main-menu-script-flametoscripthint', 'Translate visual flame properties into a programming language'); + Add('main-menu-options-title', 'Tools'); + Add('main-menu-options-togglemaintoolbar', 'Show the toolbar'); + Add('main-menu-options-togglestatusbar', 'Show the status bar'); + Add('main-menu-options-togglefilelist', 'Show the parameter list'); + Add('main-menu-options-resetfilelistwidth', 'Reset the content list width'); // Reset layout + Add('main-menu-options-resetwidthhint', 'Set default width for the left panel'); + Add('main-menu-options-sortflames', 'Sort flames alphabetically'); + Add('main-menu-options-enumflames', 'Display flame indices'); + Add('main-menu-options-tracelog', 'Trace log...'); + Add('main-menu-options-traceloghint', 'Show trace log (system processes connected with Apophysis)'); + Add('main-menu-options-showoptions', 'Settings...'); + Add('main-menu-options-apouistyle', 'Apophysis GUI style...'); + Add('main-menu-options-apouistylehint', 'Change the Apophysis visual appearance'); + Add('main-menu-help-title', 'Help'); + Add('main-menu-help-contents', 'Contents'); + Add('main-menu-help-aboutalgorithm', 'About fractal flames...'); + Add('main-menu-help-aboutapophysis', 'About Apophysis ...'); + Add('main-menu-help-contentshint', 'Open the Apophysis help file'); + Add('main-menu-help-aboutalgorithmhint', 'Open the corresponding documentation in your internet browser'); + Add('main-menu-help-aboutapophysishint', 'Show copyright and version information'); + Add('main-menu-help-ifstheory', 'Theory of IFS fractals...'); + Add('main-menu-help-ifstheoryhint', 'Open the link to M.Barnsley''s "Fractal Everywhere" book in your internet browser'); + Add('main-menu-help-pluginlink', 'Download Apophysis plugins....'); + Add('main-menu-renamehint', 'Rename the selected fractal'); + Add('main-menu-deletehint', 'Delete the selected fractal from the file'); + Add('main-menu-screenshot', 'Make a sreenshot of the active window'); + Add('main-menu-saveimage', 'Save the preview image with parameters'); + Add('main-menu-updatethumb', 'Update thumbnail'); + Add('main-menu-updateallthumbs', 'Update all thumbnails'); + Add('main-toolbar-listviewmode-classic', 'Classic view | Change the flame list view to a report (single text)'); + Add('main-toolbar-listviewmode-icons', 'Thumbnail view | Change a flame list view to icons'); + Add('main-toolbar-togglealpha', 'Show transparency | Show the flame on a transparent background'); + Add('main-toolbar-toggleguides', 'Show guidelines | Show flame thirds, center and golden ratio'); + Add('main-toolbar-modemove', 'Translate the camera | Translate the fractal image using mouse'); + Add('main-toolbar-moderotate', 'Rotate the camera | Rotate the fractal image using mouse'); + Add('main-toolbar-modezoomin', 'Zoom in | Scale up the fractal image using mouse'); + Add('main-toolbar-modezoomout', 'Zoom out | Scale down the fractal image using mouse'); + // AV: added a bunch of missing hints + Add('main-toolbar-new', 'New Flame | Create a new fractal project'); + Add('main-toolbar-open', 'Open (Ctrl+O) | Open a parameter file for browsing'); + Add('main-toolbar-saveparams', 'Save fractal parameters (Ctrl+S)| Save fractal parameters to a flame file'); + Add('main-toolbar-render', 'Render flame(Ctrl+R) | Save the current flame to disk as a picture'); + Add('main-toolbar-renderall', 'Render all flames| Save all fractals as pictures'); + Add('main-toolbar-undo', 'Undo (Ctrl+Z)| Undo the last action'); + Add('main-toolbar-redo', 'Redo (Ctrl+Y) | Redo the last cancelled action'); + Add('main-toolbar-reset', 'Reset Location (F12) | Recalculate the flame size and position'); + Add('main-toolbar-fullscreen', 'Fullscreen (F3) | Show full-screen view of the flame'); + Add('main-toolbar-editor', 'Editor | Open transform editor'); + Add('main-toolbar-adjustment', 'Adjustment | Adjust the position, size and colors of the flame'); + Add('main-toolbar-gradient', 'Gradient | Change a color palette of the flame'); + Add('main-toolbar-curves', 'Curves | Edit color curves of the fractal image'); + Add('main-toolbar-mutation', 'Mutation | Show randomly generated modifications of the current flame'); + Add('main-toolbar-quality', 'Rendering quality | Set flame quality (density) for the main preview window'); + Add('main-toolbar-imagesize', 'Image size | Change the image size'); + Add('main-toolbar-messages', 'Messages | Show error messages'); + Add('main-toolbar-options', 'Settings | Change Apophysis default settings'); + Add('main-toolbar-editscript', 'Edit script | Edit the script code'); + Add('main-toolbar-runscript', 'Run script | Execute the current script'); + Add('main-toolbar-stopscript', 'Stop script | To stop an animation script, you can press any key on your keyboard'); + Add('main-status-batchgenerate', 'Generating %d of %s...'); + Add('main-status-batcherror', 'Error creating batch.'); + Add('main-status-calculatingpalette', 'Calculating the palette, (%d%%)...'); // AV: doesn't work... + Add('main-status-noflam3', 'Unable to find flam3 executable. Please verify your settings.'); + Add('main-status-nohelpfile', 'Please specify a help file path in the options dialog first.'); + Add('main-status-variationsorvariables', 'variations or variables'); + Add('main-status-plugins', 'plugins'); + Add('main-status-pluginpath-ioerror', 'Failed to write the setting for the plugin directory. Apophysis will use the default setting.'); + Add('main-status-noloadingerrors', 'Flame loaded without errors'); + Add('main-status-loadingerrorcount', '%d errors in flame'); + Add('main-status-morepluginsneeded', 'The flame "%s" requires the following additional %s:'); + Add('main-status-noautosave', 'No autosave present.'); + Add('main-status-chaoticacompatmissing', 'The variation compatibility data file can not be found at the configured location of Chaotica. The rendering result may look different from the preview. Do you want to proceed?'); + Add('main-status-nochaotica', 'The executable file of Chaotica could not be found. Please check your settings.'); + Add('main-status-oldchaotica', 'The rendering result may look different from the preview. Do you want to proceed?'); + Add('main-report-transformcount', 'Transform count: %d'); + Add('main-report-finaltransform', 'Has final transform: %s'); + Add('main-report-directcoloring', 'Has direct coloring: '); + Add('main-report-flame3d', 'Has 3D view: '); + Add('main-report-usedplugins', 'Used plugins:'); + Add('main-report-noplugins', '(none)'); + Add('varorder-title', 'Variation Execution Order'); + Add('varorder-totop', 'To Top'); + Add('varorder-tobottom', 'To Bottom'); + Add('varorder-byname', 'Sort by name'); + Add('varorder-bynamehint', 'Sort variations in alphabetical order'); + Add('varorder-byindex', 'Default order'); + Add('varorder-byindexhint', 'Restore the default variation order in Transform Editor'); + Add('varorder-noselected', 'Active variation not found. Please, select the variation to move.'); +end; + +procedure Add(key, value: string); +var entry : TKeyValuePair; +begin + Inc(tokenCount); + SetLength(language, tokenCount); + SetLength(defaultlanguage, tokenCount); + entry := TKeyValuePair.Create; + entry.key := key; + entry.value := value; + language[tokenCount - 1] := entry; + defaultlanguage[tokenCount - 1] := entry; +end; + +procedure AddNoDefault(key, value: string); +var entry : TKeyValuePair; +begin + Inc(tokenCount); + SetLength(language, tokenCount); + entry := TKeyValuePair.Create; + entry.key := key; + entry.value := value; + language[tokenCount - 1] := entry; +end; + +procedure LoadLanguage(path: string); +begin + if (path = '') or (not FileExists(path)) then LoadEnglish() + else begin + tokenCount := 0; + if true then begin + parser := TParser.Create; + ListXmlScanner := TEasyXmlScanner.Create(nil); + + ListXmlScanner.OnStartTag := parser.ListXmlScannerStartTag; + ListXmlScanner.OnEndTag := parser.ListXmlScannerEndTag; + ListXmlScanner.OnEmptyTag := parser.ListXmlScannerEmptyTag; + ListXmlScanner.OnContent := parser.ListXmlScannerContent; + + ListXmlScanner.Filename := path; + ListXmlScanner.Execute; + + ListXmlScanner.Destroy; + parser.Destroy; + end; + end; +end; + +function TextByKey(key:string):string; +var i: integer; +begin + + Result := '#ERR_NO_TEXT#'; + for i:=0 to tokenCount - 1 do begin + if LowerCase(language[i].key) = LowerCase(key) then begin + Result := language[i].value; + exit; + end; + end; + + // maybe try default language? + for i:=0 to tokenCount - 1 do begin + if LowerCase(defaultlanguage[i].key) = LowerCase(key) then begin + Result := defaultlanguage[i].value; + exit; + end; + end; + +end; + +constructor TParser.Create; +begin + self.parentTagnames := TStringList.Create; +end; + +procedure TParser.ListXmlScannerStartTag(Sender: TObject; TagName: string; Attributes: TAttrList); +begin + self.parentTagnames.Add(self.currentTagname); + self.currentTagname := TagName; +end; +procedure TParser.ListXmlScannerEndTag(Sender: TObject; TagName: string); +var lastIndex : integer; +begin + lastIndex := self.parentTagnames.Count - 1; + self.currentTagname := self.parentTagnames.Strings[lastIndex]; + self.parentTagnames.Delete(lastIndex); +end; + +procedure TParser.ListXmlScannerEmptyTag(Sender: TObject; TagName: string; Attributes: TAttrList); +var lastIndex : integer; +begin + self.parentTagnames.Add(self.currentTagname); + self.currentTagname := TagName; + self.ListXmlScannerContent(Sender, ''); + lastIndex := self.parentTagnames.Count - 1; + self.currentTagname := self.parentTagnames.Strings[lastIndex]; + self.parentTagnames.Delete(lastIndex); +end; + +destructor TParser.Destroy; +begin + self.parentTagnames.Free; // AV: fixed memory leak + inherited; +end; + +procedure TParser.ListXmlScannerContent(Sender: TObject; Content: string); +const root: string = 'stringtable'; +var key, tn: string; i: integer; +begin + for i:=0 to self.parentTagnames.Count - 1 do begin + tn := self.parentTagnames.Strings[i]; + if not (tn = '') and not (tn = root) then key := key + tn + '-'; + end; + key := key + self.currentTagname; + Add(key, Content); +end; + +end. diff --git a/Core/XFormMan.pas b/Core/XFormMan.pas new file mode 100644 index 0000000..c434648 --- /dev/null +++ b/Core/XFormMan.pas @@ -0,0 +1,356 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit XFormMan; + +interface + +uses + BaseVariation, SysUtils, Forms, Windows; + +const + NRLOCVAR = 36; +var + NumBuiltinVars: integer; + +type + TFNToVN = record + FileName: string; + VarName: string; + end; + +function NrVar: integer; +function Varnames(const index: integer): String; +procedure RegisterVariation(Variation: TVariationLoader; supports3D, supportsDC : boolean); +function GetNrRegisteredVariations: integer; +function GetRegisteredVariation(const Index: integer): TVariationLoader; +function GetNrVariableNames: integer; +function GetVariableNameAt(const Index: integer): string; +function GetVariationIndex(const str: string): integer; +function GetVariationIndexFromVariableNameIndex(const Index: integer): integer; +procedure VarSupports(index : integer; var supports3D : boolean; var supportsDC : boolean); +procedure InitializeXFormMan; +procedure DestroyXFormMan; +procedure RegisterVariationFile(filename, name: string); +function GetFileNameOfVariation(name: string): string; + +implementation + +uses + Classes; + +var + VariationList: TList; + VariableNames: TStringlist; + loaderNum : integer; + Variable2VariationIndex : array of integer; + FNToVNList : array of TFNToVN; + FNToVNCount: integer; + +procedure InitializeXFormMan; +begin + VariationList := TList.Create; + VariableNames := TStringlist.create; + SetLength(Variable2VariationIndex,0); + SetLength(FNToVNList, 0); + FNToVNCount := 0; +end; + +procedure VarSupports(index : integer; var supports3D : boolean; var supportsDC : boolean); +const + supports3D_arr: array[0..NRLOCVAR-1] of boolean = ( + true, //'linear', + true, //'flatten', + true, //'pre_blur3D', + true, //'spherical', + true, //'swirl', + true, //'horseshoe', + true, //'polar', + true, //'disc', + true, //'spiral', + true, //'hyperbolic', + true, //'diamond', + true, //'eyefish', + true, //'bubble', + true, //'cylinder', + true, //'noise', + true, //'blur', + false, //'gaussian_blur', + true, //'zblur', + true, //'blur3D', + false, //'pre_blur', + true, //'pre_zscale', + true, //'pre_ztranslate', + true, //'pre_rotate_x', + true, //'pre_rotate_y', + true, //'zscale', + true, //'ztranslate', + true, //'zcone', + true, //'post_rotate_x', + true, //'post_rotate_y', + false, //'post_mirror_x', + false, //'post_mirror_y', + true, //'post_mirror_z', + true, //'hemisphere', + true, //'cross', + true, //'pyramid' + true // polar2 + ); + supportsDC_arr: array[0..NRLOCVAR-1] of boolean = ( + false, //'linear', + false, //'flatten', + false, //'pre_blur3D', + false, //'spherical', + false, //'swirl', + false, //'horseshoe', + false, //'polar', + + false, //'disc', + false, //'spiral', + false, //'hyperbolic', + false, //'diamond', + + false, //'eyefish', + false, //'bubble', + false, //'cylinder', + false, //'noise', + false, //'blur', + false, //'gaussian_blur', + false, //'zblur', + false, //'blur3D', + + false, //'pre_blur', + false, //'pre_zscale', + false, //'pre_ztranslate', + false, //'pre_rotate_x', + false, //'pre_rotate_y', + + false, //'zscale', + false, //'ztranslate', + false, //'zcone', + + false, //'post_rotate_x', + false, //'post_rotate_y' + + false, //'post_mirror_x', + false, //'post_mirror_y', + false, //'post_mirror_z', + + false, //'hemisphere', + false, //'cross', + false, //'pyramid' + false // polar2 + ); +var + varl : TVariationLoader; +begin + + if (index >= NRLOCVAR) then begin + supports3D := TVariationLoader(VariationList.Items[index - NRLOCVAR]).supports3D; + supportsDC := TVariationLoader(VariationList.Items[index - NRLOCVAR]).supportsDC; + end else begin + supports3D := supports3D_arr[index]; + supportsDC := supportsDC_arr[index]; + end; +end; + + +procedure DestroyXFormMan; +var i: integer; +begin + VariableNames.Free; + + // The registered variation loaders are owned here, so we must free them. + for i := 0 to VariationList.Count-1 do + TVariationLoader(VariationList[i]).Free; + VariationList.Free; + + Finalize(Variable2VariationIndex); + Finalize(FNToVNList); +end; + +/////////////////////////////////////////////////////////////////////////////// +function NrVar: integer; +begin + Result := NRLOCVAR + VariationList.Count; +end; + +/////////////////////////////////////////////////////////////////////////////// + +function GetVariationIndexFromVariableNameIndex(const Index: integer): integer; +begin + if (Index < 0) or (Index > High(Variable2VariationIndex)) then + Result := -1 + else + Result := Variable2VariationIndex[Index]; +end; + +function Varnames(const index: integer): String; +const + cvarnames: array[0..NRLOCVAR-1] of string = ( + 'linear', + 'flatten', + 'pre_blur3D', + 'spherical', + 'swirl', + 'horseshoe', + 'polar', +// 'handkerchief', +// 'heart', + 'disc', + 'spiral', + 'hyperbolic', + 'diamond', +// 'ex', +// 'julia', +// 'bent', +// 'waves', +// 'fisheye', +// 'popcorn', +// 'exponential', +// 'power', +// 'cosine', +// 'rings', +// 'fan', + 'eyefish', + 'bubble', + 'cylinder', + 'noise', + 'blur', + 'gaussian_blur', + 'zblur', + 'blur3D', + + 'pre_blur', + 'pre_zscale', + 'pre_ztranslate', + 'pre_rotate_x', + 'pre_rotate_y', + + 'zscale', + 'ztranslate', + 'zcone', + + 'post_rotate_x', + 'post_rotate_y', + + 'post_mirror_x', + 'post_mirror_y', + 'post_mirror_z', + + 'hemisphere', + 'cross', + 'pyramid', + 'polar2' + ); +begin + if Index < NRLOCVAR then + Result := cvarnames[Index] + else + Result := TVariationLoader(VariationList[Index - NRLOCVAR]).GetName; +end; + +/////////////////////////////////////////////////////////////////////////////// +function GetVariationIndex(const str: string): integer; +var + i: integer; +begin + i := NRVAR-1; + while (i >= 0) and (Varnames(i) <> str) do Dec(i); + Result := i; +end; + +/////////////////////////////////////////////////////////////////////////////// + +procedure RegisterVariationFile(filename, name: string); +begin + FNToVNCount := FNToVNCount + 1; + SetLength(FNToVNList, FNToVNCount); + FNToVNList[FNToVNCount - 1].FileName := filename; + FNToVNList[FNToVNCount - 1].VarName := name; +end; + +function GetFileNameOfVariation(name: string): string; +var i: integer; +begin + for i := 0 to FNToVNCount - 1 do begin + if FNToVNList[i].VarName = name then begin + Result := FNToVNList[i].FileName; + Exit; + end; + end; + Result := ''; +end; + +procedure RegisterVariation(Variation: TVariationLoader; supports3D, supportsDC : boolean); +var + i: integer; + prevNumVariables:integer; +begin + OutputDebugString(PChar(Variation.GetName)); + + VariationList.Add(Variation); + Variation.Supports3D := supports3D; + Variation.SupportsDC := supportsDC; + + prevNumVariables := GetNrVariableNames; + setLength(Variable2VariationIndex, prevNumVariables + Variation.GetNrVariables); + for i := 0 to Variation.GetNrVariables - 1 do begin + VariableNames.Add(Variation.GetVariableNameAt(i)); + Variable2VariationIndex[prevNumVariables + i] := NrVar-1; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function GetNrRegisteredVariations: integer; +begin + Result := VariationList.count; +end; + +/////////////////////////////////////////////////////////////////////////////// +function GetRegisteredVariation(const Index: integer): TVariationLoader; +begin + Result := TVariationLoader(VariationList[Index]); +end; + +/////////////////////////////////////////////////////////////////////////////// +function GetNrVariableNames: integer; +begin + Result := VariableNames.Count; +end; + +/////////////////////////////////////////////////////////////////////////////// +function GetVariableNameAt(const Index: integer): string; +begin + Result := VariableNames[Index]; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + InitializeXFormMan; + +finalization + DestroyXFormMan; + +end. diff --git a/Flame/ControlPoint.pas b/Flame/ControlPoint.pas new file mode 100644 index 0000000..45f502e --- /dev/null +++ b/Flame/ControlPoint.pas @@ -0,0 +1,3158 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit ControlPoint; + +interface + +//{$define VAR_STR} + +uses + Classes, Windows, Cmap, XForm, XFormMan, Binary, + SysUtils, math, ZLib, Bezier; + +const + SUB_BATCH_SIZE = 10000; + PROP_TABLE_SIZE = 1024; + PREFILTER_WHITE = (1 shl 26); + FILTER_CUTOFF = 1.8; + BRIGHT_ADJUST = 2.3; + //FUSE = 15; // AV: moved to Global since it became a variable + +type + TCoefsArray= array[0..2, 0..1] of double; + pCoefsArray= ^TCoefsArray; + TTriangle = record + x: array[0..2] of double; + y: array[0..2] of double; + end; + TTriangles = array[-1..NXFORMS] of TTriangle; + TSPoint = record + x: double; + y: double; + end; + TSRect = record + Left, Top, Right, Bottom: double; + end; + TMapPalette = record + Red: array[0..255] of byte; + Green: array[0..255] of byte; + Blue: array[0..255] of byte; + end; + TColorMaps = record + Identifier: string; + UGRFile: string; + end; + pPixArray = ^TPixArray; + TPixArray = array[0..1279, 0..1023, 0..3] of integer; + pPreviewPixArray = ^TPreviewPixArray; + TPreviewPixArray = array[0..159, 0..119, 0..3] of integer; + TFileType = (ftIfs, ftFla, ftXML); + +type //? + PLongintArray = ^TLongintArray; + TLongintArray = array[0..8192] of Longint; + +type + TVariation = (vLinear, vCustom, vRandom = 1000); // AV: fixed outdated values + +type + TPointsArray = array of TCPpoint; + TPointsXYArray = array of TXYpoint; + + P2Cpoint = ^T2Cpoint; + T2CPointsArray = array of T2Cpoint; + + TControlPoint = class + public + finalXform: TXForm; + finalXformEnabled: boolean; + useFinalXform: boolean; + soloXform: integer; + curvePoints: array [0..3] of BezierPoints; + curveWeights: array [0..3] of BezierWeights; + + Transparency: boolean; + + cameraPitch, cameraYaw, cameraPersp, cameraDOF: double; + cameraZpos, cameraRoll: double; + ProjectionFunc: procedure(pPoint: PCPPoint) of object; + + xform: array[0..NXFORMS] of TXForm; + + noLinearFix: boolean; + variation: TVariation; + cmap: TColorMap; + cmapindex: integer; + time: double; + Fbrightness: double; // 1.0 = normal + contrast: double; // 1.0 = normal + gamma: double; + Width: integer; + Height: integer; + spatial_oversample: integer; + name, nick, url: string; + center: array[0..1] of double; // camera center + vibrancy: double; // blend between color algs (0=old,1=new) + hue_rotation: double; // applies to cmap, 0-1 + background: array[0..3] of Integer; // Changed to integers so no conversion needed - mt + zoom: double; // effects ppu and sample density + pixels_per_unit: double; // and scale + spatial_filter_radius: double; // variance of gaussian + sample_density: extended; // samples per pixel (not bucket) + (* in order to motion blur more accurately we compute the logs of the + sample density many times and average the results. we interplate + only this many times. *) + actual_density: extended; // for incomplete renders + nbatches: integer; // this much color resolution. but making it too high induces clipping + white_level: integer; + cmap_inter: integer; // if this is true, then color map interpolates one entry + // at a time with a bright edge + symmetry: integer; + pulse: array[0..1, 0..1] of double; // [i][0]=magnitute [i][1]=frequency */ + wiggle: array[0..1, 0..1] of double; // frequency is /minute, assuming 30 frames/s */ + + estimator, estimator_min, estimator_curve: double; // density estimator. + jitters: integer; + gamma_threshold: double; + enable_de : boolean; + used_plugins : TStringList; + +// PropTable: array of TXForm; + FAngle: Double; + //FTwoColorDimensions: Boolean; + + procedure FillUsedPlugins; + + private + invalidXform: TXForm; + + CameraMatrix: array[0..2, 0..2] of double; + DofCoef: double; + gauss_rnd: array [0..3] of double; + gauss_N: integer; + + sinPitch, cosPitch, sinRoll, cosRoll, + sinYaw, cosYaw: double; + + procedure ProjectNone(pPoint: PCPPoint); + procedure ProjectPitch(pPoint: PCPPoint); + procedure ProjectPitchYaw(pPoint: PCPPoint); + procedure ProjectPitchDOF(pPoint: PCPPoint); + procedure ProjectPitchYawDOF(pPoint: PCPPoint); + // AV: for rotation around Y-axis + procedure ProjectPitchRoll(pPoint: PCPPoint); + procedure ProjectPitchRollYaw(pPoint: PCPPoint); + procedure ProjectPitchRollYawDOF(pPoint: PCPPoint); + + function getppux: double; + function getppuy: double; + + function GetBrightness: double; + procedure SetBrightness(br: double); + function GetRelativeGammaThreshold: double; + procedure SetRelativeGammaThreshold(gtr: double); + + public + xdata : string; + + procedure SaveToStringlist(sl: TStringlist); + procedure SaveToFile(Filename: string); + procedure SaveToBinary(const handle: File); + + procedure ParseString(aString: string); + procedure ParseStringList(sl: TStringlist); + procedure RandomCP(min: integer = 2; max: integer = NXFORMS; calc: boolean = true); + procedure RandomCP1; + procedure CalcBoundbox; + function BlowsUp(NrPoints: integer): boolean; + + procedure SetVariation(vari: TVariation); + procedure Clear; + + procedure InterpolateX(cp1, cp2: TControlPoint; Tm: double); + procedure InterpolateAll(cp1, cp2: TControlPoint; Tm: double; it: integer); + + procedure IterateXY(NrPoints: integer; var Points: TPointsXYArray); + procedure IterateXYC(NrPoints: integer; var Points: TPointsArray); + + procedure Prepare; + + function Clone: TControlPoint; + procedure Copy(cp1: TControlPoint; KeepSizes: boolean = false; nt: byte = NXFORMS); // AV + + function HasFinalXForm: boolean; + + // CP-specific functions moved from unit Main + function NumXForms: integer; + function TrianglesFromCP(var Triangles: TTriangles): integer; + procedure GetFromTriangles(const Triangles: TTriangles; const t: integer); + + procedure GetTriangle(var Triangle: TTriangle; const n: integer); + procedure GetPostTriangle(var Triangle: TTriangle; const n: integer); + + procedure EqualizeWeights; + procedure NormalizeWeights; + procedure RandomizeWeights; + procedure ComputeWeights(Triangles: TTriangles; t: integer); + procedure NormalizeProbabilities; // AV + procedure CalculateWeights; // AV + procedure CalculateColorSpeed; // AV + procedure AdjustScale(w, h: integer); + + constructor Create; + destructor Destroy; override; + + procedure ZoomtoRect(R: TSRect); + procedure ZoomOuttoRect(R: TSRect); + procedure MoveRect(R: TSRect); + procedure ZoomIn(Factor: double); + procedure Rotate(Angle: double); + + property ppux: double read getppux; + property ppuy: double read getppuy; + + property brightness: double + read GetBrightness + write SetBrightness; + property gammaThreshRelative: double + read GetRelativeGammaThreshold + write SetRelativeGammaThreshold; + end; + +function add_symmetry_to_control_point(var cp: TControlPoint; sym: integer): integer; +procedure tile_control_point(var cp: TControlPoint; sym: integer); +function CalcUPRMagn(const cp: TControlPoint): double; +procedure FillVarDisturb; +function CalcBinaryFlameSize(cp: TControlPoint): integer; + +implementation + +uses global; + +var + var_distrib: array of integer; + mixed_var_distrib: array of integer; + +{ TControlPoint } + +function sign(n: double): double; +begin + if n < 0 then Result := -1 + else if n > 0 then Result := 1 + else Result := 0; +end; + +procedure TControlPoint.FillUsedPlugins; +var + i, j, k, f : integer; + v : double; + s : String; +begin + used_plugins.Clear; + + f := -1; + if self.finalXformEnabled then f := 0; + + for i := 0 to Min(NumXForms+f, NXFORMS) do + with xform[i] do begin + for j := 0 to NRVAR - 1 do begin + v := self.xform[i].GetVariation(j); + if (v <> 0) and // uses variation + (used_plugins.IndexOf(Varnames(j)) < 0) // not listed yet + then begin + used_plugins.Add(Varnames(j)); + s := s + Varnames(j) + ' on TX #' + IntToStr(i + 1) + #13#10; + end; + end; + end; + + // Faulty... + (* + for i := 0 to NumXforms-1 do begin + for j := NumBuiltinVars to xform[i].NumVariations-1 do begin + v := self.xform[i].GetVariation(j); + if (v = 0) then continue; + s := Varnames(j); + k := used_plugins.IndexOf(s); + if (k < 0) or (k >= used_plugins.Count) then + used_plugins.Add(s); + end; + end; + if finalXformEnabled then begin + for j := NumBuiltinVars to self.finalXform.NumVariations-1 do begin + v := self.finalXform.GetVariation(j); + s := Varnames(j); + if (v = 0) then continue; + k := used_plugins.IndexOf(s); + if (k < 0) or (k >= used_plugins.Count) then + used_plugins.Add(s); + end; + end; + *) +end; + +constructor TControlPoint.Create; +var + i: Integer; +begin + for i := 0 to NXFORMS do begin + xform[i] := TXForm.Create; + end; + invalidXform := TXForm.Create; + soloXform := -1; + + pulse[0][0] := 0; + pulse[0][1] := 60; + pulse[1][0] := 0; + pulse[1][1] := 60; + + wiggle[0][0] := 0; + wiggle[0][1] := 60; + wiggle[1][0] := 0; + wiggle[1][1] := 60; + + background[0] := 0; + background[1] := 0; + background[2] := 0; + + for i := 0 to 3 do + begin + curvePoints[i][0].x := 0.00; curvePoints[i][0].y := 0.00; curveWeights[i][0] := 1; + curvePoints[i][1].x := 0.00; curvePoints[i][1].y := 0.00; curveWeights[i][1] := 1; + curvePoints[i][2].x := 1.00; curvePoints[i][2].y := 1.00; curveWeights[i][2] := 1; + curvePoints[i][3].x := 1.00; curvePoints[i][3].y := 1.00; curveWeights[i][3] := 1; + end; + + center[0] := 0; + center[1] := 0; + + pixels_per_unit := 50; + + width := 100; + Height := 100; + + spatial_oversample := 1; + spatial_filter_radius := 0.5; + + FAngle := 0; + gamma := 1; + vibrancy := 1; + contrast := 1; + Fbrightness := 1; + hue_rotation := 1; // AV + + sample_density := 50; + zoom := 0; + nbatches := 1; + + white_level := 200; + + estimator := 9.0; + estimator_min := 0.0; + estimator_curve := 0.4; + enable_de := false; + jitters := 1; + gamma_threshold := 0.01; + + //FTwoColorDimensions := False; + + finalXformEnabled := false; + Transparency := false; + + cameraPitch := 0; + cameraYaw := 0; + cameraRoll := 0; + cameraPersp := 0; + cameraZpos := 0; + cameraDOF := 0; + + used_plugins := TStringList.Create; + xdata := ''; +end; + +destructor TControlPoint.Destroy; +var + i: Integer; +begin + for i := 0 to NXFORMS do + xform[i].Free; + invalidXform.Free; + + used_plugins.Free; // <<< -X- commenting out = hack - fixme! + // AV: uncommented to save user's PC memory from leaking - fixme! + inherited; +end; + +procedure TControlPoint.Prepare; +var + i, n: Integer; + propsum: double; + LoopValue: double; + j: integer; + TotValue: double; + + k: integer; + tp: array[0..NXFORMS] of double; +begin +// SetLength(PropTable, PROP_TABLE_SIZE); + + //totValue := 0; + n := NumXforms; + assert(n > 0); + + finalXform := xform[n]; + finalXform.Prepare; + useFinalXform := FinalXformEnabled and HasFinalXform; + for i := 0 to n - 1 do begin + xform[i].Prepare; + //totValue := totValue + xform[i].density; + end; + invalidXform.PrepareInvalidXForm; + + if soloXform >= 0 then begin + for i := 0 to n - 1 do begin + xform[i].transOpacity := 0; + end; + xform[soloXform].transOpacity := 1; + end; + + for k := 0 to n - 1 do begin + totValue := 0; + SetLength(xform[k].PropTable, PROP_TABLE_SIZE); + + for i := 0 to n - 1 do begin + tp[i] := xform[i].density * xform[k].modWeights[i]; + totValue := totValue + tp[i]; + end; + + if totValue > 0 then begin + LoopValue := 0; + for i := 0 to PROP_TABLE_SIZE-1 do begin + propsum := 0; + j := -1; + repeat + inc(j); + propsum := propsum + tp[j];//xform[j].density; + until (propsum > LoopValue) or (j = n - 1); + + //assert(tp[j]<>0); + + xform[k].PropTable[i] := xform[j]; + LoopValue := LoopValue + TotValue / PROP_TABLE_SIZE; + end; + end + else begin + for i := 0 to PROP_TABLE_SIZE-1 do + xform[k].PropTable[i] := invalidXform; + end; + end; + + (* + CameraMatrix[0, 0] := cos(-CameraYaw); + CameraMatrix[1, 0] := -sin(-CameraYaw); + CameraMatrix[2, 0] := 0; + CameraMatrix[0, 1] := cos(CameraPitch) * sin(-CameraYaw); + CameraMatrix[1, 1] := cos(CameraPitch) * cos(-CameraYaw); + CameraMatrix[2, 1] := -sin(CameraPitch); + CameraMatrix[0, 2] := sin(CameraPitch) * sin(-CameraYaw); + CameraMatrix[1, 2] := sin(CameraPitch) * cos(-CameraYaw); + CameraMatrix[2, 2] := cos(CameraPitch); + *) + // AV: added 3D camera precalc + SinCos(cameraPitch, sinPitch, cosPitch); + SinCos(cameraRoll, sinRoll, cosRoll); + SinCos(-cameraYaw, sinYaw, cosYaw); + // AV: recalculate the matrix in order to support Y-rotation + CameraMatrix[0, 0] := cosRoll * cosYaw; + CameraMatrix[1, 0] := -cosRoll * sinYaw; + CameraMatrix[2, 0] := sinRoll; + CameraMatrix[0, 1] := sinPitch * sinRoll * cosYaw + cosPitch * sinYaw; + CameraMatrix[1, 1] := -sinPitch * sinRoll * sinYaw + cosPitch * cosYaw; + CameraMatrix[2, 1] := -sinPitch * cosRoll; + CameraMatrix[0, 2] := -cosPitch * sinRoll * cosYaw + sinPitch * sinYaw; + CameraMatrix[1, 2] := cosPitch * sinRoll * sinYaw + sinPitch * cosYaw; + CameraMatrix[2, 2] := cosPitch * cosRoll; + DofCoef := 0.1 * CameraDOF; + gauss_rnd[0] := random; + gauss_rnd[1] := random; + gauss_rnd[2] := random; + gauss_rnd[3] := random; + gauss_N := 0; + + if (CameraDOF <> 0) then begin + if (CameraRoll = 0) then + begin + if (CameraYaw <> 0) then + ProjectionFunc := ProjectPitchYawDOF + else + ProjectionFunc := ProjectPitchDOF; + end else // Roll and DOF + ProjectionFunc := ProjectPitchRollYawDOF; + end + else if (CameraPitch <> 0) or (CameraRoll <> 0) or (CameraYaw <> 0) then begin + if (CameraRoll <> 0) then + ProjectionFunc := ProjectPitchRollYaw + else if (CameraYaw <> 0) then // Roll = 0 + ProjectionFunc := ProjectPitchYaw + else // Roll = Yaw = 0 + ProjectionFunc := ProjectPitch; + end + else ProjectionFunc := ProjectNone; +end; + +procedure TControlPoint.IterateXY(NrPoints: integer; var Points: TPointsXYArray); +var + i: Integer; + px, py: double; + pPoint: PXYPoint; + + xf: TXform; +begin + px := 2 * random - 1; + py := 2 * random - 1; + + try + xf := xform[0]; //random(NumXForms)]; + for i := 0 to FUSE do begin + xf := xf.PropTable[Random(PROP_TABLE_SIZE)]; + xf.NextPointXY(px,py); + end; + + pPoint := @Points[0]; + + if UseFinalXform then + for i := 0 to NrPoints - 1 do begin + xf := xf.PropTable[Random(PROP_TABLE_SIZE)]; + xf.NextPointXY(px,py); + if (xf.transOpacity = 0) or + ((xf.transOpacity < 1) and (random > xf.transOpacity)) then + pPoint^.x := 1e300 // MaxDouble // hack + else begin + pPoint^.X := px; + pPoint^.Y := py; + end; + finalXform.NextPointXY(pPoint^.X, pPoint^.y); + Inc(pPoint); + end + else + for i := 0 to NrPoints - 1 do begin + xf := xf.PropTable[Random(PROP_TABLE_SIZE)]; + xf.NextPointXY(px,py); + if (xf.transOpacity = 0) or // AV + ((xf.transOpacity < 1) and (random > xf.transOpacity)) then // AV + pPoint^.x := 1e300 // MaxDouble // hack + else begin + pPoint.X := px; + pPoint.Y := py; + end; + Inc(pPoint); + end; + except + on EMathError do begin + exit; + end; + end; +end; + +procedure TControlPoint.IterateXYC(NrPoints: integer; var Points: TPointsArray); +var + i: Integer; + p: TCPPoint; + pPoint: PCPPoint; + + xf: TXform; +begin + p.x := 2 * random - 1; + p.y := 2 * random - 1; + p.z := 0; // AV: fixed - someone forgot to initialize this variable + p.c := random; + + try + xf := xform[0]; //random(NumXForms)]; + for i := 0 to FUSE do begin + xf := xf.PropTable[Random(PROP_TABLE_SIZE)]; + xf.NextPoint(p); + end; + + pPoint := @Points[0]; + + if UseFinalXform then + for i := 0 to NrPoints - 1 do begin + xf := xf.PropTable[Random(PROP_TABLE_SIZE)]; + xf.NextPoint(p); + + if (xf.transOpacity = 0) or // AV: moved here from rendering unit + ((xf.transOpacity < 1) and (random > xf.transOpacity)) then + pPoint^.x := 1e300 // MaxDouble // hack + else + begin + finalXform.NextPointTo(p, pPoint^); + ProjectionFunc(pPoint); + end; + Inc(pPoint); + end + else + for i := 0 to NrPoints - 1 do begin + xf := xf.PropTable[Random(PROP_TABLE_SIZE)]; + xf.NextPoint(p); + + if (xf.transOpacity = 0) or // AV: moved here from rendering unit + ((xf.transOpacity < 1) and (random > xf.transOpacity)) then + pPoint^.x := 1e300 // MaxDouble // hack + else + begin + pPoint^ := p; + ProjectionFunc(pPoint); + end; + Inc(pPoint); + end; + except + on EMathError do begin + exit; + end; + on EInvalidPointer do exit; // AV + end; +end; + +procedure TControlPoint.ProjectNone(pPoint: PCPPoint); +var + zr: double; +begin + zr := 1 - cameraPersp * (pPoint^.z - CameraZpos); + + pPoint^.x := pPoint^.x / zr; + pPoint^.y := pPoint^.y / zr; + //pPoint^.z := pPoint^.z - CameraZpos; // AV: ? +end; + +procedure TControlPoint.ProjectPitch(pPoint: PCPPoint); +var + y, z, zr: double; +begin + z := pPoint^.z - CameraZpos; + y := CameraMatrix[1,1] * pPoint^.y - sinPitch * z; + zr := 1 - cameraPersp * + (CameraMatrix[1,2] * pPoint^.y + cosPitch * z); + + pPoint^.x := pPoint^.x / zr; + pPoint^.y := y / zr; + //pPoint^.z := pPoint^.z - CameraZpos; +end; + +procedure TControlPoint.ProjectPitchYaw(pPoint: PCPPoint); +var + x, y, z, zr: double; +begin + z := pPoint^.z - CameraZpos; + x := cosYaw * pPoint^.x - sinYaw * pPoint^.y; + y := CameraMatrix[0,1] * pPoint^.x + CameraMatrix[1,1] * pPoint^.y - sinPitch * z; + zr := 1 - cameraPersp * + (CameraMatrix[0,2]* pPoint^.x + CameraMatrix[1,2]*pPoint^.y + cosPitch * z); + + pPoint^.x := x / zr; + pPoint^.y := y / zr; + //pPoint^.z := pPoint^.z - CameraZpos; +end; + +procedure TControlPoint.ProjectPitchDOF(pPoint: PCPPoint); +var + x, y, z, zr, dr: double; + dsin, dcos: double; + t: double; +begin + z := pPoint^.z - CameraZpos; + y := CameraMatrix[1,1] * pPoint^.y - sinPitch * z; + z := CameraMatrix[1,2] * pPoint^.y + cosPitch * z; + zr := 1 - cameraPersp * z; + +//{$define GAUSSIAN_DOF} +{$ifdef GAUSSIAN_DOF} + asm + fld qword ptr [eax + gauss_rnd] + fadd qword ptr [eax + gauss_rnd+8] + fadd qword ptr [eax + gauss_rnd+16] + fadd qword ptr [eax + gauss_rnd+24] + fld1 + fadd st, st + fsubp st(1),st + fmul qword ptr [eax + dofCoef] + fmul qword ptr [z] + fstp qword ptr [dr] + call AsmRandExt + mov edx, [eax + gauss_N] + fst qword ptr [eax + gauss_rnd + edx*8] + inc edx + and edx,$03 + mov [eax + gauss_N], edx + fadd st, st + fldpi + fmulp + fsincos + fstp qword ptr [dcos] + fstp qword ptr [dsin] + end; +{$else} + t := random * 2 * pi; + SinCos(t, dsin, dcos); + dr := random * dofCoef * z; +{ + asm + fld qword ptr [z] + fmul st, st + fmul qword ptr [eax + dofCoef] + fldpi + fadd st, st + call AsmRandExt + fmulp + fsincos + fstp qword ptr [dcos] + fstp qword ptr [dsin] + call AsmRandExt + fmulp + fstp qword ptr [dr] + end; +} +{$endif} + + pPoint^.x := (pPoint^.x + dr*dcos) / zr; + pPoint^.y := (y + dr*dsin) / zr; + //pPoint^.z := pPoint^.z - CameraZpos; +end; + +procedure TControlPoint.ProjectPitchYawDOF(pPoint: PCPPoint); +var + x, y, z, zr, dr: double; + dsin, dcos: double; + t : double; +begin + z := pPoint^.z - CameraZpos; + x := cosYaw * pPoint^.x - sinYaw * pPoint^.y; + y := CameraMatrix[0,1] * pPoint^.x + CameraMatrix[1,1] * pPoint^.y - sinPitch * z; + z := CameraMatrix[0,2] * pPoint^.x + CameraMatrix[1,2] * pPoint^.y + cosPitch * z; + zr := 1 - cameraPersp * z; + +{$ifdef GAUSSIAN_DOF} + asm + fld qword ptr [eax + gauss_rnd] + fadd qword ptr [eax + gauss_rnd+8] + fadd qword ptr [eax + gauss_rnd+16] + fadd qword ptr [eax + gauss_rnd+24] + fld1 + fadd st, st + fsubp st(1),st + fmul qword ptr [eax + dofCoef] + fmul qword ptr [z] + fstp qword ptr [dr] + call AsmRandExt + mov edx, [eax + gauss_N] + fst qword ptr [eax + gauss_rnd + edx*8] + inc edx + and edx,$03 + mov [eax + gauss_N], edx + fadd st, st + fldpi + fmulp + fsincos + fstp qword ptr [dcos] + fstp qword ptr [dsin] + end; +{$else} + t := random * 2 * pi; + SinCos(t, dsin, dcos); + dr := random * dofCoef * z; +{ + asm + fld qword ptr [z] + fmul st, st + fmul qword ptr [eax + dofCoef] + fldpi + fadd st, st + call AsmRandExt + fmulp + fsincos + fstp qword ptr [dcos] + fstp qword ptr [dsin] + call AsmRandExt + fmulp + fstp qword ptr [dr] + end; +} +{$endif} + + pPoint^.x := (x + dr*dcos) / zr; + pPoint^.y := (y + dr*dsin) / zr; + // pPoint^.z := pPoint^.z - CameraZpos; +end; + +procedure TControlPoint.ProjectPitchRoll(pPoint: PCPPoint); +var // AV: added Y-rotation + x, y, z, zr: double; +begin + z := pPoint^.z - CameraZpos; + x := cosRoll * pPoint^.x + CameraMatrix[1,0] * pPoint^.y + CameraMatrix[1,0] * z; + y := cosPitch * pPoint^.y - sinPitch * z; + zr := 1 - cameraPersp * + (sinRoll * pPoint^.x + CameraMatrix[1,2] * pPoint^.y + CameraMatrix[2,2] * z); + + pPoint^.x := x / zr; + pPoint^.y := y / zr; +end; + +procedure TControlPoint.ProjectPitchRollYaw(pPoint: PCPPoint); +var // AV: added Y-rotation + x, y, z, zr: double; +begin + z := pPoint^.z - CameraZpos; + x := CameraMatrix[0,0] * pPoint^.x + CameraMatrix[1,0] * pPoint^.y + CameraMatrix[2,0] * z; + y := CameraMatrix[0,1] * pPoint^.x + CameraMatrix[1,1] * pPoint^.y + CameraMatrix[2,1] * z; + zr := 1 - cameraPersp * + (CameraMatrix[0,2]* pPoint^.x + CameraMatrix[1,2]*pPoint^.y + CameraMatrix[2,2] * z); + + pPoint^.x := x / zr; + pPoint^.y := y / zr; +end; + +procedure TControlPoint.ProjectPitchRollYawDOF(pPoint: PCPPoint); +var // AV: added Y-rotation + x, y, z, zr, dr: double; + dsin, dcos: double; + t : double; +begin + z := pPoint^.z - CameraZpos; + x := CameraMatrix[0,0] * pPoint^.x + CameraMatrix[1,0] * pPoint^.y + CameraMatrix[2,0] * z; + y := CameraMatrix[0,1] * pPoint^.x + CameraMatrix[1,1] * pPoint^.y + CameraMatrix[2,1] * z; + z := CameraMatrix[0,2]* pPoint^.x + CameraMatrix[1,2]*pPoint^.y + CameraMatrix[2,2] * z; + zr := 1 - cameraPersp * z; + + t := random * 2 * pi; + SinCos(t, dsin, dcos); + dr := random * dofCoef * z; + + pPoint^.x := (x + dr * dcos) / zr; + pPoint^.y := (y + dr * dsin) / zr; +end; + +function TControlPoint.BlowsUp(NrPoints: integer): boolean; +var + i, n: Integer; + px, py: double; + minx, maxx, miny, maxy: double; + Points: TPointsXYArray; + CurrentPoint: PXYPoint; + + xf: TXForm; +begin + Result := false; + + n := min(SUB_BATCH_SIZE, NrPoints); + SetLength(Points, n); + + px := 2 * random - 1; + py := 2 * random - 1; + + Prepare; + + try + xf := xform[random(NumXForms)]; + for i := 0 to FUSE do begin + xf := xf.PropTable[Random(PROP_TABLE_SIZE)]; + xf.NextPointXY(px,py); + end; + + CurrentPoint := @Points[0]; + for i := 0 to n-1 do begin + xf := xf.PropTable[Random(PROP_TABLE_SIZE)]; + xf.NextPointXY(px,py); + CurrentPoint.X := px; + CurrentPoint.Y := py; + Inc(CurrentPoint); + // random CPs don't use finalXform... + end; + except + on EMathError do begin + Result := True; + Exit; + end; + end; + + // It is possible that the transformation will grow very large but remain below the overflow line + minx := 1E10; + maxx := -1E10; + miny := 1E10; + maxy := -1E10; + for i := 0 to n-1 do begin + minx := min(minx, Points[i].x); + maxx := max(maxx, Points[i].x); + miny := min(miny, Points[i].y); + maxy := max(maxy, Points[i].y); + end; + + if ((Maxx - MinX) > 1000) or ((Maxy - Miny) > 1000) then + Result := True; +end; + +procedure TControlPoint.ParseString(aString: string); +var + ParseValues: TStringList; + ParsePos: integer; + CurrentToken: string; + CurrentXForm: integer; + i: integer; + OldDecimalSperator: Char; + v: double; +begin + ParseValues := TStringList.Create; + ParseValues.CommaText := AString; + + OldDecimalSperator := FormatSettings.DecimalSeparator; + FormatSettings.DecimalSeparator := '.'; + + CurrentXForm := 0; + + ParsePos := 0; + while (ParsePos < ParseValues.Count) do begin + CurrentToken := ParseValues[ParsePos]; + if AnsiCompareText(CurrentToken, 'xform') = 0 then begin + Inc(ParsePos); + CurrentXForm := StrToInt(ParseValues[ParsePos]); + (*end else if AnsiCompareText(CurrentToken, 'plugins') = 0 then begin + used_plugins.Clear; + i := 0; + while true do begin + if (ParsePos + 1) >= ParseValues.Count then + break; + + Inc(ParsePos); + used_plugins.Add(ParseValues[ParsePos]); + Inc(i); + end; *) + end else if AnsiCompareText(CurrentToken, 'finalxformenabled') = 0 then begin + Inc(ParsePos); + finalxformenabled := StrToInt(ParseValues[ParsePos]) <> 0; + end else if AnsiCompareText(CurrentToken, 'soloxform') = 0 then begin + Inc(ParsePos); + soloxform := StrToInt(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'time') = 0 then begin + Inc(ParsePos); + time := StrToFloat(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'brightness') = 0 then begin + Inc(ParsePos); + brightness := StrToFloat(ParseValues[ParsePos]) / BRIGHT_ADJUST; + end else if AnsiCompareText(CurrentToken, 'zoom') = 0 then begin // mt + Inc(ParsePos); // mt + zoom := StrToFloat(ParseValues[ParsePos]); // mt + end else if AnsiCompareText(CurrentToken, 'angle') = 0 then begin + Inc(ParsePos); + FAngle := StrToFloat(ParseValues[ParsePos]); +// 3d camera stuff + end else if AnsiCompareText(CurrentToken, 'cam_pitch') = 0 then begin + Inc(ParsePos); + cameraPitch := StrToFloat(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'cam_yaw') = 0 then begin + Inc(ParsePos); + cameraYaw := StrToFloat(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'cam_roll') = 0 then begin + Inc(ParsePos); // AV: add third angle + cameraRoll := StrToFloat(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'cam_persp') = 0 then begin + Inc(ParsePos); + cameraPersp := StrToFloat(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'cam_zpos') = 0 then begin + Inc(ParsePos); + cameraZpos := StrToFloat(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'cam_dof') = 0 then begin + Inc(ParsePos); + cameraDOF := abs(StrToFloat(ParseValues[ParsePos])); +// end 3d + end else if AnsiCompareText(CurrentToken, 'contrast') = 0 then begin + Inc(ParsePos); + contrast := StrToFloat(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'gamma') = 0 then begin + Inc(ParsePos); + gamma := StrToFloat(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'vibrancy') = 0 then begin + Inc(ParsePos); + vibrancy := StrToFloat(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'gamma_threshold') = 0 then begin + Inc(ParsePos); + gamma_threshold := StrToFloat(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'hue_rotation') = 0 then begin + Inc(ParsePos); + hue_rotation := StrToFloat(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'zoom') = 0 then begin + Inc(ParsePos); + zoom := StrToFloat(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'imagesize') = 0 then begin + Inc(ParsePos); + Width := StrToInt(ParseValues[ParsePos]); + Inc(ParsePos); + Height := StrToInt(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'image_size') = 0 then begin + Inc(ParsePos); + Width := StrToInt(ParseValues[ParsePos]); + Inc(ParsePos); + Height := StrToInt(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'center') = 0 then begin + Inc(ParsePos); + center[0] := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos); + center[1] := StrToFloat(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'background') = 0 then begin + Inc(ParsePos); + // Trap conversion errors for older parameters + try + background[0] := StrToInt(ParseValues[ParsePos]); + except on EConvertError do + background[0] := 0; + end; + Inc(ParsePos); + try + background[1] := StrToInt(ParseValues[ParsePos]); + except on EConvertError do + background[1] := 0; + end; + Inc(ParsePos); + try + background[2] := StrToInt(ParseValues[ParsePos]); + except on EConvertError do + background[2] := 0; + end; + end else if AnsiCompareText(CurrentToken, 'curves') = 0 then begin + for i := 0 to 3 do + begin + Inc(ParsePos);curvePoints[i][0].x := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos);curvePoints[i][0].y := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos);curveWeights[i][0] := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos);curvePoints[i][1].x := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos);curvePoints[i][1].y := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos);curveWeights[i][1] := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos);curvePoints[i][2].x := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos);curvePoints[i][2].y := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos);curveWeights[i][2] := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos);curvePoints[i][3].x := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos);curvePoints[i][3].y := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos);curveWeights[i][3] := StrToFloat(ParseValues[ParsePos]); + end; + end else if AnsiCompareText(CurrentToken, 'pulse') = 0 then begin + Inc(ParsePos); + pulse[0, 0] := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos); + pulse[0, 1] := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos); + pulse[1, 0] := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos); + pulse[1, 1] := StrToFloat(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'wiggle') = 0 then begin + Inc(ParsePos); + wiggle[0, 0] := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos); + wiggle[0, 1] := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos); + wiggle[1, 0] := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos); + wiggle[1, 1] := StrToFloat(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'pixels_per_unit') = 0 then begin + Inc(ParsePos); + pixels_per_unit := StrToFloat(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'spatial_filter_radius') = 0 then begin + Inc(ParsePos); + spatial_filter_radius := StrToFloat(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'spatial_oversample') = 0 then begin + Inc(ParsePos); + spatial_oversample := StrToInt(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'sample_density') = 0 then begin + Inc(ParsePos); + sample_density := StrToFloat(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'nbatches') = 0 then begin + Inc(ParsePos); + nbatches := StrToInt(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'white_level') = 0 then begin + Inc(ParsePos); + white_level := StrToInt(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'cmap') = 0 then begin + Inc(ParsePos); + cmapindex := StrToInt(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'cmap_inter') = 0 then begin + Inc(ParsePos); + cmap_inter := StrToInt(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'palette') = 0 then begin +// Inc(ParsePos); +// cmapindex := StrToInt(ParseValues[ParsePos]); + OutputDebugString(Pchar('NYI import Palette')); + end else if AnsiCompareText(CurrentToken, 'density') = 0 then begin + Inc(ParsePos); + xform[CurrentXForm].Density := StrToFloat(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'color') = 0 then begin + Inc(ParsePos); + xform[CurrentXForm].color := StrToFloat(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'symmetry') = 0 then begin + Inc(ParsePos); + xform[CurrentXForm].symmetry := StrToFloat(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'coefs') = 0 then begin + Inc(ParsePos); + xform[CurrentXForm].c[0, 0] := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos); + xform[CurrentXForm].c[0, 1] := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos); + xform[CurrentXForm].c[1, 0] := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos); + xform[CurrentXForm].c[1, 1] := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos); + xform[CurrentXForm].c[2, 0] := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos); + xform[CurrentXForm].c[2, 1] := StrToFloat(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'post') = 0 then begin + Inc(ParsePos); + xform[CurrentXForm].p[0, 0] := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos); + xform[CurrentXForm].p[0, 1] := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos); + xform[CurrentXForm].p[1, 0] := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos); + xform[CurrentXForm].p[1, 1] := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos); + xform[CurrentXForm].p[2, 0] := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos); + xform[CurrentXForm].p[2, 1] := StrToFloat(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'postxswap') = 0 then begin + Inc(ParsePos); + xform[CurrentXForm].postXswap := (ParseValues[ParsePos] = '1'); + end else if AnsiCompareText(CurrentToken, 'autozscale') = 0 then begin + Inc(ParsePos); + xform[CurrentXForm].autoZscale := (ParseValues[ParsePos] = '1'); + end + //////////////////// + else if AnsiCompareText(CurrentToken, 'var_order') = 0 then begin + for i := 0 to NRVAR - 1 do + xform[CurrentXForm].ifs[i] := Varnames(i); + + i := 0; + while true do begin + if (ParsePos + 1) >= ParseValues.Count then + break; + if CharInSet(ParseValues[ParsePos + 1][1], ['a'..'z', 'A'..'Z', '.']) then + break; + + Inc(ParsePos); + xform[CurrentXForm].ifs[i] := Varnames(StrToInt(ParseValues[ParsePos])); + Inc(i); + end; + end + ////////////////////////// + else if AnsiCompareText(CurrentToken, 'vars') = 0 then begin + for i := 0 to NRVAR - 1 do begin + xform[CurrentXForm].SetVariation(i, 0.0); + end; + + i := 0; + while true do begin + if (ParsePos + 1) >= ParseValues.Count then + break; + if CharInSet(ParseValues[ParsePos + 1][1], ['a'..'z', 'A'..'Z']) then + break; + + Inc(ParsePos); + xform[CurrentXForm].SetVariation(i, StrToFloat(ParseValues[ParsePos])); + Inc(i); + end; + end else if AnsiCompareText(CurrentToken, 'variables') = 0 then begin +{ + v := 0; + for i:= 0 to GetNrVariableNames-1 do begin + xform[CurrentXForm].SetVariable(GetVariableNameAt(i), v); + end; +} + for i:= 0 to GetNrVariableNames-1 do begin + xform[CurrentXForm].ResetVariable(GetVariableNameAt(i)); + end; + + i := 0; + while true do begin + if (ParsePos + 1) >= ParseValues.Count then + break; + if CharInSet(ParseValues[ParsePos + 1][1], ['a'..'z', 'A'..'Z']) then + break; + + Inc(ParsePos); + v := StrToFloat(ParseValues[ParsePos]); + xform[CurrentXForm].SetVariable(GetVariableNameAt(i), v); + Inc(i); + end; + + end else if AnsiCompareText(CurrentToken, 'chaos') = 0 then begin + i := 0; + while true do begin + if (ParsePos + 1) >= ParseValues.Count then + break; + if CharInSet(ParseValues[ParsePos + 1][1], ['a'..'z', 'A'..'Z']) then + break; + + Inc(ParsePos); + v := StrToFloat(ParseValues[ParsePos]); + xform[CurrentXForm].modWeights[i] := v; + Inc(i); + end; + + end else if AnsiCompareText(CurrentToken, 'plotmode') = 0 then begin + Inc(ParsePos); + if((StrToInt(ParseValues[ParsePos]) = 1)) then + xform[CurrentXForm].transOpacity := 0; + end else if AnsiCompareText(CurrentToken, 'opacity') = 0 then begin + Inc(ParsePos); + xform[CurrentXForm].transOpacity := (StrToFloat(ParseValues[ParsePos])); + end else if AnsiCompareText(CurrentToken, 'var_color') = 0 then begin + Inc(ParsePos); + xform[CurrentXForm].pluginColor := (StrToFloat(ParseValues[ParsePos])); + end else begin + OutputDebugString(Pchar('Unknown Token: ' + CurrentToken)); + end; + + Inc(ParsePos); + end; + GetCmap(cmapindex, hue_rotation, Cmap); + + ParseValues.Free; + + FormatSettings.DecimalSeparator := OldDecimalSperator; +end; + + +procedure TControlPoint.SetVariation(vari: TVariation); +var + i, j, v: integer; + rv: integer; + VarPossible: boolean; +begin + FillVarDisturb; + VarPossible := false; + for j := 0 to NRVAR - 1 do begin + VarPossible := VarPossible or Variations[j]; + end; + + if VarPossible then begin + repeat + rv := var_distrib[random(Length(var_distrib))]; + until Variations[rv]; + end else begin + rv := 0; + end; + + for i := 0 to NXFORMS - 1 do begin + for j := 0 to NRVAR - 1 do begin + xform[i].SetVariation(j, 0.0); + end; + + if vari = vRandom then + begin + if rv < 0 then + begin + if VarPossible then begin + repeat + v := Mixed_var_distrib[random(Length(mixed_var_distrib))]; + until Variations[v]; // Use only Variations set in options + end else begin + v := 0; + end; + xform[i].SetVariation(v, 1.0); + end + else + xform[i].SetVariation(rv, 1.0); + end + else + xform[i].SetVariation(integer(vari), 1); + end; +end; + +procedure TControlPoint.RandomCP(min: integer = 2; max: integer = NXFORMS; calc: boolean = true); +var + nrXforms: integer; + i, j: integer; + v, rv: integer; + VarPossible: boolean; +begin +//hue_rotation := random; + hue_rotation := 1; + cmapindex := RANDOMCMAP; + GetCmap(cmapindex, hue_rotation, cmap); + time := 0.0; + +//nrXforms := xform_distrib[random(13)]; + nrXforms := random(Max - (Min - 1)) + Min; + + FillVarDisturb; + VarPossible := false; + for j := 0 to NRVAR - 1 do begin + VarPossible := VarPossible or Variations[j]; + end; + + if VarPossible then begin + repeat + rv := var_distrib[random(Length(var_distrib))]; + until Variations[rv]; + end else begin + rv := 0; + end; + + for i := 0 to NXFORMS - 1 do begin + xform[i].density := 0; + end; + + for i := 0 to nrXforms - 1 do begin + xform[i].density := 1.0 / nrXforms; + xform[i].color := i / (nrXforms - 1); + + xform[i].c[0][0] := 2 * random - 1; + xform[i].c[0][1] := 2 * random - 1; + xform[i].c[1][0] := 2 * random - 1; + xform[i].c[1][1] := 2 * random - 1; + xform[i].c[2][0] := 4 * random - 2; + xform[i].c[2][1] := 4 * random - 2; + + for j := 0 to NRVAR - 1 do begin + xform[i].SetVariation(j, 0); + end; + + {for j := 0 to NRVAR - 1 do begin + xform[i].SetVariation(j, 0); + end; } // AV: why do we do it twice? + + if rv < 0 then begin + if VarPossible then begin + repeat + v := Mixed_var_distrib[random(Length(mixed_var_distrib))]; + until Variations[v]; // use only variations set in options + end else begin + v := 0; + end; + + xform[i].SetVariation(v, 1); + end else + xform[i].SetVariation(rv, 1); + + end; + if calc then + CalcBoundbox; +end; + +procedure TControlPoint.RandomCP1; +var + i, j: Integer; +begin + RandomCP; + for i := 0 to NXFORMS - 1 do begin + for j := 0 to NRVAR - 1 do begin + xform[i].SetVariation(j, 0); + end; + xform[i].SetVariation(0, 1); + end; + + CalcBoundbox; +end; + +procedure TControlPoint.CalcBoundbox; +const + limit = 50; // AV +var + Points: TPointsArray; // AV: fixed - was TPointsXYArray; + i, j: integer; + deltax, minx, maxx: double; + cntminx, cntmaxx: integer; + deltay, miny, maxy: double; + cntminy, cntmaxy: integer; + LimitOutSidePoints: integer; +begin +// RandSeed := 1234567; + try + SetLength(Points, SUB_BATCH_SIZE); + Prepare; + IterateXYC(SUB_BATCH_SIZE, points); // AV: fixed - was IterateXY + + LimitOutSidePoints := Round(0.05 * SUB_BATCH_SIZE); + // who've been coding this nonsence?! + minx := limit; // 1e99; + maxx := -limit; // -1e99; + miny := limit; // 1e99; + maxy := -limit; // -1e99; + for i := 0 to SUB_BATCH_SIZE - 1 do begin + //if Points[i].x > 1e200 then continue; + // AV: rewrote the block to fix the crash + if InRange(Points[i].x, -limit, limit) then + begin + minx := min(minx, Points[i].x); + maxx := max(maxx, Points[i].x); + end + else + begin + minx := -limit; + maxx := limit; + end; + if InRange(Points[i].y, -limit, limit) then + begin + miny := min(miny, Points[i].y); + maxy := max(maxy, Points[i].y); + end + else + begin + miny := -limit; + maxy := limit; + end; + end; + + deltax := (maxx - minx) * 0.25; + maxx := (maxx + minx) / 2; + minx := maxx; + + deltay := (maxy - miny) * 0.25; + maxy := (maxy + miny) / 2; + miny := maxy; + + for j := 0 to 10 do begin + cntminx := 0; + cntmaxx := 0; + cntminy := 0; + cntmaxy := 0; + for i := 0 to SUB_BATCH_SIZE - 1 do begin + // AV: rewrote the block to fix the crash + if InRange(Points[i].x, -limit, limit) then + begin + if (Points[i].x < minx) then Inc(cntminx); + if (Points[i].x > maxx) then Inc(cntmaxx); + end; + if InRange(Points[i].y, -limit, limit) then + begin + if (Points[i].y < miny) then Inc(cntminy); + if (Points[i].y > maxy) then Inc(cntmaxy); + end; + end; + + if (cntMinx < LimitOutSidePoints) then begin + minx := minx + deltax; + end else begin + minx := minx - deltax; + end; + + if (cntMaxx < LimitOutSidePoints) then begin + maxx := maxx - deltax; + end else begin + maxx := maxx + deltax; + end; + + deltax := deltax / 2; + + if (cntMiny < LimitOutSidePoints) then begin + miny := miny + deltay; + end else begin + miny := miny - deltay; + end; + + if (cntMaxy < LimitOutSidePoints) then begin + maxy := maxy - deltay; + end else begin + maxy := maxy + deltay; + end; + + deltay := deltay / 2; + end; + + if (abs(maxx - minx) > 1000) or + (abs(maxy - miny) > 1000) then + raise EMathError.Create('Flame area too large'); + + center[0] := (minx + maxx) / 2; + center[1] := (miny + maxy) / 2; + if (abs(maxx - minx) > 0.001) and (abs(maxy - miny) > 0.001) then + pixels_per_unit := 0.65 * Min(Width / abs(maxx - minx), + Height / abs(maxy - miny)) + else + pixels_per_unit := 10; + except on EMathError do + begin // default + center[0] := 0; + center[1] := 0; + pixels_per_unit := 10; + end; + end; +end; + +function CalcUPRMagn(const cp: TControlPoint): double; +const + limit = 50; // AV +var + Points: TPointsXYArray; + i, j: integer; + deltax, minx, maxx: double; + cntminx, cntmaxx: integer; + deltay, miny, maxy: double; + cntminy, cntmaxy: integer; + LimitOutSidePoints: integer; + xLength, yLength: double; +begin + try + SetLength(Points, SUB_BATCH_SIZE); + cp.iterateXY(SUB_BATCH_SIZE, Points); + + LimitOutSidePoints := Round(0.05 * SUB_BATCH_SIZE); + + minx := limit; // AV // 1E99; + maxx := -limit; // AV // -1E99; + miny := limit; // AV // 1E99; + maxy := -limit; // AV // -1E99; + { // AV: commented out + for i := 0 to SUB_BATCH_SIZE - 1 do begin + minx := min(minx, Points[i].x); + maxx := max(maxx, Points[i].x); + miny := min(miny, Points[i].y); + maxy := max(maxy, Points[i].y); + end; + } + for i := 0 to SUB_BATCH_SIZE - 1 do begin // AV + if InRange(Points[i].x, -limit, limit) then + begin + minx := min(minx, Points[i].x); + maxx := max(maxx, Points[i].x); + end + else + begin + minx := -limit; + maxx := limit; + end; + if InRange(Points[i].y, -limit, limit) then + begin + miny := min(miny, Points[i].y); + maxy := max(maxy, Points[i].y); + end + else + begin + miny := -limit; + maxy := limit; + end; + end; + + deltax := (maxx - minx) * 0.25; + maxx := (maxx + minx) / 2; + minx := maxx; + + deltay := (maxy - miny) * 0.25; + maxy := (maxy + miny) / 2; + miny := maxy; + + for j := 0 to 10 do begin + cntminx := 0; + cntmaxx := 0; + cntminy := 0; + cntmaxy := 0; + { // AV: commented out + for i := 0 to SUB_BATCH_SIZE - 1 do begin + if (Points[i].x < minx) then Inc(cntminx); + if (Points[i].x > maxx) then Inc(cntmaxx); + if (Points[i].y < miny) then Inc(cntminy); + if (Points[i].y > maxy) then Inc(cntmaxy); + end; + } + for i := 0 to SUB_BATCH_SIZE - 1 do begin // AV + if InRange(Points[i].x, -limit, limit) then + begin + if (Points[i].x < minx) then Inc(cntminx); + if (Points[i].x > maxx) then Inc(cntmaxx); + end; + if InRange(Points[i].y, -limit, limit) then + begin + if (Points[i].y < miny) then Inc(cntminy); + if (Points[i].y > maxy) then Inc(cntmaxy); + end; + end; + + if (cntMinx < LimitOutSidePoints) then begin + minx := minx + deltax; + end else begin + minx := minx - deltax; + end; + + if (cntMaxx < LimitOutSidePoints) then begin + maxx := maxx - deltax; + end else begin + maxx := maxx + deltax; + end; + + deltax := deltax / 2; + + if (cntMiny < LimitOutSidePoints) then begin + miny := miny + deltay; + end else begin + miny := miny - deltay; + end; + + if (cntMaxy < LimitOutSidePoints) then begin + maxy := maxy - deltay; + end else begin + maxy := maxy + deltay; + end; + + deltay := deltay / 2; + end; + + if ((maxx - minx) > 1000) or + ((maxy - miny) > 1000) then + raise EMathError.Create('Flame area too large'); + + cp.center[0] := (minx + maxx) / 2; + cp.center[1] := (miny + maxy) / 2; + if ((maxx - minx) > 0.001) and ((maxy - miny) > 0.001) then + cp.pixels_per_unit := 0.7 * Min(cp.width / (maxx - minx), cp.height / (maxy - miny)) + else + cp.pixels_per_unit := 10; + + // Calculate magn for UPRs + xLength := maxx - minx; + yLength := maxy - miny; + if xLength >= yLength then + begin + result := 1 / xLength * 2; + end + else + begin + result := 1 / yLength * 2; + end; + + except on E: EMathError do + begin// default + cp.center[0] := 0; + cp.center[1] := 0; + cp.pixels_per_unit := 10; + raise Exception.Create('CalcUPRMagn: ' + e.Message); + end; + end; +end; + +// AV: this one from mine is used only for scripting, the original method was left for mutants +procedure TControlPoint.InterpolateAll(cp1, cp2: TControlPoint; Tm: double; it: integer); +var + result: TControlPoint; + c0, c1, k: double; + i, j: integer; + numTX, numTX1, numTX2: word; + r, s, t: array[0..2] of double; + v1, v2: double; + + function AngOpt(ang0, ang1: double): double; + var delta: double; + begin + delta := ang1 - ang0; + if (delta > pi) then Result := ang1 - 2 * pi + else if (delta < -pi)then Result := ang1 + 2 * pi + else Result := ang1; + end; + +begin + if (it > 3) or (it < 0) then Exit; + if (cp2.time - cp1.time) > 1E-6 then + begin + if (it < 2) then begin // 0 or 1: cosine interpolation + k := (cp2.time - tm) / (cp2.time - cp1.time); + c0 := (1 - cos(pi*k))* 0.5; + end + else // 2 or 3: linear interpolation + c0:=(cp2.time - tm) / (cp2.time - cp1.time); + c1 := 1 - c0; + end else begin + c0 := 1; + c1 := 0; + end; + + Result := TControlPoint.Create; + Result.time := Tm; + + if Odd(it) then // 1 or 3: hsv interpolation + for i := 0 to 255 do + begin + r[0] := cp1.cmap[i][0] / 255; + r[1] := cp1.cmap[i][1] / 255; + r[2] := cp1.cmap[i][2] / 255; + rgb2hsv(r, s); + r[0] := cp2.cmap[i][0] / 255; + r[1] := cp2.cmap[i][1] / 255; + r[2] := cp2.cmap[i][2] / 255; + rgb2hsv(r, t); + t[0] := c0 * s[0] + c1 * t[0]; + t[1] := c0 * s[1] + c1 * t[1]; + t[2] := c0 * s[2] + c1 * t[2]; + hsv2rgb(t, r); + Result.cmap[i][0] := Round(255 * r[0]); + Result.cmap[i][1] := Round(255 * r[1]); + Result.cmap[i][2] := Round(255 * r[2]); + end + else // 0 or 2: rgb interpolation + for i := 0 to 255 do + begin + Result.cmap[i][0] := Round(c0 * cp1.cmap[i][0] + c1 * cp2.cmap[i][0]); + Result.cmap[i][1] := Round(c0 * cp1.cmap[i][1] + c1 * cp2.cmap[i][1]); + Result.cmap[i][2] := Round(c0 * cp1.cmap[i][2] + c1 * cp2.cmap[i][2]); + end; + + Result.cmapindex := -1; + + Result.Fbrightness := c0 * cp1.Fbrightness + c1 * cp2.Fbrightness; + Result.contrast := c0 * cp1.contrast + c1 * cp2.contrast; + Result.gamma := c0 * cp1.gamma + c1 * cp2.gamma; + Result.vibrancy := c0 * cp1.vibrancy + c1 * cp2.vibrancy; + Result.gamma_threshold := c0 * cp1.gamma_threshold + c1 * cp2.gamma_threshold; + Result.width := cp1.width; + Result.height := cp1.height; + Result.spatial_oversample := Round(c0 * cp1.spatial_oversample + c1 * cp2.spatial_oversample); + Result.center[0] := c0 * cp1.center[0] + c1 * cp2.center[0]; + Result.center[1] := c0 * cp1.center[1] + c1 * cp2.center[1]; + Result.FAngle := c0 * cp1.FAngle + c1 * AngOpt(cp1.FAngle, cp2.FAngle); + Result.pixels_per_unit := c0 * cp1.pixels_per_unit + c1 * cp2.pixels_per_unit; + Result.background[0] := Round(c0 * cp1.background[0] + c1 * cp2.background[0]); + Result.background[1] := Round(c0 * cp1.background[1] + c1 * cp2.background[1]); + Result.background[2] := Round(c0 * cp1.background[2] + c1 * cp2.background[2]); + Result.spatial_filter_radius := c0 * cp1.spatial_filter_radius + c1 * cp2.spatial_filter_radius; + Result.sample_density := c0 * cp1.sample_density + c1 * cp2.sample_density; + Result.zoom := c0 * cp1.zoom + c1 * cp2.zoom; + Result.nbatches := Round(c0 * cp1.nbatches + c1 * cp2.nbatches); + Result.white_level := Round(c0 * cp1.white_level + c1 * cp2.white_level); + Result.finalXformEnabled := cp1.finalXformEnabled or cp2.finalXformEnabled; + + { AV: global 3D-parameters} + Result.cameraPitch := c0 * cp1.cameraPitch + c1 * AngOpt(cp1.cameraPitch, cp2.cameraPitch); + Result.cameraYaw := c0 * cp1.cameraYaw + c1 * AngOpt(cp1.cameraYaw, cp2.cameraYaw); + Result.cameraRoll := c0 * cp1.cameraRoll + c1 * AngOpt(cp1.cameraRoll, cp2.cameraRoll); + Result.cameraPersp := c0 * cp1.cameraPersp + c1 * cp2.cameraPersp; + Result.cameraZpos := c0 * cp1.cameraZpos + c1 * cp2.cameraZpos; + Result.cameraDOF := c0 * cp1.cameraDOF + c1 * cp2.cameraDOF; + + for i := 0 to 3 do begin + // Result.pulse[i div 2][i mod 2] := c0 * cp1.pulse[i div 2][i mod 2] + c1 * cp2.pulse[i div 2][i mod 2]; + // Result.wiggle[i div 2][i mod 2] := c0 * cp1.wiggle[i div 2][i mod 2] + c1 * cp2.wiggle[i div 2][i mod 2]; + Result.curvePoints[i][0].x := c0 * cp1.curvePoints[i][0].x + c1 * cp2.curvePoints[i][0].x; + Result.curvePoints[i][0].y := c0 * cp1.curvePoints[i][0].y + c1 * cp2.curvePoints[i][0].y; + Result.curveWeights[i][0] := c0 * cp1.curveWeights[i][0] + c1 * cp2.curveWeights[i][0]; + Result.curvePoints[i][1].x := c0 * cp1.curvePoints[i][1].x + c1 * cp2.curvePoints[i][1].x; + Result.curvePoints[i][1].y := c0 * cp1.curvePoints[i][1].y + c1 * cp2.curvePoints[i][1].y; + Result.curveWeights[i][1] := c0 * cp1.curveWeights[i][1] + c1 * cp2.curveWeights[i][1]; + Result.curvePoints[i][2].x := c0 * cp1.curvePoints[i][2].x + c1 * cp2.curvePoints[i][2].x; + Result.curvePoints[i][2].y := c0 * cp1.curvePoints[i][2].y + c1 * cp2.curvePoints[i][2].y; + Result.curveWeights[i][2] := c0 * cp1.curveWeights[i][2] + c1 * cp2.curveWeights[i][2]; + Result.curvePoints[i][3].x := c0 * cp1.curvePoints[i][2].x + c1 * cp2.curvePoints[i][2].x; + Result.curvePoints[i][3].y := c0 * cp1.curvePoints[i][3].y + c1 * cp2.curvePoints[i][3].y; + Result.curveWeights[i][3] := c0 * cp1.curveWeights[i][3] + c1 * cp2.curveWeights[i][3]; + end; + + numTX1 := cp1.NumXForms; + numTX2 := cp2.NumXForms; + numTX := max(numTX1, numTX2); // actual xforms including final + + if Result.finalXformEnabled then + begin + + if cp1.finalXformEnabled then + begin + if numTX1 < numTX then + begin + cp1.xform[numTX].Assign(cp1.xform[numTX1]); + cp1.xform[numTX1].Clear; + end; + end + else + cp1.xform[numTX].symmetry := 1; + + if cp2.finalXformEnabled then + begin + if numTX2 < numTX then + begin + cp2.xform[numTX].Assign(cp2.xform[numTX2]); + cp2.xform[numTX2].Clear; + end; + end + else + cp2.xform[numTX].symmetry := 1; + + // final XForm + Result.xform[numTX].color := c0 * cp1.xform[numTX].color + c1 * cp2.xform[numTX].color; + Result.xform[numTX].symmetry := c0 * cp1.xform[numTX].symmetry + c1 * cp2.xform[numTX].symmetry; + Result.xform[numTX].pluginColor := c0 * cp1.xform[numTX].pluginColor + c1 * cp2.xform[numTX].pluginColor; + Result.xform[numTX].ifs.Assign(cp2.xform[numTX].ifs); // AV: target variation order + for j := 0 to NrVar-1 do + Result.xform[numTX].SetVariation(j, c0 * cp1.xform[numTX].GetVariation(j) + c1 * cp2.xform[numTX].GetVariation(j)); + for j:= 0 to GetNrVariableNames-1 do begin + cp1.xform[numTX].GetVariable(GetVariableNameAt(j), v1); + cp2.xform[numTX].GetVariable(GetVariableNameAt(j), v2); + v1 := c0 * v1 + c1 * v2; + Result.xform[numTX].SetVariable(GetVariableNameAt(j), v1); + end; + for j := 0 to 2 do begin + Result.xform[numTX].c[j, 0] := c0 * cp1.xform[numTX].c[j, 0] + c1 * cp2.xform[numTX].c[j, 0]; + Result.xform[numTX].c[j, 1] := c0 * cp1.xform[numTX].c[j, 1] + c1 * cp2.xform[numTX].c[j, 1]; + Result.xform[numTX].p[j, 0] := c0 * cp1.xform[numTX].p[j, 0] + c1 * cp2.xform[numTX].p[j, 0]; + Result.xform[numTX].p[j, 1] := c0 * cp1.xform[numTX].p[j, 1] + c1 * cp2.xform[numTX].p[j, 1]; + end; + end else + Result.xform[numTX].symmetry := 1; + + // regular xforms + for i := 0 to numTX-1 do begin + Result.xform[i].density := c0 * cp1.xform[i].density + c1 * cp2.xform[i].density; + Result.xform[i].color := c0 * cp1.xform[i].color + c1 * cp2.xform[i].color; + Result.xform[i].symmetry := c0 * cp1.xform[i].symmetry + c1 * cp2.xform[i].symmetry; + Result.xform[i].transOpacity := c0 * cp1.xform[i].transOpacity + c1 * cp2.xform[i].transOpacity; + Result.xform[i].pluginColor := c0 * cp1.xform[i].pluginColor + c1 * cp2.xform[i].pluginColor; + for j := 0 to numTX - 1 do + Result.xform[i].modWeights[j] := c0 * cp1.xform[i].modWeights[j] + c1 * cp2.xform[i].modWeights[j]; + + Result.xform[i].ifs.Assign(cp2.xform[i].ifs); // AV: target variation order + for j := 0 to NrVar-1 do + Result.xform[i].SetVariation(j, c0 * cp1.xform[i].GetVariation(j) + c1 * cp2.xform[i].GetVariation(j)); + for j:= 0 to GetNrVariableNames-1 do begin + cp1.xform[i].GetVariable(GetVariableNameAt(j), v1); + cp2.xform[i].GetVariable(GetVariableNameAt(j), v2); + v1 := c0 * v1 + c1 * v2; + Result.xform[i].SetVariable(GetVariableNameAt(j), v1); + end; + // interpol matrices + for j := 0 to 2 do begin + Result.xform[i].c[j, 0] := c0 * cp1.xform[i].c[j, 0] + c1 * cp2.xform[i].c[j, 0]; + Result.xform[i].c[j, 1] := c0 * cp1.xform[i].c[j, 1] + c1 * cp2.xform[i].c[j, 1]; + Result.xform[i].p[j, 0] := c0 * cp1.xform[i].p[j, 0] + c1 * cp2.xform[i].p[j, 0]; + Result.xform[i].p[j, 1] := c0 * cp1.xform[i].p[j, 1] + c1 * cp2.xform[i].p[j, 1]; + end; + end; + + if Result.NumXForms < numTX then + begin + Result.xform[Result.NumXForms].Assign(Result.xform[numTX]); + Result.xform[numTX].Clear; + end; + + if numTX1 < numTX then + begin + cp1.xform[numTX1].Assign(cp1.xform[numTX]); + cp1.xform[numTX].Clear; + end; + if numTX2 < Result.NumXForms then + begin + cp2.xform[numTX2].Assign(cp2.xform[numTX]); + cp2.xform[numTX].Clear; + end; + + Copy(Result, false, numTX); + cmap := Result.cmap; + result.free; +end; + +procedure TControlPoint.InterpolateX(cp1, cp2: TControlPoint; Tm: double); +var + result: TControlPoint; + c0, c1: double; + i, j: integer; + r, s, t: array[0..2] of double; + v1, v2: double; +// totvar: double; + {z,rhtime: double;} + + nXforms1, nXforms2: integer; +begin + if (cp2.time - cp1.time) > 1E-6 then begin + c0 := (cp2.time - tm) / (cp2.time - cp1.time); + c1 := 1 - c0; + end else begin + c0 := 1; + c1 := 0; + end; + + Result := TControlPoint.Create; + Result.time := Tm; + + { // AV: since from now this is used only for mutants, we can skip it + if cp1.cmap_inter = 0 then + for i := 0 to 255 do begin + r[0] := cp1.cmap[i][0] / 255; + r[1] := cp1.cmap[i][1] / 255; + r[2] := cp1.cmap[i][2] / 255; + rgb2hsv(r, s); + r[0] := cp2.cmap[i][0] / 255; + r[1] := cp2.cmap[i][1] / 255; + r[2] := cp2.cmap[i][2] / 255; + rgb2hsv(r, t); + t[0] := c0 * s[0] + c1 * t[0]; + t[1] := c0 * s[1] + c1 * t[1]; + t[2] := c0 * s[2] + c1 * t[2]; + hsv2rgb(t, r); + Result.cmap[i][0] := Round(255 * r[0]); + Result.cmap[i][1] := Round(255 * r[1]); + Result.cmap[i][2] := Round(255 * r[2]); + end; + } + Result.cmap := cp1.cmap; // AV + Result.cmapindex := -1; + + Result.Fbrightness := c0 * cp1.Fbrightness + c1 * cp2.Fbrightness; + Result.contrast := c0 * cp1.contrast + c1 * cp2.contrast; + Result.gamma := c0 * cp1.gamma + c1 * cp2.gamma; + Result.vibrancy := c0 * cp1.vibrancy + c1 * cp2.vibrancy; + Result.gamma_threshold := c0 * cp1.gamma_threshold + c1 * cp2.gamma_threshold; + Result.width := cp1.width; + Result.height := cp1.height; + Result.spatial_oversample := Round(c0 * cp1.spatial_oversample + c1 * cp2.spatial_oversample); + Result.center[0] := c0 * cp1.center[0] + c1 * cp2.center[0]; + Result.center[1] := c0 * cp1.center[1] + c1 * cp2.center[1]; + Result.FAngle := c0 * cp1.FAngle + c1 * cp2.FAngle; + Result.pixels_per_unit := c0 * cp1.pixels_per_unit + c1 * cp2.pixels_per_unit; + { // AV: since from now this is used only for mutants, we can skip it + Result.background[0] := c0 * cp1.background[0] + c1 * cp2.background[0]; + Result.background[1] := c0 * cp1.background[1] + c1 * cp2.background[1]; + Result.background[2] := c0 * cp1.background[2] + c1 * cp2.background[2]; + } + Result.spatial_filter_radius := c0 * cp1.spatial_filter_radius + c1 * cp2.spatial_filter_radius; + Result.sample_density := c0 * cp1.sample_density + c1 * cp2.sample_density; + Result.zoom := c0 * cp1.zoom + c1 * cp2.zoom; + Result.nbatches := Round(c0 * cp1.nbatches + c1 * cp2.nbatches); + { + Result.white_level := Round(c0 * cp1.white_level + c1 * cp2.white_level); + for i := 0 to 3 do begin + Result.pulse[i div 2][i mod 2] := c0 * cp1.pulse[i div 2][i mod 2] + c1 * cp2.pulse[i div 2][i mod 2]; + Result.wiggle[i div 2][i mod 2] := c0 * cp1.wiggle[i div 2][i mod 2] + c1 * cp2.wiggle[i div 2][i mod 2]; + end; + } + Result.cameraPitch := c0 * cp1.cameraPitch; // AV + Result.cameraYaw := c0 * cp1.cameraYaw; // AV + Result.cameraRoll := c0 * cp1.cameraRoll; // AV + + // save finalxform from mut(il)ation ;) + nXforms1 := cp1.NumXForms; + if cp1.HasFinalXForm then + begin + if nXforms1 < NXFORMS then + begin + cp1.xform[NXFORMS].Assign(cp1.xform[nXforms1]); + cp1.xform[nXforms1].Clear; + end; + end + else begin + cp1.xform[NXFORMS].Clear; + cp1.xform[NXFORMS].symmetry := 1; + end; + + nXforms2 := cp2.NumXForms; + if cp2.HasFinalXForm then + begin + if nXforms2 < NXFORMS then + begin + cp2.xform[NXFORMS].Assign(cp2.xform[nXforms2]); + cp2.xform[nXforms2].Clear; + end; + end + else begin + cp2.xform[NXFORMS].Clear; + cp2.xform[NXFORMS].symmetry := 1; + end; + + for i := 0 to NXFORMS do + begin + Result.xform[i].density := c0 * cp1.xform[i].density + c1 * cp2.xform[i].density; + // AV: since we don't change final xforms, we can speed up the calculations + if Result.xform[i].density = 0.0 then break; + Result.xform[i].color := c0 * cp1.xform[i].color + c1 * cp2.xform[i].color; + Result.xform[i].symmetry := c0 * cp1.xform[i].symmetry + c1 * cp2.xform[i].symmetry; + Result.xform[i].transOpacity := c0 * cp1.xform[i].transOpacity + c1; // AV + + for j := 0 to NrVar-1 do + Result.xform[i].SetVariation(j, c0 * cp1.xform[i].GetVariation(j) + c1 * cp2.xform[i].GetVariation(j)); + for j:= 0 to GetNrVariableNames-1 do begin + cp1.xform[i].GetVariable(GetVariableNameAt(j), v1); + cp2.xform[i].GetVariable(GetVariableNameAt(j), v2); + v1 := c0 * v1 + c1 * v2; + Result.xform[i].SetVariable(GetVariableNameAt(j), v1); + end; + // interpol matrix + for j := 0 to 2 do begin + Result.xform[i].c[j, 0] := c0 * cp1.xform[i].c[j, 0] + c1 * cp2.xform[i].c[j, 0]; + Result.xform[i].c[j, 1] := c0 * cp1.xform[i].c[j, 1] + c1 * cp2.xform[i].c[j, 1]; + // AV + Result.xform[i].p[j, 0] := c0 * cp1.xform[i].p[j, 0] + c1 * cp2.xform[i].p[j, 0]; + Result.xform[i].p[j, 1] := c0 * cp1.xform[i].p[j, 1] + c1 * cp2.xform[i].p[j, 1]; + end; + end; + + // finalxform was supposed to be mutate-able too, but somehow it's always + // getting confused by random-generated mutatns :-\ + if Result.NumXForms < NXFORMS then + begin + Result.xform[Result.NumXForms].Assign(cp1.xform[NXFORMS]); //result.xform[NXFORMS]); + Result.xform[NXFORMS].Clear; + end; + Result.finalXformEnabled := cp1.finalXformEnabled; + + // restore finalxforms in source CPs + if nXforms1 < NXFORMS then + begin + cp1.xform[nXforms1].Assign(cp1.xform[NXFORMS]); + cp1.xform[NXFORMS].Clear; + end; + if nXforms2 < NXFORMS then + begin + cp2.xform[nXforms2].Assign(cp2.xform[NXFORMS]); + cp2.xform[NXFORMS].Clear; + end; + + Copy(Result, false, max(nxForms1, nxForms2)); // AV: added 2 parameters + cmap := Result.cmap; + result.free; +end; + +procedure TControlPoint.SaveToFile(Filename: string); +var + sl: TStringlist; +begin + sl := TStringlist.Create; + + SaveToStringlist(sl); + + sl.SaveToFile(filename); + sl.Free; +end; + +procedure TControlPoint.SaveToStringlist(sl: TStringlist); +var + i, j, k: Integer; + s: string; + OldDecimalSperator: Char; + v: double; + str: string; + curves: string; +begin + OldDecimalSperator := FormatSettings.DecimalSeparator; + FormatSettings.DecimalSeparator := '.'; + + sl.add(format('time %f', [time])); + if cmapindex >= 0 then + sl.add(format('cmap %d', [cmapindex])); + sl.add(format('zoom %g', [zoom])); // mt + sl.add(format('angle %g', [FAngle])); + + sl.add(format('cam_pitch %g', [cameraPitch])); + sl.add(format('cam_yaw %g', [cameraYaw])); + sl.add(format('cam_roll %g', [cameraRoll])); // AV + sl.add(format('cam_persp %g', [cameraPersp])); + sl.add(format('cam_zpos %g', [cameraZpos])); + sl.add(format('cam_dof %g', [cameraDOF])); + + for i := 0 to 3 do + begin + curves := curves + FloatToStr(curvePoints[i][0].x) + ' '; + curves := curves + FloatToStr(curvePoints[i][0].y) + ' '; + curves := curves + FloatToStr(curveWeights[i][0]) + ' '; + + curves := curves + FloatToStr(curvePoints[i][1].x) + ' '; + curves := curves + FloatToStr(curvePoints[i][1].y) + ' '; + curves := curves + FloatToStr(curveWeights[i][1]) + ' '; + + curves := curves + FloatToStr(curvePoints[i][2].x) + ' '; + curves := curves + FloatToStr(curvePoints[i][2].y) + ' '; + curves := curves + FloatToStr(curveWeights[i][2]) + ' '; + + curves := curves + FloatToStr(curvePoints[i][3].x) + ' '; + curves := curves + FloatToStr(curvePoints[i][3].y) + ' '; + curves := curves + FloatToStr(curveWeights[i][3]) + ' '; + end; + + curves := trim(curves); + sl.Add(Format('curves %s', [curves])); + + sl.add(format('image_size %d %d center %g %g pixels_per_unit %f', + [Width, Height, center[0], center[1], pixels_per_unit])); + sl.add(format('spatial_oversample %d spatial_filter_radius %f', + [spatial_oversample, spatial_filter_radius])); + sl.add(format('sample_density %g', [sample_density])); +// sl.add(format('nbatches %d white_level %d background %f %f %f', - changed to integers - mt + sl.add(format('nbatches %d white_level %d background %d %d %d', + [nbatches, white_level, background[0], background[1], background[2]])); + sl.add(format('brightness %f gamma %f contrast %f vibrancy %f gamma_threshold %f hue_rotation %f cmap_inter %d', + [Fbrightness * BRIGHT_ADJUST, gamma, contrast, vibrancy, gamma_threshold, hue_rotation, cmap_inter])); // AV: added contrast + sl.add(format('finalxformenabled %d', [ifthen(finalxformenabled, 1, 0)])); + sl.add(format('soloxform %d', [soloXform])); + + (*str := ''; + for i := 0 to used_plugins.Count-1 do begin + str := str + used_plugins[i]; + if (i = used_plugins.Count-1) then break; + str := str + ' '; + end; + sl.Add(format('plugins %s', [str])); *) + + for i := 0 to Min(NumXForms+1, NXFORMS) do + with xform[i] do begin + //if density = 0 then continue; - FinalXform has weight=0 + + sl.add(format('xform %d density %g color %g symmetry %g', [i, density, color, symmetry])); + + /////// AV: try to write variation order + s := 'var_order'; + for j := 0 to NRVAR - 1 do begin + s := format('%s %d', [s, GetVariationIndex(ifs[j])]); + end; + sl.add(s); + ////////////////////////// + + s := 'vars'; + for j := 0 to NRVAR - 1 do begin + s := format('%s %g', [s, GetVariation(j)]); + end; + sl.add(s); + s := 'variables'; + for j:= 0 to GetNrVariableNames-1 do begin +{$ifndef VAR_STR} + GetVariable(GetVariableNameAt(j), v); + s := format('%s %g', [s, v]); +{$else} + s := s + ' ' + GetVariableStr(GetVariableNameAt(j)); +{$endif} + end; + sl.add(s); + sl.Add(format('coefs %.6f %.6f %.6f %.6f %.6f %.6f', + [c[0][0], c[0][1], c[1][0], c[1][1], c[2][0], c[2][1]])); + sl.Add(format('post %.6f %.6f %.6f %.6f %.6f %.6f', + [p[0][0], p[0][1], p[1][0], p[1][1], p[2][0], p[2][1]])); + if postXswap then + sl.Add('postxswap 1') + else + sl.Add('postxswap 0'); + if autoZscale then + sl.Add('autozscale 1') + else + sl.Add('autozscale 0'); + s := 'chaos'; + for j := 0 to NumXForms+1 do begin + s := s + format(' %g', [modWeights[j]]); + end; + sl.Add(s); + + sl.Add(format('opacity %g', [transOpacity])); + sl.Add(format('var_color %g', [pluginColor])); + + end; + FormatSettings.DecimalSeparator := OldDecimalSperator; +end; + +procedure WriteDoubles(const handle: File; data: array of double); +var + block: TBlock; + i: integer; +begin + for i := 0 to Length(data)-1 do begin + DoubleToBlock(block, 0, 0); //pad to blocksize + DoubleToBlock(block, 8, data[i]); + BlockWrite(handle, block, 1); + end; +end; +procedure WriteString(const handle: File; data: string); +var + k, l, size, chunks: Integer; + raw : THibRawString; + block: TBlock; +begin + size := Length(data); + SetLength(raw, size); + CopyMemory(@raw[0], @data[1], size); + chunks := size div HIB_BLOCKSIZE; + + if size mod HIB_BLOCKSIZE > 0 then begin + size := (1 + size div HIB_BLOCKSIZE) * HIB_BLOCKSIZE; + chunks := chunks + 1; + end; + + for k := 0 to chunks - 1 do begin + for l := 0 to HIB_MAXOFFSET do + if (k * HIB_BLOCKSIZE + l) < size then + block[l] := raw[k * HIB_BLOCKSIZE + l] + else block[l] := 0; + BlockWrite(handle, block, 1); + end; +end; + +function CalcBinaryFlameSize(cp: TControlPoint): integer; +var + (*str: string; + i, nvariations, nvariables, nchaos: Integer;*) + handle: File; +begin + // I'm a bit ashamed but this hack has do to it for now... + AssignFile(handle, GetEnvironmentVariable('TEMP') + '\CalcBinaryFlameSizeTemp.bin'); + ReWrite(handle, HIB_BLOCKSIZE); + cp.SaveToBinary(handle); + Result := FileSize(handle) * HIB_BLOCKSIZE; + CloseFile(handle); + DeleteFile(GetEnvironmentVariable('TEMP') + '\CalcBinaryFlameSizeTemp.bin'); + + (*// CP data + Result := 224; + + // Var list + str := ''; + for i := 0 to NRVAR-1 do + str := str + VarNames(i) + #13#10; + for i:= 0 to GetNrVariableNames-1 do + str := str + GetVariableNameAt(i)+ #13#10; + str := trim(str); + if Length(str) mod HIB_BLOCKSIZE > 0 then + Result := Result + (1 + Length(str) div HIB_BLOCKSIZE) * HIB_BLOCKSIZE + else + Result := Result + Length(str); + + // XForm data + nchaos := Min(cp.NumXForms+1, NXFORMS); + nvariations := NRVAR; + nvariables := GetNrVariableNames; + if nvariations mod 2 > 0 then + nvariations := nvariations + 1; + if nvariables mod 2 > 0 then + nvariables := nvariables + 1; + if nchaos mod 2 > 0 then + nchaos := nchaos + 1; + Result := Result + (144 + (nvariations + nvariables + nchaos) * 8) * + Min(cp.NumXForms+1, NXFORMS); *) +end; + +procedure TControlPoint.SaveToBinary(const handle: File); +var + i, j, nvariations, nvariables, nchaos: Integer; + v: double; + str: string; + dbl: array of double; + block: TBlock; +begin + + DoubleToBlock(block, 0, time); + DoubleToBlock(block, 8, zoom); + BlockWrite(handle, block, 1); + + DoubleToBlock(block, 0, FAngle); + DoubleToBlock(block, 8, pixels_per_unit); + BlockWrite(handle, block, 1); + + DoubleToBlock(block, 0, center[0]); + DoubleToBlock(block, 8, center[1]); + BlockWrite(handle, block, 1); + + DoubleToBlock(block, 0, cameraPitch); + DoubleToBlock(block, 8, cameraYaw); + BlockWrite(handle, block, 1); +// AV TODO: cam_roll, contrast and var_order + DoubleToBlock(block, 0, cameraPersp); + DoubleToBlock(block, 8, cameraZpos); + BlockWrite(handle, block, 1); + + DoubleToBlock(block, 0, cameraDOF); + DoubleToBlock(block, 8, spatial_filter_radius); + BlockWrite(handle, block, 1); + + DoubleToBlock(block, 0, sample_density); + DoubleToBlock(block, 8, gamma_threshold); + BlockWrite(handle, block, 1); + + Int32ToBlock(block, 0, cmapindex); + Int32ToBlock(block, 4, spatial_oversample); + Int32ToBlock(block, 8, Width); + Int32ToBlock(block, 12, Height); + BlockWrite(handle, block, 1); + + Int32ToBlock(block, 0, nbatches); + Int32ToBlock(block, 4, cmap_inter); + Int32ToBlock(block, 8, ifthen(finalxformenabled, 1, 0)); + Int32ToBlock(block, 12, soloXform); + BlockWrite(handle, block, 1); + + Int32ToBlock(block, 0, white_level); + Int32ToBlock(block, 4, background[0]); + Int32ToBlock(block, 8, background[1]); + Int32ToBlock(block, 12, background[2]); + BlockWrite(handle, block, 1); + + DoubleToBlock(block, 0, Fbrightness * BRIGHT_ADJUST); + DoubleToBlock(block, 8, gamma); + BlockWrite(handle, block, 1); + + DoubleToBlock(block, 0, vibrancy); + DoubleToBlock(block, 8, hue_rotation); + BlockWrite(handle, block, 1); + + nchaos := Min(NumXForms+1, NXFORMS); + nvariations := NRVAR; + nvariables := GetNrVariableNames; + + Int32ToBlock(block, 0, nvariations); + Int32ToBlock(block, 4, nvariables); + Int32ToBlock(block, 8, nchaos); + + str := ''; + for i := 0 to nvariations-1 do + str := str + VarNames(i) + #0; + for i:= 0 to nvariables-1 do + str := str + GetVariableNameAt(i)+ #0; + str := trim(str); + if Length(str) mod HIB_BLOCKSIZE > 0 then + Int32ToBlock(block, 12, (1 + Length(str) div HIB_BLOCKSIZE) * HIB_BLOCKSIZE) + else + Int32ToBlock(block, 12, Length(str)); + BlockWrite(handle, block, 1); + + WriteString(handle, str); + + for i := 0 to nchaos - 1 do + with xform[i] do begin + DoubleToBlock(block, 0, density); + DoubleToBlock(block, 8, color); + BlockWrite(handle, block, 1); + + DoubleToBlock(block, 0, symmetry); + DoubleToBlock(block, 8, transOpacity); + BlockWrite(handle, block, 1); + + DoubleToBlock(block, 0, pluginColor); + Int32ToBlock(block, 8, IfThen(postXswap, 1, 0)); + Int32ToBlock(block, 12, IfThen(autozscale, 1, 0)); + BlockWrite(handle, block, 1); + + DoubleToBlock(block, 0, c[0][0]); + DoubleToBlock(block, 8, c[0][1]); + BlockWrite(handle, block, 1); + + DoubleToBlock(block, 0, c[1][0]); + DoubleToBlock(block, 8, c[1][1]); + BlockWrite(handle, block, 1); + + DoubleToBlock(block, 0, c[2][0]); + DoubleToBlock(block, 8, c[2][1]); + BlockWrite(handle, block, 1); + + DoubleToBlock(block, 0, p[0][0]); + DoubleToBlock(block, 8, p[0][1]); + BlockWrite(handle, block, 1); + + DoubleToBlock(block, 0, p[1][0]); + DoubleToBlock(block, 8, p[1][1]); + BlockWrite(handle, block, 1); + + DoubleToBlock(block, 0, p[2][0]); + DoubleToBlock(block, 8, p[2][1]); + BlockWrite(handle, block, 1); + + SetLength(dbl, nvariations); + for j := 0 to nvariations-1 do + dbl[j] := GetVariation(j); + WriteDoubles(handle, dbl); + + SetLength(dbl, nvariables); + for j := 0 to nvariables-1 do + GetVariable(GetVariableNameAt(j), dbl[j]); + WriteDoubles(handle, dbl); + + SetLength(dbl, nchaos); + for j := 0 to nchaos-1 do + dbl[j] := xform[i].modWeights[j]; + WriteDoubles(handle, dbl); + end; +end; + + +function TControlPoint.Clone: TControlPoint; +var + i, j: integer; + sl: TStringList; +begin + sl := TStringList.Create; + SaveToStringlist(sl); + Result := TControlPoint.Create; + Result.ParseStringlist(sl); + Result.Fangle := FAngle; + Result.cmap := cmap; + Result.name := name; + //Result.nick := nick; + //Result.url := url; + Result.hue_rotation := hue_rotation; // AV + Result.Transparency := Transparency; + Result.gamma_threshold := gamma_threshold; + Result.estimator := estimator; + Result.estimator_min := estimator_min; + Result.estimator_curve := estimator_curve; + Result.enable_de := enable_de; + Result.xdata := xdata; + + Result.Background[0] := background[0]; + Result.Background[1] := background[1]; + Result.Background[2] := background[2]; + + for i := 0 to 3 do + for j := 0 to 3 do begin + Result.CurveWeights[i,j] := curveWeights[i,j]; + Result.curvePoints[i,j].x := curvePoints[i,j].x; + Result.curvePoints[i,j].y := curvePoints[i,j].y; + end; + + Result.used_plugins.Clear; + Result.used_plugins.AddStrings(used_plugins); // AV + { for i := 0 to used_plugins.Count-1 do + Result.used_plugins.Add(used_plugins[i]); } + + for i := 0 to NXFORMS - 1 do + Result.xform[i].assign(xform[i]); + + sl.Free; +end; + +procedure TControlPoint.Copy(cp1: TControlPoint; KeepSizes: boolean = false; nt: byte = NXFORMS); +var + i, j: integer; + sl: TStringList; + w, h: integer; +begin + w := Width; + h := Height; + + Clear; + sl := TStringList.Create; + + // --Z-- this is quite a weird and unoptimal way to copy things: + cp1.SaveToStringlist(sl); + ParseStringlist(sl); + + Fangle := cp1.FAngle; + center[0]:= cp1.center[0]; + center[1]:= cp1.center[1]; + pixels_per_unit := cp1.pixels_per_unit; + cmap := cp1.cmap; + name := cp1.name; + //nick := cp1.nick; + //url := cp1.url; + hue_rotation := cp1.hue_rotation; // AV + gamma_threshold := cp1.gamma_threshold; + estimator := cp1.estimator; + estimator_min := cp1.estimator_min; + estimator_curve := cp1.estimator_curve; + enable_de := cp1.enable_de; + // used_plugins := cp1.used_plugins; // <<--- fixed memory leak // AV + xdata := cp1.xdata; + + background[0] := cp1.background[0]; + background[1] := cp1.background[1]; + background[2] := cp1.background[2]; + + for i := 0 to 3 do + for j := 0 to 3 do begin + CurveWeights[i,j] := cp1.curveWeights[i,j]; + curvePoints[i,j].x := cp1.curvePoints[i,j].x; + curvePoints[i,j].y := cp1.curvePoints[i,j].y; + end; + + if KeepSizes then + AdjustScale(w, h); + + used_plugins.Clear; + // AV: that's how we must copy strings: + used_plugins.AddStrings(cp1.used_plugins); + { for i := 0 to cp1.used_plugins.Count-1 do + used_plugins.Add(cp1.used_plugins[i]); } + + // AV: to speed up the interpolation + for i := 0 to nt {NXFORMS} do // was: NXFORMS-1 + xform[i].assign(cp1.xform[i]); + finalXformEnabled := cp1.finalXformEnabled; + + sl.Free; +end; + +procedure TControlPoint.ParseStringList(sl: TStringlist); +var + s: string; + i: integer; +begin + finalXformEnabled := false; + for i := 0 to sl.Count - 1 do begin + s := s + sl[i] + ' '; + end; + ParseString(s); +end; + +procedure TControlPoint.Clear; +var + i, j: Integer; +begin + symmetry := 0; + cmapindex := -1; + hue_rotation := 1; // AV + zoom := 0; + xdata := ''; + for i := 0 to NXFORMS do xform[i].Clear; + FinalXformEnabled := false; + soloxform := -1; + + for i := 0 to 3 do + begin + curvePoints[i][0].x := 0.00; curvePoints[i][0].y := 0.00; curveWeights[i][0] := 1; + curvePoints[i][1].x := 0.00; curvePoints[i][1].y := 0.00; curveWeights[i][1] := 1; + curvePoints[i][2].x := 1.00; curvePoints[i][2].y := 1.00; curveWeights[i][2] := 1; + curvePoints[i][3].x := 1.00; curvePoints[i][3].y := 1.00; curveWeights[i][3] := 1; + end; + + try + if (used_plugins <> nil) then + used_plugins.Clear; + // else used_plugins := TStringlist.Create; // AV: now it's not needed + except + // hack + // used_plugins := TStringList.Create; // AV: now it's not needed + end; +end; + +function TControlPoint.HasFinalXForm: boolean; +var + i: integer; +begin + with xform[NumXForms] do + begin + Result := (c[0,0]<>1) or (c[0,1]<>0) or (c[1,0]<>0) or (c[1,1]<>1) or (c[2,0]<>0) or (c[2,1]<>0) or + (p[0,0]<>1) or (p[0,1]<>0) or (p[1,0]<>0) or (p[1,1]<>1) or (p[2,0]<>0) or (p[2,1]<>0) or + (symmetry <> 1) or (GetVariation(0) <> 1); + if Result = false then + for i := 1 to NRVAR-1 do Result := Result or (GetVariation(i) <> 0); + end; +end; + +function add_symmetry_to_control_point(var cp: TControlPoint; sym: integer): integer; +const + sym_distrib: array[0..14] of integer = ( + -4, -3, + -2, -2, -2, + -1, -1, -1, + 2, 2, 2, + 3, 3, + 4, 4 + ); +var + i, j, k: integer; + a: double; +begin + result := 0; + if (0 = sym) then + if (random(1) <> 0) then + sym := sym_distrib[random(14)] + else if (random(32) <> 0) then // not correct + sym := random(13) - 6 + else + sym := random(51) - 25; + + if (1 = sym) or (0 = sym) then + begin + result := 0; + exit; + end; + + for i := 0 to NXFORMS - 1 do + if (cp.xform[i].density = 0.0) then break; + + if (i = NXFORMS) then + begin + result := 0; + exit; + end; + cp.symmetry := sym; + + if (sym < 0) then + begin + cp.xform[i].density := 1.0; + cp.xform[i].symmetry := 1; + cp.xform[i].SetVariation(0, 1.0); + for j := 1 to NRVAR - 1 do + cp.xform[i].SetVariation(j, 0.0); + cp.xform[i].color := 1.0; + cp.xform[i].c[0][0] := -1.0; + cp.xform[i].c[0][1] := 0.0; + cp.xform[i].c[1][0] := 0.0; + cp.xform[i].c[1][1] := 1.0; + cp.xform[i].c[2][0] := 0.0; + cp.xform[i].c[2][1] := 0.0; + + inc(i); + inc(result); + sym := -sym; + end; + + a := 2 * PI / sym; + +// for (k = 1; (k < sym)&&(i < NXFORMS); k + + ) { + k := 1; +// while (k < sym) and (i < NXFORMS) do + while (k < sym) and (i < SymmetryNVars) do + begin + cp.xform[i].density := 1.0; + cp.xform[i].SetVariation(0, 1); + cp.xform[i].symmetry := 1; + for j := 1 to NRVAR - 1 do + cp.xform[i].SetVariation(j, 0); + if sym < 3 then + cp.xform[i].color := 0 + else + cp.xform[i].color := (k - 1) / (sym - 2); + + if cp.xform[i].color > 1 then + begin +// ShowMessage('Color value larger than 1'); + repeat + cp.xform[i].color := cp.xform[i].color - 1 + until cp.xform[i].color <= 1; + end; + + cp.xform[i].c[0][0] := cos(k * a); + cp.xform[i].c[0][1] := sin(k * a); + cp.xform[i].c[1][0] := -cp.xform[i].c[0][1]; + cp.xform[i].c[1][1] := cp.xform[i].c[0][0]; + cp.xform[i].c[2][0] := 0.0; + cp.xform[i].c[2][1] := 0.0; + + inc(i); + inc(result); + inc(k); + end; +end; + +procedure tile_control_point(var cp: TControlPoint; sym: integer); +var k, i, j: integer; + t, cost, sint: double; +begin + for k := 0 to NXFORMS - 1 do + if (cp.xform[k].density = 0.0) then break; + if (k = NXFORMS) then exit; + + case sym of + 1: + for i := k to (k + 3) do + begin + cp.xform[i].density := 1.0; + cp.xform[i].symmetry := 1; + cp.xform[i].SetVariation(0, 1.0); + for j := 1 to NRVAR - 1 do + cp.xform[i].SetVariation(j, 0.0); + cp.xform[i].c[0][0] := 1.0; + cp.xform[i].c[0][1] := 0.0; + cp.xform[i].c[1][0] := 0.0; + cp.xform[i].c[1][1] := 1.0; + t := (i - k) * pi * 0.5; + SinCos(t, sint, cost); + cp.xform[i].c[2][0] := RhombTR * cost; + cp.xform[i].c[2][1] := RhombTR * sint; + end; + 2: + for i := k to (k + 3) do + begin + cp.xform[i].density := 1.0; + cp.xform[i].symmetry := 1; + cp.xform[i].SetVariation(0, 1.0); + for j := 1 to NRVAR - 1 do + cp.xform[i].SetVariation(j, 0.0); + cp.xform[i].c[0][0] := 1.0; + cp.xform[i].c[0][1] := 0.0; + cp.xform[i].c[1][0] := 0.0; + cp.xform[i].c[1][1] := 1.0; + t := pi * ((i - k) * 0.5 + 0.25); + SinCos(t, sint, cost); + cp.xform[i].c[2][0] := SquareTR * cost; + cp.xform[i].c[2][1] := SquareTR * sint; + end; + 3: + for i := k to (k + 5) do + begin + cp.xform[i].density := 1.0; + cp.xform[i].symmetry := 1; + cp.xform[i].SetVariation(0, 1.0); + for j := 1 to NRVAR - 1 do + cp.xform[i].SetVariation(j, 0.0); + cp.xform[i].c[0][0] := 1.0; + cp.xform[i].c[0][1] := 0.0; + cp.xform[i].c[1][0] := 0.0; + cp.xform[i].c[1][1] := 1.0; + t := (i - k) * pi / 3; + SinCos(t, sint, cost); + cp.xform[i].c[2][0] := HexTR * cost; + cp.xform[i].c[2][1] := HexTR * sint; + end; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TControlPoint.ZoomtoRect(R: TSRect); +var + scale, ppu: double; + dx,dy: double; +begin + scale := power(2, zoom); + ppu := pixels_per_unit * scale; + + dx := ((r.Left + r.Right)/2 - Width/2) / ppu; + dy := ((r.Top + r.Bottom)/2 - Height/2) / ppu; + + center[0] := center[0] + cos(FAngle) * dx - sin(FAngle) * dy; + center[1] := center[1] + sin(FAngle) * dx + cos(FAngle) * dy; + + if PreserveQuality then + zoom := Log2(scale * ( Width/(abs(r.Right - r.Left) + 1))) + else + pixels_per_unit := pixels_per_unit * Width / abs(r.Right - r.Left); +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TControlPoint.ZoomOuttoRect(R: TSRect); +var + ppu: double; + dx, dy: double; +begin + + if PreserveQuality then + zoom := Log2(power(2, zoom) / ( Width/(abs(r.Right - r.Left) + 1))) + else + pixels_per_unit := pixels_per_unit / Width * abs(r.Right - r.Left); + ppu := pixels_per_unit * power(2, zoom); + + dx := ((r.Left + r.Right)/2 - Width/2) / ppu; + dy := ((r.Top + r.Bottom)/2 - Height/2) / ppu; + + center[0] := center[0] - cos(FAngle) * dx + sin(FAngle) * dy; + center[1] := center[1] - sin(FAngle) * dx - cos(FAngle) * dy; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TControlPoint.ZoomIn(Factor: double); +var + scale: double; +begin + scale := power(2, zoom); + + Scale := Scale / Factor; + Zoom := Log2(Scale); +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TControlPoint.MoveRect(R: TSRect); +var + scale: double; + ppux, ppuy: double; + dx,dy: double; +begin + scale := power(2, zoom); + ppux := pixels_per_unit * scale; + ppuy := pixels_per_unit * scale; + + dx := (r.Left - r.Right)/ppux; + dy := (r.Top - r.Bottom)/ppuy; + + center[0] := center[0] + cos(FAngle) * dx - sin(FAngle) * dy; + center[1] := center[1] + sin(FAngle) * dx + cos(FAngle) * dy ; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TControlPoint.Rotate(Angle: double); +begin + FAngle := FAngle + Angle; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TControlPoint.getppux: double; +begin + result := pixels_per_unit * power(2, zoom) +end; + +function TControlPoint.getppuy: double; +begin + result := pixels_per_unit * power(2, zoom) +end; + +/////////////////////////////////////////////////////////////////////////////// +function TControlPoint.GetBrightness: double; +begin + Result := Fbrightness; +end; + +procedure TControlPoint.SetBrightness(br: double); +begin + if br > 0 then begin + if Fbrightness <> 0 then gamma_threshold := (gamma_threshold / Fbrightness) * br; + Fbrightness := br; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TControlPoint.GetRelativeGammaThreshold: double; +begin + if Fbrightness <> 0 then + Result := gamma_threshold / Fbrightness + else + Result := gamma_threshold; +end; + +procedure TControlPoint.SetRelativeGammaThreshold(gtr: double); +begin + gamma_threshold := gtr * Fbrightness; +end; + +/////////////////////////////////////////////////////////////////////////////// +var + vdfilled: boolean = False; + +procedure FillVarDisturb; +const + startvar_distrib: array[0..26] of integer = (-1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7); + startmixed_var_distrib: array[0..16] of integer = (0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7); +var + i: integer; +begin + if vdfilled then + Exit; + + setlength(var_distrib, NRVAR + 19); + setlength(mixed_var_distrib, NRVAR + 9); + + for i := 0 to High(startvar_distrib) do + var_distrib[i] := startvar_distrib[i]; + + for i := High(startvar_distrib) + 1 to high(var_distrib) do + var_distrib[i] := 8 + i - High(startvar_distrib) - 1; + + for i := 0 to High(startmixed_var_distrib) do + mixed_var_distrib[i] := startmixed_var_distrib[i]; + + for i := High(startmixed_var_distrib) + 1 to high(mixed_var_distrib) do + mixed_var_distrib[i] := 8 + i - High(startmixed_var_distrib) - 1; + + vdfilled := true; +end; + +/////////////////////////////////////////////////////////////////////////////// +// +// --Z-- cp-specific functions moved here from MainForm +// + +function TControlPoint.NumXForms: integer; +var + i: integer; +begin +//... + Result := NXFORMS; + for i := 0 to NXFORMS - 1 do + begin + if xform[i].density = 0 then + begin + Result := i; + Break; + end; + end; +end; + +function TControlPoint.TrianglesFromCP(var Triangles: TTriangles): integer; +{ Sets up the triangles from the IFS code } +var + i, j: integer; + temp_x, temp_y, xset, yset: double; + left, top, bottom, right: double; +begin + top := 0; bottom := 0; right := 0; left := 0; + Result := NumXForms; +{ + if ReferenceMode > 0 then + begin + for i := 0 to Result-1 do + begin + xset := 1.0; + yset := 1.0; + for j := 0 to 5 do + with xform[i] do begin + temp_x := xset * c[0][0] + yset * c[1][0] + c[2][0]; + temp_y := xset * c[0][1] + yset * c[1][1] + c[2][1]; + xset := temp_x; + yset := temp_y; + end; + if (i = 0) then + begin + left := xset; + right := xset; + top := yset; + bottom := yset; + end + else + begin + if (xset < left) then left := xset; + if (xset > right) then right := xset; + if (yset > top) then top := yset; + if (yset < bottom) then bottom := yset; + end; + end; + + if ReferenceMode = 1 then + begin + Triangles[-1].x[0] := right-left; + Triangles[-1].y[0] := 0; + Triangles[-1].x[1] := 0; + Triangles[-1].y[1] := 0; + Triangles[-1].x[2] := 0; + Triangles[-1].y[2] := -(top-bottom); + end + else begin + Triangles[-1].x[0] := right; + Triangles[-1].y[0] := -bottom; + Triangles[-1].x[1] := left; + Triangles[-1].y[1] := -bottom; + Triangles[-1].x[2] := left; + Triangles[-1].y[2] := -top; + end; + end + else +} + begin + Triangles[-1].x[0] := 1; Triangles[-1].y[0] := 0; // "x" + Triangles[-1].x[1] := 0; Triangles[-1].y[1] := 0; // "0" + Triangles[-1].x[2] := 0; Triangles[-1].y[2] := -1; // "y" + end; + + for j := 0 to Result do + begin + for i := 0 to 2 do + with xform[j] do begin + if postXswap then begin + Triangles[j].x[i] := Triangles[-1].x[i] * p[0][0] + Triangles[-1].y[i] * p[1][0] + p[2][0]; + Triangles[j].y[i] := Triangles[-1].x[i] * p[0][1] + Triangles[-1].y[i] * p[1][1] + p[2][1]; + end + else begin + Triangles[j].x[i] := Triangles[-1].x[i] * c[0][0] + Triangles[-1].y[i] * c[1][0] + c[2][0]; + Triangles[j].y[i] := Triangles[-1].x[i] * c[0][1] + Triangles[-1].y[i] * c[1][1] + c[2][1]; + end; + end; + end; + EnableFinalXform := FinalXformEnabled; + + // I don't like this... :-/ + for j := -1 to Result do // was: Result-1 + for i := 0 to 2 do + Triangles[j].y[i] := -Triangles[j].y[i]; +end; + +procedure TControlPoint.EqualizeWeights; +var + t, i: integer; +begin + t := NumXForms; + for i := 0 to t - 1 do + xform[i].density := 0.5; +end; + +procedure TControlPoint.NormalizeWeights; +var + i: integer; + td: double; +begin + td := 0.0; + for i := 0 to NumXForms - 1 do + td := td + xform[i].Density; + if (td < 0.001) then + EqualizeWeights + else + for i := 0 to NumXForms - 1 do + xform[i].Density := xform[i].Density / td; +end; + +procedure TControlPoint.RandomizeWeights; +var + i: integer; +begin + for i := 0 to Transforms - 1 do + xform[i].Density := Random; +end; + +procedure TControlPoint.ComputeWeights(Triangles: TTriangles; t: integer); +// Caclulate transform weight from triangle areas +var + i: integer; + total_area: double; +begin + total_area := 0; + for i := 0 to t - 1 do + begin + xform[i].Density := triangle_area(Triangles[i]); + total_area := total_area + xform[i].Density; + end; + for i := 0 to t - 1 do + begin + xform[i].Density := xform[i].Density / total_area; + end; + //? cp1.NormalizeWeights; +end; + + procedure TControlPoint.NormalizeProbabilities; + // AV: useful for matematicians, useless for other people :) +var + i: integer; + sum, p: double; +begin + sum := 0.0; + for i := 0 to NumXForms - 1 do + sum := sum + xform[i].Density; + if sum = 1.0 then Exit; + for i := 0 to NumXForms - 1 do + begin + p := xform[i].Density / sum; + if (p < 1E-6) then p := 1E-6; + xform[i].Density := p; + end; +end; + +procedure TControlPoint.CalculateWeights; +// AV: Calculate transform weight from its affine determinants +var + i: integer; + deta, detp: double; +begin + for i := 0 to NumXForms - 1 do + begin + with xform[i] do + begin + deta := c[0][0] * c[1][1] - c[0][1] * c[1][0]; + detp := p[0][0] * p[1][1] - p[0][1] * p[1][0]; + end; + + deta := abs(deta * detp); + if (deta < 1E-6) then deta := 1E-6; + xform[i].Density := deta; + end; +end; + +procedure TControlPoint.CalculateColorSpeed; +var + i: integer; + maxw, sumw, w0, d: double; + eqw: boolean; +begin + if Transforms = 1 then exit; // single xform + eqw := True; + w0 := xform[0].density; + maxw := w0; sumw := 0; + for i := 0 to Transforms - 1 do + begin + sumw := sumw + xform[i].density; + if (xform[i].density > maxw) then maxw := xform[i].density; + if eqw then if (xform[i].density <> w0) then eqw := False; + end; + + if (not eqw) then + for i := 0 to Transforms - 1 do + begin + with xform[i] do + begin + if (GetVariation(0) = 1) then // if affine + begin + d := abs(c[0,0]*c[1,1] - c[0,1]*c[1,0]); // contraction factor + symmetry := min(d, 1); + end + else if (density > 0.01) then + symmetry := 0.85 * density / maxw + else + symmetry := -1; + end; + end + else // equal weights + for i := 0 to Transforms - 1 do + xform[i].symmetry := 0; +end; + +procedure TControlPoint.GetFromTriangles(const Triangles: TTriangles; const t: integer); +var + i: integer; + v: double; +begin + for i := 0 to t do + if xform[i].postXswap then + begin + solve3(Triangles[-1].x[0], -Triangles[-1].y[0], Triangles[i].x[0], + Triangles[-1].x[1], -Triangles[-1].y[1], Triangles[i].x[1], + Triangles[-1].x[2], -Triangles[-1].y[2], Triangles[i].x[2], + xform[i].p[0][0], xform[i].p[1][0], xform[i].p[2][0]); + + solve3(Triangles[-1].x[0], -Triangles[-1].y[0], -Triangles[i].y[0], + Triangles[-1].x[1], -Triangles[-1].y[1], -Triangles[i].y[1], + Triangles[-1].x[2], -Triangles[-1].y[2], -Triangles[i].y[2], + xform[i].p[0][1], xform[i].p[1][1], xform[i].p[2][1]); + end + else begin + solve3(Triangles[-1].x[0], -Triangles[-1].y[0], Triangles[i].x[0], + Triangles[-1].x[1], -Triangles[-1].y[1], Triangles[i].x[1], + Triangles[-1].x[2], -Triangles[-1].y[2], Triangles[i].x[2], + xform[i].c[0][0], xform[i].c[1][0], xform[i].c[2][0]); + + solve3(Triangles[-1].x[0], -Triangles[-1].y[0], -Triangles[i].y[0], + Triangles[-1].x[1], -Triangles[-1].y[1], -Triangles[i].y[1], + Triangles[-1].x[2], -Triangles[-1].y[2], -Triangles[i].y[2], + xform[i].c[0][1], xform[i].c[1][1], xform[i].c[2][1]); + if xform[i].autoZscale then with xform[i] do begin + v := c[0][0]*c[1][1] - c[0][1]*c[1][0]; + //n := GetVariationIndex('pre_zscale'); + if v = 1 then + SetVariation(20, 0.0) // pre_zscale not needed + else + SetVariation(20, sign(v) * sqrt(abs(v))); + end; + end; + FinalXformEnabled := EnableFinalXform; +end; + +procedure TControlPoint.GetTriangle(var Triangle: TTriangle; const n: integer); +var + i, j: integer; +begin + for i := 0 to 2 do + with xform[n] do begin + Triangle.x[i] := MainTriangles[-1].x[i] * c[0][0] - MainTriangles[-1].y[i] * c[1][0] + c[2][0]; + Triangle.y[i] := -MainTriangles[-1].x[i] * c[0][1] + MainTriangles[-1].y[i] * c[1][1] - c[2][1]; + end; +end; + +procedure TControlPoint.GetPostTriangle(var Triangle: TTriangle; const n: integer); +var + i, j: integer; +begin + for i := 0 to 2 do + with xform[n] do begin + Triangle.x[i] := MainTriangles[-1].x[i] * p[0][0] - MainTriangles[-1].y[i] * p[1][0] + p[2][0]; + Triangle.y[i] := -MainTriangles[-1].x[i] * p[0][1] + MainTriangles[-1].y[i] * p[1][1] - p[2][1]; + end; +end; + +//////////////////////////////////////////////////////////////////////////////// +procedure TControlPoint.AdjustScale(w, h: integer); +begin +// if width >= height then + pixels_per_unit := pixels_per_unit * w/width; +// else +// pixels_per_unit := pixels_per_unit * h/height; + width := w; + height := h; +end; + +end. + diff --git a/Flame/RndFlame.pas b/Flame/RndFlame.pas new file mode 100644 index 0000000..d7a432b --- /dev/null +++ b/Flame/RndFlame.pas @@ -0,0 +1,638 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} +unit RndFlame; + +interface + +uses + ControlPoint, Xform; + +function RandomFlame(SourceCP: TControlPoint= nil; algorithm: integer = 0): TControlPoint; + +implementation + +uses + SysUtils, Global, cmap, GradientHlpr, XFormMan, Classes; + +/////////////////////////////////////////////////////////////////////////////// +// AV: this procedure repeated in the source code 3 times! +(* procedure RGBBlend(a, b: integer; var Palette: TColorMap); +{ Linear blend between to indices of a palette } +var + c, v: real; + vrange, range: real; + i: integer; +begin + if a = b then + begin + Exit; + end; + range := b - a; + vrange := Palette[b mod 256][0] - Palette[a mod 256][0]; + c := Palette[a mod 256][0]; + v := vrange / range; + for i := (a + 1) to (b - 1) do + begin + c := c + v; + Palette[i mod 256][0] := Round(c); + end; + vrange := Palette[b mod 256][1] - Palette[a mod 256][1]; + c := Palette[a mod 256][1]; + v := vrange / range; + for i := a + 1 to b - 1 do + begin + c := c + v; + Palette[i mod 256][1] := Round(c); + end; + vrange := Palette[b mod 256][2] - Palette[a mod 256][2]; + c := Palette[a mod 256][2]; + v := vrange / range; + for i := a + 1 to b - 1 do + begin + c := c + v; + Palette[i mod 256][2] := Round(c); + end; +end; *) + +function CreatePalette(strng: string): TColorMap; +{ Loads a palette from a gradient string } +var + Strings: TStringList; + index, i: integer; + Tokens: TStringList; + Indices, Colors: TStringList; + a, b: integer; +begin + Strings := TStringList.Create; + Tokens := TStringList.Create; + Indices := TStringList.Create; + Colors := TStringList.Create; + try + try + Strings.Text := strng; + if Pos('}', Strings.Text) = 0 then raise EFormatInvalid.Create('No closing brace'); + if Pos('{', Strings[0]) = 0 then raise EFormatInvalid.Create('No opening brace.'); + GetTokens(ReplaceTabs(strings.text), tokens); + Tokens.Text := Trim(Tokens.text); + i := 0; + while (Pos('}', Tokens[i]) = 0) and (Pos('opacity:', Lowercase(Tokens[i])) = 0) do + begin + if Pos('index=', LowerCase(Tokens[i])) <> 0 then + Indices.Add(GetVal(Tokens[i])) + else if Pos('color=', LowerCase(Tokens[i])) <> 0 then + Colors.Add(GetVal(Tokens[i])); + inc(i) + end; + for i := 0 to 255 do + begin + Result[i][0] := 0; + Result[i][1] := 0; + Result[i][2] := 0; + end; + if Indices.Count = 0 then raise EFormatInvalid.Create('No color info'); + for i := 0 to Indices.Count - 1 do + begin + try + index := StrToInt(Indices[i]); + while index < 0 do inc(index, 400); + index := Round(Index * (255 / 399)); + indices[i] := IntToStr(index); + assert(index>=0); + assert(index<256); + Result[index][0] := StrToInt(Colors[i]) mod 256; + Result[index][1] := trunc(StrToInt(Colors[i]) / 256) mod 256; + Result[index][2] := trunc(StrToInt(Colors[i]) / 65536); + except + end; + end; + i := 1; + repeat + a := StrToInt(Trim(Indices[i - 1])); + b := StrToInt(Trim(Indices[i])); + RGBBlend(a, b, Result); + inc(i); + until i = Indices.Count; + if (Indices[0] <> '0') or (Indices[Indices.Count - 1] <> '255') then + begin + a := StrToInt(Trim(Indices[Indices.Count - 1])); + b := StrToInt(Trim(Indices[0])) + 256; + RGBBlend(a, b, Result); + end; + except on EFormatInvalid do + begin +// Result := False; + end; + end; + finally + Tokens.Free; + Strings.Free; + Indices.Free; + Colors.Free; + end; +end; + +procedure GetGradientFileGradientsNames(const filename: string; var NamesList: TStringList); +var + i, p: integer; + Title: string; + FStrings: TStringList; +begin + FStrings := TStringList.Create; + FStrings.LoadFromFile(filename); + try + if (Pos('{', FStrings.Text) <> 0) then + begin + for i := 0 to FStrings.Count - 1 do + begin + p := Pos('{', FStrings[i]); + if (p <> 0) and (Pos('(3D)', FStrings[i]) = 0) then + begin + Title := Trim(Copy(FStrings[i], 1, p - 1)); + if Title <> '' then + NamesList.Add(Trim(Copy(FStrings[i], 1, p - 1))); + end; + end; + end; + finally + FStrings.Free; + end; +end; + +procedure RandomGradient(SourceCP, DestCP: TControlPoint); +var + tmpGrad: string; + tmpGrdList: TStringList; +begin + case randGradient of + 0: + begin + cmap_index := Random(NRCMAPS); + GetCMap(cmap_index, 1, DestCP.cmap); +// cmap_index := DestCP.cmapindex; + DestCP.cmapIndex := cmap_index; + end; + 1: + begin + DestCP.cmap := DefaultPalette; + DestCP.cmapIndex := cmap_index; + end; + 2: + if assigned(SourceCP) then begin + DestCP.cmap := SourceCP.cmap; + DestCP.cmapIndex := SourceCP.cmapIndex; + end else begin + cmap_index := Random(NRCMAPS); + GetCMap(cmap_index, 1, DestCP.cmap); + DestCP.cmapIndex := cmap_index; + end; + 3: + DestCP.cmap := GradientHelper.RandomGradient; + 4: + if FileExists(randGradientFile) then + begin + tmpGrdList := TStringList.Create; + GetGradientFileGradientsNames(randGradientFile, tmpGrdList); + tmpGrad := GetGradient(randGradientFile, tmpGrdList.Strings[random(tmpGrdList.Count)]); + DestCP.cmap := CreatePalette(tmpGrad); + tmpGrdList.Free; + end else + begin + cmap_index := Random(NRCMAPS); + GetCMap(cmap_index, 1, DestCP.cmap); + DestCP.cmapIndex := cmap_index; + end; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure RandomVariation(cp: TControlPoint); +{ Randomise variation parameters } +var + a, b, i, j: integer; + VarPossible: boolean; +begin + inc(MainSeed); + RandSeed := MainSeed; + + VarPossible := false; + for j := 0 to NRVAR - 1 do begin + VarPossible := VarPossible or Variations[j]; + end; + + for i := 0 to cp.NumXForms - 1 do begin + for j := 0 to NRVAR - 1 do + cp.xform[i].SetVariation(j, 0); + + if VarPossible then begin + repeat + a := random(NRVAR); + until Variations[a]; + + repeat + b := random(NRVAR); + until Variations[b]; + end else begin + a := 0; + b := 0; + end; + + if (a = b) then begin + cp.xform[i].SetVariation(a, 1); + end else begin + cp.xform[i].SetVariation(a, random); + cp.xform[i].SetVariation(b, 1 - cp.xform[i].GetVariation(a)); + end; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure SetVariation(cp: TControlPoint); +{ Set the current Variation } +var + i, j: integer; +begin + if Variation = vRandom then begin + RandomVariation(cp); + end else + for i := 0 to cp.NumXForms - 1 do begin + for j := 0 to NRVAR - 1 do + cp.xform[i].SetVariation(j, 0); + cp.xform[i].SetVariation(integer(Variation), 1); + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +(* --Z-- hmm, exactly the same function exists in module Main + +function TrianglesFromCP(const cp1: TControlPoint; var Triangles: TTriangles): integer; +{ Sets up the triangles from the IFS code } +var + xforms: integer; + i, j: integer; + temp_x, temp_y, xset, yset: double; + left, top, bottom, right: double; + a, b, c, d, e, f: double; +begin + top := 0; bottom := 0; right := 0; left := 0; + xforms := NumXForms(cp1); + Result := xforms; + if not FixedReference then + begin + for i := 0 to xforms - 1 do + begin + a := cp1.xform[i].c[0][0]; + b := cp1.xform[i].c[0][1]; + c := cp1.xform[i].c[1][0]; + d := cp1.xform[i].c[1][1]; + e := cp1.xform[i].c[2][0]; + f := cp1.xform[i].c[2][1]; + xset := 1.0; + yset := 1.0; + for j := 0 to 5 do + begin + temp_x := xset * a + yset * c + e; + temp_y := xset * b + yset * d + f; + xset := temp_x; + yset := temp_y; + end; + if (i = 0) then + begin + left := xset; + right := xset; + top := yset; + bottom := yset; + end + else + begin + if (xset < left) then left := xset; + if (xset > right) then right := xset; + if (yset < top) then top := yset; + if (yset > bottom) then bottom := yset; + end; + end; + Triangles[-1].x[0] := left; + Triangles[-1].x[1] := right; + Triangles[-1].x[2] := right; + Triangles[-1].y[0] := bottom; + Triangles[-1].y[1] := bottom; + Triangles[-1].y[2] := top; + end + else + begin + Triangles[-1].x[0] := 0; Triangles[-1].y[0] := 0; + Triangles[-1].x[1] := 1; Triangles[-1].y[1] := 0; + Triangles[-1].x[2] := 1; Triangles[-1].y[2] := 1.5; + end; + + for j := 0 to xforms - 1 do + begin + a := cp1.xform[j].c[0][0]; + b := cp1.xform[j].c[0][1]; + c := cp1.xform[j].c[1][0]; + d := cp1.xform[j].c[1][1]; + e := cp1.xform[j].c[2][0]; + f := cp1.xform[j].c[2][1]; + for i := 0 to 2 do + begin + triangles[j].x[i] := Triangles[-1].x[i] * a + Triangles[-1].y[i] * + c + e; + triangles[j].y[i] := Triangles[-1].x[i] * b + Triangles[-1].y[i] * + d + f; + end; + end; + for i := -1 to xforms - 1 do + for j := 0 to 2 do + triangles[i].y[j] := -triangles[i].y[j]; +end; +*) + +/////////////////////////////////////////////////////////////////////////////// +procedure EqualizeWeights(var cp: TControlPoint); +var + t, i: integer; +begin + t := cp.NumXForms; + for i := 0 to t - 1 do + cp.xform[i].density := 1.0 / t; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure NormalizeWeights(var cp: TControlPoint); +var + i: integer; + td: double; +begin + td := 0.0; + for i := 0 to cp.NumXForms - 1 do + td := td + cp.xform[i].Density; + if (td < 0.001) then + EqualizeWeights(cp) + else + for i := 0 to cp.NumXForms - 1 do + cp.xform[i].Density := cp.xform[i].Density / td; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure ComputeWeights(var cp1: TControlPoint; Triangles: TTriangles; t: integer); +{ Caclulates transform weight from triangles } +var + i: integer; + total_area: double; +begin + total_area := 0.0; + for i := 0 to t - 1 do + begin + cp1.xform[i].Density := triangle_area(Triangles[i]); + total_area := total_area + cp1.xform[i].Density; + end; + for i := 0 to t - 1 do + begin + cp1.xform[i].Density := cp1.xform[i].Density / total_area; + end; + NormalizeWeights(cp1); +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure RandomWeights(var cp1: TControlPoint); +{ Randomizes xform weights } +var + i: integer; +begin + for i := 0 to Transforms - 1 do + cp1.xform[i].Density := random; + NormalizeWeights(cp1); +end; + +/////////////////////////////////////////////////////////////////////////////// +function RandomFlame(SourceCP: TControlPoint; algorithm: integer): TControlPoint; +var + Min, Max, i, j, rnd: integer; + Triangles: TTriangles; + r, s, theta, phi: double; + cosphi, sintheta, costheta: double; + skip: boolean; +begin + if Assigned(SourceCP) then + Result := SourceCP.clone + else + Result := TControlPoint.Create; + + Min := randMinTransforms; + Max := randMaxTransforms; + + inc(MainSeed); + RandSeed := MainSeed; + transforms := random(Max - (Min - 1)) + Min; + repeat + try + inc(MainSeed); + RandSeed := MainSeed; + Result.clear; + Result.RandomCP(transforms, transforms, false); + Result.SetVariation(Variation); + inc(MainSeed); + RandSeed := MainSeed; + + case algorithm of + 1: rnd := 0; + 2: rnd := 7; + 3: rnd := 9; + else + if (Variation = vLinear) or (Variation = vRandom) then + rnd := random(10) + else + rnd := 9; + end; + case rnd of + 0..6: + begin + for i := 0 to Transforms - 1 do + begin + // AV: useless assignments + {if Random(10) < 9 then + Result.xform[i].c[0, 0] := 1 + else + Result.xform[i].c[0, 0] := -1; + Result.xform[i].c[0, 1] := 0; + Result.xform[i].c[1, 0] := 0; + Result.xform[i].c[1, 1] := 1; + Result.xform[i].c[2, 0] := 0; + Result.xform[i].c[2, 1] := 0; + Result.xform[i].color := 0; } + Result.xform[i].symmetry := 0; + Result.xform[i].SetVariation(0, 1); + for j := 1 to NRVAR - 1 do + Result.xform[i].SetVariation(j, 0); + // AV: hundred of useless calculations + {Result.xform[i].Translate(random * 2 - 1, random * 2 - 1); + Result.xform[i].Rotate(random * 360); + if i > 0 then + Result.xform[i].Scale(random * 0.8 + 0.2) + else + Result.xform[i].Scale(random * 0.4 + 0.6); } + if i > 0 then + s := random * 0.8 + 0.2 + else + s := random * 0.4 + 0.6; + theta := random * 2 * pi; + sintheta := s * sin(theta); + costheta := s * cos(theta); + if Random(10) < 9 then + begin + Result.xform[i].c[0, 0] := costheta; + Result.xform[i].c[1, 0] := sintheta; + end + else begin + Result.xform[i].c[0, 0] := -costheta; + Result.xform[i].c[1, 0] := -sintheta; + end; + Result.xform[i].c[0, 1] := -sintheta; + Result.xform[i].c[1, 1] := costheta; + Result.xform[i].c[2, 0] := random * 2 - 1; + Result.xform[i].c[2, 1] := random * 2 - 1; + if Random(2) = 0 then + Result.xform[i].Multiply(1, random - 0.5, random - 0.5, 1); + + if Random(2) = 1 then + begin + // AV: added post-transforms support! + theta := 2 * random * pi; + r := 0.3 + random * 0.7; + sintheta := r * sin(theta); + costheta := r * cos(theta); + Result.xform[i].p[0, 0] := costheta; + Result.xform[i].p[0, 1] := sintheta; + Result.xform[i].p[1, 0] := -sintheta; + Result.xform[i].p[1, 1] := costheta; + Result.xform[i].p[2,0] := random * 2 - 1; + Result.xform[i].p[2,1] := random * 2 - 1; + end; + end; + SetVariation(Result); + end; + 7, 8: + begin + { From the source to Chaos: The Software } + for i := 0 to Transforms - 1 do begin + r := random * 2 - 1; + if ((0 <= r) and (r < 0.2)) then + r := r + 0.2; + if ((r > -0.2) and (r <= 0)) then + r := r - 0.2; + s := random * 2 - 1; + if ((0 <= s) and (s < 0.2)) then + s := s + 0.2; + if ((s > -0.2) and (s <= 0)) then + s := s - -0.2; + theta := PI * random; + phi := (2 + random) * PI / 4; + // AV: we don't need to calculate everything twice! + sintheta := sin(theta); + costheta := cos(theta); + cosphi := cos(phi); + Result.xform[i].c[0][0] := r * costheta; + Result.xform[i].c[1][0] := s * (costheta * cosphi - sintheta); + Result.xform[i].c[0][1] := r * sintheta; + Result.xform[i].c[1][1] := s * (sintheta * cosphi + costheta); + { the next bit didn't translate so well, so I fudge it} + Result.xform[i].c[2][0] := random * 2 - 1; + Result.xform[i].c[2][1] := random * 2 - 1; + end; + for i := 0 to NXFORMS-1 do + Result.xform[i].density := 0; + for i := 0 to Transforms - 1 do + Result.xform[i].density := 1 / Transforms; + SetVariation(Result); + end; + 9: begin + for i := 0 to NXFORMS-1 do + Result.xform[i].density := 0; + for i := 0 to Transforms - 1 do + Result.xform[i].density := 1 / Transforms; + end; + end; // case + Result.TrianglesFromCp(Triangles); + if Random(2) > 0 then + ComputeWeights(Result, Triangles, transforms) + else + EqualizeWeights(Result); + except on E: EmathError do + begin + Continue; + end; + end; + for i := 0 to Transforms - 1 do + Result.xform[i].color := i / (transforms - 1); + if Result.xform[0].density = 1 then + Continue; + case SymmetryType of + { Bilateral } + 1: add_symmetry_to_control_point(Result, -1); + { Rotational } + 2: add_symmetry_to_control_point(Result, SymmetryOrder); + { Rotational and Reflective } + 3: add_symmetry_to_control_point(Result, -SymmetryOrder); + end; + { elimate flames with transforms that aren't affine } + skip := false; + for i := 0 to Transforms - 1 do begin + if not transform_affine(Triangles[i], Triangles) then + skip := True; + end; + if skip then + continue; + until not Result.BlowsUP(5000) and (Result.xform[0].density <> 0); + + RandomGradient(SourceCP, Result); + + Result.brightness := defBrightness; + Result.gamma := defGamma; + Result.gamma_threshold := defGammaThreshold; + Result.vibrancy := defVibrancy; + Result.sample_density := defSampleDensity; + Result.spatial_oversample := defOversample; + Result.spatial_filter_radius := defFilterRadius; + Result.contrast := defContrast; // AV + if KeepBackground and assigned(SourceCP) then begin + Result.background[0] := SourceCP.background[0]; + Result.background[1] := SourceCP.background[1]; + Result.background[2] := SourceCP.background[2]; + end else if (RandBackColor <> 0) then begin // AV: to set the user's predefined BG + Result.background[0] := RandBackColor and 255; + Result.background[1] := RandBackColor shr 8 and 255; + Result.background[2] := RandBackColor shr 16 and 255; + end else begin + Result.background[0] := 0; + Result.background[1] := 0; + Result.background[2] := 0; + end; + Result.zoom := 0; + //Result.Nick := SheepNick; + //Result.URl := SheepURL; + + Result.xform[Result.NumXForms].Clear; + Result.xform[Result.NumXForms].symmetry := 1; +end; + +end. diff --git a/Flame/XForm.pas b/Flame/XForm.pas new file mode 100644 index 0000000..8576909 --- /dev/null +++ b/Flame/XForm.pas @@ -0,0 +1,2084 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +// REMOVE COMMENT TO COMPILE T-500 +//{$define T500} +//{$define Light} + +unit XForm; + +interface + +uses +{$ifdef Apo7X64} +{$else} +AsmRandom, +{$endif} + XFormMan, BaseVariation, Classes; + +const + MAX_WEIGHT = 1000.0; + {$ifndef Light} + {$ifndef T500} + NXFORMS = 100; + {$else} + NXFORMS = 250; // 500; // AV: to use 1-byte type + {$endif} + {$else} + NXFORMS = 50; + {$endif} + +type + TCPpoint = record + x, y, z, c: double; + end; + PCPpoint = ^TCPpoint; + + TXYpoint = record + x, y: double; + end; + PXYpoint = ^TXYpoint; + + T2Cpoint = record + x, y, c1, c2: double; + end; + + TMatrix = array[0..2, 0..2] of double; + +{$ifdef Apo7X64} +{$else} + {$define _ASM_} +{$endif} + +type + TXForm = class + public + + c: array[0..2, 0..1] of double; // the coefs to the affine part of the function + p: array[0..2, 0..1] of double; // post-transform coefs! + density: double; // prob is this function is chosen + color: double; // color coord for this function. 0 - 1 + color2: double; // Second color coord for this function. 0 - 1 + vc: double; // Calculated color to be passed to the plugin + symmetry: double; + c00, c01, c10, c11, c20, c21: double; // unnecessary duplicated variables + p00, p01, p10, p11, p20, p21: double; // :-) + postXswap: boolean; + TransformName : string; + + autoZscale: boolean; // for 3d editing + transOpacity: double; + pluginColor: double; + + modWeights: array [0..NXFORMS] of double; + PropTable: array of TXForm; + + // Orientationtype: integer; + ifs: TStringList; // AV: to keep custom variation order + private + vars: array of double; // {normalized} interp coefs between variations + FNrFunctions: Integer; + FFunctionList: array of TCalcFunction; + FCalcFunctionList: array of TCalcFunction; + + FTx, FTy: double; // must remain in this order + FPx, FPy: double; // some asm code relies on this + + FTz, FPz: double; // 3d hack + + FAngle: double; + FSinA: double; + FCosA: double; + FLength: double; + colorC1, colorC2: double; + + // precalculated constants for some variations + polar_vpi, disc_vpi: double; + polar2_vpi, p2vv2: double; + + gauss_rnd: array [0..3] of double; + gauss_N: integer; + + rx_sin, rx_cos, ry_sin, ry_cos: double; + px_sin, px_cos, py_sin, py_cos: double; + + FRegVariations: array of TBaseVariation; + + procedure PrecalcAngle; + procedure PrecalcSinCos; + procedure PrecalcAll; + procedure DoPostTransform; + procedure DoInvalidOperation; + + procedure Linear3D; // vars[0] + procedure PreBlur3D; // vars[2] + procedure Spherical; // vars[3] + procedure Swirl; // vars[4] + procedure Horseshoe; // vars[5] + procedure Polar; // vars[6] + + procedure Disc; // vars[7] + procedure Spiral; // vars[8] + procedure hyperbolic; // vars[9] + procedure Diamond; // vars[10] + + procedure Eyefish; // vars[11] + procedure Bubble; // vars[12] + procedure Cylinder; // vars[13] + procedure Noise; // vars[14] + procedure Blur; // vars[15] + procedure Gaussian; // vars[16] + procedure ZBlur; // vars[17] + procedure Blur3D; // vars[18] + + procedure PreBlur; // vars[19] + procedure PreZScale; // vars[2] + procedure PreZTranslate; // vars[21] + procedure PreRotateX; // vars[22] + procedure PreRotateY; // vars[23] + + procedure Flatten; // vars[1] + procedure ZScale; // vars[24] + procedure ZTranslate; // vars[25] + procedure ZCone; // vars[26] + + procedure PostRotateX; // vars[27] + procedure PostRotateY; // vars[28] + + procedure PostMirrorX; // vars[29] + procedure PostMirrorY; // vars[30] + procedure PostMirrorZ; // vars[31] + + procedure Hemisphere; // vars[32] + procedure Cross; // vars[33] + procedure Pyramid; // vars[34] + procedure Polar2; // vars[35] + + function Mul33(const M1, M2: TMatrix): TMatrix; + function Identity: TMatrix; + + procedure BuildFunctionlist; + procedure AddRegVariations; + + public + constructor Create; + destructor Destroy; override; + procedure Clear(keepXaos: boolean = false); + procedure Prepare; + procedure PrepareInvalidXForm; + + procedure Assign(Xform: TXForm); + + procedure NextPoint(var CPpoint: TCPpoint); + procedure NextPointTo(var CPpoint, ToPoint: TCPpoint); + procedure NextPointXY(var px, py: double); + procedure NextPoint2C(var p: T2CPoint); + + procedure Rotate(const degrees: double); + procedure Translate(const x, y: double); + procedure Multiply(const a, b, c, d: double); + procedure Scale(const s: double); + + procedure GetVariable(const name: string; var Value: double); + procedure SetVariable(const name: string; var Value: double); + procedure ResetVariable(const name: string); + + function GetVariableStr(const name: string): string; + procedure SetVariableStr(const name: string; var Value: string); + + function ToXMLString: string; + function FinalToXMLString(IsEnabled: boolean): string; + + function GetVariation(index : integer) : double; + procedure SetVariation(index : integer; value : double); + function NumVariations : integer; + end; + +implementation + +uses + SysUtils, Math, StrUtils; + +const + EPS: double = 1E-300; + +function TXForm.NumVariations : integer; +begin + Result := length(vars); +end; + +function TXForm.GetVariation(index : integer) : double; +begin + Result := vars[index]; +end; + +procedure TXForm.SetVariation(index : integer; value : double); +begin + { + if (vars[index] = 0) and (value <> 0) then begin + // Activate var here + end else begin + // Deactivate var here + end; + } + vars[index] := value; +end; + + +{ TXForm } + +/////////////////////////////////////////////////////////////////////////////// +constructor TXForm.Create; +var i: Integer; +begin + AddRegVariations; + BuildFunctionlist; + SetLength(vars, NRLOCVAR + Length(FRegVariations)); + // AV: set default variations order + ifs := TStringList.Create; + for i := 0 to NrVar-1 do ifs.Add(Varnames(i)); + + Clear; +end; + +procedure TXForm.Clear(keepXaos: boolean = false); +var + i: Integer; +begin + density := 0; + color := 0; + symmetry := 0; + postXswap := false; + autoZscale := false; + + c[0, 0] := 1; + c[0, 1] := 0; + c[1, 0] := 0; + c[1, 1] := 1; + c[2, 0] := 0; + c[2, 1] := 0; + + p[0, 0] := 1; + p[0, 1] := 0; + p[1, 0] := 0; + p[1, 1] := 1; + p[2, 0] := 0; + p[2, 1] := 0; + + vars[0] := 1; + for i := 1 to High(vars) do + vars[i] := 0; + + if not keepXaos then // AV: for linked xforms + for i := 0 to NXFORMS do + modWeights[i] := 1; + + for i := 0 to NrVar-1 do // restore default order + ifs.Strings[i] := Varnames(i); + + transOpacity := 1; + pluginColor := 1; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.Prepare; +var + i, v: integer; + CalculateAngle, CalculateSinCos, CalculateLength: boolean; + mode: double; + vn: string; +begin + c00 := c[0][0]; + c01 := c[0][1]; + c10 := c[1][0]; + c11 := c[1][1]; + c20 := c[2][0]; + c21 := c[2][1]; + + colorC1 := (1 + symmetry)/2; + colorC2 := color*(1 - symmetry)/2; + + FNrFunctions := 0; + + for i := 0 to High(FRegVariations) do begin + FRegVariations[i].FPX := @FPX; + FRegVariations[i].FPY := @FPY; + FRegVariations[i].FPz := @FPz; + FRegVariations[i].FTX := @FTX; + FRegVariations[i].FTY := @FTY; + FRegVariations[i].FTz := @FTz; + FRegVariations[i].a := c00; + FRegVariations[i].b := c01; + FRegVariations[i].c := c10; + FRegVariations[i].d := c11; + FRegVariations[i].e := c20; + FRegVariations[i].f := c21; + FRegVariations[i].color := @vc; + + FRegVariations[i].vvar := vars[i + NRLOCVAR]; + FRegVariations[i].Prepare; + FRegVariations[i].GetCalcFunction(FFunctionList[NRLOCVAR + i]); + end; + + SetLength(FCalcFunctionList, NrVar + 2); + + CalculateAngle := (vars[6] <> 0.0) or (vars[7] <> 0.0) or (vars[35] <> 0.0); +// CalculateLength := False; + CalculateSinCos := (vars[8] <> 0.0) or (vars[10] <> 0.0); + + // Pre- variations + for i := 0 to NrVar - 1 do + begin + v := GetVariationIndex(ifs[i]); + if (vars[v] <> 0.0) then + begin + vn := ifs[i]; + if (LeftStr(vn, 4) = 'pre_') or (vn = 'flatten') then // AV: flatten became pre_ + begin + FCalcFunctionList[FNrFunctions] := FFunctionList[v]; + Inc(FNrFunctions); + end + // AV: added some universal variations + else if (vn = 'affine3D') or (vn = 'trianglecrop') + or (vn = 'projective') or (vn = 'spherecrop') then + begin + GetVariable(vn + '_mode', mode); + if (mode = 0) then + begin + FCalcFunctionList[FNrFunctions] := FFunctionList[v]; + Inc(FNrFunctions); + end; + end; + end; + end; + + // Precalc must be called after pre- vars + if CalculateAngle or CalculateSinCos then + begin + if CalculateAngle and CalculateSinCos then + FCalcFunctionList[FNrFunctions] := PrecalcAll + else if CalculateAngle then + FCalcFunctionList[FNrFunctions] := PrecalcAngle + else //if CalculateSinCos then + FCalcFunctionList[FNrFunctions] := PrecalcSinCos; + Inc(FNrFunctions); + end; + + // Normal variations + for i := 0 to NrVar - 1 do + begin + v := GetVariationIndex(ifs[i]); + if (vars[v] <> 0.0) then + begin + vn := ifs[i]; + if (LeftStr(vn, 4) = 'pre_') or + (LeftStr(vn, 5) = 'post_') or + (vn = 'flatten') then continue; + if (vn = 'affine3D') or (vn = 'trianglecrop') + or (vn = 'projective') or (vn = 'spherecrop') then + begin + GetVariable(vn + '_mode', mode); + if (mode <> 1) then continue; + end; + + FCalcFunctionList[FNrFunctions] := FFunctionList[v]; + Inc(FNrFunctions); + end; + end; + + // Post- variations + for i := 0 to NrVar - 1 do + begin + v := GetVariationIndex(ifs[i]); + if (vars[v] <> 0.0) then + begin + vn := ifs[i]; + if (LeftStr(vn, 5) = 'post_') then + begin + FCalcFunctionList[FNrFunctions] := FFunctionList[v]; + Inc(FNrFunctions); + end + // AV: added some universal variations + else if (vn = 'affine3D') or (vn = 'trianglecrop') + or (vn = 'projective') or (vn = 'spherecrop') then + begin + GetVariable(ifs[i] + '_mode', mode); + if (mode = 2) then + begin + FCalcFunctionList[FNrFunctions] := FFunctionList[v]; + Inc(FNrFunctions); + end; + end; + end; + end; + + polar_vpi := vars[6]/pi; + disc_vpi := vars[7]/pi; + polar2_vpi := vars[35]/pi; + p2vv2 := polar2_vpi * 0.5; + + gauss_rnd[0] := random; + gauss_rnd[1] := random; + gauss_rnd[2] := random; + gauss_rnd[3] := random; + gauss_N := 0; + + rx_sin := sin(vars[22] * pi/2); + rx_cos := cos(vars[22] * pi/2); + ry_sin := sin(vars[23] * pi/2); + ry_cos := cos(vars[23] * pi/2); + + px_sin := sin(vars[27] * pi/2); + px_cos := cos(vars[27] * pi/2); + py_sin := sin(vars[28] * pi/2); + py_cos := cos(vars[28] * pi/2); + + if (p[0,0]<>1) or (p[0,1]<>0) or(p[1,0]<>0) or (p[1,1]<>1) or (p[2,0]<>0) or (p[2,1]<>0) then + begin + p00 := p[0][0]; + p01 := p[0][1]; + p10 := p[1][0]; + p11 := p[1][1]; + p20 := p[2][0]; + p21 := p[2][1]; + + FCalcFunctionList[FNrFunctions] := DoPostTransform; + Inc(FNrFunctions); + end; + +end; + +procedure TXForm.PrepareInvalidXForm; +begin + c00 := 1; + c01 := 0; + c10 := 0; + c11 := 1; + c20 := 0; + c21 := 0; + + colorC1 := 1; + colorC2 := 0; + + FNrFunctions := 1; + SetLength(FCalcFunctionList, 1); + FCalcFunctionList[0] := DoInvalidOperation; +end; + +procedure TXForm.PrecalcAngle; +{$ifndef _ASM_} +begin + FAngle := arctan2(FTx, FTy); +{$else} +asm + fld qword ptr [eax + FTx] + fld qword ptr [eax + FTy] + fpatan + fstp qword ptr [eax + FAngle] + //fwait +{$endif} +end; + +procedure TXForm.PrecalcSinCos; +{$ifndef _ASM_} +begin + FLength := sqrt(sqr(FTx) + sqr(FTy)) + EPS; + FSinA := FTx / FLength; + FCosA := FTy / FLength; +{$else} +asm + fld qword ptr [eax + FTx] + fld qword ptr [eax + FTy] + fld st(1) + fmul st, st + fld st(1) + fmul st, st + faddp + fsqrt + fadd qword ptr [EPS] // avoid divide by zero...(?) + fdiv st(1), st + fdiv st(2), st + fstp qword ptr [eax + FLength] + fstp qword ptr [eax + FCosA] + fstp qword ptr [eax + FSinA] + //fwait +{$endif} +end; + +procedure TXForm.PrecalcAll; +{$ifndef _ASM_} +begin + FLength := sqrt(sqr(FTx) + sqr(FTy)) + EPS; + FSinA := FTx / FLength; + FCosA := FTy / FLength; + FAngle := arctan2(FTx, FTy); +{$else} +asm + fld qword ptr [eax + FTx] + fld qword ptr [eax + FTy] + fld st(1) + fld st(1) + fpatan + fstp qword ptr [eax + FAngle] + fld st(1) + fmul st, st + fld st(1) + fmul st, st + faddp + fsqrt + fadd qword ptr [EPS] // avoid divide by zero...(?) + fdiv st(1), st + fdiv st(2), st + fstp qword ptr [eax + FLength] + fstp qword ptr [eax + FCosA] + fstp qword ptr [eax + FSinA] + //fwait +{$endif} +end; + +procedure TXForm.DoPostTransform; +{$ifndef _ASM_} +var + tmp: double; +begin + tmp := FPx; + FPx := p00 * FPx + p10 * FPy + p20; + FPy := p01 * tmp + p11 * FPy + p21; +{$else} +asm + fld qword ptr [eax + FPy] + fld qword ptr [eax + FPx] + fld st(1) + fmul qword ptr [eax + p10] + fld st(1) + fmul qword ptr [eax + p00] + faddp + fadd qword ptr [eax + p20] + fstp qword ptr [eax + FPx] + fmul qword ptr [eax + p01] + fld qword ptr [eax + p11] + fmulp st(2), st + faddp + fadd qword ptr [eax + p21] + fstp qword ptr [eax + FPy] + fwait +{$endif} +end; + +procedure TXForm.DoInvalidOperation; +begin + raise EMathError.Create('FCalcFunction not initialized!? Probably corrupted flame.'); +end; + +//--0--//////////////////////////////////////////////////////////////////////// +procedure TXForm.Linear3D; +{$ifndef _ASM_} +begin + FPx := FPx + vars[0] * FTx; + FPy := FPy + vars[0] * FTy; + FPz := FPz + vars[0] * FTz; +{$else} +asm + mov edx, [eax + vars] + fld qword ptr [edx] + + fld qword ptr [eax + FTz] + fmul st, st(1) + fadd qword ptr [eax + FPz] + fstp qword ptr [eax + FPz] + + fld qword ptr [eax + FTx] + fmul st, st(1) + fadd qword ptr [eax + FPx] + fstp qword ptr [eax + FPx] + fld qword ptr [eax + FTy] + fmulp + fadd qword ptr [eax + FPy] + fstp qword ptr [eax + FPy] + fwait +{$endif} +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.Flatten; +begin + // FPz := 0; + // AV: changed to pre_mode + FTz := 0; +end; + +//--1--//////////////////////////////////////////////////////////////////////// +procedure TXForm.PreBlur3D; // AV +var + r, sina, cosa, sinb, cosb: double; +begin + Randomize; + SinCos(random * 2 * pi, sina, cosa); + r := vars[2] * (gauss_rnd[0] + gauss_rnd[1] + gauss_rnd[2] + gauss_rnd[3] - 2); + gauss_rnd[gauss_N] := random; + gauss_N := (gauss_N+1) and $3; + + SinCos(random * pi, sinb, cosb); + FTx := FTx + r * sinb * cosa; + FTy := FTy + r * sinb * sina; + FTz := FTz + r * cosb; +end; + +//--2--//////////////////////////////////////////////////////////////////////// +procedure TXForm.Spherical; +{$ifndef _ASM_} +var + r: double; +begin + r := vars[3] / (sqr(FTx) + sqr(FTy) + EPS); + FPx := FPx + FTx * r; + FPy := FPy + FTy * r; + FPz := FPz + FTz * vars[3]; +{$else} +asm + fld qword ptr [eax + FTy] + fld qword ptr [eax + FTx] + fld st(1) + fmul st, st + fld st(1) + fmul st, st + faddp + fadd qword ptr [EPS] + mov edx, [eax + vars] + // AV: for Apo7X.15C compatibility + fld qword ptr [edx + 3*8] + fmul qword ptr [eax + FTz] + fadd qword ptr [eax + FPz] + fstp qword ptr [eax + FPz] + // main code + fdivr qword ptr [edx + 3*8] + fmul st(2), st + fmulp + fadd qword ptr [eax + FPx] + fstp qword ptr [eax + FPx] + fadd qword ptr [eax + FPy] + fstp qword ptr [eax + FPy] + fwait +{$endif} +end; + +//--3--//////////////////////////////////////////////////////////////////////// +procedure TXForm.Swirl; +{$ifndef _ASM_} +var + sinr, cosr: double; +begin + SinCos(sqr(FTx) + sqr(FTy), sinr, cosr); + FPx := FPx + vars[4] * (sinr * FTx - cosr * FTy); + FPy := FPy + vars[4] * (cosr * FTx + sinr * FTy); + FPz := FPz + FTz * vars[4]; +{$else} +asm + mov edx, [eax + vars] + fld qword ptr [edx + 4*8] + // AV: 3D stuff + fld st + fmul qword ptr [eax + FTz] + fadd qword ptr [eax + FPz] + fstp qword ptr [eax + FPz] + // main calculations + fld qword ptr [eax + FTy] + fld qword ptr [eax + FTx] + fld st(1) + fmul st, st + fld st(1) + fmul st, st + faddp + fsincos + fld st(1) + fmul st, st(3) + fld st(1) + fmul st, st(5) + fsubp st(1), st + fmul st, st(5) + fadd qword ptr [eax + FPx] + fstp qword ptr [eax + FPx] + fmulp st(2), st + fmulp st(2), st + faddp + fmulp + fadd qword ptr [eax + FPy] + fstp qword ptr [eax + FPy] + fwait +{$endif} +end; + +//--4--//////////////////////////////////////////////////////////////////////// +procedure TXForm.Horseshoe; +{$ifndef _ASM_} +var + r: double; +begin + r := vars[5] / (sqrt(sqr(FTx) + sqr(FTy)) + EPS); + FPx := FPx + (FTx - FTy) * (FTx + FTy) * r; + FPy := FPy + (2*FTx*FTy) * r; + FPz := FPz + FTz * vars[5]; +{$else} +asm + fld qword ptr [eax + FTx] + fld qword ptr [eax + FTy] + fld st(1) + fmul st, st + fld st(1) + fmul st, st + faddp + fsqrt + fadd qword ptr [EPS] + mov edx, [eax + vars] + // AV: for Apo7X.15C compatibility + fld qword ptr [edx + 5*8] + fmul qword ptr [eax + FTz] + fadd qword ptr [eax + FPz] + fstp qword ptr [eax + FPz] + // main code + fdivr qword ptr [edx + 5*8] + fld st(2) + fadd st, st(2) + fld st(3) + fsub st, st(3) + fmulp + fmul st, st(1) + fadd qword ptr [eax + FPx] + fstp qword ptr [eax + FPx] + fmulp + fmulp + fadd st, st + fadd qword ptr [eax + FPy] + fstp qword ptr [eax + FPy] + fwait +{$endif} +end; + +//--5--//////////////////////////////////////////////////////////////////////// +procedure TXForm.Polar; +{$ifndef _ASM_} +begin + FPx := FPx + polar_vpi * FAngle; //vars[5] * FAngle / PI; + FPy := FPy + vars[6] * (sqrt(sqr(FTx) + sqr(FTy)) - 1.0); + FPz := FPz + FTz * vars[6]; + {$else} +asm + fld qword ptr [eax + FAngle] + fmul qword ptr [eax + polar_vpi] + fadd qword ptr [eax + FPx] + fstp qword ptr [eax + FPx] + fld qword ptr [eax + FTx] + fmul st, st + fld qword ptr [eax + FTy] + fmul st, st + faddp + fsqrt + fld1 + fsubp st(1), st + mov edx, [eax + vars] + // AV: for Apo7X.15C compatibility + fld qword ptr [edx + 6*8] + fmul qword ptr [eax + FTz] + fadd qword ptr [eax + FPz] + fstp qword ptr [eax + FPz] + // main code + fmul qword ptr [edx + 6*8] + fadd qword ptr [eax + FPy] + fstp qword ptr [eax + FPy] + fwait +{$endif} +end; + +//--6--//////////////////////////////////////////////////////////////////////// +procedure TXForm.Disc; +{$ifndef _ASM_} +var + r, sinr, cosr: double; +begin + SinCos(PI * sqrt(sqr(FTx) + sqr(FTy)), sinr, cosr); + r := disc_vpi * FAngle; //vars[7] * FAngle / PI; + FPx := FPx + sinr * r; + FPy := FPy + cosr * r; + FPz := FPz + FTz * vars[7]; +{$else} +asm + // AV: 3D stuff + mov edx, [eax + vars] + fld qword ptr [edx + 7*8] + fmul qword ptr [eax + FTz] + fadd qword ptr [eax + FPz] + fstp qword ptr [eax + FPz] + // main calculations + fld qword ptr [eax + disc_vpi] + fmul qword ptr [eax + FAngle] + fld qword ptr [eax + FTx] + fmul st, st + fld qword ptr [eax + FTy] + fmul st, st + faddp + fsqrt + fldpi + fmulp + fsincos + fmul st, st(2) + fadd qword ptr [eax + FPy] + fstp qword ptr [eax + FPy] + fmulp + fadd qword ptr [eax + FPx] + fstp qword ptr [eax + FPx] + fwait +{$endif} +end; + +//--7--//////////////////////////////////////////////////////////////////////// +procedure TXForm.Spiral; +{$ifndef _ASM_} +var + r, sinr, cosr: double; +begin + r := Flength + EPS; // 1E-6; + SinCos(r, sinr, cosr); + r := vars[8] / r; + FPx := FPx + (FCosA + sinr) * r; + FPy := FPy + (FsinA - cosr) * r; + FPz := FPz + FTz * vars[8]; +{$else} +asm + mov edx, [eax + vars] + fld qword ptr [edx + 8*8] + // AV: 3D stuff + fld st + fmul qword ptr [eax + FTz] + fadd qword ptr [eax + FPz] + fstp qword ptr [eax + FPz] + // main calculations + fld qword ptr [eax + FLength] + fadd qword ptr [EPS] + fdiv st(1), st + fsincos + fsubr qword ptr [eax + FSinA] + fmul st, st(2) + fadd qword ptr [eax + FPy] + fstp qword ptr [eax + FPy] + fadd qword ptr [eax + FCosA] + fmulp + fadd qword ptr [eax + FPx] + fstp qword ptr [eax + FPx] + fwait +{$endif} +end; + +//--10--/////////////////////////////////////////////////////////////////////// +procedure TXForm.Hyperbolic; +{$ifndef _ASM_} +begin + FPx := FPx + vars[9] * FTx / (sqr(FTx) + sqr(FTy) + EPS); + FPy := FPy + vars[9] * FTy; + FPz := FPz + FTz * vars[9]; + {$else} + asm + mov edx, [eax + vars] + fld qword ptr [edx + 9*8] + // AV: 3D stuff + fld st + fmul qword ptr [eax + FTz] + fadd qword ptr [eax + FPz] + fstp qword ptr [eax + FPz] + // main calculations + fld qword ptr [eax + FTy] + fld qword ptr [eax + FTx] + fld st(1) + fmul st, st + fld st(1) + fmul st, st + faddp + fadd qword ptr [EPS] + fdivp st(1), st + fmul st, st(2) + fadd qword ptr [eax + FPx] + fstp qword ptr [eax + FPx] + fmulp + fadd qword ptr [eax + FPy] + fstp qword ptr [eax + FPy] + fwait +{$endif} +end; + +//--11--/////////////////////////////////////////////////////////////////////// +procedure TXForm.Diamond; // AV: Diamond, i.e. rotated Square + {$ifndef _ASM_} +var + sinr, cosr: double; +begin + SinCos(FLength, sinr, cosr); + FPx := FPx + vars[10] * FSinA * cosr; + FPy := FPy + vars[10] * FCosA * sinr; + FPz := FPz + FTz * vars[10]; +{$else} +asm + mov edx, [eax + vars] + fld qword ptr [edx + 10*8] + // AV: 3D stuff + fld st + fmul qword ptr [eax + FTz] + fadd qword ptr [eax + FPz] + fstp qword ptr [eax + FPz] + // main calculations + fld qword ptr [eax + FLength] + fsincos + fmul qword ptr [eax + FSinA] + fmul st, st(2) + fadd qword ptr [eax + FPx] + fstp qword ptr [eax + FPx] + fmul qword ptr [eax + FCosA] + fmulp + fadd qword ptr [eax + FPy] + fstp qword ptr [eax + FPy] + fwait +{$endif} +end; + +//--12--/////////////////////////////////////////////////////////////////////// +procedure TXForm.Eyefish; + {$ifndef _ASM_} +var + r: double; +begin + r := 2 * vars[11] / (sqrt(sqr(FTx) + sqr(FTy)) + 1); + FPx := FPx + r * FTx; + FPy := FPy + r * FTy; + FPz := FPz + FTz * vars[11]; + {$else} +asm + mov edx, [eax + vars] + fld qword ptr [edx + 11*8] + // AV: 3D stuff + fld st + fmul qword ptr [eax + FTz] + fadd qword ptr [eax + FPz] + fstp qword ptr [eax + FPz] + // main calculations + fadd st, st + fld qword ptr [eax + FTy] + fld qword ptr [eax + FTx] + fld st(1) + fmul st, st + fld st(1) + fmul st, st + faddp + fsqrt + fld1 + faddp + fdivp st(3), st + fmul st, st(2) + fadd qword ptr [eax + FPx] + fstp qword ptr [eax + FPx] + fmulp + fadd qword ptr [eax + FPy] + fstp qword ptr [eax + FPy] + fwait +{$endif} +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.Bubble; +{$ifndef _ASM_} +var + r: double; +begin + r := (sqr(FTx) + sqr(FTy))/4 + 1; + FPz := FPz + vars[12] * (2 / r - 1); + + r := vars[12] / r; + + FPx := FPx + r * FTx; + FPy := FPy + r * FTy; +{$else} +asm + fld qword ptr [eax + FTy] + fld qword ptr [eax + FTx] + fld st(1) + fmul st, st + fld st(1) + fmul st, st + faddp + fld1 + fadd st, st + fadd st, st + fdivp st(1), st + + mov edx, [eax + vars] + fld qword ptr [edx + 12*8] + + fld1 + fadd st(2), st + fdivr st(2), st + + fld st(2) + fadd st, st + fsubrp st(1), st + fmul st, st(1) + fadd qword ptr [eax + FPz] + fstp qword ptr [eax + FPz] + + fmulp + + fmul st(2), st + fmulp + fadd qword ptr [eax + FPx] + fstp qword ptr [eax + FPx] + fadd qword ptr [eax + FPy] + fstp qword ptr [eax + FPy] + fwait +{$endif} +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.Cylinder; +{$ifndef _ASM_} +begin + FPx := FPx + vars[13] * sin(FTx); + FPy := FPy + vars[13] * FTy; + FPz := FPz + vars[13] * cos(FTx); +{$else} +asm + mov edx, [eax + vars] + fld qword ptr [edx + 13*8] + fld qword ptr [eax + FTx] + fsincos + fmul st, st(2) + fadd qword ptr [eax + FPz] + fstp qword ptr [eax + FPz] + fld qword ptr [eax + FTy] + fmul st, st(2) + fadd qword ptr [eax + FPy] + fstp qword ptr [eax + FPy] + fmulp + fadd qword ptr [eax + FPx] + fstp qword ptr [eax + FPx] + fwait +{$endif} +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.Noise; +{$ifndef _ASM_} +var + r, s, sinr, cosr: double; +begin + // Randomize here = HACK! Fix me... + Randomize; SinCos(random * 2*pi, sinr, cosr); + s := vars[14]; + r := s * random; + FPx := FPx + FTx * r * cosr; + FPy := FPy + FTy * r * sinr; + FPz := FPz + FTz * s; +{$else} +asm + mov edx, [eax + vars] + fld qword ptr [edx + 14*8] + // AV: 3D stuff + fld st + fmul qword ptr [eax + FTz] + fadd qword ptr [eax + FPz] + fstp qword ptr [eax + FPz] + // main calculations + call AsmRandExt + fmulp + call AsmRandExt + fadd st, st + fldpi + fmulp + fsincos + fmul st, st(2) + fmul qword ptr [eax + FTx] + fadd qword ptr [eax + FPx] + fstp qword ptr [eax + FPx] + fmulp + fmul qword ptr [eax + FTy] + fadd qword ptr [eax + FPy] + fstp qword ptr [eax + FPy] + fwait +{$endif} +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.Blur; +{$ifndef _ASM_} +var + r, sina, cosa: double; +begin + // Randomize here = HACK! Fix me... + Randomize; SinCos(random * 2*pi, sina, cosa); + r := vars[15] * random; + FPx := FPx + r * cosa; + FPy := FPy + r * sina; + FPz := FPz + vars[15] * FTz; +{$else} +asm + mov edx, [eax + vars] + fld qword ptr [edx + 15*8] + // AV: 3D stuff + fld st + fmul qword ptr [eax + FTz] + fadd qword ptr [eax + FPz] + fstp qword ptr [eax + FPz] + // main calculations + call AsmRandExt + fmulp + call AsmRandExt + fadd st, st + fldpi + fmulp + fsincos + fmul st, st(2) + fadd qword ptr [eax + FPx] + fstp qword ptr [eax + FPx] + fmulp + fadd qword ptr [eax + FPy] + fstp qword ptr [eax + FPy] + fwait +{$endif} +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.Gaussian; +{$ifndef _ASM_} +var + r, sina, cosa: double; +begin + // Randomize here = HACK! Fix me... + Randomize; SinCos(random * 2*pi, sina, cosa); + r := vars[16] * (gauss_rnd[0] + gauss_rnd[1] + gauss_rnd[2] + gauss_rnd[3] - 2); + gauss_rnd[gauss_N] := random; + gauss_N := (gauss_N+1) and $3; + + FPx := FPx + r * cosa; + FPy := FPy + r * sina; + //FPz := FPz + vars[16] * FTz; // AV removed +{$else} +asm + fld qword ptr [eax + gauss_rnd] + fadd qword ptr [eax + gauss_rnd+8] + fadd qword ptr [eax + gauss_rnd+16] + fadd qword ptr [eax + gauss_rnd+24] + fld1 + fadd st,st + fsubp st(1),st + mov edx, [eax + vars] + // AV: removed 3D-support since we have zcale and blur3D + { + fld qword ptr [edx + 16*8] + fmul qword ptr [eax + FTz] + fadd qword ptr [eax + FPz] + fstp qword ptr [eax + FPz] + } + fmul qword ptr [edx + 16*8] + call AsmRandExt + mov edx, [eax + gauss_N] + fst qword ptr [eax + gauss_rnd + edx*8] + inc edx + and edx,$03 + mov [eax + gauss_N], edx + + fadd st, st + fldpi + fmulp + fsincos + fmul st, st(2) + fadd qword ptr [eax + FPx] + fstp qword ptr [eax + FPx] + fmulp + fadd qword ptr [eax + FPy] + fstp qword ptr [eax + FPy] + fwait +{$endif} +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.ZBlur; +{$ifndef _ASM_} +begin + FPz := FPz + vars[17] * (gauss_rnd[0] + gauss_rnd[1] + gauss_rnd[2] + gauss_rnd[3] - 2); + gauss_rnd[gauss_N] := random; + gauss_N := (gauss_N+1) and $3; +{$else} +asm + fld qword ptr [eax + gauss_rnd] + fadd qword ptr [eax + gauss_rnd+8] + fadd qword ptr [eax + gauss_rnd+16] + fadd qword ptr [eax + gauss_rnd+24] + fld1 + fadd st,st + fsubp st(1),st + mov edx, [eax + vars] + fmul qword ptr [edx + 17*8] + call AsmRandExt + mov edx, [eax + gauss_N] + fstp qword ptr [eax + gauss_rnd + edx*8] + inc edx + and edx,$03 + mov [eax + gauss_N], edx + + fadd qword ptr [eax + FPz] + fstp qword ptr [eax + FPz] + fwait +{$endif} +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.Blur3D; +var + r, sina, cosa, sinb, cosb: double; +begin + // Randomize here = HACK! Fix me... + Randomize; SinCos(random * 2*pi, sina, cosa); + r := vars[18] * (gauss_rnd[0] + gauss_rnd[1] + gauss_rnd[2] + gauss_rnd[3] - 2); + gauss_rnd[gauss_N] := random; + gauss_N := (gauss_N+1) and $3; + + SinCos(random * pi, sinb, cosb); + FPx := FPx + r * sinb * cosa; + FPy := FPy + r * sinb * sina; + FPz := FPz + r * cosb; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.PreBlur; +{$ifndef _ASM_} +var + r, sina, cosa: double; +begin + // Randomize here = HACK! Fix me... + Randomize; SinCos(random * 2*pi, sina, cosa); + r := vars[19] * (gauss_rnd[0] + gauss_rnd[1] + gauss_rnd[2] + gauss_rnd[3] - 2); + gauss_rnd[gauss_N] := random; + gauss_N := (gauss_N+1) and $3; + + FTx := FTx + r * cosa; + FTy := FTy + r * sina; +{$else} +asm + fld qword ptr [eax + gauss_rnd] + fadd qword ptr [eax + gauss_rnd+8] + fadd qword ptr [eax + gauss_rnd+16] + fadd qword ptr [eax + gauss_rnd+24] + fld1 + fadd st,st + fsubp st(1),st + mov edx, [eax + vars] + fmul qword ptr [edx + 19*8] + call AsmRandExt + mov edx, [eax + gauss_N] + fst qword ptr [eax + gauss_rnd + edx*8] + inc edx + and edx,$03 + mov [eax + gauss_N], edx + + fadd st, st + fldpi + fmulp + fsincos + fmul st, st(2) + fadd qword ptr [eax + FTx] + fstp qword ptr [eax + FTx] + fmulp + fadd qword ptr [eax + FTy] + fstp qword ptr [eax + FTy] + fwait +{$endif} +end; + + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.PreZScale; +begin + FTz := FTz * vars[20]; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.PreZTranslate; +begin + FTz := FTz + vars[21]; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.PreRotateX; +var + z: double; +begin + z := rx_cos * FTz - rx_sin * FTy; + FTy := rx_sin * FTz + rx_cos * FTy; + FTz := z; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.PreRotateY; +var + x: double; +begin + x := ry_cos * FTx - ry_sin * FTz; + FTz := ry_sin * FTx + ry_cos * FTz; + FTx := x; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.ZScale; +{$ifndef _ASM_} +begin + FPz := FPz + vars[24] * FTz; +{$else} +asm + fld qword ptr [eax + FTz] + mov edx, [eax + vars] + fmul qword ptr [edx + 24*8] + fadd qword ptr [eax + FPz] + fstp qword ptr [eax + FPz] + fwait +{$endif} +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.ZTranslate; +begin + FPz := FPz + vars[25]; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.ZCone; +{$ifndef _ASM_} +begin + FPz := FPz + vars[26] * sqrt(sqr(FTx) + sqr(FTy)); +{$else} +asm + fld qword ptr [eax + FTx] + fmul st,st + fld qword ptr [eax + FTy] + fmul st,st + faddp + fsqrt + mov edx, [eax + vars] + fmul qword ptr [edx + 26*8] + fadd qword ptr [eax + FPz] + fstp qword ptr [eax + FPz] + fwait +{$endif} +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.PostRotateX; +var + z: double; +begin + z := px_cos * FPz - px_sin * FPy; + FPy := px_sin * FPz + px_cos * FPy; + FPz := z; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.PostRotateY; +var + x: double; +begin + x := py_cos * FPx - py_sin * FPz; + FPz := py_sin * FPx + py_cos * FPz; + FPx := x; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.PostMirrorX; +begin + FPx := abs(FPx); + if (random(2) = 1) then FPx := -FPx; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.PostMirrorY; +begin + FPy := abs(FPy); + if (random(2) = 1) then FPy := -FPy; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.PostMirrorZ; +begin + FPz := abs(FPz); + if (random(2) = 1) then FPz := -FPz; +end; + +///////////////////////////////// +procedure TXForm.Hemisphere; +{$ifndef _ASM_} +var + t: double; +begin + t := vars[32] / sqrt(sqr(FTx) + sqr(FTy) + 1); + + FPx := FPx + FTx * t; + FPy := FPy + FTy * t; + FPz := FPz + t; +{$else} + asm // rewritten by AV + fld qword ptr [eax + FTy] + fld qword ptr [eax + FTx] + fld st(1) + fmul st, st + fld st(1) + fmul st, st + faddp + fld1 + faddp + fsqrt + mov edx, [eax + vars] + fdivr qword ptr [edx + 32*8] + fmul st(2), st + fmul st(1), st + fadd qword ptr [eax + FPz] + fstp qword ptr [eax + FPz] + fadd qword ptr [eax + FPx] + fstp qword ptr [eax + FPx] + fadd qword ptr [eax + FPy] + fstp qword ptr [eax + FPy] + fwait +{$endif} +end; + +////////////////////////////// +procedure TXForm.Cross; +const epsv: double = 1.0e-20; + {$ifndef _ASM_} +var + r: double; +begin + r := abs((FTx - FTy) * (FTx + FTy)) + epsv; // AV: fixed + // AV: abs cannot be negative, so it's useless + //if (r < 0) then r := r * -1.0; + r := vars[33] / r; + + FPx := FPx + FTx * r; + FPy := FPy + FTy * r; + FPz := FPz + vars[33] * FTz; +{$else} + asm //written by AV + fld qword ptr [eax + FTy] + fld qword ptr [eax + FTx] + fld st + fsub st, st(2) + fld st(1) + fadd st, st(3) + fmulp + fabs + fadd epsv + mov edx, [eax + vars] + // for Apo7X.15C compatibility + fld qword ptr [edx + 33*8] + fmul qword ptr [eax + FTz] + fadd qword ptr [eax + FPz] + fstp qword ptr [eax + FPz] + // main code + fdivr qword ptr [edx + 33*8] + fmul st(2), st + fmulp + fadd qword ptr [eax + FPx] + fstp qword ptr [eax + FPx] + fadd qword ptr [eax + FPy] + fstp qword ptr [eax + FPy] + fwait +{$endif} +end; + +///////////////////////////// +procedure TXForm.Pyramid; +var + x, y, z, r: double; +begin + x := IntPower(FTx, 3); + y := IntPower(FTy, 3); + z := IntPower(abs(FTz), 3); + r := vars[34] / (abs(x) + abs(y) + z + 1E-9); + FPx := FPx + x * r; + FPy := FPy + y * r; + FPz := FPz + z * r; +end; +//////////////////////////////////////////////// + +procedure TXForm.Polar2; +{$ifndef _ASM_} +begin + FPx := FPx + polar2_vpi * FAngle; + FPy := FPy + p2vv2 * Ln(sqr(FTx) + sqr(FTy) + EPS); + FPz := FPz + FTz * vars[35]; + {$else} +asm // written by AV + fld qword ptr [eax + FAngle] + fmul qword ptr [eax + polar2_vpi] + fadd qword ptr [eax + FPx] + fstp qword ptr [eax + FPx] + + fld qword ptr [eax + FTx] + fmul st, st + fld qword ptr [eax + FTy] + fmul st, st + faddp + fadd qword ptr [EPS] + fldln2 + fxch + fyl2x + fmul qword ptr [eax + p2vv2] + mov edx, [eax + vars] + // AV: for Apo7X.15C compatibility + fld qword ptr [edx + 35*8] + fmul qword ptr [eax + FTz] + fadd qword ptr [eax + FPz] + fstp qword ptr [eax + FPz] + // main code + fmul qword ptr [edx + 35*8] + fadd qword ptr [eax + FPy] + fstp qword ptr [eax + FPy] + fwait +{$endif} +end; +/////////////////////////////////////////////////////////////////////////////// + +procedure TXForm.NextPoint(var CPpoint: TCPpoint); +var + i: Integer; +begin + // first compute the color coord + CPpoint.c := CPpoint.c * colorC1 + colorC2; + vc := CPpoint.c; + + FTx := c00 * CPpoint.x + c10 * CPpoint.y + c20; + FTy := c01 * CPpoint.x + c11 * CPpoint.y + c21; + FTz := CPpoint.z; + + Fpx := 0; + Fpy := 0; + Fpz := 0; + + for i:= 0 to FNrFunctions-1 do + FCalcFunctionList[i]; + + CPpoint.c := CPpoint.c + pluginColor * (vc - CPpoint.c); + CPpoint.x := FPx; + CPpoint.y := FPy; + CPPoint.z := FPz; +end; + +procedure TXForm.NextPointTo(var CPpoint, ToPoint: TCPpoint); +var + i: Integer; +begin + ToPoint.c := CPpoint.c * colorC1 + colorC2; + vc := ToPoint.c; + + FTx := c00 * CPpoint.x + c10 * CPpoint.y + c20; + FTy := c01 * CPpoint.x + c11 * CPpoint.y + c21; + FTz := CPpoint.z; + + Fpx := 0; + Fpy := 0; + Fpz := 0; + + for i:= 0 to FNrFunctions-1 do + FCalcFunctionList[i]; + + ToPoint.c := ToPoint.c + pluginColor * (vc - ToPoint.c); + ToPoint.x := FPx; + ToPoint.y := FPy; + ToPoint.z := FPz; //? +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.NextPoint2C(var p: T2CPoint); +var + i: Integer; +begin + // first compute the color coord + p.c1 := p.c1 * colorC1 + colorC2; + p.c2 := p.c2 * colorC1 + colorC2; + + FTx := c00 * p.x + c10 * p.y + c20; + FTy := c01 * p.x + c11 * p.y + c21; + + Fpx := 0; + Fpy := 0; + + for i:= 0 to FNrFunctions-1 do + FCalcFunctionList[i]; + + p.x := FPx; + p.y := FPy; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.NextPointXY(var px, py: double); +var + i: integer; +begin + FTx := c00 * px + c10 * py + c20; + FTy := c01 * px + c11 * py + c21; + FTz := 0; + + Fpx := 0; + Fpy := 0; + + for i:= 0 to FNrFunctions-1 do + FCalcFunctionList[i]; + + px := FPx; + py := FPy; +end; + +/////////////////////////////////////////////////////////////////////////////// + +{ +[00 01 02] +[10 11 12] +[20 21 22] + +[a b e ] +[c d f ] +[0 0 1 ] +} + +function TXForm.Mul33(const M1, M2: TMatrix): TMatrix; +begin + result[0, 0] := M1[0][0] * M2[0][0] + M1[0][1] * M2[1][0] + M1[0][2] * M2[2][0]; + result[0, 1] := M1[0][0] * M2[0][1] + M1[0][1] * M2[1][1] + M1[0][2] * M2[2][1]; + result[0, 2] := M1[0][0] * M2[0][2] + M1[0][1] * M2[1][2] + M1[0][2] * M2[2][2]; + result[1, 0] := M1[1][0] * M2[0][0] + M1[1][1] * M2[1][0] + M1[1][2] * M2[2][0]; + result[1, 1] := M1[1][0] * M2[0][1] + M1[1][1] * M2[1][1] + M1[1][2] * M2[2][1]; + result[1, 2] := M1[1][0] * M2[0][2] + M1[1][1] * M2[1][2] + M1[1][2] * M2[2][2]; + result[2, 0] := M1[2][0] * M2[0][0] + M1[2][1] * M2[1][0] + M1[2][2] * M2[2][0]; + result[2, 1] := M1[2][0] * M2[0][1] + M1[2][1] * M2[1][1] + M1[2][2] * M2[2][1]; // AV: fixed indices + result[2, 2] := M1[2][0] * M2[0][2] + M1[2][1] * M2[1][2] + M1[2][2] * M2[2][2]; // AV: fixed indices +end; + +/////////////////////////////////////////////////////////////////////////////// +function TXForm.Identity: TMatrix; +var + i, j: integer; +begin + for i := 0 to 2 do + for j := 0 to 2 do + Result[i, j] := 0; + Result[0][0] := 1; + Result[1][1] := 1; + Result[2][2] := 1; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.Rotate(const degrees: double); +var + r: double; + Matrix, M1: TMatrix; +begin + r := degrees * pi / 180; + M1 := Identity; + M1[0, 0] := cos(r); + M1[0, 1] := -sin(r); + M1[1, 0] := sin(r); + M1[1, 1] := cos(r); + Matrix := Identity; + + Matrix[0][0] := c[0, 0]; + Matrix[0][1] := c[0, 1]; + Matrix[1][0] := c[1, 0]; + Matrix[1][1] := c[1, 1]; + Matrix[0][2] := c[2, 0]; + Matrix[1][2] := c[2, 1]; + Matrix := Mul33(Matrix, M1); + c[0, 0] := Matrix[0][0]; + c[0, 1] := Matrix[0][1]; + c[1, 0] := Matrix[1][0]; + c[1, 1] := Matrix[1][1]; + c[2, 0] := Matrix[0][2]; + c[2, 1] := Matrix[1][2]; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.Translate(const x, y: double); +var + Matrix, M1: TMatrix; +begin + M1 := Identity; + M1[0, 2] := x; + M1[1, 2] := y; + Matrix := Identity; + + Matrix[0][0] := c[0, 0]; + Matrix[0][1] := c[0, 1]; + Matrix[1][0] := c[1, 0]; + Matrix[1][1] := c[1, 1]; + Matrix[0][2] := c[2, 0]; + Matrix[1][2] := c[2, 1]; + Matrix := Mul33(Matrix, M1); + c[0, 0] := Matrix[0][0]; + c[0, 1] := Matrix[0][1]; + c[1, 0] := Matrix[1][0]; + c[1, 1] := Matrix[1][1]; + c[2, 0] := Matrix[0][2]; + c[2, 1] := Matrix[1][2]; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.Multiply(const a, b, c, d: double); +var + Matrix, M1: TMatrix; +begin + M1 := Identity; + M1[0, 0] := a; + M1[0, 1] := b; + M1[1, 0] := c; + M1[1, 1] := d; + Matrix := Identity; + Matrix[0][0] := Self.c[0, 0]; + Matrix[0][1] := Self.c[0, 1]; + Matrix[1][0] := Self.c[1, 0]; + Matrix[1][1] := Self.c[1, 1]; + Matrix[0][2] := Self.c[2, 0]; + Matrix[1][2] := Self.c[2, 1]; + Matrix := Mul33(Matrix, M1); + Self.c[0, 0] := Matrix[0][0]; + Self.c[0, 1] := Matrix[0][1]; + Self.c[1, 0] := Matrix[1][0]; + Self.c[1, 1] := Matrix[1][1]; + Self.c[2, 0] := Matrix[0][2]; + Self.c[2, 1] := Matrix[1][2]; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.Scale(const s: double); +var + Matrix, M1: TMatrix; +begin + M1 := Identity; + M1[0, 0] := s; + M1[1, 1] := s; + Matrix := Identity; + Matrix[0][0] := c[0, 0]; + Matrix[0][1] := c[0, 1]; + Matrix[1][0] := c[1, 0]; + Matrix[1][1] := c[1, 1]; + Matrix[0][2] := c[2, 0]; + Matrix[1][2] := c[2, 1]; + Matrix := Mul33(Matrix, M1); + c[0, 0] := Matrix[0][0]; + c[0, 1] := Matrix[0][1]; + c[1, 0] := Matrix[1][0]; + c[1, 1] := Matrix[1][1]; + c[2, 0] := Matrix[0][2]; + c[2, 1] := Matrix[1][2]; +end; + +/////////////////////////////////////////////////////////////////////////////// +destructor TXForm.Destroy; +var + i: integer; +begin + + for i := 0 to High(FRegVariations) do + FRegVariations[i].Free; + + if assigned(ifs) then ifs.Clear; + ifs.Free; // AV + + inherited; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.BuildFunctionlist; +begin + SetLength(FFunctionList, NrVar + Length(FRegVariations)); + + //fixed + FFunctionList[0] := Linear3D; + FFunctionList[1] := Flatten; // AV: replased 2D-Linear + FFunctionList[2] := PreBlur3D; // AV: replaced Sinusoidal + FFunctionList[3] := Spherical; + FFunctionList[4] := Swirl; + FFunctionList[5] := Horseshoe; + FFunctionList[6] := Polar; + FFunctionList[7] := Disc; + FFunctionList[8] := Spiral; + FFunctionList[9] := Hyperbolic; + FFunctionList[10] := Diamond; // AV: renamed from Square + FFunctionList[11] := Eyefish; + FFunctionList[12] := Bubble; + FFunctionList[13] := Cylinder; + FFunctionList[14] := Noise; + FFunctionList[15] := Blur; + FFunctionList[16] := Gaussian; + FFunctionList[17] := ZBlur; + FFunctionList[18] := Blur3D; + + FFunctionList[19] := PreBlur; + FFunctionList[20] := PreZScale; // AV: index 20 is used by auto_pre_zscale option + FFunctionList[21] := PreZTranslate; + FFunctionList[22] := PreRotateX; + FFunctionList[23] := PreRotateY; + + FFunctionList[24] := ZScale; + FFunctionList[25] := ZTranslate; + FFunctionList[26] := ZCone; + + FFunctionList[27] := PostRotateX; + FFunctionList[28] := PostRotateY; + // AV: new local variations + FFunctionList[29] := PostMirrorX; + FFunctionList[30] := PostMirrorY; + FFunctionList[31] := PostMirrorZ; + + FFunctionList[32] := Hemisphere; + FFunctionList[33] := Cross; + FFunctionList[34] := Pyramid; + FFunctionList[35] := Polar2; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.AddRegVariations; +var + i: integer; +begin + SetLength(FRegVariations, GetNrRegisteredVariations); + for i := 0 to GetNrRegisteredVariations - 1 do begin + FRegVariations[i] := GetRegisteredVariation(i).GetInstance; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.Assign(XForm: TXForm); +var + i,j: integer; + Name: string; + Value: double; +begin + if Not assigned(XForm) then + Exit; + + for i := 0 to High(vars) do + vars[i] := XForm.vars[i]; + + c := Xform.c; + p := Xform.p; + density := XForm.density; + color := XForm.color; + color2 := XForm.color2; + symmetry := XForm.symmetry; + // Orientationtype := XForm.Orientationtype; + TransformName := XForm.TransformName; + + postXswap := Xform.postXswap; + autoZscale := Xform.autoZscale; + + for i := 0 to High(FRegVariations) do begin + for j := 0 to FRegVariations[i].GetNrVariables - 1 do begin + Name := FRegVariations[i].GetVariableNameAt(j); + XForm.FRegVariations[i].GetVariable(Name, Value); + FRegVariations[i].SetVariable(Name, Value); + end; + end; + + for i := 0 to High(modWeights) do + modWeights[i] := xform.modWeights[i]; + + ifs.Assign(xform.ifs); // AV + + transOpacity := xform.transOpacity; + pluginColor := xform.pluginColor; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TXForm.ToXMLString: string; +var + i, j: integer; + Name: string; + Value: double; + numChaos: integer; + strvar: string; +begin + result := Format(' 0 then result := result + format('symmetry="%g" ', [symmetry]); + + ////// AV: write variation order + strvar := ''; + for i := 0 to nrvar - 1 do begin + if vars[GetVariationIndex(ifs[i])] <> 0 then + strvar := strvar + ifs[i] + #32; + end; + if (strvar <> '') and (pos(#32, strvar) < length(strvar)) then + Result := Result + format('var_order="%s" ', [strvar]); + /////////////////////// +(* + for i := 0 to nrvar - 1 do begin + if vars[i] <> 0 then + Result := Result + varnames(i) + format('="%g" ', [vars[i]]); + end; + *) + for i := 0 to nrvar - 1 do // AV: write in correct order + begin + Name := ifs[i]; + Value := vars[GetVariationIndex(Name)]; + if Value <> 0 then + Result := Result + Name + format('="%g" ', [Value]); + end; + + Result := Result + Format('coefs="%g %g %g %g %g %g" ', [c[0,0], c[0,1], c[1,0], c[1,1], c[2,0], c[2,1]]); + if (p[0,0]<>1) or (p[0,1]<>0) or(p[1,0]<>0) or (p[1,1]<>1) or (p[2,0]<>0) or (p[2,1]<>0) then + Result := Result + Format('post="%g %g %g %g %g %g" ', [p[0,0], p[0,1], p[1,0], p[1,1], p[2,0], p[2,1]]); + + for i := 0 to High(FRegVariations) do begin + if vars[i+NRLOCVAR] <> 0 then + for j := 0 to FRegVariations[i].GetNrVariables - 1 do begin + Name := FRegVariations[i].GetVariableNameAt(j); + Result := Result + Format('%s="%s" ', [name, FRegVariations[i].GetVariableStr(Name)]); + end; + end; + + numChaos := -1; + for i := NXFORMS-1 downto 0 do + if modWeights[i] <> 1 then begin + numChaos := i; + break; + end; + if numChaos >= 0 then begin + Result := Result + 'chaos="'; + for i := 0 to numChaos do + Result := Result + Format('%g ', [modWeights[i]]); + Result := Result + '" '; + end; + + Result := Result + Format('opacity="%g" ', [transOpacity]); + + if TransformName <> '' then + Result := Result + 'name="' + TransformName + '"'; + + if pluginColor <> 1 then + Result := Result + Format('var_color="%g" ', [pluginColor]); + + Result := Result + '/>'; +end; + +function TXForm.FinalToXMLString(IsEnabled: boolean): string; +var + i, j: integer; + Name: string; + Value: double; + strvar: string; +begin + // result := Format(' 0 then result := result + format('symmetry="%g" ', [symmetry]); + + ////// AV: write variation order + strvar := ''; + for i := 0 to nrvar - 1 do begin + if vars[GetVariationIndex(ifs[i])] <> 0 then + strvar := strvar + ifs[i] + #32; + end; + if (strvar <> '') and (pos(#32, strvar) < length(strvar)) then + Result := Result + format('var_order="%s" ', [strvar]); + ////////////////////////////////////////// + (* + for i := 0 to nrvar - 1 do begin + if vars[i] <> 0 then + Result := Result + varnames(i) + format('="%g" ', [vars[i]]); + end; + *) + for i := 0 to nrvar - 1 do // AV: write in correct order + begin + Name := ifs[i]; + Value := vars[GetVariationIndex(Name)]; + if Value <> 0 then + Result := Result + Name + format('="%g" ', [Value]); + end; + + Result := Result + Format('coefs="%g %g %g %g %g %g" ', [c[0,0], c[0,1], c[1,0], c[1,1], c[2,0], c[2,1]]); + if (p[0,0]<>1) or (p[0,1]<>0) or(p[1,0]<>0) or (p[1,1]<>1) or (p[2,0]<>0) or (p[2,1]<>0) then + Result := Result + Format('post="%g %g %g %g %g %g" ', [p[0,0], p[0,1], p[1,0], p[1,1], p[2,0], p[2,1]]); + if pluginColor <> 1 then + Result := Result + Format('var_color="%g" ', [pluginColor]); + + for i := 0 to High(FRegVariations) do begin + if vars[i+NRLOCVAR] <> 0 then + for j := 0 to FRegVariations[i].GetNrVariables - 1 do begin + Name := FRegVariations[i].GetVariableNameAt(j); + Result := Result + Format('%s="%s" ', [name, FRegVariations[i].GetVariableStr(Name)]); + end; + end; + + Result := Result + '/>'; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TXForm.GetVariable(const name: string; var Value: double); +var + i: integer; +begin + for i := 0 to High(FRegVariations) do + if FRegVariations[i].GetVariable(name, value) then + break; +end; + +procedure TXForm.SetVariable(const name: string; var Value: double); +var + i: integer; +begin + for i := 0 to High(FRegVariations) do + if FRegVariations[i].SetVariable(name, value) then + break; +end; + +procedure TXForm.ResetVariable(const name: string); +var + i: integer; +begin + for i := 0 to High(FRegVariations) do + if FRegVariations[i].ResetVariable(name) then + break; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TXForm.GetVariableStr(const name: string): string; +var + i: integer; +begin + for i := 0 to High(FRegVariations) do begin + Result := FRegVariations[i].GetVariableStr(name); + if Result <> '' then break; + end; +end; + +procedure TXForm.SetVariableStr(const name: string; var Value: string); +var + i: integer; +begin + for i := 0 to High(FRegVariations) do begin + if FRegVariations[i].SetVariableStr(name, value) then break; + end; +end; + +end. diff --git a/Forms/About.dfm b/Forms/About.dfm new file mode 100644 index 0000000..2b00115 --- /dev/null +++ b/Forms/About.dfm @@ -0,0 +1,5367 @@ +object AboutForm: TAboutForm + Left = 461 + Top = 320 + BorderStyle = bsDialog + Caption = 'Apophysis' + ClientHeight = 442 + ClientWidth = 429 + Color = clWindow + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -12 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poMainFormCenter + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object Image1: TImage + Left = 261 + Top = 80 + Width = 160 + Height = 320 + Picture.Data = { + 07544269746D617036580200424D36580200000000003600000028000000A000 + 0000400100000100180000000000005802000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000035718235B3FF1970BA157DD718C1FF13BAFF10B3FD0D98FF11BCFF + 063C60000000063C6E11AFFF11A9FF10BAFF05376710ABFF12B8FF13C6FF0F9A + FF10A1FF1085E9074B890F99FF0B76CF0FA1FC0FB3F50C99D8042B5000000000 + 0000000000000000000000000000010C160A6BD0043567032A5711ADFF11A9FF + 0D7FDD0D99F610A5FF0F8BFF0E9FFF10B2FF0B81DB0A71C00F9BFD1099FE0F98 + FF054180000000000000010E1D04376A063E770969CD0E9DFF0B72D70E96FF17 + 9CFF119DFF0D85F51284EA2BA3FF53A8B260B18871D4A97FF5D85FB084000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000002030428493B0B + 13063F72605192892F82BC1CAFFF15B1FF1ABBFF10AFFB0D90F611B6FF11ADFF + 0539640000000A6CC00FA3FF11A6FF0FABFF0B74D90E9AF212BCFF0FB0FF0E9D + FF0E97FB1695FF0217280E98FF0EA0FF0C82DC0973C4010D1800000000000000 + 00000000000000000000000000000000000324450001050A6BCE10A8FF11A8FF + 0F94FF0D8DFF11A9FF0F9CFF0E99FF109DFF0EA7FF0A71C20A6FB90E8DE90D8E + FF0A72D70646880209120000000000000000000000001183E0053A710744851E + 70BB2975A73BB0F419405928505D4884714380633969523F75576CC3A9000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000066BB9764 + CCC159E8FF46D7FB20B8FF0FB8FF12C3FF0FA2FC0E8FF510ACFF10A3FF0F91FF + 04345C0000000EA6FF0FACFF11AFFF0EA2FF0C76DE06456E11AAFF11B6FF11C0 + FF16A2FB1F9AFF0E405B085EB40FAAFF0FADFF0EB0FF0B84DD04274600000000 + 0000000000000000000000000000000000000000123A5F1297E90FA8FF0F9BFF + 0F96FF0D7EFA10A1FF10A1FF0E97FF0FA1FF139DFF0E99FA0646870E92F30F98 + FF0F95FF0C8CFF0F77C611599A12273800000000000006131F00000000000006 + 0C0F13211951A2A11E39310000000000000000000000000000001A2E2D000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000051977092 + FFF726C7FF12BBFF13B8FF14BCFF0D8BF80D83E412B5FF11AFFF0F96FF053E7C + 0000000A71BD10B6FF0EA3FF11BBFF0F95FF0D9AE5084A951098FF12BFFF11BB + FF17C5FF33D1FF0C4764054E920D85FA0FA4FF0FACFF0DAAFF10A9FF042D5400 + 00000000000000000000000000000000000000001550881191FF0E99FF0FA5FF + 1082EE0D81F90D90FF10A2FF0F9CFF0F9DFF1190FF0E97FF0E9CFF03213A0FA0 + FF1098FF0F9BFF0FACFF119EFF0A4E8A06468600000000000000070E00000000 + 0000000000070C06020403000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000058A9BA1997FF0D90FF0A6DD30FA3FF11AFFF0FA5FF12B3FF085FBE000000 + 0000000B74CC10B9FF11A3FC0FB0FF0D7FEC11B4FF096FC10858AB10A7FF11C5 + FF0FB3FF0EA8FF12B1FF0B0E070888F90D82DB10C2FF0E8FE7085093095AAC01 + 0814000000000000000000000000000000000000070F160E8CEC10A2FF0F9AFF + 0A6ED1108BF30E94FF0E95FF11A8FF129EFF1AB7FF0FA3FF0F9EFF0E9AFF021B + 340FA8FF0FA7FF0F9BFF0E9BFF12ADFF10A6FF0F9CFF10A0FF08519B011F3E01 + 162107396A000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000050A0526442E25 + 51620650810DA0FF13A9FF13BAFF10A9FF10ABFF0E91FE0B72C50C68BF000002 + 0960AA10ABFF15ABFF12B6FF0FA3FF0E96FF0F9FFF0F95FB0B6BCE10B0F914D2 + FF12B1FF16C3FF26B4FF67C3C01FA7EA0A8FED0B87D710C7FF0E9DD9063F590A + 63A7042B58021C350000000000000000000000002D7AB0219FFA219EFD0B8BF3 + 0B70D50D89F90D8BFF0E99FF0F9EFF12A9FF20B4FF1FA6FF1496FF0FA2FF0A64 + BA0643760F9DFF10AAFF13AAFF14A1FF28ABFB148CD60B99FF0D94FF0E96FF10 + A5FF0755A9042A51031120121E211E3B3C000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000004E917272E0D440 + CCFF0FB0FF16B2FF23B5FF0FA3FF12A8FF1AA8FF0C569900010704121F010F21 + 0E84DD11B4FF128BE711B3FF0F98FF0E96FF0D8FFF1098FF0F99FF0E9DF30D7B + B314B6FF1FC4FF38C0FF2686C11F6B780DB8FF0D93E60A75BA0FB8FF12CFFF13 + C1FF0F9EFF021A35000000000000000000020200132E3E0F283E0F3144043D6D + 0C7FE60C80FB108AFF0D99FF0F9EFF0EA3FF1AB0FF30B5FF1BA6FF0F99FF0C89 + E80537710C81F20E8BFF15AAFF1EADFF24AEFB258FCF279EDA158DE313A5FF0D + 91FD0C83EB0E8FFF116ECB289BE33A7D97000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000010100000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000092FFDB88FFEC50D5FF27 + AEFF33C7FF4CC8FD24B4FF1C9EFF30C6FF3A7488000000000000000000031E41 + 0F92FE11B7FF074D8B11B5FF10A4FF0D99FF159DFF0E97FF0D98FF0000020EA4 + FF10BAFF11B9FF1588E60474C600152D0E9AFF10B2FF0C94E4096EC1084D8309 + 5694010C10000000000000000000000000000000000000000000000000042E4F + 0DA3FF0D96FF2493F90D8EFF0F94FF0F94FF11ABFA1296EE11A0FF0E94FF10A7 + FF084E87074D990E99FF0B69C4129FFF1FB4FF34C2FF45CAF744B1CB09528B0E + 93FD1097FF108FFF0E99FF0D71D0104984275C781E372A000000000000000000 + 0000000000000002030000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000002742448BF7DF93FFDC70DAC160B9B979 + F8FF76D9C063C3CD3B7D980A050054ABC10000000000000000000854A010ABFF + 10A6FF10A0FF0A79D111A7FF1BAAFF0F59A01AA9FF0C8FFE0D90FE1295FF11B9 + FF10A8FF0FADFF0C99FF0D9CE001172C0C76D411B3FF0EABFF0FB5FF0D96EF02 + 1D3A00000000000100010200000000000000000000000000000000000004375B + 0D9EFF0D90FF0B85EF1F9BFB1E9EFA15A1FF1390FE1CBDFF21C3FF0FB7FF11AB + FF0F8BF20222440C7FDF109FFF0860BF0C75DD13A4FF2DA8FC0C95FF0B84F804 + 32610B73DA0D93FF0E98FF0F97FF19A0FF2EA0FA5AB0C045816457A37D60B28E + 2E56450000000202000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000F181A3F6C69376159090F0A59A6877E + DBB826492F2D513A0000000000000B14080000000000000000000008110F98FF + 10A5FF0E96FD0F8FFF11A9FF21A4FF255E8B14AAFF0E91FC0E8EFB169BFF0C9A + FF10ADFF0FB5FF0FAEFF0C8FE102233B0B75C50FA4FF0FAEFF11A3FF0FAAFF10 + A4FF04294C00000000000000000000000000000000000000000000000004344D + 0FB6FE0C7DD90D9AFF26A2F139A4EE16A8FF2DABFC22ABFD21B9F60EB1FD19A4 + FF14A3FF05478A07417E18A5FF169AFF1782E6108BFE1779D40E98FF0E9EFF0E + 97FF063C6D0854A00E85E31396FF2096FF36A6EA43ABDA53BCE16BE0E75FB192 + 0D170F0000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000345E510F + 1D1700000000000000000000000000000000000000000000000007519C0F9EFF + 10A5FF0E8BFD0E98FF0EA6FF1AA8FF3F94C117A6FF0F8DFF0E8FFF26A3FF2699 + F40FBAFF0D9AEF0FB0FF0E9EDE0005110B8ACB0C8AF110BBFF0E94F00E90F010 + A4FF0E8FFF0320420000000000000000000000000000000000000108100B84D2 + 0B7FB50A70C70DABFF24A0F13D94BC2C92D234BDFF14ABFD1799F612AAFD2CB2 + FF0B95FF0C83F600030819A5FF27A2FF2C95E52F9DF23698DE33ACE90B8FFF0C + 95FF109DFF0960B204366C0F75DF0B95FF0B88F91182EC218AE62D83BE3A7071 + 346148172B1F0000000000010000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000001672CA0FA2FF + 10A6FF0962BA0FA3FF0DA3FF179DFF35BDFF1E9AF80C59A21B9FFF1CACFF18BD + FE0FB9FF0EA3FB11B9FF0D89EE020C1D096CA10EA5FF0975B80FB4FF12B1FF08 + 508F11A2FF0B72CE000B17000000000000000000000000000000000102010C17 + 02213A0D9EEE0DA8FF0F84E70C77D037777D3DB9FF0EA6FF2BB9FF28C2FF37CB + FF0CA5FF149DFF0000000E8EFF128BF324A0FF57A7A350AAC644ADE450CDEE15 + 9FFA1297FF0C97FF0D83E50111230A61B717A1FF1A97FD1D92FB3FA3D93D9BD4 + 55ACB270D1A467B9992138340000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000001A2A223CAFFF15B5FF0D96FF + 0FA9FF05356110A5FF14AAFF40CAFF65C6CD223B3F0E63A825BBFF2CC7FF0CA8 + EF0F9FFF0FA5FF12BAFF0E9CF7032948075E8F10B7FF0B86D90FA9F510B0FF08 + 5490032A530B76E4031F3D000000000000000000000000000000000000000000 + 0961A10C9AFF10BBFF0C86E20C92F400112649B7BF0883F829B4FB44D4FE1EB7 + FF0E9EFF22ADFF1C43580659AA0D87F70A7DEB2CAAFF72C99C38623F66B68433 + A3EE269BFE0C93FF18A5FF1498FF061523245D7F299AF344BBFC47B3DA77D9A9 + 7DE5B3559F7764B894508D862E4E4F2A48463C625E4C7B750000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000010200000021485F0E93FF0F9BFF + 12B2FF0214250FA8FF11A2FF1CAAFF1F52750000003687B72EA9FF50C9EE045F + C20FA8FF0FADFF12C3FF0E9AFF064F820107160F96F00FA5F80A71BD10ADFB13 + B9FF0E91FC022449042346000408000000000000000000000000000000000000 + 095D98085FA410B4FF0E98EF0E9DF70A77CC02131712A9FF42C0EA59E2FD1BC4 + FF1BBDFF1FB1FF0FA7FF16A8FF158EFC107BE80F8CFF57C2DE5EB39D41785A3A + 696343B1ED1598FF1C93F725A6FF0B8CFF031F3D0037772EADF30988FE36A6F2 + 63CDDB74DCBC6FCCA65AA3817BDCC281E6CB7ED8D02A47470000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000001F4A6A15A2FF1CA3FF + 11A8FF031E3C10A8FF0DA1FF1DADFF4AB1DF4274543F7B7C4197C76BC4B223BA + FF0EA7FF10A8FF11BEFF0FA6FF096DA40000000F92E50FA8FF0E95F50C8CE710 + AAFF11A7FF0F97F6109DFE00080E000000000000000000000000000000000000 + 02162B0855A810C4FF0D90F50D9BF40EA1FF00152C2380A56EFFFF4DD8FF1DAB + FF32C0FF38CCFF1296F0092D462775B22097FF0A68C835A7FC5FC9DE73D8A95B + A17478EBE52784CC3FA7ED28ABFE0A83FF2385D10A1219074E941C94FF1484F0 + 1E6FB44AA6C55DD4E275E3D07BE7C18CFFD43357570000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000001D32234EB3E833A0E722A9FF + 0DA0FF08539D12A1FF14ACFF119DFF42BCFF477E6327493C75CDAD219FE813AD + FF0F9DFF10A6FF0FAEFF0FB6FF07609D0109170B7CDE11AAFF10ADFF0960AB0D + 88F111B0FF11A9FF11ABFF0C93EA1B97EC1A466B000000000000000000000000 + 084E8512B6FF0FB2FC0A80CF10B2FF109FFF096ABB0200000E7CBB2BC4FF34C5 + FF4DD3FF3CC5FB1177D5020D19406F5B4AB4EB198DFB2A6A8E2A96ED51BEEA71 + DFCE7FEAB87EE8CD61C8E363D8EA0F8EFF1FA3FF449FB603000058BAD6369EEA + 30A1EF288BD23E7777417B6C4A86681729250000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000002D533D66B0902EB0FF0E9BFF + 12A8FF00000012ACFF2DB5FF27AFFF3FA1D6000000345E3F5DD1D315AEFF0A7C + DD11B2FF11BAFF0D93F210B5FF0B6BAB0000000B8ADE0FA2FF10A8FF11ABFF09 + 69AD0643870C82E30C83E70D87ED10529600000000000000000000000001152A + 0C7EE611ABFE0965BA0B8AD50EACFF10ACFF0C84EA02426E152F3862E0EF56E4 + FE38CFFF0EA4FF0DAAFF10ABFF0577DD3E87945EC4D03BA4E72B66754E8F7863 + BB9161B18C5595856ECBA872D0AC35ACFF3099E434B7FF0965BF000000467859 + 57C4D952C7EA56BACF60D1D463C7C777E2B575D7B5508B85345859090E0E0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000040706294A3C64BDA05FD5F6179CFF1194FF + 20B5FF090D0D0EA6FF129DFF4ECCFF63D2F0407655000000267EAD169DFF064C + 7C11B5FF10ACFC0D92F312AEFF0A62AD000B190C98E30FA2FF11B1FF109CFF0F + AAFF0B70CE021127000000000000000000000000000000000000000000010F1D + 064683021733021C330FAAFF0FA5FF0FB0FF0B77CB0478C74D90817AFDE75BE4 + F51DBBFF0DA2FF0F8FF50E99FA0B84EB19A2FF5FCED151A6AD53C3DC32728B0A + 110800000000000040755880E9B548B9F941A0CB51CDF725B3FF1361AC1B2A16 + 2B7B9335B1EE54CDE874DAB075D5AC73CFB070CFAB76D5B46AB9AD558F8C314A + 4500000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000101014F917081F6D54CA4B41490FF2AAEFF + 26B4FF00142A179DFF0E9DFF39C2FF70DCCF5DAC7B01000018517F0B79ED11B7 + FF12B2FF0D90F50FA2FF109EFA05285202040B0DA5EB0EA4FF10B1FF0F95FF0F + 9DFF0F9AFF0C82E9010F20000000000000000000000000000000000000000000 + 0000000000000B79E10F9FFF0FA1FF10B2FF0B7ED2099BFF5AC5DB3774711BBA + FF1294EC0FB2FF0F99F60FA3F90976E7198CF567D5C645A8D162D6E35DCAE967 + C2A013221A0000002C4E468AFFCF64CCD14EB5CF6AD6CF2AA4FB26A0FF2D5357 + 0000001781E82A9DF768D3DB6ECEB670C2AF62ABA36ABBAA589A906DB9B76DB3 + AA2D433E06080900000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000103010606003F8AAC31AEFF4EC1EC + 29BBFF00366D3884A624ADFF1EA2FF52D5FF8DF8CB79E0CC2DB7EC10AFFF12B6 + FF0F9FFB0E97F711AFFF11A9FF053B7609448213AAFF0B91F70FA8FF0FA0FF0B + 7CEA109AFE0E8CFA0B7DE7030F1C000000000102000102000000000000000000 + 0000000000000960AE0F92FB0F95F210C1FF0A70BD0FADFF0F4F770000000785 + D90EACFF0B84DC0FAEF911B2FF10ADFF11A2FC19A7F31FBBFF38CEFF4FD2F66B + CFB06ABF9A1F353456978C93FFE22E584A75E1CB7FE9C03CADF7218CEA59BED2 + 1D30191D3F4D2EA0FC288ADA4CB2DB77DFB46BBAA579CFCA1D2F320F16142E47 + 415471670A0B0B00000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000004A89665DC7DF7BE3C536B4F8 + 0591FF1893FF395C3A50B1D643B7FF2D98F47DF4E04DE4FF19BDFF0FABFF0F91 + EE0C7CE310A9FF11B6FF0E9CFD032D5C0406061C97E815B0FF0E99FB0FA5FF0A + 66C80F9EFF0D8AFC0FA0FF094580000000000000000000000000000000000000 + 0000000000000FA1FF08559A09559511B1FF086DB310B0FF10B3FF0325410104 + 0810A9FF0FABFF0D83DF0C85E50E9DF210A6FA0EAAFF10A1FD2DA5EA6ED7C868 + C09270CEAA2948430000000000001A30278EFFD178D9AF69CFCF389BD968D8D3 + 46816100000067C5AE4AA7C92F7CAC52ABB575E1BD7AD9B26DBCB385E1DA1623 + 200E151954604BC8D095000000634F2C87572804000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000101D1A69C29961BDA57FF0CA2DA5FF + 1197FF45AEEC00000041745472E4E160DFF665C2BC57B4C00F5E9C0B81F00D85 + DC10ADFF11ACFF10B6FF0DA4E800020704386E15ABFF16ABFD109DF110A8FF10 + 84DA10A3FF0C86FF0E95FF178FFF070A06000000000000000000000000000000 + 000000000000063E790963C3109BFD10BAFF08579810B0FF0F98FF0B82D90110 + 1D063E760C80E112ACFF0FA4FC0B71C50D85E90D8CF6097AF01C629F74CEBE46 + 755D75D5A860A79D253D3E000000223D3A83EDC978D8BA81F0CE41A2C662CBC8 + 74D4B0182A280A110673D8B05BC2C64C99914A989374D9B77CE6CA77D6C074C7 + C27BC7BF80C6BC70B2AA7EB4A3BCCB9C4B432900000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000026443980EBBE6BC18F7CF3E0259BFF + 2DA6FF4FA8BA0000001D352941796083EEB885FDDB86EEB7377F8B0A8EEE10AD + FF0EA0FF11B7FF10ABFF0FACF803234702162A0E95F115B6FF12ABFF10ACFF19 + A8FF1C96EB0430630B75D7159BFF2E6783000000000000000000000000000000 + 000000000000010F1F04396C109FFA10B3FF074A8910ACFF10A9FF0D99FF0968 + AE000000074A9410AAFF11ABFF11A7FF0F9FFF0E97F20E8FFE1493FA38B0EF1B + 76B858A6B06DB9A531535000000016272677CFC771C5B582F9D459B9B46BD3C7 + 6DC69F17272403060551947770CEA36AD0BB4A93854480724E948C78DEC478D6 + B573CAB46FC5B96FC1BA71A69A5E614815100700000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000001010001010000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000192E2B31545376DAA65FCFEB3DACEC + 3EA9F087FFD90000000000000000001A2E2A8AF4D477F0E660E8FF14AAFF17AC + FF0C98FF11B7FF1CA9FF0E9EEE0111250000040C7BE713B6FF13A5FF0FAAFF15 + ABFF1188F000081D13457220A4FF1B4055000000000000000000000000000000 + 000000000000063F7011AEFF11ADFF0D7FE60A7BC80FA0FF10B0FF0E9EFF0FAE + FF06457E02162D05406C10B7FF10B2FF109CFF0F9BFF1099FF12A7FF0C8DFF0D + 9FFF2FA8FF63C9E831514E000000070D0E3F696B61A99C89FEDD56ACA275E0BE + 72CBB2050B0B0000000001003E6C627AE2BA71D6B465BEA85EAF9128483C64B3 + 9772C7BC69B3AE6FAC9F353E3400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000203045690927FE2CA92FFD84BB9DF3F92B8 + 6FE2DB2F573C0000000000000000000000005EA6A730AEFF21AAFF2FBAFF2489 + DE15BBFF0D90F10DA5FE109FFA03274F000A160B80ED11B2FF0F9ADC0E85D910 + A4FF10AEFF21C1FF0B2B4437686E47878E000000000000000000000000000000 + 00000003070C0F98FF10A7FF0C7CDD07418310A8FF0F94FF0FA5FF0B7FCF0FA6 + FF0B77D3010D1B0215230EA1FF0EA2FF11BBFF0F99FF0D8EF9107FE115A8FE10 + 85F80F71D2399BDE69C5BA326044111C1669A19889EBDE85F5CC5DAB9578E6CC + 7FE0CC2944430000000000000000006EBEB761AE9175CFB86FCFAF6DC9CF427A + 6127473B09101000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000395F5E72CAB797FFE278E7C854A4AA65D6D9 + 84F8CB2646360000000000000000002C523475EDF42D9AE71E92E145C2FF1EAB + FF12ADFF0D8EEB0FA2FD0D84F302172C07366D0FABFF0FA6FF11AEFF0C78DC0F + A9F710A6FF0C90F21056950D1B20050600000000000000000000000000000000 + 000000082A4B0963B2074B840000000A61B80F9DFF0F93FA0F9CFA10B0FF0960 + A30FA9FF0A68C10000000965AB0FA6FF0E94EE10A3FD11ACFF1795F320A0F138 + BAFF0B22373A73753969611E382E96FFDF85E2C89AFFF468B3A972D6B17CDDC6 + 599D9247777300000000000004070735585927424371C0BC70C3B369BEAA75CB + BD75D0B576CEBE497D7A2F443F00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000042706E6EBFB451917F4D8D675EC1CC76E7C7 + 89FCCD4071690000000000000000005298727BEDD5447F753E8FB73FD1FF0AAE + FF0F9FFB0E9AF811ACFF0A69D4000000063C700EA5FF0FACFF11ADFF0E8DEE0D + 82E911ACFF17B1FF2DB5FF50A0B94B8D7A35644D000000000000000000000000 + 0000000000000000000000000000000B78E10E8EFE0D8BF00C7FEF11ADFF0A6C + B810ACFF0E84F100040A0102070D8DF40F9FFB0B7DD70E90EC10A9FF0FA6FF28 + B7FF16A6FF24ACFD3CAAE869D8EB58DBFE6FDFF474D7B55795917FE8C17FDAD0 + 33585700000000000000000000000000000004070736585563A6A063ACA36DB8 + B26CB7AA69BAAE63ACA56EB1A85A73655D593A08070300000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000040709070C0F67BF9374E0CB88F7C6 + 376552080D0E0000000000001F363517281F14231858CBE52BBDFB19BAFF0FA1 + F30A71C910A7FF0E8EFE0D8EF800000006528C10ADFF0FADFF12A4FF11ADFF09 + 5CB511A4FF11A4FF13B2FF29B7FD5ACEEF21331B000000000000000000000000 + 0000000000000002030000000212220C89EF0E93FF0F9DFF10A4FE10AAFF096E + BE0FA2FF0F96FF032753000000063E750C83DD0F98FE0C84EE0A6DC40E9CFE10 + A4FF0DA1FF10AAFF1DB3FF1AADFF1EA9FF65E5FF274B375088887EE1C977C7C1 + 4771680305040000000000000000000000000000000B0E0C619D94446F6963A7 + A26DA9A37BB6AA6AB6AB538C8873B4A7728A72110E0900000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000002640417BE1BF82EFC373C7BF + 25413E0000007BD2D056968E71BBBB9AFFE66CEFFF25B8FF0FAEFF0D9CF60C79 + E710B0FF10A5FF0C86FD00000001152E0C8CE419A1FF1CB9FF0FA6FF0FA5FF11 + A1FF0B6BC810A5FF13A4FF149EFF2197FF62D0E687FAC3203C30000000000000 + 0000000000000000000000000000000B6ED70D8EF6085DAD1395FC12A8FF0C85 + F10C84E711A6FF11ADFF064184000000074D990F9EFF109FFF0F99FF0A69BE08 + 4E990C8BFF1088EB0D85DE0B8AE73192D516232014140C6FB2AB74C8BD76B3AC + 191D1B0000000000000000000000000000000000000502005061530402012835 + 315F8A8067816D79B1A15B9A9959898591B092978753401D0912070200000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000518B887EE4C484ECCF569492 + 090F11000000518B83A8FFFF7AFFFF4FDAFF2EC9FF1AB5FF159CF90B70D112AE + FF10B8FF16A9FF0A4E91000000052F590EA7FF1E95E12AC2FF0FA1FF0FA2FF18 + ADFF0D90FF1187FC1AA4FE2CC1FF4EC0F268DBDE63BD9B4A856F000000000000 + 0000000000000000000000000608081085F40B7FE50522450F86E210A7FF0D82 + EF0B75C10FA6FF0FA9FF06487E0000000425480645870D8FFF0F9CFF10ACFF10 + AAFF0D88FA0861B00A4B79105590065297176FB34C8F9B83CABB72C6B486CAAB + 39473D1E35380000000000000000000000000000000000000000000000000000 + 00434A3947472D97956B71AA9F5568576B8F7F8DA889C6934D5C270C00000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000070A0756918E77D2BE5EA09A5B9994 + 00000000000000000033594D68C8A462CFD52D92C51172C71495FB0C98FF19B9 + FF0FB9FF2DC8FF08141D0008120C7EDF0CA3FF3AAFE327BAFF12A0FF1AAFFF1A + AFFF0D95FF0E8DFE0A7FE71E9DFB1EC2FF298EAE0D1004000000000000000000 + 000000000000000000000000050A0E115C9D1688F60947800E9EFF10A7FF0C84 + ED0D85F40FA2FF0EA4FF0FA4FF0962AB0215290000000433650B75C610AAFF10 + AEFF16A4FF0F94FF14A4FF27B2FF0D9DFF0B99FF32A4FF73C5DE75E1DC84EAB6 + 71BE9984EAD60000000000000000000000000000000000002E1C080C07020000 + 00000000000000A67E42A1B489473C212D2C1DA69C62A4905656381B03000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000029403B77C5BE74C5C4000000172421 + 0608080000000000000000000000003F88AB1AA3F92EB2F11DAAFF14A6FF32CA + FF17B8FF1F75A00D12090001070A70CC0FA8FF1373C413A6FF16A5FF2CB3FF25 + BDFF0C9BFF199EFF1A9FFA0D95FF076DB7000000000000000000000000000000 + 0000000000000000000000000000001E43541D4F7200224710A1FF10A7FF0B75 + DF0B75DB0F9AFF11ADFF109EFF0FA7FF05356602000000000012528015B8FF10 + A6FF15B8FF16A8FF0E8BFD249EFF5AC0DA51CAF24DBBFF84BDD5327FA35FCADD + 7FF2CC88FCCD72CAB75D9E9B13222113090000000025261EB1C1941718120000 + 00000000000000200C01DB964A1605000000000C0D05A35624E3702C64200700 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000B100D60998F213532000000000000 + 0000000000000D1614447F607CF8F32BB8FF1CABFF42C4FE25A5FF37C8FF31C1 + FF28B9FF023B6900000002193410A6FF11A3FF0764BD10B0FF22AEFC35B6FB3D + D3FF0E9AFF179EFF21A1FD0FA2FF0FBCFF0B8EE3021625000000000000000000 + 0000000000000000000000000000000000001222222EA5FF12A2FF109FFF095D + B70C84E20D8DFF0EA3FF1CB2F5138BE010AAFF1388F90313250300000825420C + 9CF82AA8FF2EB9FA2ABAFF1797FF399FEA59A99B67B6817CF0CA74E1CD447C51 + 36644F5BA28F46777B17262900000085CDC261979281DCD187CEC01015100000 + 000000000000000000000B00000000000000000000000000000D000021080107 + 0201000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000019201E3F5851030403000000000000 + 0202001523268EFFDB89FFEB4FC6FA4AC9FD72E5E359C8E82DB5FF58E9FF1CA6 + FF0B9EFF03274F0703001064A40F9CFF0F9FFF085BA80FA5FF2DACF443C3F037 + D0FE19A9FF21A7FF40B3F826A0F50CB3FE0EA8FF0A6BB7010816000000000000 + 0000000000000000000000000000000000006CD7DA28AFFF0D9EFF0FA5FF042C + 5B109BFF0E95FF0D8DFF18B0FF2294E50F8BE218A6FF0A3357000000010D1908 + 55A50CA3FF289EDE50D0F516A3FF20A6FF40C6F64EAAAD65BFB08DFFDF65B48E + 11211477CBB5345C4C43776A75C6BE96FFED7DDFCB8DF9E575B0A41718110000 + 0000000000000000000000000000000100000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 33545382E3D48DFFDA6FE2DA70E5E780ECC883F6CB44C6FA1EB4FF63E7EB0899 + FF0E94FC032347070300136FB60E9BFF11A4FF0959AB0FA2FF19A5FF20C0FF4C + DEFF1FB1FF23ADFF4EBBE738C1F3088EED0FB8FF10BAFF0E94DD074386000000 + 0000000000000000000000000000000000004DBBEB0E9DFF15A5FF0949820435 + 691196FF1598FF0E8BFF129AFF0B7ED50C81D815A8FF1193FF07417D02060901 + 11240E99FF129FFC2798DC1077CB0CA6FF10A0FF26B0FF2FB0FE41B7F67CE8DD + 81EEC087FAEA68CBBC93FFD88EFCDA82F4DD82F3D383E4D0233A3A0000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000203432 + 7ED6CF92FFEB7FE8C15FAC9997FFDE7ED6B14ECDFF0FADFF0D9FFF19A2F90FA5 + FF085EA90000000000001A81E5139FFF11A0FF053C7610AEFF0E9EFF4CE0FF62 + E4FF2EC9FF23AFFF63CDCC2FB9F60BA6FC0C96F90E9CF9085D9B000812000000 + 0000000000000000000000000000005FAF884CC5FF3EADF22F8BCA0500000B7D + F30A8CFF26A1FF1B8FFF17A9FF0D97FF0D82DE14A0F710A8FF0C81E603172C00 + 000003274B0E97FF0C9BFE0C89FC0647860D87F80FA5FF12ABFF2FB5FF47C5FF + 3ABCFF3EB1F67AEDDC7BF4E86ADAE26CE3E193FFDD62A6A30F191B0000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000E0803130A0100000022251F52756C + 5A948F5289880000004F887890FFFF54D1FF26BBFF13A5FF0E8FFF10A5FF0F9D + FF0D5F9B00000005030048B5F81FA7FF0DA6FF064A9017ADFF159AFF58CBDD51 + EAF621BEFF32B9FF5FDBD966D5CE04A3FF0FB5FF0EAFFF084C82000000000000 + 000000000000000000000000182E22478862559775131B0A00000000000017A2 + FF0B8DFF259EFE2A5C7741ABE40C99FF0D86EE0F9BFA14ABFF0C7EE904264A00 + 00000003070968C00D93FF0F97FF0F9CFF0A6BC50A47850F6ACB1286E40B83EA + 29A5EC3DB9F032BEFF27A3FF52BEDF74D6A5345850000000060A0A101C1B070E + 0E33413C2C3631080B0A0F0B034028121D0F0400000000000000000000000000 + 000000000026080161220F070502000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000005F4A2CB1AA77213938C2F7D25D7B6B + 26463F7EE3C497FFF690FFEF59D5FC25BAFF129CFA0C86EF109CFF17ABFF1786 + F6051931101B0E3C6B593FBBF10FADFF13B2FF052A4E14A6FF2FAEFF53CDFE2A + B1F60DBEFF43CEFD52D3E877EDD31EA4FF0DA7FF10ABFF11B3FF0B6BC4010E1C + 0000000000000000000000000000000000000000000000000000000000002CA1 + FF0F8AFC1899FF48929E2993D70B9BFF0D96FF0F94FF11A3FF1097FF1E7DD306 + 0A09000000020F1E083E791385EF0D97FF15A3FF12A0FF0B8FFF11527E145CA1 + 2F82AE206FAC2677AE4694993F89900D2E4A34675C6CCBA972CEB581E5CC79CF + C57DCFC45D9C967BA798929C73C7BF81685933482C133D17060000000F020000 + 0000010000B1340AA8310C010000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000048432DBFECC792F6E992FFEF97FAF4 + 9FFFF296FFDB76F0FC4CD6FF2FC6FF188BE01892FD179BEF11A2FF2FB1FF163E + 5D0000001C2F1663D0D527B9FF16B0FF22B7FF06284C149CFF1AA6FF4CC2FA63 + DFF41EC9FF2DC0FF55E2F42F605523B9FF0B98F111B7FF0B70C90D7DE6074481 + 0000000000000000000000000000000000000000000000000000000F160657C9 + FD1285EF1C8DF453C0F138ADEA0792FF10A4FF0B76D212A9FF10A8FF1D9BE730 + 7CA93C6A57000000000205245A7E19A8FF147BDE31AEFF14AAFF1EB5FF30B2FF + 1599FF2798F94DACC346ADC12BA2F346BBFF4ABDF363CFD56FDCC26CCDB27ADD + C17CE1D07EDCC879C6BA7AC5BB79B2A4A2B88DD1AE659F3E1100000074270B98 + 28043D1604FF9141D85A253C0C00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000300004B5E5491F2E797FFF787FFE8 + 70EBFB61E6FF40DAFF5BCADE2260803594D711A6FF27B0FF2DA2FF68EDFF0000 + 0000000002132A0D8DEC33BAFF31BCFF28ACFF0873E33FA0D21EAAFF1DB2FF4E + EDFF5FEAF00EAFFF54E2FC507C64049CFF0DA1FA0FB1FF10ADF60C7AE3043065 + 0006100000000000000000000000000000000000000000000000000406004189 + 9B31A8FF1C629A5DBBC876EFDE25B0FF11A1FF0E8CF3109DFF0FABFF0DA0FF35 + BEFF294D410000000000002A47373476931640614092BD3DB3F817AEFF36C1FF + 49C5F733A5FC2F9AE84CBAE565DADF71E0D273E0D477E8CA7DF0CD78E9CE73D1 + B766B6A068B7A97BD4CB7FC8BD8BB59FB19961D37631000000000000BD5925FF + AD5AA49863E0BB80DC4E191C0400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000002C363267B4AB82E8C0 + 77E4C857BDDA4C9F9E3597CB31C4FF40C9FF31B0FC75E3E3386B6C1A2B130B11 + 06000C200A85E42DC4FF46C9FF44CAFE1697FF1E92FE02387135C1FF43CFF846 + BFFC0EA9FF11AFFF25B4FB4EB2CF002D5710B9FF0C84DA0E9FE813B7FF14BFFF + 0FA1FF0D86FF00000000000000000000000000020401010000000000000062B4 + 9751B7DF33769500000050A3A726A4FF17A4FF0D8FFF0D78E41CB0FF17ADFF1D + A7FF0E9DFF0A6FD200060E0000000000000607003F715A65B28945C7FF31B0FC + 47CEFE60E8FE71E4E659C2CF5EBEBC7BE2BC79D7BA74C4BD6EB8AF7CD5C77FDE + CE86E9D563A39A000000000000391F063023140000003F3824EFA255E2AC669C + DAC18BC1AEDEB8768F441B020000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000453F2728342F375B582B4C4467BBAA4E9B92 + 2C80B560D6D763DBEF42C2FF68E2EB54C3EC65DFED72D0991B31250000000000 + 000B6AB90A9FFF54D6E942CEFF4FCCFA159AFF47B0E501162A22B4FF5BD1E473 + F5F556E5FF26B9FF0AAAFF20A5FD00122610A8FF0FB1FF0A7DCD0D8FE60B75BA + 0B72B6011526000000000000000000000000000000000000000000000000529A + 756CD5D055A597192D1B52A09E31AEFA0FA6FF179BFF085DB615A1FF31B7FF30 + B1FF40B5E60D8FFE0964B305396C0000000000000000003867457CF5E0169BFB + 45C5F34BCFEE44CEFF59DEFE67D8D058BDC47DE3B67DE0BF4C857A5E96934C74 + 7083C6BA87DBD46A745C182E2E556E5EAEDFBF2E4947AAE0C0AFC396A3D4B676 + CAC196D9BFC6BB8354351A000000000000000000000000050000000000000000 + 000000030808241A140000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000002B0D027C23036B522B9FC3A489D5C88FF8E488FEE180FCE77BF7F6 + 72F3FB6BEAE862DAEC83F7DE88FCD249928594FFE4477F680000000000000C55 + 9A10AAFF098EF224A6F550DDFF42B2F12CA1F24ECAFF0A0C042FADFF25A6FF66 + F0FF4FE4FF3CC7FF13ADFF06A8FF0000000E9AFF11AEFF10ACFF0D8CE4095AA6 + 00040D0000000000000000000000000000000000000000000000000000004886 + 6A51997B549F7E4E90636CE2E722A7FF22ADFF17A6FF0C529C0D9FFF26B4FF3F + C2FF44C2E9219DE60A9CFF0D89FA07376A000000000000000000396855004791 + 18A5FF38B9F53594C93FC1FF65EDFF259FFE62C3D875DEDB7DDECD76CCB0639F + 8B8BDEC395D0AFAAD0A46CB9B782D2C681DDD080DED085C9BE99D0B882D7C577 + D4C699CBB4A48953260C02000000000000000000000000942607020000581504 + 4810017226107B2B10000100301D132F27241A10170000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000047210AF1AF64C7D8A594E6D586EEDB7BE4D38EFFE28EFDDC83E5D1 + 89FCDD74E2C88CFFD783E9C78CFFD40E191157998A38625C101E134677731A9C + FF0C9EFF148CF358E2FD57DEFB45A6D64DBEE741C7FF0A4279539FA034BAFE36 + B3FF62F2FF75FCFD75F2FF5CCDF40000000E9FFF0FAFFF109FFF10A2FF0F95FF + 0B6ED00003080000000000000000000000000000000000000000000000000305 + 05549C776DC6A0080C054D9A9542B6FF38BEFC10A2FF0A345D20B3FF129DFF2E + BDFF3FBFFD36A3D5188DE60C9BFF0F8BFF2A95E2143346000000000000021D38 + 0972DE0A8CFF1290EA095AAD4EB3E029AEFF159DFF2AA2FF54BFE28AFDBD8CFF + D178E9D47FE4BE97DDB985E7D687F3D579DDC67EDCCD88E4CC81E7CB78DBC883 + E3D882A18A000000000000000000BA7E3D6B441CBF5A1FFF7C30AF5B27DB4712 + CA3207EA4F16B8320AB5340C9D2E0C432F240000030000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000EA4710FF9F4AD1CD9293C9B26DB6AD79CBC48FF2E483D1C77AC9C288EFDE + 66B69E8BF7D47ED5D35C9B9C182A2B0000000000000000001520172EA2F70DA3 + FF1897F350C4F456E2FF41C2F160BDB86BDCD53CBFFF1478E0283E1B6AE1E14D + D0FF32D1FF59E8FB4AD6FE078EFF0000000D9CFF0EA7FE10B1FE0D86FF109FFF + 0E97FF053D720000000000000000000000000000000000000000000000000000 + 00355E55172B251B302884F8CC64DFE11AB2FF13A5FF0E3A5D30B8FF23A9FF22 + 9CFC4BCCFD56E2FF57BFD51790E90C93FF086BC80B2233060B0D000000000000 + 000001128EF20C90FF0D98FF2184D61070D21481E630A5E733B6FF31ABFF49BA + F162D9E778EFDF74E7DB6FE3D06FE1D675EBF47FEDEE81E6C77EEDCF77CFCA40 + 615F392D142D45417BB3A79BBB9E98D1B6B1C095C3BC869EBE94DF9251DD8247 + E1934ED77D3FE2541D9C2A08532D1F09080B0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000008029087E481D3E33198B7948B3EDD1A2B48A88A89180CABE457673 + 16242880D7CC426B6700000000000000000000000000000035625A3DABF118A6 + FF108AF30986EF0E99FF42A9D778E0B974DCC235ACFB38A1E83187AF24B6FF40 + DFFF59E8FC64E8FA45D8FF33C0FF0803030C80D00D9AF70FA6FD11A7FF0C7BCA + 0968BC10ABFF031A330000000000000000000000000000000000000000000000 + 000000000000005EA9917BEABA4DD9F81CA9FF29B2FF04417E27B6FF3EC8FF2A + B9FF3BA6E62CACF323A6FF074E99109EFF179CFF3CB0FF427B7325432E13251C + 00000013538B0A478326A3FF1098FF1F9EFF0A6ECB1454892177B82873A73B7D + 7A3395BB37A4EC4EB4D870DAC55CB9B73881A22E6B7C49876B3B665B406B6123 + 44326CC7BF78D2C577CFC273BCB36EBAAE79B6A775AC9AA8A87A868F78A4AC7C + DE8141AD4014791C043710040000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000F69A4CB39D673329132D372D29342D000000 + 0000004E6F660000000000000000000000001E36315CA87E70D5C743BDFC0B91 + F71379D70D98FF2AAEFF7CDFBB75D7B07CE0BC369DE64EBCE845C0EA06A3FF32 + ABEC4DCEFF56DFFF63E8FF70ECFF6098962D8DD20AA1FF0C85E011B0FF0E89D6 + 0B6DCC0D71D20F46770000000000000000000000000000000000000000000000 + 000A1111528D868AEFD47AF1DB3BB5F039BDFF3EC6FD0D6BCF1BABFF42C4F24A + DAFF2EBFFA1794F50C94FF0B80E508549F1399FF2298F63FA6DC75E0CC3C6F53 + 0000000000000405033A86A72EA5FF30A5FE2AA6F81F9CFF3EA3CE176DAA1C5A + 8B44878139726E497D6A3D6D545391714276594170603457543A616550938D72 + D8C59DE3B176E0C375D5C36EC8BA70BBB276B6A98CB19481A189A88F5B8F4C1E + 4012020B00000000000101010000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000321306421704000000000000000000000000 + 00000003020100000000000000000000000015251D84FBD647B9F61AA0FF2799 + F4136FB821ABFF33AFFF90FFD178D4B882ECC950BDD75CC7DB51956B00051F10 + 81E213A8FF15A5FF48D3FF3CC7FF6EA9A05696B90D9CFF0D99F90E82E812B0FF + 0D97FF0F77E70400001118080000000000000000000000000000000000000100 + 0000000021393971CAA460C6C153CDF14BD9FF199CFF2694EB1B9EFF32BFFE54 + D2E45CD8D259CBD11398FF16AAFF04366D1487E41498FF2599FF286382010000 + 0000000000000000003463554285814A9DB667D3D33EABED3DAAF059D7F12CA5 + FF4BB0D65DC8CA50C5DE2E8ED94CAED368CABA7AE3C573DFD965D9FE71D5E584 + E0CB8CD7BE86CEBB8FBEAA89C5B5B5A582B6D09FCACB91DFA668D5B473E16F2F + 340C010000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000192B2154A79D50BEF14CD1FF0860 + BC139AFF43C1F86AC7D367AFA43F6E6882F0CE5AAC9F6ADCCF7AD8A92884C60B + 98FF0EA2FF0CA5FF1DA4F70FAEFF004CA3001E4210A9FF12B5FF0C7CE60C85E6 + 11ABFF10A6FF2CCAFF257ABC0C17150407050000000000000000000000000000 + 0000000025403E7DE8B879E9D56FEAD636D0F50174D941BEF22E9EF229B4FF61 + F0FE4DD7EA69D6DF2EA3FD23A1FF0C7FE90A325A29A0F73EADF156B8CC6FD4B3 + 3C70550000000000000000000000000B130976D79F70D5B759B8BB6CD1BA7EE3 + B469D2CF61CBC764CABF7AE8DF7CE4D470D9C374DEBF64C2B16EC5AE71CAB871 + C6B976B2AA9EAD82B09D62D9A55CC66221AD4C17B65A21B8390AF45F20F57631 + E946122108030000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000006090D82EBC584F3C158CEE92AB7FF1749 + 692FB2FF56CFEC83F3C3416B7071C5B57FF5DE63B99377E2C869C7BE21A8F70B + 9DFF11A2FF11ABFF0DA1FF11B3FF0110250330550FA8FF11B2FF0E90F20962B0 + 0D82EC0FA3FF0EA7FF30BBFF56B8CD101C140000000000000000000000000000 + 002B48467EDCCB8EFFD862BBB12FBFED14AAF60789EE41C7EF49B5D830B1FF57 + E8FF29BAFF50BCDB61BAC644B5F80D90FF1A6CB41374CB139BFF61C3BC7AE0AE + 5EAB872D4C490000000102020000000000000E1B1665B79B67BF9450997F82EF + C07BD8BA77E2C961BA9A65C0AE7BDAC172C1B680D5C386DDC676D1C168B6A867 + B2A06BACA578C2B982B8A98EB292AD8D53B65D27872306330B02801F05922808 + A8300C612B160000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000090F0F44727684F1C577E5D140B6F941B3F81346 + 6246C9FF56CAF18CFDCE476B687BD8C97EECCA63BEA575DEBF60C3D91B9CFF0D + 65BA22BAFF0EA3FF0E9BFF10A1FF0964C203243D0EA1FF10B4FF0F99FF0E9AF4 + 0D83F30437660F4D7A19455F0811160000000000000000000000000000000407 + 064B7A7438605C6BAB9B138DF808A1FE0A82DA08A9FF52C9E55CC6C931B8FD57 + DDF249E1FF21A3F453BABC5ACAEE1A96FF287AB51755851C9EFF21AAFF59CDE3 + 5FBDAD7CDFBF548F7730504E0000000000000000003B665F39645B020500579B + 8A69B8AD66B0A584ECCC5EA8946DC2AC76CDC371B9B43B534D7DC4BB80CCBD73 + C2BC506F68394E447A815FC29F61CC793BE06023822B0A270801030200020000 + 13060220150E0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000243A377ACCC690FFE182F6D15DCBD855D0FD3969521E92 + FB63E6F661C8C584F6C889E5DD86F1D567B99B64BCB37BDEBD79D5CC46A8E91A + 9CED13B1FF0F9DFF109CFF11A6FF00000005375B0E9EFF12B8FF0F9EFF0E95FF + 0D95FF0A78EB0100000000000000000000000000000000000000000000000000 + 00080D0C000000080A08000B1B04345B0EA6FF0AACFF30ABF665D4CD33BBF244 + CBFF6CEEE735C4FF4ADBFF54CBFB349DE531B1FF001D464EA1AC2BBDFF28A6FE + 3AC2FF63E2EB41ADE6081A290000000000000000000102030203040000000508 + 09253F3E598B8381DED163ABA604070758968E7BC9BE68998B656D5479826195 + D5C187A4881D0E00050200180D041305001C0500050000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000010200000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000010203000000111C2066B6A16BCFB06EE7DE52D9FF15251D47C4 + FF5BCBE893FFC57EC2B277C8C35B9A9A4B847876DBB379D0C06AC5C137B3F70F + ADFF0E9BF50C7FDA11B1FF0FA4FF000000053B6A13AAFF16A4FC0F97FF1298FC + 149BFC0D9FFF1584F10503000000000102020000000000000000000000000000 + 0000000000000000000001050C0C7FD50FA5FF0AB0FF33A4E36BE1D05FCCD32A + C5FF56DEF878F0EA86EBC85EAB9765D1D533B2FF207FCC2544333EB9F84ED3FF + 42BBF23EB9E21396FF0D94FF15A6FF052340050705070C070205050000000000 + 000000000000005A8C8658867E00000000000008060C8B96735C583D8C5623A7 + 8650D3BB7B7B3912000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000002B4C4D76D6B484EECB72E4DE37ACFF2E5D4C67DD + E967D6DF8BEEC58DE3D02837310203024A817A89F7CD7BE5E64BDAFF1EB8FF12 + AAFF0C83FE10A7FF0FB3FF11ABFF030105074F8C10AAFF0C7ADF11ACFF2293E2 + 2196E20A85FB21A7FF29668B0000000000000000000000000000000000000000 + 00000000000000000000031A320F93FF0FA1F809ADFF3AB2F662CECF68D5D039 + C5F427B9FF42C3FF51C0F17CDEC77FEBC23DAFF243B0EC0A0B011D9FFF50C4E3 + 5CD6EA5BD7E65CCAD333A7F10B8EFF128FFF2B83C6418587131F150000000000 + 000000000000003A463F00000000000000000000000000000000000000000000 + 0000E9732E391606000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000002020242646176C9C280DFD17ADBC55AC9E455B9CC3C645371F2 + EC6DE1D981EACF74C6C10000000A100F59999381E5C779E0E03CA9DD1586DF0D + 87FD0FA1FF12A9FF14B8FF0FA6FF00000005345B11A9FF0B6FCA10A4FF1E9AF4 + 37ACF61A8EFC199FFF3B83A10607010000000000000000000000000000000000 + 000000000000000000000007110B72D910B0FF0A8BDF16AAFF40B0E070D8CE56 + D6E924BAFF0D9DFF289CEB58D3F67BDFB654C2E15ECBD70E130447ADDD319DEB + 63C9CA57CFF94AC7FB53BCE22F98DE1298FF1295FF248DEA326E843F76590E16 + 1616262500000000000000000000000000000000000000000000000000000000 + 00003C0E00000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000080C0A78ADA2436D6B78C6BB7DF3CF65CECA66C09F34708659E0 + FF78E4C386F5D78CECE13B4A4418252373BAB269B8AF81C3B4567E8F087EDF17 + A7FF12A4FF14A9FF1AB3FF109EFF0000000B7BDF10A1FF0E92F70FA2FF0D9DFF + 3FBEFF3F859E278ADE4DBBED62B79308120E0000000000000000000000000000 + 000000000000000000000A71D212AEFD0FAEFF0B85E710B1FF3CA1D862BFCC51 + D9FD46BCE604ACFF149CFF3C95C98AFBCA61C9C954D1F13E786E294C404AADD2 + 4FB0C67CE9C544B6FB1D9BFF48ADE40E498012A1FF2CA2FF5AC0D16CC39F81EE + BD52957A00000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000203000000000000 + 0100000C0400242016475C547BCEC687F6D869CAB679F0D7406A554DA6B657C8 + FF87F4D079DBC870C5B97DAD9E44412E5A877E63A09E6FA3906EC3DF18A5FF32 + ADFD1BA1FF2BBCFF22B1FF0FA1FF0000000220420D92FF11A6FF07509812ACFF + 33C5FF24536820342164BFB82D574C0000000000000000000000000000000000 + 00000000000000095FBD10A5FF0F91E70A74C50E9BF60CB0FF1A96E46CB8B04E + BEEA42C1FD229DDF30BAFE6BECFF49DEFF4EC9F057D2F62396FF0C0C0071DCBA + 47A7BF5CB2A380EECB51C9FF229DFF41AAFC04274C188EFF1A92FF33A1F352A8 + B53B6F52254337111E1B00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 3E1D0BB99351A5DBBF8FE3D483E8D271CEB96DDAD666D7ED2439375EBBA56FD8 + DF88EDCF84E7D5375953000000302B198BA48676A39572E5C338B6FF36B7FC67 + CBD922AEFF19A6FB1BA4FB0EA7FF000000082D5416A5FF0FA9FF0B70D50D86E5 + 12A3FF3CC1FF5398881527165CAB840B150F0000000000000000000000000000 + 000000000000000000000216300213250D8ADF0F9FFF10B1FE39B0F1579BA244 + A2CD36C0FF1CA5F446B0E742B7EF44CFF55CDCE562D2EA48BAFD151F0A3E7564 + 5FDBF04F9C8C61B8A175DED36ED7EB6CD6F450B5F66B91913687BB37AAEF53C2 + DD7AE5C078DDAF72C7BA121E232D4B4A23333101010100000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 1F12076A5D387FB3A46BB3AB6FC8AD77D4BC74E3EC4CA6CD20343073D6B06CDC + CF85E2C67BD0C989DCD1000000150E056D866EA2E6AF68DCDE4DBFF272DDCD58 + CADF0EABFF0C93FD0E9BFF0C7DDA02000029637C1FB0FF0EB0FF128FF50A6FCC + 14A8FF1FAAFF4298C1335D4B080F0B0000000000000000000000000000000000 + 000000000000000000000001050B6ECA11A4FF0D8AFD11ABFA23A2F1084A7555 + 8F8F4CC3FB21AEFF0796F81285F06FE1E586E2BA69CECD55BED93E6D4917384C + 4FC6F671D9C652A0974E907D70C8B961CDF255BBEF3393DD164C741F83CE31A6 + F35DC2CA6FCFB378DCB568B8A88AEEDE35575400000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000191F1D67ABA27AD3C578D0C47CE2E259B6B44F8B7C7EE0C375E0 + C18FF3D986B5A082C7BF7E7D540000006A5C37ACFCB762C1A140735478F7EA1C + B1FF0C9EFC0C82EC10A6FF0760B90000000B3452129DFD1DB8FF108FFF096FCC + 1781D51FACFF65DEFB82EBAF79DEAA79D6C10000000000000000000000000000 + 000000000000000000000009120D87FF0F9CFF0F9BFF0EADFB0B92F50168C146 + 696B3CBEFE15A7FF0596FF3AB6FF62D9FE60CFED64C5BA61CECE59A17A081728 + 3C9DDC6DD1D66FC9B16ABEA477DBB34D8F8059C3DE2DA3FC399FD51F3B3941A2 + CF3FA5E350A9B162C1B470CEA336605900000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000799E8B7BD1C680BEAF7DD2BA82DEC86ACCB10A140C61A2A683F1 + D17DDFC383DAD1AEB380A1743D0000004773705FA69C77DAAD78E9CF45C6FD18 + B5FF0B79F111A0FF0E9DFE2590E7000000044F8C27B7FF3CC3FE0F9BFF1999F5 + 1566B8118DEE1BA1FF42BEFF7AF4EF1931280F1B160C15150101010000000000 + 000000000000000000000748860D8CFE0A6CD40F9DFF0F9BF80E98FF045CA73F + 362149B4F4049CFF22B0FF63C0DF32B2FF6DE4FF52CBED78E4C554957E223E34 + 49A8C269CAD972C9AC6BBAB16BBDAD4D817B7BE1B364CCC340B4F636A2D3121B + 0E509E8157D2EB68D4C774D7BC79DEB77BD9C671C0BE354E46161A1A00000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000008F713A8BC9BB7FB2A193B09488E9CC71DBB575D6C0243634639D957EDC + CD74D1BD7EDCD197D2BACB75379C7D5B48827C4A7F6582FBDE4FD5FF20B2FF0E + 79D6109EFF16A6FF1A79CC1E496500050F0A81E326A8F83AC1FB199BFF24A4FF + 1973B91C58893DA1CD56CBF06ADFE491FFE392FFE2528D8B0306060000000000 + 00000000000000000000010E1C085CB80E8AE911B1FF0B6EC511ABFF0D90F900 + 00002D95E008A0FF16A0FF41AAED54D1FE6EDBE84ECCFB7AEADA375B5C1E3525 + 66C5B361BFBF74D1AD6BAFAA6AB4AA6AB5B079C9AC78E0BE62CAC853CEF12B88 + D3284634277BAE51C3F373CFBB6FC2B370C1B859978F5F9088313B3530220E00 + 0000472811000000000000000101000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 57230ACDB26F89A683AEAD7B99C9AB78DBCB75D5BC68B5A91E2B2B35433881C8 + C17AD4C76EBDB192D1BDD4F1BCD5D79B95FFED8DFFFA57DDFC31B8FB1A8EF521 + 89D518BFFF30B7FB2F6680010000021A300CA6FF27AAEB4CD3FA27A1FF36AAFD + 25A9FF1579D62A432C41765C4885653966534F88800B13130000000000000000 + 000000000000000000001F69A40E6EBE0F9BFA0F9EFF0B7DE60FA7FF0FA5FF00 + 0000055BB1079AFF55AFDE6AC9ED5DE1FF50D2F162CFE176CFC1538B770E160D + 68C5AC50A1907CE4C6659C9264989160A29979C3BA82DBB46CCAAA78E1C13FA6 + E151A08E19353349A4C156B5C66ED0B27CD6BD619B9662989253756A979E7566 + 7B67CA934F000000000000000101000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 90481DED8E42A14F1EA5AA828DDAC568BDAD7EDFC666A9A5182523000000B3C3 + 997FD0CA7ED2C469998E81D8D19EFFF18AFFED6CEAFE3BB7FF2A87CE2595E51F + ABFF28C3FF4ED2F92D4F460000001980D60A9AFF4CCEEF42D4FE36A0E55ECADC + 33ABEF1AA1FF3668730000000000000000000305060000000000000000000000 + 000000000000000000001DA0FF10B1FF10ACFF06407D10A5FF0FA2FF0FAFFF04 + 5695110A0EAAA5A5A4D8D182D6D44BC7FF32C3FF4CD1FD52CAF54ABDF059B3B4 + 7FE7BB63BEAF6ED2B07ACCB983B8A94357506CA9A28DAC8F91D59F81E8C65FC9 + C965D0C926422A27493A76E4C462C1AF68C2A57BDFC17EDCCD7BCABD7DCCC193 + CBB5453113000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000F0200 + 641601140000D7D79688D7C96DBEB46EC0B47FD1CA435E57000000000000B097 + 5E869879B1CEA492D1BE9A7942131C1E579E8466B887207FC349CAFE2EAEFF52 + DBFF3DC6FF32B6E12C4A310000001EB0FF12A4FF0776E0048FF937B1F675D6B1 + 62D0DD2088ED6CDDE347815D0000000000000000010000000000000000000000 + 00000000101A104397C01BA2F30C86E30644850D88F10FA0FF109FFF0F9DF00D + 8EFF000000003C7E16A6FF12A6FF62C4DB65D4EA4DC2F71EA8FF21ABFF57B1C4 + 68B4A178D5B547837679D9C792CAAF2D3932554C2993976E81BDA568B4B47DEC + C55ECAC860D7FB050E17599C8568C6B25FC7CE64B59E4F917967B6A958918956 + 5B41000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000461103 + E04D16F9A152A4CDA97EC3B362A69C81CEBC7ABBAE6F73580000000000000000 + 00452F15E49D53B6BF8EDDB671904B20479F8A4EBFF74ED6FF5CD1E852C9F346 + D9FF3ECAFF0057AB00000000000024B7FF13A8FF0A79DB0B91F838BEFB78DCAC + 6ED2BA3D9CD05DC7D658A07B0406080000000000000000000000000000000000 + 000000000000000000000F120E0000000961B6109CFF0E95FF0F9DFF109BF90F + A0FF03244606213232A0E545C8FF66D0F955B6E657AED93498F41A3B4F000000 + 365A5B73CABC61B3AB5EA99470C6BF88C8B5798063311A0468766067ACAC82F0 + CD6CCAB45EC8E759BBCD0D170731585A60C5E26CCCCA6EC1B56AB7A75EA59E55 + 918B4E6053322C1B000000000000000000000000000000000000000000000000 + 0000000000000000000000010000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000250800912809C16128 + E5AA67B4C0958ABCA9749F8B6CB2A997C0A87E997E2422150200000000000000 + 000C0400953008F58A3FB5BF96D3BE867CE3D466DFE97BE9D564D4D65CE7FB45 + C9FF14A7FF075DAE0202003E6F632AB7FF12AAFF0C82E20D94F944B7FB62AE98 + 6DC8A059C0D357C0CD7DE6B7345D530000000000000000010001020000000000 + 000000000000000000000000000220400D86F90E9AFF1590FD11A7FF0C84DA0F + 9EFF002351230D0094A7945BCCF96CC7F654ACE2149AFF1D95F70E4E7D0E171A + 50786D70C2B86FC3B44F8D7F6BB7A873C1B97B9C87604D2B63422B86B9AD7AE1 + C96EC5AA79D9C85EBECF58A37F0B0E0C3D7E895CB5C779D1BD6CB5AC7BB09F71 + B6AC75AB9FA0A87A8F6031752A0B000000000000000000000000000000000000 + 0000000000000000000000010000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000AF2C08FE5619 + F08840CFA05F7F7D5678BCAD86C6B1A7BB8FAD83440000000000000000000000 + 000000004D1304A9795D88ECD5BF9972A3D0A681EBD586F0BC51C7E551E1FF27 + 95EE0BA6FF0A60A60000004D87772098FE1CAEFF1694FF0999FF37B9F976D1BB + 81EABF78E2B65DBFC583EDC1284A3C0000000000000000000000000002020000 + 0000000000000000000001000014578F1094FF0FA4FF2674B610A2FF0C7CD80B + 96FB1881E2B86A3BB0C1A68CC4BC6FC3FF1893F91D9EFF149EFF159BFF48ABD6 + 3C564951888971B9AD5DA4975C9A8E73C7BC93C1A7BCB680DFB9739EC2AF3B85 + 8570CDBD7BD6C164C7B67BE2BC38615F1D342861C4AD86C6AA7ACCB87EA99795 + 9F7986A68B818E6AC9B572B96F33300600000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000004C331388C0ADABB78E9CB08BEDB86E6910000000000000000000000000 + 003A3F32A1DBC07EE2DB83F3D078EACB81E6D367AEA27AF5FC29B4FF1F98F819 + 9DFF159EFC0A315A00000014200A4EC5FF26AEFF0E8DFE29B0FF28A4FF5ECCEA + 88F5CA44776B75DAAB7BE1C15998950306070000000000000000000000000000 + 00000000000000000000090E0A307FB01787F61685DE2FBFFF0D9FFF0D85EC0A + 96FF2365B8E652006C758D5792D0639BC809A7FF2FA4F648ABE421A3FF3DAFFE + 6CDECA7EC9A376A69770C5BC3A595149767171B3A975B3AA8FAD8EBA9656D86B + 3390A59476B3AB7FE1C267C4B85B9F8F0000005AA08A6BC9AF63C0A878C4B16F + A195CAB2746C4A2252250AA3330A4F14030F0200020000000000060200000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 511A04D49E5993B195D59D5EC78E4C9458285C1904000000000000000000120A + 046C795E82C7BB6FB7AE39616287E4DC7BD0BB89F2C743C0FF159AF60F84EC12 + 9FFF34ADF6243F360000005BA37969D6D01EBBFF2196E11AA2F844C8FE77E4DD + 6DBDA800000067B9A378DCB979D2C7263D3B0000000000000000000000000001 + 020000000000000000001B302650B7DD1F6DAF2848532DB8FF0C95FD0D8BFA0E + A1FF1582EC2A0700003F800494FF0589F70C8FED1FABFF40A7C064D3EF418B9D + 4CA5AF8FDFA97EAD9965A9A283CBB030534E4E584780825F9C8B5AAD632CC37B + 4C77A79F7FB3A680DDC559B0AC68C2CA2F46421B2C2E70C5B266B9A35CA8996C + C7BC86A594AFA579C9A06640432E571902B3360C762409551804631B07000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000210600 + BE4413CAA364C5A568EB63219C481A0000000000000000000000002602000602 + 006A5E3B778E776F9D9239605F90E7D085F1DB64E0F52DB1FF208BDF1A9CF83F + BCFF2C617B111F190000006DBF8E52D7FF24BAFF2699E2259AF924B2FF75EFDD + 7ADBB12C4A48365A5B77D0C44376701829260000000000000000000000000000 + 0000000000000000000008110E60B9AC457E74329CD0099EFF0B7ACF0D7BCF0E + ABFF11AAFF0F4A7A00040A0B70DD0F9CFF0C79D90B94F40BA0FF5DD7F15BA27F + 5CB480A9C48292AD8D60897D88B69D72BCB42D42400A00001E1005070000B387 + 5084A88F89AA8F7DD5C762B3A366C9E1588E8C0000004A787376CBBE60B5B650 + 8A8366ACA680C7B791BB9EC7AF72E48745D68C50D66E31F24D156C1904000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000003B0F02 + E35B20BF9358E6843FC93407601705000000170701D23B0D4A0600D7702FAE72 + 3887936F587F7786E0D78FF9E194FED57FFCF241D0FF3C9BBF25A6FF34B5FF6E + DACC1E351F000000477A6778F7EF34BCFF3BD1FF25AFFF1578D940CCFF46CBFC + 81F8E796FFEF253D4261A39C5E9F9C0305060000000000000000000000000000 + 00000000000000000000060C0722402827505C22A4FC14A9FF0D7BE00D7AD913 + ADFF0FA5FF093E730000000A5BB00EA2FF0E94FF0A6BCE0D96F92AB6FF48C8FC + 5BC7D5A4B47976C6A88FCCB29AA9866BA9A283B09C5F53320200000000002F27 + 15B394586E9D9081DBC562A9A076C5BE74D0BF19312A13151643686168BDC664 + BBC25693853C655E74AE9C7FB4A690B08FC9AE6EE46C2B742005000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000C0502892105 + E15D23B14113F75518671704000000000000140300EC813CF2E7A0A0D7BBB0F3 + D698DAC691F8EB8CFDDD79FAEC62DFF846B4EC2B637833BBFF52CCF85EC4D18D + FFD2000000000000001A420183F562E5E949DAFF2AB4FF256D9433C7FF5AE6FF + 6AE8E2346152020202131D19517F761018160000000000000000000000000000 + 000000000000000000000D151369BF9D65CAC83DBDFF0F8FF2095BB30C91FF20 + ABFF22B2FF0A7FCC000208114D880B5CB1119CFF0F9EFF0962C00D8EEE1CA4FF + 41C0FF70F0E581F4D3A0F5CBB6ECB097E7D47E9D8583754C0E04000000000000 + 008D572DB5D2AA6AB1AB70BDAE7FC9B385CFAC8AF4D2000000130D07789C8A63 + B6C481C2AD66A19B5B654E65755D9E78428338103A0800000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000002C180EB6330C + E64511100200B12F095A18050000000000000C01008D310BC1A46BA7F1D685F0 + E491FFE890FFE087FFF34FC0E45FBDA940929458D8EB45D4FC85F6CF437D5E4C + 8C71000000011C3D0B91FF41BFFF55DCF854DEFC38C1FF4BB5C81DA0FF48D6FF + 75F4EA8CFBD968ADAA0D15130302040202020000000000000000000000000000 + 00000000000000000000335F4977F5F63CC1FF1AA7FF0B60A50F63A61095FF1B + A8FE30AFFD0D99FF074C8E000000103758229FF812AEFF19A6FF0A5AA8228BE0 + 1B9AF330B5FF5DCFF790E5CCAACF9DA8BE98748769BA945A7131100000007B2D + 0DF8BC729FBD9B61897C85C9B57FB7A6A2C3957FD5B63F6F6E0600005F5F3E6F + B7A8A4CF9B7EB3A18CBCA07FA38D608D8564593643230E000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000110401A42B08 + 6B1B050000001A0600190702000000000000000000000000533C1F61684C79BE + B47EDACB6EC9B154998A67C0AC59B3B055D2FF53E2FF69EDF687EEC32E524500 + 00000910102685C7099BFF48B9EF3DC7FF54E7FD3ED0FF53D3F3217FBF42CBFF + 53E8FF7BF2EE73C9C9608C81656B510D0B070000000100000000000000000000 + 0000000000000055958889FFCA6FE2DF5BCFEF357C980A4D921FA2FF1B93FF1F + A6FF46C8FA1795F00973D500000008080144A6C817AEFF2DB4FF0D97FF2191E5 + 1871C31D5B8B509779263F3193411CCC9858968858BD965E9D45180000007827 + 0BA65A2A352712739B8A94B79DA3B58A83C7B073CDB268ABA718201C13151368 + BC9AAAB57C9EBF978FA282C08E528CA68996AC87C9884B8027085112020F0300 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000001D1B1563311D + 150C090000000000000000010000000000000000000000000000000B08065282 + 8070C7AC60B9AD5ABCDC75F0E277E7D36DEDF251D7FF7EFFF850878102020200 + 000000010D23A6FF0D93FF1192FF52D1FD5FDDEC49D8F738CFFF09457357E8FF + 55DEF757E4FE8AF8E28AE9DBADE7CA1316100000000000000000000000000000 + 0000000000000009110F75D2B3223F33203B2E050000179DFF219AFA3EA9ED29 + 99F32CB0F71C92DB0DA0FF0B5BA908050044979B28A9FA39C1FF3EBBFF229BFF + 3FBAFB2398E742A2C84368539F3F13F0742B412F16CA9452BE41110800000000 + 0000000048341597B18EB6B480BD8D577EC4B061B0A975BFB55A6C5C00000058 + A29A7BBE9FBEA26FA1A27BBA9050DC6023BB955B9E9460D37B3BB9380D160300 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000080A0A000000 + 00000000000000000000000000000000000089320F8A7647ADD2AC89E1D78CFF + EA86F6D283EAE37FEFE77BE0BD77EEF05BDAFF2BBCFF62CCF140645E00000009 + 0F076AD2D02EAEFF1179D459C5F671EFF760DCD74EE9FF3AC3FF47B7E2178CDE + 59ECFF6FEFE86BCBC472C6B2223C3D0A0B0A0200000000000000000000000000 + 000000000000000000000000000000000000004E938E22A1FF3CB2E967C3BE39 + B1F7058BF4096CCA0F9DFF0B52990000000011310585EE4CC6E63CC7FF42B5F1 + 54BBD550C7F432A5FA66CFE1B1A97B817E68322922D56825D14F19741C050000 + 00000000883C13C3AE72D4A05DAD704678C3BC579B8C7BBDB35C796D07000043 + 737677C3B295836673ADA2A89169BC4513B43209CE7739A56538D2521BAB2A09 + 4214070F110F0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000001D0701450D00551600FAB869B8D6AC85D4C37ADACD89E7 + D08EDCC582DCCA76CFB87FF0EE4BC6FF4ABFF714ADFF18364B1F2D2700000056 + 9E7450C5F81FA0FF3FA1E051C7FA4EBEF25FDFEF5AE5FB57E2FF52C7E335B9F6 + 1EAFFF4BCBFF71DEEC82DEC983DED490C9BB7F61361E10060000000000000000 + 000000000000000001010000000000000000005EB3A42E9BF453BEDA72D1A435 + BAF80A8BF00A66BE0E94FF22A6FF152A2E000000075DA61BA5FF3BBFF34BD2FF + 50BAD87DE1A573DDCF5FC8CD61D6CB7EF9D96DABA5AE4621B7471B7D220A0000 + 000000008C2B0AE78D468B471DD7985F82C8B463A39B83B5A37575540500002D + 362E75C3B85BAEA65DA8A077C5B8B97039A32905CE4312A12E099A3E15C73C0F + AA2B082E13080000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000521504F65C1FF99850A6CDAB84C2B17FD0C397D9C4B4BE + 9087C0B07CD2BF83ECD272DCFC2AA5FF29A7FD1CA6FF0803000000000D18154C + 8C7161D0E0249AF71888F241BFFF4FB8D24FD8FF52D4FC4DE6FF54CAE34FD0DE + 099EFE17B8FF42B3F8569EBF96BC9CA0B992CFAE67733C170000000000000000 + 000000000000000001010000000000003D705672D7B93FA3D469D5D568B5873B + ABEE0991F90C76DB1096FF1690FB376B730000000954990794FF40A9DE3FCDFF + 30ADEF7AECD274CCA880ECC873DEC079E3BE7FE9CB83ABA0AD6E500501000000 + 0007000099300CDF4F19812305D79F6183B7A375AC997EB29FBF9E6242200B0C + 0B076A958572B0A5558B816DAEA399A885BF824ACB4313811D04000000681A05 + 8D25075E1A05030D0E0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000071312982909EB4D15FF8A3FFDB366A9AC76B4BE90BCCC9DC694549EBB + 9893CBB78AEABC8AEFE070C7EC3695E12FB4FF38819C000000000000335A5189 + F6BA55CCF81774C62E89C03CB8FF87F0BF68C6D25ACFFC5FF1FF4DCDF063D3D1 + 14AFFF098CE411B9FF10B7FF578DA4513B1C0F0A030D05010000000000000000 + 0000000000000000000000000000000038684E79E2C348A1B982F1C080F0D92F + ADFF0D93F21170C91E9EFF28A2FF1D323100000006264B0E8BFA1190F40F7ADB + 0F9FFF32B0FF73C3AB60A49588F4D442766B7CDAC97BD3CB8896875744320000 + 00000000781F074F0D00E66727BCC891909B7486AC93A3AB7FB6884E89371200 + 00006E6A4481AB956BA89B3E5B5A9FD2ABB0AD78C17034BB340A280600461505 + 2419122919101F21210000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000692A2257251E130D0D + 4E2F2F070607160F0B801E05AC2403000000651B01FFB05CD0692FC67A46BDC9 + 978EFFE46FEEF24DB2F694A59428B5FF66D5DD36634A0000005E9F998CF8D573 + E6D841B0EB3992B932A2E35FCCDA8AEBC150BFE83FB8FF64EAFF3EC9F874D9D7 + 3AC0F80FB2FF0A85E8000C210000000000000000000000000000000000000000 + 000000000000000000000000000001034E897C7EEABC61B79248806678D9C040 + AFF5239BEF0A63B50CA0FF4DB4D85CA5860000000602001D87D10F9CFF0C79D7 + 1376CD25AAFF61D0D982F3CE89EEDD3C65630000004975705F8D847091811F15 + 060702000000009F2103FA7B35B9A57987845F70A897DD90487A4C2500000000 + 00002A1406B8AC758EAB8B649C942E362C98A88ABF9461D56428E44A15A12F0B + 1002000601000000000505070202020000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000003C2B2BAC4522AC431E + BF441B7E2A107E290B772C0CF868288E4017D4773FD1976996DFC980E5DB84FB + E569E3F358C8DB3A9EC951D8FF74E9DE335B3F00000000000029474575D5B071 + DABF52CAED358DB146B3ED7EF0CD89D0B04597D83DBEFC65E9FF39C9F76DCFD0 + 2DB7F90FA9FF0F9EFF0E94FF031F3A0000000000000000000000000000000000 + 000000000000000000000000001E32346ABCAB7DE7BD3762541B30277CE1BE52 + C8EE0B80EA1A5F911FADFF33BFFF63B08B1A2F210B1212101A1D30AEFF19A1FF + 0F7CE30C65B42EB8FF59C9E97FE5C688ECCB5A9C9559908B141D191D2F2E5A43 + 219976498E3111F1591CEF964FA0A172AB8F5E9DAF82E4793686280705000000 + 000034120477562EC29A5B82A78F8C90674F625492986FBCA46BD17333C64110 + B62E086D29132B251F5234311311120000001E09060D02000501000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000F0C10AF431FFF6C2D + F68D4EEE6C2EFF5B16ECA25EC3C394D6D49EBFD4A693CDBD84F3E282FCF983FA + DA60C0B959B6B759CEEE7AEFD58AFFD429483E0000000000004678707ADBC080 + EBCB41ABED51A6A45ECDD784FBD969B9B62DAAF551CAFB65E6FD32BBF86ECBCC + 43B6F50CB4FF0E99FF0E97FF0B71D001070F0000000000000000000000000000 + 000000000000000000000000000000003F6E687DDCCB1A2C2C78D9B672E0D330 + ACFF3292CD18619938BCFF29B0FF51D2F647846700000000000048959B30ADFF + 2AA1FB1673C52776A638C0FF5BD0E778E6CF87F7D271CDB56AB9B07ABBB2A8C8 + A39D9A7FBE552BED995BCE531C9A6037AD956BB1915FEC79356A160000000000 + 00000000003C1506D06727A59C6AA9A7777674597145238D8365BF7247CE622B + C13B0FA7330F9F3514822A10401D1132211C4D2B2B34110D0200000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000004B281BFF6726 + EEB16FCAC992D2C897D6BE87AFDEBB8AE5D688F3E790FEDB8AFDE35DB5C54F94 + 8156C4E46EE6E285F5D977D8AF3A66612643420000001321206AB2AC78C9B067 + E2E84AB8CE2C656E60D9EA7CEDCE65E2FF7DC8E66ED0EB49CEFF3CC8FB6ECAC9 + 6FC1D64FA9DF0BB1FF0E93FD0C83FF0001060000000000000000000000000000 + 00000000000000000000000000000000467674477A7B000000549F8964CDD555 + D2FB2D8EC81981E436B0F54BCBFD29ACFE08539D0000000000007BE5B455C1EE + 4CB2DD199FFF3990B93270785FCBDC5EE2FE7CF5DF8BF6D28BF0D689E7D984EC + D976C4B799CAB3E7C985AE3E0DBA844EC38853D87030B1380EB2300A1A050100 + 0000000000080000A9370ED0813EB68E599F946FA08252362B19BE9D64BC9056 + C1743AC3622CBB4419B73B0E9430125F3F2E221E250300000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000100000000000000000000003B0800 + E16225D2BD8386DECF8EE1CEA6E2B38ACFBC66AEB175CCBD3963636CC2A77FF4 + E67EE8D888FBD178CDC4487B770000000000000A09046D7C666CBDBC71EFF446 + D8FF69CAAB326F816DDFEF7CE4C484C0A385C5C15AC3FB1FB1FF4ECDF978BCB7 + 37A0DB06A4FF0E95FE11A9FC0FA1FF1AB3FF03090A0303020000000000000000 + 0000000000000000000000000000000002020100000073CAC08FFFCD76E8D543 + C7FF11426D40ABE540ADEA57DCF85AD4DE098BFF042A500000002C513D1F392D + 7EE5B157CEF235C3FF3CAEE60D304F4A917F2F98ED5ECFE876E8D37FF3D281E5 + CC84DFD680AA94000000C9370DE58640CC4F1DE6441027060000000000000000 + 00000000001B0600992D0B791F03D86423C2622CACA069C153233E0C01862C09 + B93D11C64012A62B08842B103A27202118203215130000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000001404003A0A001C0807110E13381F1D280C047C26095A180353341A + 8549289E815996A4818B977C5F958B5A7C6E56927F7CD2B677D9E280F2DA87E7 + D076CFBE81E4D079C3B90000000000000800008FA07C79D9EA5CD5FB56D6F659 + DEFF4E959D519A7F7AEBD47DE0CEB2B89775B6DA33A8FE1EB6FF58C6EF82BBB9 + 7CA8B417B0FF0E96FC0E8BEF0F9DFC0DA0FF248CD70B0D090000000000000000 + 00000000000000000000000000090A082939344B797682E3D27EE7CC4EBCE946 + B1EC16200B56C8E153B9D346C8FD3CB6EF1896FF0D78D20C1C27000000182B21 + 4E8D6F74E2C63BC1FE54D8FF4CC0FA65C7B65087605AA2824F8E72518F845188 + 86465D52131915100100D74513DA6328AD350FAD2D090E020000000000000000 + 0000000000000000000000000000CE3F0FB53B11BD763CC37C498D6E54423F29 + 4110013C0B002D10061C19150002030000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000200503471105882A194B2B2E52322BAC3E1AD24C1CF37439F39F5CC9C18D + A0C6A784BFB390BB9BB3BD8C85C5B97CE1D598F1D48DE1CC79DACE88E4D17EBA + AE58979445696586AC920000000102000B160E3A87C229AFFF51C6F461DCF766 + D1ED4587865DA7917BEDCA89DFC95BAACF3B9FF10095FB2CB0FF5DC3EE84AEAD + 75A6B411B0FF10ABFF0F99FE0C80F8032B5908121B0000000000000000000000 + 000000000000000000000000000100005480788AEBDC82F0C96BD7CD6AD8D244 + 795D2479B05AD4E858B5BC65E5EF37B0FC1B8BE40F9FFF236CA0000000000000 + 1F32317FE9C046C6F95BDBF55ECEE15ABDC56FE4DB3E90B738747E4C8B734677 + 711628280000005F1C08D64816D045167F270B461D0E00000000000000000000 + 0000000000000000000000000000932506962707C95520BB612CBC5F32B4834F + A552216A1D070000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000094 + 1D0E9E28115A2D2A6B392D973B1ED24F1ED86C36D36D37DE8545C3CD98C2D8A8 + ADD1B0D3AF7DCCD0998FD1BB7AD1C785D2C7C5BD8583CBBD7FD0C383C2B4A2B7 + 9258624D00000010100B0000000F190E49A4BB1FA0FF52B5E055C8FC6AD5E76F + CEC565BB903A6B6E76E4DA83EAD379C2C9449FD600A8FF5F9AC75AC1FA86AEA1 + BDAD8C1BA6FB0CA1FF0E97FF10A0FF0C5EAE0000000000000000000000000000 + 00000000000000000000000000121D1B63A7A181E9C380F1D77FEFC877D8B433 + 593D3AACFF6EE1DA58A9966BDDDE5DDCFE2D9AEB0E94FF3FA5DE335C46000000 + 141F1F81DECE1BA2FF58DAF660DBFB7EE8C963CABB70E0E078E0E26DDAC97CE5 + C176CDC066ABA6654332C62F019320006A2F1C02070700000000000000000000 + 00000000000000000000000000000F0603551805CD3E0FBE5421B22E07BF5624 + BC763AD04C18551403050C0B0001010000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000931F077821114E28265531258B2A0EB7380FEE662AF77236CD4916D34510 + E43E05F38D48ABB68CA9C299D8AB6FFE913FACCCA08AA3879EBB98DAA258422A + 0C000000000000000000467C6D73DEBE43C2FD5FB0E051BEFD6BC2E77EDEC979 + E2BC60A5953D738075E1E972CEBC63E6FF84D9FD91A1BC0DA0FA7BC3F4577C89 + 6A61686280BA08ADFF119EFF0E96FF10ADFF1632470000000000000000000000 + 00000000000000000000A19F6F99D6C381DCD17BCEC86EC0B0406D6E00000065 + BD9B42A7DD73D2BB7EE4B347AAD638B3FF39A0E61F8BE424ADFF5FC6CE1D4138 + 0000000000000B81FB3AAFF733ACF554CFFF7FE3C06DC3AD74C9B583E5C373DA + BF6ECBB967A59B838373999A789C9A6D4B342D06020300000003000000000000 + 0000000000000000000000000000020403702D178922079124069E2F0C7D250B + BD4317AE4419BC39105C1C090206060000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000300000600000000004B322FAC411E89361C752F1C7B250CE24413 + FE7530997A4DE38F4CE89959E05016DF7535B57C46292010A8632FB34C1B0000 + 000000000000021B312A90FFDD5CD7F24A9BE088B3BC68C0E896D4BE6FD2C27B + E0CC457571417C6988ECD47CE4E946C2F55CADD72D9CEE07A7FF9EA3B8886E4B + 195EA304A7FF0D91F719AFFF1D87DC1282E13CA1E60808000000000000000000 + 000000000000000000003C331C49594B56736635534F15212300000037615176 + E2C558B3B07CDBBF74CEB36DC0A938B2FF0B69C31B78C338B9FF47B1C6143535 + 000000000000126FC6179CFF30A1F132AAFF7AE4E573D1B376CFBA6EAAA588CF + C184DBC7639F9659696174C2B89FB994D2924F913A127722080D020000000000 + 000000000000000000000000000004040437231B0D0704270B049E29086B2813 + 8E3317A5320C9E3712832A0E3927211913150000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000002705006235336A3328422524332F3090391CA43612 + 72240A320300FF6E2AC14113852509AB340E1F0500000000320F022B09000006 + 0937504A436F7177D1B978EAD23EADEA4484BD72C1DD8CDCCD7DD3BD66C7C76F + D1DE2C3C3668B7A18EEEC78DCBB38EC9BB51B2EB139BFF09B0FF5B9FD3A9583E + 3B4D7B099AFF0D8CFA14A5FF1B98DE2B88D037738117271A0000000000000000 + 000000000000000000000000000300000200000000000000000D16185FA79678 + E2BE69C8AE79D3BC6FC1B586EFC639ABFB2082CB1571C824A6FF6CE0D6396F5D + 000000000000060E131E9FFF108EFB4C9FD263D7FF68CBCA72CAB26EB6B26C91 + 7F6B887389C5B867A29C73A89B8EC3ADA5AF84D0A263C2511A01000000000000 + 0000000000000000000000000000000000000002000000000404542817431F10 + 432216AA330D8A2F0F8C3312692B172C21220000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000962712000103070202060404130B0C080200 + 0000000C0D0BC4360D0801000400000800000000000000000000000000000101 + 025C91888AF2DD80EAC257CFE74FA7B8A19D94BFE5B28CD7BB6DBAAF71C6C069 + CBDF4E4C36447D787ADFC68CD2B59BBFC67FC5E472A3E315ABFF1EA4FF4D4C73 + 072C5C0EA2FA0FA0F70D7DDB0EABFF1AA1FF548E7C254229060B090000000000 + 0000000000000000000000000000000100000100000000000001030555978A76 + D8B76CCCB56AB8A857949472BEA85BC8DD2D9FEC238DE62CA5FF4BC3F37CE9C7 + 66B2A0070A0B11211F51CAFF1D9AFF1C7FDC7FC6D554CAF181EBBF90F4CF84AD + A073572F908B5C94D1BD718A73464F3ECBBC80CBB575E6863ECE4A1663190500 + 0000000000000000000000000000000000000000000000000000231C20392B28 + 242426652C189F280671260F672F1E332C29220E0E0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000002A241E0000000000000000000000000000000000000000001D2B + 2970BFB479DABE70E7E260AFB4C9714FBED2A89DF4D074A59868A3978DD6B990 + E3C02F594D5B888078D2C37CE9DA8EC4DB93AFBD9196AE129EFE0AA1FF084B8F + 07346510A9FF12AFFF0C7DE20C7CDA1FB1FF42CBFF64CCCA1D3527070D0C0000 + 0000000000000000000000000000000000000000000000000028403E75C6BD6B + C7AA72CDB379D0C24D757072C7A779E9C839A6F31988F53EBFFF4ABEEB52A291 + 1728210000000000001B33305DC8DF259FFF4E87973195D94CBCEA6ADCC9A6D3 + 9A88B39EB47342C7BA82BEA366000000000000972601902405A02B0968190405 + 00000605050302020000000105070A07060C04030000000000000000000B080B + 271D233F3230672610351D1379260C412A2A351A1C1E07020500000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000001C0C044D3119635C3C8CCD + BD7DD1C87EE4CD68D3DD49908371D7D290DDB995CFA673ABA194BB9EA0C9A594 + D3A7579D95292D2582CBB681EBDC8FDBC3A9D7D0809AD15973B82B93E60C4C82 + 02244816A2F917B1FF0F99FF0F83F40A6DBE33B0FA64DAEF84F6C52A4B440000 + 00000000000000000000000101000000000000000000050605537A7371C1B772 + CEBD63B1A07DD1C651706872C0A66DE1D93FB4F02DA0F42AA4FF60D4E66ED9C6 + 3A66560000000000001A2F206BCAAF4CB1D736ADEE24668748B1D05ECFE279E6 + CE77DCCA83DBCE98AC93D2884D363626402A11DF63280000000000002C09000E + 0604A13E1F3C160A0B00006731244F312C130607000000000000000000000000 + 31110E46302D3B282615111445281D482E233E2628631E144C11020500000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000045270ECDAF71A4CFB17ED3 + C47AD8C281F3D73C6D586AD9DC76E8D67ADFCFA59D6D91AD90BBA97392CCB082 + CBB05598963C230D99A98598D9B16DD9E66FCDF1CBBC9CEC815B885572053058 + 054F94149CFF2CBFFF189EFF159EFF147BD51B2D2C26483D1B32240000000000 + 0000000000000000000000010100000000000000000000000034514C70B7B17A + D9BE43706F77C9C185CABE81E6BF6BD9CB46CBFD36A8DD36B4F952D2FB6BC0A7 + 5EA1990D171700000016282672D3AE67C8B469D8D247ADD5468D8855AFB274ED + D875EADB7CE6CB79C4B6A2AC94A5B48ECBBF88DDBE80554A2BAD6330D644129F + 2907FF6522A82905B84619DF421142271A000000000000000000000000000000 + 220805462A2B421C1A0100031B12143A28283928272D13131805000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000003C483A70B3A977D3 + C379E2E53F768246908772E1EC78E7CFAAA27FB9A169C9A161C16C3D7FC5B26D + CDC0659892436D609CF5C5B4F9C366DBFF65C1F0659ED14CA2F72E93D1000000 + 075AA324A7FF31BBFF2DA0F735B0FA16A0FF336F8C0000000000000000000000 + 000000000000000000000000000000000000000000000202004C5B4C7BB4A876 + CDC32338365E817494BCA6A0DFA86EE8DF4DD0FF156AB944BFEF3FCAFF6AE3E4 + 5E9A8D08090700000003050505090763B6947CE1B864CFCC49BCDF3784A01A33 + 325BCBF671DEE981E8CE86DBC98ADEC97ECEC27FBDAAA4C6A5EA9D56F86A21F8 + 914AD1B177CE9157F47231A9330E2C2D2C000000000000000000000000000000 + 3F0E035B1A0E2608000000000B02003C18194622243C19171104000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000491B07C9995AA4CEAC8DC7B185DC + CB6BC4B55AA0927BE2C483E4CF7EC5B9B8B18EB6844EF2722AB99D706EBAB373 + C4B58BCBB99EFFE070F3F974A4DB9DABB6B7A99094BFCF63ABF42D99DA16302A + 0866C10D9BFF0A96FF31B3F460C6D62A9EFC55C6EF48815E0000000000000000 + 000000000000000202020000000000000000000000001106007E744D7CB7A86D + B8B32E4039000000517C728FD4BE64DEE74BC8F8296F913EADE648DAFF4ACCFA + 6FE1ED81D5CE556A5E0000000000002A474668B6AC7AE8C472D8C165CDE25DCC + C82A4B3D56A08275D8B676DECB6BD3D87BD5CA89CCBCC7BB7DADA785ACCCA89F + CAA6B4AD7AE99156D94310471305000000000000000000000000000000000000 + 0000000000000000000000000000000000006618057021125D15060700000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000020101000000130000CE4B15D59855B5AD7E92CAB08BE9 + C853937D4D86847DEBD28ACEBD92927FE35519551E06DA4D18B2B98E70AF9F7A + B8AE9B986B2D4A423F815F878E807088A7A193A3A6A0ADCAA68F963C37120908 + 0E74C30EA2FF0A80ED24AFFA6DD9C85AC7E14EB8DF57A2840000000000000000 + 0000000000000000000000000000000000000000000038210DA3996666958B86 + B5A33027120F15146A9D917ACFC460E8F24CD7FF23657C309BE35AE3FF47CFF7 + 41B8F845B3F631423A0000000000000000005C9D9A79D7BF6EC8AA79D4B75DD9 + E05CC7CF33616C477A704675734C848C7AD1BEA8F2C37CDED172D2C97BC2B497 + C9AADA9F5FE25B1F661B05000000000000000000000000000000000000000000 + 0000000001010000000000000000000000001A05014810017219041404000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000101000000300D03902F0ED04D1BD5692BC1B17D91BDA673D3CD6CBF + B638574F6CBABC73D7CE9ECDB0B09D708D2E0D751800E68E4AA4BD937EA99283 + BCA8C68C4C2000002F5E4A39A9F035BFFF66B2D89094ADAE7B76BB5144823922 + 1B81D50FA0FF0A71DA10A3FF59D8EF70CFAD58B1A47DE9BE487F720204050000 + 000000000000000000000000000000000000000000000000003F30178C9E797F + 815A291C0C92AF8E87DBD45FDCF553DFFD46C3FC3B94AD3EBBF15DDEF649CBFE + 4BBAEE0F91FF1D68A11E3A3A00000000000071B4A93B645F53928677C7BD76E2 + DA53D6FD67D3ED529E954B8C7641655D436C5C35695F68B6B07EBAAA9EB891D7 + 9A5B7733112C0600180500000102000000000000000000000000000000000000 + 0000000001010000000000000000000000000000000000001704010701000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000020000000000050000AB3009FA8D46B3C29981B5A278C2BA7BD0D55A72 + 6257958490EAD074CDC2AECBA6884F1D540E00DA4F16DAA062ADA27388967CB3 + B583C37839928E686AE4DF59D2F585F3C746C7E84FA4CE5876B33069B8622405 + 3B78AC20ADFF0D8FFE1B9EFF55CAF36ECA980B130E8EFFD33158480000000000 + 00000000000000000000000000000000000000000000000000412F17C8A865D4 + 823A000000252D255DA4A467E0EE66E2F52FABED369AC350CAE950DEFE4DBDF8 + 53BCEA3DA9ED1496FF1F52750000000000000C110F000000416D6863A5A273C8 + C856D2FA51C7F87FE0CF88DEB272CCC065A9A2474D3E795A2E00020706020045 + 2E180000000C0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000005000099693485A088A9C1989FD7B2B2B2770B21 + 2596E5C5A1CAA789C3ACAFC39BC26935B22C08EC551AB6B1809489629FAF86E1 + 712FAE784D78FAE479EBCF8DFFCC71D3BB29BDFF048DFF06A2FF0E7BD0000000 + 43848824BEFF21A6F30E72CB2EB3FF73F1F77CDEB13050523F6C680101020000 + 0000000000000000000000000000000000000000000000000052250C7B381100 + 0000271E1287B3997CCAC467C9D968EDFF33A9DB3797C057D2F242D8FF70D2E4 + 46ADF467AABD2FA1FF56C2DC38695309110E00000000000026302C668677709F + 8C5CC3E950C1ED51BCF983CEBB70CCB768BEC075D0DB90D6B398E3BB85D5C775 + C6C0A9C6A1CCB879D27337FF5E1C2807002A06002C1F18030507000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000F0D0B762007F36B2CDC9F5CDB894DB9B987ADDCAF1119177BB5 + A67DD6C8BAAD7F99B89EAE662BE1501AF15C20EA8642A56637886D4AC0A26DD4 + 5E268ACDC261B89C64B4948DFBD950C7EE1AA0FF0D92FB1CAEFF172A391C2D16 + 50C3D530C1FF2DB0FF1981DF3CABEB57CDF170CB9D213A352030300508070000 + 000000000000000000000000000000000000000000000000001203000E010000 + 0000DF9E5696B6927FB6B56CE1F356DFFE3AA2BE247EB94ED1FF45D0FA62DAF9 + 55B8EA53AEE42579C532ABFF6DDAD24D8D74000000000000000000120D03A3AC + 7E62BEE049B0EB55BCEE83BEC594C8AD70B1A36FB6A990CCAFB3C08CA7A58170 + BFB474C1B68FB297AFAC7ECBA467EA6427C94214C03B115419081E120C0C0B0D + 120606280C080000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000007F3016D33B0DDE551FD1410CC89D6C8BBDAC80C1B3000104A4C6 + A06FCCC9C9A573CFA56A9A4923982F10C43C10682007A25427AF996ED16D31DB + 5D26927764549D9B6BBB9E88FAE331B7FF188AE71597FF44CAFF1E2C18001631 + 1894EB46D0FF43C2FF2684C33691BE40BAFF87FDDC89F5D57FD6CA0609080000 + 0000000000000000000000000000000000000000000000000009010000000078 + 1200C48F4C9DB9A27ED7E04BDEFF60DFF72681AF2E7A9B4FD4FF4ECFF55CC8DC + 7AD2CF74BED35D75902295EB63CAC75FB08A1E3433000000000000000000D2A9 + 5C8CC0BF219EFF60AFCE64BEEC9FC7AA99D1AC7EB8A679A08AACB78CBE9D67B0 + A37DA3C09893BA9AA2AA8192825FD08A4BE3783FD74D19AD2D08563323372C2C + 472C2B6226210000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000151D1F5D2C1A5E1C09AE2F08DC88478CC5AE73BDB276A18B762100B3C9 + A07DC9C3D39963D66125C643140000000D0200010000E78541C66C32DA6E3795 + 8F6B828E7F81EAC683FCE648CDFF2393F326A4FC41BDFF468989253E1D00204D + 25B0FF41D0FF55CEFA44B5EC2A6A7A56B4BB68DBE774E7DB7FE9CA5EA49E455D + 52000000000000000000000000010000000000020100000000470F02DF561FF3 + A35DC5C58D7DD6E151C9F25DD7F047C4FF2475A63E9BAF5FDCFA41C0FF45B0DE + 7ED6BB8FD6CC7C9F9E0E619A50C5EE7FEAC355918A457373101B190000006B29 + 0A182B283696C740A1EFACAC8A79B4CD98D2B4ADCC9E829F84789B89C69863D9 + 4911B5451BDD8747CC9F62BC9E6F8A8B65865633C79056D85821B23C149F3211 + 5D32241C1A1D230A090000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000001002001E0904 + 3623213F2D2C862508E64D18EF8642AFAF8386B29EC5B984371D09867051C5DD + A0A3BC97E0B06CCD3F11761B030000000000009D2304EE863FD1AD7AA1A59191 + F2E08AFFEA85FFEE5EE0FE60B6A928A7FC4AD6FF70E8D81F341E0000091691F7 + 0F93FF34BCFF68DCE15AC6D33BBFFF28555969BE927FE5BF7FE1CB89E9DF6599 + 8F333629000000000000000000000000000000000000000000000000652407D0 + A25E75B4A96AA7A169C8D85CC9F927A3F92E93C167DBE77BDEE040C6FE58B2D9 + 63C3C78BDCC1AECFADB47E5557A2AC62CBC083EFC4539187060A0A0000000000 + 00000000478A7B3DB9F87490AF9989768DAFA7CEC488A5CEA791AE92A79E6FC8 + 9959E35519A42000C43C0EEF6523E67D3DBC5824881E01B73E13C33D12A43712 + 8C341867362346313474271C6D19060801000000000701010000000000000200 + 004E1A2439152000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000001807055D3432 + 833821B84119DC521CD87F46B79964AAA170BDB38BAD4E173F372966BEB9DB9D + 69B4A776D4965CFB60222A0F07000000100A07A32A08C54F1DBD865E8AB4A28A + F2D985FCD860CBCF4CA8B545AFE651D8FF54DFFF6EDAC708090212292E1D95F0 + 1C96F855DBFF50C4EE78DEBB58C2DB6DDDD9101D1015232622393D4365620000 + 00000000000000000000000000000000000000000000000000280900874F2695 + A88491BAA180C9CB72BEE132B1FE1F9CF34BBFDF64C9DB60D9F862BAE554BEF3 + 63B1B181DCAB70CBC9417B852C81A46BDCDB6EC8AA4173671421210000000000 + 0005090823412F71CEA248BFE6469ABF6B7682BCA888C1CF957CAA98938063CC + 6B35CF6D3483300F5015077C2006BB360CE75A207E270D00000040160837221B + 282220271A1D65241C3F11082A09010000000F02018C1A0F0000002106008B1C + 0DD52D1C3F0C0900000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000010000160D0D + 49291D9A3210BB4719B37243BE8E58D0A56FD4844F7110006B7D6387AE9BD68D + 5EDC8B4DC8753FF55418A038190D12142B160CA72F0CBB4214AC330E483A3324 + 3D4275D7B654B8C35CCDD969DBDE61E8FE40CAFF50B4CA090A03264F522BB0FF + 1B92F4149CFF5AC3E283E7B874E0D069D2C866BB960305070000000000000000 + 000000000000000000000000000000000000000000006E1B05D5511CEDA35BD1 + A164CFA0618BA1A764ABD407A9FF219FF066C1CB51C6E84ACEFF79B0C160BEF0 + 52ADEC6EC3B973E2CF55B3AB55A7985CBBC37CDDBC6CB8B05A8E8C0307080000 + 000000000000003E6E5B81F4D14FC0D85AA3A79E6350B79B8071E4D176D2C893 + AD9AAC9D7EBA3D0A7F2608030607422721C63A0F973819030302000000000000 + 1F0C0D0400002C0900000000000000040000841F0EA22B18450D037F1F0C972C + 19A2231031080600000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000104912507D16830CE6C37D9713EC480585B8F89350B00A6996A7EC1B0D48D + 57DE5118EA682A2A0800120705000102201A1683351A942302641B075155516A + BDAA73E3CD76E6E372E0CD77F4F13CC1FF2EB8FF053C6A00000048867343BBF8 + 1185EF189CFC5DCFFB6DBEA168BEAB6BD6C383EAC5233D3F0000000000000000 + 0001010100000000000000000000000000000022110ACA340AD23E10EE5A1EC5 + 29005786CE1E95F81CA3FC0795FF17A4F66BB3B14CC1ED50D4FF78A5C799B19E + 94A2818EB5A073E4C663D5DB224D5A63BF9D67C9B778D1BF5F989385906F0000 + 0003000000000058979685F4CC74DABA5BC8C97F7A59648C6E7AF1CE78E1C970 + CEC172BFB680A796B59C6AA6390DCE4C1DA04320582E22221416130D0811191B + 533530210F0F00000015080851231F7118028E2D1F59312B4E22205B342D702D + 25CA2B147F181103000100000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000001D1613 + 8D3517D44917BA4116C53A0CB076527EAD9F67826C4B0B00D9935B9FB28DCD92 + 54A42907EA491542221300000009040730272B7B230B54402D8CB29470B0A87E + E8CB8AF5D37FDDC47DE5C56BE7FA1896FF119DFF08294C00000085FCCA43B9FA + 257DB827A0F374DED168AFA378CEBD6CC5AA7BE6CB6AB3AC1623220000000000 + 000000000000000000000000000000000000000000000000000D00006E170013 + 87E1029EFF0D9BF90C85E90B9EFD61B3E676B5B243BAE652CEFF94A1B25E9FD5 + 86AFB39FC4A772D2B36ED4D735727558958264D3DD6ABEA776CFC076C8C0989B + 721408000000000B121301000181DFCD73D4B965E6E6448DA33E695F59ADBF77 + DBD585CDB7AAC498B9AE7BC8C990C9C089B579469C5333DF4715A62A087C3218 + D241133F1F1271311A793E2A4A2D2A3F282A703D2F87351B82361D7735269D26 + 0E51100400000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000016030029110F62352C + 9935148A3319632C1DC76632978C67A3C19D81592B5E1903E78141B4A472E386 + 498F3017AB330F6D34220000000B0507452A236C361F899B7B84DBCE7BDDCB84 + E8DA77B4AB80DCC55DCFEC61D2FC1691FD2C9CE20C1D272B483D79E8C252C7EC + 2986C430A3EE6CE1E27BD6B378CEC467B7A480E5CB5A97910E16150000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000032E600B77DF0D95FE16ACFF86B0B477B4A842B6F05AC8EC7FB3D54484D5 + 868496AC5D3774DBCC71CEBA6FD0B2304F4561C5DC75CEB863AFA765988D0000 + 00000000000000000000070D0D548C8C70C5B771D0B671D4D45EB4983F6A5B42 + 7C6884E2C771D3C86ECCCB7DC1B591B797C3AC74DC7336DD521AC54717F27234 + D0642ED6511CC13F147A321D5C2A209C3D21AF491FA73B17904026582F2C3F12 + 0B2B080100000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000005E1604522E2E4E332A + 5E332643282597361BD78B50A4A982E1A561560E00320A02E3662BBF7C4AED81 + 3F8B32194E2E264E3A370000000000003112109F7750A3DABC7EC5B880CEC18D + B5997AAD9686F1D651CCF73A9EE626B1FF3E7B8400000000000081E9B668DDDC + 36A3E12FA6F76CE2DF88E4C284D3C92036377DDDCA7ABCB227332B0000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000A72CB0F9BFF0F98FF03ABFF70A7C38FAF9840ABED67C4E175BFE95C8ACB + 75566F92927C71BAB179DAC374D5BF0B131275DCC37BCDB875BCAF68ACA84954 + 45000000000000000000000000283E3B7DCFC46ABEAE75C4B877D8BF6BC3B746 + 6E69445F5266A19A82C0B49CE1BBBAC18DC0A77AAF9D78BDA575BF9764C99358 + CC874CDC571EA22C0BA6431FCD592ACF5420B45729A33B1A6F362666302B460D + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000002A0700732113542925261010 + 3223268C2A14E56227D08D4FCC8A50E0561E000001722F19DC4814D68446C462 + 38C84A1D481F18482425000000310A00C45422EBAE67969163464732B3D1A8A1 + C3A58FF7D372EFED3FA4D12CA6F560D1E962BCA30405030201057DDCC15DE1F4 + 52C5CF44ABD46DDDE194EBC64F7E7600000078C9C174BDB69EB18C15130B0000 + 000000000000000000000000000000000000000000000000000000000000001C + 69B00EA1FF0E8CF80F9AFB0B94FC9F8C8EA2A88632B4F457C0F4A8A39265A0EB + 26A0FF8A8D6D81C3B370D2CF6DD1DA00010C6BDDDA71D3B789B0918CB09596B9 + 997E5E32090100000000000000444F41596C5C59948B72BBB483CAB468CAC56D + C9D463AE8E325E5B2F16083856468ADFD07DC2B770C0B781BEB7A2CCAAD09F67 + D2895AD06B3BBF9662CA975FC17A43CD6D39CE511E7F341D52302F1809091303 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000004D0F05891C014E1104502B2B + 6C3020C94214BF7342BB6231E3622B9A2807000000220A0290280CE75D23B84B + 1BC4542362352F8624100900003C0C019F29050D0000D5934F768B73B5BE958E + F7D572F4ED55B8C953BCD467D9E76FC8980000000000005D989176F2F555DDFF + 4AC5F5559B7B65D8E080EED181CFC31D29264962577AA898101A190000000000 + 000000000000000000000000000000000000000000000000000000000F17141D + 88DE1276DC18A4FF0DA0FE487DCCAC8883A0AB8064B3DB43B6FF83B7C5B57A6F + 7C7FB482CBF181D5C070C3B06ECBCE2338304F9DAC55CAE75EC8DAB0BD924534 + 169D622F1F0A0100000000000000000000000021241F8FBA9E86A58D6DB9AE74 + BFB298D7B092D6B46DC0B8808E6D040000637767948F66AA8349C15D23B48D65 + 84A08E78B1A19FA47AD0A36AE5783DC8380B7C30182A1B170000000000000000 + 000000000400000000000000000000000A010101000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000060001000000450D076914097117013C262B69392A + A9441FC74C1BB25A2AD45621B1350D541D0B000000100E0D562F23C44419AA56 + 2DAA340F933D23733930C8360DF46020D76D2DA28A57A5E8CE8FE3D087EDD78C + FFE947A3BC54B8C559CAE68AFFDC5DA2940000000F0E02439AC843C7FF62DFF4 + 5ED1F5274A3F65E1F27BE9D286EFD975A99C000000A7A6744E48320000000000 + 00000000000000000000000000000000000000000000000000000000365F4C41 + 809816A3FF0DA3FF1386E94984CAAB7358B5956770AECC25A9FF809EC6AA9894 + EB6C2E94805865B1AB7AC5B487D7B75FA88B263C3A59BFE547BAF05FC3DBA5B5 + 92703A1463270B2307010701000000000000000000008A794999916381BFAF6E + B1A38DAC938DC4A66BBCB173BBB99E8D5C44342035393234352C311C0C3A1307 + 31403C5D63478C582B872D087E1C02420B0003090B1B0B0D010404150F0D0408 + 09220F0F3D150F1806022D0A01330903941D0F0E020200000000000000000000 + 040A000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000040307891A157018096F1E0E952D1B7A2D206B3427A6421F + 8841239F3512B8582BB43E18512417000000000000140A0D5533308E3315A348 + 268E33147C301AE75824C98D5ED1C58ED5C992BADAB185E1D580F0F080F1E641 + 78665AB5B868E8EE82EECC6AC0A564A9A70000000F2D420484F452C4F962DCF4 + 68D2CF6AC29854B1C379E0DD7ED9C75898944645302618083624110000000000 + 000000000000000000000000000000000000000000000F1B144F97814FAEBD2E + AFFC0EA2FF0E8EFF0D95FF00B0FFA35B58C96F4480AAB745ACF8308FEB8880A7 + B1605BA1370B73AFA790BFA882D2B377CDBB03000081C9C453BCE646A8D65EBE + EAA9BDA6E29750D8450F360B010000000000000000000F0000B06C38B3BF9062 + 8C8099AF8AB8996481B6A467A8A4A3CBA7BDC08A80AD9D6BB5AB9BAB818D663A + 933F1464140025000029160A312B156A3F1A882B089C2E0984260B9330134629 + 1F51302A5A2C254225257E1F0D8B23119E240D5912036D160B6E15103D182860 + 2335000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000001370807EA3116912C185A312C6634287D381E812A0F + 64210DCB42147C351C8232193F2827020101000000210A06210B07432D276B34 + 299B38172E1A19BA360BFFBC6DADDFBB89DFD289ECD798FED751968553967C58 + B0BB67EEFF69DFE886E6D2142523070C0D0000002E76A323AAFF58BFEB5DCAEB + 6ED9C86DCBBE39695980F5CF86E1CD85C0B2A39F6F1D0B000000000000000000 + 0000000000000000000000000000000000000000000013231984FEE248D0FF1A + B4FF0B7AED0B7DE90FA4FF0AA0FFB53E26AC513684ABBC768DC00FA5FF2B98FF + 3F7BCCBD996AA4A373A2A87F6DC4B775C8BF0000006FB0907CC8C863C0E03B95 + C864A8D1A5A4869D946500000000000000000000000000000096471DD07E3C3D + 2713B2BA85D38E4EDD8B4C93BB9D7E9978AAAF83C4986AAE8C7166B0A58CA487 + CC985FE35F22BA5B338189777AA690AFB286C89F66D88246D97039C85C2BBE45 + 19AA431D733623642D23682E23532A2457271E872511AF240EA21E13BC261DC4 + 2A1B000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000010000007619086F1A08421F1F291A1E75341F + 9352328E371B3C2F33281B190700000100000000000000000000004E1F1A5F28 + 22613B2F632D26000000931D00B3814891A88875B3A8355D616DBCB681EACA7D + EBE850D3FF73D7DF659C9406080801010050957B4DCFFF2C8EE748B8FF7ADDDA + 74D7BF67D7F51F322775D2B87FEBCC81E2D49DCFB9F9C87FDC60251302000000 + 0000000000000000000000000000000000000000000000000000000011150A0F + 2E480E95FF149FFF17ABFF0DB5FF70241CB25F517E98BFA1626107B0FF2F9DC9 + 6D6572B4B895D37B3792B7A269BFB975B5AA32392B69B299A4CA9772B7CE78BB + D059A3C62C9EFD51BABA437C5B0A10100305050000000802006118041A000000 + 0000C6591FB3622FA82F04D19558A0A683B18950CE8345BF7241B3A879AFA878 + 939373AF9B71C8935EB578548C7A6080765C8E6145C08551B46235B140149530 + 0F844021A2401C872B0E5C4335823822792A1979281B9227179A28128E271299 + 210F000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000002116178C381997361C + 6D311F59332C441B19170809000000000000000000000000000000360B019026 + 11522F2D5C28248F290B42452C789A836BB1AB89DBB388DCD172D5D58BDFC761 + CFFE46C4FF85D6E2373C2D00000014384556A28945C4FD569BC378D7ED79D4C0 + 72CAB378D6D761B79A385A5C7DD6CB72CCBF7CD5CA95BCA16A502C0000000000 + 00000000000000000000000000000000000000000000000000070A0326505818 + 9AFF20A0FF2299F922B1FF1392F79B3C30BF4F2B8A80967C6389068EF217B3FF + 717F91C18348C6B57A83B9A46FBCC098AA8700000071B3A891B7978FB79EAAA2 + 8D91AEA8908E8E60B4C671DEBD72CCB316252400000000000000000000000000 + 0000060000C13A0F9B2F0CCB4A15CB9258AC7A4ABB8755CE4513B13308BF642E + D08650B16939AF6335CF5A24C84B1BA9350EAA4920B3421BB8451ABC491EB24F + 24A63916613223552E22411F196F27156C2A16573029562A246725198625129A + 2411000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000130300551E175B3027703523662A20 + 522D265D2E2B601301000000000000000000000000000000000000000000AE24 + 0D8F2B15A43618E25E2BB5CEA57DD8CC8BDAC7A7D5AF82CEB987DAC27DD5E36B + C6EB28A0FA5471772A221100000065CFCE73ECDD5AAECC8CB9BA80DCD67BDDBA + 6EB8B181D9C276D4B23256553248448FBDA489CCB99CC8A7C6BC80AB57255915 + 030000000000000000000000000000010000010000000000001A2E2351B6D31F + 9DFF4BB7E52CA7F81494F82E78C4783A3A6F382C7F80A6498FE00D72DC4780C5 + 958899D7A966A0DDB27A9B8585CBB8BCB37600000064A29A63B5AC80B3A1B68D + 5B99BBA8A59A8A8B666955DCE96FC8A14B817A0C111000000002020200000000 + 00000000002D0A012808019A2203F16E2D963A13934D25D96429AF340E8B2E12 + AE3913D95E27B95C309448229F542CA2431D5228203C272A5B1D137929157D2B + 1766352B763E2987352172331D3C26234A1C1545180F5E190BA1250FA0200FB8 + 2419000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000070150D96200B6E2C1E4D2D29812B1D71271B + 24121280200C8C1D070000000000000000000000000000001B12130C202A9226 + 0CE54E16E87E44C05B3C8AD7BDADC69FD9995AADBA967CAE9A9FEDCA87CACD73 + B5E140B8FA375E430000000000005DDFF66EEDEA3F99BA48A0D688F3C471C2AE + 80B6A88ACFB872D4B869B0A70C1818634321948250E3934AF38742EF5F1FA629 + 0800000000000000000000000000000000000000000009100D68BF9B54C2E249 + B4EF6ED8C613A4FF0B84ED1298FD0C376C621D097E6682349CFF0F89ED89484B + C7797597B5CB7AE5D8A7DCACB5BC8A82C4A70000007D9D8267AB9F6BB2AFB6B1 + 7BC8935B939B94C15A3170787E63D1CE7CDCC472C0B864918801000000000000 + 00000000000000000000006A1E0AE548135F1502190400B7350DD04716661E08 + 211712B0310CC94819C5511E832A0CC03F15B13B1376301C4F2F2A4F2D2C7421 + 11601E13622A244D2F307B2B1B53302C7C28183208010000001303010E010024 + 101B000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000A1210E8A281259261F71291D961E0593220B + 2F080000000000000000000000000000000000000001000128211DA63A17E54A + 15E28044C18E58D3895FF18A45EB5310DA9D5CA4B185A9F6CCB7C5AA7096B24E + CAFA5AA4860000000000004B7E7E6EE5F562D9EE469BA95ECECD84EECC86BBA7 + 99A7818BBFAC6BC5B874BEB12937310000000000000000003D07000000000000 + 0000000000000000000000000000000000000000000014231D83F5C8457F6272 + C48831BAFF098FFD0E90FE0A97FF1B6EBC5829206C5E7738A8EE14A1FF0B96FF + 227FBFA1C399B5C28DC6B179A1A78075C9C40400009985557EB3A971A08DABA9 + 80BE875084BE9F8BA0957B492D60CAB569D0BD76D5B72F5252090C0B02020200 + 000000000000000000000018201E7E290F070F0D0000003F14086A2009853014 + 422D27181E1C71311BA538177B3017311409722B1474301B662D1A3C2B2B2711 + 10320801831B075D1606AB260C892715742919C42B1215020200000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000040A16641515C22712822413682419B0280F7B180B661408 + 04000100000032090700000000000000000000000141242666372C9C3815AB3B + 14922B0AE15F24F1591DB03006B9582DC4AF8184DCCB92E6C6A991765CD0DB74 + EBD65DA48C00000042584C73B9AF6AE1F05DD5E63C9AC363D1DA89E5C1A7B891 + AF9C6391B6A167B9AB7EC7BA727F650906020000000000000000000000000001 + 01000000000000000000000000000000000000000000203834386653539A7860 + C7D426AFFF0E87F00D93F720A4FF0000003439482F76BD4AC4F72AA3FF41B4F2 + 837C99DA9151DE4B10C095668C978683B6A5000000663914A3B799769077868E + 6FCBA56EC2906084C9AD5B9A9D3A79775FBCC677D3BF74BCB77AAB9E494B360A + 00000900000000000000000F0E0F0B100F0000000000000000000A0E0E352722 + 3B2B291408094129277836216B35240C08090006082E22224F2A26612B22602A + 22812310831B0A08000178170ABB2611912613BC28115E131300000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000003E1B2FB02622AE260E6D190B751A09CC2912511011020000 + 000000000000B925126C19090900005A180E3C0B000F090C0B0E10422D240000 + 00270600C63409E76228B4854BA7A68B87DCCD7CF6F469BFAB6CACB879EED57E + E2C115262302000029342B65B4B35FDAFA4DC2F74DBFE47BE9C885D0BFB3804F + B4814491C6AF66A99E81BAA9948D5D0D0A030000000000000000010000000001 + 0100000000000000000000000000000000000000000056939241735E67C5B04A + C9FF1C97FA1080E516B0FF4AC0F60000001F426B1C8CE720ABFF2CB0F77F9C8E + AC7D77C48E6CB4703FA2A7826BB3AB94B8961000008E421DBABA8095B0908D75 + 4CA2A783C78755AE8B6A70A48A455F4C45877676DDB973C0B174AB9F8E9E7A92 + 7D529B4E21000000000001000000000000000000000000000000000000060406 + 0A080A090506721F0E57312C52332E160B0B000000030000230A06350F08721A + 09761C0A7A1A0A83190F000004A72627971D11C5250F86202400050D00000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000003F0E13B62414C12516390A085B1111DA2B21000000000000 + 0000000000009B240E7D362A4426236E372D552928452A250F0907922F12A625 + 03BF3E12AD7145A2B28F9CDBC28DE7CF88F8D458A4A072DBBC74E8DC88F2D832 + 555200000000000029443F65C1CB65D8F258CCE547C4F96AE7E081D2C5615042 + A35722B2C2955E989289C0AAD595551007000000000000000000000000000000 + 00000000000000000000000000000000192824233A3E96FFE687FFE551CEFA23 + B2FF155D9F1A9DFF22AFFF52D3FF0D11000632661094FF068BFF1FA4F1987349 + 89A18C9B7160CBC3818CAA8E83B49CC1A05D0000003E483EB4B081B7986A9A83 + 54764F2CBAAA75C0895EB58964698281384F5469BAA860C1C56CB7AA74BBB0A9 + BB94341A05000000000000000000000000000000000000000000000000000000 + 0000000000000D0200221111762F242C0A040000000000000000000000001002 + 012407030300001404020000000D0306020000892A3B6D283C00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000510205D2E4B8F2D421C0404000000000000121327000000000000 + 000000000000851B0979291BA34224D74A18B449229A3C1FFF5113F37531FEAC + 63F49C58E2A96DB2DDB587E3D473CECF5C9B916CC9C783EDD177CBBC74C3B823 + 2C2800000036311E95AA8880BFBC5DE6FF43C4FB38B4FF6EDBE580E0CDBEAD87 + F19D53ACBD92638473A7BC92BD985DA53B110000000000000000000000000000 + 000000000000000000000000001A23206AACA992FFEA86FCD66AD8CE4FB5D61C + 415539B5FF31B0FF4ACFFF0C82F30000001644661CAEFF0F79E1207EE4559BB5 + 9AB688D36C34BDDCA498C4A5B0A373D16D2C0000004E7E738B9985D2763FAB88 + 5A815F44983C10BF8761B88C649D7D627077602A1D1E6DC9D274C3B56EB0A366 + 9A925A55362F0E02020000000000000000000000000000000000000000000000 + 000000010101000000370D026817040100000000000000000000000000000000 + 0000000000000000000000000000000000000000000010254800000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000070D1A191C34151A34000000000000000001000000000000000000 + 0000000000000000003215116F392BC84D20F37C3DDE854BCD7745E18A56C7BF + 8BA9DDBD87D9CD8CC8AE71B0976AB3AC7AD6C56FD3D486D9C973A59717201D00 + 00000600007A4F26A9AE8368D6F448DDFF43B7F741C2F871EFFB77C0B7B3835D + EA8942A15A2581967AB0A278DE702C0D06020000000000000000000000000000 + 00000000000000000000000000000000111D1B35575B43796649825C3B7F872A + A6FF4EBDE749BEEE43C8F913A3FF020E153A57584286C73569AA495579727A96 + CE9468D28C5492CCABB5BF92D87036070000040E0E86C0A876978AC17B4ECA55 + 1CC27641AD773C87AC9568827873B8A972C8AD4478723D695885D1B38CBA9F9D + 9F76BAB177D2793A792408000000000000000000000000000000000000000000 + 0000000000000000000E03011003010000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000001000000000000000000 + 000000000000000000020102120C0E562514E75D25F59451D8D196ACCFB08AA1 + 8B8C5D39527C728EA37D60B1C96FDAE593D4B579C9BA9CC9AF604B2B00000000 + 0000AC3B0DE3B36A77C7DD46C7FF57E0FF3B9ACF3DAEDF66EBFF9CC3ABC68C5D + 87300A000000CE9F59BE9F67D34C171403000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000052967C4CB8DE5E + CBDB65CFCB50D0FA36B1F40D99FF0005152125196C5F504A5979A24329BB6E61 + AFB09CA7CA9EAF986ED27742C3411408000069391D8BB091798375AB9365C036 + 09B84C1DD16B2F9D411C6DAB9F83BEAF77CBB674C7BD04070978CAB278C3B088 + A98FD08649AD5621842B0D3E0D02000000070807000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 3D0B020400000000030F141D2A0B03000000670D004809004718073A1409C892 + 588BAA8F81B8A0B1D7AF55CBFF9ACBBEAAC6A0647E69D8BF82521A0100000000 + 0000454F3C56BBEC42ADF545CFFF81E7EB3CAEDD42AADB4CE0FFA5C9B1DB9449 + 371E0C000000E25C20D2934EE95B201D05000000000000000000000000000000 + 000101010000000000000000000000000000000000002A4A427AE4C263CCCC86 + F2CC6FD7B925A6FF26A0FC139DFF152933050900529E8E34ABFC597D9A726470 + 78C1D2B1D7A9C6A974A96B4E996A4E0000006B3715A7B0827FA68AADAE7CB92D + 03982B0BC54F1CAD2300A6986798A57C7CBDA865C8D65E694C23403F71C5BA5F + ABA79AB395BEA567D76123E24712B0360E611C09000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0B0C000000000000000000000000000000000000400F13931D1B320902951F09 + 752819672E2A763D2BB64018E8541DFF803BDFC3819EC8AABB9C7AEF9957A2C9 + A691BCA5BDBE967CC6E985C9D9D59A58DC934A1007010000000300000000006F + C8A56FE9E26FB0CE87C2D280C8E169E1FD35A5D2439AC264E0FF64CBE5C8B281 + F7611E200700AF310BCF531DA3360F9225070000000000000000000000000000 + 000000000000000000000000000000000000002D4C4F88F3DA6ED8C07DE7C759 + 978367DEF10F93FF0E8DFC1B9BFF2E697F1C2F1F69D4C93ABBF872A9BCB86B55 + B57558A5948D9CC8A58EEBD276DDD4437470CF7032B88957729581BD9A648B3C + 1A5E210FA8320CB53A1093431AA49E7475B8AC88C8AE71AF8F1521206E7F6576 + C0BE6592818BA689ABAD7CC785489926050A0402000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000006 + 597700122000000000000000000011101F330E1274160DBB2A15A82B157E2D1D + 74382883432BB6441BD15B27E56B31E08B50B17D50C26940D88952C1AE78C49F + 6FD4A067C0AE9174ADD3D1AF85C949117B2608070000000000131E1D487C7678 + E3B66CAEC9A7A293AEBEA188C5CE42DBFF479CBE3DA5D08DE6E763C9EA8FBFB9 + B26731651904411204DB3D0E3A10030000000000000000000000000000000000 + 00000000000000000000000000000000000000426D6B7CDDC574D3B47BDAC477 + CDAA50C0EA1E8EE90D83E747BFFF16231100000021386C597F909B887F967666 + 89594B86644D74957E7DECD084E8D78BDED2CC6C37BF8F59877D58B5965EC741 + 13592819842A0E9E2B08AC4219D0AC6E85B0958DB498A4C79A407E7D5E391795 + BA93A4C09899A07697875E7F4D2A330D01000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000001D + 3D6B454A7C030C1A061E36000000251F38B52D33CF29119D291278302264332C + 6830228A3D22AD431DAB441FA646267B3B29A93A15D75923D77334E19258C594 + 66BDA982AE9B9373D2DCF66624580E0000000000000000000034565085ECCC6C + EFE6817378A9A38DB9B49563CEF14BD0FF4892B5309AC68FD3DC9FBDB4C9A26A + 8F4A230000001408037D1F064B19090000000000000000000000000000000000 + 000000000000000000000000000000003C524971BCB56FC6B64C857C7CD4C67B + E7C849BAF12C99E52C9FF44CBAE957956B5D0C00513D4E6B6C75757F8A63857B + 6096A25798AD526B57315955294543203631C22D00C56F3B906437A97F56D957 + 1E742F2037251D6C230CAC3F1A896442989C77C3995F82BEAE6CACA02B261C4D + 786DA8B48BBD9A67BB7948CD8E50C659247E21061A0600000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000020332D + 518ECA32338D2A3797354A2943780000002B121F5619228E1C0C5814075E1505 + 5F291F7436266138324925232F20227E2F18C6380CDB6528D67641B7896885AD + 9AA47B6284C0B873EFCF8A11003D15090000000000005E73646BB4AC7EE8D549 + B4D469B9AEA7D0AFA1D2CB49B8F675DEFF5B818D2C84B255D6FF88C2D2CE7B58 + FC762E8E2A0B00000022120B25150C0000000000000000000000000000000000 + 0000000000000000000000000000000034514B7ACEC53C625D13202182DCC086 + F2CA37B1F31D72AD42BCF057C2C36E230B6A29233C548437517D638DA26CBAAB + 75CEAE64D8DD6ED3B7345A53000000000000A32705CC632E904B22B27F4BCA4D + 1B842713130A070D1115593123513428BB8F58D65C1B79C0B473AFA2857C523A + 50447BB9ADA98361C27442C0360BD65A21C4401386260925221E000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 2C56B63641BA2C0FC82C12B43033DA2C21581007661507C027160000003F0D05 + 852D208D2E1E631A0A6A22148D3723933E22B7885291B69B988C7672BAA65D8F + 8378DEC287FCE21D332E000000000000130000BAAE7687C9BA82E4D276DEC15C + 9889D77946D7AA708C9D985CBAEF97DCE34C7D8F366B986CD1F158CEFFC59A76 + C0340EB22D090003070000000000000000000000000000000000000000000000 + 000000000000000000000000000B0802586C5B63796B5B888185E6D782ECCC5B + CEE93C8FB840ABC35CDEEC79DAAD8302007317003582BE53507A5BA6DD54CBF0 + 78D2B883E2C473DEC683ECD6355B591014149B2D0CD05925A2643E963915D065 + 2F9A3210472F28200E132C1F29773624DF5E1FE95D1C8BC2A883AC988A6F4700 + 00008DB69C66B3AA8AAF90AC5F2FA9290682210678240A502A1C000205000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000CA3231B12E188232229F311EB42712942E1A732D1E94321F7B2818892D21 + 9D301AAE3E208B2E13C3340BDF7034DDB175B7C9A293C5AC6A7B74638D7F79EA + E482E6D33F68671928260000000500002A1E0F5F867A79CFC374DAD25C958C90 + 7C66BAB88CABB79579A0BE6AB9F6A1BDBA4FA7C83092CF7DBADB6CC7E982BDDC + D88363A3340D4C2B231E0E0C0804050000000000000000000000000000000000 + 000000000000000000000000001F0B032B18061E2924345D5B86EFD06DE3DD60 + CAC93671784CCFFF5BE3FD68BCAC000000163A2C4AB3D33497F32D7FC850C9F3 + 77D3C26CB0A980E6D173D0B67BCFC4464F477A1900BD3D11C46B33441506BE5F + 34BA3B10833218221A1D2307026A2111AD2C07D6531AAAB38796B08BCCA1691D + 0000675C3E9CA983779F8AB6A472C5612B82270A421E112E2B251710150D0607 + 0100000901000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000001272D003D4700000000000000203300000000000000000000 + 000058181CBD2B17863320793A299338267D2E207337298E3D23883823763023 + A73718E46429E77A3CDB884FD8A570B7D7AA90C0A86AA8996C968F82E1CB85DC + CC95CFB934392D0000000000002E1104B97F46ADBB9385D8C46DC2AC5FB4A27F + D6BC81B4A59286788BA5C28B9AC28BB2C466B7D530ABE27B94C89FB5B99EA398 + D4874AF35D1FB840194328230502040000000000000000000000000000000000 + 0000000000000000000000000063402399926981B3A488E5D87FE8D45FCCE44A + 918254B9D45BD3F045CBFF73E9F41118150B130C4D9C9C42BCFB298CD449C9FB + 82EBCA5F90847CCFC574D1BF7ACBBE6D8F7A3D0E02952E0EBF5321872406A257 + 2AA04822692F1D33292818090B090300862005E96D2C979B78B09E6FBDA6784D + 6056150000D682429B9F7D96875EC47A40DC642DB8340B6827114D2A27422824 + 341A1851160A0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000000F + 1701809D025C6D004D5A0C669A00496E1C39643D407037396A681E2A7E1E2400 + 0004000000510F05A62F1B783728C85222CC5024A55436B65A35D97540DB733F + D07844CE7245E8B678D4C38B99C9AD7C987E7EA79494CFAF84D9C79ACFB489A6 + 8C16110B120B06000001BE3B10D86020CDA46797C2A971D2C767A99B60AEB384 + DFD089B09E799DD57694D5B8726755D2FF77B3BA4AA1D113ACFF8A77A3BB8B82 + C29669DC6A2C2B07000000000000000000000000000000000000000000000000 + 000000000000004E12017C4C1F818C698FCFBE83E1D37FE4C67DEFCE417E6960 + A9825DCAD467DFE94CC8FE1D95FF000000000000559B715CC9DD42ABDC42A7D7 + 76ECE085DCC092D3C264A39D61A8A38CCDBA9575486A2A15AF4C26903113671C + 06CB471788341C3B2B3060190F6E1E0AB73C15EB8540A56B3FC88A54A3927379 + B9AA150F03531400CA7D46B5A1719075489A633CD67237CB4B19B83B1279331D + 5F322E1B09050000000000000000000102020000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000000D + 0E0379910E699A274D885D417066446E6B436DB62E2FCD2C1BC32D1CBB2E14B8 + 2E15922D1B4E1E19110706441A1756281CB94618BB6E406A695A873B1EE15F26 + BD8A5390AF92923B1E6A2D17A3592EC0AE7982CFC0AFBD96A6C3A0DDA25C6C47 + 1F000000000000000000B63D12CBB27886C1A77CC7BB6BA3A148776889E2C976 + D0C6CA8247D73E098F57679480965CD1FF90B6AE8992AB0C99FF1EA1F28B546B + BD503AE65E20CC3F13452C220F090B0000000000000000000000000000000000 + 00000000210500C35119DFD89399D7C488DECC7DDBCB7AD7C6508B7C44849264 + D6EA71D5B559CAED33A8FA19A7FF0A0F0D03050661AF926FD8C74DBFD82F7D9B + 5ED2DB77EECEA4BF9A524D324B452E98BA9477694D632B1A9F2F0C9B633A3313 + 087B250C9C300D87331752312F723226B2360EA02200C47F46D7622AA9633F84 + AF9C66532C090000954D2DC38358C97038A03C158C2C0CA32C08551F0F261B1A + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00001618014C5B07517E464877993547C02715962B27A42B14862D1A7F311F72 + 3324743D2C934026B948219E3A133F22170A0C11230E0B5A17064E2B16815136 + 421C11B1350ACBA167ACC6A4C4B385ABC49AD8A166EA803CA27646EB66260000 + 00000000000000240400904B22B69C69AEB38CA4DCB069775979C7B7A5CFA87F + B39FB677467A698B5870ADA093A677BDDAA09D8C838AAD0FA2FF0E9DFF3287CF + 716266652615AF3A15753823592E290902020000000000000000000000000000 + 0000000000000000000098572773633E6D8A78486C662C48454176636AD2D273 + D6CC72CDB359CBF92899F527A3FF2E53450E161644796E77D9AA6CDAD63D9CB9 + 4CA4B276E6D491E2CB73AFA38F875A7F471D7A564278331C73250E8A4528A337 + 10140E0B572F245D2E1F522C243D2C2C2F1511A22A09D35F28B43A0FAC895E82 + B196B4723D0D000053594E947B64A96A4AC25929B86432A13F16351006070605 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000131C0118281B213A60314BB32618A52815A52C18932E1B7F + 2E1D733327933A22BE441FCE592B956D538A5842B64921E56F34CA8552A88E68 + C17C51DD8A51D99B60C56C3BDB7C3FE19C59E04712AF3E121806003D0C000000 + 000000002E0B02BB310AE96B29DA753AB0AF847ECDC23A3B297BCEC8B8B385CF + AC6F5B382D477EA95976AAA696A45BA9E6BA8B7094748913AAFF0C95FF0CABFF + 2ABEFF57ADAD5329224225235228265C18090000000000000000000000000000 + 00000000000000000000000000000000100B030000004A817C7EE5C67AD9C076 + CBB979D9BB70D8EE2592F130AAFF417A6C0000000D161A6CBCA971E3DB50CBE7 + 44827971D5B978EADF80DFCE85CDBB896E5068321D31110E502A217A301EAF37 + 0F39160C030A0F52251F50252470291C732618B9320FBC37128B3513C08C579C + A479CA6F3334020034493A779E8A817761C74715923312B43F16B0340C602D1A + 1812151003010000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000012236D4061C03136A4374BCA291F9D303CB2 + 3134BA2519B32813862B197E3F2C7A3923A04622C54D1FC94C1F934127AA4722 + CA6231EB662BA53D1DD64411CD4616FE5C1E69210D0E00000000000000000000 + 000000042F150F9E2300D84B11B1B69668C5DA5DAEC1B87C3E87D8C5C1A774EF + 53125566584FA5D87F80B6B089865AA2E6CA71438D6E861DA5F90A9FFF0D72CF + 1E56774D9A821B00000001030802021404010000000000000000000000000000 + 00000000000000000000000000000000090602547A7078D4CC74D8BC74BAA971 + BBB26AC2AB6FCCD862A7CC54C2EA569C70000000000000436D6C72EDF555D2F8 + 5BBECC203B3071DFF37EE0D685C8BA9EBF9EEA8634DD5E236F36294D231C9F33 + 0D4E2618000406120300060302380A00702213A13312902E13994320D27C41A7 + 8E63D15B215B10004E3518A1AB825E7265AE5F31802C0E4F2B23962E0C7C2F15 + 4A2F292510100000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000C111762983E4C8321518C033E731D3E74872936BC + 230BA32A136C2D236930225728218E3A227035296F2B205426257C3724B43E15 + B5411771311E512B208D2F13050000622A1A0000060000000000000000004A27 + 2889361CBA461CDE7748A8BDB567BDE6A8B6A0270E009CC6A8B9BA87CBB078B5 + A1715BE6FF4C7DB8A25E5C58AFFA838DB3C1522A4B77BA14ADFF29A7FD19A6FF + 0D3D660000000000000000000000000000000000000000000000000000000000 + 0000000002010000000000000000000035312470ADA374CFBB81C9B48AB19971 + B0A880E2BF4EC0DE34A6E44EBBE079DDB4233C3A00000070A7995BD8FF54CAF4 + 6FDBD185F2CA3359497ADEC086EED795D9C398E1C9A4A984A9683EC05025A730 + 0E4E30271410110000000000000501013123245C3023141A1EA94321B06D3FAD + 9469C9380C490F01020000C36B318B8B69B1925FC34E213C251F402C29642D1B + 512E254D29284B10010601000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000C0F05536E00263C01263A06233942335A8A354EB3 + 2925801E126A18088322118330228E29188E220F6A251A653329572C21532419 + 753A2D30191D312321070D11000000050A0F0803020000001E1E171E27234162 + 5F90A081AF987A9AAAA882A8C2BBB5987C421E6A836EA1AD93CF9862CF8C4FDF + 5A1F60535B775B7095718746ACFFA67970AA4C313A63A30BA1FB37B1F737B6FF + 51B7CF0B100C0000000000000000000000000000000000000000000000000000 + 000000000000000000000000003F2610A7A07283C5B460A69F83C5B475846797 + BD9B7BF3D24EB1C4419FC370E0D662B58E0205081D19104A63581CA4FF59C4F3 + 75D9D977E1C958A0AB4D847967B1A47ACFC394C9B1AFAA81CF905AC05C316228 + 16532B233917140500000000000200003A1A1726171C5F3224C24719BF5822BC + 7B4DAE6843370D03120302AB4015C07D489E784AC46432952C0E41221E3E2B2C + 301F1F42272969241A470F020000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000040400110F00000000000000000000070D0E162A2A + 0C13000004340805B42712D22E187B160ABD29139A261051180E0506093E1713 + 5B23191707050000000000000000000000000000000D0805627B6C7AC0B179E4 + D183BDA8A19385AD9984C39A769FA2862125239C936598B499DF773ACF531F78 + 38246A58586E78934B97DA72B0DB985E569D3A233F609A1388FA29B9FE5CBCC9 + 67CEC4284B3B0000000000000000000000000000000000000000000000000000 + 00000000000000000000000000473820B0B88882C5B165A198A0B891A68E598E + B49778E8D43F91A94898997AE9D362AE9C080D100000002C524C22A8FF4EB4F0 + 6ECBDF6FC7B973D1D468B9A8518E8957624E4E452FBA63308C2E1069281D4326 + 1E4E2C2741150D00000000000000000027090329171A7E3820BB5022BA5321B5 + 5B329D7C62474C42000000591301D75F26A6693BAD5B2DBF451A8E2C1059261F + 130708250D097822106818061704010000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000003B0F13C42B28752C450000001D0602180400040000000000400E03 + 621507000000000000000000000000440400DD803B9F996880BFB182F5E96186 + 85A76A4BAC916DB58056B0875E6DAC9F7F492CC88D52A6B58BDC5D24D2340888 + 7253549EC065CCCB3DA6FA857FA1734E5C6A3E37229BDA0F8FFF1AAFFF59C8DA + 7CE3B04176600000000000000000000000000000000000000000000000000000 + 00000000000000000000000000BB571DB5A67574AAA091AD8AB7B180A59A7478 + D4CC7CF1CD4E96873B8AA66FDFC878CEBD28414000000017251741B7FF5BA8D9 + 71CEE276C6B573C4B794DBBA87D7B86EAA9D23221D5505008F210B482C2B2F1D + 1D5527217623134E0F03000000210701722316593531B538129D330E933918A7 + 4E2B7B7A66778C6E1310054E1A0BC2360CC55A28814028A762359A3212482C28 + 3E23247120100300004E11061A05020000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000D11202C2F58000103000000000000000000000000000000000000 + 000001000000100603070000571100BB6E3196BFA284D8CA81E0CB5F6B5E6F75 + 608AAD97826852DC7D3D95B08EB8854C851B00D37640C09B6CC3502084694E6A + 9E837DF0C44DD7FF3B6FB27673A8572F293F51612AAEF814A4FF2296FD4CCEF8 + 72D6B828463D0000000000000000000000000000000000000000000000000000 + 00000000000000000000E0420FD98446A2B48982754D8E5320D19C618BC2B175 + DBC65BC7DC529B9670DAD378D7BA6CBBAE42676300000042785255C8E9369AE5 + 8BCCC789DABC75B4AB8FB79E78C7B971D0C89CB590A64819781E1155180D2F24 + 286324184A120500000058110AA92B145F302A6535275F2A178136179F48219F + 4018788C75B38F6052230A000003501708A1401CB8663B7A2A0EB53A10A33A17 + 6432212F272E63180A400C004E0E096A120C0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000882F14CD4112E05D24D6A3689BC9A981D0BE6D9C916E918966A2 + 9F757568C85327C38A56CC945A8A2C07503A2CB9956FD87037D464347D624F64 + 968367EBEF2EA6FC3D6AAB6079AF4C3A37304D8341BCFC22ACFF2895E734A9E7 + 7AF9F89EFFF327423F0B12120000000000000000000000000000000000000000 + 00000000000000000000862A0CCE7E40D587430000001E0D04CF824F8BB09F7F + E6CF57AEAC316A6C72E9D977CBBA508785000000000000457D6065DAD9629FBB + ACB39796F5C77AB2A2A8A678AFAC8575BBB082B6A7C8764DBC30082E07005D1F + 176421169820080E02000000005A130645150D1E1013361F1AA837146D301D93 + 3919856B52C0834C782C0D000000121413663F2DA56D4C97562F631B077D4123 + 8A391E552E276428208E2511AE2911951F0E310904460E0C1806090000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0A1010421408B04017D8894EC0AA7696BEA678CBBA7C8A738A8E7985B3A3817C + 69C25A2CC3501FC28554C84317521500688A6F9E876AD09364AEA883A48D6974 + 8F814EACE52C8BDA457FBA635D5E4C2A263E5E9C3FD5FF3FBDFF40BCFB2976A7 + 5BAE967DE4C462A8A3060B0A0000000000000000000000000000000000000000 + 00000000000000000000922B0BE1541B922809782B0CB8773A9FC4A280CBBB7E + E5C763B19656AEC262DEF075BDB467988F0300000000001B2D2E7DF0CC66AAB3 + 82AAA07AEBD38CB198B6AA72C77E42ADB9917EB29BB0B383DC82427A2307771C + 0A6A2011A7230E0B0201000000000000000000110A0D6D38267D2F1B3C2C2DA2 + 3212B47847BA6737A4330E0A01000000025449437D6753994D2C9B2C0A40190B + 862B0E812F14622D205B2B225F281E732010B1260E9E1F1526080B0000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000420C00551A10341819 + 422821AD2F0CDB4410E07237C5BE88BCA46DA839278A7E678380718D7158A244 + 22B95122B05022D18B5A5E0F00311706B095649A7D59B8704EB3BD9989CFB064 + 5B50687E8A39B0FF5A9CC35B806A56282E59619233ADF64FC2DC74E7D945B4EA + 2F5541070A0A0508090000000000000000000000000000000000000000000000 + 00000000000000000000B42E094D1303000000C96528B9D8AD82CBB96CD0D17B + DAD222393465CCDC55CFF96EC7D36566450000000000004C7E7D87F7CF5DC5CC + 52ADB06EE0CA82DFC7B8A57CCD4A11D49955A5B28A97A27EDA8C52CF44108E1D + 07831D0AB0230F78150E0000000000002A060059231D5D31255B2A225A251EBF + 3B10BE6839C9632D802005000000210A056B64536C7E6C7D543A9B2F0C5D3627 + 1611103625254D2D2A552A26692619A4260DBB251568130E0000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000001600005736347A3925 + 9C391AB34118CF864EAFB6906F9288757C589FA693AD7652A97A569B49268629 + 0B843519AE553098877034241D4B1401D6723AD992556A21118B250C73715547 + C9FE64EEFD70CCDE4E78A54E1920123C40418FF1148AF04ED0FF7EDEAC77EDDB + 5BA9970304030000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000007D320EAF9B637DB5A385C8B687DBD115 + 1C1C78D4B374D2CF4EB9E851C3FCAAB07E1403000000004067666ABCA97ADFCA + 5EB09257B3C381E8D189B3A3A36843C73705E78E4CBD874FB8A169DF5F24A123 + 0A8329151A0A08000000000000000000551204692B224D2A266B2218712310AE + 36109E5C2EBD44187D31160202010900009E5D307A715B8D583C592C1F783C25 + A03A183D13042D0E093509007717040400000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000A0100250A060E0C0D5A291BBC4317 + E16027DD8649CC9F6AA182566C411FB0AC7EB5B28AE17839C46D3B7A2B16A93A + 15924222895B3F96A584291504501607D6662EE17A3B863D2B6B706073837680 + E2C46BDEDC66B5DE515C98630E024FB1A729ADFF1AA2FF4EC3F782E3BF80F0CA + 84F0D31323200000000000000000000000000000000000000000000000000000 + 0000000000000025110B390E04A42504F06523DEA15DB8BC8E98D5B367AB8C3D + 615A7EDEC47FC9BF63BBDA34A6FF809D90572D0E00000000000076C5BE76CEC0 + 74DCC948836A82EFD47FD4C693B999CB7942F35E208328078F3A14E46B2ED339 + 10A42511330A070000000000001D06048D1F0B72271B631C0E8628176A2F20AC + 471F9D310DB04C2170331E130F12080000A44C20A46B42B77040672B21472823 + 6B2A1C832F14362C2B240C0A0000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 01010000000000000000000000000901006E1A0964292257332C85351CA43B17 + C15629BA9470A33D1468573BA08867BFAC7CEE7535BE3A10642D2073301C602B + 236D33228F5D43D69C5E541302491E11CB5421CA7946A673587D928171877A97 + B18E43CAFF2FB0FF5E659D6D030061CAA54AC0ED1995FB55D0F983E0C25DA692 + 7DDFC9609E980000000000000000010000000000000000000000000000000000 + 00000000000000772710EE571EDF6429DE894BB5AB857AC3B47CCEC02E4A4660 + 918A68C2BA89C9B77EBFCB59AAE43D9DB204100800000000000061847A79CEBF + 75D9D14A8D834C877F75DCDF7FD3C88CAF95CF3A093A0D02000000872508B335 + 0F9A2713270E0C0000000000003D0B06AB260F87200C280700842A1E723224A3 + 4922A02D098B361A41261D0F0C0E0A0000B23B11B86C38B4572B7C2B1C4A2721 + 58241C5D2B1D4E2D254E251F5413070300000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000230B118C2123941B1285180D841B066E1D0C552D2A712A1AA84F2A + 9D9C7A7F92727A2405B6A473CA8255D9894DD94A177222154A2B28592E275122 + 1F943B1EBD6033EA632903000013100FA1421FA2A085AA6F5270756D907B6796 + 9E8726BBFF2098FF78A0C018000056A1845AE0FF3AA8DE44BAFE8AF6CB558D8E + 6FBBB6355B560000000000000000000000000000000000000102010000000000 + 000F0E1431130A8D1F04DB6225BCA87096B28C79BCAC87C9BA4B665B5548297A + BDBF64B5B09ABA988ABEBB88A4AE50C1D839654C000000000000A0C7A676CEC3 + 73CBBA82E0BC428FA175C3AA91D6BDA9B689D0894AB0360B7013005D2714120C + 0A57392E2B2023000002000000510E08B62215A31F0E84210D652C2397351658 + 20118B4021602D1F3523280101010A01009B2908BF5826B54421A72F0B602113 + 67201475241847292551261F7F220F490E040000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000001804069E1F139F2C15952E1B752F2267372D9C3414E35A22DD8849 + D96B2F2F0000F16E31CA945DC94F1CC83E11B93513642A1F62291F7E2110862D + 14C04317CB612DBF3E131B0E0B250F0B8B5436BA63358D6F4F8A725B8FB79678 + A7C43AAAE85EE2F72B51360300006BF6FF50DDFF42A9D753C3D97FF6DD78D5BD + 48726F5C8279000000000000000000000000000000000000000000000000482D + 2F783823D64312F76727E49655CE9E6ACFA86EC9B37B7B53293C4F4177BEA09D + D7AE649790A8D6AA98BCACA0776763E2DF4F8E720000001E0A0187794B395451 + 85BDAE71CCC157B8CD4162547BD1BB79D3CBCAB27FE89E5BFF7B34A32E0B0000 + 000000000000000C0200000001240B10000002781905612A23713B2A45322C93 + 3013764027572A20481D180600000003055D2615B74E248E3814B9491C672B1A + 6D2011901C0677231448221E5E2319A2230D911C100000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000003D0B037B1E0D4F2F2A6F3422903619AE552CB8572B9F3613 + 501D0E7C3B25DE7A41BA5B2F9034179C2C18912614631E117F1D0987271A6C39 + 28A9491EBA461A8F33175F3216CA733E85674D8F574091CAB990A48D7C6356B3 + 331D8A889C81CABB2A4E39000E2D1DABFF64E3F968DADD4196AA76EDEB89F2D9 + 588A8358563C0000000000000000000000000000000000000000000000000402 + 022A1C1972311C902608A82F0ACD4816863510772A08142D2C73AFA3ADC096A1 + B790769A85B4C9959AB6A56D82765ED6DB77D3B6243C3A0000000000006A6C50 + A0AE8571C5D25CC8F1638D7E48716983BBAD87CFBAA8BD92C79A5EE36023B431 + 0C46251B0D0F146A2B1E12060AA8303CC22818A529136D2E207E2C1645221787 + 2D115229254C2824812512110200060607572819A03E187F2B0CA74F267E2E17 + 74271B7A180F8E240E6E221360211587210D70170D1603020000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000350A0B6D160B731E0E4A25216D2F1E6730247B3E288D735A4C2820320D01 + 826845957F64CF5522A6462351312D8A2A20AB20107C170A821C0B652B289C3F + 1E983B18953B1A742B1AFFA756B4DBB29ECDB384AA9989A08A798479696B6988 + 6D74BC75605F867A162715278FE321A8FF5AD6F474E8DE4AA0AD70D7C085F4D4 + 8AE6D4A2CAAB0000000000000000000000000000000000000000000001010000 + 000504040D10111609040F02002F0A010000004F2C109AB49173B1AAA6A079BA + 95637F9E85BBC997C7AC814D8A7D69D9D876D0B9243F3F0105070100007C4921 + C39C577AC4D14EBAEF87CEB4578E7E453D2EBBD8A5BCBB8DDA9C62E16528CD3A + 0CA5300F943E27773F478E1E17AD2B199B2B17832B1E502F2B4620184F2D255B + 342866221B381815300A02060000000002221D2177301B9033148E321082321B + 56252170180C9D20118E210C731F0F80200DB222135D13140000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000004E + 223AB7251AA529137C28178B2A1B742619763323A16543B27B4D2F06029F3A14 + C27C4E9850309B421F8B3A215B27232E09072C090CA8260F762B1F693627752F + 17743C256533282E161A392410C2C9949AB29E7D7C716D5041775E4A72ADAB5F + E3FF78C4BA091416141F0E38A7ED35A5FD72E3E780E9C766D1E75FA77E79D3C9 + 8AF1E082DED8B8A973803E160000000000000000000000000000000000000000 + 00000000000000000000000000000000010000AB7C4394BC9E70A89BB98859D8 + 7D419A9E7785B29CCB9972A145216CE2C57BD0BF336A740222340000001D0400 + B2652C88C3CD58B3DD9BC1AF88C3AB6E8C761214118AC9BC86B9A8ABB085D68D + 56E07E41D36128A34B3FC638289E3222A12D189F260E35140C6C2A1973312157 + 2B27871D054B13080000000000000000002818196928198A4E2B2F0C04813419 + 572F2660261EBE2613AB230F4D0E07801D0C97200BA7211A662D4A06060D0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000070A010A10000000000B131A2E567D + 324FA3211AA62011BE26119424167F3421CE471AE65E244E13002E201CC9501F + C7522460312895351762332A822C23971E1CC1270F802614752E206132277426 + 10793C275E2B24350A020000000F2020795D518BC29C8F7970917D6E7F7C7E5B + 94DB539093080F086BC4A53BBEFF63B6D46BD6E179CDBB7DE6C871D2B6273A3C + 3C524A8585628269400000000000000000000000000000000000000000000000 + 01000102000000000000000000250800C03C0DDA8C4C77A593ADAC7EC94F1CD2 + 6829C1733E6DC3C076DDC73A6E5A6ED9E074D4C376C8D12544530000003C0C00 + E57A3591B4B872B3CBADB19881B39E7CC2B7A8834A2C1E11ADA576C3B37ED39F + 62DB8147E6652BC3441450352C552B27350E082608025E302A8C2B165B251C73 + 26189E1F0A4F11050000000000002A0A025D261F462A2472312082290E462F28 + 6A39274125239920197114100000004A0E09B324158C1A1024080B0000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000011A271251852B1C3035447329243E5A + 202C9C2728A5261F8C2C206132289E421FB1401971260F14050666372CC24B1E + 98381B692D235C373A702525B22C22B426169C2715762D226C2C1C3D1B187234 + 215828225E201886220778714C9EDBBF7BE9DA8EE9D09E9A86A28A7D826874AA + 53604801000002005BA98956D0F635A3E376E4D875BDB284DEC979DAC2406A69 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000370C01C9531DB99E6C9D8A59CB814AB2370DCE + 591FBB885D73CABE79DED037625475D9CF63C2D054A5C53E473D0000002D0700 + 8D441952ACCB9EA39DB5AC8BB7A97A73A59BCEB77A935E3A6A473074330FA22C + 06A72F097B28106B2D1D1A17151706077316067C29195C2B228D26166F211096 + 2610901C0F020000000000000000000000220A07402222622D205A231137160E + 872D155E271C892925831B0E2F09080D0B1864151498262C5C213202060D0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000093F6A77436FAD2E30A9323ABC + 2616A92C157D3123632D227639227C38235129211D0A0754150D6D5548924528 + 8D311D712C216A3645AB2C36BC2512A7270F8228166624185A1D127333225D2D + 25852210911F05E87332AECDA584D0C1A7C19C95B79F83D6C0ABA69895566BB3 + 5B5292222A42767E81EECB5FD1DD4DB6D786EED185AF9183D0C073D0BF649891 + 0F0D0B0000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000076240CD65822B48852B37F51D9692E671401C3 + 3D0C9A9C7B71CFC36ECAC4437F8067D3D96EC3D35EA0BF010710000000000000 + 09221E5DCEB9A68175A9AB92C8A067A5A1739DB38DB4A47E76B1A6597158702D + 0B0000000005080E1113000000721918AC27126C24169B2719AE240F701A096E + 170AAD22180000060000000000000000002A0B05721F0E5329225E37283A1D19 + 462419502C257A25169E230CAA2213A9292E00000239213A51345B0B172E0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000443F73B12E2EB7270D88 + 291A61281F6E23107943307744365C2C2640140C4509009D603F845B4573311F + 912F1C7F200B952D223B38699F252AB4251B77180B4F1C15762B1A762A1B7324 + 16B32609F06A2CDEC17CA7B98CC7B47ED29855B1D4AB7EFCE28993A681A7B093 + 7B6DAB1E2A4F73837BE4BF5DC9E16AD1BA80EAD58E9F7D8BC7B36AC2B68DC7B2 + 3C3D2D0000000000000000000000000000000000000000000000000000000000 + 00000000000000000000592E1FB9380DC87240A3431BD2975AD54411601F0C8B + 1D0084A38C8ECCB37FD1AD347E9A59C8F074BDC5A5B69D241B0F000000000000 + 46797179EAC17A97A4AA8964B5AC83C7A574BC743ECF8A53AE805F8FB195D48F + 51A1320C1501000000005C2C47B8261991230F9D2710A41F16B724114D0E0700 + 00001604040000010000000000000000002B08017E1E0A592820582D236F210A + 2B120F5B352B5E2B206521169A2310310804000000000000050B15020F1D0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000003070C00005211107F1F1770 + 231A8D25117A2F22A15A3CA02F164B0C00020403AA441DDB54236A2E21612F23 + 972E1BB521139E1D0D0200000000000000007D1C096A281C802A1E7723169027 + 13CD3512D14815601400FA732FE2894C9BAE9487F4D95ED2DE54C4CA80FFEC20 + 4C3D1727594A7F9681E5D064E0E153AEC17FEEE0B0D7B09BB5946BA39AB0BE91 + 3C36220000000000000000000000000000000000000101010000000000000000 + 00000000000000000000180601B62F08C96B388C3B17DE6B2CA22E0D24100CA5 + 5926C2B97C8ABFA65DC6D238A3EA6AC9DA55BADFA2A88B934116040000000000 + 05090C6EC4B373CEB16D8E8297A992D28A57B3662ECB6C3AC95620BFA772AC9C + 6DDB7A42B9370C553635962A3DA823169F230FC125147B2431881F2511070E00 + 00000000000000000000000000000000004E0F07AC260D48211E5E261C792C18 + 1D1210571103A02F117E26188D2410B2250EAC26243823410002040000000107 + 0B00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000A0E06233C45345BAF2E30B8260C952A21A6 + 2A1A982813C83819CF461CAE2312020302592A21C54821BB34156C2E236A291C + A02D18A4231E411E3100000000000065120DA027126B291EA124178F2A187822 + 14921D149C3317C3581FD9884F93C6B37FEEE874DCC363C3BE81F1D969B9A413 + 202007050076AEA267D9EE5FD5F167C2A688E5CEB8BE95513C1A838B6BBABB89 + 9A4E200700000000000000000000000000000000000000000000000000000000 + 00000000000000000104573226953212D45F284F1908D33E0EA73D197A311AD0 + 652E9FBE9C67C5CF45AFE738BAF899CBB157B7DA86A48DEE853C3C0A00000000 + 334E4A77C9BD6DD6C656ADA7899477C5916AAC7A50D46629AD300BA34119DB89 + 4CC17642BE6339724251882F3A972019AA201499324712203F22111E00020400 + 000000000000000000000000000007010170150C691709561B107D241265291D + 4F2A27160502592A1F772A1D942414B524149C2423752C472A3B69222C4D0B3D + 6700000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000033C540535563E46758E2F3EB0261A8B3240A12B31A5 + 2415A33229B13D208730181B05055C1C116A37299A3822882A1A962A1876281B + AF2912CE2E22061835000000180810AF2318892511893324BE391BD2471FB536 + 0CE14918E49C5FC3C3949ADCC18AEAD16ECAC36BC9B47BE7DF80E0CF233A3A00 + 00007A714C6ECDEB55D5FF70DBE3477F6C7DECE18DD7C4837D58A54D1BD1A562 + 8748200600000000000000000000000000000000000000000000000000000000 + 000000000000002C121445332BA73B16CA3C10070000742E17913214B2431ACB + 9F638FC0A38BD0C42FABF84ABEE67AC1CD7FBAC6858A6F531F06000000000000 + 3F504568A9A079DAC75DAF9F78695B94967F7DB09FBE491AB4370E6B2A19B948 + 21D05A2590544491465079363D5B2B26632E425D3E6F00000100000000000000 + 0000000000000000000000000000000000010000120303781C0B99230D6B2319 + 4829257A1C0801090C5F262155241C812515A2261FA326239A2D366F4273000B + 1500000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000E538230498064365B843046513F6D433D6BA32E2F77 + 2C246F42558138211712116612078729166D3827633629AE2713AA2A1D7E2111 + 921B0FAE3445263C6C030A15732E45AD2617941F0B9F2B1CC43D1EE97C4BE0B1 + 72D6AF7AD0C18FB6EABB7FC2BB649F9462BFCA75E3DD7CD0C48ED5C434443B00 + 000072C9B93EB5FF65C7EC83EDCA4E8A867ADAD37BD7CCB5BF91420800F05E1F + 4C210E0000000000000000000000000000000000000000000000000000000000 + 0000000037120E4F32317530189E2D0A822D1206020105080A3E2C308E5132CD + 9655B0B6937DCBD848AEE560C1DE4FBBF19F9C8AD796540E0B06000000000000 + 00000056878382CDC162AA9D59706676C9B5ABBD92B1662FA0270647261B5325 + 17AB411E6E555A4A50649A4724562F223B2D3813427300000000000000000000 + 0000000000000000000000000000000000000000000000911E0B9E200E822215 + 642B1E97270B6610094010067E241372210F791F1093200E9D1E118B1D1C4027 + 470C335D0A365700010200000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000004346066F900D4F7C073B6100304F1D4D89303F66882E2E7C2D1E5B + 2E247036245A251D0502007916087F2B1C6F3020772C1D832D43C62914B22617 + 2D0908000000000000131425782E48A92517A220148F2B3C4B2D3FA82E08EA90 + 4DA3B48E80B7A65B897E71AE9C87E2CE61DAFF88C9C3749C8A00000008030138 + 674D60D2FB75B8D882CFD179D7C463A39C7ED2B0A6D3B0B7C79A963D10120000 + 2D0A020000000000000000000000000000000000000000000000000000000000 + 000000000D01001B0F16542B1B6A34251612130000000B0402A4320CDE4A10AF + 767564CCF44DBFF74887A663BBE855CBFEBA8361D94E10B9360E000000000000 + 00000094845281CABA6EC9C5497E7A65B4AB7DC9BDB8C598D57B446134232A13 + 19533027B040177E270CB2411B7D311F522622961F0112030010030100000000 + 000000000000000000000000000000000000000024080B9D1F1878160F9D240D + 611E1499281045261E1304046B1309A62010A82311A121119F241CA92720982B + 365C3B641E457A0C467102243200000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000002183A02285C0000 + 0000384A014C5102556200354308395B0E355E374A7BCC2717AB27117D28165E + 2A21932A155A140800030E9D2017982A166C2D21982A12793C5BB6261EA12F38 + 201221000000021421173765723452A3252251233F7A3755321D27341602BA62 + 3573664A9F7A469EC0A288DCC992CECB63CEFEB6B3895D4F2E000000355F5886 + F8CE50BBE89BBCAD90D0B776CFCA6FA293508F8883D8C9C9B982EE6D2A6D1C04 + 0E05010000000000000000000000000000000000000000000000000000000000 + 000000000000002215194F332D291F241A0F100F0D0F3C241B932807C64D20AD + AA935FCCED50A6CE607B9083CBDD49C2FFA7A5A1B83A0C611501000000000000 + 160000CC914F7FBCAA7CC0AC6FB7A15F75648ADEC29FB995A484597D462D4C18 + 131710146E34257237243912087E351E5E32265E261FB32A1074160A00000000 + 0000000000000000000000000000000000000000000000350D128B1A139A2311 + 711F108B23127829224C211B140400500F0B56100E7B25327E2A3B46325C2640 + 751D457905213700000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000457A1059DF6024D + 570390B303789801587A1D36625B426B813853A031329B27187A24158326168A + 2C19A51E0B0D010041213AB72A229428147C2B1BA32B17873247542F51783C5F + 08182C00000004273F2B3F73743354442540392E396A3A47C25631E29C5BA0CF + ACB8B58EB9C59499C8ABC4BD8B90C2CA85BDCCFA904A000000010101538C8179 + ECD763AFB1B7CCA689C5A98BCAB780C5A148635B88C2AD8ACEB9D8A96CE95B1F + 360B010000000000000000000000000000000000000000000000000000000000 + 000000002A08004F23205B2721390E0619101462362BC24114DD5819B8937876 + C3E191B8C03B7DA947859F98C1C35DBCFB96A09FC8633071220A000000000000 + 21080058391E859C7D98BA9981C8B76581716CB099A8B997D79459E84F158D21 + 075020176832285333312106003D2220532D2A4F2E2A6322184A0E0300000000 + 0000000000000000000000000000000000000000000000111831B024209F200D + 822011981F0F82241A5C25207F1E0D0E0100000000101428151A310A0D190014 + 2302162401080E00000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000004417F03ADD90D71 + 991B4D7E304F7F225589344B816A3D609B333AAF251B861F18952613A52715BC + 260F8B2832000000070914A62115A5281B842719B22912AA333D14437B2A497E + 011522000000040305523A53443759333239AD360FD5602DD4874CEBA563C86E + 3ADE6831B79D6DD6BD80B4B191A7ADA25BAC9E2414080000005C83797FDFC968 + E5E5C27954B9DBA785C1B09EBB96A8C49D607E70A47641D0BC7ECBC690E09554 + 902A090000000000000000000000000000000000000000000000000000000000 + 00000000420F0188230B0100010800000000000715159F3B268197C885A5C8AD + BEA983788D1674AD60ADCB9CA7AE83B1CD7B9EA9D27948D2310133231B000000 + 000000000000D6944FBFA16A7DAFAB8FBCA8392F2182C6B98AB6A0D29A61F25E + 20C44116632D257626190000000000005F190A8726128027148F220E65130B03 + 000000000000000000000000000000000000000000060C552E50B02A2C7F1C19 + 7A1A07A1221A9D200E6221147A2110971F110000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000010517022D5E0174 + 86165989394677723654AF27239E241654242C891F127E2D2BB0291DA82E3649 + 162000000000000018234377365AB22B1D962512912822A8344507396B00334E + 00050B0A00001B30472A3F5C59373296351AC94F1DCC531FDB5521902D11D534 + 04D0804BC2B48BC7977073A8AC77E5D158A48C0001040101005C8C8383E5D35E + B5AF6CE9D38DD0B7BCA671DC7B3B6DD0CB92BCA1182119942601C54A18EB4A13 + D84614793C250001060000000000000000000000000000000000000000000000 + 000000000B020000000000000005010130201D983211E0511BC45D34AF7C6F6C + B6E42670C47A83775CC1F492ACA981ACCF949E9A74B7AA6D8670000000000000 + 000000000000CA4210C1683397AE8BA3CFA491976D8A6434B1B482A7A17BC690 + 58CB5722AB2F0F8D2B1729110F0400000800002305029C1E0EA2220DAD221419 + 050500000000000000000000000000000000000001122127305C000B191B0100 + 951B0E9E221F662E4B981E06771E0DAD2312701A1E0002060000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00014251022B44143C6E6B2C414E2A42852934A7291D8C3247972E3A43396300 + 030900000000000003233E583F6BBA25158E2A29A8241499394D20518B11303F + 2603054C0F0B852210732A1F582B223D1C11532D21993B1D582920652815DB7F + 4599AE939ABAA08A775F6CECE57FE1CC1C32341C000070623E99CDB17ADBCC64 + B59971E0E49BC4A9D38348E3682689C7B2A0B48F5D3F23000000000000481306 + 1D0C060A12130000000000000000000000000000000000000000000000000000 + 00070100000000000000340C026329235D312587361E694B5A9C787B75A6BC58 + CBFF182F479C9D9E5EC1F2998E99A2966BAE786587A78F63C3B0000000000000 + 0000000000006F1802D96B31A4A377B6AA7596A38E507674634732AC9D7BD173 + 40D05723B735116030213E2C2F5B1F16AA30180D030000000019040317030413 + 0406000102000000000000000000000000000000000000000000000000140B15 + 7C232B981E19523A679D24157E1B0A901F0F9C242331192B0000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000019 + 1901121F0F28466A2A40862E29653A50922F3D593D5E4E3E70363A6512385B00 + 0305000000000D140D436E4542749A2D359230336C2A38753B5B774466424E71 + AD2D2673160A4C0B004910055C1D150E1216542C29893521B13F19D0682DB0DA + B088DFD070BCAD6CBCB081E0CF558C8300090C5C1900B8B8867ACBBE71C8C364 + B7A482E1CE9BA78FBB4319E76424A2C099B6A7789A4C1E050000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 003209067D1A0D6818087B1D0944222149332D843824A2757A81ACD092B0B44A + A5EC312B44989EB367B4E89B8FA093785AA674577D8A7977DFC9568984111211 + 00000000000082270BF35B1FB48655D0773BA69B7B82BAB2714F3872836CA1A8 + 84B39162C45F2E9B40218C3A2075392A5928202509055110015611091D050300 + 00054B2C4917101D000000000000000000000000000000000000000000050911 + 4F2946722333241626912B318E1B0D8E20128C23283D1E3400060D0000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000F090556 + 77174B7D543C659A2D3D4743695B39595A3B6312487A143E6A00000200070B00 + 000000000000030500060812335E5D426FA02E32722B3F9439519A3A3335566D + 7E3E37A5240A622A234628227033244D2B23C7340CE47136DCAF71ABC8AA8CDE + C86AB4A679D0BC79DCCE8DBFAA1E2420000000070000ADBA8E98CAA97FCDB067 + B7B17ED5CDB59968832C0CDE571BA6AD86CB9759B93E120B0000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 002106049A230F7A3428682D246642378C717899849F7898D0A2989C8D8DAB0D + 447E6654669B9CA86AB0E5B56A62707867889A7B6C827974D6C360A19C000000 + 0000000000006E26114A12037F4320DA541CBA784685BBBABA7457070000DC8E + 4BD59559CB905AD46530BE481B943816803219562F287B2A1DB32811961910A1 + 272BC7312D301B30000000000000053A65072842000407000000000000000304 + 1B30593E3767152E56952B36891D12931C0D972422353665000C180000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000026A8B0392AF1557 + 85373E6C3C436F095D8C114D7D2F4176125084044C6D00070A00000000000000 + 000000000000000000000005395C184B816741635C436C000C1DC0230A93321B + 8B3D25823E2B763327A34020E0561EF86E31D87D45D69E69BFBB899BAC897994 + 7C88C3AC99D0B487B6A1917F55000000000000C64A14CFA96890C3B655B7CD7D + BAA889D6C1C7AB77BC3C0FE16127C18548D1834ECF47152C0F07000000000000 + 0000000000000000000000000000000002030000000000000000000000020000 + 000A01002D0A0252211D783720B44013984F3C79728FB26E64846E8E2076D80B + 345678A3C4859FBF728BB67E93CE8B7C645FA49C5274706BC6B47EBBAD626F5A + 07000000000000000000000074240ACD3D0DBB4B209AA9A9A0A9A1C15F390001 + 02A52200B14119B5845FAB56309E41216E3024642C24762819891E0AA82913A4 + 2F19A0230E7B160CB82824AD3748763F68072746000000000000000000000203 + 0315240B3D6C0B1A2E6E304E92282A571F2C90221D722C442543790829410000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000207010C2A034E7F0388A70C628A2340 + 691E487709688A056689104A77032B4208668A01353C00000000000000000000 + 0000000000000000000000033D5209537B494573414576003B59380400712618 + 773827B6451BE85F26CA7443BB845AC78152C48A58968A667A6D595FABB6ABC7 + 9FA2CFAAC8A06AAD79430000000902004B1000C53D0AADB7A264CAF260848283 + BC9EB2CEA5A1956FC5491AC54113BB4717D47137A32A070D0401000000000000 + 0000000000000000000000000000000000000000000000001205075615185812 + 079727145E2B245B32258B3216804E39885B607E6074656890169EFF1E4C7279 + A7B46598B68A7E976D7CA5B2654A827C746EBAAB4C736C60B2B376C8BDA5AE87 + 6341210000000000000000004D1B0B882509953819AF8E8397969BA490768AAA + 8D6D3B192506016B5E459A9671AE6B41AB47239735188739257A342671322467 + 2B207E2616932B18BA2812CC2819352D54000000000000000000000000000000 + 00030302131D062B4A443F708B2731611107752F405230531B2E530002020000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000845B10881E80597EB0680A50B5E850D57 + 7A0A6D8F027E9004829B02394700000000282D00040500000000000000000000 + 0000000000000000000000000000056E951B4B821E4C80196182000000100201 + 3315123D231EA63C17BB58277A5037AB4A20B189579F7250AAA39897C9BDDB89 + 4CC5AF75E1682C330E00000000290400C6501DC69C7E77BED895CFC967623F71 + A79BB4B98FD569317C2F141C0400C43E11C94E1C7D2A11080402000000000000 + 00000000000000000000000000000000000000000000050D6A1F2BD82A1BB429 + 106B281B692D2375291760443C6767655064813785D3227ED6218FE7AF695175 + A6C56F7F8B787FAC4C8DDEAD4529986542748C7E585F5777BAA179C0B488A489 + 2D291A000000000000000000160E0B402923942F0EB57D61939293B68257888A + 6DC18A598C2B0A29160AAA6233D96B33DE6027C45221A73D18873A207036246A + 30227D2D1EAD2A14BC2C2A603556113763000000000000000000000000000000 + 000000011C2D13477652386054355E3C17278C25283B39661440710316250000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000068DF1028EA80496AF0124390593 + AA038AB70489C501587300000000000000000000000000000000000000000000 + 0000000000000F190003070052760095B0733A473B4E6F40636C511C154C2A23 + 872C11C14A19A87A4A723B28C33B0FD78F51A09B74BCA185A3BABED3693CEB66 + 24B84417AD300C0B00000000003E5F5270D0C399ACA1ADB6A6AFB89455624B97 + A27DA0C4A8EE6323751B03000000972E0EC83E0F6C3424000405000000000000 + 0000000000000000000000000000000000000000000001030F04061403022F0A + 03BF230BA40F007F030059755676504250A1C114AFFF0390FF4C74BABB715065 + 97C38C767E5D71A0797B9B84503FB972417A857954706668BCAE8AC5AEC2A668 + 9A5B2C0900000000000000000000000301046B3E2EAD85689D87779C8A62BE6C + 3FC2864ED1602B972C0C0000003D11028E3417953A1872372562362A662E2581 + 2B1BA52912921E0D350D0E00040D000509000000000000000000000000000000 + 00000000000014386035447A0C2B4C0B18307F2A3E41365B06395E0833530000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000530770C8CFF079EFF068CF201244400000005AF + FF0487D401173900000000000000000001162700161D00000000000000000000 + 000100060B1D1D346348788E2F48D71A039A2E18545257406B728A412AB8461C + D9602BB3613B8C7358BB724CD17841D4713BBC7D50B49D86CC815C9E2A08751C + 040000000000000B070228424183FBE59DA085BF9679C79C608EC6B04F5E4AB2 + 8451C5C187DE8E53C244173E2F2C3D23197E2B12462B22241518000000000000 + 0000000000000000000000000000000000000000000000000000000000001200 + 007F595668E4C88CFFEE72E6D835AAFC0CA3FF098CFF2779D7A142279C797082 + AADB694D673B76BF8F6B65C5571E8F9675777E6F7D534081705C6BC0BFAB9F75 + CD58212B0A0000000000000000000032181D7938217A8D76918B759281647255 + 45CF501EC16C3AAD441E473834331E1C0500001D131A25181C611B10601A0A7A + 1807871A1051100D000000000000000000000000000000000000000000000000 + 000000053F5D104B7C06325100030300131E303E724A32561F3E6C04263E0015 + 1B00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000063E840750AE0958B3010F33000000000000075F + CE064A9C000000000000000000000000035C7B0395BB000807002B34000E0E03 + 21351E4D856F3C62BD271ECC270FA42C1B8827145358573B6A7A812D18973B22 + 8A2D18772F209A3715BC3F14B257318088779F896DA1A58EA368473A1B120000 + 0000000000000089916C7FD6CC75BFB18A8970AD8563C69C67A9B68D6939186A + 988DDE8A53E07437BC42153218101E161A4E352F150D0B000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000C0D3E715F64C2B032A6EB1895F5188EF80AB2FF53658FB4431C7A93B07F + 89B75551783B659F75A1B5324A46C7A062B7A17278A293714F3792CFAF8AA98B + D18B50E448132C090000000000000052171156413D69CDC07799848A7F666485 + 7D93462CB2451BB0683A8E6A538C7A5BB05F2E82270717070315090603000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000032A3A05243A0116210000000000000E3F6B2E38641F355E0E49780653 + 75001D2100000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000005100000000000030000000000000000000000 + 00021231000000000000000000002022066B8D335C8F074468126999082B3900 + 090C152E4D313D686A3451A6252053130B8F26158D2E1E8F3B36942311852315 + 5D2C26742E20993B1DA35B387C9B8D688376779F926AB5AB5841391007080000 + 000500005C43248AB69E7DDECF66BBAE7CAC95B78A6AC68E55C2A2706521048E + A37FB4956DD94A14B439111309081407084022221C0D0E000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000509B862995ED299DF526B7FF2B95E56736268056667885A788 + 64734773AC464865566163977050D26023A6A6857DB19C3A5C55B0BA8DAFA978 + BF884F56210A08000000000000000020040028221F75CBBF669D8F6961556B94 + 8870574AA237147C3718A1422183573FC06B3AD35825A33E1B46292032191909 + 0100000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000B3C5F143A64113861041B2D021C + 29000C0E00000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000201004E6731588F9D34465848781946771E + 4073000611111C34161C370000003E1626D22A15C2261683150EAA220D722A1D + 782618B84E22AC7A54938A7480907E749B8C80E3D75481780000000000001203 + 00D8571DD2AC6E91D3BE6CCBBF5D7A78967F64D9753FC67C40CC9062361E18B6 + 692FB5B483C95E2C742E194E35320000001004030E0403000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 001B302771D3AE51B8D868DAE154C7E44FA5CF3A5D87852C0A6273A06471A36C + 758D695B664959744739326B1B0EEE723098BB99B2A26A6C785E8BAA96BD8D5C + DD6F2F9B3712000000000000000000000000010402729A8774D6D156413F6FA5 + 9B7F9D8BA15833A443204B2B206E3F2B863420C54519B94318A23918693A2A50 + 211C801803971C0E2D0805000000000000000000000000000000000000000000 + 000000000000000000000000000000000000020E160B436B0F3F670420340000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 06090E0000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000151F2C497EA7373EC02816973A4B91 + 3854C32E2BAC2211C62F28CF27167B394FA63032822F266A2B2B932D1BD44115 + EC6428F09452B8815C97735985B3A192E1CB8FA3802F24140000000000002B0E + 01AF804E97C7A883D6C762453E7F8F7DC17A4EB14E1EC46439AA8B6B50665295 + 2805E98040DB7136AC4621462425661807050100000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000004B7E + 7987EFD773DBBF85F6CC68CDBB2BBAFF289FF938547F712E196074A65B6CA250 + 648F7FBAAA51A8BF784930DC3B0BCF9455BA99649E947349341B91BC9EA28C65 + C54211C1360C442213000000000000000000482F1896B69375C9BC8D896D6C5E + 568EA48F6F615395341642231C86331C4B272463271A9B3E1B893A1F792F1A68 + 3226702C1F7B1F0E53100716030300060E010409000000000000000000000000 + 000000000203000000000000000000000000000000022C3D0A476D0751750000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 25588F1A4788000000000000000000000000000000000000010E270322590000 + 00000000000D0C0000000000000000000000000929479C3D55B92B15A42D1A96 + 373DBC29198E2C188E2F1BA52A15782F265A3637863B218E4026AC512AD17845 + C79B6BADA4789A9074A49A7EA9CBA5D6BC817A320B000000000001110000E345 + 11E09251ADC39B719A7A7AC3B8A2B38FA9865ACC5622A1320FAC8D61C4986122 + 0D03C74215D0612FCD5220813D2671332B751C0B020000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000060A2 + 9D65B1A46DC2A280E6C936B7FF1289FA3F6CBB5239487D4E31558CBF58709A4D + 67908B9D727DAF8F744832A01E03D47035C5744689AA972B1C11C79E649FA27D + C05929882408261C16000000000000000000000000493F2D9EBD9D72C6BE8351 + 379AAE91A9785597462750231F652E1D78291989200E7629205D322867312057 + 2E25742E1D7E2A1AB62711B621166B3454292442000000000000000000000000 + 000000000000000000000000000000000000000000001F2504354B055D7C0018 + 1700000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000030813 + 1170C91DB1FF02276D000000000000000000000000000000034180079BFF0045 + 53003A43014C5E003E53031C2E02233C000910000000281C30C0322E992E197A + 33229F3525B0341C8B412B884B34A43919A34625A26544C96536EE692EB37C4B + A86A3F9F8D6AC1A878C2AC79EC803F673717200100030A0B4C251BA12E0AE666 + 2EB8A6788FB89C87906796CAB1C99961933E1B882F15733824CF8B4FD96C330A + 010034140B943A1CB6481DA63A15372526110000000000000000000000000000 + 0000000000000000000000000000000000000B060234160333392C536E6566AF + A86BBDA67DE5C651D1FB297FDE4E73C26D607C55281C656B6E44A2EB695A6D4B + 6F9E7CA79172684D863722C5350BB63D12B68A5EA4AA83050401D57F4AB28B5C + CD763EC33F1143271D120D0F000000000000000000663213BFA87381C2AF7D9F + 7B7F7567A469529B5E40C643156226194C2A27822614B0220F812821722D2355 + 312A712310672B1F7F281A9D2411B123154E1C29000308000000000000000000 + 0000000000000000000000000000000000000000000000000000000268740009 + 0900000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000A3565 + 14ABFF0AB5FF0B76FF0C6FE8052D3B0319500C96FF068BD30281A8068AAF018B + AB036E941F4E842C5287234C876F3C62742F459523274C0A015A110C961E0E82 + 2A1A7B3D2EC4491FC0542E683D349C4324DB531FB26432463B42A256269B714F + CB8953CEA56CEA7435E96E2E701C02000000000000000001330D04C84715C696 + 5DCFB2767065488DA087C9B981CB7F4A7C2D184D2F29973618D77138D55A2566 + 1F090000003A2220603A307C37245D33294C160E050000000000000000000000 + 00000000000000000000000000000000000017130AA8B18480CBBC8BEADA86EB + D486FCDF68E7F63797C93C9FF08D6B7367493C4D2317776A8657B0D05E6C766E + 4F678DBCA87DC7AF754B3F5A2111B44820C49D65D2874D06000095927CC36D42 + AD6437C04113A1361459352D190B0C0000000000007A3614C8A16B9CBD979BAF + 8D79856BB27D50BA5E3AD670329526086922175A241A9B230DBB2718AB261365 + 2D24842A125721199E2B139E2714B32313A4232052345A06233B000000000000 + 000000000000000000000000000000000000000000000000000000000D0D0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000D1119020102000000000000000000000000000000000000000008 + 0A6EBB0AA6FF0693C90AB8FF0A85F2010C25021C4908A3FF058EB817638C2F4A + 81424E7D5E436681354ABA2A23A82E28B62915A42E16932F1C6E302733262445 + 1211280400390B041A0F1126110831140E3C211C663C3BD57359A98259BE6C43 + DA6731A6320FC13E1076230C230E070000000000001A0E0B962F0ED44E19DE7A + 427E8070828D6F9FBD9EF0611EAD411D4B26213D2528B63A12CD6029BD401423 + 18130000001A0501321414551D15722E248F2B19A422120E0202000000000000 + 0000000000000000000000000000000000000000003D412F7AB7A878D6C47AE5 + C253B9CA47A2B745BAF048D7FF69B1A9702911573B516F6B8657B9D559829070 + 413EA1957F90EFCF47706F882F16DC662DBD7C4EAF451D51250D98B28DAE562E + C34B19B2370F020F110000000000000000001104009B2907A36333DA793679BB + AD8B7768B0392AC08565D7511AB83910882C168A27167E200E28050370140EA4 + 2710912B1C6D251C531D146D2B279C261882324A413C6D123C681549770B4A72 + 0218240000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00001937684B8FEC285792072A5C00000005285C010508000000000000000006 + 066BBC07A1F423648E0D8DBE08A8FF09A0FF00191E0754B90374AC0054650F4B + 6F2C2F5367374F743246992D30AA2922AE29169929177A3226813B39B93A23D7 + 451D9F422B69352A8A3F25CE4114C46F41898776998081B2573B90391CC34114 + 9836175C3125290F080000000000000000001708074E2D29833016BA4416B0AE + 88806C55A86537D5B271C7310699301349140D452724A1401CAA41199D3C1847 + 2C2C000000000000000000000000911F0B470E017B190B100302000000000000 + 000000000000000000000001000000000000000000000000101818426E6A63B6 + A050AEBD5FD1DB5FDCF358C3E7915B4BA21F056155703D71AB5DB7DA839D8269 + 7376A82F13934F43836351BC4C1FB55329BC794F5E2A1673443FB4A577AD6B3B + 863216B437104722160001040000000000000000000000007A2F0FDB450EB3B7 + 83A78F6A75402A919F7FC1A068B95023A4381986342195281E9C1E115F161B90 + 1D11BE251392291779190D69190D9C2511AA240FAA26227D34503D4378072E4D + 0002040000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000239BFF1395FC1D9FFF1497FF075BA30E8EFF0B59C800000000000000010A + 0765D104A3E3315C86255F890796D3088EC40267800050610477A90000000010 + 0E0542623A487A5F456A63446D64436469425F554065883449AE2920B12C168F + 2F1B623F346F352687321EA35840927B63838673845D4D622B215F3125662C1C + 5C332B171316000000000000390C04410C01591D164C2C26975035AF897FB397 + 859E583DAA7E5ADF9050B13B14561E105E1B105C2F28A6401C822D1177392526 + 18170000000000000000000000001B0504000000000000000000000000000000 + 0000000000000000000000010000000000000000001F1F18466F6B72D1B879E9 + C975D9CF7AEAD745C7FF468DE0931A19A0280F586B8C46538152C3F597B59297 + 77619D4E3465120D621E09AB441AB8421A9D88652E362B6B271EB5937FB47552 + 6E301C6B2E1B653121131015000000000000000000000000671B05BD2B02CA99 + 60BA9E6B63624E693C1DD5834CD58249C95825A939107C2A308C2422461E3239 + 1E35992D3AB52712AF2518190100811911B02823A82319A4251F632F4C092B4C + 000B110000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00001F93FF0BA6FF09A4FF0DA6FF0CACFF06A3FF0AA7FF037ECB0471C8000000 + 0000000080AA235E8B5F4464355E930088AF31518418598A0B759D0257760066 + 910778A212629600669208365C004573323F7383354FB3291E9928187A241782 + 2C1B922516BF3D26C46544827D6F728573706F647629186B28204D201B140A08 + 7B2616100200000000000000460100711B0F744B3BA57452A98171ABA3A2982B + 0F444836B99167CE622EC84014852C1C7D291C70332176331B7E3F275F2C253A + 150E000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000003030473A89A7AD3C47DE4CA7ED2 + C374CBBB6EE0E92FACFF218EF99C331F9B563C60839A68526C6EC6CF79D5BC95 + B094B86954972521842D1975351FA146229C8E664A3E26690E00A7787C907D88 + A93D1B4521203C2C2A4C211D190500000000000000000000141614A72F0DD485 + 45C37545999D7F8A6036812E14A48C70B9481E8B2D13663528542F2C712F3552 + 1311544073C42617AC29271C274702000036294A613C68693A62563C66433F6D + 103F6B034E680000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000028508A0D7EF10C96FE0697D60E83D41884C31082BC0E89B10B8AB1068BAD + 00242E00667C096E96594169A0313E644F6C32538497334369426B1C4A7F4763 + 9A38708D575A7E394A6B28597D41466C86394E87364A892C348C2A1FA63021D3 + 3319EA6D44D28C5DA275608E8C789FA68E9E2D199E1B07821B06000000000000 + 0000000000000900006E3414738C6F80DDCB71AFA28A8C76A48A689B8D6D5A21 + 0BCF6D37C07442AD411A7C2B18752B20642E254128286723107E3522552A258D + 210C000000000000000000000000000000000101000101000000000000000000 + 00000000000000000000000000000086471CCCC58881C4B670C5BA7EC6BB6699 + 8D7BEFE23CABE9239CFFB14342B3140185694C83796F7C647067E5F187ECD265 + BEAD8686826837385830334E2723DC672DBE6939471A07260B039D62558E828A + 9B604B53352A49161043150F090200000000000000000000411D13AA3411AF36 + 0CCA5821A9784DCE985D390D00918A60A88E62B64F276C2B1D632921642015A3 + 290F7E3843932E39653D6700040A000000000000001F3602233F083B61104A7C + 0F3F6B0B527E013C470000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000020643AA0B88FF0582B00C78B0176D982B5A833A4971335280 + 364F7D2D386115334D1946788E3649B932205E455D843C4FB1302B853D4D7647 + 71BC2C26BD2614A52B30CA281382332A763228822E1E663328954338B14948CA + 7552997C75B56B59B39177C5C493A25E43A71A0E140302000000000000000000 + 1C0A04340700723010CAC08594CDB7719A8C6D6B5E847C6B946749BF925F1100 + 00CD5322D16430693428942F21901E0A571508280904653627652D225E20165F + 1608000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000001301008E5D2BA7BC9549655867867496BEA380DF + C061D0DB2F99DC6699B57740307C1F1391725B86959F7E737A6CECEA7FE2C975 + 584E96736166493E622217A03010CB652EC45020350A00261F1D9A7D60857C7B + 92756C8C5D3F381E206212002B0802000000000000060203241816090B0A962D + 0EA43412B05E32C6844FAC330A2F0C00BA5A2AD86A30CA5626923A1C7234235A + 30275F251D3D39604C426D34162008091300000000091101131D00000004344B + 011922012B36012C330000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000301001D2F54107CDC0AA5FF09A7FD0B97D21289B50E74A03D486A584062 + 91304086445BA323213C323A162F4C95201982301E66455AB83D37AC2E168331 + 2BA13434A730198D3B299130209A301A87402B8F5339C74C21806466724B53A4 + 8E65A97F67C7A173EF9D5D823F1B140000290C0F000000000000000000000000 + 691E07D95C24D6A46A9CBDA38C72617274687781768A513BBE5E32DF5F260000 + 00AB522ECD58266733276529204D110700000052170D502D2A7527198E200A09 + 0100000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000002C0A007A391547381D837E597E907894E9CB6DE5 + E251B9CA50BEE27FFCD10000007C2C2796737889ABB5669FB25AD7D980F3E17C + 887F925F437A38287C301EA9441DBB522591331604010480583379836C90775C + 777870897F63655047852414340C050000000000000000000000000000005E2C + 1C762C179A3D1DBB5D2DB6694344281D3B150AA236139755359D4E2D83371C70 + 3020562B2452353D783231BF281C492A4E0C2142513C641C4D81000000000000 + 000000000000000000000000024E7700090C0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000007080D3388DF10ABFF0DB1FF0FA2FF0A9BFF099BF80AA2FB0B8DEC1A71BB + 524F7962667E7F463C564048054873233563393155040F1E592338BF2A1D8F2D + 167C392CBE3B20A73A2166372C9C3F20BA512649302C572617563C3ABF7545C7 + 7846E8793BDB4D178E29081001000000000000000000003B171323161C5D2716 + CE3E0DE68A4AB0CC9E9C8062967A68ACB08C8B3E2CA4411BCE4A18872D100E10 + 159A7456A84B267638266F1C0E2608000000007B1C085526228C26128F1C0B0E + 0200000000000000000000000000000000000000000000000000000000000000 + 0000000000000000003A0A00BC2900B55F266B93828CD3C388E3CD84F8D15ABA + B663D3CB71DAC08FFFE225001397374776719C72C1DC69CFBC7E6A75AF8B7BB1 + 6F5C8D2E156332286A2F1D894D2F874A302C1912270400C8733A906B4B887459 + 8F7253649C98646157612A23801C09B42313000000000000000000000000492A + 2C3D2F2B873219AC461DB95F3586846695542E0600004934328872588B493363 + 2E23852313AD2710B92512A81E12A82928AB3139C1373F0B132400000000080D + 002B41000D14015762006A7E048FB3036293000000000000032D6B067AE70881 + F007399300000000000000000000000000000000000000000000000000000000 + 0000090B114A79C61A32582A6ACD00163D0D7EFF0C7EFF077FFD05A2E1039AD4 + 018AB31556854049775E44639D4249A5373EC1291AB72A148729172B110A231C + 353E07006F190A1913166C1A056921144F2923B44016C47043B5683FB549249B + 3617A83915341B160000000000000000000000000000003C2522AA421DCA4C1B + D78649A8AF8A788B7AA7A487BE946CAB532F7030209E4522883A20211B1CD159 + 219B72507E37216D34237F31269A200E68130DA1220C702617AC261177181300 + 0001000000000000000000000000000000000000000000000000000000000000 + 00000083270DFF5C1DE4914CDFB576CDB77CA4D6B583E2D16CD0D462AE9957BD + D865E2F17CD7C20000003025437F5E7F5174C270D6E76EE2D174878DA861488A + 92829AA2869A5B357C240C8B5F46604F4513080C3C0D00C95F2A973F23755546 + 7B85776C543C70CDBE8B9E879F55380400000000000000000000000000000200 + 00412323632E209F3E169E401D8A5336C37443C04115000000803010D2682FD4 + 471887381E633028782B22972B179728139B2814991F10901B168F364E5A4576 + 344B84125387005774146393225A9201364000141C048CA90697B7049CAB0783 + EE020F2F00000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000063D7F0A72D00DA4FF06A4FF0A89B60F6F94 + 2154803852754F3C5F6E3750893342AA302BA22A1F7F3430653D499D3B32CB3C + 239C3421743121863A29C6431C8D4D3584422DA0391A6F31247F351E64312754 + 271E131215190E0C0000002306070700003F0F044A2622612A1BB3451BD07E48 + A67C5CA8684DC4573CCE5735AD422188361E65372480523B5A3E3A000007D547 + 16B2542D7B2E1E562E28691E106A160C230809A11F118B210C6F160A6F191709 + 0203000000000000000000000000000000000000000000000000000000000000 + 000000100000BE4819E2A968AACFAA82D4C87BDCCF68B49F4A7F6E73D1AE65D6 + F460D3F04E827D0000013E5C825C93BC499FE180E5D978D5C063CFBD7085738E + 8E7D88A18DA8764F8F3E2281674F8F5331190503521E0EC04D1FB241187D4634 + 6E756E64635360807C79D1BE5067540100000000000000010000000000000400 + 00471610683125602615943B1B6E2F1FB2582EC8511F4E2318180807632009A1 + 3F1D923D1C833B216F402E672E21722A1C7226198B2616AB2A1CAA2C2A84344C + 2E3C681342712F3F6D5048763A4878081E352254862151821355810389AD0009 + 1400000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000010C18053061064A9B0564B5023B52 + 045A7C0F5584414E793F4A7539598344567B3B486D5B42678C3545A7291E9F30 + 1996311E862E28AD2C1E802D1D732C1E8E2B197C281B6A2B20742A1C47191113 + 04030000000000000000009A2014751C0D732315592D27802E19C46533A8855B + 9D6140A26C64E76031CA431C6E271A6C26145B33299B5D3F843F2709070DA83F + 1AB34A218D2A15622F27751B0900000030121EAD231BA11F0D11020300000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000800006B301368452879815D49857D5EA19464B7B481DCC44BC4 + FF56C3F73C4F4400000057ACAE57B4CC70CADB79D9BE7BC6B993C0A88F5C4763 + 382E84463290482BAA4521BA5A309C380E000003472218AA4018AB431A77301D + 83614F667C76643D308AAB97AABA8D9D50204D12010000000000000000000F02 + 008A2816622C24211F21813017542722933717AA3D158F381D301C1C00010413 + 0B09622F2764332A6D4C3E8A4C328C2A17982A16A82515B529266E395B6C3854 + 5F3E61803A528E384C8D323D6E2E3E8833444848771D5684097BA204A9E80432 + 7B00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000001000003002340 + 0587BB126E920690AE045F7C01637F0D51834F416D9A3543A22623AC271CBD2B + 208A354CA92D32AE2813922510A42912BF2510BD2914430F08941F0D3B0C0600 + 0000000000000000000000751602772E227134268E3419C54E1EE2682D9A3612 + AF5427D47D47CA3E0F912D0F552D257F2B17623024D152229031103612107839 + 248E42258D2F1F992813A72711420A070000028019168C232800000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000003B332072A49280CAAB8DD9BC76D0C47FD5D154B8 + F52983C310150B0000007EECCA60C7CC5BCBDA85E8CB7D999BB27961916E5C90 + 2E1C9B1E09772616B83A18D759256C210B1D0D0F5A2A1F8F401F8F301275412C + A16F52798B8179533F837D6E76C2B3C6A96F7D2203000000000000000000440E + 08AA250C380D051A0A0A4C322F63271C6B2819963F1D7850386C55487D2F1A00 + 00001F08065414059A2810C64D26D5481FB9341F963028852A1E892B20A92C19 + A52B1EC028138024257C2B386D3A50554065115588086D92017489001E28010D + 2000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000043D67 + 08A7FE07B1FF0344870296BE0973961A56852148770B2F5A493455694570383E + 6F3F3E6C9A303E851914962528A32D33541A2524040400000000000000000000 + 00000000000E0203701808762314522D247A321C92583888503A6A220B72674D + C873449E4021742B1881241570281E962411822F1DD542166D331A300E08512D + 2B7B331D763026A12314B8251768171700000038284A22182D00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000080201240600B66D36ABC7A36FC6C192BFA38AB1988CD1B58ECBC465AE + CE4496A2040500314B4B83E9D862C8B963CDC681BCB4BB3E31B27D64AF7060C0 + 5A3A80251C813821AD3A168C341A0000001108083D27288A4025663A256C3123 + 993923B58963856757A95236A5B78DB4A5729B42150000000000000000000000 + 000000000000000F000072281B60231B8726166F2E225C2A1B824B35A06743E1 + 531C5A251300080D000000560A0672280F83381D64383A5C332B6A26176D2416 + 92230F75241BA02B21B12A228A32434B3C68123E68025466001D1B0000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000005366B + 096BE007369400050901537400535A01364400191F001722285084195E910020 + 34132C4D0E213F0000001D2D552E254000000000000000000001080C00080C00 + 0A13241120B5261FA226118B2617752A1D863D24B36B41292624B64619B77347 + AC461F763A2896241D9A250EA92312A224147236259F381A462B231404048C2C + 195F31276A2F21A82D15A925253C2A4D00020500010200000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000651602E76326C6A76F85B79DABB18BCC8C4D91BA9C9EDFBBB6A37F4DCE + EE4F937900000049898B6FD5C564C9C258BFBB65BBC69C706ABE916BA8655EAD + 65425C2C237E331B76341D452A28000000330A026C372C736655521A0E662B20 + A13219CAA167936B5EA2452F7E968ABA9161D95118721D070000020000000000 + 0000000000000006000096210C651B0E7B1A09632C236F34214E271F91361DC9 + 441BBD40186934283717132505001F070520171960261B7E2A198E2E1C982916 + A62919B527169A2E3A44467B1B477A1553860248620000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000010F28 + 010A1C0000000000000000000000000000000000000013160669860232420000 + 00000000000000000000000001000D1800000000000000000000182D2B345B4C + 33577B2439AE1D0DAC220F892C1D8C3D23BB4A277F351C3A1A12D7521D963C1F + 65322861373BB72411AF2412AC231A80271E77371F6D35253B1D193609079722 + 0E7B2C1D742A1B7D2A1ABC2B1B8B364A2A345A00030700000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 1A0701992000DD8C4D98A783C5B57BD04F17D09D6393CDAF85DEBD82A89974E6 + CE3E7166000000376B6B3B7FA25B859E4C7BA283B0B2C46950C94D2A955442B1 + 643C752A176E2F1E572F281F0D0D0800008727117F614A85452F431E15613025 + 982F15CE653BA79D7B9D50408A816694B690C97740C046186D2D180603030000 + 00000000000000000000981E1097200D8F1C0B7425176F2C1D51251D6F291A81 + 2B19A0341C7F331B642F227826197818080000001502002809026F1911A12217 + 8421286C3857503556111321011422021A2501212A0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000C0D0001010000 + 000000000000000000000000000000000000001D1A1C0000002D110B903B42C0 + 2F23BC4E38A147347E64546B746C7065744E4E6738232F674337A04A27702F21 + 4D323B892C3A98201C601D289A2C2B73322457271C7431227E21100C0000510E + 08B228138C2D19682517BB2513AC374930497D00080F00000000000000000000 + 000000000000000000000000000000000000000000000000000000000022100C + A13211E45B20D87C3BCC6F35D35B24BC33059C9B8277E2DC64C5B665C7CA81E7 + C63C65620000007D8B653578A07A5D7FAC4744A95F5CC05F45A931149C3E1FC9 + 70398937205028247D291D130200150601B64219B15A316D31204326217A2711 + A12F13B64D27CE9158898678926B51B6A172C88046B95222360C020000000000 + 000000000000000000001F0503801811871A0FAA230B482B296223157E2B1B89 + 220F6D2B23693320702B18682C1E9E1F089119125D1E30000004000000030001 + 00000300020A011A2C0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000100000000000B07 + 0E0503061203010100009E28136B2216412B2A82290FD84F1CEA652BC9AB74A7 + A58A918874708B817A85738B8C785D2E26460E01953F1A915E436C2E1F7C2718 + 782D2C373A691F2F5A83282E9F2A1B7C2B185729207C26184A11070000000A03 + 07AF2A2ABC2510922B1E921F0E00000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000023B170B + B1360FC03C11520E00B43209E5692DADB3877ED9CE74D2B56BC6AE7DE1C868B3 + A8253A37020000AC96615AD8FF5BA2CBA4514CA3726192A790C68B5A92391CB2 + 371573261A911F081D050000000050200FC2461CC537125A251F62271A3A1D19 + 6B281DCD3413C9482C99A485574C35648C80D36531CA4413A23411140A070000 + 0000000000000000000000000000000269191CAC29157F22116B1D0E5B271EB0 + 2614A22215682826642A1F4737327A5445C44620C237197934204C28276E1E0C + 661306A820130400000908100003060000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000009E39 + 4F882427A5200A7723135327217F3823963E20C85A29BD8B61998378B0725FAB + 5E47936A5B9F6A51B7593BBF421F2F0300542416CD471B7E34226D2B1DA32917 + 632121012848952B39BF28149329145D22188E2C17A62614390A050000000904 + 074A19258F1D18A83038BD281371283800030800000000000000000000000000 + 0000000000000000000000000000000000000000000000000000140E0F553328 + 4A1D0F4F1B0A2405008F320FB8996890D5BD72D2CC5B9C9066BFBB82DED44C67 + 5B000000592E1575A6A84AA3E78CB9B98D816E80867EA0A287B1734EA63A1F8C + 220DAD250F69140B00000015151C7E371EB0431CAA2F15622215892A13581D11 + 6A2315952610D94D27AC5E5C371E1B918052A2986FB140157A291049342E0200 + 00000000000000000000000000050A15792126B4250F8F1D0E3209038826148F + 24139C211F86282B91271152251D8427119E3922BD361AA33C305E383753312A + 7E2B1C942711B1251B8D3244521E2B10152800131F02283B0010150000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000002253305304A0023361A233E4F1F2E5F130CA323 + 109F2A168E2816732D207F3824A15A37CE5C288A5E49645D73A66662C6654CBF + 6754C352389C3826B43B1C581B0B35110B7C3A2893341B8C2B19722515B32E1E + 383755304077A12E3693271A8322115F271FA22511A626193F0F120000000000 + 00000000261A2E383D70B32D31823A5417386000030500000000000000000000 + 00000000000000000000000000000000000000000000003F0B0000000303090D + 000003942B0AED6428E7924FABB7929AE0C14A827865B8B47FD0B976C0B6887B + 4E002B400F4C633372AA917A89BC755DAB5C4A952F2CA98770CD8154EE491AA1 + 23098A271C3D0C0D2409014426237C361DA53524962C1A79211384291B4C1F18 + 6E1E0F9D2C14D74A20CE573765444F89442FBE8F57C163328531153F2B273D13 + 101B0500000000000000000000000B16662A429F374A1F0401080000831B0D92 + 220EA9231495304197313386281B831F0D751F129325149C2C2468394B483C51 + 52302E692218A42711AF27159D2D3754406F3443711D48750328400238450000 + 0000000002244D00060D00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000002C453E4E842A4980313D72982D38C227148A28 + 176B2D1F663D32A43F1BD54713A54E227B50385A6E76A46F58B65D439F50519B + 3A3B822B1967342C59332D1F08077F29186E3525832B1EAD28115C373C373A5D + 7D3958A12D32AC281490221190200F8E2711B9251B6A140A0000010000000000 + 00000000000000023357424A863A3E6B27539000030800000000000000000000 + 00000000000000000000000000000000000000000000005C272134212142261E + A33410E47533C6A16D99BEA08AD1C36193876C9A956CD0E791C8AE7F7C582253 + 5B075084375F8773607EB6786CA56E6877788DAC3E36B16D56A98B7FC49E78FD + 6C2E68210E000000320F0946272785331C652C226A251C9D200F8A23135F2218 + 652C22983319BC4530AB48448664700C4278CB531FAF6B40BA4C1C83371D5830 + 2A6C281C2E0A03000000010000041221101E370B081000000000000060181DB3 + 2316962010150F1D641A22B125138E2917631D15A62613A7220E97241E922B24 + 882612852B197221147B1F129B2717AA2719902C394E3A6319437609517D0063 + 6D017E92038DC1000F1700000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000001081602182E00020C + 000810015A6102111D0A263F0A0F1862304BC02A20BF291DA3302F8D2A268B2F + 1DB83E1C9746282B64780C626F4355578A6857B04A2163465C6C36479D2A2297 + 2710622A1D6D2C205C170E82160B993921643D31982B25A734266D3F541F4C85 + 604067813147892023771D1686281FB3240C7B2E49311C300000000000000000 + 00000000000000000000032E48000507093E6205527300000000000000000000 + 0000000000000000000000000000AF280D772C22422B2A653424B9451DAF3B15 + C14317DD5A25CAAB77BCAE7A715C35729E8384DADC73B8CDCC9B5D1A77760064 + 8D1B587D53A2AC3D779A6B748F7B97917D868994A497504968A66658DB9758ED + 8E4BDA4A16793421792615682C1E50271B5C3126882417AA1E1296261E7A2111 + 6B14082C160FBA370B83472AB785565115006E503CA36546AE3C128A2F11492B + 2243140E1604000000000000000000000000000000000000000000000002084F + 28459F2C36451C2C352745A52927AC271B7A23196F1C15842B31862F41613457 + 78344AA9281BA627169525187D1C17672B3E75313C663952334772154F7E1357 + 840A689202282F000908000B1300040A00000000000000000000000000000000 + 00000000000000000000000000000000000000000000000641A106A9FF0362A2 + 0287B30272871253853A487D763E61952C31A022139427158B321C6E33247333 + 22772B174B160C684A35506E7A57586B51435D583F5C8C3338A8282191231581 + 3A289D29158C200F21141FA5291DB14A28802817A12F2B8B2A386B374E00243A + 06284600162E4E1D269A281B942B2CAB22175F396100162B0000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 01010000000000000000000000000D0301722E247A3B28B53F16DF5D26E17B3F + E09F5EB4C594859B84354D47648D80A2B79681C2D791B9BAC8612D180000002A + 2C2C4C497AE2CB2C688B9C927E89A390A4835FB7AC8276B1A552322F7A1C0080 + 2004652614882B1C7024186C3020341E1E712A19802A28712130A5261D8A200C + A41F12622D23662D1EA14823DB6C32731D05785C388F7A5B823C229335173E24 + 1D120A0B04000000000000000000000000000000000000000000000000000000 + 172D4E4274413760052B52602B45813449AE220E6C1B177A2622922A273C3E6C + 1C4272223C5E7A344FA62928962C2A97221F5D293485272E7A324859385B2F3E + 6D12426D085679057F950389BC065DB4031640000000042C5F00000000000000 + 000000000000000000000000000000000000000000000002153D05A1C610729B + 056E9107668C0A48752350855240668C33429A3032B33725BD3820862311381A + 16812E1D6A392C853E2A673A355041506B3B5287314495231B92241C9E2815BB + 45279B1F1D2C0905351C18A43B25AE2E1A8A2614B9291E403864293157000000 + 0000000B1C35B927219327208331466C2B4527407103243E0000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0101000000000000000000000000050100300D07221518653121AB4520D24F1D + BA5428A150236C41239C714698C3A4A9B4879DB3AD9CB0A5DF5E27120000271B + 0E7FAF9B72D7D040939396CCADA0AE8FE56220C59460A2C19A9C592903000000 + 00000000027E1E117F2212732B1A481D1775291A852A2B3F2D53AE2216901F10 + 98221D552724472825AD4119C45C2C60240F531A05C3744194422455241E5330 + 2855262121070200000000000000000000000000000000000000000000000000 + 0000081B3315386000131E16345D633B61B5251C4227427A252EAF2010882C37 + 37406B02436F0F53844E4B6D5745689B2B304E385A5B242F2933525A3A4C4546 + 65125A86017391038EA70168970683EE0A79F90558A20C88FC00000000000000 + 000000000000000000000000000000000001061701041A000901001F251C5987 + 4B477359446B723E589636409D2B207A2C22583C445A2F2D591C185A1E169336 + 1AB93E1D6D3628AE281688230D911F07812A3192201673303CA4271FB33426C2 + 3B38061C3B140400762C17713F48B02311A02617BA2A1E4B4678003353000000 + 00070C3A3B6BA4272572354B4041731E3A6A0001020004060000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000160B0B0000000A0000 + 7A29058A8D6C93967DBDAA7BB2A06FD29056B19F886DAFA83237250000000D0E + 0B6EA09182E1CC61B19E75E1DAB2A37DDF4710D6531AB5B17FDD7A4042130200 + 0000350B0FAE201185241650272173200D84281394281F4F3A68AC22198E1E15 + 982525492F4C5F3528A7461FA75D3A4936303C0A00CB4D1BC6511E692E1E6325 + 1E5A231A86210E0B010000000000000000000000000000000000000000000000 + 0000000000000D1400010200395C64426D8C2F3F282F54000205693A61892A35 + 702C40364376134E8009628D095382513E695E3B5C7F3138453759240D148A38 + 4D574663274D77096EA5037D9B0493BE04A0D706ABFF0957D400000000000000 + 000000000001010200081300060B0EB0FF079CFD069AC00D739C224A7E4B3658 + 58334E69324B9D2927A42F21A42B1BA02717821A06581008A4251265352CA332 + 2A932913A92812A92A206B394620457C8D2F3F653B547F334C73374D5F3F4C40 + 35440C111AB0250F5E343570363D9E2D37962A27862E3D6F4570073F64001217 + 06406849406B752B41383E6B064778031E300000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000002031F0500D64714 + C79E66929274D37443C6864FCE875691B69AA0755B72F0DE23403D0000002419 + 0EB6BC8C85D2BC5C968C89E4CE9AA88D933916C63206D39257D56E3586250801 + 060962365EA82112852915871D074B25209E251289292662385D5D273C8A2224 + 992B2B742C2075301C832B107A533DC09059000000843217A4401B9A3B176728 + 1E6618098F1E0953100A00000100000000000000000000000000000000000000 + 000000000000000000181C08476B203E6F4C3E6B10385F00000009335B233E71 + 4C3B6044355A042E49000200003342135D932E4070354772663A5F1247760021 + 3826416E2C406D233E69154E750E5A7D05738D067ADC000000010D2400000300 + 0000073C70105AA70438820E85FF078DFB0487B30B739511668D18618B2E507B + 4F42697239517141538C3D4B73324B5D1618481E2A9F2F2D982E188A2C1BAB2C + 2BA42517A9312F266083204576463D673146731348828032424C3E5268302933 + 0D022C131EB02615792817A22A18434377A2303A34273F002947073550012B37 + 093B634B3D6641375E1E4A7B0434500001010000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000001020000000000000000014A281DB43710D0713B + BF965FBB6F3AC94919CB7B42C9794C7CAE9B70B0A262B0A20913140300008240 + 1BAFBB8E7ACDC25C816E88D6C6C5AB777441248D270BE76E31C25B2BAF3D1220 + 28439721219E210C9326145D1C1476211191251887303D1D3562000710812D40 + 81323C41303A4D2A2078331E81452DD16F381500002D1A177F4C358D34176934 + 24722A1D65180A59100838111904060E00010100000000000000000000000000 + 0000000000000000000000000000154D80164E80001620000000000000052941 + 124B7B1C47771B4676073A57003944043546094E790B618C324974264777014E + 65000B150551711360860865850B67810868900385980597E90A8CFF0851A704 + 2D570CA3FF0CA4FF096EC10769DC0894FF0485C9039BE7008AC0147299434B72 + 554E614943505C37410031553D1B2757190D624054B13528A92B18823A4A9A31 + 455D5C7638668B1651821D426D135780005B865A3C5C9E2A1A5C3C3EA3260E07 + 00005B3154B326168F2714B62B230F487D713F6526375900000000000000232B + 0B567F314273072A46155589021A260000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000008010039110B262021782A15D55D26CB6831 + B85429892C10CA4717AC764EAA8164648D7872DFD580C9B72C3B33000000C053 + 20A8AA7EA7C299639D8E8FBAA4B7BD8FC66633963114BF3E11BC461890391B0E + 161B7A212BA52014872620581B0FA0200F9F2611982A361F3969000000393D6C + 393968253857562D2368261B96371AD254213F160A190F0F7360517E3B234B2E + 25622C20752C209D2914B12414682230080A1500000000000000000000000000 + 00000000000000000000000005020A659205475D001A20000000000000000A0E + 0215200455720B547D0B5279026072002634026E85038099175A83244474026C + 84001E21000807026B83028EB50490C80495C6068FE40793E4078DF30C90FF0F + 96FF0CA3FF0698DF08A6FF029CDA0688AD0385BA1462A5354E82823748863C3B + 8B3F34BD29151C0100311620A42819603938773C4DAC271EAA2C2E333F6E5349 + 790784A801869E044759076E90007294274C7AA12F368D2412982917A0241E05 + 0000443B6AA32D2C982718BE27200758932C46791A4673000307001010037F98 + 124D7B104978000401046A8302414E0000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000431C17703020AE401AA5481CBC461B + 5B2F2281250BAD4319A5B9927D998351676387E3CD557E760000000000001F12 + 08E2934CA4AA856BB8BF81A98CCDBB82AD724A63372A34211B812A0D95381742 + 323D842A40802E3C8524147B1A09722524A22412A4241F65437402365C0F3259 + 2D375E7029205F281E83230E8F381AB23E162A1B1735120496613E813E286032 + 256021135F1F14A1260EA8211650182200000100000000000000000000000000 + 000000000000000000000000000001676F000000000202000000000000000000 + 000000000000028A9E046F85028996004D5C001014018BB309749E1A537D047B + 9901526B00000000080900121F0765D10457AB0A72FF0D83FF0D93FF0853BF07 + 48A60860E90491DB0969861A5E9337597632426F5D3B546238527A2E3F9A313D + 782B421F10211B477B903648A4281689373B643D65932F386B3F6309466A0362 + BB0070B402639800343E028BB3394F81952F3BA22211A1271D9E292C57213500 + 060C33497B9F2B319527228B394C0A538207476809739700101100000002131B + 0761870448610000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000007A200D4B2C2B833D2573371DB7431B682A1B + 27262990361CCD965D99CDB264B4AF75C8C185C4AF766B48000000000000AC2B + 07D95C218FADB497B8AD5A786BABA887E6632BB3330E000000170E0E69322035 + 384D4A2A3F8A2B30A5230D8319146F2113812F3C9F27292F2541000000013353 + 4E38489223109B220B7A2E2272321C86391C272026360A00C1491BBB3E174824 + 236F2C1D53231B0D020100000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000384D0000000032430476B00000090787FE028EAF076282029E + C602436B000000000000000000000000000000000000000000095DE9021B4500 + 0000057EB907688D106D9D1551700D527935456552445C4A496C3E4A7A153B65 + 002F44003A55464572A12F309E2D2D364E744942685E324A2D50910A7ABC012C + 59012E440668860B7198284A7E713A56722F4288231F8B3241553C63000E1C00 + 20322642747338507330458C3341264F86026785026F7C000908000204025C6D + 02879D0009090000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000002A0803881D0C772516632D21782F1858271A7B34203B1E1B + 511A119C4523C2BB8694BE9D619C8F91C8AA96B798A16C3B160000000000751F + 06CF6B3E95B6BBB9B29256513AC2B47FD0945CC146175B322A2B100D39232539 + 313E65385E9D21179B251A34213B9C1D0B892A2769385938457D0016250D080E + 772D359F1F0F982311692C216F3E2B63362B3414131F0A049F3E19C235116326 + 1988221167271C9B26112D070609020100000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000108150654B4010F29037C9E05A0 + E8064C9F00000000000000000000000000000000000000000000000000000000 + 0000068EC10B7FD1147DBB10738F26689B3F596C2D5E7505729600334712262C + 4C302C2B52716F42568E323D524C7106648B3366D50F70CB0A78CF07A4FE049C + F7029EC6056F942C4A774C4167592F44662D408533433C4171102A48000C1200 + 00000C4F854E40655E344F83334534507F007897038CC5000B1600070A01465C + 0028300002030000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000280703821F0D592B25572D282316124422205B322C722718 + 9F2A08F26B2A9FB3937F9A7D6D9C8CA1B498C59E5F672E0F110300091216A830 + 09C58660A1ADA4BC8D6876967D9C4D21D8945CE26C33A53512192A350B3D664D + 436A722B3E87262A752C364D202386232AAF1F0B7834471F467C033657000A11 + 581F2EA41E0F8C29166A29196B3C2B744B3B530D01090B0C783620A03313682E + 209B201294231184230FAC211429070600000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000884DF0585 + E2021B3500000000000000000000000000000000000000000000000000000000 + 00000C96FF0599F2008EBC217EB76067855B656B2090C1001A22000000733246 + 7C3F3A3B5266773952433D671D6D9A056080106CAE08A8FF059CE00681A40D6B + 92145C8936517D6C455F462C3D65334A633851454473063E6700000000000000 + 000005648231487B6D374C4032513D4B7D1A6894048BC3000202000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000004D10057D241281261458180B0000005D1506762819A03712 + DB692FB3AA7EA0B48D9E7F4D8DB495C3B07CCD4C153D0C020000000000006589 + 7A91BDA6BE8865C1A16DA2986C7551349A9A7ECA4D1F9A351464362C39222300 + 17286F2B436D33505C334497200D0909138E2F3E932423613B61034F7F17557B + 8F353DB52612622A214A241E793725B05D3380140401070A512C25662F1B712D + 1C6F2019A621149D210CAF241457294500102100000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000C75FE0B74 + F100000000000000000000000000000000000000000000000000000000000000 + 0000099DFC0E72CC2072E3605CC18740625D131B00092C02446B3C497C953744 + 77525633577E2D4470434B70077AA3028BA70493D00B5CDE0788F70698CD096F + 8E12588118406D012840314572523F6122457517558A00566100000000000000 + 141C068BAD12497A3B4D76513E68004B6D067C9F05A4DE0B9EFF000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000004F100BAC2212B32510400B030B0200080000422325A13416D14B1B + D37540C6A476883A1D86A997B59E6FDA9C5A971F0200000000000000000078D9 + CE8DA084998469CA7B47CC8B539B3910866843D7A266AA401F5E322B78241283 + 312F833442293D68812723AA251D0008122A3C6C623558662E482D457A664363 + AA2A1D95220E6C1E0F7F27159A2F16CE451B5F1D0920040060241A702D1D402C + 286F2E22A12A2665181C841B178B2D3A1A142400000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000042B + 7000000000000000000000000000000000000000000000000000000000000000 + 0000146D9D3845624254A5613E63393C62001E320040490A4E7978395D635486 + 1A729E20658C3B415D1867980282B00595FF023658000000011E44033F870077 + 7E05597540355044516B31416B0F5F8A08577B033C52003C4300000000000001 + 273A00545A045D78106993344A7D034E6B002E3C044794000003000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000100000000000000000000000000000000000000000000000000 + 0000000000410D0C1B0504320808010000A62D19712C1F562C2588381EB15E32 + C099675C725E917967A3A68AD4763ECB5B22AC37111309050000005F7E6F7BD7 + CA6C94827A8371D05F2EC282509352345B230FD05B26DF672DB8471D793C2D5D + 373A453B583A3A5E922220902A37000F21000B121640703A416B303D6B123E67 + 61212F7E150870261A8E26159D2F19B939144221161503005F1C0E6C291C533F + 38692517852D26981F162A1B3231284A18284800010200000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000013577931486B36436914619000060D00212406769E304F78633550494A72 + 0788C21275A51B4E720783A1099DE10A76FF000000000000021B40003C50056C + 832242742A5F8622597D12537D027D9503748F00040600000000000000000000 + 000000080E038FB9028AA71D5382087495002635000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000152445000000370B0758110445150E552B237E3823AA431ED16832E18449 + B067356F1E00B7A194A08975D54B13B0320A17050107030215020086907275CC + C463998E749C8EC76736B14A22A4836276684A360F01973D1E9341217A423356 + 3B3F483A45843741A82625683557001F3A00000003273C08466F0F5484065080 + 2F51649227149E271B9922148C2D208336233A2321000000540E048C3C297C45 + 2F4E2017892612A9250F92242521203A00142700040500000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000256189176385057A9402819A000000037AB40483A6444C7130416B0E78BA + 05A4FF0E6795037FA10692FF08B6FF043773000000000000025A980494BB1352 + 761358860486AF0A587B077B9D0281B400203000000000000000000000000000 + 0000000000013863049BDE09688A0B89B2005B7F000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 162EBE36418C2023A41C1098250E5D2E28612F2688381EA84D25BB6E478D280C + 48271690664AB1A398A96F5B9E2905712C16000000000000683D1B8EAF9879C8 + B96EA7977F8574BF4D1FA14A23A0542FBB865498330D130D15451C1A513D416E + 372E853633973134782D41433E6F00263C000000000102000507003540206887 + 5E51616E56539D232B92251D5D302576311F53261E20060065110AB74320983D + 22611F17682317952719AB26255B365F1E40760A416900000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000293C7049EE9034A880000000D8EFF0799E918688F1046702D688B0694E6 + 0998F30699CF0477C70000090B63CA0C7CFF00040C0D9BFF069CF4086D920673 + 950598EC0491CA0172850387C7045E9E00000000000000000000000000000000 + 0000000000042562099EFF028BBE0599CF066CBC000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000001162416497C353F714E30520E + 0606C2260FA72B14A22C18972713852C1B872F19A14A28A085624F5747501904 + B89160A68B5FA68E81AF725157312511191C000000000000592F13CBA46480C4 + B26E76688A826CA76034A331107B3520CA6330DE4F1C321D17000E132D433B09 + 3C541645784B33573A355B223E6A052C46000000000000000000000F183A4B74 + 8F2530A329334C365A892A1C5C281D5B2F2468190A000004571615B93615B72F + 137D24146E1C0C6C1F109F240FB82516982D3B4037650F4977064464000F1200 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000088DFF054EA10218390000000A87FF0390C6206D9F1858780A8CCE0A98FF + 0892F309A8FF08469F000000000000000000073F7F0993FF0685BF0576970698 + DE0786FA0794FA022D5201031504367200000000000000000000000000000000 + 0000000000031B3C085DB5020D3208ACFF0A8FFC032047000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000001C2F558B2A3ACA2919BC + 2B136F2417752D1E693325743726953D1DC54D1DD15825904018220200CB5322 + BB6F409C6D49A88869917B5E562C250000010000000A0000A6380FD09C6480B8 + A68F6047A09977C56C37682919592A22A73E1ACA511E73250F142D3402798D05 + 5E861E426F2F33582C3B670D48740003040000000000000000000E4069424172 + 29213B423A69AF29197E29176A281962281D9A1E0A0000001F17129A2F1AA730 + 1D9326148825177A1B0D79170F8B272E7A344B473D6813467602152000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000042354000000000000010D290C90FF0896E60B71A31C73A30897D10A89FF + 0A80FD10AFFF0000000000000622420953B60F96FF0797F3057DCF0495DD0B8E + FF0D82FF0968E900020D00000000000000000000000000000000000000000000 + 0000000000000000000000000000074F9B0D8FFF031A42000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000206403A669C303FBA + 2617902A166F2C1E6A2C206933247735237F3B24511A0C0500037A371ED15E29 + B5431A6D7C6E9D7D5C6CA89A6D423A410F03000000421104D65A21B6A36EA4B4 + 8B789278C4AE7EC9491A3D2629592C248A331C9F36117C4C3E2564710A69860B + 5281113B5E27375C223E680B54800030360000000000000000000A40670F3B64 + 1D2F5674324C9C2510742B1D6F33259926115C12091504013B1E196D34247C33 + 349B231694221774262072160E3917250B152704142300131E00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000033FA10E96FF0E95DA0A85BC116EC408A5FD0C86FF + 0E8BFF0F9BFF0000000000000947A11193FF0A8FFF098DFF0B81FF0899FF0F90 + F402215400050D00000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000004326F02204E000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000100000100000000000000010209111E101C62 + 1518B22312BF2A11852513802B1B3915110000014F220C71614E9D6B4CAE481E + 904D326B7E766B75646ECCC02332300A00000000000800009C451AE768277DAA + 9C908F66C7A66FED7233832E1A54201A6B291D7439248D3219514A4C1D555B00 + 4A540A29481B44700D4671043E5402525B00000000000000525B00344C213A65 + 873042B5281999240E7825169D462BBB27163A0A0B0000003418165A2D196A3A + 5391251C8B262C9927229D2210521D2600020500000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000001842771999FF0A9FFF0B93FF0E6ECF0588BF0BA8FF118BEB + 176CDE010000000000000000052E670C7FFB0E92FF0745920000000E87EC095A + EA00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000410E100000000000000C00001D0F0EAA3812CB663585634A9335167C3017 + 875F4873A0925E605D8FCDB8443F2D000000000000270D05A82D0AD4642CA5A7 + 7FA5764AB88F67D9672CA21F06891E096B241983301E372A2A733322A01C0764 + 1F1501527C0D4E73046D8A00222600000001627A014D58104F7B295289484472 + 903545762725841D148D291CC73C1896344100040F2C06007D210F5C2F264233 + 3E7F241B72304C5B365AA51E0D932D38241D3300000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000D24420944890C93FF0B9BFF0785C80A8EFF08A3FF1AA2FF + 2950860300000000000E29491783FD1190FF053890011636000000053D8E0743 + 8E00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000280904361F2085381FBF461AAB411E6F30216C321E8C4025 + 998467847C6C848A7598CAAA6A5739050000000000130E0C893116D4652CC387 + 53A35831C49F66BC52267B2F1B5A191475190A6A312559261D7E2E1C971E0A1C + 464903557A09537603798A00272B00000001536208739A1E4E8363416A982F3A + 9921196A1C16A72511982C24AF341F74313900132933070089211168281B5F22 + 1489291A5E334C103D728D2B3C79293639406D04243D00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000007244E0FA0FF0D9AFE09A1FF053E8D15ABFF0FA5FF + 387DCA09080C0000000B1A2E0E3260072B580000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00004B0E08601106601F147436267F3519903B1C6E28196F2E1F57281C853721 + 9F8C6D8F7B6687B9A2BAA372381D0E0000000B0403532A22A83816C75A25B87E + 53816647B3592BDB7138893A20742A26AB2916812C1B5C190E6D2D21AD210C6A + 4A48006A860461780285A100090D000000000A0A00242C04324D0B182B42263C + 792221772E39A02519793442733A3A482B260000002806049E1F0E70281B6A1E + 0E8F2515782F380630504A3D6B742838453A5F0E457400000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000002C6BBD1887FF139AFF0CA5FF08489007182A3996FF + 67AFFF10151F0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00005210089226155C2F27612D1F693A276D27208C2312582F28892F15AB4F2B + BD6242726350A2CBA3C4A26EA83D11050000020001130B0D6C200AAF3810BE76 + 448E6B4F76483AC0663CAE421A762E1EA22814C629100B01008B29159F240D9E + 363900798F006D79049CDE021C350000000000000000000000000A26457E2D3D + 952A2779344B8627324B3A554F36385F22150000003D131AA7251B902611421B + 16922510A3241F3540662145793338633B3B6610457000161F00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000003C537F348FF80A9EFF0E9AFF1363C0000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000001020400040A87 + 1C1BB92711822916662618782B18632C28A8210D7F2415682419A12D08D55F2E + C2633E81967EB7A177C95D2553130000000000000004090B612D1E512A20D867 + 3795656494614097805B9236197933289F2E31330807000000A01F0C9A2B277A + 51673F628900344E000000000000000000000000000504053E654E4372833042 + 38416C50375F8232393B3C52542A2398240D000004351C3190201DA320127234 + 26821E15A22313703146004571001E3314385F15406E075E8300353B00000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000809105771B03BA2FF0E90FE1998FF41659D000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000111324743451A9 + 241B9226135D271F5A261C722B1E9B231A9C200F8121117F2415B43910D07441 + A46145B37D55BF9C68D03B0A3710040000000000001A0C0C4D282351251DC271 + 578A6363641A03C05828BB4C22632E277C2A1B9F200A1A070E371724A72015A7 + 2B2B0078C900000000000000000000000000141504607F1F4C7C51365A294775 + 12497B4C3A6192271643343D71281C8A1D0B0000000E0A1666273F9E2C259240 + 296116139727226C4059084574000C0E0228370D4B7505385000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000202947698ADC163B6E2288F93F99FF233656000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000170A12962624AF + 230D8428176723177D29199F2811A4211D7F1A118D2A1A8D311DC25625D38C51 + 7C6441AC7F59CC8349B53D161C0A050000000000002C0B04571C165E392B9C81 + 7092826D3E2D217B2A13BE4B1D8E402479301F9F2813B92B22551C2930223C88 + 3D6827458A00000000000000000002537A0267760A5F8623406C274674044F75 + 1E4A6D9C2A27962611682315942715A8231D000000030E1B34325FAC3929A038 + 26661C1FA5200F8A2B343F406D114F7A01212D02596C055F7900272900000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000202050A0C1408080B4E93F567A8FF0D0D10000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000020C1657355B932934A3 + 261B71261D751D0C9A2716B5210A441C2FA8201B782929993C1CD2602D994E33 + 8C6740AE825AD55D25A93914502C280303040000003609018727167E5C457E86 + 75937F5FB566391207045C3C3588573F6E2C1C672C23901B090000000000030A + 0810194072000000000000000000024162067C980B59840757760B588700668C + 484069A32B286820138B210FA8210D541C2900000002172A4C3D69AD3A28972E + 2A4D19164F1E2D892E3A6D314E2D3F6B000E19000000002427013F4300000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000B0E187296F36180CC1D356A000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000004060318280F31563F3C6B932C328B + 240F931D0CA12211AE2A1F7F324F1313227330365F32287E2F19A67B52825E3B + A14B20CF733B8C2B0F4F17060000000000000200006113077C382B658F87836C + 557D604FCE45177B2F16531D11AB623D8B3B25772F218E2917BF281A461E2C00 + 060D00000000010000000004337E039ED4038FAB003E41000200058BAE503C67 + A5292A9C2010731E1AA5271B852D400402040003050C2F4F413B467E343B5B34 + 499926205415126B2720503D631F4578125082046F88000403000B1400040900 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000405094974D41F386D000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000042A3F144D804A41709C282CA92110AA + 29233B0D0E94282FC025164D4371871B05642A21692E20BF491DBE623080250A + AF582FD55421452C273D201A0100000000000C000084220E90846A73AFA36A71 + 65875642AE3D1583391F1B0C0CB74115BB411A8F2E1CB12513B7281F87365119 + 3F730B1D2C052029021635032B6A0458A0025E89037C93075F8A21578D6E3753 + 812D346B1816862B26A12526513B63000710010000410D014E2D2F4D3C544B35 + 4C9E23233426426F1E218D2A2F503C5D134E790661820492AD0494D101294800 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000010D2205122A000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000030400244069304F97272B7C324A34 + 162400000040233A87354E982B267D2C1D703322964123B34C21762910554631 + A3623FBA4A1D412C28331615020000000000000000231E0E9BAD86887764757C + 6F9D5E417F351D843C243F1C1B25140E8A3A237D38227E2E23A32C24A32D2B7D + 3A545A62BA082C64055CA4056BB60279B0045E71125481334475673957852C3A + 532B3F9E221884303C5F2D4B28365B000B13050000851F0D43333B403844443E + 60792A395037520D0E19513B61653250423B63224171085A7D01677C013D5600 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000010E1716386358386333457B18305200 + 000000000000172B394A815A2C305D2E217534217F5D4655413C2A0E04BD7240 + 8F4B2C99331269322A461207000000000000130300CC622AA9C1999A604C9B90 + 73A8482F6F27196D57477336293B07013217166E312655342B792B19912715BD + 1F043A71F00098F00084AC0693C3068AB1037FA719588657405B3B3B5B402839 + 6A2D398A292F3F406F1A3662000F1900000086201F93210C46303058302C513D + 5956305054384E851B120011231544712345772E3D681351810A5275047D9905 + 8FDF0555C4000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000011D290955811A45780B477600172400000000 + 060C121526AD2A2EA228157D2F257F28198C3923C75F30290C02945453B84A20 + 752F20602B1E4E2722882717370B030000000000007E3E1DC2B07CB05841B287 + 68C75D2D67281E69291AB55A349D3915551709631708AC2912962B19AA2A149F + 27169B43656267B82B72AC1068991A5E873C406F593D5D79252E0F1E397F3140 + 5F3A535D325212477B032D450001020000005512119D231158322A414C5A473D + 6229365F393E647C3134492E51000C1302374E036687035D720293AA0393BE03 + 72AB063A97000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000002293506436003253B042D410000001C365C54 + 436D5E34539E2321B024129828187C3421BC40187A2509301D1B89595D954127 + 68281B53302C2002005A11051C0502000000260E06D44916BCA071975D4BC69B + 71CB421E872B1760281D992E19BE401C5B2D231F0B07811B17811B12A12F37A4 + 2C305F3C663C45741E6FAC024F67036A8206304E1E385B0A3555503C63583857 + 2D416C243A650D5281002D39000000000E1C9C28309720104647464F48547330 + 3B1B3F6D1446755E344F4D365B052743000000004246000F0C01405504509C00 + 0006000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000001619000E0F0000000000000000000F1C35A7 + 2E36B62B1CA32A177B291C62362A7C38205B2E22230A05452921827A777D4D41 + 7A24156A271D410C0000000000000000000073311BCF5924C89D688C5336AD8F + 78C733147D241579281A8926149E32207A36287227193C0E0B0000041B101D27 + 365E12111F00152402121D002E360356732F26405942553D44653C3A60105681 + 0E4D7C031A2D075C76003C45000000243461A0231F8C231765352E893129712E + 42094775035475353F683F355C164571000F1900000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000010C2F00000000000003273B07335329325B6D273B9C + 211176231274231471312173554668271B34110D521605876B52827B67775E4E + 51100987210C7E180D000000000000000000230C05D0410FB78156845F35B95F + 55CA3D1982271764261EB22311862A1D622F245D2C25A3220C420B0700000000 + 000000000000202C017C9D07628833396437517923577F1B3F68214976026180 + 066283000A0C0009090007070000001E2B4F8D2A3883241E821C12AB1D0C4D40 + 67005076056A860D537E3D3459233F67055B79000A0C00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000004B4E3007685026F88064E7D37467B8B3449AE2923A3 + 2A24AA2719A12A14C34520B932152D0600331710C14217A5462C6486787D6153 + 922A18B1210F0800020000000000000000005530289C3916D6783A573F43A45B + 5DC43C21772E238A220FA42A27962728702D25732A179E2714911B0C15000008 + 66F9099EFF049FEB0F708C154A70105D8B007EA30B67880C4469047393007786 + 00636800080700000000000000070A11386355395AA11D0F6D232787282D6E36 + 5108648901677304668923396117456F055C7C00121600000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000014240C77A021598D10517D1C456E143D6E4A406C6B3A5D8D + 2F398F2C229D37299C381B5410082E130E753424B1301189624F7C7160766D5F + A8321D7B1F260000000000000000000F00004B2C2B953C1DD0612E323345A969 + 54A2451F622A24A12419A72418833046982B20812310852B1B973A55495CBA08 + 81FF0497D806738E0967830780A7048BD70389AC05627C03728C038CAE025987 + 000000000000000000000A0D042D441D4172812A39662736741F1F892B333344 + 720176990075850465811F446B0D42640A668101798D01193400000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000042B6B054B9F0463 + A70054650048540028390022353A48796C40607B3C59863746953334972B207F + 2A195F302C623431231713440D0468291D6C332287311EA2664E716E6290806A + B63B2099272F000000000001130302721E0E61342B9F36129B67467F5128C744 + 13AC4E27572E288B2C359A25255D395E8634419B27118B1E0669529B3877F30A + 95EC0391CF067BB0048BBD0590F00485D50393C301465D00212406A4FF04397F + 00000000000000000000171F0744673038625F3049622C366924309725262046 + 7806487502618902839B0B446C0D49670D5F7D01869B022F5E00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000021237099AFF04A2 + C80A7AA115608C264B7D4A3354782D3D82242A702A31A6201389200D75241775 + 291A8A2B185C190D000000731A0A6D291B512B248D2D1CC9603F796858989980 + B66249AB313F0F315E0000000400000F0403301A17793019905135C2501E4430 + 29A658347A321D77322EA42E312C2C525F2F4CB229144164D2576DE43F77F50C + 7DFB06517E069CFF098EFF0A73FF0998FF0653B900000000000001162D010D21 + 0000000000000000000000000323361F3F6C363C62882524362F4C5A334D4E38 + 5D0E538A0491D5057C9804667A084163067394018DA500000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000367 + 9F03758A135885245180494873673C5779374DAD291E972C28A6291BAC2716B7 + 2916611008000002751714B72F165A40387A2411AD3A26C36246A65E45B29872 + B46932020300000000000000000000000000642D265A2922B0461EAB3A144220 + 16A66C46752F1F4C2C292A437A0E3F6F463960884164614D87495EBE89395A64 + 375B0853910C9BFF0B77F00953CE000000000209000000000000000000000000 + 00000000000000000000101008445F024F7A443A5E6A2C42561F285F323A283D + 6C14406D0475A70490BD01678A03596A0574990485C1075DCD00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000000C + 1105A0ED0282A201738E0B4C7E303F6C503F6744447276334E7C31455B1B2157 + 161B0000004E1C1AC63620A9482B72231284271AA83833C76F4EA34C3FB18B6A + D65D271101000000000000000000004B0E05882513732819934628723B2A2009 + 03CB4B1C832E1C7C2B1F7D302D0E253A14223B524472B31F0A632B3783323C51 + 395E0B467C0C88FF031C4B000000000000000000000000000000000000000000 + 000000000000000000002225035C730651774C355933385A252D50782E3A2445 + 700C5DA10788F3035AA000091B025F7C027A8D0490C80862DE01143400000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000005 + 0B022C5900243200282E021E2E0A5B8505406508253F1315260E29470000023B + 0B0050241E743833AC34238A2718771E0F9B291BAE3E2FB775578B4C56B69468 + D25B24502011000000000000000000500F06901F0D6F2B1D783D287D5B481B02 + 007E361F86371E972A18B224123E273C00416A4D4673823045493150A4272736 + 48750B4A78054E8B000815000000000000000000000000000000000000000000 + 00000000000000000000282C047490174A76303459403B54132539463153433E + 6205668C037FA1025479000000023156048ACA037DA80A87FF084CBE00000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000141800050700000000000000000169160C8C + 25135A2E26583B49992923A7240F61211BA62C1EA1453B9A796F524464AC8059 + CF3D0D200903000000000000000000781C1CA729145F2C23602A20B658308728 + 09411D19674537663528A42814A8363549517D52406B2A406F0F243E60375A60 + 3A5D0E4F80026F82002324000000000000000000000000000000000000000000 + 000000000000045DA30397BC076A8A183D6622416B5E3B4F2F202F0739623439 + 61154F7B037A8D0489DC052876021A3D0775EB058AE802103200050E00000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000263A6A852E42AA26147C + 250F4B3C528C2F389A26216D2325A222108B3039A8422B91765C654036D5753B + 87361B2A1D1C0000000000003A1A2EB5292388220D6E241465291FAE2F10753C + 29292637AA431F7A35246E271AA5200E463E580A598D0235540010170B3B6439 + 406D363E690C5B860499BE002738000000000000000000000000000000000000 + 00000000000000000000000001303F0E4E75075C7A4051731E162900485C4640 + 5B19446D0E5980048E9F078DFC063893084EAA0A88FF095EE400000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000012226F3150AE26197B23137E + 2412A2271867344E78324687211190272983303568515FA661416E4729C3673A + 953A1A431F1B1B040000000000000024101E1D0400842615922412832D19674C + 4C4028378D2D0FBC38199627159F2D1E674D59177098001A270000000020290D + 5884264A770A5172013446000000000000000000000000000000000000000000 + 00000000000000000000161604617503748F0B64843734601A3F68002F385F45 + 5A1B617F095978038096021D3B0000000427550858D40C6EF100000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000001121C06355620457C912E3B932313842010B2 + 24135C3851234176832D32B322116B2F317C394575525F44383BB96F3C965030 + 8032175220171A0400000000000000000000691511AF260FA622166D33266364 + 6A51241C38191286372A802B21963138863A4E54446C073C6600000100000000 + 1820067C9B0B6288015967000100000000000000000000000000000000000000 + 00000000000000000002426603819C0291B10D537B2239630F4D7600070A3B47 + 741A6B96037CA00487A1048ACE06409B0000060107130850BF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000080C2638637C30449927257B2224A3231496 + 3041003F6A36406B94293344355E531C0F52404C525B7217475DD04612943E22 + 532D28290F0B00000000000000000000000084252FAF231495242783513E7184 + 7A8232206D140566281F612E23962A1A8A34424B417300447403537804728F00 + 04030048570393AB0293B404498E000000000000000000000000000000000000 + 000000000000000713056CC60265970381B40B5A851F3D5F125E77000000154B + 79263E690C6A9C0591FD0589D20B8FFF04285600000000030900000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000145520C4E7C2E43736939556E292E8F232089313E38 + 507D095282473B644A386161313D67281C7B2E1D8D4D380664818A3D1F9A4120 + 5A262089220E000001000000000000000000573D6B7225379826208B6D5B8A6B + 52C94E30330C0B7B1506942D187D3324A32612BA291B833C5C48477C0E5F8200 + 060500040C025C8F026A990654B4000000000000000000000000000000000000 + 0000000000000106120852CE0678E30286A50F50701C4867306A7F064563013F + 520F4D751346680580A50989FF0B7AFF0B68EC0851AA01090D00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000202D002E380369840E4C78493F63922B305425347C334A3C487200 + 64830E355A2D3C6930416B952B1F87261384371E9939163E0700835F47773520 + 712819A5220F000000000000000000000000112B4F3F2E52AD3F368A6A599073 + 5EB84228622B1F4B120C801B0FC13822A6311F90241B952B2E503A5B0C213B00 + 202B001213000000000004032457000000000000000000000000000000000000 + 000000000000000000064895068EEE0482A5074B63115F803A5F801529490022 + 2304728A0B5B790955710688B20693EF0C9DFF0F9FFF0E80FF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000015A75048AAC0D507C303F6A54395B2D2E4D672C34593C62214F7F00 + 1B1E06365343426D803842942C1D6F30206F433133221D7F2608A8512F5B2A20 + 6F2B1CA929144D100F000000000000000000043154573C61B74D3F877561A46A + 569B3F366434336D1F0D380E137D37458A3A3898313874364E693C5A4744741E + 5787036E89036290000B15000000053B96000000000000000000000000000000 + 000000021436095CBB0A96FF0496D7037A9B07567B057A971F67A4214272001B + 22014E690585A6076C8A067492047CB70682F40C7BFF02132D00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000004475E1C3E6C373F654D3B4F2D2E518135422D406F19548500 + 666F0551781653797D382F75241467312598472C381C16793016A733135B2923 + 561F13911D0E631413000000000000000000193C67833752B35D5098634AA96A + 5DAD3F2C503139862C1A6D1309140C0C61312E4D3F52843646264B7E0C58890D + 527D0276930388CF087BE00779E60D91F1000000000000000000000000000000 + 00000001183D0E8BFF0C89FF0549A500698006709C0382AF0F6FC41F457D014B + 59032C5B0586E4058FE50484AF0681C00588D10A80FF0740AC00112900000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000101010000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00001C2D017A9108638606678B414B6B5B27361E3C6B60395A05609003344500 + 1B1F057D9443516382382A9C2413972F19AF39123E140E5D302476321E8D2616 + 9D27120B010000000000000000000003425E1345776D4850B3A377AF5842B265 + 548F434A862617732516B8281D42192A6212027D30268F2816B12D265E476C1D + 779C0D68900A7A9F0997C306A7D4075BC4000000000000000000000000000000 + 0000000000000000000000000321540381B70484C20782F80C5B820F43670266 + 7A000B11000000074DBC0992FF088BFD0A90FF098EFF0D96FF1089FF1A6BCB06 + 0F1C000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000003 + 0B077FE90284A9008CAC1C4F76473C650C2431083F65354470096E9100778B00 + 49612B668EA1262AB226209C271A88352245251A43161067382D602B21952318 + B124106B191B0000000000000000000000000D0C0EAF390ABE865B9B4F4EA664 + 5B813E40932820892919A62B1F42203718070A9B2117A6291FA42414982B2E72 + 344E3D426E3B4C74135783057DA500375502375B04346106386204275D041120 + 0000000000000000000001070751B60680D50789FD087AF409719B0C4A64047F + 9D0259870000030000000C79FF0748A90C74F60E8DFF0B87F90A75E51187FF29 + 5DA2000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000955 + BF057DE50180A40A6C98233D681C497701283604576E2044730C72980181B600 + 395E1A3E6C83324C9D2D28662A20692F2036120F6E1607914A325E251A9A271A + 9E25256C273B000000000000000000000000000000923515A76D4B685269A360 + 536546599A2E2F832415B33B2B6A3C5B00315817070B633D6491334383324379 + 34476136554A3F5E3655781D49710B79A10894D509A5FF10B3FF1094FF0A3468 + 0000000000000000000000060956BD0680EE0B87FF0889E9057B99074D650483 + AD035C9100000700000002183F000000021B4107306C1387FF05265306275114 + 2C4B000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000007419E0B7CF0079A + FF0493D507789A11486916517C03435A0000000082970C5F83096388187FCB3C + 50897C344EB32A1A8525136B3F328823115B150C832A10B136185F2118A42916 + 772128182345000000000000000000000000542B28A63E19B064413E51709B61 + 4E4C3F4D64405C9B1D138832318D3C405F2F302C04000027481329462F4A7D43 + 4271205688274C7D20567F0B84AD0796DE06A7F60892FF053472010E1700040A + 0000000000000000000007150A5FC80A82FF0850BD0A92FF0579B2026D80087D + A10677F102123700000000000000000000000000000004102200000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000A5AC2047B + D40379930860780E5C7F00889F01424C00000001133103A0CC0284A60D527D79 + 2E48AC230F7721199E2F18C5371C63110A251A198835299B28188C2513962311 + A3313A3C44740000000000000000000000001006048E3217A9673B234E6D8A5B + 4E68413C6937506F31449126246038503A4056972A168A1A1600000000364802 + 49660453720188A4047FA601778F0788F50C6EDF0F94FF010E16000000000000 + 0000000000000000000326570C7EFF0C77FF010E140B8FFF048AC2054D730585 + D00784E4095DCF00071300000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000012E + 50036B89067B9F0495BE035692000000000000000000087FFF029BF0245DA593 + 22237A2D34A02925A53526892D2E00040B673C456930329F241990261F7A190B + 7F232A543F6D05365A0000000000000000005C251D693225AD4C252E4B567869 + 5A564147523F5E8A2C2C4234597633484B43595D3A37A02E2556325407233000 + 0000000000004557046FB900030A000006000000000611000205000000000000 + 000000000000000000000000095ABF04347B0D8CFF098CF70772C20373940689 + E6096CE1020C2300000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000006327F0693 + FA048CC10590E8056CBC073C9D000000000000002F2B0A6DC01D5EAE4658AF4D + 3E6775375576353F5C363912101654191778434764302695282B942C327D1E19 + 17132505182C02131F0000000000001502029226116F31219949282D423FAF56 + 2B5145484645646B375761272F4B3D61543E5F5F4C559727138E314122345B01 + 354F000000000000000415000106000000000000000000000000000000000000 + 00000000000000000000070F021E430438840D7FFF0A8CFA0473A40775D30782 + CD0D86FF042F6B00000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000010B260C7AFB058F + F3098DFF0A70FB000C2300000600000001283E028FA6075978103E6708548A3A + 42679D291E58303278291A000000AA2B208263528D3F28552D43813249852D3C + 131425000000000000000000020104A5210F7C2B1D5C2C209A57385018065A6B + 79376477623B531D4473622C4344466809497A6E3C58A321168F27276E3B5C1D + 4977000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000A101A194C890D73F90D8FFF078DFA0463BC0869CE077F + ED0B88FF085ECC00020700000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000010B1A0A6DD90C90FF085B + D80C7BFA010D2B0000000CB0FF05A6FC0596E600697C096488184F76664865AE + 28228D231199271281190C00020BA43638977A64A0553E7E3445443C695F385A + 091A2F000000000000000000000000000000621A0B5B2A24A53616872505425C + 60415C6A45485AB72A16423A663C466C01678B0C6B9675345487292D61354D24 + 4B7D046B8A00383F000407000000000000000000000000000000000000000000 + 000000000000000000000000094EA70E94FF0C85FF0A7BFF0668C60586D40C7F + FF0A70F50B7AF708326500000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000010E1E0A66DC0954C30000 + 00053781000103000000055EB60792B4136C90205F8C4D3F676538597E2D3BA0 + 2F219D261D8F222023050411325FB141369F705BA1624E67415F00335A28406F + 07304C0002020000000000000000000C0205A92710842819823018502727407E + 924C68704B4D50A51F09144C732441710E6989008FA61B4C816138584A345347 + 416B1453820686AF012C39000000000000000000000000000000000000000000 + 0000000000000302031A477F0E79F80D89FF0D81FF063C8D0761CF0783F90D80 + FF0964D8010C2200000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000010D1B03295E0000000000 + 00000000000000000000000000003138084465213F6F4A3656712E3F8A2F3298 + 3C3B7134521D203B180300412E3A954543936C6195675A974854063D690A466D + 072C45000101000000000000000000671515B42416922716613C2B593751236F + B56D4F50992717BE1E04474D650E537E11557C0286AC0B6FAB404067393B605E + 364C1E5881046C85026586000505000000000000000000000000000000000000 + 0000000000000A0E163462A22076D80E4990021D44010A1F0A6CE3097DFF0E7F + FF0C7CFF03275A00000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000001 + 0603215D032264047AD201798C0F4669364168633D51433D636737537539443F + 446E06284A200603881F0B493239684552A96F5D916C63914F550D3F7401394C + 00191F0000000000000000000000000F0A169E25238A2714743624B33F220002 + 0B653026832A1BA426284B48710077990A56730481A0069EFF1368A42B4C751A + 33523A46740B729F029DEA0662DB051F5E000000000000000000000000000000 + 000000000000000000040405050A1001000000000003265B0C80FF0A77FF0E82 + F80C6CE608326500000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000C172602060E02040A000000063B + 810E9AFF09ACFF068AB1115D7C185B860E658E134F804840643A465D4F353D11 + 4568000000671A1C8D2717463B4483445295675D7F7371B160542F4C74007B9B + 002B3100000000000000000000030864395FBB26137923138F2613B33617140C + 0D8D2E197A3322A8260E983A4D2A649907799D025F8100202A0491B326577B44 + 4A5E084B701F557908799406A1F30B9EFF084292000000000000000000000000 + 0000000000000000000000000000000000000000000323510D7CFF0A75FF0C81 + FF1A64C20C182500000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000003A97FF1474D5156BC00A57BF0C79 + F70A7DF1045FA20385B5058ED5018FC10672993F4D7055545E783428751E0F04 + 0000171C339D2C3276312672363D7E3D46935953936D6086645E38406B085D8B + 02485C000000010000000000081D3340253C841B159923129A261A8233294820 + 1B681A0DB6351C932514A723127046740584C10493ED0332700595CD0877962A + 5C8D063E4E2B688A0B71990287A00766DF00010F000000000000000000000000 + 0000000000000001020000000000000000000000000B305E0E7CFF0A73FF0C77 + F91E84FF203E6601000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000D3D6D0DA4FF0CA6FF0D91FF0778 + DF067EF10469BF0794FF057CCD0F63A151476D8E3130684F54AD241E340B0C00 + 1E30403C689D2623931F0F9D282A344964805F617D5B64B970445D4344116885 + 029CC90131590000000000000000000000006B2431A9271E8B2A2D6B2C217722 + 134214107A342EA62D258A2A31783E671071D2068EFD0A64FA0367A5039CD818 + 598D06607A1C4A800F7CBD0692DD0791FF0B6FEB01122D000000000000000000 + 0000000000000000000000000000000000000000000B2A4F1470E00D7EFF0747 + 96246FCA4779C10A0C1300000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000030D0E9AFF089DF00A9BF306A7 + FF058AB30888B80577B03048725C3A5B7C273195242095313F33244000000001 + 2E4E69365684272B8F24246347622D4C5C705A5C4E55709C6147A9350C232B30 + 001B2700071000000000000000000000000073395B8E2F3D8E2F34722C1A9622 + 116B170D5428206D32337338543C40703942730D81FF0210420A79FF089EFF0C + 6B93028AAD065D800E5C7F068FD30E91FF0C82FF0652AB000000000000000000 + 000000000000000000000000000000000000000000101E32286FC50A7AFF134C + 8F0301000A0F1800000100000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 07080D0D0C1049649C011023165EB1041C31053F8B021F4F0787FF0388AE1153 + 7924699723537334406656334840355069334A3B427129355E02192D00161B09 + 45704E3F62882E31732F462747763C555564555F3E5168996E4D60291D2C1613 + 0000000000000000000000000000000224393144782C38658B2F33872C1AB937 + 235517237A18098626109F271961415F0A466F065A7C027AAC0C77FA0998EC03 + 8DB0077EE40242760586B3057A93099BFF0B89FF1374EE0F447D050910000000 + 0000000000000000000000000000000000000000001D25363C76C31A75E42C56 + 8C00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000141A29 + 5775B5507DCA2898FF1A93FF0C98FF0D9CFF099CFF0791DD0672970D649E1269 + 840A54711548713F4259204473304B752447780A557D000000000A0A00556B1C + 4C72763D4B62374660334C29578A2474805E55593460726B6A5C872D165D221A + 370B040000000000000000000000000000000A4371413A619C2D2D862014AF37 + 2B392532461820AF2518A12E1B942D2F6041652A46730E79A60C9DF4069CF407 + 9AF30B76EB0000000776CD0892E40585C80A95FE0E9FFF1098FF2A6DC2000000 + 000000000000000000000000000000000000000000111724364B6F3672C23F56 + 7E00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000090A11 + 465D90417DD41A8EFF0D8AFF0C8CFF0996FF0898F3088FD70A86E6117ECF1675 + 910F648813739E1A597F12608402708A044D6800606D00000051272A4E49513E + 415A5C394956283E40436A1864974F48456D483B1C71847C6D587A2E1868291C + 851D0E0E0201000000000000000000003840064973543B5F89282C98231B7637 + 445C2C273D141353273D953C44A02B267A2F3F523A61104D760774B30995FF0E + 9FFF021A410000000215290B86F70792F4088BFF096CDF052D5C08192C000000 + 00000000000000000000000000000000000000000000000012141E4D70AB222A + 3E00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 04040607090E050B170B4B8D0D9DFF0C98FF0C88FF0D96FF079EFF0384C70489 + BB0593E00290B8027D8D0397CB00495F000000000E0F411F399D2A1C49424931 + 52695938572536592B4472226482653C385958520C89A68B666664261959271F + 2C0A030000000000000000000000000042492B4E83673C6281272A822E3B6738 + 515B363C871C0D0400003C4F7D633E515F395A6F374F433A600E69B10C9DFF0D + 87FF000000000000000000095AD40F9DFF0C92FF0C8AFB0958C5000000000000 + 000000000000000000000000000000000000000000000000000000536CA70000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000A0D153E8DF42676E11958AC0C87FF0B76DA0A64EA0895FF0C8C + FF0A78FA04569E0458B20458A8000000000304243864A627266B4645476D7734 + 486C1A3D6926374D5E455D66444C2F7188674F5820709F4E4B68842E159B2410 + 6B150C050000000000000000004D59067C9E0B456C0033595D293C4C3E617235 + 49822C21AC2A1D2716270600006F342F4A455D28497A0B69911E67AA0A83B408 + 9AEE086FF500000000000007356F0542970F84FF0E8DFF0E99FF1B5FB4040000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000006080D3141620B0808000000072C59000000000D290E8BFF0538 + 8B010D27000000000000000000021C2713507D56385D733F665B567130628016 + 4A7328455C142C431B5C871D708D69403D814143315DB45D3939623525972512 + 9A2626070201000000000000000000002A2B00000001111F4A3C642249783A45 + 6AA721149C241C593A62090708A41F0D7A40398635441366910084A80487B403 + 8ED50B84FF0A5BD2032850134D880000001443822388FA0D7AED2E8AFE294065 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000003275E0000 + 0000000000000000000000292D024864314570662C3A575AAA2C73AC0B618509 + 668946465E00435C31476D3B73916957796F2E26251E32913D2474301F7E2614 + A72B2455243600080D000000000000000000000302033A4E284574144C7E1D59 + 7B93293296292750416E001D3047151D933740A4241B6E39562559920784C403 + 8BD40788ED0B9CFF0BA4FF12B0FF0000000E10172B4B7B051933467ED0385383 + 0100000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000036BA2047F9B1558844A3C632F34565D385C0D577E027F9D06 + 7698244D8700536B186788555565357FBE287FED2922408D3310982A15792416 + 8B1C10503966000000000000000000000000000000022834124F7C0A5B84186C + 927030479334325F4262003F5F000000262D4F763856853136503E6034497526 + 65870A88B8098DBF0BA9FF021A2D0000000000000200000000000B0D11090C12 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000050D00545A0E567D31416625365A5A364B1E4C830083C50491E60D + 6AA60D486A194F755A58815C5F7034739486516E651B14512922832A1FB12516 + 9F231B0B000000000000000000000000000000060A02627E067A95000F0E1166 + 964C39616230465E3B50374960193134002131104672245180624154353E601A + 4870154D700579A5046AAD0B7FFF042340074DA8040C17000000000000000000 + 0307110007130000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000423630677E00293C41064872F45642C385A1D587E0A64A80884F2078CFD08 + 6A910666851E4D6F7230545D5B7E4778CB4F72CB493D6C6824176C291C922A2D + 992D3B23244000000000000000000000000000050A025D7F0287AA0081981653 + 82463A5A54334E38476B5642488C20112B2C3D001013025B76255E7A41586D1E + 5E882070911175BA0888C3069DF40CA6FF0E9CFF1EA2FF1646801E212E1C1F2E + 496FC33864C00000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000B69 + D80A83FD058DE7057DAC1A48701649672743621168870481D20A63E9088BE105 + 68860286AC0D5EA577222D912B367546752479FC2170EF8E34317C301C962B2A + 54345921457B00000000000000000000000000000002294B013E69006C7D1068 + 8E423C5F3739592745735B545C9036306E314B020D17002E383B70906F4E504F + 6A92097DAD038DD5089AFF0B91FB0B9BFF097FEE1178E63765A94D7BC74C92EE + 569CFD6A8DE70000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000318 + 340681F004769314677F2163781537532061840573830891FF0C85FF0689D106 + 7690038DE32A4E9066385B6B375188260F6D2A2A4D2C4BAB3328952B179C2318 + 6F33500A365C0000000000000000000000000000000214330850CA0298D91361 + 8B193E683B455F21456E265D81556987743D5F2C44700000002217277E34469F + 2D322B80F41B6AB80785E00895FF0EA0FF1087FD1190FA1284E62197FD14A5FF + 37A3FF11182A0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000001020C88 + FF058CE2038BC91A71B70F3A620C587D0B7CB20486C60C9AFF0993FF0475B906 + 80D00984FF0A468023406AA92A208225149D1F0C4216157731259729269B2215 + 8B2F38414B81044E72000D0D000000000000000000031D540892FF058AAE0E6A + 8903547223446E087897105A7E5F395C86282E3F436F025476000100021F3B3B + 426B5B427D4D344E2C516E0D759B0988B20BA2FB0A9DFF0AA3FF08A2FF0E9BFF + 0F437F33568735507E6991E35C8BF95AADFF1D91FF0A60BA0000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000C1B0C78FF0B7E + FF0991FF0A74BD0D61930246710E768B0887D60A9CFF0A5BB80951BF0780E708 + 95FF0678E51D5EB773384F8A231EB436225F1C2857170F47373E7F314489292A + 6A293B2C3156083F5C012A3400000000000000030907479E078FE80795E80276 + AD00343C154C740977AF008CB425599156314E573551105C8A03668300050400 + 1B2919628E274F77204C73195576166E980E6E9B0E7DC60984F00886FC0C83F1 + 0B90FF0D9CFF1D9AFF3194FF5794F8779EFF3981DC032C5D0000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000060B141158B80D79FF0B83 + FF0A8CD7096F830282B00C55AB167DA5068CD50D8FFF000000031E440995FF06 + 8DF0205B975C3A587F2C38812B319439391725486F120262312E7E303A523A5D + 613554071C2F000000000000000000000000010D210858C60A74EB0440840116 + 360036460A6D8D087CA10489F20C6EBE334468413A5724557F007B9E00375800 + 00000038460383A514718F0E77B00E76941376BC057EB70A89DF0E80FE0B99F1 + 1598FF219AFF1F97FF3796FF5586E12D3B6300071E0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000314D7B1884FE0F8FFF0C91FF068E + FA1275AA138BE1001D35105C950C81E9068BE80EA3FF0A55CB0862CB0C89FF0B + 89FF0E4F7F542F447F303E5F3B5750333C33100C7318148B220F9D2A22224472 + 433D681647720000000100000000000000000000010002060006150000000000 + 000134530789BC0672870796FF067DD4235572363B5C3B4A621F6C860790E300 + 7EFF0000000244740492EF049BF30A96F70894F00B98FF0E9FFA0C9BFF0A94FF + 1298FF2590FF618AD76C95F17BB6FF0A10160000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000203031C5AA90A7AF80A7DFF087A + E80F81E8116AE80375B70779A60A93FF098BFF0A73FF0B56BE0B63C00B77FF0A + 80FE284C7B41426D43416C484457791D0708122670304994261D992B2A29507E + 104A76104F7F0034390000000000000000000000000000000000000000000000 + 01064B9E0692F20378A10792F20A92EF087EAB164D7A235569375D745A596181 + 34470A3459000000000000042B7D0A64EB0C8FFF0A70E00C82FF1489FD188FFF + 195EBC355E974A5E910D070900338D000F270000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000051C35075BC70A89FF0B8D + FF0C81EA044151056BC50585B10A92F10E94FF0A71FD0100001669CC0789EF0D + 6585184F790662896B384A7139359E20130F090D2C2D51A4373278293543496E + 005473085E800169770000000000000000000000000000000000000000000000 + 00042A6D0A88FF0691DE0953DE0972E6068FDE19638103557E2067993A74A862 + 5DA154417713527B013E4C011F37011129063C8500000006326C11325E366CBC + 1B29410000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000C1F381681FF0C8BFF0C82FF0A8C + FD0788CA0030380A69E10690EE0A8FF40F85FC138BFF0000001145770B99D605 + 66790280A32C537A862E3AA3251A692538001E3427466E743B4A73262D4A3F65 + 12557C035E6C015F760000000000000000000000000000000000000000000000 + 00021B460C7FFB098FFF0A61ED097AE20492CD1D7CA20B4D7307718A1180C335 + 6FDC5A478B3C3D61115D7F048CC70230660000000000000000000000000B0B0D + 0B0D140000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000002C3448347AD40B7EFF137CFF1681FF058E + E50588DA03356F0C76EB098DFF0989FA0C91FF2C77D40000000C65EF077EDC00 + 889D0A72B54F395E772D3B80354D032E511B0A0551353D4B3D576D2B42613145 + 1C5882007F92085FE3031C470000000000000000000000000000000000000000 + 000324570B7BFF0D8CFF0A69FF0C81FF068FED0B88EC0D5378107ECE0E7DA007 + 8BE8207CFA276BE12D56870D7994038DD70A65E30A62E7000815000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000303F5E3975C62B62A9257EE20D92FF057B + DF0B8EFF0427550112380F97FF0B89FF0C8FFF249CFF2F9EFF058CFE0580AF18 + 60853F3F656D32465C3D562F406F002C4A4B08007237343D4A653E385B2E3759 + 2A467410658B049AC803367200060C0000000000000000000000000000000000 + 000000000000000C73E80747A1032C520D9DFF0883B6037CA50C50A80D82E705 + 8AF20585D614619718476B16496F0D7EAF06A0F8097BFA02183A000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000E12204F619240649E1F86FE0B8DFF0881FE0A85 + FF0B7BF9021A410004071798FF0C8BFF0D81FF108FFF1EA4FF0797C60B729E2A + 4F752C3D5D5539502F4D7001405E070000872A37784036434E6A264269413D5B + 043D5B0A6B8C058DBE0795FF042D610000000000000000000000000000000000 + 000000000000000B418600040A1580FF0D98FF0589C2068EED0563910984CF0C + 90FF0B8BFF058AC31874950B5D78196C950883D40998FF0E93FF093A8410305A + 08101B0000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000B1F4435477A50669F5683D03385F2108AFF0A7EFF0A7EFD0D8C + FF0B5FBA0100000200001347881988FF108BFF277DEF003A77014A6514517627 + 4B692246723C4E66305D7000313D0C1E3575314976484D3F4C6E056184234C77 + 0D415B002F36012F490220440000000000000000000000000000000000000000 + 000000000000000000002A58921996FD0B94FF0795F70B72EA024369058ECA0B + 8EF50E8BFF0C8DFA0796EC0C72960B72A7067CB30A8FD20B91FD1295FF217CE1 + 0F151F0000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000E172B7298F75C90E32D89FF1188FF0F7AF70A73F61088FF0D79 + FA14355C04080C0000000504053E69AA2E86F33B87F50D6BB507637A185C8B13 + 63862460806854528A312D0F01000729465F37578B282D3F476F007D980F6291 + 1061860037430000000000000000000000000000000000000000000000000000 + 000000000000000000002C50851079ED0A92FF0EA0FF063DA2064DA2088EF508 + 92FA1486FB1B75EE178DFF0593E0107BC30562A31183FF0B8DFF0A8DFF0E7CFD + 123A740000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000273760475B90475C872260B00D72FB1083FF1589FF2C59 + 95000000000000000000000000202B434A88F02A96FF3C92D20377A20395D400 + 70993E74A890313E3A1D2F0006080D577D43395F6D30433043750088CF047EA2 + 076E870598EA0000000000000000000000000000000000000000000000000000 + 0000000000000000000009162A1591FF1395FF0C67E6070705032A570D95FF08 + 81FF0992FF187AE3207EE10E97FF0794FF0782CC056BB40A85EE0D94FF118EFF + 248EFF5D8DE1050101090E1902050B0000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000E0D0F1A7CF31984FF207AF23188FC4A5A + 8200000000000000000000050B197AF50D8FFF048CF92D97F10894FF0588E122 + 50834C60AB6B334E1A243F0031330B547F3A3F6354354E24446E0278B40593DE + 047D9B0597EA0209280000000000000000000000000000000000000000000000 + 000000000000000000005B92E92C90FF2562AD0000000000000217380C75EC0D + 8DFF0981FF128DFF2995FF3D8FFF0E97FE0B96FE0D79F50980EA0892F9178FFF + 2688EA4479C5618EE96790F42335610000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000181C2C5178B91A7BF7387FE14579C61D34541920 + 310000000000000000001859A90B90FF0B83FF0A75FF079EFF0590F40F6FA745 + 3B5A64365C2E43700014210005080376912C5174493550254D700686E10565BA + 026286089AFF0952BB0000000000000000000000000000000000000000000000 + 0000000000000000000026395B172A44090B10000000000000000000104C980F + 8FFF0C89FF0F66CD1A3B683074D5118DFF0E96FF0E84FD065BA60E8DFF0E86FF + 098AFF1387FF3F85E94257860304070000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000101034658894683E02F78DB5880C5627EC108090E0000 + 00000000161520454D721933541869CF0A6BFF0C81FF0896FA0F6F9122487226 + 3C5E35466F07517700151400569217788C3D435B21415E203D660493CC04549E + 074CB20A8FFF0A5ADC0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000025497B1A + 78EF1A8DFF1180F80417300607083195FF0998FF0D92FE078DF4062C6C1790FF + 0E8BFF178CFF1880F64366A430395E0000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000002537656B8ADC4578C55D85CE607AC30C101E0000002935 + 576EABFF3986E7309DFF1887FF0B87FF0B9CFF0A9EF80988C11C62842D4A6536 + 4D6F046B9200434B000003206EC6545653325D7611426A245870086C8D07A4F4 + 05478F0A6BD30A5DE70000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000002C + 44694580D31987FF447FD74F5B873891FF1585FE1594FF1194FF0B7AF80858A6 + 2398FC2B8AFF4D8BEB4989EB6D90E33F8EFF0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000020B1D427DF76B8CDE4A61974C64A3466CC400020B0000000404 + 05386EB61998FF0A9DFF0C98FF0B9BF6098EE71778B407627C175371235C7E04 + 7A97036D9101497200060D7F1B204B6B862D66910855771B4E6C0E79B00590E6 + 065193031D500330710000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00006788D23C83E44C80D12933522935522F83ED2F92FF0F91FF1086EE1363C4 + 148EFF0D8EFF418CF3638ADE6186DA5992FF0241A30000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000006113A6BD5648FFA141D3503060D1325490000000000000000 + 000203061C66B71087FF0A97FF0592ED0570AC0679BB0C618E2C678D21729505 + 9FF700050D01254119375C7832524969B91574AC15708A06507D0B6D97078BDB + 0C9DFF0B75D9103E7B0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000556FB43C52825E84CC5C77C00000006491E6478EF1118DFF198FFD265093 + 095EC00B8EFF1286FF4390FC618EEC4F7EE61381FE0B59990760AD01111C0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000110241F8DFF163E880000000000000000000000000000000000 + 000000000000000B58E00776E5066C9D1475D90A7FA00F84C74C6A91258AD806 + 56BF000000020E1726446D55375E4360C00080B01375AD0F466E0286BB068BB8 + 068EEC0D9AFF0846A70000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000007090F000000465C966B8BE80000006A85D65090EF1288FF318EFF263959 + 1E3F6A2F88FA1185FF267DF54791FE6597FB629DFF53A9FF1FBCFF02182A0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000202000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000020000527A + C21D83F60F98FF0B99FF0691D90C8DFF0887F30293FF3673FB5A57973569C600 + 0710001619027E9B334062335DCF0D81FA047CC40789E70C65A1025C7F0875F8 + 0B96FF0B9BFF0F97FF2481FD14253D0000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000011331051E405CA3FF5699FF2B87FF4C90F6465688 + 000000505F8C4A92FB3C88F33274D1487DD0688EE52D78E901133A0000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000090D1844578B587BBD2890 + FF0F8DFF098EFF1193FF0E90FF0C8EFF0794FF167AEB4159C04348860A1A2E00 + 00000242660870902D4364334B930966A00888F2088FFF08708F047AC003164C + 07479E064F971B89F71E62B9111E320000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000C54B13A77C6546AA34591FA678AD725355B + 0000002D395C4658896B96F4548FF14287F35572B524386A0105100000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000E33764D66A55C95F7358EFF1085 + FF0F89FF1493FF1D7CE70E86FF098AE80A89F12367C24142781B436300111800 + 00000471C30977991641642E445E06749F0A93FF0B8DFF0681B6078EF4074CA9 + 00000000000010254204060A0000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000133E436ABE719FFF4577D6000000 + 0000000000000000013F69B96A98F86095FD5F95F16097FF217EDE0007110000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000B6ACB043884000000000000000000479CFF7497F7638ADA4677BE3766 + AB2B90FF486BA63672D50C9DFF0686CA1A79C8294A851B5475015D7C0006040A + 67CD049AEB15657C124C6A1959800386AA0B7CFF0C80FB0883EE0892FF074B9D + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000001D4F468DFF6EAAFF1978E5000000 + 0000000000000000000939791349993481E62C96FF5994FB3DA0FF1095EF0B68 + BE00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000A73EE25CAFF1559AE267CB1158EFF050000204690556DAF0704065E84 + D44393F61D91FF0E97FF058AD3126B89165B721C526F008BAB00283200000001 + 0B2A048DD30D75A90A63870C5773059AFD0E79F60F7FF40886F80B88FF0D77ED + 02183B0000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000004366626B1FF02285B065CCC000000 + 000000000000000000000000000000013D950978EA17A8FF1E86F81BA6FF0E94 + EA00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000013A7E39B4FF67A3FF659EFF54A2FF7C9EFF5381D04191F74193F12693 + FF1F95FF0895FF0B92FE0775AC0D5B890B75A3047C9A0684EA00000000091D0A + 75FF068FF714719F1060881A6B940492D61386FD118BFA0A76FF0A8DFF0D84FF + 0629550000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000003213B0861BA00050B000000000000 + 000000000000000000000000000000000000010B120E91FC01254D074E7F13B7 + FF0A5FBA00000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000104A80679FFF4C92FD3B93FF4D95F33B91FF198FFF0C94FF1392 + FF0697F4097CCD0972C5096EA00F7CBB088CD90788FA02224700000006337B09 + 84FF217FD5266A830D57770D70C40A91EE218FFF1587FF0962EF0D8BFF1378F3 + 0720410000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000060E0217340000000000000536 + 71031E3B00000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000105124F91FF6795F42D92FF1091FF1998FF1C9AFD0D92FF0D81 + FF0873F0076EE60483C20988F00791EF0B8EFF084AB300000007244E0C8CFF26 + 85FF3F648F286ABD0371B303788E0E9AFF238CFF0D2954064BA70B87FF2C86F0 + 1622340000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000303 + 001125060A140C0F190000002D3C60506EAE1878FA0F76F70E70F809377E087E + FD0882D71185FF0B91FF0C8DFF0B87FF0D88FF000812000000022436284C9458 + 509C3975DD0779C90568BC1082E20891FF0E88FF062C5D30466A1883FF1E75E8 + 466BAA0A0C110000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000429370540650436571A5EA5 + 359DFF5B84EB689DFF4C8CEB2881ED117FFF157CFB2578D1177DEF0A92FF1191 + F90D8DFF098BFF0E8AFF0E82FF063D8F06367800000000282F0E5F7B34529E35 + 6EF2127BFF038DD00552A10F6AE1098EFF0C93FF2891FF1B24384C87DA1D4E8C + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000063F98084D990E92E61AB9FF22AEFF46A0FF + 5F9BFF5E91EC3D84EC2787FE128BFF2292FF3293FE188CFE0D86FF168FFF2987 + F10C83FF0B8CFF2281EF0E46890000000000000441840379941D517B2A62C719 + 6DE00B8AFA0A88E505489C066B9F0C95FF0B8BFF1E7AE30000004056855276B8 + 181F2E0000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000005010114B3FF14C2FF19B4FF32A2FF5D9FFF6691EC + 5880CE4788EF5191F74C93FF538FF8668EE23089FF1B7FFA1F8EFF4379C51A81 + FF1769CD2375D8457BCB000000000000000000026EA3096D882B597E2B5A940D + 82EC0B88FD1183FE042C650573CE0B8EF41889FF1C87FF4169A90300013E4E7C + 06080E0000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000040D81F30C83DF0B8ADE0862DB1C6EEC + 5C9AFF619FFF5593FF5185FF6E93EA4E8AE73071C94589EC5981CE5A7DC34E76 + B9151921262D41495C8A0000000217340869DC0797F80F61862856842283CF0D + 95FF097CFF0A8AFF08437C0C72EE088CFF1890FF3A7FD8658BD50F111D000104 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000080C21A6FF + 38B4FF1782ED1191FF4D92FF5F91FF405484323C6271A0FF4A62A53442672129 + 3F0000000000000000000105100B7DFF0796FF0E78A72771A33C82CB1699F80C + 7EFF0C85FF0E8BE80879CD073C910E8FFF0987FF138DFF3F8AE778A8FF425FA7 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000002172016C3FF + 0C6FAC0016310941741452A41329570000000818304C98FF06183A0000000000 + 000000000000000000000845970A74EC0988FB0C69AC1278A01683C61485F40D + 7CFE1D85FF1585F11290FF0128602584F80F85FF1488FF1D86FF4868A20B0C15 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000110230956AA + 00000000000000000000000200000000000000040A0314290000000000000000 + 0000000012151E2A4D7D0F77F50C8EFF0788D4026E970E7FDA0689D71D83FF14 + 7EFF417CCF1386FF0C8AFF0862D30B0A0C3F76C83384EE3087FF4581D84B6AB2 + 0E1B350000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000} + Proportional = True + end + object Label3: TLabel + Left = 16 + Top = 312 + Width = 202 + Height = 13 + Caption = 'This application was created using:' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object Label4: TLabel + Left = 18 + Top = 270 + Width = 95 + Height = 16 + Cursor = crHandPoint + Hint = 'http://sourceforge.net/projects/apophysis7x/' + Caption = 'Apophysis 7X' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlue + Font.Height = -14 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + OnClick = DevelopersClick + end + object Label10: TLabel + Left = 16 + Top = 352 + Width = 221 + Height = 13 + Caption = 'Flam3 - cosmic recursive fractal flames' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object Label11: TLabel + Left = 16 + Top = 370 + Width = 187 + Height = 13 + Caption = 'Copyright '#169' 1992-2015 Scott Draves' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + end + object lblFlamecom: TLabel + Left = 16 + Top = 386 + Width = 79 + Height = 13 + Cursor = crHandPoint + Hint = 'http://code.google.com/archive/p/flam3/downloads' + Caption = 'http://flam3.com' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsUnderline] + ParentFont = False + OnClick = DevelopersClick + end + object Bevel1: TBevel + Left = 16 + Top = 398 + Width = 410 + Height = 9 + Shape = bsBottomLine + end + object Label6: TLabel + Left = 145 + Top = 130 + Width = 110 + Height = 13 + Caption = 'Copyright '#169' 2005-2009' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + end + object Label7: TLabel + Left = 145 + Top = 150 + Width = 71 + Height = 13 + Cursor = crHandPoint + Hint = 'https://www.deviantart.com/zueuk' + Caption = 'Peter Sdobnov' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsUnderline] + ParentFont = False + OnClick = DevelopersClick + end + object Label8: TLabel + Left = 145 + Top = 165 + Width = 53 + Height = 13 + Cursor = crHandPoint + Hint = 'https://www.deviantart.com/utak3r' + Caption = 'Piotr Borys ' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsUnderline] + ParentFont = False + OnClick = DevelopersClick + end + object Label9: TLabel + Left = 16 + Top = 165 + Width = 70 + Height = 13 + Caption = 'Ronald Hordijk' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + end + object Label12: TLabel + Left = 16 + Top = 130 + Width = 110 + Height = 13 + Caption = 'Copyright '#169' 2001-2004' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + end + object Label13: TLabel + Left = 16 + Top = 330 + Width = 69 + Height = 13 + Cursor = crHandPoint + Hint = 'https://www.tmssoftware.com/site/scriptstudiopro.asp' + Caption = 'Scripter Studio' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsUnderline] + ParentFont = False + OnClick = DevelopersClick + end + object Label14: TLabel + Left = 96 + Top = 330 + Width = 55 + Height = 13 + Cursor = crHandPoint + Hint = 'http://www.destructor.de/' + Caption = 'XML Parser' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsUnderline] + ParentFont = False + OnClick = DevelopersClick + end + object Bevel3: TBevel + Left = 16 + Top = 138 + Width = 240 + Height = 11 + Shape = bsBottomLine + end + object Label17: TLabel + Left = 145 + Top = 290 + Width = 65 + Height = 13 + Cursor = crHandPoint + Hint = 'http://www.nuget.org/profiles/gkiehne' + Caption = 'Georg Kiehne' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsUnderline] + ParentFont = False + OnClick = DevelopersClick + end + object Label18: TLabel + Left = 16 + Top = 290 + Width = 110 + Height = 13 + Caption = 'Copyright '#169' 2009-2014' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + end + object Label16: TLabel + Left = 8 + Top = 408 + Width = 5 + Height = 13 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object Label2: TLabel + Left = 16 + Top = 150 + Width = 77 + Height = 13 + Caption = 'Mark Townsend' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + end + object Bevel2: TBevel + Left = 16 + Top = 340 + Width = 240 + Height = 11 + Shape = bsBottomLine + end + object Label19: TLabel + Left = 160 + Top = 330 + Width = 77 + Height = 13 + Cursor = crHandPoint + Hint = 'http://www.regular-expressions.info' + Caption = 'PCRE for Delphi' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsUnderline] + ParentFont = False + OnClick = DevelopersClick + end + object Label20: TLabel + Left = 16 + Top = 416 + Width = 297 + Height = 13 + AutoSize = False + Visible = False + end + object Label5: TLabel + Left = 18 + Top = 110 + Width = 105 + Height = 22 + Cursor = crHandPoint + Hint = 'http://sourceforge.net/projects/apophysis/' + Alignment = taCenter + AutoSize = False + Caption = 'Apophysis 2.0' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlue + Font.Height = -14 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + OnClick = DevelopersClick + end + object Bevel4: TBevel + Left = 16 + Top = 300 + Width = 240 + Height = 11 + Shape = bsBottomLine + end + object Label1: TLabel + Left = 18 + Top = 190 + Width = 159 + Height = 22 + Cursor = crHandPoint + Hint = + 'https://sourceforge.net/projects/apophysis/files/Apophysis%203D%' + + '20%28experimental%29/' + Alignment = taCenter + AutoSize = False + Caption = 'Apophysis "3D Hack"' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlue + Font.Height = -14 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + OnClick = DevelopersClick + end + object Label15: TLabel + Left = 18 + Top = 250 + Width = 110 + Height = 13 + Caption = 'Copyright '#169' 2008-2009' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + end + object Bevel5: TBevel + Left = 16 + Top = 258 + Width = 240 + Height = 11 + Shape = bsBottomLine + end + object Label21: TLabel + Left = 145 + Top = 250 + Width = 51 + Height = 13 + Cursor = crHandPoint + Hint = 'http://lu-kout.deviantart.com/' + Caption = 'Jed Kelsey' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsUnderline] + ParentFont = False + OnClick = DevelopersClick + end + object lbApoTitle: TLabel + Left = 18 + Top = 8 + Width = 214 + Height = 40 + Cursor = crHandPoint + Hint = 'https://sourceforge.net/projects/apophysis-av/' + AutoSize = False + Caption = 'Apophysis AV' + Font.Charset = DEFAULT_CHARSET + Font.Color = clMaroon + Font.Height = 40 + Font.Name = 'Harlow Solid Italic' + Font.Style = [] + ParentFont = False + StyleElements = [seClient, seBorder] + OnClick = DevelopersClick + end + object lbApoVers: TLabel + AlignWithMargins = True + Left = 235 + Top = 12 + Width = 186 + Height = 29 + Alignment = taCenter + Caption = '"Phoenix Edition"' + Font.Charset = DEFAULT_CHARSET + Font.Color = clMaroon + Font.Height = 30 + Font.Name = 'Times New Roman' + Font.Style = [] + ParentFont = False + StyleElements = [seClient, seBorder] + end + object Label24: TLabel + Left = 24 + Top = 55 + Width = 100 + Height = 13 + Caption = 'Copyright '#169' 2021' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object Bevel6: TBevel + Left = 18 + Top = 65 + Width = 410 + Height = 11 + Shape = bsBottomLine + end + object lblAuthor: TLabel + Left = 145 + Top = 54 + Width = 86 + Height = 13 + Cursor = crHandPoint + Hint = 'https://www.donationalerts.com/r/fract_alice' + Caption = 'Alice V. Koryagina' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsUnderline] + ParentFont = False + OnClick = DevelopersClick + end + object Label26: TLabel + Left = 18 + Top = 230 + Width = 143 + Height = 22 + Cursor = crHandPoint + Hint = 'http://sourceforge.net/projects/apo-mods-jk/' + Alignment = taCenter + AutoSize = False + Caption = 'Apophysis JK Mods' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlue + Font.Height = -14 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + OnClick = DevelopersClick + end + object Label27: TLabel + Left = 18 + Top = 210 + Width = 110 + Height = 13 + Caption = 'Copyright '#169' 2007-2008' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + end + object Label28: TLabel + Left = 145 + Top = 210 + Width = 71 + Height = 13 + Cursor = crHandPoint + Hint = 'http://zueuk.deviantart.com' + Caption = 'Peter Sdobnov' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsUnderline] + ParentFont = False + OnClick = DevelopersClick + end + object Bevel7: TBevel + Left = 16 + Top = 218 + Width = 240 + Height = 11 + Shape = bsBottomLine + end + object Bevel8: TBevel + Left = 16 + Top = 178 + Width = 240 + Height = 11 + Shape = bsBottomLine + end + object lblPlugins: TLabel + Left = 18 + Top = 82 + Width = 230 + Height = 22 + Cursor = crHandPoint + Hint = 'https://sourceforge.net/projects/apo-plugins/' + AutoSize = False + Caption = 'Apophysis Plugins (download)' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlue + Font.Height = -14 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + OnClick = lblPluginsClick + end + object Bevel9: TBevel + Left = 15 + Top = 93 + Width = 240 + Height = 11 + Shape = bsBottomLine + end + object lblVersion: TLabel + Left = 360 + Top = 50 + Width = 57 + Height = 16 + Caption = 'v 1.0.1.0' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -15 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object btnOK: TButton + Left = 320 + Top = 410 + Width = 91 + Height = 25 + Caption = 'OK' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 0 + OnClick = btnOKClick + end +end diff --git a/Forms/About.pas b/Forms/About.pas new file mode 100644 index 0000000..069266e --- /dev/null +++ b/Forms/About.pas @@ -0,0 +1,163 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} +unit About; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, ExtCtrls, Global, Translation; + +type + TAboutForm = class(TForm) + btnOK: TButton; + Label3: TLabel; + Label4: TLabel; + Label10: TLabel; + Label11: TLabel; + lblFlamecom: TLabel; + Bevel1: TBevel; + Label6: TLabel; + Label7: TLabel; + Label8: TLabel; + Label9: TLabel; + Label12: TLabel; + Label13: TLabel; + Label14: TLabel; + Bevel3: TBevel; + Label17: TLabel; + Label18: TLabel; + Label16: TLabel; + Label2: TLabel; + Bevel2: TBevel; + Label19: TLabel; + Label20: TLabel; + Image1: TImage; + Label5: TLabel; + Bevel4: TBevel; + Label1: TLabel; + Label15: TLabel; + Bevel5: TBevel; + Label21: TLabel; + lbApoTitle: TLabel; + lbApoVers: TLabel; + Label24: TLabel; + Bevel6: TBevel; + lblAuthor: TLabel; + Label26: TLabel; + Label27: TLabel; + Label28: TLabel; + Bevel7: TBevel; + Bevel8: TBevel; + lblPlugins: TLabel; + Bevel9: TBevel; + lblVersion: TLabel; + procedure btnOKClick(Sender: TObject); + procedure lblPluginsClick(Sender: TObject); + procedure DevelopersClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + procedure SetTitleColor; + end; + +var + AboutForm: TAboutForm; + +implementation + +uses Main, ShellAPI; + +{$R *.DFM} + +procedure TAboutForm.btnOKClick(Sender: TObject); +begin + ModalResult := mrOK; +end; + +procedure TAboutForm.lblPluginsClick(Sender: TObject); +var URL : String; +begin + URL := lblPlugins.Hint; + ShellExecute(ValidParentForm(Self).Handle, 'open', PChar(URL), nil, nil, SW_SHOWNORMAL); + URL := 'https://onedrive.live.com/?authkey=%21AEhvN24LOQKCzBY&cid=828A1C23C17CA4C9&id=828A1C23C17CA4C9%211037&parId=root&action=locate'; + ShellExecute(ValidParentForm(Self).Handle, 'open', PChar(URL), nil, nil, SW_SHOWNORMAL); +end; + +procedure TAboutForm.SetTitleColor; +var clr: TColor; +begin + if IsDarkTheme or (CurrentStyle = 'Cyan Night') or (CurrentStyle = 'Calypso SLE') + or (CurrentStyle = 'Obsidian') or (CurrentStyle = 'Metropolis UI Green') then + clr := BrightColor + else + clr := clMaroon; + + lbApoTitle.Font.Color := clr; + lbApoVers.Font.Color := clr; +end; + +procedure TAboutForm.DevelopersClick(Sender: TObject); +begin + ShellExecute(ValidParentForm(Self).Handle, 'open', PChar(TLabel(Sender).Hint), + nil, nil, SW_SHOWNORMAL); +end; + +procedure TAboutForm.FormCreate(Sender: TObject); +var s1, s2, s3: string; + AVFont: TResourceStream; +begin + btnOK.Caption := TextByKey('common-close'); + if (LanguageFile <> AvailableLanguages.Strings[0]) and (LanguageFile <> '') then + begin + LanguageInfo(LanguageFile, s1, s2); + s3 := LanguageAuthor(LanguageFile); + Label20.Visible := (s2 <> '') and (s3 <> ''); + Label20.Caption := s2 + #32 + TextByKey('common-translation') + #32#32 + s3; + end; + lblPlugins.Caption := TextByKey('common-pluginlink'); + Label3.Caption := TextByKey('common-thirdparty'); + SetTitleColor; + if (pos(LowerCase(s1), 'russian') > 0) or (pos(LowerCase(s1), 'ðóññê') > 0) then + lblAuthor.Caption := 'Àëèñà Âèòàëüåâíà Êîðÿãèíà'; + if Screen.Fonts.IndexOf('Harlow Solid Italic') = -1 then + begin // shouldn't happen on modern OS + AVFont := TResourceStream.Create(hInstance, 'HARLOWSI', RT_FONT); + try + s3 := GetEnvVarValue('WINDIR') + '\Fonts\Harlow Solid Italic.ttf'; + AVFont.SavetoFile(s3); + except + s3 := AppPath + 'Harlow Solid Italic.ttf'; + AVFont.SavetoFile(s3); + end; + AddFontResource(PChar(s3)); + SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0); + AVFont.Free; + end; + +end; + +end. diff --git a/Forms/Adjust.dfm b/Forms/Adjust.dfm new file mode 100644 index 0000000..5cfa560 --- /dev/null +++ b/Forms/Adjust.dfm @@ -0,0 +1,2113 @@ +object AdjustForm: TAdjustForm + Left = 164 + Top = 279 + BorderIcons = [biSystemMenu, biMinimize] + BorderStyle = bsSingle + Caption = 'Adjustment' + ClientHeight = 341 + ClientWidth = 467 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Icon.Data = { + 0000010001001010000001002000680400001600000028000000100000002000 + 0000010020000000000040040000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000B7A2 + 93FF604632FF634935FF634935FF634935FF634935FF634935FF634935FF6349 + 35FF634935FF634935FF684E3AFF00000000000000000000000000000000BDA8 + 99FFFCFEFCFFE7E6E4FFE7E2DCFFE6DCD4FFE5D6CBFFE4CFC1FFE3CAB8FFE3C5 + B1FFE2C2ACFFC7AA98FF684E3AFF00000000000000000000000000000000C6B0 + A1FFFCFEFCFFD8C4B9FFD6C0B5FFD3BCAFFFFAEFE6FFCFB3A5FFCCAF9FFFCCAF + 9FFFF6DBC8FFC7AA98FF684E3AFF00000000000000000000000000000000CCB6 + A7FFFCFEFCFFFCFEFCFFFCFEFCFFFBFAF7FFFBF5EFFF75716EFF575451FF0000 + 00FFD2C2B5FFCBB2A1FF684E3AFF00000000000000000000000000000000CCB6 + A7FFFCFEFCFFDBCAC0FFDAC8BDFFD8C4B9FFFBFAF7FFA39D98FFFDFEFEFF5193 + A9FF0E1216FFB8B1A8FF78604DFF00000000000000000000000000000000CCB6 + A7FFFCFEFCFFFCFEFCFFFCFEFCFFFCFEFCFFFCFEFCFFA39D98FF88B7C7FF74CE + E2FF499AB2FF0E1216FF7C7266FFE5D6CB01000000000000000000000000CCB6 + A7FFFCFEFCFFDBCAC0FFDBCAC0FFDBCAC0FFFCFEFCFFC1B9B4FF4D9CB3FF8CE0 + EEFF62BFD7FF499AB2FF0E1216FF2D62753B000000000000000000000000CCB6 + A7FFFCFEFCFFFCFEFCFFFCFEFCFFFCFEFCFFFCFEFCFFFBF8F3FFD5CEC8FF57A0 + B5FF8CE0EEFF62BFD7FF499AB2FF0E1216FF2D62753B0000000000000000EBAC + 8DFFEAAA8CFFEAA989FFE9A27EFFE89971FFE68F63FFE58758FFE69265FFCDA9 + 95FF65A6B7FF8CE0EEFF62BFD7FF499AB2FF0E1216FF2855663000000000EBAC + 8DFFFFC3A2FFFEBF9DFFFCBB98FFFBB692FFFAB08BFFF8AB84FFF8A67CFFF3A6 + 80FFD2B09EFF73ACB9FF8CE0EEFF6CC4D9FF7D8686FF353590FF2F39834EEBAC + 8DFFEAAA8BFFEAAA8BFFEAA889FFE9A281FFE89C77FFE7946BFFE68C60FFE586 + 55FFE68D5FFFCA997FFF7DB0BBFFCAB8ACFF7385D1FF5E6CADFF353590FF0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000EBAC8D037F9FAD465E6CADFF708FDFFF5E76D0FF5E6CADFF0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000687EC2495E6CADFF5E6CADFF6579BC300000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + 0000FFFF0000000F0000000F0000000F0000000F0000000F0000000700000007 + 000000030000000100000000000000000000FFC00000FFF00000FFFF0000} + OldCreateOrder = False + OnActivate = FormActivate + OnClose = FormClose + OnCreate = FormCreate + OnDestroy = FormDestroy + OnShow = FormShow + DesignSize = ( + 467 + 341) + PixelsPerInch = 96 + TextHeight = 13 + object btnUndo: TSpeedButton + Left = 413 + Top = 10 + Width = 23 + Height = 21 + Hint = 'Undo' + Anchors = [akTop, akRight] + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFBD7C5F8D5C3FF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFF8DCCFF38A57E19571FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFEECBBAF08550DA86 + 5EFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFCA805CF08855EAC8B7FF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFE1CDC3DB78 + 47EF9367FF00FFFF00FFFF00FFFF00FFFF00FF8A4625954C28A4542EB65F34C7 + 693AD67240FF00FFFF00FFFF00FFAE5C36EC8652F2CFBDFF00FFFF00FFFF00FF + FF00FF954C28DF7336EA8249F39A6AF5B594FF00FFFF00FFFF00FFFF00FFA366 + 48E98452F7C2A7FF00FFFF00FFFF00FFFF00FFA3552EEC824BF38D5BEC9C76B6 + 866FE9D5CBFF00FFFF00FFFF00FFA97459E18254F7BE9EFF00FFFF00FFFF00FF + FF00FFB55F34F39A6AF49C71F294659D5330AA613BDAB8A7FF00FFF6C5AE9D64 + 46DE8051F7BDA1FF00FFFF00FFFF00FFFF00FFC7693BF7CAAEFBDDCBF4A376F3 + 9464B46239B0643EBF8162BB8460A15E39EE8B5AF6C8B0FF00FFFF00FFFF00FF + FF00FFD67240FF00FFFF00FFFBDECFF5A57EF49D72C97347B7663CB6653DE281 + 53F6BCA1F6CBB7FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFB + DACAF5A67EF6B696F5B28FF6B091F6C1A8F6C5AEFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFBE0D2F6C3A9F7CFBBF9DB + CDFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF} + ParentShowHint = False + ShowHint = True + Transparent = False + OnClick = btnUndoClick + end + object btnRedo: TSpeedButton + Left = 435 + Top = 10 + Width = 23 + Height = 21 + Hint = 'Redo' + Anchors = [akTop, akRight] + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFF8D5C3FBD7C5FF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFE19571F38A57F8DCCFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFDA865EF08550EECBBAFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFEAC8B7F08855CA805CFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + EF9367DB7847E1CDC3FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFF2CFBDEC8652AE5C36FF00FFFF00FFFF00FFD6 + 7240C7693AB65F34A4542E954C288A4625FF00FFFF00FFFF00FFFF00FFF7C2A7 + E98452A36648FF00FFFF00FFFF00FFFF00FFF5B594F39A6AEA8249DF7336954C + 28FF00FFFF00FFFF00FFFF00FFF7BE9EE18254A97459FF00FFFF00FFFF00FFE9 + D5CBB6866FEC9C76F38D5BEC824BA3552EFF00FFFF00FFFF00FFFF00FFF7BDA1 + DE80519D6446F6C5AEFF00FFDAB8A7AA613B9D5330F29465F49C71F39A6AB55F + 34FF00FFFF00FFFF00FFFF00FFF6C8B0EE8B5AA15E39BB8460BF8162B0643EB4 + 6239F39464F4A376FBDDCBF7CAAEC7693BFF00FFFF00FFFF00FFFF00FFF6CBB7 + F6BCA1E28153B6653DB7663CC97347F49D72F5A57EFBDECFFF00FFFF00FFD672 + 40FF00FFFF00FFFF00FFFF00FFFF00FFF6C5AEF6C1A8F6B091F5B28FF6B696F5 + A67EFBDACAFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFF9DBCDF7CFBBF6C3A9FBE0D2FF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF} + ParentShowHint = False + ShowHint = True + Transparent = False + OnClick = btnRedoClick + end + object PrevPnl: TPanel + Left = 8 + Top = 8 + Width = 216 + Height = 170 + Cursor = crCross + BevelOuter = bvLowered + Color = clAppWorkSpace + TabOrder = 0 + OnDblClick = PreviewImageDblClick + OnMouseDown = PreviewImageMouseDown + OnMouseMove = PreviewImageMouseMove + OnMouseUp = PreviewImageMouseUp + object PreviewImage: TImage + Left = 1 + Top = 1 + Width = 210 + Height = 166 + IncrementalDisplay = True + PopupMenu = QualityPopup + Proportional = True + OnDblClick = PreviewImageDblClick + OnMouseDown = PreviewImageMouseDown + OnMouseMove = PreviewImageMouseMove + OnMouseUp = PreviewImageMouseUp + end + end + object PageControl: TPageControl + Left = 8 + Top = 181 + Width = 451 + Height = 155 + ActivePage = TabGradient + Anchors = [akLeft, akRight, akBottom] + Images = MainForm.Buttons + TabOrder = 1 + object TabCamera: TTabSheet + Caption = 'Camera' + ImageIndex = 18 + DesignSize = ( + 443 + 126) + object scrollZoom: TScrollBar + Left = 112 + Top = 10 + Width = 259 + Height = 15 + Anchors = [akLeft, akTop, akRight] + LargeChange = 100 + Max = 3000 + Min = -3000 + PageSize = 0 + SmallChange = 10 + TabOrder = 0 + OnChange = scrollZoomChange + OnScroll = scrollCameraScroll + end + object txtZoom: TEdit + Left = 380 + Top = 4 + Width = 63 + Height = 21 + Anchors = [akTop, akRight] + TabOrder = 1 + Text = '0' + OnEnter = txtZoomEnter + OnExit = txtZoomExit + OnKeyPress = txtZoomKeyPress + end + object scrollCenterX: TScrollBar + Left = 112 + Top = 31 + Width = 259 + Height = 15 + Anchors = [akLeft, akTop, akRight] + LargeChange = 100 + Max = 10000 + Min = -10000 + PageSize = 0 + SmallChange = 10 + TabOrder = 2 + OnChange = scrollCenterXChange + OnScroll = scrollCameraScroll + end + object txtCenterX: TEdit + Left = 380 + Top = 28 + Width = 63 + Height = 21 + Anchors = [akTop, akRight] + TabOrder = 3 + Text = '0' + OnEnter = txtCenterXEnter + OnExit = txtCenterXExit + OnKeyPress = txtCenterXKeyPress + end + object scrollCenterY: TScrollBar + Left = 112 + Top = 55 + Width = 259 + Height = 15 + Anchors = [akLeft, akTop, akRight] + LargeChange = 100 + Max = 10000 + Min = -10000 + PageSize = 0 + SmallChange = 10 + TabOrder = 4 + OnChange = scrollCenterYChange + OnScroll = scrollCameraScroll + end + object txtCenterY: TEdit + Left = 380 + Top = 52 + Width = 63 + Height = 21 + Anchors = [akTop, akRight] + TabOrder = 5 + Text = '0' + OnEnter = txtCenterYEnter + OnExit = txtCenterYExit + OnKeyPress = txtCenterYKeyPress + end + object scrollAngle: TScrollBar + Left = 112 + Top = 79 + Width = 259 + Height = 15 + Anchors = [akLeft, akTop, akRight] + LargeChange = 1500 + Max = 36000 + Min = -36000 + PageSize = 0 + SmallChange = 100 + TabOrder = 6 + OnChange = scrollAngleChange + OnScroll = scrollCameraScroll + end + object txtAngle: TEdit + Left = 380 + Top = 76 + Width = 63 + Height = 21 + Anchors = [akTop, akRight] + TabOrder = 7 + Text = '0' + OnEnter = txtAngleEnter + OnExit = txtAngleExit + OnKeyPress = txtAngleKeyPress + end + object pnlZoom: TPanel + Left = 4 + Top = 4 + Width = 101 + Height = 21 + Cursor = crHandPoint + Hint = 'Click and drag to change value' + BevelOuter = bvLowered + Caption = 'Zoom' + ParentShowHint = False + ShowHint = True + TabOrder = 8 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + end + object pnlXpos: TPanel + Left = 4 + Top = 28 + Width = 101 + Height = 21 + Cursor = crHandPoint + Hint = 'Click and drag to change value' + BevelOuter = bvLowered + Caption = 'X position' + ParentShowHint = False + ShowHint = True + TabOrder = 9 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + end + object pnlYpos: TPanel + Left = 4 + Top = 52 + Width = 101 + Height = 21 + Cursor = crHandPoint + Hint = 'Click and drag to change value' + BevelOuter = bvLowered + Caption = 'Y position' + ParentShowHint = False + ShowHint = True + TabOrder = 10 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + end + object pnlAngle: TPanel + Left = 4 + Top = 76 + Width = 101 + Height = 21 + Cursor = crHandPoint + Hint = 'Click and drag to change value' + BevelOuter = bvLowered + Caption = 'Rotation' + ParentShowHint = False + ShowHint = True + TabOrder = 11 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + end + object btResetZoom: TButton + Left = 4 + Top = 102 + Width = 108 + Height = 22 + Caption = 'Reset zoom' + TabOrder = 12 + OnClick = btResetZoomClick + end + end + object TabRendering: TTabSheet + Caption = 'Rendering' + ImageIndex = 35 + DesignSize = ( + 443 + 126) + object chkTransparent: TCheckBox + Left = 112 + Top = 102 + Width = 81 + Height = 17 + Caption = 'Transparent' + Enabled = False + TabOrder = 13 + Visible = False + end + object pnlGamma: TPanel + Left = 4 + Top = 4 + Width = 101 + Height = 21 + Cursor = crHandPoint + Hint = 'Click and drag to change value' + BevelOuter = bvLowered + Caption = 'Gamma' + ParentShowHint = False + ShowHint = True + TabOrder = 7 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + end + object scrollGamma: TScrollBar + Left = 112 + Top = 7 + Width = 259 + Height = 15 + Anchors = [akLeft, akTop, akRight] + LargeChange = 10 + Max = 500 + Min = 100 + PageSize = 0 + Position = 500 + TabOrder = 0 + OnChange = scrollGammaChange + OnScroll = scrollCameraScroll + end + object txtGamma: TEdit + Left = 372 + Top = 4 + Width = 63 + Height = 21 + Anchors = [akTop, akRight] + TabOrder = 1 + Text = '0' + OnEnter = txtGammaEnter + OnExit = txtGammaExit + OnKeyPress = txtGammaKeyPress + end + object scrollBrightness: TScrollBar + Left = 112 + Top = 31 + Width = 259 + Height = 15 + Anchors = [akLeft, akTop, akRight] + LargeChange = 100 + Max = 10000 + Min = 1 + PageSize = 0 + Position = 1 + TabOrder = 2 + OnChange = scrollBrightnessChange + OnScroll = scrollCameraScroll + end + object txtBrightness: TEdit + Left = 372 + Top = 28 + Width = 63 + Height = 21 + Anchors = [akTop, akRight] + TabOrder = 3 + Text = '0' + OnEnter = txtBrightnessEnter + OnExit = txtBrightnessExit + OnKeyPress = txtBrightnessKeyPress + end + object scrollVibrancy: TScrollBar + Left = 112 + Top = 55 + Width = 259 + Height = 15 + Anchors = [akLeft, akTop, akRight] + LargeChange = 10 + Max = 1000 + PageSize = 0 + TabOrder = 4 + OnChange = scrollVibrancyScroll + OnScroll = scrollCameraScroll + end + object txtVibrancy: TEdit + Left = 372 + Top = 52 + Width = 63 + Height = 21 + Anchors = [akTop, akRight] + TabOrder = 5 + Text = '0' + OnEnter = txtVibrancyEnter + OnExit = txtVibrancyExit + OnKeyPress = txtVibrancyKeyPress + end + object pnlBrightness: TPanel + Left = 4 + Top = 28 + Width = 101 + Height = 21 + Cursor = crHandPoint + Hint = 'Click and drag to change value' + BevelOuter = bvLowered + Caption = 'Brightness' + ParentShowHint = False + ShowHint = True + TabOrder = 8 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + end + object pnlVibrancy: TPanel + Left = 4 + Top = 52 + Width = 101 + Height = 21 + Cursor = crHandPoint + Hint = 'Click and drag to change value' + BevelOuter = bvLowered + Caption = 'Vibrancy' + ParentShowHint = False + ShowHint = True + TabOrder = 9 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + end + object pnlGammaThreshold: TPanel + Left = 250 + Top = 100 + Width = 121 + Height = 21 + Cursor = crHandPoint + Hint = 'Click and drag to change value' + Anchors = [akTop, akRight] + BevelOuter = bvLowered + Caption = ' Gamma threshold' + ParentShowHint = False + ShowHint = True + TabOrder = 10 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + end + object txtGammaThreshold: TEdit + Left = 372 + Top = 100 + Width = 63 + Height = 21 + Anchors = [akTop, akRight] + TabOrder = 11 + Text = '0' + OnEnter = txtGammaThresholdEnter + OnExit = txtGammaThresholdExit + OnKeyPress = txtGammaThresholdKeyPress + end + object ColorPanel: TPanel + Left = 112 + Top = 100 + Width = 131 + Height = 21 + Cursor = crHandPoint + Anchors = [akLeft, akTop, akRight] + BevelInner = bvRaised + BevelOuter = bvLowered + BorderStyle = bsSingle + Color = clBlack + TabOrder = 6 + OnClick = ColorPanelClick + object Shape1: TShape + Left = 2 + Top = 2 + Width = 123 + Height = 13 + Align = alClient + Brush.Color = clBlack + Pen.Style = psClear + OnMouseUp = Shape1MouseUp + end + end + object pnlBackground: TPanel + Left = 4 + Top = 100 + Width = 101 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Background' + ParentShowHint = False + ShowHint = True + TabOrder = 12 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + end + object pnlContrast: TPanel + Left = 4 + Top = 76 + Width = 101 + Height = 21 + Cursor = crHandPoint + Hint = 'Click and drag to change value' + BevelOuter = bvLowered + Caption = 'Contrast' + ParentShowHint = False + ShowHint = True + TabOrder = 14 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + end + object scrollContrast: TScrollBar + Left = 112 + Top = 76 + Width = 259 + Height = 15 + Anchors = [akLeft, akTop, akRight] + LargeChange = 10 + Max = 1000 + Min = 1 + PageSize = 0 + Position = 100 + TabOrder = 15 + OnChange = scrollContrastChange + OnScroll = scrollCameraScroll + end + object txtContrast: TEdit + Left = 372 + Top = 76 + Width = 63 + Height = 21 + Anchors = [akTop, akRight] + TabOrder = 16 + Text = '0' + OnEnter = txtContrastEnter + OnExit = txtContrastExit + OnKeyPress = txtContrastKeyPress + end + end + object TabGradient: TTabSheet + Caption = 'Gradient' + ImageIndex = 11 + DesignSize = ( + 443 + 126) + object btnOpen: TSpeedButton + Left = 396 + Top = 82 + Width = 23 + Height = 22 + Hint = 'Open Gradient Browser' + Anchors = [akTop, akRight] + Glyph.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000000000000000000000000000000000000FF00FF00FF00 + FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00292929000000 + 000029313100FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FF00FF00FF00 + FF00FF00FF0000000000ADEFFF0084DEFF0084DEFF0000000000000000000842 + 73001894FF0000000000C6A5F700AD7BF700AD7BF70000000000FF00FF00FF00 + FF00FF00FF0000000000ADEFFF0084DEFF0084DEFF0000000000000000001894 + FF001894FF0000000000C6A5F700AD7BF700AD7BF70000000000FF00FF00FF00 + FF00FF00FF0000000000ADEFFF00ADEFFF0031424A0000000000105A7B0021BD + FF0021BDFF0000000000C6A5F700C6A5F700C6A5F70000000000FF00FF00FF00 + FF00FF00FF003110000018080000180800000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FF00FF00846B + 5A0029080000B57B5A00EFE7DE00E7CEC600AD735200290800006B73730052BD + FF0052BDFF0000000000EF842100DE631800DE63180000000000FF00FF003108 + 0000EFDECE00EFE7D600FFEFE700F7EFE700FFF7EF00E7D6CE0039100800637B + 940052BDFF0000000000EF842100DE631800DE6318000000000039292100D6AD + 9400FFEFD600CEAD9C00EFD6C600EFDECE00F7E7D600EFE7D600D6B5A5001818 + 10006BD6FF0000000000EF842100EF842100EF8421000000000000000000F7E7 + D600F7CEB500AD7B6300A5735A00A57B6300B5947B00DEC6AD00FFF7DE000000 + 000000000000000000000000000000000000000000000000000000000000FFEF + DE00EFB59C009C5A4200E7A58C00EFAD9400EFBD9C00CEA58C00FFEFD6000808 + 0000FFFFFF0000000000FFDEC600FFCEAD00FFCEAD000000000000000000FFE7 + D600F7B59C00A5523100E7948400E79C8400EFAD8C00D69C8400EFCEB5000808 + 0800FFFFFF0000000000FFDEC600FFCEAD00FFCEAD000000000063525200B57B + 5A00FFCEBD00CE846B00F79C7B00F79C8400F7B59400EFB59400945239007B63 + 5A00FFFFFF0000000000FFDEC600FFDEC600FFDEC60000000000FF00FF006342 + 3900BD8C7300FFDEC600F7CEB500EFB59C00F7BDA5008C4A3100080000000000 + 0000000000000000000000000000000000000000000000000000FF00FF00FF00 + FF0052424200000000005A392100422918000000000042393100FF00FF00FF00 + FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00} + ParentShowHint = False + ShowHint = True + Transparent = False + OnClick = btnOpenClick + end + object btnSmoothPalette: TSpeedButton + Left = 419 + Top = 82 + Width = 23 + Height = 22 + Hint = 'Smooth Palette' + Anchors = [akTop, akRight] + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 1800000000000003000000000000000000000000000000000000ABBDBCABBDBC + ABBDBCABBDBCABBDBCABBDBCABBDBCABBDBCABBDBCABBDBCABBDBCABBDBCABBD + BCABBDBCABBDBCABBDBCA7B3B24A00004D000046000148000B4A00174C00254D + 003150003C5102475305524C0955440A573B03593300600C002EABBDBCA60004 + A01021961430981A409C1D509F2466A12878A42D87A63398AA37A89F3CAD943E + AE8634B27A2BBC411472ABBDBC9F00039A102090132E92193D961C4D9923629A + 26739E2C81A03192A334A2993AA68E3CA78132AB752AB53E136DABBDBC9F0003 + 9A102090132E92193D961C4D9923629A26739E2C81A03192A334A2993AA68E3C + A78132AB752AB53E136DABBDBC9F00039A102090132E92193D961C4D9923629A + 26739E2C81A03192A334A2993AA68E3CA78132AB752AB53E136DABBDBC9F0003 + 9A102090132E92193D961C4D9923629A26739E2C81A03192A334A2993AA68E3C + A78132AB752AB53E136DABBDBC9F00039A102090132E92193D961C4D9923629A + 26739E2C81A03192A334A2993AA68E3CA78132AB752AB53E136DABBDBC9F0003 + 9A102090132E92193D961C4D9923629A26739E2C81A03192A334A2993AA68E3C + A78132AB752AB53E136DABBDBC9F00039A102090132E92193D961C4D9923629A + 26739E2C81A03192A334A2993AA68E3CA78132AB752AB53E136DABBDBC9F0003 + 9A102090132E92193D961C4D9923629A26739E2C81A03192A334A2993AA68E3C + A78132AB752AB53E136DABBDBC9F00039A102090132E92193D961C4D9923629A + 26739E2C81A03192A334A2993AA68E3CA78132AB752AB53E136DABBDBC9F0003 + 9A102090132E92193D961C4D9923629A26739E2C81A03192A334A2993AA68E3C + A78132AB752AB53E136DABBDBC9F00039A102090132E92193D961C4D9923629A + 26739E2C81A03192A334A2993AA68E3CA78132AB752AB53E136DABBDBCA60004 + A01021961430981A409C1D509F2466A12878A42D87A63398AA37A89F3CAD943E + AE8634B27A2BBC411472B1BEBD5C0000600A145A0C1D5B0F265D11305F163D60 + 1848621B51641E5B6621655F2468582568501F6A491A71260C44} + ParentShowHint = False + ShowHint = True + Transparent = False + OnClick = mnuSmoothPaletteClick + end + object btnPaste: TSpeedButton + Left = 373 + Top = 82 + Width = 23 + Height = 22 + Hint = 'Paste gradient from clipboard' + Anchors = [akTop, akRight] + Glyph.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000000000000000000000000000000000000FF00FF00FF00 + FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF00FF00FF00FF00FF00FF00FF000000000000000000000000000000 + 00000000000000000000000000000000000000000000FF00FF00FF00FF00FF00 + FF00FF00FF00FF00FF00FF00FF00FF00FF0000000000FFF0EF00FFF0E000FFF0 + EF00FFF0EF00FFF0EF00FFF0F000FFFFF00000000000FF00FF00FF00FF00FF00 + FF00FF00FF00FF00FF00FF00FF00FF00FF0000000000FFF0E000D0703F00D070 + 3F00D0703000D0601000D0602000FFF0EF0000000000FF00FF00FF00FF00FF00 + FF000000000000000000000000000000000000000000FFEFE000D0703F00FFA7 + 7000C2E9FF0040AEF700E0AF8000FFEFDF0000000000FF00FF00FF00FF000000 + 000056B9F50056B9F50056B9F50056B9F50000000000FFE0DF00D0703F00FFA7 + 7000C2E9FF0040AEF700E08F4F00FFE0D00000000000FF00FF00FF00FF000000 + 000056B9F50056B9F50056B9F50056B9F50000000000FFE0D000D0703F00FFA7 + 7000C2E9FF0040AEF700E08F5000FFE0CF0000000000FF00FF00FF00FF000000 + 000056B9F50056B9F50056B9F50056B9F50000000000FFDFCF00D0703F00FFA7 + 7000C2E9FF0040AEF700F0B08F00FFDFCF0000000000FF00FF00FF00FF000000 + 000056B9F50056B9F50056B9F50056B9F50000000000FFDFC000D0703F00FFA7 + 7000C2E9FF0000000000000000000000000000000000FF00FF00FF00FF000000 + 000056B9F50056B9F50056B9F50056B9F50000000000FFDFC000D0601F00D070 + 3F00E07F3F0000000000F0A07F0000000000FF00FF00FF00FF00FF00FF000000 + 000056B9F50056B9F50056B9F50056B9F50000000000FFE0D000FFDFC000FFD0 + C000FFD0C0000000000000000000FF00FF00FF00FF00FF00FF00FF00FF000000 + 000056B9F5000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FF00FF00FF00FF00FF00FF00FF00FF000000 + 000056B9F50000000000BBE5F900BBE5F900BBE5F900BBE5F900BBE5F900BBE5 + F9000000000056B9F50000000000FF00FF00FF00FF00FF00FF00FF00FF000000 + 000056B9F50056B9F50000000000BBE5F9000000000000000000BBE5F9000000 + 000056B9F50056B9F50000000000FF00FF00FF00FF00FF00FF00FF00FF00FF00 + FF0000000000000000000000000000000000BBE5F900BBE5F900000000000000 + 00000000000000000000FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF00FF00FF00FF00FF0000000000000000000000000000000000FF00 + FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00} + ParentShowHint = False + ShowHint = True + Transparent = False + OnClick = btnPasteClick + end + object btnCopy: TSpeedButton + Left = 350 + Top = 82 + Width = 23 + Height = 22 + Hint = 'Copy gradient to clipboard' + Anchors = [akTop, akRight] + Glyph.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000000000000000000000000000000000000FF00FF00FF00 + FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF000000 + 0000FFF0EF00FFF0E000FFF0EF00FFF0EF00FFF0EF00FFF0F000FFFFF0000000 + 0000FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF000000 + 0000FFF0E000D0602000D0703000D0703000D0601000D0602000FFF0EF000000 + 0000FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF000000 + 0000FFEFE000D0703F00C2E9FF00000000000000000000000000000000000000 + 000000000000000000000000000000000000FF00FF00FF00FF00FF00FF000000 + 0000FFE0DF00D0703F00C2E9FF0000000000FFF0EF00FFF0E000FFF0EF00FFF0 + EF00FFF0EF00FFF0F000FFFFF00000000000FF00FF00FF00FF00FF00FF000000 + 0000FFE0D000D0703F00C2E9FF0000000000FFF0E000D0703F00D0703F00D070 + 3000D0601000D0602000FFF0EF0000000000FF00FF00FF00FF00FF00FF000000 + 0000FFDFCF00D0703F00C2E9FF0000000000FFEFE000D0703F00FFA77000C2E9 + FF0040AEF700E0AF8000FFEFDF0000000000FF00FF00FF00FF00FF00FF000000 + 0000FFDFC000D0703F00C2E9FF0000000000FFE0DF00D0703F00FFA77000C2E9 + FF0040AEF700E08F4F00FFE0D00000000000FF00FF00FF00FF00FF00FF000000 + 0000FFDFC000D0703F00D0703F0000000000FFE0D000D0703F00FFA77000C2E9 + FF0040AEF700E08F5000FFE0CF0000000000FF00FF00FF00FF00FF00FF000000 + 0000FFE0D000FFDFC000FFD0C00000000000FFDFCF00D0703F00FFA77000C2E9 + FF0040AEF700F0B08F00FFDFCF0000000000FF00FF00FF00FF00FF00FF000000 + 000000000000000000000000000000000000FFDFC000D0703F00FFA77000C2E9 + FF0000000000000000000000000000000000FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF00FF00FF00FF00FF0000000000FFDFC000D0601F00D0703F00E07F + 3F0000000000F0A07F0000000000FF00FF00FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF00FF00FF00FF00FF0000000000FFE0D000FFDFC000FFD0C000FFD0 + C0000000000000000000FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF00FF00FF00FF00FF00000000000000000000000000000000000000 + 000000000000FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00} + ParentShowHint = False + ShowHint = True + Transparent = False + OnClick = btnCopyClick + end + object btnColorPreset: TSpeedButton + Left = 4 + Top = 82 + Width = 109 + Height = 22 + Hint = 'Click to choose random preset' + Caption = 'Preset' + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000C40E0000C40E00000000000000000000FFFFFFFFFFFF + FFFFFFFFFFFFF9F9F99E9E9EA3A7A69F9F9FC4C3C3EFEEEEFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0A0A0C6C6C5EAFAF9D7 + EAE8BEC7C59B9D9DAFAFAEDAD9DAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFA7A7A7B9B9B9E7E6E7E3F8F7B5C1BE838784D9E9E6C6D0CDA6ACAA9F9F + A0BBBBBBF5F5F5FFFFFFFFFFFFFFFFFFB0B0B0A8A8A8DEDDDDDCDCDCE3F9F7BA + C9C7403D3CC2D3D1EDFFFCCAD3CFC0C5C1B8BDBA959595FFFFFFFFFFFFBDBDBD + 9A9A9AD5D5D5D4D5D5DDDDDDDBEFEEE1FDFBDFF3F2C2D1CECBD9D69B9B993932 + 31D5DDD9939594FFFFFFFFFFFF878787C7C7C7BEBDBDCCCACADDDDDDE1F7F6C7 + DBDACBDDDCA2A7A6352F2EBFCDC99AA19DD0D9D5949594FFFFFFFFFFFF8C8D8D + CCCDCD544C4C9F9D9DE3E3E3E5FDFDA9B4B4332C2CBCCBCB9BA5A4CFE0DDECFE + FAE1EEE98F908FFFFFFFFFFFFF8A8A8AC3C3C38C8A8AC0C1C1E2E1E1F0FCFCE1 + F8F79FAEAECBE3E1EFFFFFABB0AF6F6E6DDBEAE7949997FFFFFFFFFFFF888888 + C1C1C1CDCDCDD6D6D6F3F3F3FAF8F8FAF9FAFDFFFFE6F8F7DEF6F4B6C1C04644 + 44C7D5D29DA2A1FFFFFFFFFFFF898989C0C0C0C2C2C2F2F2F2EDECEC67626274 + 6D6EFDFBFBF6F6F6EEF2F2EAF5F4DBEBE8E2F4EFA1A6A5FFFFFFFFFFFF868686 + BEBEBEE3E3E3FFFFFFF6F5F5A5A5A5A7A5A5F3F2F2F0EFEFEDEBEBEBE9E9EFEF + EFF8FDFB9A9D9BFFFFFFFFFFFF8D8D8DEDEDEDFFFFFFFAFAFAFFFFFFE8E7E765 + 5F5F817C7CF4F4F4ECECECE6E6E6F1F0F0AFAEAEA3A3A3FFFFFFFFFFFF858585 + E9E9E9FEFEFEFFFFFFFFFFFFEFEEEEA09E9E999595E0DFDFEAEBEBF0F0F0ABAB + ABA3A3A3FEFEFEFFFFFFFFFFFFD2D2D2969696979797BBBBBBE9E9E9FFFFFFCE + CCCC423E3E999696FBFBFBA4A4A4A9A9A9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1B5B5B5999999979797BDBDBDC7C7C7E5E5E5A0A0A0B1B1B1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBE1E1E1B3 + B3B39797978E8E8EB4B4B4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} + Layout = blGlyphRight + ParentShowHint = False + ShowHint = True + OnClick = btnColorPresetClick + end + object btnSelected: TSpeedButton + Left = 327 + Top = 82 + Width = 23 + Height = 22 + Hint = 'Change selected area' + Anchors = [akTop, akRight] + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000C40E0000C40E00000000000000000000A4CABA8AAE9C + 8DA5958F9B8C92928596887D977F749279768B767C877686857991817A9B9290 + B2EFEFEFF8F8F8FDFDFDE3FBEFE6F7EBEAF2E8EEEEE5F3EAE1F7E5DEF5E3E1F1 + E2E6EDE1ECE8E0F1E4DFF6767A9A647081FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC909EA3346574D4D6 + D6FFFFFFFFFFFFFFFFFFFFFFFFE0FFF3F4FFFBFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFE0E2E29DAAAF66AFC6658C98FFFFFFFBFBFFD1D1FFF7F7FFBCFFE44CFFB7 + 6EFFC5FFFFFFFFFFFFFFFFFFFFFFFFF2F2F23B3C3C4C5F66348FABE2E4E5FFFF + FF8F8FFF4C4CFF8F8FFFB8FFE34CFFB768FFC3FFFFFFFFFFFFFFFFFFFDFDFD58 + 58583C3C3C3A3A3A656D6FFFFFFFFFFFFF9696FF4C4CFF9696FFFFFFFFD8FFEF + F0FFF9FFFFFFFFFFFFFFFFFF7F7F7F4A4A4A393939515151FBFBFBFFFFFFFFFF + FFFBFBFFDEDEFFFEFEFFE4FAE47BE57BAEEFAEFFFFFFFFFFFFAAAAAA4C4C4C2F + 2F2F4A4A4AEBEBEBFFFFFFFFFFFFFFFFFFE8C5F3C46CE2E6C1F3A9EEA94CDB4C + 56DD56FFFFFFCDCDCD5A5A5A2727274B4B4BD2D2D2FFFFFFFFFFFFFFFFFFFFFF + FFCD83E6B74CDBCA7AE4EDFBED8BE88BBCF2BCE7E7E78E8E8E2B2B2B474747B2 + B2B2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2DFF9D493E9F0DAF8FFFFFFFFFFFF + DEDEBA5C5C4C3333314A4A4A959595FFFFFFFFFFFFFFFFFFFFFFFFF5E6F0C46C + A7D391BDFFFFFFFFFFFFFFFFFFFFFFFF53533736362637372B737373FBF1EDFF + FFFFFFFFFFF7EDF1FBF6F8E4BAD6B74C94B84F96FBF5F9FFFFFFFFFFFF949494 + 4A4A4531312A41413CE1A490DB704CEDB9A7F0DAE1B95174C06282F9F0F5D89E + C5E6C0D9FFFFFFFFFFFFBABABA9898986C6C6C323232E3E3E3E6997FDB704CEA + AB96ECCFD9B74C70B95275FDF9FAFFFFFFFFFFFFFFFFFFFFFFFF4949492F2F2F + 898989C3C3C3FFFFFFFCF3F0F3D1C6FEFBFAFFFFFFECD1DAF4E2E8FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFD7D7D75050509A9A9AFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} + ParentShowHint = False + ShowHint = True + Transparent = False + OnClick = btnSelectedClick + OnMouseDown = btnSelectedMouseDown + end + object GradSelection: TPaintBox + Left = 1 + Top = 43 + Width = 438 + Height = 7 + OnPaint = GradSelectionPaint + end + object GradientPnl: TPanel + Left = 0 + Top = 0 + Width = 443 + Height = 40 + BevelInner = bvRaised + BevelOuter = bvLowered + BorderStyle = bsSingle + Color = clAppWorkSpace + TabOrder = 0 + object GradientImage: TImage + Left = 1 + Top = 1 + Width = 435 + Height = 33 + Cursor = crHandPoint + Hint = + 'Right-click for context menu, Double click to randomize, Drag to' + + ' rotate gradient, Ctrl + Drag to stretch the palette' + Center = True + Constraints.MinHeight = 14 + ParentShowHint = False + PopupMenu = GradientPopup + ShowHint = True + Stretch = True + OnDblClick = GradientImageDblClick + OnMouseDown = GradImageMouseDown + OnMouseLeave = GradientImageMouseLeave + OnMouseMove = GradImageMouseMove + OnMouseUp = GradImageMouseUp + end + end + object ScrollBar: TScrollBar + Left = 120 + Top = 61 + Width = 179 + Height = 15 + LargeChange = 16 + Max = 128 + Min = -128 + PageSize = 0 + TabOrder = 1 + OnChange = ScrollBarChange + OnScroll = ScrollBarScroll + end + object cmbPalette: TComboBox + Left = 115 + Top = 83 + Width = 210 + Height = 21 + BevelInner = bvLowered + BevelOuter = bvRaised + Style = csOwnerDrawFixed + Anchors = [akLeft, akTop, akRight, akBottom] + Color = clBlack + DropDownCount = 20 + Font.Charset = ANSI_CHARSET + Font.Color = clWhite + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ItemHeight = 15 + ParentFont = False + ParentShowHint = False + ShowHint = False + TabOrder = 2 + OnChange = cmbPaletteChange + OnDrawItem = cmbPaletteDrawItem + Items.Strings = ( + 'south-sea-bather' + 'sky-flesh' + 'blue-bather' + 'no-name' + 'pillows' + 'mauve-splat' + 'facial-treescape 6' + 'fasion-bug' + 'leafy-face' + 'mouldy-sun' + 'sunny-harvest' + 'peach-tree' + 'fire-dragon' + 'ice-dragon' + 'german-landscape' + 'no-name' + 'living-mud-bomb' + 'cars' + 'unhealthy-tan' + 'daffodil' + 'rose' + 'healthy-skin' + 'orange' + 'white-ivy' + 'summer-makeup' + 'glow-buzz' + 'deep-water' + 'afternoon-beach' + 'dim-beach' + 'cloudy-brick' + 'burning-wood' + 'aquatic-garden' + 'no-name' + 'fall-quilt' + 'night-blue-sky' + 'shadow-iris' + 'solid-sky' + 'misty-field' + 'wooden-highlight' + 'jet-tundra' + 'pastel-lime' + 'hell' + 'indian-coast' + 'dentist-decor' + 'greenland' + 'purple-dress' + 'no-name' + 'spring-flora' + 'andi' + 'gig-o835' + 'rie02' + 'rie05' + 'rie11' + 'etretat.ppm' + 'the-hollow-needle-at-etretat.ppm' + 'rouen-cathedral-sunset.ppm' + 'the-houses-of-parliament.ppm' + 'starry-night.ppm' + 'water-lilies-sunset.ppm' + 'gogh.chambre-arles.ppm' + 'gogh.entrance.ppm' + 'gogh.the-night-cafe.ppm' + 'gogh.vegetable-montmartre.ppm' + 'matisse.bonheur-vivre.ppm' + 'matisse.flowers.ppm' + 'matisse.lecon-musique.ppm' + 'modigliani.nude-caryatid.ppm' + 'braque.instruments.ppm' + 'calcoast09.ppm' + 'dodge102.ppm' + 'ernst.anti-pope.ppm' + 'ernst.ubu-imperator.ppm' + 'fighting-forms.ppm' + 'fog25.ppm' + 'geyser27.ppm' + 'gris.josette.ppm' + 'gris.landscape-ceret.ppm' + 'kandinsky.comp-9.ppm' + 'kandinsky.yellow-red-blue.ppm' + 'klee.insula-dulcamara.ppm' + 'nile.ppm' + 'picasso.jfille-chevre.ppm' + 'pollock.lavender-mist.ppm' + 'yngpaint.ppm') + end + object txtVal: TEdit + Left = 306 + Top = 59 + Width = 49 + Height = 18 + Anchors = [akTop, akRight] + AutoSize = False + TabOrder = 3 + Text = '0' + OnExit = txtValExit + OnKeyPress = txtValKeyPress + end + object btnReset: TButton + Left = 363 + Top = 57 + Width = 79 + Height = 22 + Anchors = [akTop, akRight] + Caption = 'Reset' + TabOrder = 4 + OnClick = btnResetClick + end + object GradStatusBar: TStatusBar + Left = 0 + Top = 108 + Width = 443 + Height = 18 + Panels = < + item + Alignment = taRightJustify + Width = 75 + end + item + Style = psOwnerDraw + Width = 40 + end + item + Alignment = taRightJustify + Width = 75 + end + item + Alignment = taCenter + Style = psOwnerDraw + Width = 40 + end + item + Alignment = taRightJustify + Width = 75 + end + item + Alignment = taCenter + Style = psOwnerDraw + Width = 40 + end + item + Width = 40 + end> + OnDblClick = GradStatusBarDblClick + OnDrawPanel = GradStatusBarDrawPanel + end + object btnMenu: TButton + Left = 4 + Top = 57 + Width = 109 + Height = 22 + Caption = 'Rotate' + DropDownMenu = scrollModePopup + Style = bsSplitButton + TabOrder = 6 + OnClick = btnMenuClick + end + end + object TabSize: TTabSheet + Caption = 'Image Size' + ImageIndex = 14 + object gbSize: TGroupBox + Left = 1 + Top = 5 + Width = 188 + Height = 105 + Caption = 'Size in pixels' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 0 + DesignSize = ( + 188 + 105) + object lblRatio: TLabel + Left = 5 + Top = 78 + Width = 56 + Height = 13 + Caption = 'Aspect ratio' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + end + object pnlWidth: TPanel + Left = 4 + Top = 19 + Width = 88 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Width' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 0 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + end + object pnlHeight: TPanel + Left = 4 + Top = 45 + Width = 88 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Height' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 1 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + end + object txtHeight: TComboBox + Left = 91 + Top = 45 + Width = 78 + Height = 21 + Anchors = [akLeft, akTop, akRight] + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 2 + Text = '384' + OnChange = txtHeightChange + OnKeyPress = txtSizeKeyPress + Items.Strings = ( + '384' + '400' + '480' + '512' + '600' + '768' + '960' + '1024') + end + object txtWidth: TComboBox + Left = 91 + Top = 19 + Width = 78 + Height = 21 + Anchors = [akLeft, akTop, akRight] + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 4 + Text = '512' + OnChange = txtWidthChange + OnKeyPress = txtSizeKeyPress + Items.Strings = ( + '512' + '640' + '800' + '1024' + '1280') + end + object cbAspectRatio: TComboBox + Left = 70 + Top = 75 + Width = 113 + Height = 21 + Style = csDropDownList + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ItemIndex = 0 + ParentFont = False + TabOrder = 3 + Text = 'Custom' + OnChange = cbAspectRatioChange + Items.Strings = ( + 'Custom' + 'Maintain aspect ratio' + '3 : 2 ' + '4 : 3 ' + '5 : 4 ' + '16 : 9' + '16 : 10' + '21 : 9 ') + end + end + object gbPresets: TGroupBox + Left = 194 + Top = 5 + Width = 132 + Height = 105 + Caption = 'Presets' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 2 + object btnSet1: TSpeedButton + Left = 102 + Top = 18 + Width = 25 + Height = 22 + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFEFCECFC36465AA5556A452539F4F509A4D4D94 + 4A4A8F4747894444834141783B3C783B3C7239396E3637FF00FFFF00FFCF6B6C + F38E8FE68081AA4424473221C3B4ABC6BBB3CAC1BCCEC8C4564D489E3E339C3D + 36983931723939FF00FFFF00FFD16F70FF999AEC8687E68081715B4B473C348D + 7868EDE0D8F1E7E08F7F73A34135A2423C9C3D35783B3CFF00FFFF00FFD47576 + FF9FA0F59091EC8687715B4B000000473C34E9D9CEECDDD4857467AE4B43AA49 + 44A3423C7D3E3EFF00FFFF00FFD77B7CFFA9AAFB9FA0F59394715B4B715B4B71 + 5B4B715B4B7662527D6A5BBA5654B24F4CAA4944834141FF00FFFF00FFDB8384 + FFB3B4FFADAEFCA3A4F48E8FEC8687E68081DF797AD77172D16B6CC15D5CBA56 + 54B2504C894444FF00FFFF00FFDF8A8BFFBBBCFFB6B7C96360C45E56BE584BB8 + 523FB34D34AD4728A7411CA13B11C15D5CBA56548F4747FF00FFFF00FFE29192 + FFBDBECC6667FFFFFFFFFFFFFBF8F6F6EEEAF0E5DEEADBD2E5D1C6E1CABDA13B + 11C25D5C944A4AFF00FFFF00FFE59798FFBDBED36D6EFFFFFFFFFFFFFFFFFFFB + F8F6F6EEEAF0E5DEEADBD2E5D1C6A7411CCC67679A4D4DFF00FFFF00FFE99E9F + FFBDBEDC7677FFFFFFFFFFFFFFFFFFFFFFFFFBF8F6F6EEEAF0E5DEEADBD2AD47 + 28D771729F4F50FF00FFFF00FFEDA6A7FFBDBEE68081FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFBF8F6F6EEEAF0E5DEB34D34DF797AA45253FF00FFFF00FFF0ACAD + FFBDBEEF898AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF8F6F6EEEAB852 + 3F673333AA5556FF00FFFF00FFF3B2B3FFBDBEF89293FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFBF8F6BE584BB05859B05859FF00FFFF00FFF5B6B7 + F5B6B7F3B2B3F1ADAEEEA7A8EAA1A2E79A9BE49394E08E8FDD8788DA8081D67A + 7BD37475D16F70FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF} + ParentShowHint = False + ShowHint = True + OnClick = btnSet1Click + end + object btnSet2: TSpeedButton + Left = 102 + Top = 47 + Width = 25 + Height = 22 + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFEFCECFC36465AA5556A452539F4F509A4D4D94 + 4A4A8F4747894444834141783B3C783B3C7239396E3637FF00FFFF00FFCF6B6C + F38E8FE68081AA4424473221C3B4ABC6BBB3CAC1BCCEC8C4564D489E3E339C3D + 36983931723939FF00FFFF00FFD16F70FF999AEC8687E68081715B4B473C348D + 7868EDE0D8F1E7E08F7F73A34135A2423C9C3D35783B3CFF00FFFF00FFD47576 + FF9FA0F59091EC8687715B4B000000473C34E9D9CEECDDD4857467AE4B43AA49 + 44A3423C7D3E3EFF00FFFF00FFD77B7CFFA9AAFB9FA0F59394715B4B715B4B71 + 5B4B715B4B7662527D6A5BBA5654B24F4CAA4944834141FF00FFFF00FFDB8384 + FFB3B4FFADAEFCA3A4F48E8FEC8687E68081DF797AD77172D16B6CC15D5CBA56 + 54B2504C894444FF00FFFF00FFDF8A8BFFBBBCFFB6B7C96360C45E56BE584BB8 + 523FB34D34AD4728A7411CA13B11C15D5CBA56548F4747FF00FFFF00FFE29192 + FFBDBECC6667FFFFFFFFFFFFFBF8F6F6EEEAF0E5DEEADBD2E5D1C6E1CABDA13B + 11C25D5C944A4AFF00FFFF00FFE59798FFBDBED36D6EFFFFFFFFFFFFFFFFFFFB + F8F6F6EEEAF0E5DEEADBD2E5D1C6A7411CCC67679A4D4DFF00FFFF00FFE99E9F + FFBDBEDC7677FFFFFFFFFFFFFFFFFFFFFFFFFBF8F6F6EEEAF0E5DEEADBD2AD47 + 28D771729F4F50FF00FFFF00FFEDA6A7FFBDBEE68081FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFBF8F6F6EEEAF0E5DEB34D34DF797AA45253FF00FFFF00FFF0ACAD + FFBDBEEF898AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF8F6F6EEEAB852 + 3F673333AA5556FF00FFFF00FFF3B2B3FFBDBEF89293FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFBF8F6BE584BB05859B05859FF00FFFF00FFF5B6B7 + F5B6B7F3B2B3F1ADAEEEA7A8EAA1A2E79A9BE49394E08E8FDD8788DA8081D67A + 7BD37475D16F70FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF} + ParentShowHint = False + ShowHint = True + OnClick = btnSet2Click + end + object btnSet3: TSpeedButton + Left = 102 + Top = 76 + Width = 25 + Height = 22 + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFEFCECFC36465AA5556A452539F4F509A4D4D94 + 4A4A8F4747894444834141783B3C783B3C7239396E3637FF00FFFF00FFCF6B6C + F38E8FE68081AA4424473221C3B4ABC6BBB3CAC1BCCEC8C4564D489E3E339C3D + 36983931723939FF00FFFF00FFD16F70FF999AEC8687E68081715B4B473C348D + 7868EDE0D8F1E7E08F7F73A34135A2423C9C3D35783B3CFF00FFFF00FFD47576 + FF9FA0F59091EC8687715B4B000000473C34E9D9CEECDDD4857467AE4B43AA49 + 44A3423C7D3E3EFF00FFFF00FFD77B7CFFA9AAFB9FA0F59394715B4B715B4B71 + 5B4B715B4B7662527D6A5BBA5654B24F4CAA4944834141FF00FFFF00FFDB8384 + FFB3B4FFADAEFCA3A4F48E8FEC8687E68081DF797AD77172D16B6CC15D5CBA56 + 54B2504C894444FF00FFFF00FFDF8A8BFFBBBCFFB6B7C96360C45E56BE584BB8 + 523FB34D34AD4728A7411CA13B11C15D5CBA56548F4747FF00FFFF00FFE29192 + FFBDBECC6667FFFFFFFFFFFFFBF8F6F6EEEAF0E5DEEADBD2E5D1C6E1CABDA13B + 11C25D5C944A4AFF00FFFF00FFE59798FFBDBED36D6EFFFFFFFFFFFFFFFFFFFB + F8F6F6EEEAF0E5DEEADBD2E5D1C6A7411CCC67679A4D4DFF00FFFF00FFE99E9F + FFBDBEDC7677FFFFFFFFFFFFFFFFFFFFFFFFFBF8F6F6EEEAF0E5DEEADBD2AD47 + 28D771729F4F50FF00FFFF00FFEDA6A7FFBDBEE68081FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFBF8F6F6EEEAF0E5DEB34D34DF797AA45253FF00FFFF00FFF0ACAD + FFBDBEEF898AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF8F6F6EEEAB852 + 3F673333AA5556FF00FFFF00FFF3B2B3FFBDBEF89293FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFBF8F6BE584BB05859B05859FF00FFFF00FFF5B6B7 + F5B6B7F3B2B3F1ADAEEEA7A8EAA1A2E79A9BE49394E08E8FDD8788DA8081D67A + 7BD37475D16F70FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF} + ParentShowHint = False + ShowHint = True + OnClick = btnSet3Click + end + object btnPreset1: TButton + Left = 6 + Top = 19 + Width = 95 + Height = 20 + Caption = 'Preset 1' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 0 + OnClick = btnPreset1Click + end + object btnPreset2: TButton + Left = 6 + Top = 48 + Width = 95 + Height = 20 + Caption = 'Preset 2' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 1 + OnClick = btnPreset2Click + end + object btnPreset3: TButton + Left = 6 + Top = 77 + Width = 95 + Height = 20 + Caption = 'Preset 3' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 2 + OnClick = btnPreset3Click + end + end + object gbChange: TGroupBox + Left = 330 + Top = 5 + Width = 110 + Height = 105 + Caption = 'Output ' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 1 + DesignSize = ( + 110 + 105) + object btnApplySize: TBitBtn + Left = 6 + Top = 66 + Width = 99 + Height = 25 + Anchors = [akLeft, akTop, akRight] + Caption = 'Apply' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 1 + OnClick = btnApplySizeClick + end + object chkResizeMain: TCheckBox + AlignWithMargins = True + Left = 8 + Top = 19 + Width = 95 + Height = 40 + Alignment = taLeftJustify + Caption = 'Resize Main Window' + Checked = True + Constraints.MinHeight = 11 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + State = cbChecked + TabOrder = 0 + WordWrap = True + end + end + end + object TabCurves: TTabSheet + Caption = 'Curves' + ImageIndex = 69 + object CurvesPanel: TPanel + Left = 3 + Top = 1 + Width = 323 + Height = 97 + BevelOuter = bvLowered + Color = clBlack + ParentBackground = False + TabOrder = 0 + end + object tbWeightLeft: TScrollBar + Left = 111 + Top = 67 + Width = 75 + Height = 15 + Max = 160 + PageSize = 0 + Position = 10 + TabOrder = 1 + Visible = False + OnChange = WeightChange + OnScroll = WeightScroll + end + object tbWeightRight: TScrollBar + Left = 111 + Top = 83 + Width = 129 + Height = 15 + Max = 160 + PageSize = 0 + Position = 10 + TabOrder = 2 + Visible = False + OnChange = WeightChange + OnScroll = WeightScroll + end + object Panel5: TPanel + Left = 332 + Top = 3 + Width = 108 + Height = 21 + Cursor = crHandPoint + Alignment = taLeftJustify + BevelOuter = bvNone + Caption = ' Selected curve:' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 3 + end + object cbChannel: TComboBox + Left = 332 + Top = 30 + Width = 107 + Height = 21 + Style = csDropDownList + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ItemIndex = 0 + ParentFont = False + TabOrder = 4 + Text = 'Overall' + OnChange = curveChange + Items.Strings = ( + 'Overall' + 'Red' + 'Green' + 'Blue') + end + object btnResetCurves: TButton + Left = 332 + Top = 75 + Width = 107 + Height = 21 + Caption = 'Reset' + TabOrder = 5 + OnClick = btnResetCurvesClick + end + object CurvesStatusBar: TStatusBar + Left = 0 + Top = 107 + Width = 443 + Height = 19 + Panels = <> + SimplePanel = True + end + end + end + object pnlPitch: TPanel + Left = 232 + Top = 34 + Width = 105 + Height = 21 + Cursor = crHandPoint + Hint = + 'Click and drag to change value | | Angle (in degrees) of rotat' + + 'ion around X-axis' + BevelOuter = bvLowered + Caption = ' Pitch' + ParentShowHint = False + ShowHint = True + TabOrder = 2 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + end + object pnlYaw: TPanel + Left = 232 + Top = 58 + Width = 105 + Height = 21 + Cursor = crHandPoint + Hint = + 'Click and drag to change value | | Angle (in degrees) of rotati' + + 'on around Z-axis' + BevelOuter = bvLowered + Caption = ' Yaw' + ParentShowHint = False + ShowHint = True + TabOrder = 3 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + end + object pnlPersp: TPanel + Left = 232 + Top = 130 + Width = 105 + Height = 21 + Cursor = crHandPoint + Hint = + 'Click and drag to change value | Strength of perspective distor' + + 'tion' + BevelOuter = bvLowered + Caption = ' Perspective' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 4 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + end + object txtPitch: TEdit + Left = 336 + Top = 34 + Width = 120 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 6 + Text = '0' + OnEnter = txtCamEnter + OnExit = txtCamPitchExit + OnKeyPress = txtCamPitchKeyPress + end + object txtYaw: TEdit + Left = 336 + Top = 58 + Width = 120 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 7 + Text = '0' + OnEnter = txtCamEnter + OnExit = txtCamYawExit + OnKeyPress = txtCamYawKeyPress + end + object txtPersp: TEdit + Left = 336 + Top = 130 + Width = 120 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 8 + Text = '0' + OnEnter = txtCamEnter + OnExit = txtCamDistExit + OnKeyPress = txtCamDistKeyPress + end + object pnlMasterScale: TPanel + Left = 232 + Top = 154 + Width = 105 + Height = 21 + Cursor = crHandPoint + Hint = 'Click and drag to change value | Scale factor for the flame' + BevelOuter = bvLowered + Caption = ' Scale' + ParentShowHint = False + ShowHint = True + TabOrder = 10 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + end + object editPPU: TEdit + Left = 336 + Top = 154 + Width = 120 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 5 + Text = '0' + OnExit = editPPUValidate + OnKeyPress = editPPUKeyPress + end + object pnlZpos: TPanel + Left = 232 + Top = 106 + Width = 105 + Height = 21 + Cursor = crHandPoint + Hint = 'Click and drag to change value | Height of the 3D-camera' + BevelOuter = bvLowered + Caption = ' Height' + ParentShowHint = False + ShowHint = True + TabOrder = 11 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + end + object txtZpos: TEdit + Left = 336 + Top = 106 + Width = 120 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 9 + Text = '0' + OnEnter = txtCamEnter + OnExit = txtCamZposExit + OnKeyPress = txtCamZposKeyPress + end + object pnlDOF: TPanel + Left = 232 + Top = 10 + Width = 105 + Height = 21 + Cursor = crHandPoint + Hint = 'Click and drag to change value | Strength of blurring from edges' + BevelOuter = bvLowered + Caption = ' Depth blur' + ParentShowHint = False + ShowHint = True + TabOrder = 12 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + end + object txtDOF: TEdit + Left = 336 + Top = 10 + Width = 76 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 13 + Text = '0' + OnEnter = txtCamEnter + OnExit = txtCamDofExit + OnKeyPress = txtCamDofKeyPress + end + object pnlRoll: TPanel + Left = 232 + Top = 82 + Width = 105 + Height = 21 + Cursor = crHandPoint + Hint = + 'Click and drag to change value | | Angle (in degrees) of rotati' + + 'on around Y-axis' + BevelOuter = bvLowered + Caption = ' Roll' + ParentShowHint = False + ShowHint = True + TabOrder = 14 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + end + object txtRoll: TEdit + Left = 336 + Top = 82 + Width = 120 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 15 + Text = '0' + OnEnter = txtCamEnter + OnExit = txtCamRollExit + OnKeyPress = txtCamRollKeyPress + end + object QualityPopup: TPopupMenu + Images = MainForm.Buttons + Left = 40 + Top = 16 + object mnuLowQuality: TMenuItem + Caption = 'Low Quality' + RadioItem = True + OnClick = mnuLowQualityClick + end + object mnuMediumQuality: TMenuItem + Caption = 'Medium Quality' + Checked = True + RadioItem = True + OnClick = mnuMediumQualityClick + end + object mnuHighQuality: TMenuItem + Caption = 'High Quality' + RadioItem = True + OnClick = mnuHighQualityClick + end + object N8: TMenuItem + Caption = '-' + end + object mnuInstantPreview: TMenuItem + Caption = 'Instant Preview' + Checked = True + OnClick = mnuInstantPreviewClick + end + end + object ColorDialog: TColorDialog + Options = [cdFullOpen] + Left = 176 + Top = 16 + end + object GradientPopup: TPopupMenu + Images = MainForm.Buttons + Left = 112 + Top = 16 + object mnuRandomize: TMenuItem + Caption = 'Randomize' + OnClick = mnuRandomizeClick + end + object Smoothize1: TMenuItem + Caption = 'Smoothize' + OnClick = Smoothize1Click + end + object N7: TMenuItem + Caption = '-' + end + object mnuInvert: TMenuItem + Caption = 'Invert' + OnClick = mnuInvertClick + end + object mnuReverse: TMenuItem + Caption = '&Reverse' + OnClick = mnuReverseClick + end + object N15: TMenuItem + Caption = '-' + end + object mnuGreyscale: TMenuItem + Caption = 'Greyscale' + OnClick = mnuGreyscaleClick + end + object mnuSepia: TMenuItem + Caption = 'Sepia' + OnClick = mnuSepiaClick + end + object N3: TMenuItem + Caption = '-' + end + object Removedarkareas1: TMenuItem + Caption = 'Remove dark areas' + OnClick = DarkRemoverClick + end + object SymmetricGradient1: TMenuItem + Caption = 'Add symmetry...' + object Fliplefthalf1: TMenuItem + Caption = 'Flip the left half to the right' + OnClick = Fliplefthalf1Click + end + object Fliprighthalf1: TMenuItem + Caption = 'Flip the right half to the left' + OnClick = Fliprighthalf1Click + end + end + object N14: TMenuItem + Caption = '-' + end + object AdjustColorFragment: TMenuItem + Caption = 'Adjust color fragment...' + ImageIndex = 11 + OnClick = AdjustColorFragmentClick + end + object N10: TMenuItem + Caption = '-' + end + object mnuSmoothPalette: TMenuItem + Caption = 'Smooth Palette...' + ImageIndex = 34 + OnClick = mnuSmoothPaletteClick + end + object mnuGradientBrowser: TMenuItem + Caption = 'Gradient Browser...' + ImageIndex = 22 + OnClick = btnOpenClick + end + object N4: TMenuItem + Caption = '-' + end + object SaveGradient1: TMenuItem + Caption = 'Save Gradient...' + ImageIndex = 2 + OnClick = SaveGradient1Click + end + object SaveasMapfile1: TMenuItem + Caption = 'Save as Map file...' + OnClick = SaveasMapfile1Click + end + object N6: TMenuItem + Caption = '-' + end + object mnuSaveasDefault: TMenuItem + Caption = 'Save as Default' + OnClick = mnuSaveasDefaultClick + end + object N5: TMenuItem + Caption = '-' + end + object mnuCopy: TMenuItem + Caption = 'Copy' + ImageIndex = 10 + OnClick = btnCopyClick + end + object mnuPaste: TMenuItem + Caption = 'Paste' + ImageIndex = 61 + OnClick = btnPasteClick + end + end + object scrollModePopup: TPopupMenu + AutoHotkeys = maManual + AutoPopup = False + Left = 32 + Top = 72 + object mnuRotate: TMenuItem + Caption = 'Rotate' + OnClick = mnuRotateClick + end + object N1: TMenuItem + Caption = '-' + end + object mnuHue: TMenuItem + Caption = 'Hue' + OnClick = mnuHueClick + end + object mnuSaturation: TMenuItem + Caption = 'Saturation' + OnClick = mnuSaturationClick + end + object mnuLuminance: TMenuItem + Caption = 'Luminance' + OnClick = mnuLuminanceClick + end + object mnuBrightness: TMenuItem + Caption = 'Brightness' + OnClick = mnuBrightnessClick + end + object Contrast1: TMenuItem + Caption = 'Contrast' + OnClick = mnuContrastClick + end + object N2: TMenuItem + Caption = '-' + end + object mnuBlur: TMenuItem + Caption = 'Blur' + OnClick = mnuBlurClick + end + object mnuFrequency: TMenuItem + Caption = 'Frequency' + OnClick = mnuFrequencyClick + end + object N9: TMenuItem + Caption = '-' + end + object Red1: TMenuItem + Caption = 'Red' + OnClick = mnuRedClick + end + object Green1: TMenuItem + Caption = 'Green' + OnClick = mnuGreenClick + end + object Blue1: TMenuItem + Caption = 'Blue' + OnClick = mnuBlueClick + end + end + object SaveDialog: TSaveDialog + DefaultExt = 'map' + Filter = 'Map files|*.map' + Left = 176 + Top = 64 + end + object SelectedPopup: TPopupMenu + Left = 116 + Top = 70 + object AdjustSelected: TMenuItem + AutoCheck = True + Caption = 'Adjust colors using slider' + end + object N13: TMenuItem + Caption = '-' + end + object LerpRGB: TMenuItem + Caption = 'Interpolate RGB values between end points' + OnClick = LerpRGBClick + end + object LerpHSV: TMenuItem + Caption = 'Interpolate HSV values between end points' + OnClick = LerpHSVClick + end + object RandomizeSelected: TMenuItem + Caption = 'Randomize the selected color area' + OnClick = RandomizeSelectedClick + end + object SmoothizeSelected: TMenuItem + Caption = 'Smoothize the selected color area' + OnClick = SmoothizeSelectedClick + end + object mnuSetColor: TMenuItem + Caption = 'Set color...' + OnClick = mnuSetColorClick + end + object N11: TMenuItem + Caption = '-' + end + object mnuRGB2BGR: TMenuItem + Caption = 'Swap RGB values...' + object BGR1: TMenuItem + Caption = '> BGR' + OnClick = mnuRGB2BGRClick + end + object BRG1: TMenuItem + Tag = 1 + Caption = '> BRG' + OnClick = mnuRGB2BGRClick + end + object RBG1: TMenuItem + Tag = 2 + Caption = '> RBG' + OnClick = mnuRGB2BGRClick + end + object GRB1: TMenuItem + Tag = 3 + Caption = '> GRB' + OnClick = mnuRGB2BGRClick + end + object GBR1: TMenuItem + Tag = 4 + Caption = '> GBR' + OnClick = mnuRGB2BGRClick + end + end + object InvertColors: TMenuItem + Caption = 'Invert colors' + OnClick = InvertColorsClick + end + object ReverseFragment: TMenuItem + Caption = 'Reverse fragment' + OnClick = ReverseFragmentClick + end + object N12: TMenuItem + Caption = '-' + end + object Copyfragment1: TMenuItem + Caption = 'Copy color fragment' + OnClick = Copyfragment1Click + end + object Pastefragment1: TMenuItem + Caption = 'Paste color fragment' + Enabled = False + OnClick = Pastefragment1Click + end + object Mixcolors: TMenuItem + Caption = 'Mix colors of copied and selected fragments ' + Enabled = False + OnClick = MixcolorsClick + end + end +end diff --git a/Forms/Adjust.pas b/Forms/Adjust.pas new file mode 100644 index 0000000..7608862 --- /dev/null +++ b/Forms/Adjust.pas @@ -0,0 +1,3526 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} +unit Adjust; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, ExtCtrls, ComCtrls, Buttons, Menus, AppEvnts, CurvesControl, + ControlPoint, Cmap, RenderingInterface, Translation; + +const + WM_UPDATE_PARAMS = WM_APP + 5439; + +const + PixelCountMax = 32768; + +type + pRGBTripleArray = ^TRGBTripleArray; + TRGBTripleArray = array[0..PixelCountMax - 1] of TRGBTriple; + +type + TAdjustForm = class(TForm) + QualityPopup: TPopupMenu; + mnuLowQuality: TMenuItem; + mnuMediumQuality: TMenuItem; + mnuHighQuality: TMenuItem; + ColorDialog: TColorDialog; + PrevPnl: TPanel; + PreviewImage: TImage; + PageControl: TPageControl; + TabCamera: TTabSheet; + scrollZoom: TScrollBar; + txtZoom: TEdit; + scrollCenterX: TScrollBar; + txtCenterX: TEdit; + scrollCenterY: TScrollBar; + txtCenterY: TEdit; + TabRendering: TTabSheet; + scrollGamma: TScrollBar; + txtGamma: TEdit; + scrollBrightness: TScrollBar; + txtBrightness: TEdit; + scrollVibrancy: TScrollBar; + txtVibrancy: TEdit; + ColorPanel: TPanel; + TabGradient: TTabSheet; + scrollAngle: TScrollBar; + txtAngle: TEdit; + GradientPnl: TPanel; + GradientImage: TImage; + ScrollBar: TScrollBar; + btnOpen: TSpeedButton; + btnSmoothPalette: TSpeedButton; + btnPaste: TSpeedButton; + btnCopy: TSpeedButton; + cmbPalette: TComboBox; + GradientPopup: TPopupMenu; + mnuRandomize: TMenuItem; + N7: TMenuItem; + mnuInvert: TMenuItem; + mnuReverse: TMenuItem; + N3: TMenuItem; + mnuSmoothPalette: TMenuItem; + mnuGradientBrowser: TMenuItem; + N4: TMenuItem; + SaveGradient1: TMenuItem; + SaveasMapfile1: TMenuItem; + N6: TMenuItem; + mnuSaveasDefault: TMenuItem; + N5: TMenuItem; + mnuCopy: TMenuItem; + mnuPaste: TMenuItem; + scrollModePopup: TPopupMenu; + mnuRotate: TMenuItem; + N1: TMenuItem; + mnuHue: TMenuItem; + mnuSaturation: TMenuItem; + mnuBrightness: TMenuItem; + Contrast1: TMenuItem; + N2: TMenuItem; + mnuBlur: TMenuItem; + mnuFrequency: TMenuItem; + SaveDialog: TSaveDialog; + TabSize: TTabSheet; + btnPreset1: TButton; + btnPreset2: TButton; + btnPreset3: TButton; + btnColorPreset: TSpeedButton; + btnApplySize: TBitBtn; + txtWidth: TComboBox; + txtHeight: TComboBox; + N8: TMenuItem; + mnuInstantPreview: TMenuItem; + pnlZoom: TPanel; + pnlXpos: TPanel; + pnlYpos: TPanel; + pnlAngle: TPanel; + pnlGamma: TPanel; + pnlBrightness: TPanel; + pnlVibrancy: TPanel; + chkResizeMain: TCheckBox; + pnlPitch: TPanel; + pnlYaw: TPanel; + pnlPersp: TPanel; + txtPitch: TEdit; + txtYaw: TEdit; + txtPersp: TEdit; + pnlMasterScale: TPanel; + editPPU: TEdit; + pnlZpos: TPanel; + txtZpos: TEdit; + pnlGammaThreshold: TPanel; + txtGammaThreshold: TEdit; + btnUndo: TSpeedButton; + btnRedo: TSpeedButton; + pnlDOF: TPanel; + txtDOF: TEdit; + btnSet1: TSpeedButton; + btnSet2: TSpeedButton; + btnSet3: TSpeedButton; + Shape1: TShape; + txtVal: TEdit; + btnReset: TButton; + pnlWidth: TPanel; + pnlHeight: TPanel; + pnlBackground: TPanel; + TabCurves: TTabSheet; + CurvesPanel: TPanel; + tbWeightLeft: TScrollBar; + tbWeightRight: TScrollBar; + Panel5: TPanel; + cbChannel: TComboBox; + btnResetCurves: TButton; + N9: TMenuItem; + Red1: TMenuItem; + Green1: TMenuItem; + Blue1: TMenuItem; + mnuGreyscale: TMenuItem; + mnuRGB2BGR: TMenuItem; + Smoothize1: TMenuItem; + BGR1: TMenuItem; + BRG1: TMenuItem; + RBG1: TMenuItem; + GRB1: TMenuItem; + GBR1: TMenuItem; + Removedarkareas1: TMenuItem; + N10: TMenuItem; + SymmetricGradient1: TMenuItem; + Fliplefthalf1: TMenuItem; + Fliprighthalf1: TMenuItem; + GradStatusBar: TStatusBar; + btnSelected: TSpeedButton; + SelectedPopup: TPopupMenu; + LerpRGB: TMenuItem; + LerpHSV: TMenuItem; + RandomizeSelected: TMenuItem; + Copyfragment1: TMenuItem; + Pastefragment1: TMenuItem; + N11: TMenuItem; + Mixcolors: TMenuItem; + N12: TMenuItem; + InvertColors: TMenuItem; + ReverseFragment: TMenuItem; + mnuSetColor: TMenuItem; + pnlRoll: TPanel; + txtRoll: TEdit; + AdjustSelected: TMenuItem; + N13: TMenuItem; + mnuLuminance: TMenuItem; + cbAspectRatio: TComboBox; + lblRatio: TLabel; + AdjustColorFragment: TMenuItem; + N14: TMenuItem; + mnuSepia: TMenuItem; + N15: TMenuItem; + gbSize: TGroupBox; + gbPresets: TGroupBox; + gbChange: TGroupBox; + GradSelection: TPaintBox; + chkTransparent: TCheckBox; + pnlContrast: TPanel; + scrollContrast: TScrollBar; + txtContrast: TEdit; + CurvesStatusBar: TStatusBar; + SmoothizeSelected: TMenuItem; + btResetZoom: TButton; + btnMenu: TButton; // AV: changed from TSpeedButton for auto-drawing the arrow + procedure FormCreate(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure FormDestroy(Sender: TObject); + procedure DrawPreview; +// procedure btnOKClick(Sender: TObject); +// procedure btnCancelClick(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure mnuLowQualityClick(Sender: TObject); + procedure mnuMediumQualityClick(Sender: TObject); + procedure mnuHighQualityClick(Sender: TObject); + procedure txtZoomKeyPress(Sender: TObject; var Key: Char); + procedure txtZoomExit(Sender: TObject); + procedure txtCenterXKeyPress(Sender: TObject; var Key: Char); + procedure txtCenterXExit(Sender: TObject); + procedure txtCenterYKeyPress(Sender: TObject; var Key: Char); + procedure txtCenterYExit(Sender: TObject); + procedure txtGammaKeyPress(Sender: TObject; var Key: Char); + procedure txtGammaExit(Sender: TObject); + procedure txtBrightnessKeyPress(Sender: TObject; var Key: Char); + procedure txtBrightnessExit(Sender: TObject); + procedure txtVibrancyKeyPress(Sender: TObject; var Key: Char); + procedure txtVibrancyExit(Sender: TObject); + procedure scrollCameraScroll(Sender: TObject; ScrollCode: TScrollCode; + var ScrollPos: Integer); +(* + procedure scrollCenterXScroll(Sender: TObject; ScrollCode: TScrollCode; + var ScrollPos: Integer); + procedure scrollCenterYScroll(Sender: TObject; ScrollCode: TScrollCode; + var ScrollPos: Integer); + procedure scrollGammaScroll(Sender: TObject; ScrollCode: TScrollCode; + var ScrollPos: Integer); + procedure scrollBrightnessScroll(Sender: TObject; + ScrollCode: TScrollCode; var ScrollPos: Integer); + procedure scrollVibrancyScroll(Sender: TObject; + ScrollCode: TScrollCode; var ScrollPos: Integer); + procedure scrollAngleScroll(Sender: TObject; ScrollCode: TScrollCode; + var ScrollPos: Integer); +*) + procedure scrollVibrancyScroll(Sender: TObject); + procedure scrollGammaChange(Sender: TObject); + procedure scrollBrightnessChange(Sender: TObject); + procedure scrollZoomChange(Sender: TObject); + procedure scrollCenterXChange(Sender: TObject); + procedure scrollCenterYChange(Sender: TObject); + procedure ColorPanelClick(Sender: TObject); + procedure txtGammaEnter(Sender: TObject); + procedure txtBrightnessEnter(Sender: TObject); + procedure txtVibrancyEnter(Sender: TObject); + procedure txtZoomEnter(Sender: TObject); + procedure txtCenterXEnter(Sender: TObject); + procedure txtCenterYEnter(Sender: TObject); + procedure scrollAngleChange(Sender: TObject); + procedure txtAngleEnter(Sender: TObject); + procedure txtAngleExit(Sender: TObject); + procedure txtAngleKeyPress(Sender: TObject; var Key: Char); + + // --Z-- // gradient functions + procedure cmbPaletteChange(Sender: TObject); +// procedure DrawPalette; + procedure btnMenuClick(Sender: TObject); + procedure mnuReverseClick(Sender: TObject); + procedure mnuInvertClick(Sender: TObject); + + procedure mnuRotateClick(Sender: TObject); + procedure mnuHueClick(Sender: TObject); + procedure mnuSaturationClick(Sender: TObject); + procedure ScrollBarChange(Sender: TObject); + procedure mnuBrightnessClick(Sender: TObject); + procedure mnuBlurClick(Sender: TObject); + procedure btnOpenClick(Sender: TObject); + procedure mnuSmoothPaletteClick(Sender: TObject); + procedure SaveGradient1Click(Sender: TObject); + procedure SaveasMapfile1Click(Sender: TObject); + procedure cmbPaletteDrawItem(Control: TWinControl; Index: Integer; + Rect: TRect; State: TOwnerDrawState); + procedure ScrollBarScroll(Sender: TObject; ScrollCode: TScrollCode; + var ScrollPos: Integer); + procedure btnCopyClick(Sender: TObject); + procedure btnPasteClick(Sender: TObject); + // procedure ApplicationEventsActivate(Sender: TObject); + procedure mnuSaveasDefaultClick(Sender: TObject); + procedure mnuRandomizeClick(Sender: TObject); + procedure mnuFrequencyClick(Sender: TObject); + procedure mnuContrastClick(Sender: TObject); + + procedure GradImageMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure GradImageMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure GradImageMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + + procedure btnSet1Click(Sender: TObject); + procedure btnSet2Click(Sender: TObject); + procedure btnSet3Click(Sender: TObject); + procedure btnPreset1Click(Sender: TObject); + procedure btnPreset2Click(Sender: TObject); + procedure btnPreset3Click(Sender: TObject); + procedure txtWidthChange(Sender: TObject); + procedure txtHeightChange(Sender: TObject); + procedure txtSizeKeyPress(Sender: TObject; var Key: Char); + // procedure chkMaintainClick(Sender: TObject); + procedure SetMainWindowSize; + procedure GetMainWindowSize; + procedure btnUndoClick(Sender: TObject); + procedure btnRedoClick(Sender: TObject); + procedure GradientImageDblClick(Sender: TObject); + procedure btnColorPresetClick(Sender: TObject); + procedure btnApplySizeClick(Sender: TObject); + procedure mnuInstantPreviewClick(Sender: TObject); + procedure editPPUKeyPress(Sender: TObject; var Key: Char); + procedure editPPUValidate(Sender: TObject); + + procedure DragPanelMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure DragPanelMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure DragPanelMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure DragPanelDblClick(Sender: TObject); + procedure FormActivate(Sender: TObject); + procedure txtCamEnter(Sender: TObject); + procedure txtCamPitchExit(Sender: TObject); + procedure txtCamPitchKeyPress(Sender: TObject; var Key: Char); + procedure txtCamYawExit(Sender: TObject); + procedure txtCamYawKeyPress(Sender: TObject; var Key: Char); + procedure txtCamDistExit(Sender: TObject); + procedure txtCamDistKeyPress(Sender: TObject; var Key: Char); + procedure txtCamZposExit(Sender: TObject); + procedure txtCamZposKeyPress(Sender: TObject; var Key: Char); + procedure txtCamDofExit(Sender: TObject); + procedure txtCamDofKeyPress(Sender: TObject; var Key: Char); + procedure PreviewImageMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure PreviewImageMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure PreviewImageMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure PreviewImageDblClick(Sender: TObject); + procedure txtGammaThresholdKeyPress(Sender: TObject; var Key: Char); + procedure txtGammaThresholdEnter(Sender: TObject); + procedure txtGammaThresholdExit(Sender: TObject); + procedure Shape1MouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure btnResetClick(Sender: TObject); + procedure txtValKeyPress(Sender: TObject; var Key: Char); + procedure txtValExit(Sender: TObject); + procedure WeightScroll(Sender: TObject; ScrollCode: TScrollCode; + var ScrollPos: Integer); + procedure WeightChange(Sender: TObject); + procedure curveChange(Sender: TObject); + procedure btnResetCurvesClick(Sender: TObject); + procedure mnuRedClick(Sender: TObject); + procedure mnuGreenClick(Sender: TObject); + procedure mnuBlueClick(Sender: TObject); + procedure mnuGreyscaleClick(Sender: TObject); + procedure mnuRGB2BGRClick(Sender: TObject); + procedure Smoothize1Click(Sender: TObject); + procedure DarkRemoverClick(Sender: TObject); + procedure Fliplefthalf1Click(Sender: TObject); + procedure Fliprighthalf1Click(Sender: TObject); + procedure GradStatusBarDrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel; + const Rect: TRect); + procedure GradientImageMouseLeave(Sender: TObject); + procedure LerpRGBClick(Sender: TObject); + procedure LerpHSVClick(Sender: TObject); + procedure RandomizeSelectedClick(Sender: TObject); + procedure Copyfragment1Click(Sender: TObject); + procedure Pastefragment1Click(Sender: TObject); + procedure MixcolorsClick(Sender: TObject); + procedure InvertColorsClick(Sender: TObject); + procedure ReverseFragmentClick(Sender: TObject); + procedure mnuSetColorClick(Sender: TObject); + procedure txtCamRollExit(Sender: TObject); + procedure txtCamRollKeyPress(Sender: TObject; var Key: Char); + procedure GradStatusBarDblClick(Sender: TObject); + procedure mnuLuminanceClick(Sender: TObject); + procedure mnuSepiaClick(Sender: TObject); + procedure cbAspectRatioChange(Sender: TObject); + procedure ExtSysMenu(var Msg: TMessage); message WM_SysCommand; + procedure AdjustColorFragmentClick(Sender: TObject); + procedure btnSelectedClick(Sender: TObject); + procedure btnSelectedMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure GradSelectionPaint(Sender: TObject); + procedure scrollContrastChange(Sender: TObject); + procedure txtContrastEnter(Sender: TObject); + procedure txtContrastExit(Sender: TObject); + procedure txtContrastKeyPress(Sender: TObject; var Key: Char); + procedure SmoothizeSelectedClick(Sender: TObject); + procedure btResetZoomClick(Sender: TObject); + private + CurvesControl: TCurvesControl; + Resetting: boolean; + Render: TRenderer; + bm: TBitmap; + EditBoxValue: string; + + cp: TControlPoint; + + pnlDragMode, pnlDragged, pnlMM: boolean; + pnlDragPos, pnlDragOld: integer; + pnlDragValue: double; + mousepos: TPoint; + + camDragMode, camDragged, camMM: boolean; + camDragPos, camDragOld: TPoint; + camDragValueX, camDragValueY: double; + + private // gradient stuff + {Palette,} BackupPal: TColorMap; + tmpBackupPal: TColorMap; + tmpColors: array of array of byte; //integer; // AV + + scrollMode: (modeRotate, + modeHue, modeSaturation, modeLuminance, + modeBrightness, modeContrast, modeBlur, modeFrequency, + modeRed, modeGreen, modeBlue); + GradientChanged: boolean; + imgDragMode: (imgDragNone, imgDragRotate, imgDragStretch, imgDragSelect); + startX: integer; // AV + dragX, oldX: integer; + oldpos, offset: integer; // for display...? :-\ + + const space = ': '; + + procedure Apply; + procedure SetCurvesCp(ccp: TControlPoint); + function Blur(const radius: integer; const pal: TColorMap; start, last: byte): TColorMap; + function Frequency(const times: Integer; const pal: TColorMap): TColorMap; + function FrequencySel(const times: Integer; const pal: TColorMap): TColorMap; + procedure SaveMap(FileName: string); + + procedure UpdateGradient(Pal: TColorMap); + + private // image size stuff + ImageHeight, ImageWidth: integer; + Preset: array[1..3] of record + Left, Top, Width, Height: integer; + end; + ratio: double; + + procedure ReadPreset(n: integer); + procedure WritePreset(n: integer); + function PresetToStr(n: integer): string; + + public + PreviewDensity: double; + Palette: TColorMap; // AV: moved from private section for some interactive stuff + selA, selB: integer; // AV + procedure UpdateDisplay(PreviewOnly: boolean = false); + procedure UpdateFlame(bBgOnly: boolean = false); + procedure CreateScreenShot; // AV + end; + +var + AdjustForm: TAdjustForm; + +function GradientInClipboard: boolean; +procedure RGBToHSV(R, G, B: byte; var H, S, V: real); +procedure HSVToRGB(H, S, V: real; var Rb, Gb, Bb: integer); + +implementation + +uses + RndFlame, Main, cmapdata, Math, Browser, Editor, Global, + Save, Mutate, ClipBrd, GradientHlpr, Registry, Curves, ColorRangeForm; + +{$R *.DFM} + +procedure TAdjustForm.SetCurvesCp(ccp: TControlPoint); +begin + if CurvesControl = nil then Exit; + CurvesControl.SetCp(ccp); +end; + +procedure TAdjustForm.UpdateDisplay(PreviewOnly: boolean = false); +var + pw, ph: integer; + r: double; +begin + cp.copy(MainCp); + SetCurvesCp(MainCp); + + tbWeightLeft.Position := Round(CurvesControl.WeightLeft * 10); + tbWeightRight.Position := Round(CurvesControl.WeightRight * 10); + + pw := PrevPnl.Width -2; + ph := PrevPnl.Height -2; + if (cp.width / cp.height) > (PrevPnl.Width / PrevPnl.Height) then + begin + PreviewImage.Width := pw; + r := cp.width / PreviewImage.Width; + PreviewImage.height := round(cp.height / r); + PreviewImage.Left := 1; + PreviewImage.Top := (ph - PreviewImage.Height) div 2; + end + else begin + PreviewImage.Height := ph; + r := cp.height / PreviewImage.height; + PreviewImage.Width := round(cp.Width / r); + PreviewImage.Top := 1; + PreviewImage.Left := (pw - PreviewImage.Width) div 2; + end; + cp.AdjustScale(PreviewImage.Width, PreviewImage.Height); + + cp.cmap := MainCp.cmap; + + if not PreviewOnly then begin //*** + + Resetting := True; // So the preview doesn't get drawn with these changes.. + scrollGamma.Position := trunc(cp.Gamma * 100); + scrollBrightness.Position := trunc(cp.Brightness * 100); + scrollVibrancy.Position := trunc(cp.vibrancy * 100); + scrollContrast.Position := trunc(cp.contrast * 100); // AV + scrollZoom.Position := trunc(cp.zoom * 1000); + scrollAngle.Position := Trunc(cp.FAngle * 18000.0 / PI) mod 36000; // scrollAngle.Max; + + if (abs(cp.Center[0]) < 1000) and (abs(cp.Center[1]) < 1000) then begin + scrollCenterX.Position := trunc(cp.Center[0] * 1000); + scrollCenterY.Position := trunc(cp.Center[1] * 1000); + end else begin + scrollCenterX.Position := 0; + scrollCenterY.Position := 0; + end; + + ColorPanel.color := cp.background[2] shl 16 + cp.background[1] shl 8 + cp.background[0]; + Shape1.Brush.Color := ColorPanel.Color; + //cbColor.text := IntToHex(integer(ColorPanel.Color), 6); + + GetMainWindowSize; + + // gradient + if cp.cmapindex >= 0 then + cmbPalette.ItemIndex := cp.cmapindex; + ScrollBar.Position := 0; + Palette := cp.cmap; + BackupPal := cp.cmap; + + Resetting := False; + editPPU.Text := Format('%.6g', [100*cp.pixels_per_unit/PreviewImage.Width]); + + txtGammaThreshold.Text := Format('%.3g', [cp.gammaThreshRelative]); + + // 3d camera + txtPitch.Text := Format('%.6g', [cp.cameraPitch * 180 / PI]); + txtYaw.Text := Format('%.6g', [cp.cameraYaw * 180 / PI]); + txtRoll.Text := Format('%.6g', [cp.cameraRoll * 180 / PI]); // AV + txtPersp.Text := Format('%.6g', [cp.cameraPersp]); + txtZpos.Text := Format('%.6g', [cp.cameraZpos]); + txtDOF.Text := Format('%.6g', [cp.cameraDof]); + end; //*** + DrawPreview; +end; + +procedure TAdjustForm.UpdateFlame(bBgOnly: boolean = false); +begin + if not bBgOnly then + MainForm.StopThread; + MainForm.UpdateUndo; + MainCp.Copy(cp, true); + SetCurvesCp(cp); + + if EditForm.Visible then EditForm.UpdateDisplay; + if MutateForm.Visible then MutateForm.UpdateDisplay; + if CurvesForm.Visible then CurvesForm.SetCp(cp); + + if bBgOnly then + MainForm.tbShowAlphaClick(Self) + else + MainForm.RedrawTimer.enabled := true; +end; + +procedure TAdjustForm.DrawPreview; +var + i: integer; + Row: pRGBTripleArray; + BitMap: TBitMap; +begin + if Resetting then exit; + + Render.Stop; +// AdjustScale(cp, PreviewImage.Width, PreviewImage.Height); + cp.sample_density := PreviewDensity; + cp.spatial_oversample := defOversample; + cp.spatial_filter_radius := defFilterRadius; + Render.SetCP(cp); + Render.Render; + BM.Assign(Render.GetImage); + PreviewImage.Picture.Graphic := bm; + + if mnuInstantPreview.Checked then PreviewImage.Refresh; + +//--begin DrawPalette + BitMap := TBitMap.Create; + try + Bitmap.PixelFormat := pf24bit; + BitMap.Width := 256; + BitMap.Height := 1; + Row := Bitmap.Scanline[0]; + for i := 0 to 255 do + with Row[i] do + begin + rgbtRed := cp.cmap[i][0]; + rgbtGreen := cp.cmap[i][1]; + rgbtBlue := cp.cmap[i][2]; + end; + + GradientImage.Picture.Graphic := Bitmap; + GradientImage.Refresh; + finally + BitMap.Free; + end; +//--end DrawPalette +end; + +procedure TAdjustForm.FormCreate(Sender: TObject); +var ExtSM: HMenu; +begin + mnuCopy.Caption := TextByKey('common-copy'); + mnuPaste.Caption := TextByKey('common-paste'); + btnApplySize.Caption := TextByKey('common-apply'); + mnuLowQuality.Caption := TextByKey('common-lowquality'); + mnuMediumQuality.Caption := TextByKey('common-mediumquality'); + mnuHighQuality.Caption := TextByKey('common-highquality'); + btnCopy.Hint := TextByKey('adjustment-tab-gradient-copyhint'); + btnPaste.Hint := TextByKey('adjustment-tab-gradient-pastehint'); + btnSelected.Hint := TextByKey('adjustment-tab-gradient-selectedhint'); + btnUndo.Hint := TextByKey('common-undo'); + btnRedo.Hint := TextByKey('common-redo'); + pnlWidth.Caption := TextByKey('common-width'); + pnlHeight.Caption := TextByKey('common-height'); + //chkMaintain.Caption := TextByKey('common-keepaspect'); + cbAspectRatio.Items[0] := TextByKey('adjustment-tab-size-custom'); // AV + cbAspectRatio.Items[1] := TextByKey('common-keepaspect'); // AV + lblRatio.Caption := TextByKey('adjustment-tab-size-ratio'); + pnlGamma.Caption := TextByKey('common-gamma'); + pnlBrightness.Caption := TextByKey('common-brightness'); + pnlVibrancy.Caption := TextByKey('common-vibrancy'); + pnlContrast.Caption := TextByKey('common-contrast'); // AV + pnlBackground.Caption := TextByKey('common-background'); + pnlGammaThreshold.Caption := TextByKey('common-gammathreshold'); + pnlDOF.Hint := TextByKey('common-dragpanelhint') + ' | ' + TextByKey('adjustment-hint-depthblur'); + pnlPitch.Hint := TextByKey('common-dragpanelhint') + ' | ' + TextByKey('adjustment-hint-pitch'); + pnlYaw.Hint := TextByKey('common-dragpanelhint') + ' | ' + TextByKey('adjustment-hint-yaw'); + pnlRoll.Hint := TextByKey('common-dragpanelhint') + ' | ' + TextByKey('adjustment-hint-roll'); + pnlZpos.Hint := TextByKey('common-dragpanelhint') + ' | ' + TextByKey('adjustment-hint-height'); + pnlPersp.Hint := TextByKey('common-dragpanelhint') + ' | ' + TextByKey('adjustment-hint-perspective'); + pnlMasterScale.Hint := TextByKey('common-dragpanelhint') + ' | ' + TextByKey('adjustment-hint-scale'); + pnlZoom.Hint := TextByKey('common-dragpanelhint'); + pnlXpos.Hint := TextByKey('common-dragpanelhint'); + pnlYpos.Hint := TextByKey('common-dragpanelhint'); + pnlAngle.Hint := TextByKey('common-dragpanelhint'); + pnlGamma.Hint := TextByKey('common-dragpanelhint'); + pnlBrightness.Hint := TextByKey('common-dragpanelhint'); + pnlVibrancy.Hint := TextByKey('common-dragpanelhint'); + pnlGammaThreshold.Hint := TextByKey('common-dragpanelhint'); + self.Caption := TextByKey('adjustment-title'); + pnlDOF.Caption := TextByKey('adjustment-common-depthblur'); + pnlPitch.Caption := TextByKey('adjustment-common-pitch'); + pnlYaw.Caption := TextByKey('adjustment-common-yaw'); + pnlRoll.Caption := TextByKey('adjustment-common-roll'); + pnlZpos.Caption := TextByKey('adjustment-common-height'); + pnlPersp.Caption := TextByKey('adjustment-common-perspective'); + pnlMasterScale.Caption := TextByKey('adjustment-common-scale'); + TabCamera.Caption := TextByKey('adjustment-tab-camera-title'); + pnlZoom.Caption := TextByKey('adjustment-tab-camera-zoom'); + pnlXPos.Caption := TextByKey('adjustment-tab-camera-xpos'); + pnlYPos.Caption := TextByKey('adjustment-tab-camera-ypos'); + pnlAngle.Caption := TextByKey('adjustment-tab-camera-rotation'); + btResetZoom.Caption := TextByKey('adjustment-tab-camera-resetzoom'); + btResetZoom.Hint := TextByKey('adjustment-hint-resetzoom'); + TabRendering.Caption := TextByKey('adjustment-tab-rendering-title'); + //chkTransparent.Caption := TextByKey('adjustment-tab-rendering-istransparent'); + TabGradient.Caption := TextByKey('adjustment-tab-gradient-title'); + mnuRotate.Caption := TextByKey('adjustment-tab-gradient-moderotate'); + mnuHue.Caption := TextByKey('adjustment-tab-gradient-modehue'); + mnuSaturation.Caption := TextByKey('adjustment-tab-gradient-modesaturation'); + mnuBrightness.Caption := TextByKey('adjustment-tab-gradient-modebrightness'); + mnuLuminance.Caption := TextByKey('adjustment-tab-gradient-modeluminance'); + Contrast1.Caption := TextByKey('adjustment-tab-gradient-modecontrast'); + mnuBlur.Caption := TextByKey('adjustment-tab-gradient-modeblur'); + mnuFrequency.Caption := TextByKey('adjustment-tab-gradient-modefrequency'); + btnColorPreset.Caption := TextByKey('adjustment-tab-gradient-preset'); + btnColorPreset.Hint := TextByKey('adjustment-tab-gradient-presethint'); + btnReset.Caption := TextByKey('adjustment-tab-gradient-reset'); + btnMenu.Hint := TextByKey('adjustment-tab-gradient-modehint'); + GradientImage.Hint := StringReplace(TextByKey('adjustment-tab-gradient-palettehint'), + ',', ','#13, [rfReplaceAll]); + btnSet1.Hint := TextByKey('adjustment-tab-size-savepreset'); + btnSet2.Hint := TextByKey('adjustment-tab-size-savepreset'); + btnSet3.Hint := TextByKey('adjustment-tab-size-savepreset'); + TabSize.Caption := TextByKey('adjustment-tab-size-title'); + btnPreset1.Hint := TextByKey('adjustment-tab-size-preset'); + btnPreset2.Hint := TextByKey('adjustment-tab-size-preset'); + btnPreset3.Hint := TextByKey('adjustment-tab-size-preset'); + TabCurves.Caption := TextByKey('adjustment-tab-curves-title'); + btnResetCurves.Caption := TextByKey('adjustment-tab-curves-reset'); + Panel5.Caption := TextByKey('adjustment-tab-curves-selected'); + cbChannel.Items[0] := TextByKey('adjustment-tab-curves-overall'); + cbChannel.Items[1] := TextByKey('adjustment-tab-curves-red'); + cbChannel.Items[2] := TextByKey('adjustment-tab-curves-green'); + cbChannel.Items[3] := TextByKey('adjustment-tab-curves-blue'); + chkResizeMain.Caption := TextByKey('adjustment-tab-size-resizemain'); + mnuInstantPreview.Caption := TextByKey('adjustment-popup-quality-instantpreview'); + mnuRandomize.Caption := TextByKey('adjustment-popup-gradient-randomize'); + mnuInvert.Caption := TextByKey('adjustment-popup-gradient-invert'); + mnuReverse.Caption := TextByKey('adjustment-popup-gradient-reverse'); + mnuSepia.Caption := TextByKey('adjustment-popup-gradient-sepia'); + mnuSmoothPalette.Caption := TextByKey('adjustment-popup-gradient-smooth'); + btnSmoothPalette.Hint := TextByKey('main-menu-file-smoothpalettehint'); + mnuGradientBrowser.Caption := TextByKey('adjustment-popup-gradient-browser'); + btnOpen.Hint := TextByKey('adjustment-popup-gradient-browser'); + SaveGradient1.Caption := TextByKey('adjustment-popup-gradient-saveasugr'); + SaveasMapfile1.Caption := TextByKey('adjustment-popup-gradient-saveasmap'); + mnuSaveAsDefault.Caption := TextByKey('adjustment-popup-gradient-saveasdefault'); + btnMenu.Caption := TextByKey('adjustment-tab-gradient-moderotate'); + Red1.Caption := TextByKey('adjustment-tab-curves-red'); + Green1.Caption := TextByKey('adjustment-tab-curves-green'); + Blue1.Caption := TextByKey('adjustment-tab-curves-blue'); + Smoothize1.Caption := TextByKey('adjustment-popup-gradient-smoothize'); + SmoothizeSelected.Caption := TextByKey('adjustment-popup-gradient-smoothizesel'); + LerpRGB.Caption := TextByKey('adjustment-popup-gradient-interprgb'); + LerpHSV.Caption := TextByKey('adjustment-popup-gradient-interphsv'); + mnuRGB2BGR.Caption := TextByKey('adjustment-popup-gradient-swaprgb'); + mnuSetColor.Caption := TextByKey('adjustment-popup-gradient-setcolor'); + RandomizeSelected.Caption := TextByKey('adjustment-popup-gradient-randomizesel'); + InvertColors.Caption := TextByKey('adjustment-popup-gradient-invertsel'); + ReverseFragment.Caption := TextByKey('adjustment-popup-gradient-reversesel'); + MixColors.Caption := TextByKey('adjustment-popup-gradient-mixcolors'); + CopyFragment1.Caption := TextByKey('adjustment-popup-gradient-copysel'); + PasteFragment1.Caption := TextByKey('adjustment-popup-gradient-pastesel'); + mnuGreyscale.Caption := TextByKey('adjustment-popup-gradient-grayscale'); + RemoveDarkAreas1.Caption := TextByKey('adjustment-popup-gradient-removedark'); + SymmetricGradient1.Caption := TextByKey('adjustment-popup-gradient-symmetry'); + FlipLeftHalf1.Caption := TextByKey('adjustment-popup-gradient-flipleft'); + FlipRightHalf1.Caption := TextByKey('adjustment-popup-gradient-flipright'); + AdjustSelected.Caption := TextByKey('adjustment-popup-gradient-adjustbyslider'); + AdjustColorFragment.Caption := TextByKey('adjustment-popup-gradient-adjustfragment'); + gbSize.Caption := TextByKey('common-pixels'); + gbPresets.Caption := TextByKey('adjustment-tab-size-presets'); + gbChange.Caption := TextByKey('adjustment-tab-size-output'); + + ExtSM := GetSystemMenu(Handle, False); // AV + InsertMenu(ExtSM, UINT(5), MF_ByPosition or MF_Separator, 0, nil); + InsertMenu(ExtSM, UINT(6), MF_ByPosition, $C0, PChar(TextByKey('main-menu-screenshot'))); + + cbChannel.ItemIndex := 0; + cbAspectRatio.ItemIndex := 0; + + if not (assigned(curvesControl)) then + begin + CurvesControl := TCurvesControl.Create(self); + CurvesControl.Align := alClient; + CurvesControl.Parent := CurvesPanel; + end; + + tbWeightLeft.Position := Round(CurvesControl.WeightLeft * 10); + tbWeightRight.Position := Round(CurvesControl.WeightRight * 10); + + bm := TbitMap.Create; + cp := TControlPoint.Create; + Render := TRenderer.Create; + case AdjustPrevQual of + 0: begin + mnuLowQuality.Checked := true; + PreviewDensity := prevLowQuality; + end; + 1: begin + mnuMediumQuality.Checked := true; + PreviewDensity := prevMediumQuality; + end; + 2: begin + mnuHighQuality.Checked := true; + PreviewDensity := prevHighQuality; + end; + end; + + Sendmessage(cmbPalette.Handle, CB_SETDROPPEDWIDTH , cmbPalette.width * 2, 0); + SetCurvesCp(MainCp); + + selA := 0; selB := 255; // AV +end; + +procedure TAdjustForm.FormClose(Sender: TObject; var Action: TCloseAction); +var + Registry: TRegistry; +begin + Render.Stop; + { Write position to registry } + Registry := TRegistry.Create; + try + Registry.RootKey := HKEY_CURRENT_USER; + if Registry.OpenKey('\Software\' + APP_NAME + '\Forms\Adjust', True) then + begin + Registry.WriteInteger('Top', AdjustForm.Top); + Registry.WriteInteger('Left', AdjustForm.Left); + Registry.WriteBool('InstantPreview', mnuInstantPreview.Checked); + Registry.WriteBool('ResizeMain', chkResizeMain.Checked); + end; + finally + Registry.Free; + end; +end; + +procedure TAdjustForm.FormDestroy(Sender: TObject); +begin + bm.free; + cp.free; + Render.free; +end; + +procedure TAdjustForm.FormShow(Sender: TObject); +var + Registry: TRegistry; + i: integer; + strx, stry, strw, strh: string; +begin + if LimitVibrancy then scrollVibrancy.Max := 100 + else scrollVibrancy.Max := 3000; + { Read position from registry } + Registry := TRegistry.Create; + try + Registry.RootKey := HKEY_CURRENT_USER; + if Registry.OpenKey('Software\' + APP_NAME + '\Forms\Adjust', False) then + begin + if Registry.ValueExists('Left') then + AdjustForm.Left := Registry.ReadInteger('Left'); + if Registry.ValueExists('Top') then + AdjustForm.Top := Registry.ReadInteger('Top'); + if Registry.ValueExists('InstantPreview') then + mnuInstantPreview.Checked := Registry.ReadBool('InstantPreview'); + if Registry.ValueExists('ResizeMain') then + chkResizeMain.Checked := Registry.ReadBool('ResizeMain'); + Registry.CloseKey; + end; + + if Registry.OpenKey('Software\' + APP_NAME + '\ImageSizePresets', False) then + begin + for i:=1 to 3 do begin + strx:='Preset' + IntToStr(i) + 'Left'; + stry:='Preset' + IntToStr(i) + 'Top'; + strw:='Preset' + IntToStr(i) + 'Width'; + strh:='Preset' + IntToStr(i) + 'Height'; + if Registry.ValueExists(strw) and Registry.ValueExists(strh) + then begin + Preset[i].Left := Registry.ReadInteger(strx); + Preset[i].Top := Registry.ReadInteger(stry); + Preset[i].Width := Registry.ReadInteger(strw); + Preset[i].Height := Registry.ReadInteger(strh); + if (Preset[1].Width > 0) and (Preset[1].Height > 0) then continue; + end; + Preset[i].Left := MainForm.Left; + Preset[i].Top := MainForm.Top; + // Preset[i].Width := 512; + // Preset[i].Height := 384; + // AV: them different by default + case i of + 1: begin + Preset[1].Width := 512; + Preset[1].Height := 384; + end; + 2: begin + Preset[2].Width := 640; + Preset[2].Height := 480; + end; + 3: begin + Preset[3].Width := 800; + Preset[3].Height := 600; + end; + end; // end case + end; + end + else begin + for i:=1 to 3 do begin + Preset[i].Left := MainForm.Left; + Preset[i].Top := MainForm.Top; + end; + // AV: make them different by default + Preset[1].Width := 512; + Preset[1].Height := 384; + Preset[2].Width := 640; + Preset[2].Height := 480; + Preset[3].Width := 800; + Preset[3].Height := 600; + end; + Registry.CloseKey; + finally + Registry.Free; + end; + GetMainWindowSize; + + btnPreset1.Caption := PresetToStr(1); + btnPreset2.Caption := PresetToStr(2); + btnPreset3.Caption := PresetToStr(3); +end; + +/////////////////////////////////////////////////// + +procedure TAdjustForm.CreateScreenShot; +begin + SaveScreenShot('Apophysis Adjustment Window'); +end; + +procedure TAdjustForm.ExtSysMenu(var Msg: TMessage); +begin + if Msg.WParam = $C0 then CreateScreenShot; + inherited; +end; + +////////////////////////////////////////////////// + +procedure TAdjustForm.mnuLowQualityClick(Sender: TObject); +begin + mnuLowQuality.Checked := True; + PreviewDensity := prevLowQuality; + AdjustPrevQual := 0; + DrawPreview; +end; + +procedure TAdjustForm.mnuMediumQualityClick(Sender: TObject); +begin + mnuMediumQuality.Checked := True; + PreviewDensity := prevMediumQuality; + AdjustPrevQual := 1; + DrawPreview; +end; + +procedure TAdjustForm.mnuHighQualityClick(Sender: TObject); +begin + mnuHighQuality.Checked := True; + PreviewDensity := prevHighQuality; + AdjustPrevQual := 2; + DrawPreview; +end; + +procedure TAdjustForm.txtZoomEnter(Sender: TObject); +begin + EditBoxValue := txtZoom.Text; +end; + +procedure TAdjustForm.txtZoomKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = ',') then Key := '.'; + if not CharinSet(Key,['0'..'9', #8, #13, '.']) + then Key:= #0; + if ((key = #13) and (EditBoxValue <> txtZoom.Text)) then + begin + key := #0; + txtZoomExit(sender); + end; +end; + +procedure TAdjustForm.txtZoomExit(Sender: TObject); +var + v: integer; +begin + if (EditBoxValue <> txtZoom.Text) then + try + v := Trunc(StrToFloat(txtZoom.Text) * 1000); + if v > scrollZoom.Max then v := scrollZoom.Max; + if v < scrollZoom.Min then v := scrollZoom.Min; + if v <> ScrollZoom.Position then begin + ScrollZoom.Position := v; + UpdateFlame; + end; + except on EConvertError do + txtZoom.Text := FloatToStr(cp.zoom) + end; +end; + +procedure TAdjustForm.txtCenterXEnter(Sender: TObject); +begin + EditBoxValue := txtCenterX.Text; +end; + +procedure TAdjustForm.txtCenterXKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = ',') then Key := '.'; + if not CharinSet(Key,['0'..'9','-', #8, #13, '.']) + then Key:= #0; + if ((key = #13) and (EditBoxValue <> txtCenterX.Text)) then + begin + key := #0; + txtCenterXExit(sender); + end; +end; + +procedure TAdjustForm.txtCenterXExit(Sender: TObject); +var + v: integer; +begin + if (EditBoxValue <> txtCenterX.Text) then + try + v := Trunc(StrToFloat(txtCenterX.Text) * 1000); + if v > scrollCenterX.Max then v := scrollCenterX.Max; + if v < scrollCenterX.Min then v := scrollCenterX.Min; + ScrollCenterX.Position := v; + UpdateFlame; + except on EConvertError do + txtCenterX.Text := FloatToStr(cp.center[0]); + end; +end; + +procedure TAdjustForm.txtCenterYEnter(Sender: TObject); +begin + EditBoxValue := txtCenterY.Text; +end; + +procedure TAdjustForm.txtCenterYKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = ',') then Key := '.'; + if not CharinSet(Key,['0'..'9','-', #8, #13, '.']) + then Key:= #0; + if ((key = #13) and (EditBoxValue <> txtCenterY.Text)) then + begin + key := #0; + txtCenterYExit(sender); + end; +end; + +procedure TAdjustForm.txtContrastEnter(Sender: TObject); +begin + EditBoxValue := txtContrast.Text; +end; + +procedure TAdjustForm.txtContrastExit(Sender: TObject); +var + v: integer; +begin + if (txtContrast.Text <> EditBoxValue) then + try + v := Trunc(StrToFloat(txtContrast.Text) * 100); + if v > scrollContrast.Max then v := scrollContrast.Max; + if v < scrollContrast.Min then v := scrollContrast.Min; + ScrollContrast.Position := v; + UpdateFlame; + except on EConvertError do + txtContrast.Text := FloatToStr(cp.Contrast); + end; +end; + +procedure TAdjustForm.txtContrastKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = ',') then Key := '.'; //FormatSettings.DecimalSeparator; + if not CharinSet(Key,['0'..'9', #8, #13, '.']) + then Key:= #0; + if ((key = #13) and (txtContrast.Text <> EditBoxValue)) then + begin + key := #0; + txtContrastExit(sender); + end; +end; + +procedure TAdjustForm.txtCenterYExit(Sender: TObject); +var + v: integer; +begin + if (EditBoxValue <> txtCenterY.Text) then + try + v := Trunc(StrToFloat(txtCenterY.Text) * 1000); + if v > ScrollCenterY.Max then v := ScrollCenterY.Max; + if v < ScrollCenterY.Min then v := ScrollCenterY.Min; + ScrollCenterY.Position := v; + UpdateFlame; + except on EConvertError do + txtCenterY.Text := FloatToStr(cp.center[1]); + end; +end; + +procedure TAdjustForm.txtGammaEnter(Sender: TObject); +begin + EditBoxValue := txtGamma.Text; +end; + +procedure TAdjustForm.txtGammaExit(Sender: TObject); +var + v: integer; +begin + if (txtGamma.Text <> EditBoxValue) then + try + v := Trunc(StrToFloat(txtGamma.Text) * 100); + if v > scrollGamma.Max then v := scrollGamma.Max; + if v < scrollGamma.Min then v := scrollGamma.Min; + ScrollGamma.Position := v; + UpdateFlame; + except on EConvertError do + txtGamma.Text := FloatToStr(cp.gamma); + end; +end; + +procedure TAdjustForm.txtGammaKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = ',') then Key := '.'; //FormatSettings.DecimalSeparator; + if not CharinSet(Key,['0'..'9', #8, #13, '.']) + then Key:= #0; + if ((key = #13) and (txtGamma.Text <> EditBoxValue)) then + begin + key := #0; + txtGammaExit(sender); + end; +end; + +procedure TAdjustForm.txtBrightnessEnter(Sender: TObject); +begin + EditBoxValue := txtBrightness.Text; +end; + +procedure TAdjustForm.txtBrightnessExit(Sender: TObject); +var + v: integer; +begin + if (txtBrightness.Text <> EditBoxValue) then + try + v := Trunc(StrToFloat(txtBrightness.Text) * 100); + if v > scrollBrightness.Max then v := scrollBrightness.Max; + if v < scrollBrightness.Min then v := scrollBrightness.Min; + ScrollBrightness.Position := v; + UpdateFlame; + except on EConvertError do + txtBrightness.Text := FloatToStr(cp.brightness); + end; +end; + +procedure TAdjustForm.txtBrightnessKeyPress(Sender: TObject; + var Key: Char); +begin + if (Key = ',') then Key := '.'; //FormatSettings.DecimalSeparator; + if not CharinSet(Key,['0'..'9', #8, #13, '.']) + then Key:= #0; + if ((key = #13) and (txtBrightness.Text <> EditBoxValue)) then + begin + key := #0; + txtBrightnessExit(sender); + end; +end; + +procedure TAdjustForm.txtVibrancyEnter(Sender: TObject); +begin + EditBoxValue := txtVibrancy.Text; +end; + +procedure TAdjustForm.txtVibrancyKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = ',') then Key := '.'; + if not CharinSet(Key,['0'..'9', #8, #13, '.']) + then Key:= #0; + if ((key = #13) and (txtVibrancy.Text <> EditBoxValue)) then + begin + key := #0; + txtVibrancyExit(sender); + end; +end; + +procedure TAdjustForm.txtVibrancyExit(Sender: TObject); +var + v: integer; +begin + if (txtVibrancy.Text <> EditBoxValue) then + try + v := Trunc(StrToFloat(txtVibrancy.Text) * 100); + if v > scrollVibrancy.Max then v := scrollVibrancy.Max; + if v < scrollVibrancy.Min then v := scrollVibrancy.Min; + ScrollVibrancy.Position := v; + UpdateFlame; + except on EConvertError do + txtVibrancy.Text := FloatToStr(cp.Vibrancy); + end; +end; + +procedure TAdjustForm.scrollCameraScroll(Sender: TObject; + ScrollCode: TScrollCode; var ScrollPos: Integer); +begin + if ScrollCode = scEndScroll then UpdateFlame; +end; + +(* +procedure TAdjustForm.scrollCenterXScroll(Sender: TObject; + ScrollCode: TScrollCode; var ScrollPos: Integer); +begin + if ScrollCode = scEndScroll then UpdateFlame; +end; + +procedure TAdjustForm.scrollCenterYScroll(Sender: TObject; + ScrollCode: TScrollCode; var ScrollPos: Integer); +begin + if ScrollCode = scEndScroll then UpdateFlame; +end; + +procedure TAdjustForm.scrollGammaScroll(Sender: TObject; + ScrollCode: TScrollCode; var ScrollPos: Integer); +begin + if ScrollCode = scEndScroll then UpdateFlame; +end; + +procedure TAdjustForm.scrollBrightnessScroll(Sender: TObject; + ScrollCode: TScrollCode; var ScrollPos: Integer); +begin + if ScrollCode = scEndScroll then UpdateFlame; +end; + +procedure TAdjustForm.scrollVibrancyScroll(Sender: TObject; + ScrollCode: TScrollCode; var ScrollPos: Integer); +begin + if ScrollCode = scEndScroll then UpdateFlame; +end; + *) + +procedure TAdjustForm.scrollVibrancyScroll(Sender: TObject); +begin + cp.Vibrancy := ScrollVibrancy.Position / 100; + txtVibrancy.text := FloatToStr(cp.Vibrancy); + txtVibrancy.Refresh; + DrawPreview; +end; + +procedure TAdjustForm.scrollGammaChange(Sender: TObject); +begin + cp.Gamma := scrollGamma.Position / 100; + txtGamma.text := FloatToStr(cp.Gamma); + txtGamma.Refresh; + DrawPreview; +end; + +procedure TAdjustForm.scrollBrightnessChange(Sender: TObject); +begin + cp.Brightness := ScrollBrightness.Position / 100; + txtBrightness.text := FloatToStr(cp.Brightness); + txtBrightness.Refresh; + DrawPreview; +end; + +procedure TAdjustForm.scrollZoomChange(Sender: TObject); +begin + cp.zoom := scrollZoom.Position / 1000; + txtZoom.text := FloatToStr(cp.zoom); + txtZoom.Refresh; + DrawPreview; +end; + +procedure TAdjustForm.scrollCenterXChange(Sender: TObject); +begin + cp.center[0] := scrollCenterX.Position / 1000; + txtCenterX.text := FloatToStr(cp.center[0]); + txtCenterX.Refresh; + DrawPreview; +end; + +procedure TAdjustForm.scrollCenterYChange(Sender: TObject); +begin + cp.center[1] := scrollCenterY.Position / 1000; + txtCenterY.text := FloatToStr(cp.center[1]); + txtCenterY.Refresh; + DrawPreview; +end; + +procedure TAdjustForm.scrollContrastChange(Sender: TObject); +begin + cp.Contrast := ScrollContrast.Position / 100; + txtContrast.text := FloatToStr(cp.Contrast); + txtContrast.Refresh; + DrawPreview; +end; + +procedure TAdjustForm.ColorPanelClick(Sender: TObject); +var + col: Longint; +begin + ColorDialog.Color := ColorPanel.Color; + if ColorDialog.Execute then + begin + ColorPanel.Color := ColorDialog.Color; + Shape1.Brush.Color := ColorPanel.Color; + //cbColor.text := IntToHex(integer(ColorDialog.Color), 6); + col := ColorToRGB(ColorDialog.Color); + cp.background[0] := col and 255; + cp.background[1] := col shr 8 and 255; + cp.background[2] := col shr 16 and 255; + DrawPreview; + UpdateFlame(true); + end; +end; + +procedure TAdjustForm.Copyfragment1Click(Sender: TObject); +var i, j: integer; +begin + SetLength(tmpColors, selB - selA + 1, 3); + for i := 0 to selB - selA do + for j := 0 to 2 do + tmpColors[i, j] := palette[i + selA, j]; + PasteFragment1.Enabled := true; + MixColors.Enabled := true; +end; + +procedure TAdjustForm.curveChange(Sender: TObject); +begin + if CurvesControl = nil then Exit; + CurvesControl.ActiveChannel := TCurvesChannel(cbChannel.ItemIndex); + tbWeightLeft.Position := Round(cp.curveWeights[cbChannel.ItemIndex][1] * 10); //Round(CurvesControl.WeightLeft * 10); + tbWeightRight.Position := Round(cp.curveWeights[cbChannel.ItemIndex][2] * 10); //Round(CurvesControl.WeightRight * 10); +end; + +procedure TAdjustForm.scrollAngleChange(Sender: TObject); +begin + cp.FAngle := scrollAngle.Position * PI / 18000.0; + txtAngle.text := FloatToStr(cp.FAngle * 180 / PI); + txtAngle.Refresh; + DrawPreview; +end; + +(* + procedure TAdjustForm.scrollAngleScroll(Sender: TObject; + ScrollCode: TScrollCode; var ScrollPos: Integer); + begin + if ScrollCode = scEndScroll then UpdateFlame; + end; +*) + +procedure TAdjustForm.txtAngleEnter(Sender: TObject); +begin + EditBoxValue := txtAngle.Text; +end; + +procedure TAdjustForm.txtAngleKeyPress(Sender: TObject; var Key: Char); +var + v: integer; +begin + if (Key = ',') then Key := '.'; + if not CharinSet(Key,['0'..'9','-', #8, #13, '.']) + then Key:= #0; + if ((key = #13) and (txtAngle.Text <> EditBoxValue)) then + begin + key := #0; + try + v := Trunc(StrToFloat(txtAngle.Text) * 100) mod scrollAngle.Max; + //if v > scrollAngle.Max then v := v - scrollAngle.Max*2 + if v < scrollAngle.Min then v := v + scrollAngle.Max; + ScrollAngle.Position := v; + UpdateFlame; + EditBoxValue := txtAngle.Text; + except on EConvertError do + end; + end; +end; + +procedure TAdjustForm.txtAngleExit(Sender: TObject); +var + v: integer; +begin + if (txtAngle.Text <> EditBoxValue) then + try + v := Trunc(StrToFloat(txtAngle.Text) * 100) mod scrollAngle.Max; +// if v > scrollAngle.Max then v := v - scrollAngle.Max*2 +// else if v < scrollAngle.Min then v := v + scrollAngle.Max*2; + ScrollAngle.Position := v; + UpdateFlame; + except on EConvertError do + txtAngle.Text := FloatToStr(cp.FAngle * 180 / PI); + end; +end; + +// --Z-- // gradient stuff implementation -------------------------------------- + +procedure TAdjustForm.Apply; +begin + MainForm.StopThread; + MainForm.UpdateUndo; + + MainCp.CmapIndex := cmbPalette.ItemIndex; + MainCp.cmap := Palette; + SetCurvesCp(MainCp); + + if EditForm.visible then EditForm.UpdateDisplay; + if MutateForm.Visible then MutateForm.UpdateDisplay; + if CurvesForm.Visible then CurvesForm.SetCp(MainCp); + + if mnuInstantPreview.Checked then DrawPreview; + + if GradStatusBar.Panels[2].Text <> '' then GradStatusBar.Refresh; // AV + + MainForm.RedrawTimer.enabled := true; +end; + +procedure TAdjustForm.SaveMap(FileName: string); +var + i: Integer; + l: string; + MapFile: TextFile; +begin +{ Save a map file } + AssignFile(MapFile, FileName); + try + ReWrite(MapFile); + { first line with comment } + l := Format(' %3d %3d %3d Exported from Apophysis 2.0', [Palette[0][0], palette[0][1], + palette[0][2]]); + Writeln(MapFile, l); + { now the rest } + for i := 1 to 255 do + begin + l := Format(' %3d %3d %3d', [Palette[i][0], palette[i][1], + palette[i][2]]); + Writeln(MapFile, l); + end; + CloseFile(MapFile); + except + on EInOutError do Application.MessageBox(PChar(Format(TextByKey('common-genericopenerror'), [FileName])), 'Apophysis', 16); + end; +end; + +procedure TAdjustForm.UpdateGradient(Pal: TColorMap); +begin + ScrollBar.Position := 0; + + Palette := Pal; + BackupPal := Pal; +// DrawPalette; + + cp.cmap := pal; +// cp.copy(MainCp); + + if mnuInstantPreview.Checked then DrawPreview; +end; + +procedure HSVToRGB(H, S, V: real; var Rb, Gb, Bb: integer); +var + R, G, B, Sa, Va, Hue, i, f, p, q, t: real; +begin + R := 0; + G := 0; + B := 0; + Sa := S / 100; + Va := V / 100; + if S = 0 then + begin + R := Va; + G := Va; + B := Va; + end + else + begin + Hue := H / 60; + if Hue = 6 then Hue := 0; + i := Int(Hue); + f := Hue - i; + p := Va * (1 - Sa); + q := Va * (1 - (Sa * f)); + t := Va * (1 - (Sa * (1 - f))); + case Round(i) of + 0: begin + R := Va; + G := t; + B := p; + end; + 1: begin + R := q; + G := Va; + B := p; + end; + 2: begin + R := p; + G := Va; + B := t; + end; + 3: begin + R := p; + G := q; + B := Va; + end; + 4: begin + R := t; + G := p; + B := Va; + end; + 5: begin + R := Va; + G := p; + B := q; + end; + end; + end; + Rb := Round(Int(255.9999 * R)); + Gb := Round(Int(255.9999 * G)); + Bb := Round(Int(255.9999 * B)); +end; + +procedure RGBToHSV(R, G, B: byte; var H, S, V: real); +var + vRed, vGreen, vBlue, Mx, Mn, Va, Sa, rc, gc, bc: real; +begin + vRed := R / 255; + vGreen := G / 255; + vBlue := B / 255; + Mx := vRed; + if vGreen > Mx then Mx := vGreen; + if vBlue > Mx then Mx := vBlue; + Mn := vRed; + if vGreen < Mn then Mn := vGreen; + if vBlue < Mn then Mn := vBlue; + Va := Mx; + if Mx <> 0 then + Sa := (Mx - Mn) / Mx + else + Sa := 0; + if Sa = 0 then + H := 0 + else + begin + rc := (Mx - vRed) / (Mx - Mn); + gc := (Mx - vGreen) / (Mx - Mn); + bc := (Mx - vBlue) / (Mx - Mn); + if Mx = vRed then + H := bc - gc + else if Mx = vGreen then + H := 2 + rc - bc + else if Mx = vBlue then + H := 4 + gc - rc; + H := H * 60; + if H < 0 then H := H + 360; + end; + S := Sa * 100; + V := Va * 100; +end; + +function TAdjustForm.Blur(const Radius: Integer; const pal: TColorMap; start, last: byte): TColorMap; +var + r, g, b, n, i, j, k: Integer; +begin + Result := Pal; + if Radius <> 0 then + for i := start to last do // AV: changed from 0 - 255 + begin + n := -1; + r := 0; + g := 0; + b := 0; + for j := i - radius to i + radius do + begin + inc(n); + k := (256 + j) mod 256; + if k <> i then begin + r := r + Pal[k][0]; + g := g + Pal[k][1]; + b := b + Pal[k][2]; + end; + end; + if n <> 0 then begin + Result[i][0] := r div n; + Result[i][1] := g div n; + Result[i][2] := b div n; + end; + end; +end; + +function TAdjustForm.Frequency(const times: Integer; const pal: TColorMap): TColorMap; +{ This can be improved } +var + n, i, j: Integer; +begin + Result := Pal; + if times <> 1 then + begin + n := 256 div times; + for j := 0 to times do + for i := 0 to n do + begin + if ((i + j * n) < 256) and ((i * times) < 256) then + begin + Result[i + j * n][0] := pal[i * times][0]; + Result[i + j * n][1] := pal[i * times][1]; + Result[i + j * n][2] := pal[i * times][2]; + end; + end; + end; +end; + +function TAdjustForm.FrequencySel(const times: Integer; const pal: TColorMap): TColorMap; +var n, i, j, k: Integer; +begin + Result := Pal; + if times <> 1 then + begin + n := (selB - selA + 1) div times; + for j := 0 to times do + for i := 0 to n-1 do + begin + k := selA + i + j * n; + if k > selB then break; + Result[k][0] := pal[selA + i * times][0]; + Result[k][1] := pal[selA + i * times][1]; + Result[k][2] := pal[selA + i * times][2]; + end; + end; +end; + +procedure TAdjustForm.cmbPaletteChange(Sender: TObject); +var + i: integer; +begin + if Resetting then exit; + + i := cmbPalette.ItemIndex; + GetCmap(i, 1, Palette); + BackupPal := Palette; + ScrollBar.Position := 0; + //DrawPalette; +// MainForm.UpdateUndo; + Apply; + GradStatusBar.Refresh; +end; + +procedure TAdjustForm.mnuRedClick(Sender: TObject); +begin + btnMenu.Caption := TextByKey('adjustment-tab-curves-red'); + scrollMode := modeRed; + BackupPal := Palette; + ScrollBar.Min := -255; + ScrollBar.Max := 255; + ScrollBar.LargeChange := 15; + ScrollBar.Position := 0; +end; + +procedure TAdjustForm.mnuGreenClick(Sender: TObject); +begin + btnMenu.Caption := TextByKey('adjustment-tab-curves-green'); + scrollMode := modeGreen; + BackupPal := Palette; + ScrollBar.Min := -255; + ScrollBar.Max := 255; + ScrollBar.LargeChange := 15; + ScrollBar.Position := 0; +end; + +procedure TAdjustForm.mnuGreyscaleClick(Sender: TObject); +var + i, j, grey: integer; +begin + for i := 0 to 255 do + begin + grey := Round(0.3 * Palette[i,0] + 0.59 * Palette[i,1] + + 0.11 * Palette[i,2]); + for j := 0 to 2 do + Palette[i][j] := grey; + end; + UpdateGradient(palette); +// MainForm.UpdateUndo; + Apply; +end; + +procedure TAdjustForm.mnuBlueClick(Sender: TObject); +begin + btnMenu.Caption := TextByKey('adjustment-tab-curves-blue'); + scrollMode := modeBlue; + BackupPal := Palette; + ScrollBar.Min := -255; + ScrollBar.Max := 255; + ScrollBar.LargeChange := 15; + ScrollBar.Position := 0; +end; + +procedure TAdjustForm.mnuReverseClick(Sender: TObject); +var + i: integer; + pal: TColorMap; +begin + for i := 0 to 255 do begin + pal[i][0] := Palette[255 - i][0]; + pal[i][1] := Palette[255 - i][1]; + pal[i][2] := Palette[255 - i][2]; + end; + UpdateGradient(pal); +// MainForm.UpdateUndo; + Apply; +end; + +procedure TAdjustForm.mnuRGB2BGRClick(Sender: TObject); +var + i, j, r, g, b: integer; + pal: array of array of byte; +begin + case TMenuItem(Sender).Tag of + 0: begin r := 2; g := 1; b := 0; end; + 1: begin r := 1; g := 2; b := 0; end; + 2: begin r := 0; g := 2; b := 1; end; + 3: begin r := 1; g := 0; b := 2; end; + 4: begin r := 2; g := 0; b := 1; end; + else begin r := 0; g := 1; b := 2; end; + end; + + SetLength(pal, selB - selA + 1, 3); + for i := 0 to selB - selA do begin + pal[i][0] := Palette[i + selA][r]; + pal[i][1] := Palette[i + selA][g]; + pal[i][2] := Palette[i + selA][b]; + end; + for i := 0 to selB - selA do + for j := 0 to 2 do + Palette[i + selA][j] := Pal[i][j]; + UpdateGradient(palette); + Apply; +end; + +procedure TAdjustForm.mnuInvertClick(Sender: TObject); +var + i: integer; +begin + for i := 0 to 255 do + begin + Palette[i][0] := 255 - Palette[i][0]; + Palette[i][1] := 255 - Palette[i][1]; + Palette[i][2] := 255 - Palette[i][2]; + end; + UpdateGradient(palette); +// MainForm.UpdateUndo; + Apply; +end; + +procedure TAdjustForm.btnMenuClick(Sender: TObject); +begin + scrollModePopup.Popup(btnMenu.ClientOrigin.x, btnMenu.ClientOrigin.y + btnMenu.Height); +end; + +procedure TAdjustForm.ScrollBarChange(Sender: TObject); +var + intens, i, r, g, b, lab: integer; + na, nb: byte; + h, s, v: real; +begin + txtVal.Text := IntToStr(ScrollBar.Position); + txtVal.Refresh; + + if Resetting then exit; + + GradientChanged:=true; // hmm + + // AV: allow user to manipulate the palette's segment + if not AdjustSelected.Checked then begin + na := 0; nb := 255; + end else begin + na := selA; nb := selB; + end; + + case scrollMode of + modeHue: + for i := na to nb do + begin + RGBToHSV(BackupPal[i][0], BackupPal[i][1], BackupPal[i][2], h, s, v); + if s <> 0 then // --Z-- (?) + // AV: when saturation = 0, hue doesn't matter + begin + h := Round(360 + h + ScrollBar.Position) mod 360; + HSVToRGB(h, s, v, Palette[i][0], Palette[i][1], Palette[i][2]); + end; + end; + modeSaturation: + for i := na to nb do + begin + RGBToHSV(BackupPal[i][0], BackupPal[i][1], BackupPal[i][2], h, s, v); + if s <> 0 then // --Z-- //(?) + begin + s := s + ScrollBar.Position; + if s > 100 then s := 100; + if s < 0 then s := 0; + HSVToRGB(h, s, v, Palette[i][0], Palette[i][1], Palette[i][2]); + end; + end; + modeLuminance: // AV + for i := na to nb do + begin + RGBToHSV(BackupPal[i][0], BackupPal[i][1], BackupPal[i][2], h, s, v); + v := v + ScrollBar.Position; + if v > 100 then v := 100; + if v < 0 then v := 0; + HSVToRGB(h, s, v, Palette[i][0], Palette[i][1], Palette[i][2]); + end; + modeContrast: + begin + intens := scrollBar.Position; + if intens > 0 then intens := intens * 2; + for i := na to nb do + begin + r := BackupPal[i][0]; + g := BackupPal[i][1]; + b := BackupPal[i][2]; + r := round(r + intens / 100 * (r - 127)); + g := round(g + intens / 100 * (g - 127)); + b := round(b + intens / 100 * (b - 127)); + if R > 255 then R := 255 else if R < 0 then R := 0; + if G > 255 then G := 255 else if G < 0 then G := 0; + if B > 255 then B := 255 else if B < 0 then B := 0; + Palette[i][0] := r; + Palette[i][1] := g; + Palette[i][2] := b; + end; + end; + modeBrightness: + for i := na to nb do + begin + Palette[i][0] := BackupPal[i][0] + ScrollBar.Position; + if Palette[i][0] > 255 then Palette[i][0] := 255; + if Palette[i][0] < 0 then Palette[i][0] := 0; + Palette[i][1] := BackupPal[i][1] + ScrollBar.Position; + if Palette[i][1] > 255 then Palette[i][1] := 255; + if Palette[i][1] < 0 then Palette[i][1] := 0; + Palette[i][2] := BackupPal[i][2] + ScrollBar.Position; + if Palette[i][2] > 255 then Palette[i][2] := 255; + if Palette[i][2] < 0 then Palette[i][2] := 0; + end; + modeRotate: + if not AdjustSelected.Checked then + begin + ScrollBar.Min := -128; + ScrollBar.Max := 128; + ScrollBar.LargeChange := 16; + for i := 0 to 255 do + begin + Palette[i][0] := BackupPal[(256 + i - ScrollBar.Position) mod 256][0]; + Palette[i][1] := BackupPal[(256 + i - ScrollBar.Position) mod 256][1]; + Palette[i][2] := BackupPal[(256 + i - ScrollBar.Position) mod 256][2]; + end; + end + else begin + lab := selB - selA + 1; + if lab > 255 then lab := 255; + ScrollBar.Max := lab; + ScrollBar.Min := -lab; + ScrollBar.LargeChange := 2; + if ScrollBar.Position > 0 then + for i := na to nb do + begin + lab := i - ScrollBar.Position; + if lab < selA then lab := lab + nb - na + 1; + Palette[i][0] := BackupPal[lab][0]; + Palette[i][1] := BackupPal[lab][1]; + Palette[i][2] := BackupPal[lab][2]; + end else + for i := na to nb do + begin + lab := i - ScrollBar.Position; + if lab > selB then lab := lab - nb + na - 1; + Palette[i][0] := BackupPal[lab][0]; + Palette[i][1] := BackupPal[lab][1]; + Palette[i][2] := BackupPal[lab][2]; + end; + end; + modeBlur: + begin + if not AdjustSelected.Checked then + begin + ScrollBar.Max := 127; + ScrollBar.LargeChange := 15; + end else begin + ScrollBar.Max := (selB - selA) div 2; + ScrollBar.LargeChange := 2; + end; + Palette := Blur(ScrollBar.Position, BackupPal, na, nb); + end; + modeFrequency: + if not AdjustSelected.Checked then + Palette := Frequency(ScrollBar.Position, BackupPal) + else Palette := FrequencySel(ScrollBar.Position, BackupPal); + modeRed: // AV + for i := na to nb do + begin + Palette[i][0] := BackupPal[i][0] + ScrollBar.Position; + if Palette[i][0] > 255 then Palette[i][0] := 255; + if Palette[i][0] < 0 then Palette[i][0] := 0; + end; + modeGreen: // AV + for i := na to nb do + begin + Palette[i][1] := BackupPal[i][1] + ScrollBar.Position; + if Palette[i][1] > 255 then Palette[i][1] := 255; + if Palette[i][1] < 0 then Palette[i][1] := 0; + end; + modeBlue: // AV + for i := na to nb do + begin + Palette[i][2] := BackupPal[i][2] + ScrollBar.Position; + if Palette[i][2] > 255 then Palette[i][2] := 255; + if Palette[i][2] < 0 then Palette[i][2] := 0; + end; + end; + + cp.cmap:=Palette; + DrawPreview; +end; + +procedure TAdjustForm.ScrollBarScroll(Sender: TObject; + ScrollCode: TScrollCode; var ScrollPos: Integer); +begin + if ScrollCode = scEndScroll then + begin + GradientChanged:=false; + Apply; + end; +end; + +{ ***************************** Adjust menu ********************************* } + +procedure TAdjustForm.mnuRotateClick(Sender: TObject); +begin + btnMenu.Caption := TextByKey('adjustment-tab-gradient-moderotate'); + scrollMode:=modeRotate; + + BackupPal := Palette; + ScrollBar.Min := -128; + ScrollBar.Max := 128; + ScrollBar.LargeChange := 16; + ScrollBar.Position := 0; +end; + +procedure TAdjustForm.mnuHueClick(Sender: TObject); +begin + btnMenu.Caption := TextByKey('adjustment-tab-gradient-modehue'); + scrollMode:=modeHue; + + BackupPal := Palette; + ScrollBar.Min := -180; + ScrollBar.Max := 180; + ScrollBar.LargeChange := 15; + ScrollBar.Position := 0; +end; + +procedure TAdjustForm.mnuSaturationClick(Sender: TObject); +begin + btnMenu.Caption := TextByKey('adjustment-tab-gradient-modesaturation'); + scrollMode:=modeSaturation; + + BackupPal := Palette; + ScrollBar.Min := -100; + ScrollBar.Max := 100; + ScrollBar.LargeChange := 15; + ScrollBar.Position := 0; +end; + +procedure TAdjustForm.mnuLuminanceClick(Sender: TObject); +begin + btnMenu.Caption := TextByKey('adjustment-tab-gradient-modeluminance'); + scrollMode := modeLuminance; + BackupPal := Palette; + + ScrollBar.Min := -100; + ScrollBar.Max := 100; + ScrollBar.LargeChange := 15; + ScrollBar.Position := 0; +end; + +procedure TAdjustForm.mnuBrightnessClick(Sender: TObject); +begin + btnMenu.Caption := TextByKey('adjustment-tab-gradient-modebrightness'); + scrollMode := modeBrightness; + + BackupPal := Palette; + ScrollBar.Min := -255; + ScrollBar.Max := 255; + ScrollBar.LargeChange := 15; + ScrollBar.Position := 0; +end; + +procedure TAdjustForm.mnuContrastClick(Sender: TObject); +begin + btnMenu.Caption := TextByKey('adjustment-tab-gradient-modecontrast'); + scrollMode := modeContrast; + BackupPal := Palette; + + ScrollBar.Min := -100; + ScrollBar.Max := 100; + ScrollBar.LargeChange := 15; + ScrollBar.Position := 0; +end; + +procedure TAdjustForm.mnuBlurClick(Sender: TObject); +begin + btnMenu.Caption := TextByKey('adjustment-tab-gradient-modeblur'); + scrollMode := modeBlur; + + BackupPal := Palette; + ScrollBar.Min := 0; + ScrollBar.Max := 127; + ScrollBar.LargeChange := 15; + ScrollBar.Position := 0; +end; + +procedure TAdjustForm.mnuFrequencyClick(Sender: TObject); +begin + btnMenu.Caption := TextByKey('adjustment-tab-gradient-modefrequency'); + scrollMode := modeFrequency; + + BackupPal := Palette; + ScrollBar.Min := 1; + ScrollBar.Max := 10; + ScrollBar.LargeChange := 1; + ScrollBar.Position := 1; +end; + +// ----------------------------------------------------------------------------- + +procedure TAdjustForm.btnOpenClick(Sender: TObject); +begin + GradientBrowser.Filename := GradientFile; + GradientBrowser.Show; +end; + +procedure TAdjustForm.mnuSmoothPaletteClick(Sender: TObject); +begin + MainForm.SmoothPalette; +end; + +procedure TAdjustForm.SaveGradient1Click(Sender: TObject); +var + gradstr: TStringList; +begin + gradstr := TStringList.Create; + try + SaveForm.SaveType := stSaveGradient; + SaveForm.Filename := GradientFile; + SaveForm.Title := MainCp.name; + if SaveForm.ShowModal = mrOK then + begin + gradstr.add(CleanIdentifier(SaveForm.Title) + ' {'); + gradstr.add(MainForm.GradientFromPalette(Palette, SaveForm.Title)); + gradstr.add('}'); + if MainForm.SaveGradient(gradstr.text, SaveForm.Title, SaveForm.Filename) then + GradientFile := SaveForm.FileName; + end; + finally + gradstr.free + end; +end; + +procedure TAdjustForm.SaveasMapfile1Click(Sender: TObject); +begin + SaveDialog.Filename := MainCp.name + '.map'; + SaveDialog.Filter := Format('%s|*.map|%s|*.*', [ + TextByKey('common-filter-fractintfiles'), + TextByKey('common-filter-allfiles')]); + if SaveDialog.execute then + SaveMap(SaveDialog.Filename); +end; + +procedure TAdjustForm.cmbPaletteDrawItem(Control: TWinControl; + Index: Integer; Rect: TRect; State: TOwnerDrawState); +var + i, j: integer; + Row: pRGBTripleArray; + Bitmap: TBitmap; + pal: TColorMap; + PalName: string; +begin +{ Draw the preset palettes on the combo box items } + GetCMap(index, 1, pal); + GetCmapName(index, PalName); + + BitMap := TBitMap.create; + Bitmap.PixelFormat := pf24bit; + BitMap.Width := 256; + BitMap.Height := 100; + + for j := 0 to Bitmap.Height - 1 do + begin + Row := Bitmap.Scanline[j]; + for i := 0 to Bitmap.Width - 1 do + begin + with Row[i] do + begin + rgbtRed := Pal[i][0]; + rgbtGreen := Pal[i][1]; + rgbtBlue := Pal[i][2]; + end + end + end; + with Control as TComboBox do + begin + Canvas.Rectangle(Rect); + + Canvas.TextOut(4, Rect.Top, PalName); + Rect.Left := (Rect.Left + rect.Right) div 2; + Canvas.StretchDraw(Rect, Bitmap); + end; + BitMap.Free; +end; + +procedure TAdjustForm.btnCopyClick(Sender: TObject); +var + gradstr: TStringList; +begin + gradstr := TStringList.Create; + try + gradstr.add(CleanIdentifier(MainCp.name) + ' {'); + gradstr.add('gradient:'); + gradstr.add(' title="' + MainCp.name + '" smooth=no'); + gradstr.add(GradientString(Palette)); + gradstr.add('}'); + Clipboard.SetTextBuf(PChar(gradstr.text)); + btnPaste.enabled := true; + mnuPaste.enabled := true; + MainForm.mnuPaste.enabled := False; + finally + gradstr.free + end; +end; + +procedure TAdjustForm.btnPasteClick(Sender: TObject); +begin + //if Clipboard.HasFormat(CF_TEXT) then // AV: sometimes it isn't enough... + if GradientInClipboard then // AV + begin + UpdateGradient(CreatePalette(Clipboard.AsText)); + Apply; + end + else begin + btnPaste.Enabled := False; // AV + mnuPaste.Enabled := False; // AV + end; +end; + +function GradientInClipboard: boolean; +var + gradstr: TStringList; +begin + { returns true if gradient in clipboard - can be tricked } + result := true; + if Clipboard.HasFormat(CF_TEXT) then + begin + gradstr := TStringList.Create; + try + gradstr.text := ''; + try + gradstr.text := Clipboard.AsText; + finally + end; + if (Pos('}', gradstr.text) = 0) or (Pos('{', gradstr.text) = 0) or + (Pos('gradient:', gradstr.text) = 0) or (Pos('fractal:', gradstr.text) <> 0) then + begin + result := false; + exit; + end; + finally + gradstr.free; + end; + end + else + result := false; +end; + +procedure TAdjustForm.AdjustColorFragmentClick(Sender: TObject); +begin + if ColorSelection.ShowModal = mrOK then + begin + GradStatusBar.Panels[2].Text := TextByKey('adjustment-tab-gradient-start') + space + IntToStr(selA); + GradStatusBar.Panels[4].Text := TextByKey('adjustment-tab-gradient-last') + space + IntToStr(selB); + GradStatusBar.Refresh; + GradSelection.Refresh; + AdjustSelected.Checked := True; + //btnSelected.Visible := True; + end; +end; + +(* +procedure TAdjustForm.ApplicationEventsActivate(Sender: TObject); +begin + if GradientInClipboard then begin + mnuPaste.enabled := true; + btnPaste.enabled := true; + end + else + begin + mnuPaste.enabled := false; + btnPaste.enabled := false; + end; +end; +*) + +procedure TAdjustForm.mnuSaveasDefaultClick(Sender: TObject); +begin + DefaultPalette := Palette; + if not DirectoryExists(AppPath + 'Gradients\') then + CreateDir(AppPath + 'Gradients\'); // AV + SaveMap(AppPath + 'Gradients\default.map'); +end; + +procedure TAdjustForm.mnuSepiaClick(Sender: TObject); +var i, sep: integer; +begin + for i := 0 to 255 do + begin + sep := Round(0.299 * Palette[i,0] + 0.587 * Palette[i,1] + 0.114 * Palette[i,2]); + Palette[i,0] := IfThen(sep > 206, 255, sep + 49); + Palette[i,1] := IfThen(sep < 14, 0, sep - 14); + Palette[i,2] := IfThen(sep < 56, 0, sep - 56); + end; + UpdateGradient(palette); + Apply; +end; + +procedure TAdjustForm.mnuSetColorClick(Sender: TObject); +var + i: integer; + col: Longint; +begin + ColorDialog.Color := RGB(Palette[selA,0], Palette[selA,1], Palette[selA,2]); + if ColorDialog.Execute then + begin + col := ColorToRGB(ColorDialog.Color); + for i := selA to selB do + begin + Palette[i, 0] := col and 255; + Palette[i, 1] := col shr 8 and 255; + Palette[i, 2] := col shr 16 and 255; + end; + UpdateGradient(Palette); + Apply; + end; +end; + +procedure TAdjustForm.mnuRandomizeClick(Sender: TObject); +begin + UpdateGradient(GradientHelper.RandomGradient); + Apply; +end; + +procedure TAdjustForm.GradientImageDblClick(Sender: TObject); +begin + mnuRandomizeClick(Sender); +end; + +procedure TAdjustForm.GradientImageMouseLeave(Sender: TObject); +begin + GradStatusBar.Panels[0].Text := ''; + GradStatusBar.Refresh; +end; + +procedure TAdjustForm.GradImageMouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + if Button = mbLeft then + begin + dragX:=x; + oldX:=x; // hmmm + oldpos := (((x) shl 8) div GradientImage.Width) mod 256; + if oldpos = 0 then oldpos := 1; + startX := Round(x / (GradientImage.Width-1) * 255); // AV + if startX < 0 then startX := 0 + else if startX > 255 then startX := 255; + tmpBackupPal := BackupPal; + if ssCtrl in Shift then + imgDragMode := imgDragStretch + else if ssAlt in Shift then // AV + imgDragMode := imgDragSelect + else + imgDragMode := imgDragRotate; + GradientChanged:=false; + end; +end; + +procedure TAdjustForm.GradImageMouseMove(Sender: TObject; + Shift: TShiftState; X, Y: Integer); + procedure StretchGradient(i0, i1, j0, j1: integer); + var + k, f: double; + i, j, jj, n: integer; + begin + k := (j1 - j0) / (i1 - i0); + + if k >= 1 then + begin + for i := i0 to i1-1 do + begin + j := j0 + round((i - i0) * k); + +assert(j >= 0); +assert(j < 256); + + cp.cmap[i] := Palette[j]; + BackupPal[i] := tmpBackupPal[j]; //? + end; + end + else begin + for i := i0 to i1-1 do + begin + f := (i - i0) * k; + j := j0 + trunc(f); + f := frac(f); + +assert(j >= 0); +assert(j < 256); + + if j < 255 then jj := j + 1 + else jj := 0; + for n := 0 to 2 do begin + cp.cmap[i][n] := round( Palette[j][n]*(1-f) + Palette[jj][n]*f ); + BackupPal[i][n] := round( tmpBackupPal[j][n]*(1-f) + tmpBackupPal[jj][n]*f ); //? + end; + end; + end; + end; +var + i, j, t: integer; + k: double; +begin + t := Round(x / (GradientImage.Width-1) * 255) ; + if (t < 0) then t := 0 + else if (t > 255) then t := 255; + GradStatusBar.Panels[0].Text := TextByKey('adjustment-tab-gradient-current') + space + IntToStr(t); + GradStatusBar.Refresh; + if (imgDragMode <> imgDragNone) and (oldX<>x) then + begin + oldX:=x; + offset := (((x - dragX) shl 8) div GradientImage.Width) mod 256; + txtVal.Text:=IntToStr(offset); + txtVal.Refresh; + //ScrollBar.Position := offset; + GradientChanged := true; + + if imgDragmode = imgDragRotate then begin + for i := 0 to 255 do + begin + cp.cmap[i] := Palette[(256 + i - offset) and $FF]; + + BackupPal[i] := tmpBackupPal[(256 + i - offset) and $FF]; + end; + end + else if imgDragMode = imgDragSelect then + begin + selA := startX; + selB := Round(x / (GradientImage.Width-1) * 255); + if (selA > selB) then begin + t := selA; + selA := selB; + selB := t; + end; + if (selA < 0) then selA := 0 + else if (selA > 255) then selA := 255; + if (selB < 0) then selB := 0 + else if (selB > 255) then selB := 255; + if (selB - selA > 1) then begin + //btnSelected.Visible := True; + AdjustSelected.Checked := True; + end; + GradStatusBar.Panels[2].Text := TextByKey('adjustment-tab-gradient-start') + space + IntToStr(selA); + GradStatusBar.Panels[4].Text := TextByKey('adjustment-tab-gradient-last') + space + IntToStr(selB); + GradStatusBar.Refresh; + GradSelection.Refresh; + end + else begin + offset := ((x shl 8) div GradientImage.Width); + if offset <= 0 then offset := 1 + else if offset > 255 then offset := 255; + + StretchGradient(0, offset, 0, oldpos); + StretchGradient(offset, 256, oldpos, 256); + end; + + DrawPreview; + end; +end; + +procedure TAdjustForm.GradImageMouseUp(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + if imgDragMode <> imgDragNone then + begin + imgDragMode := imgDragNone; + txtVal.Text := '0'; + Palette := cp.cmap; + if GradientChanged then Apply; + end; +end; + +procedure TAdjustForm.GradSelectionPaint(Sender: TObject); +var + w: double; +begin + w := GradSelection.Width / 255; + GradSelection.Canvas.Brush.Color := BrightColor; + GradSelection.Canvas.FillRect(Rect(Round(w * selA), 0, Round(w * selB), 7)); +end; + +procedure TAdjustForm.GradStatusBarDblClick(Sender: TObject); +begin + // AV: resetting color selection + AdjustSelected.Checked := False; + GradStatusBar.Panels[2].Text := ''; + GradStatusBar.Panels[4].Text := ''; + GradStatusBar.Refresh; + //btnSelected.Visible := False; + selA := 0; selB := 255; + GradSelection.Refresh; +end; + +procedure TAdjustForm.GradStatusBarDrawPanel(StatusBar: TStatusBar; + Panel: TStatusPanel; const Rect: TRect); +var i, n: integer; + s: string; +begin + n := Panel.Index; + if Odd(n) then + if (StatusBar.Panels[n-1].Text <> '') then + begin + s := StatusBar.Panels[n-1].Text; + n := pos(space, s); + s := copy(s, n + 4, length(s) - n + 1); + i := StrToInt(s); + i := RGB(palette[i, 0], palette[i, 1], palette[i, 2]); + StatusBar.Canvas.Brush.Color := i; + StatusBar.Canvas.FillRect(Rect); + end; +end; + +// AV: operations with selected color fragments + +procedure TAdjustForm.InvertColorsClick(Sender: TObject); +var + i: integer; +begin + for i := selA to selB do + begin + Palette[i][0] := 255 - Palette[i][0]; + Palette[i][1] := 255 - Palette[i][1]; + Palette[i][2] := 255 - Palette[i][2]; + end; + UpdateGradient(palette); + Apply; +end; + +procedure TAdjustForm.LerpHSVClick(Sender: TObject); +begin + cmap.HSVBlend(selA, selB, palette); + UpdateGradient(palette); + Apply; +end; + +procedure TAdjustForm.LerpRGBClick(Sender: TObject); +begin + cmap.RGBBlend(selA, selB, palette); + UpdateGradient(palette); + Apply; +end; + +procedure TAdjustForm.MixcolorsClick(Sender: TObject); +var i, j, l: integer; +begin + l := High(tmpColors); + l := Min(selA + l, selB); + for i := selA to l do + for j := 0 to 2 do + Palette[i][j] := Round((Palette[i][j] + tmpColors[i - selA][j])/2); + UpdateGradient(palette); + Apply; +end; + +procedure TAdjustForm.Pastefragment1Click(Sender: TObject); +var i, j, l: integer; +begin + l := High(tmpColors); + l := Min(selA + l, selB); + for i := selA to l do + for j := 0 to 2 do Palette[i][j] := tmpColors[i - selA][j]; + UpdateGradient(palette); + Apply; +end; + +procedure TAdjustForm.ReverseFragmentClick(Sender: TObject); + var + i, j: integer; + pal: array of array of byte; +begin + SetLength(pal, selB - selA + 1, 3); + for i := selA to selB do + for j := 0 to 2 do + pal[i - selA][j] := Palette[i][j]; + for i := 0 to selB - selA do + for j := 0 to 2 do + Palette[selB - i][j] := Pal[i][j]; + UpdateGradient(palette); + Apply; +end; + +// --Z-- // image size functions ----------------------------------------------- + +function TAdjustForm.PresetToStr(n: integer): string; +begin + Result:=IntToStr(Preset[n].Width) + ' x ' + IntToStr(Preset[n].Height) +end; + +procedure TAdjustForm.RandomizeSelectedClick(Sender: TObject); +var i, j: integer; + tempPal: TColorMap; +begin + tempPal := GradientHelper.RandomGradient; + for i := selA to selB do + for j := 0 to 2 do + Palette[i, j] := tempPal[i, j]; + UpdateGradient(palette); + Apply; +end; + +procedure TAdjustForm.ReadPreset(n: integer); +begin + ImageWidth := Preset[n].Width; + ImageHeight := Preset[n].Height; + txtWidth.Text := IntToStr(ImageWidth); + txtHeight.Text := IntToStr(ImageHeight); + + if chkResizeMain.Checked then begin + MainForm.Left:=Preset[n].Left; + MainForm.Top:=Preset[n].Top; + end; + + SetMainWindowSize; +end; + +procedure TAdjustForm.WeightChange(Sender: TObject); +begin + CurvesControl.WeightLeft := tbWeightLeft.Position / 10.0; + CurvesControl.WeightRight := tbWeightRight.Position / 10.0; + + cp.curveWeights[cbChannel.ItemIndex][1] := tbWeightLeft.Position / 10.0; + cp.curveWeights[cbChannel.ItemIndex][2] := tbWeightRight.Position / 10.0; + + DrawPreview; +end; + +procedure TAdjustForm.WeightScroll(Sender: TObject; ScrollCode: TScrollCode; + var ScrollPos: Integer); +begin + if ScrollCode <> scEndScroll then Exit; + + MainForm.StopThread; + MainForm.UpdateUndo; + MainCp.Copy(cp, true); + + if EditForm.Visible then EditForm.UpdateDisplay; + if MutateForm.Visible then MutateForm.UpdateDisplay; + if CurvesForm.Visible then CurvesForm.SetCp(cp); + + MainForm.RedrawTimer.enabled := true; +{ if ScrollCode = scEndScroll then + CurvesControl.UpdateFlame; } +end; + +procedure TAdjustForm.WritePreset(n: integer); +var + Registry: TRegistry; + w,h: integer; +begin + // Write preset to registry + Registry := TRegistry.Create; + try + w:=StrToInt(txtWidth.text); + h:=StrToInt(txtHeight.text); + if (w>0) and (h>0) then begin + Preset[n].Left:=MainForm.Left; + Preset[n].Top:=MainForm.Top; + Preset[n].Width:=w; + Preset[n].Height:=h; + end + else exit; + + Registry.RootKey := HKEY_CURRENT_USER; + if Registry.OpenKey('\Software\' + APP_NAME + '\ImageSizePresets', True) then + begin + Registry.WriteInteger('Preset'+IntToStr(n)+'Left', Preset[n].Left); + Registry.WriteInteger('Preset'+IntToStr(n)+'Top', Preset[n].Top); + Registry.WriteInteger('Preset'+IntToStr(n)+'Width', Preset[n].Width); + Registry.WriteInteger('Preset'+IntToStr(n)+'Height', Preset[n].Height); + end; + except + end; +end; + +function IsNumeric(s: string): boolean; +var + i: integer; + start:integer; +begin + Result := True; + s := trim(s); + if Length(s) = 0 then begin + result := false; + exit; + end; + + start := 1; + if (s[1] = '-') then + start := 2; + + for i:=start to length(s) do + if not (CharInSet(s[i],['0'..'9'])) then + begin + Result := False; + exit; + end; +end; + +procedure TAdjustForm.txtValExit(Sender: TObject); +begin + if (not IsNumeric(txtVal.Text)) then begin + { It's not, so we restore the old value } + txtVal.Text := IntToStr(ScrollBar.Position); + exit; + end; + + ScrollBar.Position := StrToInt(Trim(txtVal.Text)); + txtVal.Text := Trim(txtVal.Text); + + UpdateFlame; +end; + +procedure TAdjustForm.txtSizeKeyPress(Sender: TObject; var Key: Char); +begin + if key = #13 then + begin + key := #0; + SetMainWindowSize; + end; +end; + +procedure TAdjustForm.cbAspectRatioChange(Sender: TObject); +begin + case cbAspectRatio.ItemIndex of + 1: Ratio := ImageWidth / ImageHeight; + 2: Ratio := 1.5; + 3: Ratio := 4 / 3; + 4: Ratio := 1.25; + 5: Ratio := 16 / 9; + 6: Ratio := 1.6; + 7: Ratio := 21 / 9; + end; +end; + +//procedure TAdjustForm.chkMaintainClick(Sender: TObject); +//begin +// Ratio := ImageWidth / ImageHeight; +//end; + +procedure TAdjustForm.SetMainWindowSize; +var + l, t, w, h: integer; +begin + MainCp.AdjustScale(ImageWidth, ImageHeight); + MainForm.ResizeImage; //? + + if chkResizeMain.Checked then begin + l := MainForm.Left; + t := MainForm.Top; + w := ImageWidth + MainForm.Width - (MainForm.BackPanel.Width - 2); + h := ImageHeight + MainForm.Height - (MainForm.BackPanel.Height - 2); + if w > Screen.Width then + begin + l := 0; + w := Screen.width; + end; + if h > Screen.height then + begin + t := 0; + h := Screen.height; + end; + + MainForm.SetBounds(l, t, w, h); + end; + MainForm.RedrawTimer.Enabled := true; +end; + +procedure TAdjustForm.GetMainWindowSize; +begin + ImageWidth := MainCP.Width; + ImageHeight := MainCP.Height; + txtWidth.text := IntToStr(ImageWidth); + txtHeight.text := IntToStr(ImageHeight); +end; + +procedure TAdjustForm.btnSelectedClick(Sender: TObject); +begin + SelectedPopup.Popup(btnSelected.ClientOrigin.x, btnSelected.ClientOrigin.y + btnSelected.Height); +end; + +procedure TAdjustForm.btnSelectedMouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + if Button = mbRight then AdjustColorFragmentClick(Sender); +end; + +procedure TAdjustForm.btnSet1Click(Sender: TObject); +begin + WritePreset(1); + btnPreset1.Caption := PresetToStr(1); + SetMainWindowSize; +end; + +procedure TAdjustForm.btnSet2Click(Sender: TObject); +begin + WritePreset(2); + btnPreset2.Caption := PresetToStr(2); + SetMainWindowSize; +end; + +procedure TAdjustForm.btnSet3Click(Sender: TObject); +begin + WritePreset(3); + btnPreset3.Caption := PresetToStr(3); + SetMainWindowSize; +end; + +procedure TAdjustForm.btnPreset1Click(Sender: TObject); +begin + ReadPreset(1); +end; + +procedure TAdjustForm.btnPreset2Click(Sender: TObject); +begin + ReadPreset(2); +end; + +procedure TAdjustForm.btnPreset3Click(Sender: TObject); +begin + ReadPreset(3); +end; + +procedure TAdjustForm.txtWidthChange(Sender: TObject); +begin + try + ImageWidth := StrToInt(txtWidth.Text); + if (cbAspectRatio.ItemIndex > 0) and txtWidth.Focused then + begin + ImageHeight := Round(ImageWidth / ratio); + txtHeight.Text := IntToStr(ImageHeight) + end; + except + end; +end; + +procedure TAdjustForm.txtHeightChange(Sender: TObject); +begin + try + ImageHeight := StrToInt(txtHeight.Text); + if (cbAspectRatio.ItemIndex > 0) and txtHeight.Focused then + begin + ImageWidth := Round(ImageHeight * ratio); + txtWidth.Text := IntToStr(ImageWidth) + end; + except + end; +end; + +procedure TAdjustForm.btnUndoClick(Sender: TObject); +begin + MainForm.Undo; +end; + +procedure TAdjustForm.btResetZoomClick(Sender: TObject); +var v: double; +begin + if cp.zoom = 0 then exit; // prevent useless updates + v := cp.pixels_per_unit * power(2, cp.zoom); + cp.pixels_per_unit := v; + editPPU.Text := Format('%.6g', [100 * v / PreviewImage.Width]); + cp.zoom := 0; + txtZoom.Text := '0'; + scrollZoom.Position := 0; + UpdateFlame; +end; + +procedure TAdjustForm.btnRedoClick(Sender: TObject); +begin + MainForm.Redo; +end; + +procedure TAdjustForm.btnColorPresetClick(Sender: TObject); +begin + cmbPalette.ItemIndex := Random(NRCMAPS); + cmbPaletteChange(Sender); +end; + +procedure TAdjustForm.btnApplySizeClick(Sender: TObject); +begin + SetMainWindowSize; +end; + +procedure TAdjustForm.mnuInstantPreviewClick(Sender: TObject); +begin + mnuInstantPreview.Checked := not mnuInstantPreview.Checked; +end; + +procedure TAdjustForm.editPPUKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = ',') then Key := '.'; + if not CharinSet(Key,['0'..'9', #8, #13, '.']) + then Key:= #0; + if key=#13 then + begin + key := #0; + editPPUValidate(Sender); + end; +end; + +procedure TAdjustForm.editPPUValidate(Sender: TObject); +var + v: double; +begin + try + v := strtofloat(editPPU.Text); + except + exit; + end; + v := v/100*PreviewImage.Width; + if (v > 0) and (cp.pixels_per_unit <> v) then begin + MainForm.UpdateUndo; + cp.pixels_per_unit := v; + UpdateFlame; + end; +end; + +// ----------------------------------------------------------------------------- + +procedure TAdjustForm.DragPanelMouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +var enableDrag : boolean ; +begin + if Button <> mbLeft then exit; + + enableDrag := true; + if (Sender = pnlMasterScale) then + pnlDragValue := cp.pixels_per_unit / PreviewImage.Width + else if (Sender = pnlZoom) then + pnlDragValue := cp.zoom + else if (Sender = pnlXpos) then + pnlDragValue := cp.Center[0] + else if (Sender = pnlYpos) then + pnlDragValue := cp.Center[1] + else if (Sender = pnlAngle) then + pnlDragValue := cp.FAngle + else if (Sender = pnlGamma) then + pnlDragValue := cp.gamma + else if (Sender = pnlBrightness) then + pnlDragValue := cp.brightness + else if (Sender = pnlVibrancy) then + pnlDragValue := cp.vibrancy + // 3d camera controls + else if (Sender = pnlPitch) then + pnlDragValue := cp.cameraPitch * 180.0 / PI + else if (Sender = pnlYaw) then + pnlDragValue := cp.cameraYaw * 180.0 / PI + else if (Sender = pnlRoll) then // AV + pnlDragValue := cp.cameraRoll * 180.0 / PI + else if (Sender = pnlPersp) then + pnlDragValue := cp.cameraPersp + else if (Sender = pnlZpos) then + pnlDragValue := cp.cameraZpos + else if (Sender = pnlDOF) then + pnlDragValue := cp.cameraDOF + else if (Sender = pnlGammaThreshold) then + pnlDragValue := cp.gammaThreshRelative + else if (Sender = pnlContrast) then // AV + pnlDragValue := cp.contrast // AV + else enableDrag := false; //assert(false)}; + + if enableDrag then begin + pnlDragMode := true; + pnlDragPos := 0; + pnlDragOld := x; + pnlMM := false; + //SetCaptureControl(TControl(Sender)); + + Screen.Cursor := crHSplit; + //GetCursorPos(mousepos); // hmmm + mousePos := (Sender as TControl).ClientToScreen(Point(x, y)); + pnlDragged := false; + end; +end; + +procedure TAdjustForm.DragPanelMouseMove(Sender: TObject; Shift: TShiftState; + X, Y: Integer); +var + sc, v: double; +begin + if pnlMM then // hack: to skip MouseMove event + begin + pnlMM:=false; + end + else + if pnlDragMode and (x <> pnlDragOld) then + begin + Inc(pnlDragPos, x - pnlDragOld); + + if GetKeyState(VK_MENU) < 0 then sc := 100000 + else if GetKeyState(VK_CONTROL) < 0 then sc := 10000 + else if GetKeyState(VK_SHIFT) < 0 then sc := 100 + else sc := 1000; + + if (Sender = pnlPitch) or (Sender = pnlYaw) or (Sender = pnlRoll) then + sc := sc / 50 + else if Sender = pnlPersp then sc := sc * 10; + + v := Round6(pnlDragValue + pnlDragPos / sc); + + SetCursorPos(MousePos.x, MousePos.y); // hmmm + pnlMM:=true; + + if (Sender = pnlMasterScale) then + begin + v := Round6(pnlDragValue * power(2, pnlDragPos / sc / 2)); + if v <= 0.0001 then v := 0.0001; + cp.pixels_per_unit := v*PreviewImage.Width; + editPPU.Text := FloatToStr(v*100); + end + else if (Sender = pnlZoom) then + begin + scrollZoom.Position := trunc(v * 1000); + end + else if (Sender = pnlXpos) then + begin + scrollCenterX.Position := trunc(v * 1000); + end + else if (Sender = pnlYpos) then + begin + scrollCenterY.Position := trunc(v * 1000); + end + else if (Sender = pnlAngle) then + begin + scrollAngle.Position := Trunc(v * 18000.0 / PI) mod 36000; + end + else if (Sender = pnlGamma) then + begin + scrollGamma.Position := trunc(v * 100); + end + else if (Sender = pnlBrightness) then + begin + scrollBrightness.Position := trunc(v * 100); + end + else if (Sender = pnlVibrancy) then + begin + scrollVibrancy.Position := trunc(v * 100); + end + else if (Sender = pnlContrast) then // AV + begin + scrollContrast.Position := trunc(v * 100); + end + else if (Sender = pnlPitch) then // 3d camera controls + begin + v := v - 360*Trunc(v/360); + cp.cameraPitch := v * PI / 180.0; + txtPitch.Text := FloatToStr(v); + end + else if (Sender = pnlYaw) then + begin + v := v - 360*Trunc(v/360); + cp.cameraYaw := v * PI / 180.0; + txtYaw.Text := FloatToStr(v); + end + else if (Sender = pnlRoll) then // AV + begin + v := v - 360*Trunc(v/360); + cp.cameraRoll := v * PI / 180.0; + txtRoll.Text := FloatToStr(v); + end + else if (Sender = pnlPersp) then + begin + cp.cameraPersp := v; + txtPersp.Text := FloatToStr(v); + end + else if (Sender = pnlZpos) then + begin + cp.cameraZpos := v; + txtZpos.Text := FloatToStr(v); + end + else if (Sender = pnlDOF) then + begin + if v < 0 then v := 0; + cp.cameraDOF := v; + txtDOF.Text := FloatToStr(v); + end + else if (Sender = pnlGammaThreshold) then + begin + if v < 0 then v := 0; + cp.gammaThreshRelative := v; + txtGammaThreshold.Text := FloattoStr(cp.gammaThreshRelative); + end else exit; + //pEdit^.Text := FloatToStr(v); + //pEdit.Refresh; + pnlDragged := True; + DrawPreview; + end; +end; + +procedure TAdjustForm.DragPanelMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + if Button <> mbLeft then exit; + + if pnlDragMode then + begin + //SetCaptureControl(nil); + pnlDragMode := false; + Screen.Cursor := crDefault; + + if pnlDragged then + begin + UpdateFlame; + pnlDragged := False; + end; + end; +end; + +procedure TAdjustForm.DarkRemoverClick(Sender: TObject); +const level = 45; +var isDark: boolean; + i, r, g, b: byte; +begin + isDark := False; + for i := 0 to 255 do + begin + r := Palette[i,0]; + g := Palette[i,1]; + b := Palette[i,2]; + if (r < level) and (g < level) and (b < level) then + begin + isDark := True; + Brighten(level, r, g, b); + Palette[i,0] := r; + Palette[i,1] := g; + Palette[i,2] := b; + end; + end; + if isDark then begin + UpdateGradient(palette); + Apply; + end; +end; + +procedure TAdjustForm.DragPanelDblClick(Sender: TObject); +var + pValue: ^double; +begin + if (Sender = pnlMasterScale) then + begin + pValue := @cp.pixels_per_unit; + if pValue^ = PreviewImage.Width/4 then exit; + pValue^ := PreviewImage.Width/4; + editPPU.Text := FloatToStr(100*pValue^/PreviewImage.Width); + end + else if (Sender = pnlZoom) then + begin + scrollZoom.Position := 0; + txtZoom.Text := '0'; // AV + end + else if (Sender = pnlXpos) then + begin + scrollCenterX.Position := 0; + txtCenterX.Text := '0'; // AV + end + else if (Sender = pnlYpos) then + begin + scrollCenterY.Position := 0; + txtCenterY.Text := '0'; // AV + end + else if (Sender = pnlAngle) then + begin + scrollAngle.Position := 0; + txtAngle.Text := '0'; // AV + end + else if (Sender = pnlGamma) then + begin + scrollGamma.Position := Round(defGamma * 100); + txtGamma.Text := FloatToStr(defGamma); // AV + end + else if (Sender = pnlBrightness) then + begin + scrollBrightness.Position := Round(defBrightness * 100); + txtBrightness.Text := FloatToStr(defBrightness); // AV + end + else if (Sender = pnlVibrancy) then + begin + scrollVibrancy.Position := Round(defVibrancy * 100); + txtVibrancy.Text := FloatToStr(defVibrancy); // AV + end + else if (Sender = pnlContrast) then // AV + begin + scrollContrast.Position := Round(defContrast * 100); // AV + txtContrast.Text := FloatToStr(defContrast); // AV + end + // 3d camera controls + else if (Sender = pnlPitch) then + begin + cp.cameraPitch := 0; + txtPitch.Text := '0'; + end + else if (Sender = pnlYaw) then + begin + cp.cameraYaw := 0; + txtYaw.Text := '0'; + end + else if (Sender = pnlRoll) then // AV + begin + cp.cameraRoll := 0; + txtRoll.Text := '0'; + end + else if (Sender = pnlPersp) then + begin + if cp.cameraPersp = 0 then cp.cameraPersp := 0.125 + else cp.cameraPersp := 0; + txtPersp.Text := FloatToStr(cp.cameraPersp); + end + else if (Sender = pnlZpos) then + begin + cp.cameraZpos := 0; + txtZpos.Text := '0'; + end + else if (Sender = pnlDOF) then + begin + cp.cameraDOF := 0; + txtDOF.Text := '0'; + end + else if (Sender = pnlGammaThreshold) then + begin + // AV: commented out to reset user's input text properly + // if cp.gammaThreshRelative = defGammaThreshold then exit; + cp.gammaThreshRelative := defGammaThreshold; + txtGammaThreshold.Text := FloatToStr(defGammaThreshold); + end + else exit; //assert(false); + + UpdateFlame; +end; + +procedure TAdjustForm.Fliplefthalf1Click(Sender: TObject); +var i: byte; +begin + for i := 0 to 127 do + begin + Palette[255-i,0] := Palette[i,0]; + Palette[255-i,1] := Palette[i,1]; + Palette[255-i,2] := Palette[i,2]; + end; + UpdateGradient(palette); + Apply; +end; + +procedure TAdjustForm.Fliprighthalf1Click(Sender: TObject); +var i: byte; +begin + for i := 0 to 127 do + begin + Palette[i,0] := Palette[255-i,0]; + Palette[i,1] := Palette[255-i,1]; + Palette[i,2] := Palette[255-i,2]; + end; + UpdateGradient(palette); + Apply; +end; + +procedure TAdjustForm.FormActivate(Sender: TObject); +begin + txtVibrancy.text := FloatToStr(cp.Vibrancy); + txtGamma.text := FloatToStr(cp.Gamma); + txtBrightness.text := FloatToStr(cp.Brightness); + txtContrast.text := FloatToStr(cp.Contrast); // AV + txtGammaThreshold.text := FloatToStr(cp.gammaThreshRelative); // AV + txtZoom.text := FloatToStr(cp.zoom); + txtCenterX.text := FloatToStr(cp.center[0]); + txtCentery.text := FloatToStr(cp.center[1]); + txtAngle.text := FloatToStr(cp.FAngle * 180 / PI); + btnPaste.Enabled := GradientInClipboard; // AV + mnuPaste.Enabled := btnPaste.Enabled; // AV +end; + +/////////////////////////////////////////////////////////////////////////////// + +procedure TAdjustForm.txtCamEnter(Sender: TObject); +begin + EditBoxValue := (Sender as TEdit).Text; +end; + +procedure TAdjustForm.txtCamPitchExit(Sender: TObject); +var + v: double; +begin + if (EditBoxValue <> txtPitch.Text) then + try + v := StrToFloat(txtPitch.Text); + v := v - 360*Trunc(v/360); + txtPitch.Text := FloatToStr(v); + cp.cameraPitch := v * PI / 180; + UpdateFlame; + except on EConvertError do + txtPitch.Text := FloatToStr(cp.cameraPitch / PI * 180); + end; +end; + +procedure TAdjustForm.txtCamPitchKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = ',') then Key := '.'; + if not CharinSet(Key,['0'..'9','-', #8, #13, '.']) + then Key:= #0; + if ((key = #13) and (EditBoxValue <> (Sender as TEdit).Text)) then + begin + key := #0; + txtCamPitchExit(Sender); + end; +end; + +procedure TAdjustForm.txtCamRollExit(Sender: TObject); +var + v: double; +begin + if (EditBoxValue <> txtRoll.Text) then + try + v := StrToFloat(txtRoll.Text); + v := v - 360*Trunc(v/360); + txtRoll.Text := FloatToStr(v); + cp.cameraRoll := v * PI / 180; + UpdateFlame; + except on EConvertError do + txtRoll.Text := FloatToStr(cp.cameraRoll / PI * 180); + end; +end; + +procedure TAdjustForm.txtCamRollKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = ',') then Key := '.'; + if not CharinSet(Key,['0'..'9','-', #8, #13, '.']) + then Key:= #0; + if ((key = #13) and (EditBoxValue <> (Sender as TEdit).Text)) then + begin + key := #0; + txtCamRollExit(Sender); + end; +end; + +procedure TAdjustForm.txtCamYawExit(Sender: TObject); +var + v: double; +begin + if (EditBoxValue <> txtYaw.Text) then + try + v := StrToFloat(txtYaw.Text); + v := v - 360*Trunc(v/360); + txtYaw.Text := FloatToStr(v); + cp.cameraYaw := v * PI / 180; + UpdateFlame; + except on EConvertError do + txtYaw.Text := FloatToStr(cp.cameraYaw / PI * 180); + end; +end; + +procedure TAdjustForm.txtCamYawKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = ',') then Key := '.'; + if not CharinSet(Key,['0'..'9','-', #8, #13, '.']) + then Key:= #0; + if ((key = #13) and (EditBoxValue <> (Sender as TEdit).Text)) then + begin + key := #0; + txtCamYawExit(Sender); + end; +end; + +procedure TAdjustForm.txtCamDistExit(Sender: TObject); +begin + if (EditBoxValue <> txtPersp.Text) then + try + cp.cameraPersp := StrToFloat(txtPersp.Text); + UpdateFlame; + except on EConvertError do + txtPersp.Text := FloatToStr(cp.cameraPersp); + end; +end; + +procedure TAdjustForm.txtCamDistKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = ',') then Key := '.'; + if not CharinSet(Key,['0'..'9','-', #8, #13, '.']) + then Key:= #0; // AV + if ((key = #13) and (EditBoxValue <> (Sender as TEdit).Text)) then + begin + key := #0; + txtCamDistExit(Sender); + end; +end; + +procedure TAdjustForm.txtCamZposExit(Sender: TObject); +begin + if (EditBoxValue <> txtZpos.Text) then + try + cp.cameraZpos := StrToFloat(txtZpos.Text); + txtZpos.Text := FloatToStr(cp.cameraZpos); + UpdateFlame; + except on EConvertError do + txtZpos.Text := FloatToStr(cp.cameraZpos); + end; +end; + +procedure TAdjustForm.txtCamZposKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = ',') then Key := '.'; + if not CharinSet(Key,['0'..'9','-', #8, #13, '.']) + then Key:= #0; // AV + if ((key = #13) and (EditBoxValue <> (Sender as TEdit).Text)) then + begin + key := #0; + txtCamZposExit(Sender); + end; +end; + +procedure TAdjustForm.txtCamDofExit(Sender: TObject); +begin + if (EditBoxValue <> txtDof.Text) then + try + cp.cameraDOF := StrToFloat(txtDof.Text); + txtDof.Text := FloatToStr(cp.cameraDOF); + UpdateFlame; + except on EConvertError do + txtDof.Text := FloatToStr(cp.cameraDOF); + end; +end; + +procedure TAdjustForm.txtCamDofKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = ',') then Key := '.'; + if not CharinSet(Key,['0'..'9','-', #8, #13, '.']) + then Key:= #0; + if ((key = #13) and (EditBoxValue <> (Sender as TEdit).Text)) then + begin + key := #0; + txtCamDofExit(Sender); + end; +end; + +procedure TAdjustForm.PreviewImageMouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + if Button <> mbLeft then exit; + + camDragValueY := cp.cameraPitch * 180.0 / PI; + camDragValueX := cp.cameraYaw * 180.0 / PI; + + camDragMode := true; + camDragPos.x := 0; + camDragPos.y := 0; + camDragOld.x := x; + camDragOld.y := y; + camMM := false; + //SetCaptureControl(TControl(Sender)); + + Screen.Cursor := crNone; + //GetCursorPos(mousepos); // hmmm + mousePos := (Sender as TControl).ClientToScreen(Point(x, y)); + camDragged := false; +end; + +procedure TAdjustForm.PreviewImageMouseMove(Sender: TObject; + Shift: TShiftState; X, Y: Integer); +var + sc, vx, vy: double; +begin + if camMM then // hack: to skip MouseMove event + begin + camMM:=false; + end + else + if camDragMode and ( (x <> camDragOld.x) or (y <> camDragOld.y) ) then + begin + Inc(camDragPos.x, x - camDragOld.x); + Inc(camDragPos.y, y - camDragOld.y); + + vx := Round6(camDragValueX + camDragPos.x / 10); + vy := Round6(camDragValueY - camDragPos.y / 10); + + cp.cameraPitch := vy * PI / 180.0; + txtPitch.Text := FloatToStr(vy); + txtPitch.Refresh; + cp.cameraYaw := vx * PI / 180.0; + txtYaw.Text := FloatToStr(vx); + txtYaw.Refresh; + + SetCursorPos(MousePos.x, MousePos.y); // hmmm + pnlMM:=true; + + camDragged := True; + DrawPreview; + end; +end; + +procedure TAdjustForm.PreviewImageMouseUp(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + if Button <> mbLeft then exit; + + if camDragMode then + begin + camDragMode := false; + Screen.Cursor := crDefault; + + if camDragged then + begin + UpdateFlame; + camDragged := False; + end; + end; +end; + +procedure TAdjustForm.PreviewImageDblClick(Sender: TObject); +begin + cp.cameraPitch := 0; + txtPitch.Text := '0'; + cp.cameraYaw := 0; + txtYaw.Text := '0'; + cp.cameraRoll := 0; // AV + txtRoll.Text := '0'; + cp.cameraZpos := 0; // AV + txtZpos.Text := '0'; + cp.cameraPersp := 0; // AV + txtPersp.Text := '0'; + cp.cameraDOF := 0; // AV + txtDOF.Text := '0'; + scrollCenterX.Position := 0; + scrollCenterY.Position := 0; + + UpdateFlame; +end; + +procedure TAdjustForm.txtGammaThresholdEnter(Sender: TObject); +begin + EditBoxValue := txtGammaThreshold.Text; +end; + +procedure TAdjustForm.txtGammaThresholdExit(Sender: TObject); +var + v: double; +begin + try + v := strtofloat(txtGammaThreshold.Text); + except + exit; + end; + if v < 0 then v := 0; + if v <> cp.gammaThreshRelative then begin + MainForm.UpdateUndo; + cp.gammaThreshRelative := v; + txtGammaThreshold.Text := FloatToStr(cp.gammaThreshRelative); + UpdateFlame; + EditBoxValue := txtGammaThreshold.Text; + end; +end; + +procedure TAdjustForm.txtGammaThresholdKeyPress(Sender: TObject; + var Key: Char); +begin + if (Key = ',') then Key := '.'; + if not CharinSet(Key,['0'..'9', #8, #13, '.']) + then Key:= #0; + if key=#13 then + begin + key := #0; + txtGammaThresholdExit(Sender); + end; +end; + +procedure TAdjustForm.Shape1MouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + ColorPanelClick(nil); +end; + +procedure TAdjustForm.Smoothize1Click(Sender: TObject); +begin + MainForm.Smoothize(Palette, 0, 255); +end; + +procedure TAdjustForm.SmoothizeSelectedClick(Sender: TObject); +begin + MainForm.Smoothize(Palette, selA, selB); +end; + +procedure TAdjustForm.btnResetClick(Sender: TObject); +begin + ScrollBar.Position := 0; +end; + +procedure TAdjustForm.btnResetCurvesClick(Sender: TObject); +var i: integer; +begin + tbWeightLeft.Position := 10; + tbWeightRight.Position := 10; + + with cp do for i := 0 to 3 do + begin + curvePoints[i][0].x := 0.00; curvePoints[i][0].y := 0.00; curveWeights[i][0] := 1; + curvePoints[i][1].x := 0.00; curvePoints[i][1].y := 0.00; curveWeights[i][1] := 1; + curvePoints[i][2].x := 1.00; curvePoints[i][2].y := 1.00; curveWeights[i][2] := 1; + curvePoints[i][3].x := 1.00; curvePoints[i][3].y := 1.00; curveWeights[i][3] := 1; + end; + MainCp.Copy(cp, true); + SetCurvesCp(MainCp); + + Apply; +end; + +procedure TAdjustForm.txtValKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = ',') then Key := '.'; + if not CharinSet(Key,['0'..'9','-', #8, #13, '.']) + then Key:= #0; + if Key=#13 then begin + Key := #0; + txtValExit(sender); + end; +end; + +{procedure TAdjustForm.TemplateRandomizeGradient; +begin + mnuRandomizeClick(nil); +end; } + +end. + diff --git a/Forms/Browser.dfm b/Forms/Browser.dfm new file mode 100644 index 0000000..d699304 --- /dev/null +++ b/Forms/Browser.dfm @@ -0,0 +1,374 @@ +object GradientBrowser: TGradientBrowser + Left = 494 + Top = 299 + BorderIcons = [biSystemMenu, biMinimize] + Caption = 'Gradient Browser' + ClientHeight = 297 + ClientWidth = 528 + Color = clBtnFace + Constraints.MinHeight = 120 + Constraints.MinWidth = 380 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Icon.Data = { + 0000010001001010000001002000680400001600000028000000100000002000 + 0000010020000000000040040000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000045C6F00100000000000000002DA5D654247EACE51F89B8FD1F7D + A8FC2385AFFA209DD2A01DA9DF53000000000000000000000000000000000000 + 00000000000000000000000000003AB6E247228CC1F143C2EAFF48C3E7FF4EC9 + ECFF44C1E2F538A3C7FB1A7CABF9199BD1830000000000000000000000000000 + 000063D2F201000000000000000020B5E9FF34B0DBCE59D2F0FF5CD4F0FF5CD7 + F2FF5AD6F2FD51CFECFB37AED7F4187BA9FD1A94C98F00000000000000000000 + 000070D8F302000000000000000022B3E7FE1C97C9E751CAE9FF5FD7F2FF0AB3 + 67FF006F00FF008825FF53D1EEFA2E9FCCEE187DACFE0B87BD020000000082DF + F4027CDCF40700000000000000006AD4F36C1181B2FD52CAE8FE62DAF3FF23D9 + 71FF00912BFF006000FF62D9F3FF49C3E5EF1280B0FE1B9BCE73000000000000 + 000089E2F42084DFF4421D99C2FD37A4C9FF46C2EBFF65D4F0FB66DAF3FE3EDB + 8CFF00BA50FF00AB67FF63D9F3FF51CBEBF41E8BB9F81D95C8A7000000000000 + 000076DCF4693BB4DCF78BE2F4B59AE7F7E895E6F6FE95E8F6FE8CE3F5FF85E3 + F4FF70DEF4FF68DCF4FF6ADBF4FF5CD4EFF4208BB9F72297C9AB000000000000 + 000054CBF3F98EE3F5CFB6F1F8FFB6F1F8FF9EEAF6FE93E9F6FF94E8F6FFB359 + 23FFB30F00FFAB2B00FF73DEF4FB63D7EFEE1D84B4F8279DCE94000000000000 + 000070D4F5FFA4EDF6E6B6F1F8FF2959F3FF00007AFF001FDBFF93E9F6FFB08C + 64FFB03A00FF610000FF73DEF4F45CC3E3DE2781AEEF64D3F23E000000000000 + 000070D4F5FFACF0F7EBB6F1F8FF5490FFFF0022D9FF000058FFB2F0F8FFB4B6 + 97FFB38D64FFB6AB8CFF78D3ECE8359AC9EC51B6DB8F00000000000000000000 + 00007AD8F5F89EEAF6E6B6F1F8FF6DAFFFFF5590FFFF6DB0FFFFB6F1F8FFA5EC + F7FEA7ECF7FE98E7F5F14DB0D9F55DBBDDAB84DFF44000000000000000000000 + 0000A9EFF7786BD4F4FB9DEAF6EEAFF1F7F4B6F1F8FFB6F1F8FFB6F1F8FFA6EE + F6F9A0EAF6EF70D2EDE354C6EDF895E7F5580000000000000000000000000000 + 000000000000AAEFF78F5ACFF3F998E8F6E0B6F1F8FFB6F1F8FFB6F1F8FF92E7 + F6E46CD4F4FA65D2F4E984D4E874000000000000000000000000000000000000 + 00000000000000000000A9EFF7737CD9F6F476D6F5FA72D4F5FD75D6F5FB5ECF + F4F190E6F5930000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + 0000D80F0000F0070000B0030000B00100003001000080010000800100008001 + 000080010000800300008003000080070000C00F0000E03F0000FFFF0000} + OldCreateOrder = False + OnClose = FormClose + OnCreate = FormCreate + OnResize = FormResize + OnShow = FormShow + DesignSize = ( + 528 + 297) + PixelsPerInch = 96 + TextHeight = 13 + object btnDefGradient: TSpeedButton + Left = 411 + Top = 7 + Width = 23 + Height = 21 + Hint = 'Open...' + Anchors = [akTop, akRight] + Flat = True + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Arial' + Font.Style = [fsBold] + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF75848F66808F + 607987576E7B4E626F4456613948522E3A43252E351B222914191E0E12160E13 + 18FF00FFFF00FFFF00FF77879289A1AB6AB2D4008FCD008FCD008FCD048CC708 + 88BE0F82B4157CA91B779F1F7296224B5C87A2ABFF00FFFF00FF7A8A957EBED3 + 8AA4AE7EDCFF5FCFFF55CBFF4CC4FA41BCF537B3F02EAAEB24A0E5138CD42367 + 805E696DFF00FFFF00FF7D8E9879D2EC8BA4AD89C2CE71D8FF65D3FF5CCEFF51 + C9FE49C1FA3FB9F534B0EE29A8E91085CD224B5B98B2BAFF00FF80919C81D7EF + 7DC5E08CA6B080DDFE68D3FF67D4FF62D1FF58CDFF4EC7FC46BEF73BB6F231AC + EC2569817A95A1FF00FF83959F89DCF18CE2FF8DA8B18CBAC774D8FF67D4FF67 + D4FF67D4FF5FD0FF54CDFF4BC5FC41BBF72EA2DB51677498B2BA869AA392E1F2 + 98E8FD80C4DE8EA7B081DEFD84E0FF84E0FF84E0FF84E0FF81DFFF7BDDFF74D8 + FF6BD6FF56A9D18F9BA4889CA59AE6F39FEBFB98E8FE8BACB98BACB98AAAB788 + A6B386A3AF839FAA819AA67F95A17C919D7A8E99798B957788938BA0A8A0EAF6 + A6EEF99FEBFB98E8FE7ADAFF67D4FF67D4FF67D4FF67D4FF67D4FF67D4FF7788 + 93FF00FFFF00FFFF00FF8EA2ABA7EEF6ABF0F7A6EEF99FEBFB98E8FD71D4FB89 + 9EA78699A382949F7E909A7A8C97778893FF00FFFF00FFFF00FF8FA4ACA0D2DA + ABF0F7ABF0F7A6EEF99FEBFB8DA1AAB5CBD0FF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFBDCED48FA4AC8FA4AC8FA4AC8FA4AC8FA4ACB5CBD0FF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF} + ParentFont = False + ParentShowHint = False + ShowHint = True + OnClick = btnDefGradientClick + end + object btnRandom: TSpeedButton + Left = 464 + Top = 263 + Width = 23 + Height = 21 + Anchors = [akTop, akRight] + Flat = True + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Arial' + Font.Style = [fsBold] + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000C40E0000C40E00000000000000000000FFFFFFFFFFFF + FFFFFFFFFFFFF9F9F99E9E9EA3A7A69F9F9FC4C3C3EFEEEEFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0A0A0C6C6C5EAFAF9D7 + EAE8BEC7C59B9D9DAFAFAEDAD9DAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFA7A7A7B9B9B9E7E6E7E3F8F7B5C1BE838784D9E9E6C6D0CDA6ACAA9F9F + A0BBBBBBF5F5F5FFFFFFFFFFFFFFFFFFB0B0B0A8A8A8DEDDDDDCDCDCE3F9F7BA + C9C7403D3CC2D3D1EDFFFCCAD3CFC0C5C1B8BDBA959595FFFFFFFFFFFFBDBDBD + 9A9A9AD5D5D5D4D5D5DDDDDDDBEFEEE1FDFBDFF3F2C2D1CECBD9D69B9B993932 + 31D5DDD9939594FFFFFFFFFFFF878787C7C7C7BEBDBDCCCACADDDDDDE1F7F6C7 + DBDACBDDDCA2A7A6352F2EBFCDC99AA19DD0D9D5949594FFFFFFFFFFFF8C8D8D + CCCDCD544C4C9F9D9DE3E3E3E5FDFDA9B4B4332C2CBCCBCB9BA5A4CFE0DDECFE + FAE1EEE98F908FFFFFFFFFFFFF8A8A8AC3C3C38C8A8AC0C1C1E2E1E1F0FCFCE1 + F8F79FAEAECBE3E1EFFFFFABB0AF6F6E6DDBEAE7949997FFFFFFFFFFFF888888 + C1C1C1CDCDCDD6D6D6F3F3F3FAF8F8FAF9FAFDFFFFE6F8F7DEF6F4B6C1C04644 + 44C7D5D29DA2A1FFFFFFFFFFFF898989C0C0C0C2C2C2F2F2F2EDECEC67626274 + 6D6EFDFBFBF6F6F6EEF2F2EAF5F4DBEBE8E2F4EFA1A6A5FFFFFFFFFFFF868686 + BEBEBEE3E3E3FFFFFFF6F5F5A5A5A5A7A5A5F3F2F2F0EFEFEDEBEBEBE9E9EFEF + EFF8FDFB9A9D9BFFFFFFFFFFFF8D8D8DEDEDEDFFFFFFFAFAFAFFFFFFE8E7E765 + 5F5F817C7CF4F4F4ECECECE6E6E6F1F0F0AFAEAEA3A3A3FFFFFFFFFFFF858585 + E9E9E9FEFEFEFFFFFFFFFFFFEFEEEEA09E9E999595E0DFDFEAEBEBF0F0F0ABAB + ABA3A3A3FEFEFEFFFFFFFFFFFFD2D2D2969696979797BBBBBBE9E9E9FFFFFFCE + CCCC423E3E999696FBFBFBA4A4A4A9A9A9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1B5B5B5999999979797BDBDBDC7C7C7E5E5E5A0A0A0B1B1B1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBE1E1E1B3 + B3B39797978E8E8EB4B4B4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} + ParentFont = False + ParentShowHint = False + ShowHint = True + OnClick = btnRandomClick + end + object ListView: TListView + Left = 7 + Top = 7 + Width = 398 + Height = 234 + Anchors = [akLeft, akTop, akRight, akBottom] + Columns = < + item + Caption = 'Title' + Width = 150 + end> + HideSelection = False + RowSelect = True + ParentShowHint = False + PopupMenu = PopupMenu + ShowHint = True + SmallImages = SmallImages + SortType = stText + TabOrder = 1 + ViewStyle = vsList + OnChange = ListViewChange + OnDblClick = ListViewDblClick + OnEdited = ListViewEdited + OnInfoTip = ListViewInfoTip + OnKeyPress = ListViewKeyPress + end + object pnlMain: TPanel + Left = 0 + Top = 0 + Width = 528 + Height = 4 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + end + object pnlPreview: TPanel + Left = 0 + Top = 256 + Width = 457 + Height = 37 + Anchors = [akLeft, akRight, akBottom] + BevelOuter = bvLowered + TabOrder = 2 + object Image: TImage + Left = 1 + Top = 1 + Width = 455 + Height = 35 + Align = alClient + Stretch = True + ExplicitWidth = 485 + ExplicitHeight = 23 + end + end + object SmallImages: TImageList + Left = 192 + Top = 24 + Bitmap = { + 494C010101000400040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000001000000001002000000000000010 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFF5F000FFF1 + E900FFEFE600FFEFE600FFF0E700FFF1E800FFF1E900FFF3EB00FFF3EC00FFF4 + ED00FFF6F0000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFF4ED00FFEE + E400FFEBDF00FFEBDF00FFEBE000FFECE200FFEDE200FFEEE400FFEFE500FFEF + E600FFF1EA000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFF1E900CD52 + 0800CD520800CD520800CD520800CD520800CD520800CD520800CD520800CD52 + 0800FFEDE3000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFEFE600CD52 + 0800E2651800EB7A3700FFA77200FFD1B200FFF7ED00C2E9FF0042ADF700CD52 + 0800FFE9DC000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFEDE200CD52 + 0800E1651900E9783500FFA77000FFD1B200FFF7EC00C2E9FF0040ADF700CD52 + 0800FFE5D6000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFEBDF00CD52 + 0800E1651800EB783600FFA77000FFD1B200FFF7EC00C2E9FF0042ADF700CD52 + 0800FFE1D0000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFE9DB00CD52 + 0800E1651900EC793500FFA77000FFD0B200FFF7EC00C2E9FF0040AEF700CD52 + 0800FFDFCD000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFE7D800CD52 + 0800E1651900EB793500FFA57000FFD1B200FFF7EC00C2E9FF0040ADF700CD52 + 0800FFE1D0000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFE4D500CD52 + 0800E3651A00EB7A3900FFA87400FFD1B300FFF7EC00C4E9FF0044AEF700CD52 + 0800FFE9DC000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFE3D100CD52 + 0800ED793500F9945700FFBC8D00FFE1C500FFFFF90000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFE1CF00CD52 + 0800CD520800CD520800CD520800CD520800CD52080000000000E17D4100EB92 + 5E00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFE2D100FFD7 + BF00FFD0B400FFCEB100FFCFB300FFD0B400FFD3B80000000000F5A779000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFE7DA00FFE2 + D000FFDECB00FFDECA00FFDDC900FFDECA00FFDFCD0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000424D3E000000000000003E000000 + 2800000040000000100000000100010000000000800000000000000000000000 + 000000000000000000000000FFFFFF00FFFF0000000000008003000000000000 + 8003000000000000800300000000000080030000000000008003000000000000 + 8003000000000000800300000000000080030000000000008003000000000000 + 800300000000000080030000000000008007000000000000800F000000000000 + 801F000000000000803F00000000000000000000000000000000000000000000 + 000000000000} + end + object PopupMenu: TPopupMenu + Left = 32 + Top = 24 + object DeleteItem: TMenuItem + Caption = 'Delete' + ShortCut = 16430 + OnClick = DeleteItemClick + end + object RenameItem: TMenuItem + Caption = 'Rename' + ShortCut = 113 + OnClick = RenameItemClick + end + end + object OpenDialog: TOpenDialog + DefaultExt = 'ugr' + Filter = 'Gradient files (*.ugr)|*.ugr|Fractint map files (*.map)|*.map' + Left = 136 + Top = 24 + end + object TooltipTimer: TTimer + OnTimer = TooltipTimerTimer + Left = 88 + Top = 20 + end +end diff --git a/Forms/Browser.pas b/Forms/Browser.pas new file mode 100644 index 0000000..cf339aa --- /dev/null +++ b/Forms/Browser.pas @@ -0,0 +1,602 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} +unit Browser; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + ExtCtrls, ComCtrls, ToolWin, ImgList, StdCtrls, System.ImageList, + Cmap, Menus, Global, Buttons, Translation; + +const + PixelCountMax = 32768; + PaletteTooltipTimeout = 1500; + +type + TGradientBrowser = class(TForm) + SmallImages: TImageList; + pnlMain: TPanel; + PopupMenu: TPopupMenu; + DeleteItem: TMenuItem; + RenameItem: TMenuItem; + OpenDialog: TOpenDialog; + TooltipTimer: TTimer; + ListView: TListView; + pnlPreview: TPanel; + Image: TImage; + btnDefGradient: TSpeedButton; + btnRandom: TSpeedButton; + procedure FormResize(Sender: TObject); + procedure ListViewChange(Sender: TObject; Item: TListItem; + Change: TItemChange); + procedure FormCreate(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure DeleteItemClick(Sender: TObject); + procedure RenameItemClick(Sender: TObject); + procedure ListViewEdited(Sender: TObject; Item: TListItem; + var S: string); + procedure btnDefGradientClick(Sender: TObject); + procedure ListViewDblClick(Sender: TObject); + procedure ListViewKeyPress(Sender: TObject; var Key: Char); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure ListViewInfoTip(Sender: TObject; Item: TListItem; + var InfoTip: String); + procedure TooltipTimerTimer(Sender: TObject); + // AV: now you really can rename it :-) + function RenameGradient(OldIdent: string; var NewIdent: string): boolean; + procedure btnRandomClick(Sender: TObject); // AV + private + procedure DrawPalette; + procedure Apply; + public + // AV: deleted all unused identifiers: cp, Renderer, integers etc. + Extension, Identifier, Filename: string; + Palette: TColorMap; + procedure ListFileContents; + function LoadFractintMap(filen: string): TColorMap; + end; + +type + EFormatInvalid = class(Exception); + pRGBTripleArray = ^TRGBTripleArray; + TRGBTripleArray = array[0..PixelCountMax - 1] of TRGBTriple; + +var + GradientBrowser: TGradientBrowser; + +function CreatePalette(strng: string): TColorMap; + +implementation + +uses Main, Options, Editor, Registry, Adjust, Mutate; + +{$R *.DFM} + +function GetVal(token: string): string; +var + p: integer; +begin + p := Pos('=', token); + Delete(Token, 1, p); + Result := Token; +end; + +function ReplaceTabs(str: string): string; +{Changes tab characters in a string to spaces} +var + i: integer; +begin + for i := 1 to Length(str) do + begin + if str[i] = #9 then + begin + Delete(str, i, 1); + Insert(#32, str, i); + end; + end; + Result := str; +end; + +function TGradientBrowser.LoadFractintMap(filen: string): TColorMap; +var + i: integer; + s: string; + pal: TColorMap; + MapFile: TextFile; +begin +{ Load a map file } + AssignFile(MapFile, Filen); + try + Reset(MapFile); + for i := 0 to 255 do + begin + Read(MapFile, Pal[i][0]); + Read(MapFile, Pal[i][1]); + Read(MapFile, Pal[i][2]); + Read(MapFile, s); + end; + CloseFile(MapFile); + Result := Pal; + except + on EInOutError do Application.MessageBox(PChar(Format(TextByKey('common-genericopenfailure'), [FileName])), PCHAR('Apophysis'), 16); + end; +end; + +function CreatePalette(strng: string): TColorMap; +{ Loads a palette from a gradient string } +var + Strings: TStringList; + index, i: integer; + Tokens: TStringList; + Indices, Colors: TStringList; + a, b: integer; +begin + Strings := TStringList.Create; + Tokens := TStringList.Create; + Indices := TStringList.Create; + Colors := TStringList.Create; + try + try + Strings.Text := strng; + if Pos('}', Strings.Text) = 0 then raise EFormatInvalid.Create('No closing brace'); + if Pos('{', Strings[0]) = 0 then raise EFormatInvalid.Create('No opening brace.'); + GetTokens(ReplaceTabs(strings.text), tokens); + Tokens.Text := Trim(Tokens.text); + i := 0; + while (Pos('}', Tokens[i]) = 0) and (Pos('opacity:', Lowercase(Tokens[i])) = 0) do + begin + if Pos('index=', LowerCase(Tokens[i])) <> 0 then + Indices.Add(GetVal(Tokens[i])) + else if Pos('color=', LowerCase(Tokens[i])) <> 0 then + Colors.Add(GetVal(Tokens[i])); + inc(i) + end; + for i := 0 to 255 do + begin + Result[i][0] := 0; + Result[i][1] := 0; + Result[i][2] := 0; + end; + if Indices.Count = 0 then raise EFormatInvalid.Create('No color info'); + for i := 0 to Indices.Count - 1 do + begin + try + index := StrToInt(Indices[i]); + while index < 0 do inc(index, 400); + index := Round(Index * (255 / 399)); + indices[i] := IntToStr(index); + assert(index>=0); + assert(index<256); + Result[index][0] := StrToInt(Colors[i]) mod 256; + Result[index][1] := trunc(StrToInt(Colors[i]) / 256) mod 256; + Result[index][2] := trunc(StrToInt(Colors[i]) / 65536); + except + end; + end; + i := 1; + repeat + a := StrToInt(Trim(Indices[i - 1])); + b := StrToInt(Trim(Indices[i])); + RGBBlend(a, b, Result); + inc(i); + until i = Indices.Count; + if (Indices[0] <> '0') or (Indices[Indices.Count - 1] <> '255') then + begin + a := StrToInt(Trim(Indices[Indices.Count - 1])); + b := StrToInt(Trim(Indices[0])) + 256; + RGBBlend(a, b, Result); + end; + except on EFormatInvalid do + // Result := False; + end; + finally + Tokens.Free; + Strings.Free; + Indices.Free; + Colors.Free; + end; +end; + +procedure TGradientBrowser.DrawPalette; +var + i, j: integer; + Row: pRGBTripleArray; + BitMap: TBitMap; +begin + BitMap := TBitMap.Create; + try + Bitmap.PixelFormat := pf24bit; + BitMap.Width := 256; + BitMap.Height := 1; + for j := 0 to Bitmap.Height - 1 do + begin + Row := Bitmap.Scanline[j]; + for i := 0 to Bitmap.Width - 1 do + begin + with Row[i] do + begin + rgbtRed := Palette[i][0]; + rgbtGreen := Palette[i][1]; + rgbtBlue := Palette[i][2]; + end + end + end; + Image.Picture.Graphic := Bitmap; + Image.Refresh; + finally + BitMap.Free; + end; +end; + +procedure TGradientBrowser.ListFileContents; +{ List identifiers in file } +var + i, p: integer; + Title: string; + ListItem: TListItem; + FStrings: TStringList; +begin + FStrings := TStringList.Create; + FStrings.LoadFromFile(filename); + try + ListView.Items.BeginUpdate; + ListView.Items.Clear; + if Lowercase(ExtractFileExt(filename)) = '.map' then + begin + ListItem := ListView.Items.Add; + Listitem.Caption := Trim(filename); + end + else + if (Pos('{', FStrings.Text) <> 0) then + begin + for i := 0 to FStrings.Count - 1 do + begin + p := Pos('{', FStrings[i]); + if (p <> 0) and (Pos('(3D)', FStrings[i]) = 0) then + begin + Title := Trim(Copy(FStrings[i], 1, p - 1)); + if Title <> '' then + begin { Otherwise bad format } + ListItem := ListView.Items.Add; + Listitem.Caption := Trim(Copy(FStrings[i], 1, p - 1)); + end; + end; + end; + end; + ListView.Items.EndUpdate; + ListView.Selected := ListView.Items[0]; + finally + FStrings.Free; + end; +end; + +procedure TGradientBrowser.ListViewChange(Sender: TObject; Item: TListItem; + Change: TItemChange); +var + Tokens, FStrings: TStringList; + EntryStrings: TStringList; + i: integer; +begin + Application.ProcessMessages; + FStrings := TStringList.Create; + EntryStrings := TStringList.Create; + Tokens := TStringList.Create; + try + if Lowercase(ExtractFileExt(filename)) = '.map' then + begin + Palette := LoadFractintMap(filename); + DrawPalette; + end + else + if (ListView.SelCount <> 0) and (ListView.Selected.Caption <> Identifier) then + begin + Identifier := ListView.Selected.Caption; + FStrings.LoadFromFile(Filename); + for i := 0 to FStrings.count - 1 do + if Pos(Lowercase(ListView.Selected.Caption) + ' ', Trim(Lowercase(FStrings[i]))) = 1 then break; + EntryStrings.Add(FStrings[i]); + repeat + inc(i); + EntryStrings.Add(FStrings[i]); + until Pos('}', FStrings[i]) <> 0; + Palette := CreatePalette(EntryStrings.Text); + DrawPalette; + end; + finally + EntryStrings.Free; + FStrings.Free; + Tokens.Free; + end; +end; + +procedure TGradientBrowser.FormCreate(Sender: TObject); +begin + self.Caption := TextByKey('gradientbrowser-title'); + btnDefGradient.Hint := TextByKey('common-browse'); + DeleteItem.Caption := TextByKey('common-delete'); + RenameItem.Caption := TextByKey('common-rename'); + btnRandom.Hint := TextByKey('adjustment-tab-gradient-presethint'); +end; + +procedure TGradientBrowser.FormShow(Sender: TObject); +var + Registry: TRegistry; +begin + { Read posution from registry } + Registry := TRegistry.Create; + try + Registry.RootKey := HKEY_CURRENT_USER; + if Registry.OpenKey('Software\' + APP_NAME + '\Forms\Browser', False) then + begin + if Registry.ValueExists('Left') then + GradientBrowser.Left := Registry.ReadInteger('Left'); + if Registry.ValueExists('Top') then + GradientBrowser.Top := Registry.ReadInteger('Top'); + if Registry.ValueExists('Width') then + GradientBrowser.Width := Registry.ReadInteger('Width'); + if Registry.ValueExists('Height') then + GradientBrowser.Height := Registry.ReadInteger('Height'); + end; + Registry.CloseKey; + finally + Registry.Free; + end; + if FileExists(filename) then ListFileContents; +end; + +procedure TGradientBrowser.DeleteItemClick(Sender: TObject); +var + c: boolean; +begin + if ListView.SelCount <> 0 then + begin + if ConfirmDelete then + c := Application.MessageBox( + PChar(Format(TextByKey('common-confirmdelete'), [ListView.Selected.Caption])), 'Apophysis', 36) = IDYES + else + c := True; + if c then + if ListView.Focused and (ListView.SelCount <> 0) then + begin + Application.ProcessMessages; + if DeleteEntry(ListView.Selected.Caption, Filename) then + begin + ListView.Items.Delete(ListView.Selected.Index); + ListView.Selected := ListView.ItemFocused; + end; + end; + end; +end; + +function TGradientBrowser.RenameGradient(OldIdent: string; var NewIdent: string): boolean; +var + Strings: TStringList; + p, i: integer; + s: string; +begin + Result := True; + Strings := TStringList.Create; + try + try + i := 0; + Strings.LoadFromFile(Filename); + if Pos(OldIdent + ' ', Trim(Strings.Text)) <> 0 then + begin + while Pos(OldIdent + ' ', Trim(Strings[i])) <> 1 do + begin + inc(i); + end; + p := Pos('{', Strings[i]); + s := Copy(Strings[i], p, Length(Strings[i]) - p + 1); + Strings[i] := NewIdent + ' ' + s; + Strings.SaveToFile(Filename); + end + else + Result := False; + except on Exception do Result := False; + end; + finally + Strings.Free; + end; +end; + +procedure TGradientBrowser.RenameItemClick(Sender: TObject); +begin + if ListView.SelCount <> 0 then + ListView.Items[ListView.Selected.Index].EditCaption; +end; + +procedure TGradientBrowser.ListViewEdited(Sender: TObject; Item: TListItem; + var S: string); +begin + if s <> Item.Caption then + if not RenameGradient(Item.Caption, s) then // AV + s := Item.Caption; +end; + +procedure TGradientBrowser.btnDefGradientClick(Sender: TObject); +var + fn:string; +begin + OpenDialog.InitialDir := BrowserPath; + OpenDialog.Filter := Format('%s|*.gradient;*.ugr|%s|*.map|%s|*.*', + [TextByKey('common-filter-gradientfiles'), + TextByKey('common-filter-fractintfiles'), + TextByKey('common-filter-allfiles')]); + OpenDialog.FileName := ''; + if OpenSaveFileDialog(GradientBrowser, OpenDialog.DefaultExt, OpenDialog.Filter, OpenDialog.InitialDir, TextByKey('common-browse'), fn, true, false, false, true) then + //if OpenDialog.Execute then + begin + Filename := fn; //OpenDialog.FileName; + GradientFile := Filename; + BrowserPath := ExtractFilePath(fn); //ExtractFilePath(OpenDialog.FileName); + ListFileContents; + end; +end; + +procedure TGradientBrowser.btnRandomClick(Sender: TObject); +var i: integer; +begin + if ListView.Items.Count < 2 then exit; + i := random(ListView.Items.Count); + ListView.Selected := ListView.Items[i]; + Apply; +end; + +procedure TGradientBrowser.Apply; +begin + MainForm.StopThread; + MainForm.UpdateUndo; + MainCp.cmap := Palette; + MainCP.cmapindex := -1; + if EditForm.Visible then EditForm.UpdateDisplay; + if AdjustForm.Visible then AdjustForm.UpdateDisplay; + if MutateForm.Visible then MutateForm.UpdateDisplay; + MainForm.RedrawTimer.enabled := true; +end; + +procedure TGradientBrowser.ListViewDblClick(Sender: TObject); +begin + Apply; +end; + +procedure TGradientBrowser.ListViewKeyPress(Sender: TObject; + var Key: Char); +begin + if Key = #13 then Apply; +end; + +procedure TGradientBrowser.FormClose(Sender: TObject; + var Action: TCloseAction); +var + Registry: TRegistry; +begin + { Write position to registry } + Registry := TRegistry.Create; + try + Registry.RootKey := HKEY_CURRENT_USER; + { Defaults } + if Registry.OpenKey('\Software\' + APP_NAME + '\Forms\Browser', True) then + begin + Registry.WriteInteger('Top', GradientBrowser.Top); + Registry.WriteInteger('Left', GradientBrowser.Left); + Registry.WriteInteger('Width', GradientBrowser.Width); + Registry.WriteInteger('Height', GradientBrowser.Height); + end; + finally + Registry.Free; + end; +end; + +procedure TGradientBrowser.ListViewInfoTip(Sender: TObject; + Item: TListItem; var InfoTip: String); +var + i, j: integer; + Row: pRGBTripleArray; + Bitmap: TBitmap; + pal: TColorMap; + EntryStrings, FStrings: TStringList; + rect: TRect; +begin + BitMap := TBitMap.create; + Bitmap.PixelFormat := pf24bit; + BitMap.Width := 256; + BitMap.Height := 100; + + FStrings := TStringList.Create; + EntryStrings := TStringList.Create; + try + if Lowercase(ExtractFileExt(filename)) = '.map' then + begin + pal := LoadFractintMap(filename); + end + else + begin + Identifier := Item.Caption; + FStrings.LoadFromFile(Filename); + for i := 0 to FStrings.count - 1 do + if Pos(Lowercase(Item.Caption) + ' ', Trim(Lowercase(FStrings[i]))) = 1 then break; + EntryStrings.Add(FStrings[i]); + repeat + inc(i); + EntryStrings.Add(FStrings[i]); + until Pos('}', FStrings[i]) <> 0; + pal := CreatePalette(EntryStrings.Text); + end; + finally + EntryStrings.Free; + FStrings.Free; + end; + + for j := 0 to Bitmap.Height - 1 do + begin + Row := Bitmap.Scanline[j]; + for i := 0 to Bitmap.Width - 1 do + begin + with Row[i] do + begin + rgbtRed := pal[i][0]; + rgbtGreen := pal[i][1]; + rgbtBlue := pal[i][2]; + end + end + end; + rect.TopLeft := Item.Position; + rect.BottomRight.X := rect.TopLeft.X + 100; + rect.BottomRight.Y := rect.TopLeft.Y + 16; + with ListView do + begin + Canvas.Rectangle(Rect); + Canvas.StretchDraw(Rect, Bitmap); + end; + BitMap.Free; + InfoTip := ''; + TooltipTimer.Interval := PaletteTooltipTimeout; + TooltipTimer.Enabled := true; +end; + +procedure TGradientBrowser.TooltipTimerTimer(Sender: TObject); +begin + ListView.Repaint; + TooltipTimer.Enabled := false; +end; + +procedure TGradientBrowser.FormResize(Sender: TObject); +begin + Listview.Width := self.ClientWidth - 4; + btnDefGradient.Left := self.ClientWidth - 2 - btnDefGradient.Width; + ListView.Height := self.ClientHeight - pnlPreview.Height - 6; + btnDefGradient.Top := self.ClientHeight - pnlPreview.Height - 2 + pnlPreview.Height div 2 - btnDefGradient.Height div 2; + btnRandom.Left := btnDefGradient.Left - btnRandom.Width - 2; + btnRandom.Top := btnDefGradient.Top; + ListView.Top := 2; + ListView.Left := 2; + pnlPreview.Top := self.ClientHeight - pnlPreview.Height - 2; + pnlPreview.Left := 2; + pnlPreview.Width := self.ClientWidth - btnDefGradient.Width - 6 - btnRandom.Width; +end; + +end. + diff --git a/Forms/Chaos.dfm b/Forms/Chaos.dfm new file mode 100644 index 0000000..0e8d39a --- /dev/null +++ b/Forms/Chaos.dfm @@ -0,0 +1,131 @@ +object ChaosForm: TChaosForm + Left = 0 + Top = 0 + Caption = 'Transform Transitions' + ClientHeight = 324 + ClientWidth = 494 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Icon.Data = { + 0000010001001010200000000000680400001600000028000000100000002000 + 0000010020000000000000040000000000000000000000000000000000000501 + 01002A0E0D00250D0B00250D0B00260D0B0026090700000000007B7B7B00E6E6 + E600000000000000000000000000000000000000000000000000000000002A0F + 0C00F1554A00DE4E4400DF4E4400F653480057181400D7DEDF001A1A1A000000 + 0000D8D8D800000000000000000000000000000000000000000000000000250D + 0B00DE4E4400CD483F00D9483E003A020000D6E1E20000000000000000000000 + 000000000000E6E6E6000000000000000000000000000000000000000000250D + 0B00DF4E4500D8483E004C1C1800CAD8D900000000000000000000000000F4F4 + F40010101000000000000000000000000000000000000000000000000000260D + 0B00F65348003A020000CAD8D900000000000000000000000000000000000000 + 0000848484000000000000000000000000000000000000000000000000002609 + 060056171300D6E1E20000000000000000000000000000000000000000000000 + 000000000000000000006D6D6D00000000000000000000000000000000000000 + 0000DAE1E100000000000000000000000000000000000000000000000000F7F7 + F7000A0A0A005B5B5B000000000000000000000000000000000000000000F1F1 + F10099999900F7F7F70000000000000000000000000000000000000000000000 + 0000E9E9E9000000000000000000000000000000000000000000000000009292 + 92000000000000000000E9E9E900DFDFDF00C2C3B600C5C6B700C5C6B700C5C6 + B700CACABC00C4C4C100CECECE00000000000000000000000000000000006262 + 62000000000078787800BBBBBB004C4D40000000620000006E0000006C000000 + 6D000000850000000000B3B4B10000000000000000000000000000000000DADA + DA0000000000F1F1F10000000000505139001B11EF00261DFD00261DFB00251C + FF0000006F00C9C9C3000000000000000000000000000000000000000000D0D0 + D00000000000F5F5F50000000000505139001910E300241CEF00261DFF000906 + 6400CDCEB800000000000000000000000000000000000000000000000000C8C8 + C800000000003F3F3F009F9F9F005D5E46001910E400261DFF0000005E007A7A + 6A00393A3C00000000000000000000000000E8E8E8009C9C9C00000000000000 + 00007F7F7F00000000007373730060614B00160DF00004006700D1D2BF00DBDB + DB0000000000000000004B4B4B00F8F8F800C8C8C80000000000ADADAD000000 + 00000000000000000000000000004F50460000005900C3C4AD00000000000000 + 0000BDBDBD006666660000000000000000000000000000000000424242000000 + 00000000000000000000000000003D3D3D00C9C9BF0000000000000000000000 + 00000000000000000000C8C8C800D4D4D400AFAFAF004343430000000000007F + 0000003F0000031F0000071F00000F9F00001F0F00003F1F00001FBF0000000F + 0000000F0000101F0000103F00000039000080000000F1800000F3E10000} + OldCreateOrder = False + OnActivate = FormActivate + OnCreate = FormCreate + OnResize = FormResize + DesignSize = ( + 494 + 324) + PixelsPerInch = 96 + TextHeight = 13 + object PageControl1: TPageControl + Left = 0 + Top = 8 + Width = 496 + Height = 277 + ActivePage = TabMatrix + Anchors = [akLeft, akTop, akRight, akBottom] + TabOrder = 0 + object TabMatrix: TTabSheet + Caption = 'Probability Matrix' + DesignSize = ( + 488 + 249) + object ChaosMatrix: TStringGrid + Left = 0 + Top = 80 + Width = 488 + Height = 145 + Anchors = [akLeft, akTop, akRight] + Color = clBtnFace + ColCount = 2 + RowCount = 2 + Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goThumbTracking] + TabOrder = 0 + OnDrawCell = ChaosMatrixDrawCell + end + object chkPercents: TCheckBox + Left = 10 + Top = 229 + Width = 350 + Height = 17 + Caption = ' Show values in percents' + TabOrder = 1 + OnClick = chkPercentsClick + end + object WeightVector: TStringGrid + Left = 0 + Top = 0 + Width = 488 + Height = 70 + Align = alTop + Color = clBtnFace + ColCount = 2 + RowCount = 2 + Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goThumbTracking] + ScrollBars = ssHorizontal + TabOrder = 2 + OnDrawCell = ChaosMatrixDrawCell + end + end + object TabDiagram: TTabSheet + Caption = 'Xaos Diagram' + ImageIndex = 1 + TabVisible = False + ExplicitLeft = 0 + ExplicitTop = 0 + ExplicitWidth = 0 + ExplicitHeight = 0 + end + end + object btnClose: TButton + Left = 400 + Top = 291 + Width = 86 + Height = 25 + Anchors = [akRight, akBottom] + Caption = 'Close' + Default = True + ModalResult = 8 + TabOrder = 1 + OnClick = btnCloseClick + end +end diff --git a/Forms/Chaos.pas b/Forms/Chaos.pas new file mode 100644 index 0000000..25a41e4 --- /dev/null +++ b/Forms/Chaos.pas @@ -0,0 +1,168 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit Chaos; + +interface + +uses + Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, + Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.ComCtrls, Editor, Translation, + Vcl.StdCtrls, Math; + +type + TChaosForm = class(TForm) + PageControl1: TPageControl; + TabMatrix: TTabSheet; + ChaosMatrix: TStringGrid; + btnClose: TButton; + TabDiagram: TTabSheet; + chkPercents: TCheckBox; + WeightVector: TStringGrid; + procedure ChaosMatrixDrawCell(Sender: TObject; ACol, ARow: Integer; + Rect: TRect; State: TGridDrawState); + procedure FormActivate(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure btnCloseClick(Sender: TObject); + procedure chkPercentsClick(Sender: TObject); + procedure FormResize(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + ChaosForm: TChaosForm; + +implementation + +{$R *.dfm} + + +procedure TChaosForm.btnCloseClick(Sender: TObject); +begin + Close; +end; + +procedure TChaosForm.ChaosMatrixDrawCell(Sender: TObject; ACol, ARow: Integer; + Rect: TRect; State: TGridDrawState); +var + h, ax, ay, bx, by: integer; + val: double; + trgColor : TColor; + newRect: TRect; + begin + if (ARow = 0) and (ACol = 0) then exit; + if not (gdFixed in State) then + begin + trgColor := EditForm.GetTriangleColor(ACol - 1); + with TStringGrid(Sender).Canvas do begin + Brush.Color := trgColor; + FillRect(Rect); + Font.Color := clBlack; //clWindowText; + if Sender = ChaosMatrix then + begin + val := EditForm.cp.xform[ACol - 1].modWeights[ARow - 1]; + if not chkPercents.Checked then + TextOut(Rect.Left + 4, Rect.Top + 4, FloatToStr(RoundTo(val, -4))) + else begin + if ChaosMatrix.Cells[ACol, 1] = '0' then + TextOut(Rect.Left + 4, Rect.Top + 4, '0%') + else + TextOut(Rect.Left + 4, Rect.Top + 4, Format('%g%%', + [RoundTo(val / StrToFloat(ChaosMatrix.Cells[ACol, 1]), -4)])); + end; + end else // if Sender = WeightVector then + begin + val := EditForm.cp.xform[ACol - 1].density; + if not chkPercents.Checked then + TextOut(Rect.Left + 4, Rect.Top + 4, FloatToStr(RoundTo(val, -4))) + else // weight sum is always not zero + TextOut(Rect.Left + 4, Rect.Top + 4, Format('%g%%', + [RoundTo(val / StrToFloat(WeightVector.Cells[1,1]), -4)])); + end; + end; + end else + begin + if (ACol = 0) then + trgColor := EditForm.GetTriangleColor(ARow - 1) + else + trgColor := EditForm.GetTriangleColor(ACol - 1); + if (Sender = WeightVector) and (ARow = 1) then exit; + with TStringGrid(Sender).Canvas do begin + h := Rect.Bottom - Rect.Top - 2; + ax := Rect.Right - 3; + ay := Rect.Top + 2; + bx := Rect.Right - h; + by := Rect.Bottom - 3; + + pen.Color := clBlack; + Polyline([Point(ax+1, ay-2), Point(ax+1, by+1), Point(bx-2, by+1), Point(ax+1, ay-2)]); + + pen.Color := trgColor; + brush.Color := pen.Color shr 1 and $7f7f7f; + Polygon([Point(ax, ay), Point(ax, by), Point(bx, by)]); + end; + end; +end; + +procedure TChaosForm.chkPercentsClick(Sender: TObject); +begin + WeightVector.Invalidate; + ChaosMatrix.Invalidate; +end; + +procedure TChaosForm.FormActivate(Sender: TObject); +var + i, j, n: integer; + sum: double; +begin + n := EditForm.cp.NumXForms + 1; + sum := 0; + with WeightVector do begin + ColCount := n; + for i := 1 to n do + Cells[i,0] := ' ' + IntToStr(i); + for j := 0 to n-2 do + sum := sum + EditForm.cp.xform[j].density; + Cells[1, 1] := FloatToStr(sum * 0.01); + end; + with ChaosMatrix do begin + ColCount := n; + RowCount := n; + for i := 1 to n do + begin + Cells[0,i] := Format(TextByKey('editor-common-toprefix'), [i]); + Cells[i,0] := Format(TextByKey('editor-common-fromprefix'), [i]); + sum := 0; + for j := 0 to n-2 do + sum := sum + EditForm.cp.xform[i-1].modWeights[j]; + Cells[i, 1] := FloatToStr(sum * 0.01); + end; + Height := TabMatrix.Height - Top - 24; + Invalidate; + end; + chkPercents.Top := TabMatrix.Height - 20; +end; + +procedure TChaosForm.FormCreate(Sender: TObject); +begin + self.Caption := TextByKey('transitions-title'); + TabMatrix.Caption := TextByKey('transitions-matrix'); + btnClose.Caption := TextByKey('common-close'); + ChaosMatrix.Cells[0,0] := TextByKey('editor-tab-chaos-path'); + chkPercents.Caption := TextByKey('transitions-inpercents'); + WeightVector.Cells[0,0] := TextByKey('transitions-transform'); + WeightVector.Cells[0,1] := TextByKey('editor-common-weight'); + // AV: TODO: visualize Markov chain transitions using arrows + // TabDiagram.Caption := TextByKey('transitions-diagram'); +end; + +procedure TChaosForm.FormResize(Sender: TObject); +begin + ChaosMatrix.Height := TabMatrix.Height - ChaosMatrix.Top - 24; + chkPercents.Top := TabMatrix.Height - 20; + TabMatrix.Invalidate; +end; + +end. diff --git a/Forms/ColorRangeForm.dfm b/Forms/ColorRangeForm.dfm new file mode 100644 index 0000000..c3633de --- /dev/null +++ b/Forms/ColorRangeForm.dfm @@ -0,0 +1,133 @@ +object ColorSelection: TColorSelection + Left = 0 + Top = 0 + BorderIcons = [biSystemMenu] + BorderStyle = bsSingle + Caption = 'Palette Interval Selection' + ClientHeight = 114 + ClientWidth = 287 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Icon.Data = { + 0000010001001010000000000000680400001600000028000000100000002000 + 000001002000000000000004000000000000000000000000000000000000020C + 16000C283700051D2900051C260001121A2703131C780A2937C611374AE11038 + 4CE7061B27A1020D150C030F19000617230011384B000E2E3E0006131F00020C + 16000C2736000218222E0F2E3E9B285C7AE03E7DA4FF468FBDFF4994C0FF4C9C + CBFF317295FF1D4E692D1B4A630016476100123E52000D2D3D0006131F00010A + 1300092331522A617EE84D99C5FF4F9FD0FF408CB9FF3884AFFF3783AFFF3C8D + BCFF245775CC0F30410C16435A0016486200123D51000D2D3D0006131F00010B + 1637316584EE51A3D1FF257AB1FF2A77A3FF3684ADFF3584AFFF3586B1FF3482 + ADFF153A4E900A2B3C380F35473D12435B3E0E374A3E0B2A390F061320002142 + 55B552ACD7FF2391C7FF3FB5E1FF2485C0FF2D7CADFF388AB7FF347AA6FF337D + A6FF2E7499FA27688AF02D7293F139799EF4346E91F51B4960C6020D17344075 + 93F656B6DEFF31CBF0FF21E4FEFF26B4E2FF2D7FB9FF4096C1FF336E94FF3056 + 71FF2774A0FF286A90F130749891387EA8E64CA4D8FF55ABDDFF224D67D74380 + A1F576BADCFF76BCDCFF7FD1FAFF62B6F0FF61ABD9FF64AFD4FF4699C2FF98AF + BDFF5A839EFF1A638BFD225A7AF52B81AFFC3FA1D2FF4DAAD8FF3A85ABFA3464 + 7CC774BFE6FF70B0CEFF439186FF367A4FFF4A9D8EFF79BCE6FF77BBDEFF6CAA + CDFFC0CED3FF4C819FFF4D7B98FF61686EFF6B7072FF55A4CAFF2E769AEA1532 + 3F44599DC7F661BAB3FF18BB0EFF009400FF278543FF7EC4E9FF8ECDE8FF5CAC + D0FF75B1CEFFA1BBC2FF955438FFD4580BFFBA6E34FF5A99B4FF0F31466E0B1E + 2700214D626569BCE3F979CBBBFF67DD98FF82CEE0FF77B8E4FF365DC9FF254C + B5FF1D58A9FF3991BCFF4FAEC6FF809DA6FF79B7CCFF2E617EA405111D0F0E23 + 2E00173B4D0055AAD23D6ABCF0CD82C4FDFB92D4F2FF7EC1E5FF3B6ADDFF1930 + DBFF295FD1FF4DA0CEFF3FBDE4FF3EB7EAFF368BBC8F204A6304020913000E23 + 2D00193E510057AAD30056B4DF0055B8E35459B9E58E63C1E9AB6FC8EDCD64C0 + EDD160C2EBC264BFEA8E3E9DCEAF4AC1E0FF49ACDAD73A87AD0A1D425A000E23 + 2D00193E510057AAD30058B5E00057B9E40057B8E5004FB7E6005CC0E81962C4 + E81D57BDE7105AB9E700249BCF0F38ADD3C056C6E6FF4198C66F49C3EB000E23 + 2D00193E510057AAD30058B5E00057B9E40057B8E50051B8E6005EC0E80062C3 + E80058BEE70058B8E50018A2D50023A5D71B4BC4E6DA44A7C9FB41C1E32E0E23 + 2D00193E510057AAD30058B5E00057B9E40057B8E50051B8E6005EC0E80062C3 + E80058BEE70058B8E5001AA1D40024A9D90032B9E32D3CA7CFEE45C8E9540E23 + 2D00193E510057AAD30058B5E00057B9E40057B8E50051B8E6005EC0E80062C3 + E80058BEE70058B8E5001AA1D40025A8D80030B6E2003CC5EB5C50DDFA4FFC3F + 0000E03F0000C03F0000803F0000000100000000000000000000000000008001 + 0000C0010000E0030000F8030000FFF30000FFF90000FFFD0000FFFF0000} + OldCreateOrder = False + Position = poDefault + OnCreate = FormCreate + OnShow = FormShow + DesignSize = ( + 287 + 114) + PixelsPerInch = 96 + TextHeight = 13 + object StartColor: TShape + Left = 10 + Top = 40 + Width = 30 + Height = 22 + end + object LastColor: TShape + Left = 140 + Top = 40 + Width = 30 + Height = 22 + end + object lbStart: TLabel + Left = 8 + Top = 16 + Width = 94 + Height = 13 + Caption = 'Start palette index:' + end + object lbLast: TLabel + Left = 140 + Top = 16 + Width = 90 + Height = 13 + Caption = 'Last palette index:' + end + object btOK: TButton + Left = 101 + Top = 82 + Width = 75 + Height = 25 + Anchors = [akRight, akBottom] + Caption = 'OK' + Default = True + ModalResult = 1 + TabOrder = 0 + OnClick = btOKClick + end + object btCancel: TButton + Left = 186 + Top = 82 + Width = 75 + Height = 25 + Anchors = [akRight, akBottom] + Caption = 'Cancel' + ModalResult = 2 + TabOrder = 1 + end + object SpinStart: TSpinEdit + Left = 40 + Top = 40 + Width = 70 + Height = 22 + MaxValue = 253 + MinValue = 0 + TabOrder = 2 + Value = 0 + OnChange = SpinStartChange + OnKeyPress = SpinValueKeyPress + end + object SpinLast: TSpinEdit + Left = 170 + Top = 40 + Width = 70 + Height = 22 + MaxValue = 255 + MinValue = 2 + TabOrder = 3 + Value = 255 + OnChange = SpinLastChange + OnKeyPress = SpinValueKeyPress + end +end diff --git a/Forms/ColorRangeForm.pas b/Forms/ColorRangeForm.pas new file mode 100644 index 0000000..201859e --- /dev/null +++ b/Forms/ColorRangeForm.pas @@ -0,0 +1,91 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit ColorRangeForm; + +interface + +uses + Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, + Vcl.Controls, ComCtrls, StdCtrls, ExtCtrls, Vcl.Forms, Vcl.Dialogs, Adjust, Translation, + Vcl.Samples.Spin; +type + TColorSelection = class(TForm) + btOK: TButton; + btCancel: TButton; + SpinStart: TSpinEdit; + SpinLast: TSpinEdit; + StartColor: TShape; + LastColor: TShape; + lbStart: TLabel; + lbLast: TLabel; + procedure FormCreate(Sender: TObject); + procedure btOKClick(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure SpinLastChange(Sender: TObject); + procedure SpinValueKeyPress(Sender: TObject; var Key: Char); + procedure SpinStartChange(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + ColorSelection: TColorSelection; + +implementation + +{$R *.dfm} + +procedure TColorSelection.btOKClick(Sender: TObject); +begin + AdjustForm.selA := SpinStart.Value; + AdjustForm.selB := SpinLast.Value; +end; + +procedure TColorSelection.FormCreate(Sender: TObject); +begin + self.Caption := TextBykey('selectcolors-title'); + lbStart.Caption := TextBykey('selectcolors-start'); + lbLast.Caption := TextBykey('selectcolors-last'); + btOK.Caption := TextByKey('common-ok'); + btCancel.Caption := TextByKey('common-cancel'); +end; + +procedure TColorSelection.SpinValueKeyPress(Sender: TObject; var Key: Char); +begin + if Key = '-' then Key := #0; // AV: non-negative indices only +end; + +procedure TColorSelection.FormShow(Sender: TObject); +var a, b: byte; +begin + self.Left := AdjustForm.Left + ((AdjustForm.Width - self.Width) shr 1); + self.Top := AdjustForm.Top + 55; + a := AdjustForm.selA; + b := AdjustForm.selB; + SpinStart.Value := a; + SpinLast.Value := b; + StartColor.Brush.Color := RGB(AdjustForm.palette[a,0], AdjustForm.palette[a,1], AdjustForm.palette[a,2]); + LastColor.Brush.Color := RGB(AdjustForm.palette[b,0], AdjustForm.palette[b,1], AdjustForm.palette[b,2]); +end; + +procedure TColorSelection.SpinStartChange(Sender: TObject); +begin + if SpinStart.Value > 253 then SpinStart.Value := 253; + if (SpinLast.Value - SpinStart.Value < 2) then + SpinStart.Value := SpinLast.Value - 2; + StartColor.Brush.Color := RGB(AdjustForm.palette[SpinStart.Value,0], + AdjustForm.palette[SpinStart.Value,1], AdjustForm.palette[SpinStart.Value,2]); +end; + +procedure TColorSelection.SpinLastChange(Sender: TObject); +begin + if SpinLast.Value > 255 then SpinLast.Value := 255; + if (SpinLast.Value - SpinStart.Value < 2) then + SpinLast.Value := SpinStart.Value + 2; + LastColor.Brush.Color := RGB(AdjustForm.palette[SpinLast.Value,0], + AdjustForm.palette[SpinLast.Value,1], AdjustForm.palette[SpinLast.Value,2]); +end; + +end. diff --git a/Forms/Curves.dfm b/Forms/Curves.dfm new file mode 100644 index 0000000..3b97403 --- /dev/null +++ b/Forms/Curves.dfm @@ -0,0 +1,125 @@ +object CurvesForm: TCurvesForm + Left = 197 + Top = 111 + BorderStyle = bsDialog + Caption = 'Curves' + ClientHeight = 492 + ClientWidth = 489 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'System' + Font.Style = [] + OldCreateOrder = False + OnClose = FormClose + OnCreate = FormCreate + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 16 + object Label1: TLabel + Left = 8 + Top = 16 + Width = 75 + Height = 13 + Caption = 'Selected curve:' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object CurvesPanel: TPanel + Left = 8 + Top = 68 + Width = 473 + Height = 414 + BevelOuter = bvNone + Color = clBlack + ParentBackground = False + TabOrder = 0 + end + object cbChannel: TComboBox + Left = 8 + Top = 35 + Width = 185 + Height = 21 + Style = csDropDownList + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ItemIndex = 0 + ParentFont = False + TabOrder = 1 + Text = 'Overall' + OnChange = cbChannelChange + Items.Strings = ( + 'Overall' + 'Red' + 'Green' + 'Blue') + end + object tbWeightLeft: TScrollBar + Left = 326 + Top = 8 + Width = 155 + Height = 21 + Max = 160 + PageSize = 0 + Position = 80 + TabOrder = 2 + OnChange = tbWeightChange + OnScroll = tbWeightScroll + end + object tbWeightRight: TScrollBar + Left = 326 + Top = 35 + Width = 155 + Height = 21 + Max = 160 + PageSize = 0 + Position = 80 + TabOrder = 3 + OnChange = tbWeightChange + OnScroll = tbWeightScroll + end + object Panel2: TPanel + Left = 199 + Top = 8 + Width = 121 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = ' First CP weight:' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 4 + end + object Panel1: TPanel + Left = 199 + Top = 35 + Width = 121 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = ' Second CP weight:' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 5 + end +end diff --git a/Forms/Curves.pas b/Forms/Curves.pas new file mode 100644 index 0000000..959d238 --- /dev/null +++ b/Forms/Curves.pas @@ -0,0 +1,123 @@ +unit Curves; + +interface + +uses Windows, Classes, Graphics, Forms, Controls, CurvesControl, Vcl.ExtCtrls, + Vcl.StdCtrls, Vcl.ComCtrls, ControlPoint, Registry, Global; + +type + TCurvesForm = class(TForm) + CurvesPanel: TPanel; + cbChannel: TComboBox; + tbWeightLeft: TScrollBar; + tbWeightRight: TScrollBar; + Panel2: TPanel; + Panel1: TPanel; + Label1: TLabel; + procedure FormShow(Sender: TObject); + procedure cbChannelChange(Sender: TObject); + procedure tbWeightChange(Sender: TObject); + procedure tbWeightScroll(Sender: TObject; ScrollCode: TScrollCode; + var ScrollPos: Integer); + procedure FormCreate(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + private + { Private declarations } + published + CurvesControl: TCurvesControl; + public + procedure SetCp(cp: TControlPoint); + end; + +var + CurvesForm: TCurvesForm; + +implementation + +uses Main; + +{$R *.DFM} + +procedure TCurvesForm.tbWeightScroll(Sender: TObject; ScrollCode: TScrollCode; + var ScrollPos: Integer); +begin + if ScrollCode = scEndScroll then + CurvesControl.UpdateFlame; +end; + +procedure TCurvesForm.SetCp(cp: TControlPoint); +begin + if CurvesControl = nil then Exit; + CurvesControl.SetCp(cp); +end; + +procedure TCurvesForm.cbChannelChange(Sender: TObject); +begin + if CurvesControl = nil then Exit; + CurvesControl.ActiveChannel := TCurvesChannel(cbChannel.ItemIndex); + tbWeightLeft.Position := Round(CurvesControl.WeightLeft * 10); + tbWeightRight.Position := Round(CurvesControl.WeightRight * 10); +end; + +procedure TCurvesForm.FormClose(Sender: TObject; var Action: TCloseAction); +var + Registry: TRegistry; +begin + { Write position to registry } + Registry := TRegistry.Create; + try + Registry.RootKey := HKEY_CURRENT_USER; + if Registry.OpenKey('\Software\' + APP_NAME + '\Forms\Curves', True) then + begin + Registry.WriteInteger('Top', self.Top); + Registry.WriteInteger('Left', self.Left); + end; + finally + Registry.Free; + end; +// bStop := True; +end; + +procedure TCurvesForm.FormCreate(Sender: TObject); +begin + // +end; + +procedure TCurvesForm.FormShow(Sender: TObject); +var Registry: TRegistry; +begin + if not (assigned(curvesControl)) then + begin + CurvesControl := TCurvesControl.Create(self); + CurvesControl.Align := alClient; + CurvesControl.Parent := CurvesPanel; + end; + + Registry := TRegistry.Create; + try + Registry.RootKey := HKEY_CURRENT_USER; + if Registry.OpenKey('Software\' + APP_NAME + '\Forms\Curves', False) then + begin + if Registry.ValueExists('Left') then + self.Left := Registry.ReadInteger('Left'); + if Registry.ValueExists('Top') then + self.Top := Registry.ReadInteger('Top'); + Registry.CloseKey; + end; + finally + Registry.Free; + end; + + tbWeightLeft.Position := Round(CurvesControl.WeightLeft * 10); + tbWeightRight.Position := Round(CurvesControl.WeightRight * 10); + + SetCp(MainCp); +end; + +procedure TCurvesForm.tbWeightChange(Sender: TObject); +begin + CurvesControl.WeightLeft := tbWeightLeft.Position / 10.0; + CurvesControl.WeightRight := tbWeightRight.Position / 10.0; +end; + +end. diff --git a/Forms/Editor.dfm b/Forms/Editor.dfm new file mode 100644 index 0000000..cc20def --- /dev/null +++ b/Forms/Editor.dfm @@ -0,0 +1,5937 @@ +object EditForm: TEditForm + Left = 509 + Top = 87 + Caption = 'Transform Editor' + ClientHeight = 722 + ClientWidth = 764 + Color = clBtnFace + Constraints.MinHeight = 400 + Constraints.MinWidth = 200 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Icon.Data = { + 0000010001001010000001002000680400001600000028000000100000002000 + 0000010020000000000040040000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000282728AC010101BC020202880000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000979697FA5E5B5E57010101EF02020286000000000000001E0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000005B5B5BBF010101F200000000131313DC0605 + 06D002000269010101E4020102F5090707E30000000000000000000000000000 + 000000000000000000000000000073737385020102FF02020281000000000000 + 00002B292BC0020102FF010101AC1212091D0000000000000000000000000000 + 000000000000000000000000000080808022504E50FF010101BF000000006059 + 5928575557A2242324FF010101EA000000000000000000000000000000000000 + 000000000000000000000000000000000000717171F2010101E9000000007B77 + 76D0919090EB565656832D2D2D7D010101DD010101C300000000000000000000 + 000000000000000000000000000000000000646464CC020102FF0000000D0000 + 0000747474216767673E00000000505050201717173700000000000000000000 + 0000000000000000000000000000000000006C6C6C95181718FF020202810000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000898887C7B1AFAEFF817F7EFF0E0B0AFF0A08 + 07F8000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000969496ED060506DA0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000009090908E646364FF0000 + 001D090606CF0A0707AB00000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000009D9C9DCB6E6B + 6BF50A0707F3070505BB00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000008080 + 80224D4D4D3C0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + 0000FFFF0000C7FF0000C2FF0000F2070000F1870000F10F0000F9030000F893 + 0000F8FF0000F07F0000FCFF0000FC1F0000FE1F0000FF3F0000FFFF0000} + KeyPreview = True + OldCreateOrder = True + Position = poDefault + OnActivate = FormActivate + OnClose = FormClose + OnCreate = FormCreate + OnDestroy = FormDestroy + OnKeyDown = EditKeyDown + OnKeyPress = EditKeyPress + OnResize = FormResize + OnShortCut = FormShortCut + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object StatusBar: TStatusBar + Left = 0 + Top = 704 + Width = 764 + Height = 18 + Panels = < + item + Width = 60 + end + item + Width = 60 + end + item + Width = 150 + end> + end + object topPnl: TPanel + Left = 0 + Top = 0 + Width = 764 + Height = 24 + Align = alTop + BevelOuter = bvSpace + Ctl3D = True + ParentCtl3D = False + TabOrder = 0 + object EditorToolBar: TToolBar + Left = 1 + Top = 1 + Width = 762 + Height = 22 + Align = alClient + ButtonHeight = 23 + ButtonWidth = 24 + Caption = 'EditorToolBar' + Color = clBtnFace + Images = EditorTB + ParentColor = False + TabOrder = 0 + object tbResetAll: TToolButton + Left = 0 + Top = 0 + Hint = 'New blank flame' + Caption = 'New blank flame' + ImageIndex = 0 + ParentShowHint = False + ShowHint = True + OnClick = mnuResetAllClick + end + object tbAdd: TToolButton + Left = 24 + Top = 0 + Hint = 'Adds a new triangle' + Caption = 'Add' + ImageIndex = 1 + ParentShowHint = False + ShowHint = True + OnClick = mnuAddClick + end + object tbDuplicate: TToolButton + Left = 48 + Top = 0 + Hint = 'Duplicates the selected triangle' + Caption = 'Duplicate' + ImageIndex = 2 + ParentShowHint = False + ShowHint = True + OnClick = mnuDupClick + end + object tbDelete: TToolButton + Left = 72 + Top = 0 + Hint = 'Deletes the selected triangle' + Caption = 'Delete' + ImageIndex = 3 + ParentShowHint = False + ShowHint = True + OnClick = mnuDeleteClick + end + object ToolButton4: TToolButton + Left = 96 + Top = 0 + Width = 8 + Caption = 'ToolButton4' + ImageIndex = 3 + Style = tbsSeparator + end + object tbUndo: TToolButton + Left = 104 + Top = 0 + Hint = 'Undo (Ctrl+Z)' + Caption = 'Undo' + ImageIndex = 4 + ParentShowHint = False + ShowHint = True + OnClick = mnuUndoClick + end + object tbRedo: TToolButton + Left = 128 + Top = 0 + Hint = 'Redo (Ctrl+Y)' + Caption = 'Redo' + ImageIndex = 5 + ParentShowHint = False + ShowHint = True + OnClick = mnuRedoClick + end + object ToolButton11: TToolButton + Left = 152 + Top = 0 + Width = 8 + Caption = 'ToolButton11' + ImageIndex = 32 + Style = tbsSeparator + end + object tbCopy: TToolButton + Left = 160 + Top = 0 + Hint = 'Copy triangle' + Caption = 'tbCopy' + DropdownMenu = CopyMenu + ImageIndex = 26 + ParentShowHint = False + ShowHint = True + end + object tbPaste: TToolButton + Left = 184 + Top = 0 + Hint = 'Paste triangle' + Caption = 'tbPaste' + DropdownMenu = PasteMenu + ImageIndex = 27 + ParentShowHint = False + ShowHint = True + end + object ToolButton1: TToolButton + Left = 208 + Top = 0 + Width = 8 + Caption = 'ToolButton1' + ImageIndex = 5 + Style = tbsSeparator + end + object tbSelect: TToolButton + Left = 216 + Top = 0 + Hint = 'Select mode' + Caption = 'Select' + Down = True + ImageIndex = 6 + ParentShowHint = False + ShowHint = True + OnClick = tbSelectClick + end + object tbMove: TToolButton + Left = 240 + Top = 0 + Hint = 'Move triangle' + Caption = 'Move' + Down = True + Grouped = True + ImageIndex = 7 + ParentShowHint = False + ShowHint = True + Style = tbsCheck + OnClick = tbEditModeClick + end + object tbRotate: TToolButton + Left = 264 + Top = 0 + Hint = 'Rotate triangle' + Caption = 'Rotate' + Grouped = True + ImageIndex = 8 + ParentShowHint = False + ShowHint = True + Style = tbsCheck + OnClick = tbEditModeClick + end + object tbScale: TToolButton + Left = 288 + Top = 0 + Hint = 'Scale triangle' + Caption = 'Scale' + Grouped = True + ImageIndex = 9 + ParentShowHint = False + ShowHint = True + Style = tbsCheck + OnClick = tbEditModeClick + end + object tbPivotMode: TToolButton + Left = 312 + Top = 0 + Hint = 'Toggle world pivot mode' + Caption = 'tbPivotMode' + ImageIndex = 15 + ParentShowHint = False + ShowHint = True + Style = tbsCheck + OnClick = btnPivotModeClick + end + object ToolButton6: TToolButton + Left = 336 + Top = 0 + Width = 8 + Caption = 'ToolButton6' + ImageIndex = 16 + Style = tbsSeparator + end + object tbRotate90CCW: TToolButton + Left = 344 + Top = 0 + Hint = 'Rotate triangle 90'#176' counter-clockwise' + Caption = 'tbRotate90CCW' + ImageIndex = 17 + ParentShowHint = False + ShowHint = True + OnClick = btTrgRotateLeft90Click + end + object tbRotate90CW: TToolButton + Left = 368 + Top = 0 + Hint = 'Rotate triangle 90'#176' clockwise' + Caption = 'tbRotate90CW' + ImageIndex = 18 + ParentShowHint = False + ShowHint = True + OnClick = btTrgRotateRight90Click + end + object tbFlipHorz: TToolButton + Left = 392 + Top = 0 + Hint = 'Flip triangle horizontal' + Caption = 'Flip Horizontal' + ImageIndex = 10 + ParentShowHint = False + ShowHint = True + OnClick = mnuFlipHorizontalClick + end + object tbFlipVert: TToolButton + Left = 416 + Top = 0 + Hint = 'Flip triangle vertical' + Caption = 'Flip Vertical' + ImageIndex = 11 + ParentShowHint = False + ShowHint = True + OnClick = mnuFlipVerticalClick + end + object ToolButton2: TToolButton + Left = 440 + Top = 0 + Width = 8 + Caption = 'ToolButton2' + ImageIndex = 14 + Style = tbsSeparator + end + object tbVarPreview: TToolButton + Left = 448 + Top = 0 + Hint = 'Show/hide variation preview' + Caption = 'Variation Preview' + ImageIndex = 14 + ParentShowHint = False + ShowHint = True + Style = tbsCheck + OnClick = tbVarPreviewClick + end + object ToolButton3: TToolButton + Left = 472 + Top = 0 + Width = 8 + Caption = 'ToolButton3' + ImageIndex = 16 + Style = tbsSeparator + end + object tbPostXswap: TToolButton + Left = 480 + Top = 0 + Hint = 'Enable post-triangle editing' + Caption = 'tbPostXswap' + ImageIndex = 29 + ParentShowHint = False + ShowHint = True + Style = tbsCheck + OnClick = tbPostXswapClick + end + object tbEnableFinalXform: TToolButton + Left = 504 + Top = 0 + Hint = 'Enable final transform' + Caption = 'Show Final Xform' + ImageIndex = 24 + ParentShowHint = False + ShowHint = True + Style = tbsCheck + OnClick = tbEnableFinalXformClick + end + object ToolButton8: TToolButton + Left = 528 + Top = 0 + Width = 8 + Caption = 'ToolButton8' + ImageIndex = 32 + Style = tbsSeparator + end + object tbPostLink: TToolButton + Left = 536 + Top = 0 + Hint = 'Adds a new linked triangle' + Caption = 'tbPostLink' + ImageIndex = 31 + ParentShowHint = False + ShowHint = True + OnClick = mnuLinkPostxformClick + end + object tbPreLink: TToolButton + Left = 560 + Top = 0 + Hint = 'Add linked pre-transform' + Caption = 'tbPreLink' + ImageIndex = 33 + ParentShowHint = False + ShowHint = True + OnClick = mnuLinkPrexformClick + end + object btnFullChaos: TToolButton + Left = 584 + Top = 0 + Caption = 'Show Chaos' + ImageIndex = 41 + ParentShowHint = False + ShowHint = True + OnClick = btnFullChaosClick + end + object ToolButton5: TToolButton + Left = 608 + Top = 0 + Width = 8 + Caption = 'ToolButton5' + ImageIndex = 32 + Style = tbsSeparator + end + object btnMathPopup: TToolButton + Left = 616 + Top = 0 + Hint = 'Insert math constant into the selected text field' + Caption = 'Math menu' + DropdownMenu = MathPopup + ImageIndex = 32 + ParentShowHint = False + ShowHint = True + Style = tbsDropDown + OnClick = InsertPi1Click + end + end + end + object EditPnl: TPanel + Left = 0 + Top = 24 + Width = 764 + Height = 680 + Align = alClient + TabOrder = 2 + OnClick = btnCopyTriangleClick + object Splitter1: TSplitter + Left = 453 + Top = 1 + Width = 10 + Height = 678 + Align = alRight + AutoSnap = False + Beveled = True + MinSize = 300 + OnMoved = splitterMoved + ExplicitLeft = 454 + ExplicitHeight = 731 + end + object GrphPnl: TPanel + Left = 1 + Top = 1 + Width = 452 + Height = 678 + Align = alClient + BevelOuter = bvNone + Color = clAppWorkSpace + TabOrder = 0 + object ImgTemp: TImage + Left = 0 + Top = 0 + Width = 273 + Height = 233 + Proportional = True + end + end + object RightPanel: TPanel + Left = 463 + Top = 1 + Width = 300 + Height = 678 + Align = alRight + Alignment = taLeftJustify + BevelOuter = bvNone + TabOrder = 1 + object Splitter2: TSplitter + Left = 0 + Top = 177 + Width = 300 + Height = 8 + Cursor = crVSplit + Align = alTop + AutoSnap = False + Beveled = True + MinSize = 177 + Visible = False + OnMoved = splitterMoved + end + object ControlPanel: TPanel + Left = 0 + Top = 185 + Width = 300 + Height = 493 + Align = alClient + TabOrder = 0 + OnResize = ControlPanelResize + DesignSize = ( + 300 + 493) + object PageControl: TPageControl + Left = 1 + Top = 79 + Width = 298 + Height = 413 + ActivePage = TabVariables + Anchors = [akLeft, akTop, akRight, akBottom] + MultiLine = True + ParentShowHint = False + ShowHint = False + TabOrder = 3 + TabStop = False + object TriangleTab: TTabSheet + Caption = 'Triangle' + ImageIndex = 34 + object TriangleScrollBox: TScrollBox + Left = 0 + Top = 0 + Width = 290 + Height = 367 + HorzScrollBar.Visible = False + VertScrollBar.Position = 58 + VertScrollBar.Smooth = True + VertScrollBar.Style = ssFlat + VertScrollBar.Tracking = True + Align = alClient + BevelInner = bvNone + BevelOuter = bvNone + BorderStyle = bsNone + TabOrder = 0 + DesignSize = ( + 273 + 367) + object TrianglePanel: TPanel + Left = 3 + Top = -48 + Width = 249 + Height = 415 + Anchors = [akLeft, akTop, akRight] + BevelOuter = bvNone + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 0 + OnResize = TrianglePanelResize + object TriangleToolBar: TToolBar + Left = 28 + Top = 218 + Width = 163 + Height = 28 + ParentCustomHint = False + Align = alNone + EdgeInner = esNone + EdgeOuter = esNone + Images = EditorTB + List = True + TabOrder = 3 + object tbCopyTriangle: TToolButton + Left = 0 + Top = 0 + Hint = 'Copy triangle coordinates' + ImageIndex = 26 + ParentShowHint = False + ShowHint = True + OnClick = btnCopyTriangleClick + end + object tbPasteTriangle: TToolButton + Left = 23 + Top = 0 + Hint = 'Paste triangle coordinates' + Enabled = False + ImageIndex = 27 + ParentShowHint = False + ShowHint = True + OnClick = btnPasteTriangleClick + end + object tbExtendedEdit: TToolButton + Left = 46 + Top = 0 + Hint = 'Enable extended edit mode' + Caption = 'tbExtendedEdit' + ImageIndex = 25 + ParentShowHint = False + ShowHint = True + Style = tbsCheck + OnClick = tbExtendedEditClick + end + object tbAxisLock: TToolButton + Left = 69 + Top = 0 + Hint = 'Lock transform axes' + Caption = 'tbAxisLock' + ImageIndex = 16 + ParentShowHint = False + ShowHint = True + Style = tbsCheck + OnClick = tbAxisLockClick + end + object tbAutoWeights: TToolButton + Left = 92 + Top = 0 + Hint = 'Auto-balance weights' + Caption = 'tbAutoWeights' + ImageIndex = 28 + ParentShowHint = False + ShowHint = True + Style = tbsCheck + end + object tb2PostXswap: TToolButton + Left = 115 + Top = 0 + Hint = 'Enable post-triangle editing' + Caption = 'tb2PostXswap' + ImageIndex = 29 + ParentShowHint = False + ShowHint = True + Style = tbsCheck + OnClick = tbPostXswapClick + end + object tbTriangle: TToolButton + Left = 138 + Top = 0 + DropdownMenu = TriangleOperations + ImageIndex = 34 + ParentShowHint = False + ShowHint = True + end + end + object GroupBox5: TGroupBox + Left = 20 + Top = 112 + Width = 177 + Height = 97 + Caption = 'Transformations' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + ParentShowHint = False + PopupMenu = TriangleOperations + ShowHint = True + TabOrder = 4 + OnDblClick = ResetToolsDblClick + object btTrgRotateLeft90: TSpeedButton + Left = 8 + Top = 17 + Width = 23 + Height = 24 + Hint = 'Rotate triangle 90'#176' counter-clockwise' + Flat = True + Glyph.Data = { + 36050000424D3605000000000000360400002800000010000000100000000100 + 08000000000000010000C40E0000C40E00000001000000000000000000000000 + 8000008000000080800080000000800080008080000080808000C0C0C0000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000003300 + 00006600000099000000CC000000FF0000000033000033330000663300009933 + 0000CC330000FF33000000660000336600006666000099660000CC660000FF66 + 000000990000339900006699000099990000CC990000FF99000000CC000033CC + 000066CC000099CC0000CCCC0000FFCC000000FF000033FF000066FF000099FF + 0000CCFF0000FFFF000000003300330033006600330099003300CC003300FF00 + 330000333300333333006633330099333300CC333300FF333300006633003366 + 33006666330099663300CC663300FF6633000099330033993300669933009999 + 3300CC993300FF99330000CC330033CC330066CC330099CC3300CCCC3300FFCC + 330000FF330033FF330066FF330099FF3300CCFF3300FFFF3300000066003300 + 66006600660099006600CC006600FF0066000033660033336600663366009933 + 6600CC336600FF33660000666600336666006666660099666600CC666600FF66 + 660000996600339966006699660099996600CC996600FF99660000CC660033CC + 660066CC660099CC6600CCCC6600FFCC660000FF660033FF660066FF660099FF + 6600CCFF6600FFFF660000009900330099006600990099009900CC009900FF00 + 990000339900333399006633990099339900CC339900FF339900006699003366 + 99006666990099669900CC669900FF6699000099990033999900669999009999 + 9900CC999900FF99990000CC990033CC990066CC990099CC9900CCCC9900FFCC + 990000FF990033FF990066FF990099FF9900CCFF9900FFFF99000000CC003300 + CC006600CC009900CC00CC00CC00FF00CC000033CC003333CC006633CC009933 + CC00CC33CC00FF33CC000066CC003366CC006666CC009966CC00CC66CC00FF66 + CC000099CC003399CC006699CC009999CC00CC99CC00FF99CC0000CCCC0033CC + CC0066CCCC0099CCCC00CCCCCC00FFCCCC0000FFCC0033FFCC0066FFCC0099FF + CC00CCFFCC00FFFFCC000000FF003300FF006600FF009900FF00CC00FF00FF00 + FF000033FF003333FF006633FF009933FF00CC33FF00FF33FF000066FF003366 + FF006666FF009966FF00CC66FF00FF66FF000099FF003399FF006699FF009999 + FF00CC99FF00FF99FF0000CCFF0033CCFF0066CCFF0099CCFF00CCCCFF00FFCC + FF0000FFFF0033FFFF0066FFFF0099FFFF00CCFFFF00FFFFFF000F0F0F0F0F0F + 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F + 0F0F0F0F070000070F0F0F0F0F0F0F0F0F0F0F0F070000070F0F0F0F0F0F0F0F + 0F0F0F0F070000070F0F0F0F0F0F0FD40F0F0F0F070000070F0F0F0F0F0FD47E + 0F0F0F0F070000070F0F0F0F0FD453530F0F0F0F070000070F0F0F0FD4530053 + 0F0F0F0F070000070F0F0FD45300000007070707070000070F0F0F5300000000 + 00000000000000070F0F08070000000000000000000000070F0F0F0807000000 + 07070707070707070F0F0F0F080700000F0F0F0F0F0F0F0F0F0F0F0F0F080700 + 0F0F0F0F0F0F0F0F0F0F0F0F0F0F08000F0F0F0F0F0F0F0F0F0F} + ParentShowHint = False + ShowHint = True + OnClick = btTrgRotateLeft90Click + end + object btTrgRotateRight90: TSpeedButton + Left = 146 + Top = 17 + Width = 23 + Height = 24 + Hint = 'Rotate triangle 90'#176' clockwise' + Flat = True + Glyph.Data = { + 36050000424D3605000000000000360400002800000010000000100000000100 + 08000000000000010000C40E0000C40E00000001000000000000000000000000 + 8000008000000080800080000000800080008080000080808000C0C0C0000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000003300 + 00006600000099000000CC000000FF0000000033000033330000663300009933 + 0000CC330000FF33000000660000336600006666000099660000CC660000FF66 + 000000990000339900006699000099990000CC990000FF99000000CC000033CC + 000066CC000099CC0000CCCC0000FFCC000000FF000033FF000066FF000099FF + 0000CCFF0000FFFF000000003300330033006600330099003300CC003300FF00 + 330000333300333333006633330099333300CC333300FF333300006633003366 + 33006666330099663300CC663300FF6633000099330033993300669933009999 + 3300CC993300FF99330000CC330033CC330066CC330099CC3300CCCC3300FFCC + 330000FF330033FF330066FF330099FF3300CCFF3300FFFF3300000066003300 + 66006600660099006600CC006600FF0066000033660033336600663366009933 + 6600CC336600FF33660000666600336666006666660099666600CC666600FF66 + 660000996600339966006699660099996600CC996600FF99660000CC660033CC + 660066CC660099CC6600CCCC6600FFCC660000FF660033FF660066FF660099FF + 6600CCFF6600FFFF660000009900330099006600990099009900CC009900FF00 + 990000339900333399006633990099339900CC339900FF339900006699003366 + 99006666990099669900CC669900FF6699000099990033999900669999009999 + 9900CC999900FF99990000CC990033CC990066CC990099CC9900CCCC9900FFCC + 990000FF990033FF990066FF990099FF9900CCFF9900FFFF99000000CC003300 + CC006600CC009900CC00CC00CC00FF00CC000033CC003333CC006633CC009933 + CC00CC33CC00FF33CC000066CC003366CC006666CC009966CC00CC66CC00FF66 + CC000099CC003399CC006699CC009999CC00CC99CC00FF99CC0000CCCC0033CC + CC0066CCCC0099CCCC00CCCCCC00FFCCCC0000FFCC0033FFCC0066FFCC0099FF + CC00CCFFCC00FFFFCC000000FF003300FF006600FF009900FF00CC00FF00FF00 + FF000033FF003333FF006633FF009933FF00CC33FF00FF33FF000066FF003366 + FF006666FF009966FF00CC66FF00FF66FF000099FF003399FF006699FF009999 + FF00CC99FF00FF99FF0000CCFF0033CCFF0066CCFF0099CCFF00CCCCFF00FFCC + FF0000FFFF0033FFFF0066FFFF0099FFFF00CCFFFF00FFFFFF000F0F0F0F0F0F + 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F07000007 + 0F0F0F0F0F0F0F0F0F0F0F0F070000070F0F0F0F0F0F0F0F0F0F0F0F07000007 + 0F0F0F0F0F0F0F0F0F0F0F0F070000070F0F0F0FD40F0F0F0F0F0F0F07000007 + 0F0F0F0F7ED40F0F0F0F0F0F070000070F0F0F0F5353D40F0F0F0F0F07000007 + 0F0F0F0F530053D40F0F0F0F070000070707070700000053D40F0F0F07000000 + 0000000000000000530F0F0F07000000000000000000000007080F0F07070707 + 0707070700000007080F0F0F0F0F0F0F0F0F0F0F000007080F0F0F0F0F0F0F0F + 0F0F0F0F0007080F0F0F0F0F0F0F0F0F0F0F0F0F00080F0F0F0F} + ParentShowHint = False + ShowHint = True + OnClick = btTrgRotateRight90Click + end + object btTrgScaleDown: TSpeedButton + Left = 32 + Top = 65 + Width = 23 + Height = 24 + Hint = 'Scale triangle down' + Flat = True + Glyph.Data = { + F6000000424DF600000000000000760000002800000010000000100000000100 + 0400000000008000000000000000000000001000000000000000000000000000 + 8000008000000080800080000000800080008080000080808000C0C0C0000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000 + 0FFFF000000000000FFFFF0000FFFFF00FFFFFF0000FFFF00FFFFFFFF000FFF0 + 0FFFFFFFFF000FF00FFFFFFFFFF000000FFFFFFFFFFF00000FFFFFFFFFFFFF00 + 0FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} + ParentShowHint = False + ShowHint = True + OnClick = btTrgScaleDownClick + end + object btTrgScaleUp: TSpeedButton + Left = 122 + Top = 65 + Width = 23 + Height = 24 + Hint = 'Scale triangle up' + Flat = True + Glyph.Data = { + F6000000424DF600000000000000760000002800000010000000100000000100 + 0400000000008000000000000000000000001000000000000000000000000000 + 8000008000000080800080000000800080008080000080808000C0C0C0000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00FFFFFFFFFFFF + FFFFF00000000000000FF00000000000000FFF000FFFFFFFF00FFFF000FFFFFF + F00FFFFF000FFFFFF00FFFFFF000FFFFF00FFFFFFF000FFFF00FFFFFFFF000FF + F00FFFFFFFFF000FF00FFFFFFFFFF000F00FFFFFFFFFFF00000FFFFFFFFFFFF0 + 000FFFFFFFFFFFFF000FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFF} + ParentShowHint = False + ShowHint = True + OnClick = btTrgScaleUpClick + end + object btTrgMoveDown: TSpeedButton + Left = 32 + Top = 41 + Width = 23 + Height = 24 + Hint = 'Move triangle down' + Flat = True + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000130B0000130B00000000000000000000FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF808080FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 + 0000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFF808080000000000000FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000 + 0000000000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF808080000000000000000000000000FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000 + 0000000000000000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFF808080000000000000000000000000000000000000FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000 + 0000000000000000000000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFF808080000000808080808080000000000000C0C0C0404040000000FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF404040FFFFFFFFFFFF80808000 + 0000000000FFFFFFFFFFFFC0C0C0808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFF808080000000000000FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80808000 + 0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFF808080000000000000FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80808000 + 0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFF808080000000000000FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C000 + 0000404040FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} + ParentShowHint = False + ShowHint = True + OnClick = btTrgMoveDownClick + end + object btTrgMoveLeft: TSpeedButton + Left = 122 + Top = 41 + Width = 23 + Height = 24 + Hint = 'Move triangle left' + Flat = True + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000130B0000130B00000000000000000000FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFF808080404040FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFF808080000000000000FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80808000000000000000 + 0000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + 8080800000000000000000000000000000008080808080808080808080808080 + 80808080808080C0C0C080808000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFFFFF808080 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000404040FFFFFFFFFFFFFFFFFF80808000000000000000000000 + 0000C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF808080000000000000404040FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 + 8080000000C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF808080FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} + ParentShowHint = False + ShowHint = True + OnClick = btTrgMoveLeftClick + end + object btTrgMoveRight: TSpeedButton + Left = 146 + Top = 41 + Width = 23 + Height = 24 + Hint = 'Move triangle right' + Flat = True + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000130B0000130B00000000000000000000FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40404080 + 8080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000808080FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 + 8080000000000000000000808080FFFFFFFFFFFFFFFFFFFFFFFFC0C0C0808080 + 8080808080808080808080808080808080800000000000000000000000000000 + 00808080FFFFFFFFFFFF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000808080404040000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 + C0C0000000000000000000000000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF404040000000000000808080FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C000 + 0000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFF808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} + ParentShowHint = False + ShowHint = True + OnClick = btTrgMoveRightClick + end + object btTrgMoveUp: TSpeedButton + Left = 8 + Top = 41 + Width = 23 + Height = 24 + Hint = 'Move triangle up' + Flat = True + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000130B0000130B00000000000000000000FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF404040000000C0C0C0FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 + 0000000000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000808080FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 + 0000000000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000808080FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 + 0000000000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFF808080C0C0C0FFFFFFFFFFFF000000000000808080FFFFFFFFFFFF4040 + 40FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000404040C0C0C000 + 0000000000808080808080000000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFF808080000000000000000000000000000000000000000000FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000 + 0000000000000000000000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF808080000000000000000000000000000000FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000 + 0000000000000000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFF808080000000000000000000FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 + 0000000000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF808080000000FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFF808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} + ParentShowHint = False + ShowHint = True + OnClick = btTrgMoveUpClick + end + object btTrgRotateLeft: TSpeedButton + Left = 32 + Top = 17 + Width = 23 + Height = 24 + Hint = 'Rotate triangle counter clockwise' + Flat = True + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000130B0000130B00000000000000000000FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFC0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF808080808080FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFF000000404040FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0000000404040FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FF404040000000404040FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0E0E0FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFF808080000000000000808080FFFFFFFFFFFF + FFFFFFFFFFFFE0E0E0606060FFFFFFFFFFFFFFFFFFFFFFFFE0E0E08080800000 + 00000000000000E0E0E0FFFFFFFFFFFFFFFFFFE0E0E0202020404040FFFFFFE0 + E0E0C0C0C0A0A0A0404040000000000000000000404040FFFFFFFFFFFFFFFFFF + E0E0E02020200000004040408080804040404040400000000000000000000000 + 00000000C0C0C0FFFFFFFFFFFFE0E0E020202000000000000000000000000000 + 0000000000000000000000000000404040404040FFFFFFFFFFFFFFFFFF202020 + 0000000000000000000000000000000000000000000000000000004040408080 + 80FFFFFFFFFFFFFFFFFFC0C0C080808000000000000000000000000000000000 + 0000000000404040808080808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0 + 808080000000000000404040808080808080808080808080C0C0C0FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0808080000000202020808080C0 + C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFC0C0C0808080404040FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0808080FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} + ParentShowHint = False + ShowHint = True + OnClick = btTrgRotateLeftClick + end + object btTrgRotateRight: TSpeedButton + Left = 122 + Top = 17 + Width = 23 + Height = 24 + Hint = 'Rotate triangle clockwise' + Flat = True + Glyph.Data = { + F6000000424DF600000000000000760000002800000010000000100000000100 + 04000000000080000000130B0000130B00001000000000000000000000000000 + 8000008000000080800080000000800080008080000080808000C0C0C0000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00FFFFFFFFFFFF + FFFF77FFFFFFFFFFFFFF70FFFFFFFFFFFFFF708FFFFFFFFFFFFF707FFFFFFFFF + FFFF7007FFFFFFFFFFFFF0007FFFFF7FFFFFF7000788FF70FFFFF80000077770 + 0FFFFF770000000000FFFFF770000000000FFFFF777000000078FFFFF8777770 + 078FFFFFFFFF870078FFFFFFFFFFFF778FFFFFFFFFFFFF78FFFF} + ParentShowHint = False + ShowHint = True + OnClick = btTrgRotateRightClick + end + object txtTrgScaleValue: TComboBox + Left = 56 + Top = 66 + Width = 65 + Height = 21 + AutoComplete = False + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ItemIndex = 1 + ParentFont = False + TabOrder = 2 + Text = '125' + OnExit = txtValidateValue + OnKeyPress = txtValKeyPress + OnSelect = txtValidateValue + Items.Strings = ( + '110' + '125' + '150' + '175' + '200') + end + object txtTrgRotateValue: TComboBox + Left = 56 + Top = 18 + Width = 65 + Height = 21 + AutoComplete = False + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 0 + Text = '15' + OnExit = txtValidateValue + OnKeyPress = txtValKeyPress + OnSelect = txtValidateValue + Items.Strings = ( + '5' + '15' + '30' + '45' + '60' + '90' + '120' + '180') + end + object txtTrgMoveValue: TComboBox + Left = 56 + Top = 42 + Width = 65 + Height = 21 + AutoComplete = False + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ItemIndex = 3 + ParentFont = False + TabOrder = 1 + Text = '0.1' + OnExit = txtValidateValue + OnKeyPress = txtValKeyPress + OnSelect = txtValidateValue + Items.Strings = ( + '1' + '0.5' + '0.25' + '0.1' + '0.05' + '0.025' + '0.01') + end + end + object GroupBox6: TGroupBox + Left = 6 + Top = 0 + Width = 209 + Height = 105 + Caption = 'Coordinates' + Ctl3D = True + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentCtl3D = False + ParentFont = False + TabOrder = 0 + DesignSize = ( + 209 + 105) + object LabelC: TLabel + Left = 8 + Top = 48 + Width = 10 + Height = 13 + Caption = 'Y:' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object LabelA: TLabel + Left = 8 + Top = 24 + Width = 10 + Height = 13 + Caption = 'X:' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object LabelB: TLabel + Left = 8 + Top = 72 + Width = 12 + Height = 13 + Caption = 'O:' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object txtAx: TEdit + Tag = 1 + Left = 28 + Top = 20 + Width = 70 + Height = 21 + Anchors = [akLeft, akTop, akRight] + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 0 + Text = '0' + OnDblClick = AffineCoefsDblClick + OnExit = CornerEditExit + OnKeyPress = CornerEditKeyPress + end + object txtAy: TEdit + Left = 117 + Top = 20 + Width = 70 + Height = 21 + Anchors = [akLeft, akTop, akRight] + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 1 + Text = '0' + OnDblClick = AffineCoefsDblClick + OnExit = CornerEditExit + OnKeyPress = CornerEditKeyPress + end + object txtBx: TEdit + Left = 28 + Top = 68 + Width = 70 + Height = 21 + Anchors = [akLeft, akTop, akRight] + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 4 + Text = '0' + OnDblClick = AffineCoefsDblClick + OnExit = CornerEditExit + OnKeyPress = CornerEditKeyPress + end + object txtBy: TEdit + Left = 117 + Top = 68 + Width = 70 + Height = 21 + Anchors = [akLeft, akTop, akRight] + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 5 + Text = '0' + OnDblClick = AffineCoefsDblClick + OnExit = CornerEditExit + OnKeyPress = CornerEditKeyPress + end + object txtCx: TEdit + Left = 28 + Top = 44 + Width = 70 + Height = 21 + Anchors = [akLeft, akTop, akRight] + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 2 + Text = '0' + OnDblClick = AffineCoefsDblClick + OnExit = CornerEditExit + OnKeyPress = CornerEditKeyPress + end + object txtCy: TEdit + Tag = 1 + Left = 117 + Top = 44 + Width = 70 + Height = 21 + Anchors = [akLeft, akTop, akRight] + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 3 + Text = '0' + OnDblClick = AffineCoefsDblClick + OnExit = CornerEditExit + OnKeyPress = CornerEditKeyPress + end + object SpinXx: TSpinButton + Left = 98 + Top = 19 + Width = 15 + Height = 23 + DownGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000008080000080800000808000000000000080800000808000008080000080 + 8000008080000080800000808000000000000000000000000000008080000080 + 8000008080000080800000808000000000000000000000000000000000000000 + 0000008080000080800000808000000000000000000000000000000000000000 + 0000000000000000000000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + FocusControl = txtAx + ParentShowHint = False + ShowHint = False + TabOrder = 6 + UpGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000000000000000000000000000000000000000000000000000000000000080 + 8000008080000080800000000000000000000000000000000000000000000080 + 8000008080000080800000808000008080000000000000000000000000000080 + 8000008080000080800000808000008080000080800000808000000000000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + OnDownClick = SpinButtonDownClick + OnUpClick = SpinButtonUpClick + end + object SpinYx: TSpinButton + Left = 98 + Top = 43 + Width = 15 + Height = 23 + DownGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000008080000080800000808000000000000080800000808000008080000080 + 8000008080000080800000808000000000000000000000000000008080000080 + 8000008080000080800000808000000000000000000000000000000000000000 + 0000008080000080800000808000000000000000000000000000000000000000 + 0000000000000000000000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + FocusControl = txtCx + ParentShowHint = False + ShowHint = False + TabOrder = 7 + UpGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000000000000000000000000000000000000000000000000000000000000080 + 8000008080000080800000000000000000000000000000000000000000000080 + 8000008080000080800000808000008080000000000000000000000000000080 + 8000008080000080800000808000008080000080800000808000000000000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + OnDownClick = SpinButtonDownClick + OnUpClick = SpinButtonUpClick + end + object SpinOx: TSpinButton + Left = 98 + Top = 67 + Width = 15 + Height = 23 + DownGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000008080000080800000808000000000000080800000808000008080000080 + 8000008080000080800000808000000000000000000000000000008080000080 + 8000008080000080800000808000000000000000000000000000000000000000 + 0000008080000080800000808000000000000000000000000000000000000000 + 0000000000000000000000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + FocusControl = txtBx + ParentShowHint = False + ShowHint = False + TabOrder = 8 + UpGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000000000000000000000000000000000000000000000000000000000000080 + 8000008080000080800000000000000000000000000000000000000000000080 + 8000008080000080800000808000008080000000000000000000000000000080 + 8000008080000080800000808000008080000080800000808000000000000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + OnDownClick = SpinButtonDownClick + OnUpClick = SpinButtonUpClick + end + object SpinXy: TSpinButton + Left = 187 + Top = 19 + Width = 15 + Height = 23 + DownGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000008080000080800000808000000000000080800000808000008080000080 + 8000008080000080800000808000000000000000000000000000008080000080 + 8000008080000080800000808000000000000000000000000000000000000000 + 0000008080000080800000808000000000000000000000000000000000000000 + 0000000000000000000000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + FocusControl = txtAy + ParentShowHint = False + ShowHint = False + TabOrder = 9 + UpGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000000000000000000000000000000000000000000000000000000000000080 + 8000008080000080800000000000000000000000000000000000000000000080 + 8000008080000080800000808000008080000000000000000000000000000080 + 8000008080000080800000808000008080000080800000808000000000000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + OnDownClick = SpinButtonDownClick + OnUpClick = SpinButtonUpClick + end + object SpinYy: TSpinButton + Left = 187 + Top = 43 + Width = 15 + Height = 23 + DownGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000008080000080800000808000000000000080800000808000008080000080 + 8000008080000080800000808000000000000000000000000000008080000080 + 8000008080000080800000808000000000000000000000000000000000000000 + 0000008080000080800000808000000000000000000000000000000000000000 + 0000000000000000000000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + FocusControl = txtCy + ParentShowHint = False + ShowHint = False + TabOrder = 10 + UpGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000000000000000000000000000000000000000000000000000000000000080 + 8000008080000080800000000000000000000000000000000000000000000080 + 8000008080000080800000808000008080000000000000000000000000000080 + 8000008080000080800000808000008080000080800000808000000000000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + OnDownClick = SpinButtonDownClick + OnUpClick = SpinButtonUpClick + end + object SpinOy: TSpinButton + Left = 187 + Top = 67 + Width = 15 + Height = 23 + DownGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000008080000080800000808000000000000080800000808000008080000080 + 8000008080000080800000808000000000000000000000000000008080000080 + 8000008080000080800000808000000000000000000000000000000000000000 + 0000008080000080800000808000000000000000000000000000000000000000 + 0000000000000000000000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + FocusControl = txtBy + ParentShowHint = False + ShowHint = False + TabOrder = 11 + UpGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000000000000000000000000000000000000000000000000000000000000080 + 8000008080000080800000000000000000000000000000000000000000000080 + 8000008080000080800000808000008080000000000000000000000000000080 + 8000008080000080800000808000008080000080800000808000000000000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + OnDownClick = SpinButtonDownClick + OnUpClick = SpinButtonUpClick + end + end + object GroupBox3: TGroupBox + Left = 6 + Top = 248 + Width = 209 + Height = 65 + Caption = 'Pivot Point' + TabOrder = 2 + object btnResetPivot: TSpeedButton + Left = 2 + Top = 40 + Width = 22 + Height = 22 + Hint = 'Reset pivot point to (0, 0)' + Margins.Top = 0 + Caption = 'r' + Font.Charset = SYMBOL_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Marlett' + Font.Style = [fsItalic] + ParentFont = False + ParentShowHint = False + ShowHint = True + OnClick = btnResetPivotClick + end + object btnPickPivot: TSpeedButton + Left = 184 + Top = 40 + Width = 22 + Height = 22 + Hint = 'Pick pivot point using mouse' + Glyph.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000000000000000000000000000000000000FF00FF00FF00 + FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00745A4600694F + 3B00CAC2BB00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00BBADA10081685400CAB2 + A400684E3A00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF00967C6900FF00FF00FF00FF00FF00FF008C735F00DFCABE00BDA7 + 980070574300FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF009C8370007F655200CEC6BF00CABEB50091796600E9D7CE007C63 + 4F00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF00A38A7700DCD1CB006D533F0091796600DDCEC500D6C5BB00856C + 5900FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF00AA917F00F9F4F100DDD4CD00856C5800F3EAE500947C6900DCD4 + CE00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF00B0988600FCFAF900FBF7F600F9F5F200F7F2EE00896F5C00664C + 38006A503C00765C4900FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF00B79F8D00FFFFFE00FEFDFC00FDFBFA00FBF8F700FAF6F300DFD5 + CE00886E5B00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF00BDA69400FFFFFF00FFFFFF00FFFFFF00FEFDFD00E2DAD5009A82 + 6F00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF00C3AC9900FFFFFF00FFFFFF00FFFFFF00ECE7E300AB938100FF00 + FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF00C8B09E00FFFFFF00FFFFFF00F6F2F000BDA59300FF00FF00FF00 + FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF00CBB4A200FFFFFF00F7F4F100CAB3A100FF00FF00FF00FF00FF00 + FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF00CBB4A200F6F3F000CBB4A200FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF00CBB4A200CBB4A200FF00FF00FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF00CBB4A200FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00 + FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00} + ParentShowHint = False + ShowHint = True + OnClick = btnPickPivotClick + end + object btnPivotMode: TSpeedButton + Left = 24 + Top = 40 + Width = 160 + Height = 22 + Caption = 'Local Pivot' + ParentShowHint = False + ShowHint = True + OnClick = btnPivotModeClick + end + object Label5: TLabel + Left = 110 + Top = 20 + Width = 10 + Height = 13 + Caption = 'Y:' + end + object Label6: TLabel + Left = 8 + Top = 20 + Width = 10 + Height = 13 + Caption = 'X:' + end + object editPivotY: TEdit + Left = 121 + Top = 16 + Width = 70 + Height = 21 + Hint = 'Pivot point ordinate in chosen coordinate system' + ParentShowHint = False + ShowHint = True + TabOrder = 1 + Text = '0' + OnExit = PivotValidate + OnKeyPress = PivotKeyPress + end + object editPivotX: TEdit + Left = 20 + Top = 16 + Width = 70 + Height = 21 + Hint = 'Pivot point abscissa in chosen coordinate system' + ParentShowHint = False + ShowHint = True + TabOrder = 0 + Text = '0' + OnExit = PivotValidate + OnKeyPress = PivotKeyPress + end + object SpinPivotX: TSpinButton + Left = 90 + Top = 15 + Width = 15 + Height = 23 + DownGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000008080000080800000808000000000000080800000808000008080000080 + 8000008080000080800000808000000000000000000000000000008080000080 + 8000008080000080800000808000000000000000000000000000000000000000 + 0000008080000080800000808000000000000000000000000000000000000000 + 0000000000000000000000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + FocusControl = editPivotX + ParentShowHint = False + ShowHint = False + TabOrder = 2 + UpGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000000000000000000000000000000000000000000000000000000000000080 + 8000008080000080800000000000000000000000000000000000000000000080 + 8000008080000080800000808000008080000000000000000000000000000080 + 8000008080000080800000808000008080000080800000808000000000000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + OnDownClick = SpinButtonDownClick + OnUpClick = SpinButtonUpClick + end + object SpinPivotY: TSpinButton + Left = 191 + Top = 15 + Width = 15 + Height = 23 + DownGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000008080000080800000808000000000000080800000808000008080000080 + 8000008080000080800000808000000000000000000000000000008080000080 + 8000008080000080800000808000000000000000000000000000000000000000 + 0000008080000080800000808000000000000000000000000000000000000000 + 0000000000000000000000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + FocusControl = editPivotY + ParentShowHint = False + ShowHint = False + TabOrder = 3 + UpGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000000000000000000000000000000000000000000000000000000000000080 + 8000008080000080800000000000000000000000000000000000000000000080 + 8000008080000080800000808000008080000000000000000000000000000080 + 8000008080000080800000808000008080000080800000808000000000000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + OnDownClick = SpinButtonDownClick + OnUpClick = SpinButtonUpClick + end + end + object GroupBox10: TGroupBox + Left = 6 + Top = 319 + Width = 209 + Height = 90 + Caption = 'Reflection Axis' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 1 + object btnShowLine: TSpeedButton + Left = 4 + Top = 40 + Width = 62 + Height = 22 + Caption = 'Show line' + ParentShowHint = False + ShowHint = True + OnClick = btnShowLineClick + end + object btnResetFlip: TSpeedButton + Left = 183 + Top = 40 + Width = 22 + Height = 22 + Hint = 'Reset point coordinates' + Caption = 'r' + Font.Charset = SYMBOL_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Marlett' + Font.Style = [fsItalic] + ParentFont = False + ParentShowHint = False + ShowHint = True + OnClick = btnResetFlipClick + end + object btnFlip: TSpeedButton + Left = 67 + Top = 40 + Width = 115 + Height = 22 + Hint = 'Flip triangle through a line' + Caption = 'Flip Triangle' + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 1800000000000003000000000000000000000000000000000000FF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFBD4A00BD4A00BD4A00BD + 4A00BD4A00BD4A00BD4A08BD4A08BD4A00BD4A00BD4A00FF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFB54200CE5208CE5208CE5208CE5208CE5208CE5208CE52 + 08CE5208AD4200FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFA54200E7 + 7B42E77B42E77B42E77B42E77B42E77B42E77B42A54200FF00FFFF00FF943900 + FF00FFFF00FFFF00FFFF00FFFF00FF943900F7AD7BF7AD7BF7AD7BF7AD7BF7AD + 7BF7AD7B943900FF00FFFF00FF843100843100FF00FFFF00FFFF00FFFF00FFFF + 00FF843100FFCEB5FFCEB5FFCEB5FFCEB5FFCEB5843100FF00FFFF00FF732900 + CE5208732900FF00FFFF00FFFF00FFFF00FF732900732900FFF7EFFFF7EFFFF7 + EFFFF7EF732900FF00FFFF00FF632900CE5208E77B42632900FF00FFFF00FF63 + 2900632900632900632900BDE7FFBDE7FFBDE7FF632900FF00FFFF00FF522100 + CE5208E77B42F7AD7B5A21005A21005A21005A2100FF00FFFF00FF5A21004AAD + F74AADF75A2100FF00FFFF00FF4A1800CE5208E77B42F7AD7BFFCEB54A18004A + 1800FF00FFFF00FFFF00FFFF00FF4A18000884EF4A1800FF00FFFF00FF391800 + CE5208E77B42F7AD7BFFD6B5FFF7EF391800FF00FFFF00FFFF00FFFF00FFFF00 + FF391000391800FF00FFFF00FF291000CE5208E77B42F7AD7BFFD6B5FFF7EFBD + E7FF291000FF00FFFF00FFFF00FFFF00FFFF00FF291000FF00FFFF00FF180800 + CE5208E77B42F7AD7BFFCEB5FFF7EFBDE7FF4AADF7180800FF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FF080000CE5208E77B42F7AD7BFFCEB5FFF7EFBD + E7FF4AADF70884EF080000FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF000000 + 000000000000000000000000000000000000000000000000000000000000FF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF} + ParentShowHint = False + ShowHint = True + OnClick = btnFlipClick + end + object Label7: TLabel + Left = 8 + Top = 20 + Width = 10 + Height = 13 + Caption = 'X:' + end + object Label8: TLabel + Left = 110 + Top = 20 + Width = 10 + Height = 13 + Caption = 'Y:' + end + object lblFlipAngle: TLabel + Left = 8 + Top = 68 + Width = 110 + Height = 15 + AutoSize = False + end + object editFlipY: TEdit + Left = 121 + Top = 16 + Width = 70 + Height = 21 + ParentShowHint = False + ShowHint = True + TabOrder = 1 + Text = '1' + OnExit = FlipPointValidate + OnKeyPress = FlipPointKeyPress + end + object editFlipX: TEdit + Left = 20 + Top = 16 + Width = 70 + Height = 21 + Hint = 'Second point abscissa in the chosen coordinate system' + ParentShowHint = False + ShowHint = True + TabOrder = 0 + Text = '0' + OnExit = FlipPointValidate + OnKeyPress = FlipPointKeyPress + end + object SpinFlipX: TSpinButton + Left = 90 + Top = 15 + Width = 15 + Height = 23 + DownGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000008080000080800000808000000000000080800000808000008080000080 + 8000008080000080800000808000000000000000000000000000008080000080 + 8000008080000080800000808000000000000000000000000000000000000000 + 0000008080000080800000808000000000000000000000000000000000000000 + 0000000000000000000000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + FocusControl = editFlipX + ParentShowHint = False + ShowHint = False + TabOrder = 2 + UpGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000000000000000000000000000000000000000000000000000000000000080 + 8000008080000080800000000000000000000000000000000000000000000080 + 8000008080000080800000808000008080000000000000000000000000000080 + 8000008080000080800000808000008080000080800000808000000000000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + OnDownClick = SpinButtonDownClick + OnUpClick = SpinButtonUpClick + end + object SpinFlipY: TSpinButton + Left = 191 + Top = 15 + Width = 15 + Height = 23 + DownGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000008080000080800000808000000000000080800000808000008080000080 + 8000008080000080800000808000000000000000000000000000008080000080 + 8000008080000080800000808000000000000000000000000000000000000000 + 0000008080000080800000808000000000000000000000000000000000000000 + 0000000000000000000000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + FocusControl = editFlipY + ParentShowHint = False + ShowHint = False + TabOrder = 3 + UpGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000000000000000000000000000000000000000000000000000000000000080 + 8000008080000080800000000000000000000000000000000000000000000080 + 8000008080000080800000808000008080000000000000000000000000000080 + 8000008080000080800000808000008080000080800000808000000000000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + OnDownClick = SpinButtonDownClick + OnUpClick = SpinButtonUpClick + end + object btFlipX: TButton + Left = 130 + Top = 65 + Width = 22 + Height = 22 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ImageIndex = 38 + Images = EditorTB + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 4 + OnClick = btFlipXYClick + end + object btFlipY: TButton + Left = 155 + Top = 65 + Width = 22 + Height = 22 + ImageIndex = 39 + Images = EditorTB + ParentShowHint = False + ShowHint = True + TabOrder = 5 + OnClick = btFlipXYClick + end + object btFlipDiag: TButton + Left = 180 + Top = 65 + Width = 22 + Height = 22 + ImageIndex = 37 + Images = EditorTB + ParentShowHint = False + ShowHint = True + TabOrder = 6 + OnClick = btFlipXYClick + end + end + end + end + end + object tabXForm: TTabSheet + Caption = 'Transform' + ParentShowHint = False + ShowHint = True + object ScrollBox1: TScrollBox + Left = 0 + Top = 0 + Width = 290 + Height = 367 + HorzScrollBar.Visible = False + Align = alClient + BorderStyle = bsNone + TabOrder = 0 + OnResize = ScrollBox1Resize + DesignSize = ( + 290 + 367) + object GroupBox9: TGroupBox + Left = 8 + Top = 4 + Width = 225 + Height = 118 + Caption = 'Affine coefficients' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 0 + object btnXcoefs: TSpeedButton + Left = 8 + Top = 17 + Width = 25 + Height = 21 + Hint = 'Reset vector X' + Caption = 'X' + ParentShowHint = False + ShowHint = True + OnClick = btnXcoefsClick + end + object btnYcoefs: TSpeedButton + Left = 8 + Top = 41 + Width = 25 + Height = 21 + Hint = 'Reset vector Y' + Caption = 'Y' + ParentShowHint = False + ShowHint = True + OnClick = btnYcoefsClick + end + object btnOcoefs: TSpeedButton + Left = 8 + Top = 65 + Width = 25 + Height = 21 + Hint = 'Reset vector O' + Caption = 'O' + ParentShowHint = False + ShowHint = True + OnClick = btnOcoefsClick + end + object btnResetCoefs: TSpeedButton + Left = 8 + Top = 89 + Width = 209 + Height = 22 + Hint = 'Reset all vectors to default position' + Caption = 'Reset transform' + ParentShowHint = False + ShowHint = True + OnClick = btnResetCoefsClick + end + object txtA: TEdit + Tag = 1 + Left = 36 + Top = 17 + Width = 70 + Height = 21 + Hint = 'A' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 0 + Text = '0' + OnDblClick = AffineCoefsDblClick + OnExit = CoefValidate + OnKeyPress = CoefKeyPress + end + object txtB: TEdit + Left = 128 + Top = 17 + Width = 70 + Height = 21 + Hint = 'C ' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 1 + Text = '0' + OnDblClick = AffineCoefsDblClick + OnExit = CoefValidate + OnKeyPress = CoefKeyPress + end + object txtC: TEdit + Left = 36 + Top = 41 + Width = 70 + Height = 21 + Hint = 'B' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 2 + Text = '0' + OnDblClick = AffineCoefsDblClick + OnExit = CoefValidate + OnKeyPress = CoefKeyPress + end + object txtD: TEdit + Tag = 1 + Left = 128 + Top = 41 + Width = 70 + Height = 21 + Hint = 'D ' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 3 + Text = '0' + OnDblClick = AffineCoefsDblClick + OnExit = CoefValidate + OnKeyPress = CoefKeyPress + end + object txtE: TEdit + Left = 36 + Top = 65 + Width = 70 + Height = 21 + Hint = 'E ' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 4 + Text = '0' + OnDblClick = AffineCoefsDblClick + OnExit = CoefValidate + OnKeyPress = CoefKeyPress + end + object txtF: TEdit + Left = 128 + Top = 65 + Width = 70 + Height = 21 + Hint = 'F ' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 5 + Text = '0' + OnDblClick = AffineCoefsDblClick + OnExit = CoefValidate + OnKeyPress = CoefKeyPress + end + object spinA: TSpinButton + Left = 106 + Top = 16 + Width = 15 + Height = 23 + DownGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000008080000080800000808000000000000080800000808000008080000080 + 8000008080000080800000808000000000000000000000000000008080000080 + 8000008080000080800000808000000000000000000000000000000000000000 + 0000008080000080800000808000000000000000000000000000000000000000 + 0000000000000000000000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + FocusControl = txtA + ParentShowHint = False + ShowHint = False + TabOrder = 6 + UpGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000000000000000000000000000000000000000000000000000000000000080 + 8000008080000080800000000000000000000000000000000000000000000080 + 8000008080000080800000808000008080000000000000000000000000000080 + 8000008080000080800000808000008080000080800000808000000000000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + OnDownClick = SpinButtonDownClick + OnUpClick = SpinButtonUpClick + end + object spinB: TSpinButton + Left = 198 + Top = 16 + Width = 15 + Height = 23 + DownGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000008080000080800000808000000000000080800000808000008080000080 + 8000008080000080800000808000000000000000000000000000008080000080 + 8000008080000080800000808000000000000000000000000000000000000000 + 0000008080000080800000808000000000000000000000000000000000000000 + 0000000000000000000000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + FocusControl = txtB + ParentShowHint = False + ShowHint = False + TabOrder = 7 + UpGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000000000000000000000000000000000000000000000000000000000000080 + 8000008080000080800000000000000000000000000000000000000000000080 + 8000008080000080800000808000008080000000000000000000000000000080 + 8000008080000080800000808000008080000080800000808000000000000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + OnDownClick = SpinButtonDownClick + OnUpClick = SpinButtonUpClick + end + object spinC: TSpinButton + Left = 106 + Top = 40 + Width = 15 + Height = 23 + DownGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000008080000080800000808000000000000080800000808000008080000080 + 8000008080000080800000808000000000000000000000000000008080000080 + 8000008080000080800000808000000000000000000000000000000000000000 + 0000008080000080800000808000000000000000000000000000000000000000 + 0000000000000000000000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + FocusControl = txtC + ParentShowHint = False + ShowHint = False + TabOrder = 8 + UpGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000000000000000000000000000000000000000000000000000000000000080 + 8000008080000080800000000000000000000000000000000000000000000080 + 8000008080000080800000808000008080000000000000000000000000000080 + 8000008080000080800000808000008080000080800000808000000000000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + OnDownClick = SpinButtonDownClick + OnUpClick = SpinButtonUpClick + end + object spinD: TSpinButton + Left = 198 + Top = 40 + Width = 15 + Height = 23 + DownGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000008080000080800000808000000000000080800000808000008080000080 + 8000008080000080800000808000000000000000000000000000008080000080 + 8000008080000080800000808000000000000000000000000000000000000000 + 0000008080000080800000808000000000000000000000000000000000000000 + 0000000000000000000000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + FocusControl = txtD + ParentShowHint = False + ShowHint = False + TabOrder = 9 + UpGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000000000000000000000000000000000000000000000000000000000000080 + 8000008080000080800000000000000000000000000000000000000000000080 + 8000008080000080800000808000008080000000000000000000000000000080 + 8000008080000080800000808000008080000080800000808000000000000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + OnDownClick = SpinButtonDownClick + OnUpClick = SpinButtonUpClick + end + object spinE: TSpinButton + Left = 106 + Top = 64 + Width = 15 + Height = 23 + DownGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000008080000080800000808000000000000080800000808000008080000080 + 8000008080000080800000808000000000000000000000000000008080000080 + 8000008080000080800000808000000000000000000000000000000000000000 + 0000008080000080800000808000000000000000000000000000000000000000 + 0000000000000000000000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + FocusControl = txtE + ParentShowHint = False + ShowHint = False + TabOrder = 10 + UpGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000000000000000000000000000000000000000000000000000000000000080 + 8000008080000080800000000000000000000000000000000000000000000080 + 8000008080000080800000808000008080000000000000000000000000000080 + 8000008080000080800000808000008080000080800000808000000000000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + OnDownClick = SpinButtonDownClick + OnUpClick = SpinButtonUpClick + end + object spinF: TSpinButton + Left = 198 + Top = 64 + Width = 15 + Height = 23 + DownGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000008080000080800000808000000000000080800000808000008080000080 + 8000008080000080800000808000000000000000000000000000008080000080 + 8000008080000080800000808000000000000000000000000000000000000000 + 0000008080000080800000808000000000000000000000000000000000000000 + 0000000000000000000000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + FocusControl = txtF + ParentShowHint = False + ShowHint = False + TabOrder = 11 + UpGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000000000000000000000000000000000000000000000000000000000000080 + 8000008080000080800000000000000000000000000000000000000000000080 + 8000008080000080800000808000008080000000000000000000000000000080 + 8000008080000080800000808000008080000080800000808000000000000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + OnDownClick = SpinButtonDownClick + OnUpClick = SpinButtonUpClick + end + end + object GroupBox7: TGroupBox + Left = 8 + Top = 245 + Width = 225 + Height = 42 + Caption = 'Coordinate system' + TabOrder = 1 + object btnCoefsPolar: TSpeedButton + Left = 112 + Top = 16 + Width = 105 + Height = 20 + Hint = 'Show vectors in polar coordinates' + GroupIndex = 1 + Caption = 'Polar (deg)' + ParentShowHint = False + ShowHint = True + OnClick = btnCoefsModeClick + end + object btnCoefsRect: TSpeedButton + Left = 10 + Top = 16 + Width = 103 + Height = 20 + Hint = 'Show vectors in rectangular (cartesian) coordinates' + GroupIndex = 1 + Down = True + Caption = 'Rectangular' + ParentShowHint = False + ShowHint = True + OnClick = btnCoefsModeClick + end + end + object GroupBox8: TGroupBox + Left = 8 + Top = 126 + Width = 225 + Height = 118 + Caption = 'Post-affine coefficients' + TabOrder = 2 + object btnXpost: TSpeedButton + Left = 8 + Top = 17 + Width = 25 + Height = 21 + Hint = 'Reset vector X' + Caption = 'X' + ParentShowHint = False + ShowHint = True + OnClick = btnXpostClick + end + object btnYpost: TSpeedButton + Left = 8 + Top = 41 + Width = 25 + Height = 21 + Hint = 'Reset vector Y' + Caption = 'Y' + ParentShowHint = False + ShowHint = True + OnClick = btnYpostClick + end + object btnOpost: TSpeedButton + Left = 8 + Top = 65 + Width = 25 + Height = 21 + Hint = 'Reset vector O' + Caption = 'O' + ParentShowHint = False + ShowHint = True + OnClick = btnOpostClick + end + object btnResetPostCoefs: TSpeedButton + Left = 8 + Top = 89 + Width = 213 + Height = 22 + Hint = 'Reset post-transform vectors to defaults' + Caption = 'Reset post-transform' + ParentShowHint = False + ShowHint = True + OnClick = btnResetPostCoefsClick + end + object txtPost00: TEdit + Tag = 1 + Left = 36 + Top = 17 + Width = 70 + Height = 21 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 0 + Text = '0' + OnDblClick = AffineCoefsDblClick + OnExit = PostCoefValidate + OnKeyPress = PostCoefKeypress + end + object txtPost01: TEdit + Left = 128 + Top = 17 + Width = 70 + Height = 21 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 1 + Text = '0' + OnDblClick = AffineCoefsDblClick + OnExit = PostCoefValidate + OnKeyPress = PostCoefKeypress + end + object txtPost10: TEdit + Left = 36 + Top = 41 + Width = 70 + Height = 21 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 2 + Text = '0' + OnDblClick = AffineCoefsDblClick + OnExit = PostCoefValidate + OnKeyPress = PostCoefKeypress + end + object txtPost11: TEdit + Tag = 1 + Left = 128 + Top = 41 + Width = 70 + Height = 21 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 3 + Text = '0' + OnDblClick = AffineCoefsDblClick + OnExit = PostCoefValidate + OnKeyPress = PostCoefKeypress + end + object txtPost20: TEdit + Left = 36 + Top = 65 + Width = 70 + Height = 21 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 4 + Text = '0' + OnDblClick = AffineCoefsDblClick + OnExit = PostCoefValidate + OnKeyPress = PostCoefKeypress + end + object txtPost21: TEdit + Left = 128 + Top = 65 + Width = 70 + Height = 21 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 5 + Text = '0' + OnDblClick = AffineCoefsDblClick + OnExit = PostCoefValidate + OnKeyPress = PostCoefKeypress + end + object spinPost00: TSpinButton + Left = 106 + Top = 16 + Width = 15 + Height = 23 + DownGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000008080000080800000808000000000000080800000808000008080000080 + 8000008080000080800000808000000000000000000000000000008080000080 + 8000008080000080800000808000000000000000000000000000000000000000 + 0000008080000080800000808000000000000000000000000000000000000000 + 0000000000000000000000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + FocusControl = txtPost00 + ParentShowHint = False + ShowHint = False + TabOrder = 6 + UpGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000000000000000000000000000000000000000000000000000000000000080 + 8000008080000080800000000000000000000000000000000000000000000080 + 8000008080000080800000808000008080000000000000000000000000000080 + 8000008080000080800000808000008080000080800000808000000000000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + OnDownClick = SpinButtonDownClick + OnUpClick = SpinButtonUpClick + end + object spinPost01: TSpinButton + Left = 198 + Top = 16 + Width = 15 + Height = 23 + DownGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000008080000080800000808000000000000080800000808000008080000080 + 8000008080000080800000808000000000000000000000000000008080000080 + 8000008080000080800000808000000000000000000000000000000000000000 + 0000008080000080800000808000000000000000000000000000000000000000 + 0000000000000000000000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + FocusControl = txtPost01 + ParentShowHint = False + ShowHint = False + TabOrder = 7 + UpGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000000000000000000000000000000000000000000000000000000000000080 + 8000008080000080800000000000000000000000000000000000000000000080 + 8000008080000080800000808000008080000000000000000000000000000080 + 8000008080000080800000808000008080000080800000808000000000000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + OnDownClick = SpinButtonDownClick + OnUpClick = SpinButtonUpClick + end + object spinPost10: TSpinButton + Left = 106 + Top = 40 + Width = 15 + Height = 23 + DownGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000008080000080800000808000000000000080800000808000008080000080 + 8000008080000080800000808000000000000000000000000000008080000080 + 8000008080000080800000808000000000000000000000000000000000000000 + 0000008080000080800000808000000000000000000000000000000000000000 + 0000000000000000000000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + FocusControl = txtPost10 + ParentShowHint = False + ShowHint = False + TabOrder = 8 + UpGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000000000000000000000000000000000000000000000000000000000000080 + 8000008080000080800000000000000000000000000000000000000000000080 + 8000008080000080800000808000008080000000000000000000000000000080 + 8000008080000080800000808000008080000080800000808000000000000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + OnDownClick = SpinButtonDownClick + OnUpClick = SpinButtonUpClick + end + object spinPost11: TSpinButton + Left = 198 + Top = 40 + Width = 15 + Height = 23 + DownGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000008080000080800000808000000000000080800000808000008080000080 + 8000008080000080800000808000000000000000000000000000008080000080 + 8000008080000080800000808000000000000000000000000000000000000000 + 0000008080000080800000808000000000000000000000000000000000000000 + 0000000000000000000000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + FocusControl = txtPost11 + ParentShowHint = False + ShowHint = False + TabOrder = 9 + UpGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000000000000000000000000000000000000000000000000000000000000080 + 8000008080000080800000000000000000000000000000000000000000000080 + 8000008080000080800000808000008080000000000000000000000000000080 + 8000008080000080800000808000008080000080800000808000000000000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + OnDownClick = SpinButtonDownClick + OnUpClick = SpinButtonUpClick + end + object spinPost20: TSpinButton + Left = 106 + Top = 64 + Width = 15 + Height = 23 + DownGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000008080000080800000808000000000000080800000808000008080000080 + 8000008080000080800000808000000000000000000000000000008080000080 + 8000008080000080800000808000000000000000000000000000000000000000 + 0000008080000080800000808000000000000000000000000000000000000000 + 0000000000000000000000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + FocusControl = txtPost20 + ParentShowHint = False + ShowHint = False + TabOrder = 10 + UpGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000000000000000000000000000000000000000000000000000000000000080 + 8000008080000080800000000000000000000000000000000000000000000080 + 8000008080000080800000808000008080000000000000000000000000000080 + 8000008080000080800000808000008080000080800000808000000000000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + OnDownClick = SpinButtonDownClick + OnUpClick = SpinButtonUpClick + end + object spinPost21: TSpinButton + Left = 198 + Top = 64 + Width = 15 + Height = 23 + DownGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000008080000080800000808000000000000080800000808000008080000080 + 8000008080000080800000808000000000000000000000000000008080000080 + 8000008080000080800000808000000000000000000000000000000000000000 + 0000008080000080800000808000000000000000000000000000000000000000 + 0000000000000000000000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + FocusControl = txtPost21 + ParentShowHint = False + ShowHint = False + TabOrder = 11 + UpGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000000000000000000000000000000000000000000000000000000000000080 + 8000008080000080800000000000000000000000000000000000000000000080 + 8000008080000080800000808000008080000000000000000000000000000080 + 8000008080000080800000808000008080000080800000808000000000000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + OnDownClick = SpinButtonDownClick + OnUpClick = SpinButtonUpClick + end + end + object chkAutoZscale: TCheckBox + Left = 8 + Top = 293 + Width = 275 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = 'Auto calculate pre_zscale' + ParentShowHint = False + ShowHint = True + TabOrder = 3 + OnClick = chkAutoZscaleClick + end + object btSwapCoefs: TButton + Left = 8 + Top = 318 + Width = 110 + Height = 22 + Caption = 'Swap matrices' + ImageIndex = 36 + ImageMargins.Left = 2 + Images = EditorTB + TabOrder = 4 + OnClick = btSwapCoefsClick + end + object btConjugate: TButton + Left = 124 + Top = 318 + Width = 110 + Height = 22 + Caption = 'Conjugate ' + ImageMargins.Left = 2 + TabOrder = 5 + OnClick = btConjugateClick + end + end + end + object tabColors: TTabSheet + Caption = 'Colors' + ImageIndex = 3 + object ScrollBox2: TScrollBox + Left = 0 + Top = 0 + Width = 290 + Height = 367 + HorzScrollBar.Visible = False + Align = alClient + BorderStyle = bsNone + TabOrder = 0 + OnResize = ScrollBox2Resize + DesignSize = ( + 290 + 367) + object GroupBox1: TGroupBox + Left = 2 + Top = 2 + Width = 285 + Height = 199 + Anchors = [akLeft, akTop, akRight] + Caption = 'Transform color' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 0 + DesignSize = ( + 285 + 199) + object pnlSymmetry: TPanel + Left = 8 + Top = 78 + Width = 112 + Height = 21 + Cursor = crHandPoint + Hint = 'Click and drag to change value' + BevelOuter = bvLowered + Caption = ' Color speed:' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 7 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + end + object pnlXFormColor: TPanel + Left = 8 + Top = 16 + Width = 73 + Height = 21 + Cursor = crHandPoint + Hint = 'Click and drag to change value' + BevelInner = bvRaised + BevelOuter = bvLowered + BorderStyle = bsSingle + ParentShowHint = False + ShowHint = True + TabOrder = 6 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + object shColor: TShape + Left = -1 + Top = -1 + Width = 75 + Height = 25 + OnMouseDown = shColorMouseDown + OnMouseMove = shColorMouseMove + OnMouseUp = shColorMouseUp + end + end + object txtXFormColor: TEdit + Left = 80 + Top = 16 + Width = 196 + Height = 21 + Anchors = [akLeft, akTop, akRight] + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 0 + OnExit = txtXFormColorExit + OnKeyPress = txtXFormColorKeyPress + end + object txtSymmetry: TEdit + Left = 119 + Top = 78 + Width = 157 + Height = 21 + Anchors = [akLeft, akTop, akRight] + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 2 + Text = '0' + OnExit = txtSymmetrySet + OnKeyPress = txtSymmetrKeyPress + end + object ColorBar: TPanel + Left = 8 + Top = 40 + Width = 269 + Height = 17 + Anchors = [akLeft, akTop, akRight] + BevelOuter = bvLowered + BorderStyle = bsSingle + Color = clAppWorkSpace + TabOrder = 8 + object ColorBarPicture: TImage + Left = 1 + Top = 1 + Width = 263 + Height = 11 + Align = alClient + Stretch = True + OnMouseUp = ColorBarMouseUp + ExplicitWidth = 267 + end + end + object scrlXFormColor: TScrollBar + Left = 9 + Top = 54 + Width = 267 + Height = 15 + Anchors = [akLeft, akTop, akRight] + LargeChange = 10 + Max = 1000 + PageSize = 0 + TabOrder = 1 + OnChange = scrlXFormColorChange + OnScroll = scrlXFormColorScroll + end + object pnlOpacity: TPanel + Left = 8 + Top = 108 + Width = 112 + Height = 21 + Cursor = crHandPoint + Hint = 'Click and drag to change value' + BevelOuter = bvLowered + Caption = ' Opacity:' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 9 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + end + object txtOpacity: TEdit + Left = 119 + Top = 108 + Width = 157 + Height = 21 + Anchors = [akLeft, akTop, akRight] + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 3 + Text = '1' + OnExit = txtOpacitySet + OnKeyPress = txtOpacityKeyPress + end + object chkXformSolo: TCheckBox + Left = 8 + Top = 176 + Width = 268 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = 'Solo' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 5 + OnClick = chkXformSoloClick + end + object pnlDC: TPanel + Left = 8 + Top = 140 + Width = 112 + Height = 21 + Cursor = crHandPoint + Hint = 'Click and drag to change value' + BevelOuter = bvLowered + Caption = ' Direct color:' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 10 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + end + object txtDC: TEdit + Left = 119 + Top = 140 + Width = 157 + Height = 21 + Anchors = [akLeft, akTop, akRight] + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 4 + Text = '1' + OnExit = txtDCSet + OnKeyPress = txtDCKeyPress + end + end + object GroupBox2: TGroupBox + Left = 2 + Top = 207 + Width = 285 + Height = 145 + Anchors = [akLeft, akTop, akRight] + Caption = 'Variation preview' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 1 + DesignSize = ( + 285 + 145) + object Label1: TLabel + Left = 8 + Top = 24 + Width = 31 + Height = 13 + Hint = 'Area to which variations are applied' + Caption = 'Range' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + end + object Label2: TLabel + Left = 8 + Top = 56 + Width = 29 + Height = 13 + Hint = 'Number of recursive calculations' + Caption = 'Depth' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + end + object Label3: TLabel + Left = 8 + Top = 88 + Width = 36 + Height = 13 + Hint = 'Frequency of the grid points' + Caption = 'Density' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + end + object lblGridType: TLabel + Left = 8 + Top = 120 + Width = 46 + Height = 13 + Hint = 'Coordinate system for the grid' + Caption = 'Grid Type' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + end + object trkVarPreviewDensity: TTrackBar + Left = 98 + Top = 88 + Width = 185 + Height = 25 + Anchors = [akLeft, akTop, akRight] + Max = 5 + Min = 1 + ParentShowHint = False + PageSize = 1 + Position = 2 + ShowHint = True + TabOrder = 2 + ThumbLength = 15 + OnChange = trkVarPreviewDensityChange + end + object trkVarPreviewRange: TTrackBar + Left = 98 + Top = 24 + Width = 185 + Height = 25 + Anchors = [akLeft, akTop, akRight] + Min = 1 + ParentShowHint = False + PageSize = 1 + Position = 2 + ShowHint = True + TabOrder = 0 + ThumbLength = 15 + OnChange = trkVarPreviewRangeChange + end + object trkVarPreviewDepth: TTrackBar + Left = 98 + Top = 56 + Width = 185 + Height = 25 + Anchors = [akLeft, akTop, akRight] + Max = 5 + Min = 1 + ParentShowHint = False + PageSize = 1 + Position = 1 + ShowHint = True + TabOrder = 1 + ThumbLength = 15 + OnChange = trkVarPreviewDepthChange + end + object GridComboBox: TComboBox + Left = 101 + Top = 116 + Width = 120 + Height = 21 + Style = csDropDownList + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ItemIndex = 0 + ParentFont = False + TabOrder = 3 + Text = 'Rectangular' + OnChange = GridComboBoxChange + Items.Strings = ( + 'Rectangular' + 'Polar' + 'Bipolar' + 'Elliptic') + end + end + end + end + object tabVariations: TTabSheet + Caption = 'Variations' + DesignSize = ( + 290 + 367) + object Label4: TLabel + Left = 2 + Top = 8 + Width = 37 + Height = 13 + Caption = 'Search:' + end + object btnResetSearch: TSpeedButton + Left = 268 + Top = 7 + Width = 17 + Height = 17 + Caption = 'r' + Flat = True + Font.Charset = SYMBOL_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Marlett' + Font.Style = [] + ParentFont = False + OnClick = btnResetSearchClick + end + object VEVars: TValueListEditor + Left = 0 + Top = 32 + Width = 290 + Height = 280 + Anchors = [akLeft, akTop, akRight, akBottom] + DefaultColWidth = 90 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ScrollBars = ssVertical + TabOrder = 1 + TitleCaptions.Strings = ( + 'Variation' + 'Value') + OnDblClick = VEVarsDblClick + OnDrawCell = VEVarsDrawCell + OnExit = VEVarsChange + OnKeyPress = VEVarsKeyPress + OnMouseDown = VEVarsMouseDown + OnMouseMove = VEVarsMouseMove + OnMouseUp = VEVarsMouseUp + OnValidate = VEVarsValidate + ColWidths = ( + 90 + 194) + end + object bClear: TBitBtn + Left = 0 + Top = 337 + Width = 140 + Height = 27 + Anchors = [akLeft, akBottom] + Caption = 'Clear' + TabOrder = 2 + OnClick = bClearClick + end + object txtSearchBox: TEdit + Left = 45 + Top = 5 + Width = 217 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 0 + OnChange = chkCollapseVariationsClick + end + object btnVarOrder: TBitBtn + Left = 145 + Top = 337 + Width = 140 + Height = 27 + Anchors = [akRight, akBottom] + Caption = 'Edit order...' + Glyph.Data = { + 0E060000424D0E06000000000000360000002800000016000000160000000100 + 180000000000D8050000C40E0000C40E00000000000000000000FFFFFFFFFFFF + FFFFFFFFF8F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF + FFFFD9C0FF7920FF6B09FF791FFFDCC5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + 0000FFFEFEFF7920FFB17EFFC299FFB584FF8332FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFF0000FFFCFAFF771DFF934CFF751AFFCDACFF781FFFFFFF8383834F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F83 + 8383FFFFFFFFFFFF0000FFFFFFFFD3B5FF7D26FFC69FFFAA71FF9D5BFFFFFF63 + 6363FCFCFCFCFCFCFCFCFCFCFCFCF9F9F9F3F3F3EDEDEDE6E6E6E0E0E0E0E0E0 + E0E0E0636363FFFFFFFFFFFF0000FFFFFFFF9148FFA568FF893BFFCBA9FF9752 + FFFFFF9F9F9F7777777777777777777777777777777777777777777777777777 + 777777777777779F9F9FFFFFFFFFFFFF0000FFFFFFFFAA71FFB17DFFCCA9FFB4 + 81FFB27FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF1E8FFB787FF + A568FFB98AFFF5EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF8F4 + FFD9BFFFD9BFFFDAC2FFFBF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFD + FCFF8B3EFF6600FF6600FF6600FF934BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + 0000FFFDFBFF7215FFD2B3FFB585FFA365FF924BFFFFFF8383834F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F838383FFFF + FFFFFFFF0000FFFFFFFFB584FF924AFFB98AFF7B25FFC198FFFFFF636363FCFC + FCFCFCFCFCFCFCFCFCFCF9F9F9F3F3F3EDEDEDE6E6E6E0E0E0E0E0E0E0E0E063 + 6363FFFFFFFFFFFF0000FFFFFFFF8D41FF8D41FF9D5BFFB482FFA76CFFFFFF9F + 9F9F777777777777777777777777777777777777777777777777777777777777 + 7777779F9F9FFFFFFFFFFFFF0000FFFFFFFFAB72FFBD91FFC49CFFB07BFFC49C + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF6F0FFC49CFFB685FFCD + ACFFFCFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFAF7FFD9BFFF + D9BFFFDBC3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF9046 + FF6600FF6600FF6600FFAA71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF + FFFF8635FFA569FFCFAFFF9853FFA061FFFFFF8383834F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F838383FFFFFFFFFFFF + 0000FFFFFFFFD2B3FF7113FFC29AFF7E28FFFDFBFFFFFF636363FCFCFCFCFCFC + FCFCFCFCFCFCF9F9F9F3F3F3EDEDEDE6E6E6E0E0E0E0E0E0E0E0E0636363FFFF + FFFFFFFF0000FFFFFFFF8635FF8433FFC59EFF8D40FFFFFFFFFFFF9F9F9F7777 + 777777777777777777777777777777777777777777777777777777777777779F + 9F9FFFFFFFFFFFFF0000FFFFFFFFA66AFFAE78FFC7A2FF9A57FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF9F6FFC69FFFAF79FFEBDDFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000} + ParentShowHint = False + ShowHint = True + TabOrder = 3 + OnClick = btnVarOrderClick + end + object cbCollapseVariations: TComboBox + Left = 1 + Top = 315 + Width = 283 + Height = 21 + Style = csDropDownList + Anchors = [akLeft, akRight, akBottom] + ItemIndex = 0 + TabOrder = 4 + Text = 'Show all variations' + OnChange = chkCollapseVariationsClick + Items.Strings = ( + 'Show all variations' + 'Hide unused variations' + 'Favourite variations') + end + end + object TabVariables: TTabSheet + Caption = 'Variables' + ImageIndex = 4 + DesignSize = ( + 290 + 367) + object vleVariables: TValueListEditor + Left = 0 + Top = 0 + Width = 290 + Height = 312 + Align = alTop + Anchors = [akLeft, akTop, akRight, akBottom] + ScrollBars = ssVertical + TabOrder = 0 + TitleCaptions.Strings = ( + 'Variable' + 'Value') + OnDblClick = VEVarsDblClick + OnExit = vleVariablesExit + OnKeyPress = vleVariablesKeyPress + OnMouseDown = VEVarsMouseDown + OnMouseMove = VEVarsMouseMove + OnMouseUp = VEVarsMouseUp + OnValidate = vleVariablesValidate + ColWidths = ( + 93 + 191) + end + object chkCollapseVariables: TCheckBox + Left = 0 + Top = 319 + Width = 291 + Height = 17 + Anchors = [akLeft, akRight, akBottom] + Caption = 'Show all variables' + TabOrder = 1 + OnClick = chkCollapseVariablesClick + end + object btResetParams: TButton + Left = 0 + Top = 340 + Width = 290 + Height = 27 + Align = alBottom + Caption = 'Reset' + TabOrder = 2 + OnClick = btResetparamsClick + end + end + object TabChaos: TTabSheet + Caption = 'Xaos' + ImageIndex = -1 + DesignSize = ( + 290 + 367) + object vleChaos: TValueListEditor + Left = 0 + Top = 0 + Width = 290 + Height = 320 + Align = alCustom + Anchors = [akLeft, akTop, akRight, akBottom] + PopupMenu = ChaosPopup + ScrollBars = ssVertical + TabOrder = 0 + TitleCaptions.Strings = ( + 'Path' + 'Weight modifier') + OnDblClick = VEVarsDblClick + OnDrawCell = VleChaosDrawCell + OnExit = vleChaosExit + OnKeyPress = vleChaosKeyPress + OnMouseDown = VEVarsMouseDown + OnMouseMove = VEVarsMouseMove + OnMouseUp = VEVarsMouseUp + OnValidate = vleChaosValidate + ColWidths = ( + 93 + 191) + end + object optFrom: TRadioButton + Left = 0 + Top = 343 + Width = 291 + Height = 17 + Anchors = [akLeft, akRight, akBottom] + Caption = 'View links as "from"' + TabOrder = 2 + TabStop = True + OnClick = mnuChaosViewFromClick + end + object optTo: TRadioButton + Left = 0 + Top = 327 + Width = 291 + Height = 17 + Anchors = [akLeft, akRight, akBottom] + Caption = 'View links as "to"' + Checked = True + TabOrder = 1 + TabStop = True + OnClick = mnuChaosViewToClick + end + object btResetChaos: TButton + Left = 263 + Top = 326 + Width = 22 + Height = 20 + Anchors = [akLeft, akRight, akBottom] + Caption = '1' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -15 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ImageAlignment = iaCenter + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 3 + OnClick = mnuChaosSetAllClick + end + object btClearChaos: TButton + Left = 233 + Top = 326 + Width = 22 + Height = 20 + Anchors = [akLeft, akRight, akBottom] + Caption = '0' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -15 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ImageAlignment = iaCenter + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 4 + OnClick = mnuChaosClearAllClick + end + object btChaos: TButton + Left = 233 + Top = 347 + Width = 52 + Height = 19 + Anchors = [akLeft, akRight, akBottom] + Caption = 'More...' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ImageAlignment = iaCenter + ParentFont = False + TabOrder = 5 + OnClick = btChaosClick + end + end + end + object pnlWeight: TPanel + Left = 8 + Top = 47 + Width = 121 + Height = 21 + Cursor = crHandPoint + Hint = 'Click and drag to change value' + BevelOuter = bvLowered + Caption = ' Weight:' + ParentShowHint = False + ShowHint = True + TabOrder = 4 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + end + object Panel1: TPanel + Left = 8 + Top = 6 + Width = 121 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = ' Transform:' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 5 + end + object Panel2: TPanel + Left = 8 + Top = 26 + Width = 121 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = ' Name:' + ParentShowHint = False + ShowHint = True + TabOrder = 6 + end + object txtName: TEdit + Left = 128 + Top = 26 + Width = 163 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 1 + OnExit = txtNameExit + OnKeyPress = txtNameKeyPress + end + object txtP: TEdit + Left = 128 + Top = 47 + Width = 163 + Height = 21 + Hint = '"Weight" is the probability of this transform to be applied' + Anchors = [akLeft, akTop, akRight] + TabOrder = 2 + Text = '0' + OnExit = txtPExit + OnKeyPress = txtPKeyPress + end + object cbTransforms: TComboBox + Left = 128 + Top = 6 + Width = 163 + Height = 19 + BevelEdges = [] + BevelOuter = bvNone + Style = csOwnerDrawFixed + Anchors = [akLeft, akTop, akRight] + Color = clBlack + Ctl3D = False + DropDownCount = 12 + ItemHeight = 13 + ParentCtl3D = False + TabOrder = 0 + OnChange = cbTransformsChange + OnDrawItem = cbTransformsDrawItem + end + end + object PrevPnl: TPanel + Left = 0 + Top = 0 + Width = 300 + Height = 177 + Align = alTop + BevelOuter = bvLowered + Color = clAppWorkSpace + TabOrder = 1 + Visible = False + object PreviewImage: TImage + Left = 1 + Top = 1 + Width = 298 + Height = 175 + PopupMenu = QualityPopup + Proportional = True + end + end + end + end + object EditPopup: TPopupMenu + Images = EditorTB + Left = 392 + Top = 112 + object mnuUndo: TMenuItem + Caption = 'Undo' + Enabled = False + Hint = 'Undo' + ImageIndex = 4 + ShortCut = 16474 + OnClick = mnuUndoClick + end + object mnuRedo: TMenuItem + Caption = 'Redo' + Enabled = False + Hint = 'Redo' + ImageIndex = 5 + ShortCut = 16473 + OnClick = mnuRedoClick + end + object N4: TMenuItem + Caption = '-' + end + object mnuAdd: TMenuItem + Caption = 'Add transform' + Hint = 'Add new triangle' + ImageIndex = 1 + OnClick = mnuAddClick + end + object N1: TMenuItem + Caption = '-' + end + object mnuAutoZoom: TMenuItem + Caption = 'Auto Zoom' + Hint = 'Zoom to fit all triangles' + ImageIndex = 19 + OnClick = mnuAutoZoomClick + end + object mnuShowVarPreview: TMenuItem + Caption = 'Show Variation Preview' + Hint = 'Show/hide variation preview' + ImageIndex = 14 + OnClick = tbVarPreviewClick + end + object N8: TMenuItem + Caption = '-' + end + object mnuSelectmode: TMenuItem + Caption = 'Select mode' + ImageIndex = 6 + OnClick = tbSelectClick + end + object mnuExtendedEdit: TMenuItem + Caption = 'Extended edit mode' + Hint = 'Toggle extended edit mode' + ImageIndex = 25 + OnClick = tbExtendedEditClick + end + object mnuAxisLock: TMenuItem + Caption = 'Lock transform axes' + ImageIndex = 16 + OnClick = tbAxisLockClick + end + object oggleposttriangleediting1: TMenuItem + Caption = 'Toggle post-triangle editing' + ImageIndex = 29 + OnClick = tbPostXswapClick + end + object N5: TMenuItem + Caption = '-' + end + object mnuFlipAllV: TMenuItem + Caption = 'Flip All Vertical ' + Hint = 'Flip all triangles vertical' + ImageIndex = 13 + OnClick = mnuFlipAllVClick + end + object mnuFlipAllH: TMenuItem + Caption = 'Flip All Horizontal' + Hint = 'Flip all triangles horizontal' + ImageIndex = 12 + OnClick = mnuFlipAllHClick + end + object mnuFlipAllLine: TMenuItem + Caption = 'Flip All Line' + ImageIndex = 35 + OnClick = mnuFlipAllLineClick + end + object N11: TMenuItem + Caption = '-' + end + object mnuEHighQuality: TMenuItem + Caption = 'High quality' + RadioItem = True + OnClick = mnuHighQualityClick + end + object mnuEMediumQuality: TMenuItem + Caption = 'Medium quality' + Checked = True + RadioItem = True + OnClick = mnuMediumQualityClick + end + object mnuELowQuality: TMenuItem + Caption = 'Low quality' + RadioItem = True + OnClick = mnuLowQualityClick + end + end + object QualityPopup: TPopupMenu + Left = 384 + Top = 40 + object mnuLowQuality: TMenuItem + Caption = 'Low Quality' + RadioItem = True + OnClick = mnuLowQualityClick + end + object mnuMediumQuality: TMenuItem + Caption = 'Medium Quality' + Checked = True + RadioItem = True + OnClick = mnuMediumQualityClick + end + object mnuHighQuality: TMenuItem + Caption = 'High Quality' + RadioItem = True + OnClick = mnuHighQualityClick + end + object N3: TMenuItem + Caption = '-' + end + object mnuResetLoc: TMenuItem + Caption = 'Auto reset location' + OnClick = mnuResetLocClick + end + end + object EditorTB: TImageList + Left = 313 + Top = 40 + Bitmap = { + 494C01012B003000040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 000000000000360000002800000040000000B0000000010020000000000000B0 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000050101002A0E0D00250D0B00250D + 0B00260D0B0026090700000000007B7B7B00E6E6E60000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000002A0F0C00F1554A00DE4E4400DF4E + 4400F653480057181400D7DEDF001A1A1A0000000000D8D8D800000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000250D0B00DE4E4400CD483F00D948 + 3E003A020000D6E1E20000000000000000000000000000000000E6E6E6000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000250D0B00DF4E4500D8483E004C1C + 1800CAD8D900000000000000000000000000F4F4F40010101000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00D7D7D7000000000000000000D7D7D700FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000260D0B00F65348003A020000CAD8 + D900000000000000000000000000000000000000000084848400000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF000000000000000000FFFFFF00FFFFFF00FFFFFF009191 + 9100C3C3C3000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000002609060056171300D6E1E2000000 + 0000000000000000000000000000000000000000000000000000000000006D6D + 6D00000000000000000000000000000000000000000000000000000000009191 + 9100FFFFFF00FFFFFF000000000000000000FFFFFF00FFFFFF00FFFFFF000000 + 0000FFFFFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000052525200000000000000 + 00000000000000000000000000000000000000000000DAE1E100000000000000 + 000000000000000000000000000000000000F7F7F7000A0A0A005B5B5B000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF009191910000000000C3C3C300FFFFFF00FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000005252520000000000000000000000 + 000000000000000000000000000000000000F1F1F10099999900F7F7F7000000 + 00000000000000000000000000000000000000000000E9E9E900000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000091919100FFFFFF009191910000000000C3C3C300FFFFFF00FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000525252000000000000000000000000000000 + 000000000000000000000000000000000000929292000000000000000000E9E9 + E900DFDFDF00C2C3B600C5C6B700C5C6B700C5C6B700CACABC00C4C4C100CECE + CE00000000000000000000000000000000000000000000000000000000000000 + 000000000000C3C3C300C3C3C3000000000091919100FFFFFF00FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000052525200000000000000000000000000000000000000 + 000000000000000000000000000000000000626262000000000078787800BBBB + BB004C4D40000000620000006E0000006C0000006D000000850000000000B3B4 + B100000000000000000000000000000000000000000000000000D7D7D7000000 + 00000000000091919100C3C3C3000000000091919100FFFFFF00FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000DADADA0000000000F1F1F1000000 + 0000505139001B11EF00261DFD00261DFB00251CFF0000006F00C9C9C3000000 + 000000000000000000000000000000000000000000000000000091919100FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000D0D0D00000000000F5F5F5000000 + 0000505139001910E300241CEF00261DFF0009066400CDCEB800000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000C8C8C800000000003F3F3F009F9F + 9F005D5E46001910E400261DFF0000005E007A7A6A00393A3C00000000000000 + 000000000000E8E8E8009C9C9C00000000000000000000000000000000009191 + 9100D7D7D700FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007F7F7F00000000007373 + 730060614B00160DF00004006700D1D2BF00DBDBDB0000000000000000004B4B + 4B00F8F8F800C8C8C80000000000ADADAD000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00004F50460000005900C3C4AD000000000000000000BDBDBD00666666000000 + 0000000000000000000000000000424242000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00003D3D3D00C9C9BF000000000000000000000000000000000000000000C8C8 + C800D4D4D400AFAFAF0043434300000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000414140003B3C3B00363636003132 + 31002C2D2C0028282800232423001F1F1F001B1B1A0017171600121312000F0F + 0F000C0B0B000808080005060500000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000775B + 54B8FAF9F9060000000000000000000000004C4C4C00454445003E3D3E00CC48 + 3F0031313100CC483F0024252500CC483F00191A1900CC483F000F101000CC48 + 3F0007070700CC483F000000000000000000404140003B3B3B00363636003132 + 31002C2D2C0028272800232323001E1F1F001B1B1A0017171700121213000F0F + 0F000B0B0B000808080006050500000000002C2C2B0025262500CC483F001A1A + 1A00CC483F0010101000CC483F0008070700CC483F0000000000CC483F000000 + 0000CC483F0000000000CC483F00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000D7CECC384D26 + 1DF75F3E37D90000000000000000000000004C4C4C00444545003D3E3E00E8A2 + 0000E8A20000E8A20000E8A20000E8A20000E8A20000E8A20000E8A20000E8A2 + 0000E8A20000CC483F00CC483F0000000000CC483F00E8A20000E8A20000E8A2 + 0000E8A20000E8A20000E8A20000E8A20000E8A20000E8A20000E8A20000E8A2 + 0000E8A20000CC483F00CC483F00000000002B2B2C0025252500E8A20000E8A2 + 0000E8A20000E8A20000E8A20000E8A20000E8A20000E8A20000E8A20000E8A2 + 0000E8A20000CC483F00CC483F0000000000955744FF905340FF8A4F3CFF844A + 38FF7F4535FF976A5FC6DBCECA40A68C8590755044D8572C20FF6C4135FF9B6F + 62FF7C5246FF674840CF00000000000000004B4B4B00454445003D3E3D003737 + 3700E8A20000E8A20000E8A200001E1E1E00E8A20000E8A20000E8A20000E8A2 + 0000CC483F00CC483F00000000000000000041414000E8A20000E8A20000E8A2 + 0000E8A20000E8A20000E8A200001F1F1F00E8A20000E8A20000E8A20000E8A2 + 0000CC483F00CC483F0005050500000000002C2B2C0025262500E8A20000E8A2 + 0000E8A20000E8A20000E8A20000E8A2000004030300E8A20000E8A20000E8A2 + 0000CC483F00CC483F0000000000000000009C5D49FFC99988FFC79685FFC593 + 82FFC3907FFFA97362FF784536FF976A5DFFBD9384FFCDA193FFCB9F91FFCA9C + 8FFFC99A8DFF7D5247FF70524BC400000000CC483F00E8A200003E3D3E003737 + 370030303100E8A20000E8A20000E8A20000E8A20000E8A20000E8A20000CC48 + 3F00CC483F00000000000000000000000000CC483F00E8A20000E8A20000E8A2 + 0000E8A20000E8A20000E8A20000E8A20000E8A20000E8A20000E8A20000CC48 + 3F00CC483F000000000000000000000000002B2B2C0025252600E8A20000E8A2 + 0000E8A20000E8A20000E8A20000E8A20000E8A20000E8A20000E8A20000CC48 + 3F00CC483F00000000000000000000000000A2634EFFCB9D8DFFCA9A8AFFC898 + 86FFC69483FFB38070FF8D5D4DFFD1A99BFFCEA597FFCEA497FFCDA295FFCBA0 + 92FFCB9E90FF81564BFF705048C9000000004C4C4C00E8A20000E8A200003737 + 3700313030002A2A2A00E8A200001E1F1E00E8A20000E8A20000CC483F00CC48 + 3F000000000000000000000000000000000040414100E8A20000E8A20000E8A2 + 0000E8A20000E8A20000E8A200001F1F1E00E8A20000E8A20000CC483F00CC48 + 3F00000000000000000005060500000000002B2C2C0025262500E8A20000E8A2 + 0000E8A20000E8A20000E8A20000E8A2000003030300E8A20000CC483F00CC48 + 3F0000000000000000000000000000000000A86853FFA3644FFF9E5F4BFF9A5E + 49FFAC7562FF9B6655FFB58B7BFFD3AC9FFFB68C7CFF8A5B4EFF66372AFF8D62 + 53FF895E51FF735047D10000000000000000CC483F00E8A20000E8A20000E8A2 + 0000313031002A2A2A0025252400E8A20000E8A20000CC483F00CC483F000000 + 000000000000000000000000000000000000CC483F00E8A20000E8A20000E8A2 + 0000E8A20000E8A20000E8A20000E8A20000E8A20000CC483F00CC483F000000 + 0000000000000000000000000000000000002C2B2B0026262500E8A20000E8A2 + 0000E8A20000E8A20000E8A20000E8A20000E8A20000CC483F00CC483F000000 + 000000000000000000000000000000000000000000000000000000000000FAF7 + F60CC9A99F858D5643FFD2AE9FFFD3AFA1FF7A4838FCD5C7C24B000000006839 + 2BFD764F44DC0000000000000000000000004B4B4B00E8A20000E8A20000E8A2 + 0000E8A200002A2A2B00252524001F1F1E00CC483F00CC483F00000000000000 + 00000000000000000000000000000000000041404100E8A20000E8A20000E8A2 + 0000E8A20000E8A20000E8A200001F1F1F00CC483F00CC483F00000000000000 + 0000000000000000000005060500000000002C2B2C0026252500E8A20000E8A2 + 0000E8A20000E8A20000E8A20000E8A2000003030400CC483F00000000000000 + 000000000000000000000000000000000000000000000000000000000000FAF7 + F60CC9A99F85B28472FFD9B7A9FFB58978FF864F3CFCDAC9C44B000000007240 + 31FD87574ADC000000000000000000000000CC483F00E8A200003D3D3E00E8A2 + 000031313000E8A20000242524001F1F1F00191919000000000010100F000000 + 000007070700000000000000000000000000CC483F00E8A2000036363600E8A2 + 00002C2C2D00E8A2000023242300CC483F001B1B1A0000000000131312000000 + 00000B0B0C000000000000000000000000002C2C2C0026252600E8A200001A1A + 1A00E8A2000010101000E8A2000007070700CC483F0000000000000000000000 + 000000000000000000000000000000000000AF7056FFAC6C54FFA86951FFA66A + 55FFBB8D7AFFD6B5A6FFDBBAACFF9B6655FFB07D6BFF9D6553FF854B39FF9C64 + 55FF986151FF8E5F52D100000000000000004C4C4C00E8A20000E8A20000E8A2 + 0000E8A20000CC483F00CC483F001F1E1F001919190014151400000000000000 + 00000000000000000000000000000000000041414100E8A20000E8A20000E8A2 + 0000E8A20000CC483F00CC483F001E1E1F000000000000000000000000000000 + 0000000000000000000005050500000000002C2C2C0025262600E8A20000E8A2 + 0000E8A20000E8A20000E8A20000CC483F000303030000000000000000000000 + 000000000000000000000000000000000000B37158FFE2C6B8FFE1C5B6FFE0C4 + B5FFDFC1B3FFDEC0B2FFCEAA99FF9C6350FFCC9E8DFFCA9C8BFFC99988FFC796 + 85FFC59382FF996353FF93665AC900000000CC483F00E8A20000E8A20000E8A2 + 0000CC483F00CC483F00000000000000000019191900141414000F0F10000000 + 000000000000000000000000000000000000CC483F00E8A20000E8A20000E8A2 + 0000CC483F00CC483F0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000002C2B2B0025262500E8A20000E8A2 + 0000E8A20000E8A20000CC483F00CC483F000000000000000000000000000000 + 000000000000000000000000000000000000B47259FFE2C7B9FFE2C6B8FFE1C5 + B7FFE0C3B6FFCAA190FFAE7864FFAC7560FFC89A88FFCEA18FFFCB9D8DFFCA9A + 8AFFC89886FF9E6757FF9B6E62C4000000004B4C4C00E8A20000E8A20000CC48 + 3F00CC483F0000000000000000001F1F1E0000000000141514000F100F000B0B + 0B000000000000000000000000000000000041414100E8A20000E8A20000CC48 + 3F00CC483F0000000000000000001E1F1E000000000000000000000000000000 + 0000000000000000000006050600000000002C2B2C0026262500E8A20000E8A2 + 0000E8A20000CC483F00CC483F00000000000303040000000000000000000000 + 000000000000000000000000000000000000B47259FFB47259FFB47259FFB171 + 57FFAE6F55FFBD8C79C6E8D9D340CEAA9E90B17C6AD89F604CFFA56B57FFB784 + 72FFA7715EFF9F6F5FCF0000000000000000CC483F00E8A20000CC483F00CC48 + 3F000000000000000000000000000000000000000000000000000F0F10000B0B + 0B0007070700000000000000000000000000CC483F00E8A20000CC483F00CC48 + 3F00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000002C2C2B0026262600E8A20000E8A2 + 0000CC483F00CC483F0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000EADCD7389E61 + 4EF7A4705FD90000000000000000000000004C4C4B00CC483F00CC483F000000 + 00000000000000000000000000001E1F1F000000000000000000000000000B0B + 0B000707070003030300000000000000000040414100CC483F00CC483F000000 + 00000000000000000000000000001F1E1F000000000000000000000000000000 + 0000000000000000000005060500000000002B2C2C0025262600E8A20000CC48 + 3F00CC483F000000000000000000000000000404030000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000BB8D + 7FB8FCFBFA06000000000000000000000000CC483F00CC483F00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000007060700030403000000000000000000CC483F00CC483F00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000002C2C2C0026262500CC483F00CC48 + 3F00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000004B4C4B00000000003E3D3D000000 + 0000303031000000000024252500000000001A191A000000000010100F000000 + 0000070706000304040000000000000000004041410000000000363636000000 + 00002D2C2D000000000023232300000000001B1B1B0000000000121212000000 + 00000B0B0B000000000005050500000000002C2C2C0025252500CC483F001A1A + 1A00000000001010100000000000070707000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000005F6E2C006777520063792F00FFE9 + 39007488410068785200829D4C00FFB63D007C99470066765100677C3700FFF3 + 3B005B72290064734F0055682600000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000A449A3000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000707070007070700070707000707070007070700070707000707070007070 + 7000707070007070700070707000000000003D3324003B332300FFED3A00FFED + 3A006B6E48007A855500FFB73E00FFB93E006F774D005D5F3E00FFF03B00FFF0 + 3B00362D1F003B2F210000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000A449A300A449A3000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000007070700070707000707070007070700070707000707070007070 + 70007070700070707000707070000000000039322200FFEF3A00FFF03B00FFED + 3A0066744900FFB83E00FFB63D00FFB93E006B754B00FFF03B00FFF03B00FFEF + 3A0032271C000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000A449A300A449A300000000000000000000000000000000000000 + 0000000000004D4D4D000000000000000000A7A7A70000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000007070700070707000FEFEFE00EDF5E900E3EFDC00D9EA + D100D9EAD1007070700070707000000000003C382500504E3300525738006471 + 4700FFB73E00FFB63D00FFB93E00FFB73E00758152005F67420053503400372E + 2000000000000000000000000000C6C6C6000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000A449A300A449A30000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000D9D9 + D900686868000000000000000000000000000000000070707000707070007070 + 70007070700070707000707070007070700070707000FCFDFB00EDF5E900E3EF + DC00DFEDD80070707000707070000000000057533700667651006C794D00FFB8 + 3E00FFB43D00FFB63D00FFB73E00FFB83E006C7A4D0066765100535034000000 + 00000000000000000000C6C6C600676161000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000A449A300000000000000000000000000000000000000000000000000BDBD + BD00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000707070007070 + 7000707070007070700070707000707070007070700070707000F8FBF700EFF6 + EB00E5F0DF007070700070707000000000005A5E3D005B674100FFB83E00FFB8 + 3E00FFB83E00FFBA3E00FFB73E00FFB53D0071824F00626A4400000000000000 + 000000000000B4B3B30088818100FFFBFB000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000E1E1E100000000008C8C8C0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000007070 + 70007070700092BE700092BE700092BE700092BE70007070700070707000F5F9 + F200E5F0DF007070700070707000000000006B744A00FFB83E00FFB93E00FFB8 + 3E00FFB53D00FFB73E00FFB43C00FFB73E006E7D4F0000000000000000000000 + 0000B7B8B800877D7D00F9EFEF00E0D4D4000000000000000000000000000000 + 00000000000000000000000000000000000000000000A449A300A449A3000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000A7A7A70000000000C7C7C700000000008C8C8C0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000707070007070700092BE700092BE700092BE700092BE7000707070007070 + 7000F1F7EE0070707000707070000000000080925C00889F640090B16D0094BB + 720098C1760095C1750092B16C008AA16500000000000000000000000000BCBC + BC00857F7F00FFFFFF00F0E8E800FFFFFF000000000000000000000000000000 + 000000000000000000000000000000000000A449A300A449A300000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000007C7C7C008C8C8C0000000000D0D0D00000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000707070007070700092BE700092BE700092BE7000707070007070 + 7000707070007070700070707000000000007B895700667651008AA76700FFEF + 3A0091B36E006574500065745000000000000000000000000000BCBCBC009089 + 8900FFFFFF00FFFFFF00FFFFFF00969292000000000000000000000000000000 + 0000000000000000000000000000A449A300A449A30000000000000000000000 + 00000000000000000000000000000000000000000000000000008C8C8C000000 + 000000000000C7C7C7008C8C8C0000000000E1E1E10000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000707070007070700092BE700092BE7000707070007070 + 7000707070007070700070707000000000007A8957007A895700FFEE3A00FFF0 + 3B0087A06200809A600000000000BCBEBE007C787800847C7C0099909000FBF9 + F900FFFFFF00FFFFFF008F8B8B00BFBFBF000000000000000000000000000000 + 00000000000000000000A449A300A449A3000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000E9E9E9000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000007A8E1700536B + 1700000000000000000000000000707070007070700092BE7000707070007070 + 7000000000007070700070707000000000006D764B00FFF03B00FFF33B00FFEF + 3A007685540000000000BCBBBB00968A8A00F9EAEA00FFFFFF00FEF8F800EAE2 + E200FEFCFC009A959500BEBEBE00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000010001001700170000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000BC8F49006D7E + 1200000000000000000000000000000000007070700070707000707070007070 + 700000000000000000007070700000000000616642005E6340005C673F006167 + 4200000000000000000086808000E6D4D400DCCECE00CDC3C300F4F0F000FDF8 + F800A79F9F00B8B7B70000000000000000000000000000000000000000000000 + 0000A449A300A449A30000000000000000000000000000000000000000000D00 + 0D0000000000000000000000000000000000000000000000000000000000F0F0 + F0004D4D4D000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000C6966200D1A67C00E1BBA200C491 + 5200778914004D62170000000000000000000000000070707000707070007070 + 7000000000000000000000000000000000005150350066765100504E34000000 + 00000000000000000000998D8D00EDD8D800888383009A989800CFC6C600FFFF + FF00908A8A00C3C3C30000000000000000000000000000000000000000000000 + 0000A449A3000000000000000000000000000F000F0000000000000000001500 + 1500000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000D8B08900E9CFBB00EFD6CD00E4C0 + AA00BE8F4B007D8E140000000000000000000000000000000000707070007070 + 7000000000000000000000000000000000003E35230040332400000000000000 + 000000000000000000008D878700A59F9F00D2D5D5008F878700DCCECE00F6EA + EA008C878700C3C3C3000000000000000000000000000000000000000000A449 + A300A449A3000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000E9CEBB00D7B1 + 8D00000000000000000000000000000000000000000000000000000000007070 + 7000000000000000000000000000000000003B2E210000000000000000000000 + 00000000000000000000D8D8D800C4C3C300A39D9D00ECD7D700E6D4D400A196 + 9600C6C8C8000000000000000000000000000000000000000000A449A300A449 + A300000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000D9B18B00CDA0 + 7500000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000D8D8D8008D878700998D8D0086808000C6C8 + C8000000000000000000000000000000000000000000A449A300A449A3000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000707070007070700070707000707070007070700070707000707070007070 + 7000707070007070700070707000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000707070007070700070707000707070007070700070707000707070007070 + 7000707070007070700070707000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000007070700070707000707070007070700070707000707070007070 + 7000707070007070700070707000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000007070700070707000707070007070700070707000707070007070 + 7000707070007070700070707000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000007070700070707000FED2B900FED1B800FDD0B700FCCF + B500FCCEB4007070700070707000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000007070700070707000FED2B900FED1B800FDD0B700FCCF + B500FCCEB4007070700070707000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000007070700070707000FED2B900FDD1B800FDD0 + B600FCCEB5007070700070707000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000070707000707070007070 + 7000707070007070700070707000707070007070700070707000707070007070 + 7000FCCEB5007070700070707000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000007070700070707000FED1B900FDD0 + B700FCCFB6007070700070707000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000707070007070 + 7000707070007070700070707000707070007070700070707000707070007070 + 7000FCCFB6007070700070707000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007070700070707000FDD1 + B800FDD0B7007070700070707000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000007070 + 700070707000FEFEFE00FAF7F500F5EDE900EFE3DC00EAD9D100707070007070 + 7000FDD0B7007070700070707000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000707070007070 + 7000FDD0B8007070700070707000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007070700070707000FDFCFB00F8F3F000F2E9E300EDDFD800707070007070 + 7000FDD0B8007070700070707000000000005A5A5A0000000000000000000000 + 00005A5A5A0000000000000000000000000000000000000000005A5A5A000000 + 000000000000000000005A5A5A000000000000000000B9530000000000000000 + 0000BA520200B9530000000000000000000000000000B9530000000000007070 + 7000707070007070700070707000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000007070700070707000FBF8F700F6EFEB00F0E5DF00707070007070 + 7000707070007070700070707000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000B9530000000000000000 + 000000000000B95300000000000000000000B953000000000000000000000000 + 0000707070007070700070707000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000A5A5A5000000000000000000000000000000000000000000000000000000 + 000000000000000000007070700070707000F9F5F200F4EBE600707070007070 + 700070707000707070007070700000000000000000005A5A5A00000000005A5A + 5A00000000000000000000000000000000000000000000000000000000005A5A + 5A00000000005A5A5A00000000000000000000000000B9530000000000000000 + 00000000000000000000B9530000B95300000000000000000000000000000000 + 0000000000007070700070707000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000A5A5 + A5000000000000000000000000000000000000000000000000008E7A17006B53 + 17000000000000000000000000007070700070707000F7F1EE00707070007070 + 7000000000007070700070707000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000B9530000B9530000B953 + 0000B953000000000000B9530000B95300000000000000000000000000000000 + 0000000000000000000070707000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000A5A5A5000000 + 00000000000000000000000000000000000000000000000000008FBC49007E6D + 1200000000000000000000000000000000007070700070707000707070007070 + 70000000000000000000707070000000000000000000000000005A5A5A000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00005A5A5A0000000000000000000000000000000000B9530000000000000000 + 0000B9530000000000000000000000000000B953000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000A5A5A500000000000000 + 00000000000000000000000000000000000096C66200A6D17C00BBE1A20091C4 + 520089771400624D170000000000000000000000000070707000707070007070 + 7000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000B9530000B9530000B953 + 0000B953000000000000000000000000000000000000B9530000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000A5A5A50000000000000000000000 + 000000000000000000000000000000000000B0D88900CFE9BB00D6EFCD00C0E4 + AA008FBE4B008E7D140000000000000000000000000000000000707070007070 + 7000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000CEE9BB00B1D7 + 8D00000000000000000000000000000000000000000000000000000000007070 + 7000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000B1D98B00A0CD + 7500000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000707070007070700070707000707070007070700070707000707070007070 + 7000707070007070700070707000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000007070700070707000707070007070700070707000707070007070 + 7000707070007070700070707000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000070707000707070001FDC6F001EDB6E001EDA6C001DD8 + 6B001CD769007070700070707000000000000000000000000000000000000000 + 0000000000000000000042636300000000004263630000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFFFFF00E39A + 6F00FFFFFF00E3996C00E2996D00E3996D00FFFFFF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFF00E39A6F00FFFFFF00E3996C00E299 + 6D00E3996D00FFFFFF0000000000000000000000000000000000000000000000 + 000000000000000000000000000070707000707070001FDB6E001EDA6D001DD9 + 6C001DD86A007070700070707000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFFFFF00FFFF + FF00FFFFFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000070707000707070001FDB6E001EDA + 6D001DD96B007070700070707000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFFFFF00E295 + 6600E393630000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00000000000000000000000000000000000000000056B9F50056B9 + F50056B9F50056B9F50000000000FFFFFF00E2956600E3936300FFFFFF00E392 + 6200E2936300FFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000070707000707070001EDB + 6D001ED96C007070700070707000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFFFFF00FFFF + FF00FFFFFF0000000000FFFFFF00E39A6F00FFFFFF00E3996C00E2996D00E399 + 6D00FFFFFF00000000000000000000000000000000000000000056B9F50056B9 + F50056B9F50056B9F50000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000707070007070 + 70001EDA6D007070700070707000000000000000000000000000426363000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000426363000000000000000000000000000000000000000000FFFFFF00E391 + 5F00E28C580000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00000000000000000000000000000000000000000056B9F50056B9 + F50056B9F50056B9F50000000000FFFFFF00E3915F00E28C5800FFFFFF00FFFF + FF00E2936400FFFFFF0000000000000000000000000000B93400000000000000 + 000002B8360000B9340000000000000000000000000000B93400000000007070 + 7000707070007070700070707000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFFFFF00FFFF + FF00FFFFFF0000000000FFFFFF00E2956600E3936300FFFFFF00E3926200E293 + 6300FFFFFF00000000000000000000000000000000000000000056B9F50056B9 + F50056B9F50056B9F50000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 0000000000000000000000000000000000000000000000B93400000000000000 + 00000000000000B93400000000000000000000B9340000000000000000000000 + 0000707070007070700070707000000000000000000000000000426363000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000426363000000000000000000000000000000000000000000FFFFFF00E291 + 6000FFFFFF0000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00000000000000000000000000000000000000000056B9F50056B9 + F50056B9F50056B9F50000000000FFFFFF00E2916000FFFFFF00FFFFFF000000 + 0000FFFFFF000000000000000000000000000000000000B93400000000000000 + 0000000000000000000000B9340000B934000000000000000000000000000000 + 0000000000007070700070707000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFFFFF00FFFF + FF00FFFFFF0000000000FFFFFF00E3915F00E28C5800FFFFFF00FFFFFF00E293 + 6400FFFFFF00000000000000000000000000000000000000000056B9F50056B9 + F50056B9F50056B9F50000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 0000000000000000000000000000000000000000000000B9340000B9340000B9 + 340000B934000000000000B9340000B934000000000000000000000000000000 + 0000000000000000000070707000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000 + 000000000000000000000000000000000000000000000000000056B9F5000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000B93400000000000000 + 00000000000000000000000000000000000000B9340000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000FFFFFF00E2916000FFFFFF00FFFFFF0000000000FFFF + FF0000000000000000000000000000000000000000000000000056B9F5000000 + 0000BBE5F900BBE5F900BBE5F900BBE5F900BBE5F900BBE5F9000000000056B9 + F500000000000000000000000000000000000000000000B9340000B9340000B9 + 340000B9340000B9340000000000000000000000000000B93400000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000042636300000000004263630000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000 + 000000000000000000000000000000000000000000000000000056B9F50056B9 + F50000000000BBE5F9000000000000000000BBE5F9000000000056B9F50056B9 + F500000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000BBE5F900BBE5F9000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000630000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000630000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000630000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000630000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000630000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000630000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000006300000000000000630000000000000063000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000630000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000063000000630000006300000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000630000000000 + 0000630000000000000063000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000006300 + 0000000000000000000000000000630000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000006300 + 0000630000006300000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000006300000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000630000000000000063000000630000006300000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000630000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000063000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000006300000063000000630000006300 + 0000630000006300000063000000FFFFFF006300000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000630000006300000063000000630000006300 + 0000630000006300000063000000630000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000005252 + 5200000000000000000000000000000000000000000000000000000000000000 + 0000630000000000000063000000630000006300000000000000000000005252 + 5200000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000005252 + 5200000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000630000000000000000000000000000005252 + 5200000000000000000063000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000525252000000 + 0000000000000000000000000000000000000000000000000000000000006300 + 0000000000000000000000000000000000000000000000000000525252000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000525252000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000630000000000000000000000525252000000 + 0000000000006300000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000052525200000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000052525200000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000630000000000000000000000000000000000000052525200000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000630000000000000052525200000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000005252520000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000005252520000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000006300000000000000000000005252520000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000630000005252520000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000006300000063000000630000006300 + 0000630000006300000063000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000630000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000006300000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000006300000000000000630000000000000063000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000630000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000063000000630000006300000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000630000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000063000000630000006300 + 0000630000006300000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000063000000FFFFFF00FFFF + FF00FFFFFF006300000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000063000000FFFFFF00FFFF + FF00FFFFFF0063000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000BE724D00C77B5500CC80 + 5B00D78B6500D68A650000000000000000000000000000000000D68A6500D78B + 6500CC805B00C77B5500BE724D00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000063000000FFFFFF00FFFF + FF00FFFFFF006300000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000B0694700BC724E00BA66 + 3C00C47D5E00DE926C0000000000000000000000000000000000DE926C00FBC3 + A600FBC3A600FDBE9E00B0694700000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000063000000630000006300 + 0000630000006300000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000D1B3CA0096492400000000000000000000000000A75F3C00BC724E00BA66 + 3C00C47D5E00DE926C0000000000000000000000000000000000DE926C00FBC3 + A600FBC3A600FDBE9E00A75F3C0000000000000000000000000096492400ECC5 + D700000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000D1B3 + CA009D4E28009D4D25000000000000000000000000009D543000BC724E00BA66 + 3C00C47D5E00E296700000000000000000000000000000000000E2967000FBC3 + A600FBC3A600FDBE9E009D5430000000000000000000000000009D4D25009D4E + 2800ECC5D7000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000052525200000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000D1B3CA00A050 + 2A00D2754700AB542900A24F27009A4B25009247230092472300BC724E00BA66 + 3C00C47D5E00E296700000000000000000000000000000000000E2967000FBC3 + A600FBC3A600FDBE9E0092472300924723009A4B2500A24F2700AB542900BF6A + 3F00A0502A00ECC5D70000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000005252520000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000D1B3CA00A2563100E186 + 5800F68F5B00E9865500D97B4D00C8704400B7653B00AA5B3300BD704A00B667 + 4000BE775500E296700000000000000000000000000000000000E2967000FBC3 + A600FBC3A600FDBE9E00FCB99700FDB08900F7905C00EC885600DE7F4F00D176 + 4800C46E4200A2563100ECC5D700000000000000000000000000000000000000 + 0000000000000000000000000000525252000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000E2956E00FBC0A100FFB3 + 8C00FF9E6D00F68F5B00E9865500D97B4D00C8704400C8704400CF7F5700CB79 + 5000C47A5700E296700000000000000000000000000000000000E2967000FBC3 + A600FBC3A600FDBE9E00FDBE9E00FCB99700FDA57800FC935E00F28C5900E584 + 5300D87B4C00C66E4100AE582B00000000000000000000000000000000000000 + 0000000000000000000052525200000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000E0BDCC00E89C7600FBC0 + A100FFB38B00FFB38D00F8A87F00EEA17A00E1987400E1987400E1987400D98B + 6500D1896500E296700000000000000000000000000000000000E2967000FBC3 + A600FBC3A600FBC3A600FBC3A600FDBE9E00FDBE9E00FEAE8500FFA87D00F89D + 6F00E5835100AE582B00F5CEE400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000DFBFCF00E89C + 7600FBBFA000CE673300E7946C00E68E6200E5875800E28B5E00E28B6100E28F + 6500E2916800E296700000000000000000000000000000000000E2967000E296 + 7000E2967000E2967000E2967000E2967000DA8E6800D1855F00DB906A00F79A + 6B00AE582B00F5CEE40000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000DFBF + CF00E79A7300D2703E0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000E5997300C576 + 4E00F4CFE2000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000DFBFCF00E79A730000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000E89C7600F9D3 + EB00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000008400840000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000008400840000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000B971 + 44000000000000000000AD6538000000000000000000A55C2E00000000000000 + 0000A1582A00000000000000000000000000000000000000000000000000BB74 + 460000000000000000000000000000000000000000000000000000000000A158 + 2A00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000008400840000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000BB75 + 48000000000000000000B16B3C000000000000000000A75F3200000000000000 + 0000A1582A00000000000000000000000000000000000000000000000000BB74 + 460000000000000000000000000000000000000000000000000000000000A158 + 2A00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000008400840000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000C7815400C37D5000BF79 + 4C00BD754800B9714200B56D4000B1693C00AE663700AB623400A85F3100A65B + 2E00A35A2C00A1582A00A1582A0000000000000000000000000000000000C079 + 4C0000000000000000000000000000000000000000000000000000000000A158 + 2A00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000008400840000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000C37D + 52000000000000000000B97144000000000000000000AE663900000000000000 + 0000A55C2E00000000000000000000000000CD875A00CD875A00C9835600C57E + 5100C07A4C00BC754800B8714300B46C3F00B0683A00A9603300A65D2F00A35A + 2C00A1582A00A1582A00A1582A00000000000000000000000000000000000000 + 0000000000000000000000000000000000008400840000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000C783 + 54000000000000000000BD7546000000000000000000B1693C00000000000000 + 0000A85F3100000000000000000000000000000000000000000000000000C983 + 560000000000000000000000000000000000000000000000000000000000A65E + 3000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000008400840000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000D48C5F00CF895C00CB85 + 5800C7815400C37D5000C1794C00BB754800B9714400B56B4000B2693B00AE65 + 3700AA623500A85F3100A55B3000000000000000000000000000000000003E39 + 370048403B0039322F0028231F001B171400070605000000000000000000AA61 + 3300000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000008400840000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000CE8A + 5D000000000000000000C37D50000000000000000000B9714200000000000000 + 0000AD6738000000000000000000000000000000000000000000000000008976 + 6C00D1B9AC00CAAD9B00C8A89500C7A39000C7A08D000706050000000000B26A + 3C00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000008400840000000000000000000000 + 0000000000000000000000000000000000008400840084008400840084008400 + 8400000000000000000084008400840084008400840084008400840084008400 + 840084008400840084008400840084008400000000000000000000000000D28E + 61000000000000000000C78154000000000000000000BB754800000000000000 + 0000B1693C000000000000000000000000008A4625000000000000000000897D + 7600F8E9E000F6E3D900F4DED100F2D9CC00C7A391001814120000000000B66F + 4100000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000008400840000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000DB976800D8946800D591 + 6400D28E6100CF895C00CB875800C7815400C37D5000C1794C00BD754600B770 + 4400B56D3E00B1693C00AE66390000000000975433008A462500000000008980 + 7900FAEEE700F8E8DF00F5E3D800F4DED100C8A89800231E1B0000000000BB74 + 4600000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000D894 + 67000000000000000000CF895C000000000000000000C47D5100000000000000 + 0000B97144000000000000000000000000009754330000000000000000008980 + 7C00FCF2EC00FAEDE600F8E9DF00F5E3D800CBAE9F00322C290000000000C079 + 4C00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000DB95 + 6A000000000000000000D28E61000000000000000000C7835400000000000000 + 0000BB7548000000000000000000000000000000000000000000000000008880 + 7C00FCF4EE00FCF2EC00FAEFE800F9EAE100D6BFB3003F38350000000000C57E + 5100000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000008400840000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000DF9B6E00DF9B6E00DE98 + 6B00DB976800D8946700D5916400D28E6100CE8A5D00CB855800C9815400C57D + 5000C1794C00BD754800B771440000000000DF9B6E00DF9B6E00DF9B6E00887F + 7A0089807C0089807C0089807900887D770089766C0035312E00CD885B00C983 + 5600C57F5200C17A4D00C17A4D00000000000000000000000000000000000000 + 0000000000000000000000000000000000008400840000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000DF9B + 6E000000000000000000D99366000000000000000000CF895C00000000000000 + 0000C57D5000000000000000000000000000000000000000000000000000DF9B + 6E0000000000000000000000000000000000000000000000000000000000CE88 + 5B00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000008400840000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000DF9B + 6E000000000000000000DB976A000000000000000000D28E5F00000000000000 + 0000C9815400000000000000000000000000000000000000000000000000DF9B + 6E0000000000000000008A46250000000000000000000000000000000000D28D + 6000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000008400840000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000DF9B + 6E000000000097543300975433008A462500000000000000000000000000D28D + 6000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000A27760006349 + 3500634935006349350063493500634935006349350063493500634935006349 + 3500634935005C42300062483400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000F0E1D900CB9E8700AE7050009956330099563300B1725200D1A28A00F4E5 + DE00000000000000000000000000000000000000000000000000A3786200EDED + ED00E0E0E000D9D9D900D1D1D100C9C9C900C2C2C200B9B9B900B4B4B400B1B1 + B100928884003A1C0E0060473300000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000F8F1F100D5B2BB008A3C + 5A0078344C00000000000000000000000000000000000000000000000000E2C8 + BB00B5785700A7562D00B45C2E00B65C2E00B55C2D00B55C2D00BB5F3300D38D + 6A00F1D5C7000000000000000000000000000000000000000000A3796300EEEE + EE00EEEEEE00ECECEC00EBEBEB00E9E9E900E8E8E800E5E5E500DFDFDF00B6AB + A7002F160C0094888200634935000000000000000000B29E90007C6F63006D5D + 520068574A00635143005E4C3E000000000000000000C05D8000A94065008B2B + 5100872B4F0079254300701F3D00000000000000000000000000000000000000 + 0000000000000000000000000000F9F4F400D3B6BD008E445F008B445D008940 + 5B00853954000000000000000000000000000000000000000000F1E2DA00B778 + 5700B35B2E00DF835300F29A6C00F1996E00EE966900E78D5E00DC7D4D00D476 + 4800E09C7900F9EAE30000000000000000000000000000000000A37A6500EEEE + EE00EDEDED00EDEDED00EBEBEB00EAEAEA00EAEAEA0043211000BCB2AE002A14 + 0A00B5A9A300ADADAD00634935000000000000000000C1B3AA00D3D2D100BAB4 + B1009C948C0092877F00605042000000000000000000C2628300B9748900A44B + 68009F416200943758009D315800000000000000000000000000000000000000 + 000000000000F7EFEF00D8BCC30090466000924E6500A1607500A35D75009E54 + 6F0092405E000000000000000000000000000000000000000000CE9F8700AA57 + 2D00DF835300FBAD8700FECBB000FDE9DF00FBE7DD00F1BCA100DC885D00D87A + 4A00E58D5F00F3C4AD0000000000000000000000000000000000AE8A7700EDED + ED00EDEDED00ECECEC00EBEBEB00E9E9E900E9E9E900361A0D002D160B00BCB0 + A900DEDEDE00B1B1B10063493500000000000000000000000000BAA59600C7C3 + C100A69F9800988E8800604F42000000000000000000C4678600BD809200AD5D + 7600A54B6A00A3436600CE8F9B00000000000000000000000000FFFEFE00F3E6 + E800CEA8AF00A1597400A4647A00B9839400C18D9A00BD829300B7778A00AD6B + 80009B4564000000000000000000000000000000000000000000B5745300B85C + 2F00F0966800FDC8AE0000000000000000000000000000000000DCA58900CB6D + 3F00ED946500F4B29100000000000000000000000000A48F8000E4DBD5008871 + 5F00D2CCC800765D4B00D1CBC6006F564300CFC9C4003D241700381B0D004220 + 1000E2E2E200B8B8B800634935000000000000000000FEFEFE00C1B3AA00D1D0 + CE00B7B1AC00A0989100635244000000000000000000C66E8A00C28B9B00B570 + 8400AC5F7800A8436800F9F0F100000000000000000000000000E9D5DC00BC85 + 9700BF8C9A00D0A5AF00D5A9B600D3A8B300D2A3AF00CD9EAA00C692A000BC82 + 9300AF5072000000000000000000000000000000000000000000A0583400BA5E + 3100EC946600FBE7DC0000000000000000000000000000000000EFDAD000BF65 + 3600EE956600F3A9850000000000000000000000000000000000A38E80009680 + 6F0087705E007A614F006F56430069503D00674D3A00D2CDC900E9E9E900E8E8 + E800E5E5E500C1C1C10063493500000000000000000000000000FEFEFE00BAA5 + 9600C5C0BE00ADA6A30067554A000000000000000000C9748E00C7949F00BB7D + 8F00AB5B7600CE919A0000000000000000000000000000000000D3909F00D291 + A100D18FA000D0899B00CE819600CB7A9200C8738E00C56C8900C2638400C05C + 8000BE577C000000000000000000000000000000000000000000A0583400B65C + 2E00DE825300F7E3D80000000000D4886200FEFCFC0000000000EFDAD000BD60 + 3300ED956700F3AB8700000000000000000000000000B7A39600AE9A8C00F9F3 + EE00F2E5DC00F1E1D800EFDDD100EDD8CC006A513E006E554100EAEAEA00E9E9 + E900E8E8E800CBCBCB0063493500000000000000000000000000FEFEFE00C1B3 + AA00D1D0CF00C1BEBC006D5C50000000000000000000CB7B9100CB9DA900C38D + 9D00AA4C6E00F9F2F20000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000B6765500B65C + 2E00CE6E3D00E5AE9100E9C2AE00DC926D000000000000000000CE997E00BF63 + 3500EF976C00F5B6940000000000000000000000000000000000B7A39600FCFD + FB00FCF8F600F7F2EC00F5E7DE00EFDED20070564300D5D0CC00EDEDED00ECEC + EC00EAEAEA00D0D0D0006349350000000000000000000000000000000000FEFE + FE00BAA59600C9C7C60075675D000000000000000000CE819500D4B0B900C177 + 9200D2949D000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000D5A58C00BE62 + 3300D06B3800DB7C4D00DE855600E8A17D000000000000000000A65E3A00CB6F + 4300F6A37800FACCB300000000000000000000000000C3B0A300BEAA9D00FDFE + FC00FCFDFB00FCFAF900F9F4EF00F0E1D70079604E00745C4900EEEEEE00EEEE + EE00ECECEC00DADADA006349350000000000000000000000000000000000FFFF + FF00C1B3AA00D2CFCE00807267000000000000000000D0889900D4AAB500C062 + 8400F5E9E9000000000000000000000000000000000000000000BFB2AB00A598 + 8E0091847A0084766B00796B61006D5C500067554A0063524400604F42006050 + 42005E4C3E000000000000000000000000000000000000000000F5E6DF00D48F + 6A00DB784600F18E5C00F69E7000F4AF8C000000000000000000BE7A5500E48F + 6500FDBC9E00FEEFE80000000000000000000000000000000000C3B0A300FDFE + FD00FDFEFD00FCFDFB00FCFBF900F2E5DD00856E5C00D6D1CC00EEEEEE00EEEE + EE00EEEEEE00E0E0E00063493500000000000000000000000000000000000000 + 000000000000BAA59600877A70000000000000000000D28D9C00CA849A00E1BA + BE00000000000000000000000000000000000000000000000000F9F8F700CEC3 + BC00BCA99C00CFCAC800C7C5C400C1BEBC00ADA6A300A0989100988E88009287 + 7F0063514300000000000000000000000000000000000000000000000000E2AF + 9400E68E6100FAA27600FFB08800FCB997000000000000000000FBF2ED00F6BF + A400FEE3D50000000000000000000000000000000000C9B7AB00C6B4A800FDFE + FD00FDFEFD00FDFEFD00FCFDFB00F7EEE900937D6D00866E5C00EEEEEE00EEEE + EE00EEEEEE00EDEDED0063493500000000000000000000000000000000000000 + 000000000000C1B3AA0092867C000000000000000000D4929F00D28B9E00FBF6 + F600000000000000000000000000000000000000000000000000000000000000 + 0000FAF9F900CEC3BC00BCA99C00CFCDCA00C5C0BE00B7B1AC00A69F98009C94 + 8C006A5A4D000000000000000000000000000000000000000000DA8F6A00E39A + 7600EDA78300F6B28F00FCB99700FCB997000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000C9B7AB00C6B4 + A800C3B0A300BEAA9D00B6A39500AC988A00A18B7C00DED3CC00BCA19200A37A + 6500A3796300A3786200A2776000000000000000000000000000000000000000 + 000000000000FEFEFE00AC9D96000000000000000000D595A100E1BECB000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FEFEFE00F8F6F500CABEB600BCA99C00CFCDCB00C7C3C100BAB4 + B10075665B000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000CCBAAE0000000000C9B7 + AB0000000000C3B0A30000000000B6A2950000000000A08A7C00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FEFEFD00F4F2F100D3C9C200BCA99C00D2CF + CE00817468000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FEFDFD00F4F1EF00CEC3 + BC00B2A195000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000745A4600694F3B00CAC2BB000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FBD7C500F8D5C3000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000F8D5C300FBD7C500000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000BBADA10081685400CAB2A400684E3A000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000F8DCCF00F38A5700E195 + 7100000000000000000000000000000000000000000000000000000000000000 + 0000E1957100F38A5700F8DCCF00000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000967C + 69000000000000000000000000008C735F00DFCABE00BDA79800705743000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000005A5A5A00000000005A5A5A0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000EECBBA00F085 + 5000DA865E00000000000000000000000000000000000000000000000000DA86 + 5E00F0855000EECBBA0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000009C83 + 70007F655200CEC6BF00CABEB50091796600E9D7CE007C634F00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000CA80 + 5C00F0885500EAC8B70000000000000000000000000000000000EAC8B700F088 + 5500CA805C000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000A38A + 7700DCD1CB006D533F0091796600DDCEC500D6C5BB00856C5900000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000E1CD + C300DB784700EF93670000000000000000000000000000000000EF936700DB78 + 4700E1CDC3000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000AA91 + 7F00F9F4F100DDD4CD00856C5800F3EAE500947C6900DCD4CE00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000008A46 + 2500954C2800A4542E00B65F3400C7693A00D672400000000000000000000000 + 0000AE5C3600EC865200F2CFBD000000000000000000F2CFBD00EC865200AE5C + 3600000000000000000000000000D6724000C7693A00B65F3400A4542E00954C + 28008A462500000000000000000000000000000000000000000000000000B098 + 8600FCFAF900FBF7F600F9F5F200F7F2EE00896F5C00664C38006A503C00765C + 49000000000000000000000000000000000000000000000000005A5A5A000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00005A5A5A00000000000000000000000000000000000000000000000000954C + 2800DF733600EA824900F39A6A00F5B594000000000000000000000000000000 + 0000A3664800E9845200F7C2A7000000000000000000F7C2A700E9845200A366 + 480000000000000000000000000000000000F5B59400F39A6A00EA824900DF73 + 3600954C2800000000000000000000000000000000000000000000000000B79F + 8D00FFFFFE00FEFDFC00FDFBFA00FBF8F700FAF6F300DFD5CE00886E5B000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000A355 + 2E00EC824B00F38D5B00EC9C7600B6866F00E9D5CB0000000000000000000000 + 0000A9745900E1825400F7BE9E000000000000000000F7BE9E00E1825400A974 + 5900000000000000000000000000E9D5CB00B6866F00EC9C7600F38D5B00EC82 + 4B00A3552E00000000000000000000000000000000000000000000000000BDA6 + 9400FFFFFF00FFFFFF00FFFFFF00FEFDFD00E2DAD5009A826F00000000000000 + 00000000000000000000000000000000000000000000000000005A5A5A000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00005A5A5A00000000000000000000000000000000000000000000000000B55F + 3400F39A6A00F49C7100F29465009D533000AA613B00DAB8A70000000000F6C5 + AE009D644600DE805100F7BDA1000000000000000000F7BDA100DE8051009D64 + 4600F6C5AE0000000000DAB8A700AA613B009D533000F2946500F49C7100F39A + 6A00B55F3400000000000000000000000000000000000000000000000000C3AC + 9900FFFFFF00FFFFFF00FFFFFF00ECE7E300AB93810000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000C769 + 3B00F7CAAE00FBDDCB00F4A37600F3946400B4623900B0643E00BF816200BB84 + 6000A15E3900EE8B5A00F6C8B0000000000000000000F6C8B000EE8B5A00A15E + 3900BB846000BF816200B0643E00B4623900F3946400F4A37600FBDDCB00F7CA + AE00C7693B00000000000000000000000000000000000000000000000000C8B0 + 9E00FFFFFF00FFFFFF00F6F2F000BDA593000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000D672 + 40000000000000000000FBDECF00F5A57E00F49D7200C9734700B7663C00B665 + 3D00E2815300F6BCA100F6CBB7000000000000000000F6CBB700F6BCA100E281 + 5300B6653D00B7663C00C9734700F49D7200F5A57E00FBDECF00000000000000 + 0000D6724000000000000000000000000000000000000000000000000000CBB4 + A200FFFFFF00F7F4F100CAB3A100000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FBDACA00F5A67E00F6B69600F5B28F00F6B0 + 9100F6C1A800F6C5AE0000000000000000000000000000000000F6C5AE00F6C1 + A800F6B09100F5B28F00F6B69600F5A67E00FBDACA0000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000CBB4 + A200F6F3F000CBB4A20000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000005A5A5A00000000005A5A5A0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FBE0D200F6C3A900F7CF + BB00F9DBCD00000000000000000000000000000000000000000000000000F9DB + CD00F7CFBB00F6C3A900FBE0D200000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000CBB4 + A200CBB4A2000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000CBB4 + A200000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000B7A293006349 + 3500634935006349350063493500634935006349350063493500634935006349 + 3500634935000000000000000000000000000000000000000000000000000000 + 0000707070007070700070707000707070007070700070707000707070007070 + 7000707070007070700070707000000000000000000000000000000000000000 + 0000707070007070700070707000707070007070700070707000707070007070 + 7000707070007070700070707000000000000000000000000000000000000000 + 0000707070007070700070707000707070007070700070707000707070007070 + 7000707070007070700070707000000000000000000000000000B7A29300FFFF + FF00B7A29300B7A29300B7A29300B7A29300B7A29300B7A29300B7A29300B7A2 + 9300634935000000000000000000000000000000000000000000000000000000 + 0000000000007070700070707000707070007070700070707000707070007070 + 7000707070007070700070707000000000000000000000000000000000000000 + 0000000000007070700070707000707070007070700070707000707070007070 + 7000707070007070700070707000000000000000000000000000000000000000 + 0000000000007070700070707000707070007070700070707000707070007070 + 7000707070007070700070707000000000000000000000000000B7A29300FFFF + FF00FFFFFF00FCFAF900F7F1EE00F1E7E100ECDDD500E6D3C900E1CABD00B7A2 + 9300634935000000000000000000000000000000000000000000000000000000 + 000000000000000000007070700070707000FEFEFE00FAF7F500F5EDE900EFE3 + DC00EAD9D1007070700070707000000000000000000000000000000000000000 + 000000000000000000007070700070707000FEFEFE00FAF7F500F5EDE900EFE3 + DC00EAD9D1007070700070707000000000000000000000000000000000000000 + 000000000000000000007070700070707000FEFEFE00FAF7F500F5EDE900EFE3 + DC00EAD9D1007070700070707000000000000000000000000000B7A29300FFFF + FF00FFFFFF00F5F5F500F1EEEC00ECE4E000E6DBD400E1D1C900E4CFC400B7A2 + 9300634935000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000007070700070707000FDFCFB00F8F3F000F2E9 + E300EDDFD8007070700070707000000000000000000070707000707070007070 + 7000707070007070700070707000707070007070700070707000707070007070 + 7000EDDFD8007070700070707000000000000000000000000000000000000000 + 00000000000000000000000000007070700070707000FDFCFB00F8F3F000F2E9 + E300EDDFD8007070700070707000000000000000000000000000B7A29300FFFF + FF00C1C1C100ACACAC00ABAAA900A7A4A200A39D9900A0969200B4A69F00B7A2 + 9300634935000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000007070700070707000FBF8F700F6EF + EB00F0E5DF007070700070707000000000000000000000000000707070007070 + 7000707070007070700070707000707070007070700070707000707070007070 + 7000F0E5DF007070700070707000000000000000000000000000000000000000 + 0000000000000000000000000000000000007070700070707000FBF8F700F6EF + EB00F0E5DF007070700070707000000000000000000000000000BAA59600FFFF + FF00B6B6B600ECECEC00FFFFFF00FBF8F700EEE7E4009C959100E8D8D000B7A2 + 9300634935000000000000000000000000000000000000000000000000000000 + 0000088A450008623200095B2E0000000000000000007070700070707000F9F5 + F200F4EBE6007070700070707000000000000000000000000000000000007070 + 700070707000FEFEFE00FAF7F500F5EDE900EFE3DC00EAD9D100707070007070 + 7000F4EBE60070707000707070000000000000000000000000005656FF000A0A + FF00000000000000000000000000000000007D7DFF009F9FFF0070707000F9F5 + F200F4EBE6007070700070707000000000000000000000000000BEA99A00FFFF + FF00B6B6B600ECECEC00FFFFFF00F8F7F600ACAAA700E7DEDA00EEE1DA00B7A2 + 9300634935000000000000000000000000000000000000000000000000000000 + 00000CA650000BB05600074D2600000000000000000000000000707070007070 + 7000F7F1EE007070700070707000000000000000000000000000000000000000 + 00007070700070707000FDFCFB00F8F3F000F2E9E300EDDFD800707070007070 + 7000F7F1EE0070707000707070000000000000000000000000006363FF000101 + 75004C4CFF0000000000000000008484FF003333FF0000000000707070007070 + 7000F7F1EE007070700070707000000000000000000000000000C3AE9E00FFFF + FF00B6B6B600ECECEC00FCFCFC00B9B9B900CCCBCA00F7F1EE00F1E7E100B7A2 + 9300634935000000000000000000000000000000000000000000000000000000 + 00000EC15D0048E8A800075B2D00000000000000000000000000000000007070 + 7000707070007070700070707000000000000000000000000000000000000000 + 0000000000007070700070707000FBF8F700F6EFEB00F0E5DF00707070007070 + 7000707070007070700070707000000000000000000000000000000000000101 + DD000101C3008383FF009797FF001616FF007070FF0000000000000000007070 + 7000707070007070700070707000000000000000000000000000C8B2A300FFFF + FF00B5B5B500EDEDED00C1C1C100CBCBCB00FEFEFE00FAF7F500F5EDE900B7A2 + 930063493500000000000000000000000000000000000CD06A0016D66D001BD6 + 670027DB78006AEFC00010AF5600096B360008562C0007512B00000000000000 + 0000707070007070700070707000000000000000000000000000000000000000 + 000000000000000000007070700070707000F9F5F200F4EBE600707070007070 + 7000707070007070700070707000000000000000000000000000000000000000 + 00000101EB000101F8000101F5002323FF000000000000000000000000000000 + 0000707070007070700070707000000000000000000000000000CCB6A700FFFF + FF00B0B0B000C7C7C700C7C7C700FFFFFF00FFFFFF00FDFCFB00B7A29300B7A2 + 9300644A3600000000000000000000000000000000002DDB7F0082EDBC00C3FA + EC00A0F6DA008DF6D70070F0C50058EBB3000FB35600085D2E00000000000000 + 0000000000007070700070707000000000000000000000000000000000000000 + 00000000000000000000000000007070700070707000F7F1EE00707070007070 + 7000000000007070700070707000000000000000000000000000000000000000 + 00007979FF000101BC000101BC007C7CFF000000000000000000000000000000 + 0000000000007070700070707000000000000000000000000000D1BBAB00FFFF + FF00B6B6B600C1C1C100FFFFFF00FFFFFF00FFFFFF00B7A29300644A3600644A + 3600644A3600000000000000000000000000000000004ADF950066E4A50069E8 + A70062EAA8009CF6DB0039E088000EC55C000AA44F00098F4700000000000000 + 0000000000000000000070707000000000000000000000000000000000000000 + 0000000000000000000000000000000000007070700070707000707070007070 + 7000000000000000000070707000000000000000000000000000000000006868 + FF000000FF004747FF004F4FFF001515FF008787FF0000000000000000000000 + 0000000000000000000070707000000000000000000000000000D5BFAF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B9A49500D4C5BA00644A + 3600E1D5CD000000000000000000000000000000000000000000000000000000 + 000060E6A100C6FCEF003ADE8500000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000070707000707070007070 + 70000000000000000000000000000000000000000000000000004141FF000101 + D7005151FF0000000000000000006D6DFF003939FF006363FF00000000000000 + 0000000000000000000000000000000000000000000000000000D8C2B200FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00C0AB9C00644A3600E2D6 + CD00000000000000000000000000000000000000000000000000000000000000 + 000064E4A30089EDBF0032DD8400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000707070007070 + 70000000000000000000000000000000000000000000000000002A2AFF006060 + FF00000000000000000000000000000000008787FF005656FF00000000000000 + 0000000000000000000000000000000000000000000000000000D8C2B200D8C2 + B200D8C2B200D8C2B200D8C2B200D4BEAE00CFB9A900C9B3A400E2D6CD000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000052E099002FDB7F0017D77200000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000007070 + 7000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000424D3E000000000000003E000000 + 2800000040000000B00000000100010000000000800500000000000000000000 + 000000000000000000000000FFFFFF007FFF007FFFFF0000BBFF003FFFFF0000 + DFFF031FFFFF0000EBFF071FE30F0000F7FF0F9FE3070000A80A1F0FE3170000 + F99F3F1FF11F0000FA3F1FBFF11F0000FA71000FF91F0000F8B9000FD91F0000 + F9D5101FC0070000FBEF103FE0070000FFD70039E0070000FABB8000FFFF0000 + FE7DF180FFFF0000FA3EF3E1FFFF0000FFFFFFFF0001FFFFFFE7000100010000 + FFC7000100010001000300010001000200010007000700070001000D000D000E + 0003001F001F001FE027003D003D003EE02700570057002B0003003D00FD007E + 0001031F03FF00FF0001068D06FD017E00030FC70FFF03FFFFC71EE11EFD077E + FFE73FF13FFF0FFFFFFF555155550AAAFFFFFFFF0001FFFEFFFFF0010003FE7C + FFFFF8010007FE39E30FFC01000EFF93E3078001001CFF87E317C0010038FFC7 + F11FE0010070C183F11FF00100E0C733F91FF80101C0C273D91FFC010200D0F3 + C007CE090401D8E3E007CF0D0C03F007E007038F1C03F60FFFFF03CF3C03E7FF + FFFFCFEF7C07CFFFFFFFCFFFFE0F9FFFFFFFFFFFFFFFFFFFFFFFF0012AA9F001 + F01FF8017EFDF801F83FFC01FEFFFC01FEFFFE017EFD80018EE3FF01FEFFC001 + 06C1FF817EFDE001FEFFFFC1FEFFF00176DDB3A10001F801FEFFBB71FEF3FC01 + AEEBBCF97EE5CE09FEFF84FDFECFCF0DDEF7B77F7E9D038FE00F87BFFE3F03CF + FEFFFFFF7E7DCFEFFFFFFFFF2AA9CFFFFFFFFFFFFFFFFFFFF0010EE1803FFC01 + F8017C7D803FFC01FC01783D803FFC01FE017EFD8003C001FF01FEFF80038001 + FF81DEF780038001FFC19EF380038001B3A1000180038001BB719EF380038003 + BCF9DEF78003800784FDFEFF80038007BF7F7EFDF807800783BF783DF80F8007 + FFFF7C7DF81FC00FFFFF0EE1FFFFF87FFFFFFEFFFFF7FFFFFEFFFEFFFEF7FEFF + FFFFFEFFFFF7FFFFFEFFFABFFEF7FEFFFFFFFC7FFFD5FFFFFEFFEEFFFEE3FEFB + FFFFF47FFFF7FFFDAA020002AA02AA00FEE7F467FEE7FEE5FECFEECFFECFFECB + FE9FFE9FF69FFE9FFE3FFE3FFA3FFE3FFE7FFE7F007FFE7FFEFFFEFFFAFFFABF + FFFFFFFFF7FFFC7FFEFFFEFFFEFFFEFFFFFFFFFFFFFFFFFF83FFFFFFFFFFAAAB + 8001FFFFFFFFFFFD8001FF83C1FFBFFF8001FF83C1FFFFFD83FBF383C1CFB80F + C7F7E383C1C7FB9DC7EFC003C003BB3FC7DF8003C001FA7DC7BF8003C001B8FF + C77F8003C001F9FDC6FFC003C003BBFFC5FFE3FFFFC7FFFDC3FFF3FFFFCFBFFF + C7FFFFFFFFFFD555FFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFEDB7EFEF + FF7FFFFFEDB7EFEFE00FF3E78001EFEFE007E1E7EDB70001FF63C0E7EDB7EFEF + FF73F3E78001E02FFF73F3E7EDB7E02FFB730000EDB7602FF363F3E78001202F + E007F3E7EDB7602FE00FF1C7EDB7E02FF37FF80F80010001FB7FFC1FEDB7EFEF + FF7FFFFFEDB7EDEFFF7FFFFFFFFFE8EFFFFFFFFFFFFFFFFFFFFFC001FFFFFFFF + F00FC001FFFFFF87E007C0018181FE07C003C0018181F807C003C001C181C007 + C3C380018181C007C3C3C001C183C007C2438001C183FFFFC0C3C001E187FFFF + C0C38001E187C007C0C3C001F98FC007E0C78001F98FF007C0FFC001F99FF807 + FFFFAABFFFFFFE07FFFFFFFFFFFFFF87FFFFFFFFFFFFFFFFFFFFFFFFFF1FFEFF + FF9FF9FFFE1FFC7FFF8FF1FFEE1FF83FFFC7E3FFE03FFEFFFFE3C7FFE03FFEFF + FFE3C7FFE03FDEF7E0718E07E00F9EF3E0F18F07E01F0001E0718E07E03F9EF3 + E0218407E07FDEF7E0018007E0FFFEFFEC018037E1FFFEFFFE03C07FE3FFF83F + FF87E1FFE7FFFC7FFFFFFFFFEFFFFEFFFFFFFFFFFFFFFFFFC007F001F001F001 + C007F801F801F801C007FC01FC01FC01C007FE018001FE01C007FF01C001FF01 + C007F181E001CF01C007F1C1F001C641C007F1E1F801E061C0078031FC01F0F1 + C0078039FE09F0F9C007803DFF0DE07DC007F1FFFF8FC63FC00FF1FFFFCFCF3F + C01FF1FFFFEFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 + 000000000000} + end + object TrianglePopup: TPopupMenu + AutoPopup = False + Images = EditorTB + Left = 313 + Top = 113 + object mnuReset: TMenuItem + Caption = 'Reset triangle' + Hint = 'Reset triangle' + ImageIndex = 20 + OnClick = mnuResetTriangleClick + end + object N6: TMenuItem + Caption = '-' + end + object mnuDuplicate: TMenuItem + Caption = 'Duplicate' + Hint = 'Duplicate selected triangle' + ImageIndex = 2 + OnClick = mnuDupClick + end + object mnuDelete: TMenuItem + Caption = 'Delete' + Hint = 'Delete selected triangle' + ImageIndex = 3 + OnClick = mnuDeleteClick + end + object mnuAdd1: TMenuItem + Caption = 'Add' + Hint = 'Add new triangle' + ImageIndex = 1 + OnClick = mnuAddClick + end + object N21: TMenuItem + Caption = '-' + end + object mnuCopyTriangle: TMenuItem + Caption = 'Copy triangle coordinates' + ImageIndex = 26 + OnClick = btnCopyTriangleClick + end + object mnuPasteTriangle: TMenuItem + Caption = 'Paste triangle coordinates' + ImageIndex = 27 + OnClick = btnPasteTriangleClick + end + object N2: TMenuItem + Caption = '-' + end + object Rotatetriangle90CCW1: TMenuItem + Caption = 'Rotate triangle 90'#176' CCW' + ImageIndex = 17 + OnClick = btTrgRotateLeft90Click + end + object Rotatetriangle90CCW2: TMenuItem + Caption = 'Rotate triangle 90'#176' CW' + ImageIndex = 18 + OnClick = btTrgRotateRight90Click + end + object mnuFlipHorizontal: TMenuItem + Caption = 'Flip Horizontal' + Hint = 'Flip triangle horizontal' + ImageIndex = 10 + OnClick = mnuFlipHorizontalClick + end + object mnuFlipVertical: TMenuItem + Caption = 'Flip Vertical' + Hint = 'Flip triangle vertical' + ImageIndex = 11 + OnClick = mnuFlipVerticalClick + end + object N7: TMenuItem + Caption = '-' + end + object mnuResetTrgPosition: TMenuItem + Caption = 'Reset position' + ImageIndex = 21 + OnClick = btnOcoefsClick + end + object mnuResetTrgRotation: TMenuItem + Caption = 'Reset rotation' + ImageIndex = 22 + OnClick = mnuResetTrgRotationClick + end + object mnuResetTrgScale: TMenuItem + Caption = 'Reset scale' + ImageIndex = 23 + OnClick = mnuResetTrgScaleClick + end + object mnuResetTrgFlip: TMenuItem + Caption = 'Reset reflection' + ImageIndex = 40 + OnClick = mnuResetTrgFlipClick + end + end + object ChaosPopup: TPopupMenu + Left = 305 + Top = 177 + object mnuChaosViewTo: TMenuItem + Caption = 'View as "&to"' + Checked = True + RadioItem = True + OnClick = mnuChaosViewToClick + end + object mnuChaosViewFrom: TMenuItem + Caption = 'View as "&from"' + RadioItem = True + OnClick = mnuChaosViewFromClick + end + object N9: TMenuItem + Caption = '-' + end + object mnuChaosClearAll: TMenuItem + Caption = '&Clear all' + OnClick = mnuChaosClearAllClick + end + object mnuChaosSetAll: TMenuItem + Caption = '&Set all' + OnClick = mnuChaosSetAllClick + end + object ChaosClearBelow: TMenuItem + Caption = 'Clear all below selected' + OnClick = ChaosClearBelowClick + end + object ClearAllAbove: TMenuItem + Caption = 'Clear all above selected' + OnClick = ClearAllAboveClick + end + object InvertXaos: TMenuItem + Caption = 'Invert current settings' + OnClick = InvertXaosClick + end + object RandomizeChaos: TMenuItem + Caption = 'Randomize all' + OnClick = RandomizeMatrixClick + end + object N17: TMenuItem + Caption = '-' + end + object RandomizeMatrix: TMenuItem + Caption = 'Randomize matrix' + OnClick = RandomizeMatrixClick + end + object NormChaos: TMenuItem + Caption = 'Normalize transition matrix' + OnClick = NormChaosClick + end + object ResetChaos: TMenuItem + Caption = 'Reset transition matrix ' + OnClick = ResetChaosClick + end + object N10: TMenuItem + Caption = '-' + end + object mnuLinkPostxform: TMenuItem + Caption = 'Add linked post-transform' + OnClick = mnuLinkPostxformClick + end + object mnuLinkPrexform: TMenuItem + Caption = 'Add linked pre-transform' + OnClick = mnuLinkPrexformClick + end + object AddContainer: TMenuItem + Caption = 'Add container transform' + OnClick = AddContainerClick + end + object InheritWeights: TMenuItem + AutoCheck = True + Caption = 'Inherit weights' + Checked = True + end + object mnuChaosRebuild: TMenuItem + Caption = 'Rebuild xaos links' + Checked = True + Hint = 'Rebuild xaos links when deleting transforms' + OnClick = mnuChaosRebuildClick + end + object N19: TMenuItem + Caption = '-' + end + object ShowChaosMatrix: TMenuItem + Caption = 'Show chaos matrix...' + OnClick = btnFullChaosClick + end + end + object MathPopup: TPopupMenu + TrackButton = tbLeftButton + Left = 384 + Top = 176 + object Pifractions: TMenuItem + AutoHotkeys = maManual + Caption = 'Insert Pi fraction...' + object InsertPi1: TMenuItem + Caption = 'Insert Pi' + OnClick = InsertPi1Click + end + object Insert2Pi1: TMenuItem + Tag = 1 + Caption = 'Insert 2Pi' + OnClick = InsertPi1Click + end + object InsertPi21: TMenuItem + Tag = 2 + Caption = 'Insert Pi/2' + OnClick = InsertPi1Click + end + object InsertPi31: TMenuItem + Tag = 3 + Caption = 'Insert Pi/3' + OnClick = InsertPi1Click + end + object InsertPi41: TMenuItem + Tag = 4 + Caption = 'Insert Pi/4' + OnClick = InsertPi1Click + end + object InsertPi61: TMenuItem + Tag = 5 + Caption = 'Insert Pi/6' + OnClick = InsertPi1Click + end + end + object Squareroots1: TMenuItem + AutoHotkeys = maManual + Caption = 'Insert Square root...' + object Insert1sqrt21: TMenuItem + Tag = 7 + Caption = 'Insert 1/sqrt(2)' + OnClick = InsertPi1Click + end + object Insertsqrt321: TMenuItem + Tag = 8 + Caption = 'Insert sqrt(3)/2 ' + OnClick = InsertPi1Click + end + object Insertsqrt331: TMenuItem + Tag = 9 + Caption = 'Insert sqrt(3)/3' + OnClick = InsertPi1Click + end + object Insertsqrt361: TMenuItem + Tag = 6 + Caption = 'Insert sqrt(3)/6' + OnClick = InsertPi1Click + end + object Insertsqrt31: TMenuItem + Tag = 10 + Caption = 'Insert sqrt(3)' + OnClick = InsertPi1Click + end + end + object InsertGoldenratio1: TMenuItem + Tag = 11 + Caption = 'Insert Golden ratio' + OnClick = InsertPi1Click + end + object N12: TMenuItem + Caption = '-' + end + object InvCurrentNum: TMenuItem + Caption = 'Invert the number' + OnClick = InvCurrentNumClick + end + object Squarethenumber1: TMenuItem + Caption = 'Square the number' + OnClick = MulDiv2Click + end + object SquareRoot: TMenuItem + Tag = 3 + Caption = 'Square root of the number' + OnClick = MulDiv2Click + end + object Mul2: TMenuItem + Tag = 1 + Caption = 'Multiply by 2' + OnClick = MulDiv2Click + end + object Div2: TMenuItem + Tag = 2 + Caption = 'Divide by 2' + OnClick = MulDiv2Click + end + object N18: TMenuItem + Caption = '-' + end + object CalcCos: TMenuItem + Caption = 'Calculate cosine of the value' + OnClick = CalcCosClick + end + object CalcSin: TMenuItem + Tag = 1 + Caption = 'Calculate sine of the value' + OnClick = CalcCosClick + end + object CalcTan: TMenuItem + Tag = 2 + Caption = 'Calculate tangent of the value' + OnClick = CalcCosClick + end + object UseDegrees: TMenuItem + AutoCheck = True + Caption = 'Use degrees' + Checked = True + end + end + object CopyMenu: TPopupMenu + Left = 305 + Top = 241 + object Copytrianglecoordinates1: TMenuItem + Caption = 'Copy Triangle Coordinates' + OnClick = btnCopyTriangleClick + end + object Copytransform1: TMenuItem + Caption = 'Copy Whole Transform' + OnClick = Copytransform1Click + end + end + object PasteMenu: TPopupMenu + Left = 385 + Top = 233 + object Pastetrianglecoordinates1: TMenuItem + Caption = 'Paste Triangle Coordinates' + Enabled = False + OnClick = btnPasteTriangleClick + end + object Pastetransform1: TMenuItem + Caption = 'Paste Transform(s)' + Enabled = False + OnClick = Pastetransform1Click + end + end + object TriangleOperations: TPopupMenu + Left = 385 + Top = 305 + object RotateXYO: TMenuItem + AutoCheck = True + Caption = 'Rotate all vectors' + Checked = True + GroupIndex = 1 + RadioItem = True + OnClick = TriangleOperationsClick + end + object RotateX: TMenuItem + Tag = 1 + AutoCheck = True + Caption = 'Rotate only X-axis' + GroupIndex = 1 + RadioItem = True + OnClick = TriangleOperationsClick + end + object RotateY: TMenuItem + Tag = 2 + AutoCheck = True + Caption = 'Rotate only Y-axis' + GroupIndex = 1 + RadioItem = True + OnClick = TriangleOperationsClick + end + object RotateO: TMenuItem + AutoCheck = True + Caption = 'Rotate only O-vector' + GroupIndex = 1 + RadioItem = True + OnClick = TriangleOperationsClick + end + object N14: TMenuItem + Caption = '-' + GroupIndex = 2 + end + object ScaleXYO: TMenuItem + AutoCheck = True + Caption = 'Scale all vectors' + Checked = True + GroupIndex = 2 + RadioItem = True + OnClick = TriangleOperationsClick + end + object ScaleX: TMenuItem + Tag = 1 + AutoCheck = True + Caption = 'Scale only X-axis' + GroupIndex = 2 + RadioItem = True + OnClick = TriangleOperationsClick + end + object ScaleY: TMenuItem + Tag = 2 + AutoCheck = True + Caption = 'Scale only Y-axis' + GroupIndex = 2 + RadioItem = True + OnClick = TriangleOperationsClick + end + object ScaleO: TMenuItem + AutoCheck = True + Caption = 'Scale only O-vector' + GroupIndex = 2 + RadioItem = True + OnClick = TriangleOperationsClick + end + object N13: TMenuItem + Caption = '-' + GroupIndex = 2 + end + object RectGrid: TMenuItem + Caption = 'Move along a square lattice' + Checked = True + GroupIndex = 3 + RadioItem = True + OnClick = mnuChangeGridClick + end + object TriGrid: TMenuItem + Caption = 'Move along a triangular lattice' + GroupIndex = 3 + RadioItem = True + OnClick = mnuChangeGridClick + end + object N16: TMenuItem + Caption = '-' + GroupIndex = 5 + end + object InvertMovevalue1: TMenuItem + Caption = 'Invert current Move step' + GroupIndex = 5 + OnClick = InvertMovevalue1Click + end + object CalcArcsinScale: TMenuItem + Caption = 'Calculate arcsin of the scale factor' + GroupIndex = 5 + OnClick = CalcArcsinScaleClick + end + object N15: TMenuItem + Caption = '-' + GroupIndex = 5 + end + object ShowModVals: TMenuItem + AutoCheck = True + Caption = 'Display internally modified values' + GroupIndex = 5 + end + end + object IconsAV: TImageList + BkColor = clWhite + Left = 305 + Top = 304 + Bitmap = { + 494C01010A003000040010001000FFFFFF00FF10FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000003000000001002000000000000030 + 000000000000000000000000000000000000FFFFFF00FBFBFF00C7C7FF00A7A7 + FF00A4A4FF00A4A4FF00A6A6FF00D5D5FF00FDFDFF00FFFFFF00C8C8C8002828 + 280098989800FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00F6F6FF006A6AFF001010 + FF001D1DFF003434FF003C3CFF00A3A3FF00FCFCFF00F9F9F900848484001717 + 17005C5C5C00E4E4E400FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FCFCFF00A2A2FF001D1D + FF002A2AFF00A2A2FF00D1D1FF00E9E9FF00FFFFFF00D8D8D8003E3E3E001010 + 100026262600B0B0B000FCFCFC00FFFFFF00FFFFFF00C0864C00B0681F00A654 + 0000FFFFFF00A6540000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00EBEBFF007373 + FF001616FF006F6FFF00EFEFFF00FFFFFF00FFFFFF0090909000262526001A19 + 19001F1F1F0063636300F3F3F300FFFFFF00FFFFFF00C0874B00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00D9D9 + FF004D4DFF001B1BFF009A9AFF00F9F9FF00FFFFFF00CECDCD00898888003737 + 370070707000BABABA00FAFAFA00FFFFFF00FFFFFF00FFFFFF00B1691F00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FEFEFF00DFDFFF00BFBF + FF007777FF001010FF003232FF00CECEFF00FFFFFF00FFFFFF00D3D3D3004E4E + 4E00ABABAB00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A654 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FBFBFF009C9CFF003B3B + FF002D2DFF002525FF002C2CFF00BABAFF00FFFFFF00FFFFFF00D4D4D4005757 + 5700AFAFAF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00C0864B00B0681E00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FEFEFF00E4E4FF00C6C6 + FF00C2C2FF00C2C2FF00C6C6FF00EEEEFF00FFFFFF00FFFFFF00D7D6D6006262 + 6200B4B4B400FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FEFCFB00F6E1D100F8E4 + D500FFFDFB00FFFFFD00F9E8DA00F4DDCB00FDFAF700FFFFFF00D9D9D9006D6D + 6D00B9B9B900FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FCF8F400DC9B6700D68A + 4C00F2DAC600F5E3D400D9925900D78C4F00FAEFE700FFFFFF00DDDDDC007979 + 7900BFBFBF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00C1864C00B1691F00A654 + 0000FFFFFF00A6540000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FEFCFA00E4B18800CA67 + 1700D0793200D27D3800C9621000DD9D6A00FCF6F200FFFFFF00E0E0DF008585 + 8400C4C5C400FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B1691F00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00F1D6C000CD70 + 2400CE722800CF752D00C9641200EBC4A500FFFEFE00FFFFFF00E3E3E2009191 + 9000CACACA00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B1681E00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00F9EDE300D88F + 5400CF752C00D0773000D27F3B00F5E2D300FFFFFF00FFFFFF00E6E6E6009D9D + 9D00D0D0D000FFFFFF00FFFFFF00FFFFFF00FFFFFF00C1874B00B0681E00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FEFCFA00E5B4 + 8C00C8600C00C65B0500DD9D6A00FCF8F400FFFFFF00FFFFFF00E9E9E900A9A9 + A900D6D6D600FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B1691F00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00F0D4 + BD00CF752D00CC6B1D00EAC3A300FFFFFF00FFFFFF00FFFFFF00ECECEC00B8B8 + B800DCDCDC00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FBF5 + EF00EFD2BA00EDCCB100FAF0E800FFFFFF00FFFFFF00FFFFFF00F9F9F900E7E7 + E700F3F3F300FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF007A9DB8001D5887007A9D + B800F2F5F800FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF007A9DB8001D5887007A9D + B800F2F5F800FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF007A9DB8001D5887007A9D + B800F2F5F800FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF007A9DB8001D5887007A9D + B800F2F5F800FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001D58870056A2D600387B + AC0095B0C700FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001D58870056A2D600387B + AC0095B0C700FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001D58870056A2D600387B + AC0095B0C700FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001D58870056A2D600387B + AC0095B0C700FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001D58870056A2D600458C + BE00608AAB00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001D58870056A2D600458C + BE00608AAB00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001D58870056A2D600458C + BE00608AAB00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001D58870056A2D600458C + BE00608AAB00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00407299004D97CA0056A2 + D6001D588700FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00407299004D97CA0056A2 + D6001D588700FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00407299004D97CA0056A2 + D6001D588700FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00407299004D97CA0056A2 + D6001D588700FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0086A5BF003C80B10056A2 + D6001D588700FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF007EA0BB003C80B10056A2 + D6001D588700FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0086A5BF003C80B10056A2 + D6001D588700FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0086A5BF003C80B10056A2 + D6001D588700FFFFFF00FFFFFF00FFFFFF00CCA97D00D7821F00EC860B00EA85 + 0B00D9861800BD925800FFFFFF00FFFFFF00FFFFFF00C4D3DF002C6B9C0056A2 + D6001D588700FFFFFF00FFFFFF00FFFFFF006F955B003CA3450033B2470033B1 + 470038A54700558B4C00FFFFFF00FFFFFF00FFFFFF00B4C7D7002C6B9C0056A2 + D6001D588700FFFFFF00FFFFFF00FFFFFF00DA9CC200E354AD00F444AF00F244 + AE00E64EA700CF80AE00FFFFFF00FFFFFF00FFFFFF00C4D3DF002C6B9C0056A2 + D6001D588700FFFFFF00FFFFFF00FFFFFF007D86CC001F36D7000B25EC000B25 + EA00182AD9005861BD00FFFFFF00FFFFFF00FFFFFF00C4D3DF002C6B9C0056A2 + D6001D588700FFFFFF00FFFFFF00FFFFFF00F9A43F00FED49400FFDBA300FFDA + A200FEE1B200F9AA3500EC8D0D00D8AC6E00FEEFD800EFCD9C00161D3200539E + D4002B6A9A00C8D6E200FFFFFF00FFFFFF00829D4B009BDEA500A3E0AA00A3E0 + AA00ABE3B1006ACD7B0035B34C006FAA6800D3E7C100C5CC9800161D3200539E + D4002B6A9A00C8D6E200FFFFFF00FFFFFF00FD6BC500FFADDC00FFBAE000FFB9 + E000FFC4E500FD64BB00F445AA00E390C000FEE1F200F4B3D900281C2B007998 + D2002B6A9A00C8D6E200FFFFFF00FFFFFF003F56F900949BFE00A3A8FF00A2A8 + FF00B2B6FE003543F9000D21EC006E76D800D8DBFE009CA3EF00161D3200539E + D4002B6A9A00C8D6E200FFFFFF00FFFFFF00F1A85500FFD79B00FFBA5000FFB8 + 4900FFCC7C00FFDDA900FFE6C000FCD6A000F2B75A00F9B65000ABB2AD0056A2 + D6003A7EB0008BA9C100FFFFFF00FFFFFF00B49D5900AAE3B00063CE77005FCD + 740080D68E00A7E3AF00B4E7B900A3E0AB0068C5750078C77100ACB3AC0056A2 + D6003A7EB0008BA9C100FFFFFF00FFFFFF00F77CC900FFB4DE00FF7BC500FF76 + C100FF9CD300FFBEE200FFD0EA00FEB6DF00F780C300FC78C200EF82BF00A396 + D1003A7EB0008BA9C100FFFFFF00FFFFFF00556AF1009BA1FF00505BFF004953 + FF007C83FF00A9AEFF00C0C4FF00A0A7FC005A63F200505BF9005E67C00056A2 + D6003A7EB0008BA9C100FFFFFF00FFFFFF00E5B98700FED49500FFCC7D00FFBE + 5C00FFBF5E00FFCF8500FFDDAA00FFF3DF00FFE5BD00FFE2B500ADA78F0056A2 + D6004692C70043749B00FFFFFF00FFFFFF00C4AD8500A0D3A90090DB9B006AD0 + 7D006CD17E0086D994009EE0A700C5ECC700B4E6B900B0E6B7008DAB900056A2 + D6004692C70043749B00FFFFFF00FFFFFF00ECA3D100FFAFDB00FF9DD400FF84 + CA00FF86CA00FFA3D600FFBFE300FFE7F400FFCDE900FFD3EC00E1B7CE007A9D + D3004692C70043749B00FFFFFF00FFFFFF008793E500959CFE007D85FF005C67 + FF005E68FF00858CFF00AAB0FF00DFE0FF00BDC1FF00B5B9FF009898D10056A2 + D6004692C70043749B00FFFFFF00FFFFFF00E7D2BA00FBAB3100FFD99D00FFBC + 5400FFBE5700FFCD8200FFDCA500FFEBCD00FFE3B700FFD79A00D9C39900428C + C0007DB7DF001D588700FFFFFF00FFFFFF00CBC2B100479A5C00A2E1AB0066CF + 7A0068CF7C0084D892009BDFA500B6E7BA00A8E3B00095DEA1009DC9A200428C + C0007DB7DF001D588700FFFFFF00FFFFFF00EDCBE000FF61BA00FFB5DE00FF7E + C700FF81C700FFA1D600FFBBE100FFD9EE00FFC9E700FFC3E500F4BCDB00438C + C0007DB7DF001D588700FFFFFF00FFFFFF00BAC0E700313FFB009DA2FF00545E + FF005760FF00828AFF00A5AAFF00CDD0FF00B7BBFF009AA0FF00999AD900428C + C0007DB7DF001D588700FFFFFF00FFFFFF00F0E9E000FAA93700FFD79B00FFBA + 5100FFBA5000FFCD8100FFDA9F00FFE8C400FFE8C500FFD89D00F0C173003579 + AC006EAFDB001D588700FFFFFF00FFFFFF00F0E9E0004B965600A1E0A90064CF + 780064CF780084D8920097DEA300B0E6B700B2E6B70098DFA3008ECF96003579 + AC006EAFDB001D588700FFFFFF00FFFFFF00F4E7EF00FD65BD00FFB4DF00FF7C + C600FF7BC500FFA0D600FFB7DF00FFD3EB00FFD3EC00FFC5E500FDA4D6003579 + AC006EAFDB001D588700FFFFFF00FFFFFF00E0E1F0003747FA009BA2FF00515C + FF00505BFF008189FF009FA4FF00C4C7FF00C5C9FF009DA3FF007378F0003579 + AC006EAFDB001D588700FFFFFF00FFFFFF00FAF8F600F9A74300FFD79B00FFD9 + 9F00FFD89B00FFE3B800FFE9C800FFE2B600FFEDD100FFD99F00FFD59500356E + 97008FC1E400215F8F00E8EEF300FFFFFF00FAF8F60062925500BDE9C000B8E7 + BC00B7E7BC00C1EBC300C6ECC800A8E3B000BAE8BE0099DFA400A7DC9E00356E + 97008FC1E400215F8F00E8EEF300FFFFFF00FBF8FA00FD6EC600FFB4DF00FFB7 + DF00FFB4DD00FFCAE800FFD6ED00FFC8E700FFDCF000FFC6E600FFBFE300356E + 97008FC1E400215F8F00E8EEF300FFFFFF00F6F7FA004358F9009BA2FF009FA5 + FF009BA0FF00B8BCFF00C8CCFF00B6BBFF00D1D4FF009FA5FF00959CFF00356E + 97008FC1E400215F8F00E8EEF300FFFFFF00FEFEFD00F8AC5600F5860A00F585 + 0400F5870400F5890300FCD19300FFEFD700FFF6E700FFECCD00FFE9C700A0B4 + C00086BCE2002E72A400A8BFD100FFFFFF00FEFEFD009A9A640034A54C0031A6 + 4C0031A64D0030A64D0082C29600C3EBC600C9EDCB00B9E9BF00B7E7BC00A0B4 + C00086BCE2002E72A400A8BFD100FFFFFF00FEFEFE00FC7DCE00FA43B700FA3E + B500FA3EB300FA3DB100FEACDA00FFE1F200FFEDF700FFE2F200FFDEF000A0B4 + C00086BCE2002E72A400A8BFD100FFFFFF00FDFDFE00566CF8000A2AF5000424 + F5000421F500031EF500939BFC00D7DAFF00E7E8FF00CDCFFF00C7CAFF00A0B4 + C00086BCE2002E72A400A8BFD100FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00E98C0C00FAB75100FEE9CB00FEDDAC00FCAB3100D794 + 2E00EFF7FB003684BB00608AAB00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0035A052005EB77900BFE9C200AEE4B6006DD180004794 + 5300EFF7FB003684BB00608AAB00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00F144A900FD79C400FED7EE00FFCFEA00FF78C700D265 + A800EFF7FB003684BB00608AAB00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF000C1FE900515CFA00CBCFFE00ACB2FE00313EFC002E39 + D700EFF7FB003684BB00608AAB00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00F3F0EB00C39F6F00CB924000CA8E4000C39C690082A0 + B6001D588700608AAB00BDCFDC00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00DFE3D9005D835C004B8E56004E994E0062905400698D + A7001D588700608AAB00BDCFDC00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00F6F0F300D391B800DA6DAB00F273BE00E374A60082A0 + B6001D588700608AAB00BDCFDC00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00EBECF3006F76C300404BCB00404ECA006972C30082A0 + B6001D588700608AAB00BDCFDC00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF004040400000000000C0C0C000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080808000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000080808000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF000000000080808000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF002D2D2D005F5F5F00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000080808000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00808080000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF004A4A4A00000000009A9A9A00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0017171700000000003E3E3E00A0A0A000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000080808000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0000000000000000000000000080808000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF009C9C9C000404040029292900C0C0C000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00353535000000000000000000161616006D6D6D00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000080808000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008080800000000000000000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00363636000000000070707000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0036363600000000000202020000000000020202003535350097979700FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000080808000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00000000000000000000000000000000000000000080808000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF009A9A9A000000000023232300ADADAD00FFFFFF00FFFF + FF00A1A1A100FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00414141000000000000000000010101000E0E0E00191919003D3D3D007C7C + 7C00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF008080 + 8000C0C0C000FFFFFF00FFFFFF00000000000000000080808000FFFFFF00FFFF + FF0040404000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0080808000000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF004A4A4A00000000005E5E5E00FFFFFF009494 + 940064646400FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF004B4B4B000000000001010100020202003A3A3A0090909000B8B8B800A5A5 + A500FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF000000000040404000C0C0C000000000000000000080808000808080000000 + 000080808000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000000000008080 + 8000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00BDBDBD00000000001F1F1F00797979003535 + 350045454500FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0050505000121212004343430014141400282828009B9B9B00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00808080000000000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF008080 + 80000000000080808000808080000000000000000000C0C0C000404040000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005C5C5C0000000000090909000000 + 000041414100FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF005959590051515100BCBCBC0054545400030303004C4C4C00C5C5C500FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF000000000000000000000000000000000000000000000000008080 + 8000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004040 + 4000FFFFFF00FFFFFF00808080000000000000000000FFFFFF00FFFFFF00C0C0 + C00080808000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00AAAAAA005C5C5C004C4C4C003030300000000000000000000000 + 00003A3A3A00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0086868600ACACAC00FFFFFF00A8A8A8001E1E1E001515150085858500FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00808080000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00808080000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0089898900383838000000000000000000010101000000 + 000034343400FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0063636300030303003A3A3A00B7B7 + B700FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF000000000000000000000000000000000080808000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00808080000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00606060001C1C1C00000000000000 + 00002D2D2D00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00BBBBBB002B2B2B00080808007878 + 7800FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0080808000000000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00808080000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00999999003B3B3B000202 + 020021212100FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0079797900050505004A4A + 4A00A1A1A100FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000080808000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00808080000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00C1C1C1005F5F + 5F0034343400FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005B5B5B000202 + 020000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF008080800000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00808080000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00A6A6A600FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0045454500B1B1 + B100FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0080808000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00C0C0C0000000000040404000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00424D3E000000000000003E000000 + 2800000040000000300000000100010000000000800100000000000000000000 + 000000000000000000000000FFFFFF008047FFFF000000008003FFFF00000000 + 80818BFF00000000C181BFFF00000000E081DE000000000080C7EFFF00000000 + 80C79FFF0000000080C7FFFF000000008047FFFF0000000080478BFF00000000 + 8047DFFF00000000C047DE0000000000C0C79FFF00000000C0C7DFFF00000000 + E1C7FFFF00000000E1C7FFFF00000000FF87FF87FF87FF87FF87FF87FF87FF87 + FF87FF87FF87FF87FF87FF87FF87FF87FF87FF87FF87FF870387038703870387 + 0003000300030003000300030003000300030003000300030003000300030003 + 000300030003000300010001000100010001000100010001FC01FC01FC01FC01 + FC01FC01FC01FC01FFFFFFFFFFFFFFFFFE3FFEFFFFFFFFFFFE3FFE7FFFFFF3FF + FE3FFC7FF8FFF0FFFE3FFC3FF87FF07FFE3FF83FFC7FF01FFE3FF81FFC37F00F + E637F01FFE27F00FF007F00FFE07F03FF00FE00FFF07F01FF80FEC67F807F21F + F81FFC7FFC07FF0FFC1FFC7FFF07FF0FFC3FFC7FFF87FF87FE3FFC7FFFC7FFC7 + FE7FFC7FFFF7FFCFFF7FFC7FFFFFFFFF00000000000000000000000000000000 + 000000000000} + end +end diff --git a/Forms/Editor.pas b/Forms/Editor.pas new file mode 100644 index 0000000..9050180 --- /dev/null +++ b/Forms/Editor.pas @@ -0,0 +1,7659 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +//{$D-,L-,O+,Q-,R-,Y-,S-} + +unit Editor; + +//{$define VAR_STR} + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + ExtCtrls, StdCtrls, ComCtrls, Math, Menus, ToolWin, Registry, + Grids, ValEdit, Buttons, ImgList, Types, StrUtils , Curves, + ControlPoint, XForm, cmap, CustomDrawControl, ClipBrd, + RenderingInterface, Translation, RenderThread, System.ImageList, + Vcl.Samples.Spin; + +type + TEditForm = class(TForm) + StatusBar: TStatusBar; + EditPopup: TPopupMenu; + mnuAdd: TMenuItem; + mnuAutoZoom: TMenuItem; + N1: TMenuItem; + mnuUndo: TMenuItem; + mnuRedo: TMenuItem; + QualityPopup: TPopupMenu; + mnuLowQuality: TMenuItem; + mnuMediumQuality: TMenuItem; + mnuHighQuality: TMenuItem; + N3: TMenuItem; + mnuResetLoc: TMenuItem; + N4: TMenuItem; + mnuFlipVertical: TMenuItem; + mnuFlipHorizontal: TMenuItem; + mnuFlipAllV: TMenuItem; //AV + mnuFlipAllH: TMenuItem; // AV + EditorToolBar: TToolBar; + tbAdd: TToolButton; + tbDuplicate: TToolButton; + tbDelete: TToolButton; + ToolButton4: TToolButton; + tbMove: TToolButton; + tbRotate: TToolButton; + ToolButton1: TToolButton; + tbUndo: TToolButton; + tbRedo: TToolButton; + tbScale: TToolButton; + tbFlipHorz: TToolButton; + tbFlipVert: TToolButton; + tbSelect: TToolButton; + EditorTB: TImageList; + tbResetAll: TToolButton; + ToolButton2: TToolButton; + tbVarPreview: TToolButton; + tbEnableFinalXform: TToolButton; + ToolButton3: TToolButton; + TrianglePopup: TPopupMenu; + mnuDuplicate: TMenuItem; + mnuDelete: TMenuItem; + mnuAdd1: TMenuItem; + N2: TMenuItem; + mnuShowVarPreview: TMenuItem; + mnuReset: TMenuItem; + N6: TMenuItem; + Rotatetriangle90CCW1: TMenuItem; + Rotatetriangle90CCW2: TMenuItem; + mnuResetTrgRotation: TMenuItem; + mnuResetTrgPosition: TMenuItem; + mnuResetTrgScale: TMenuItem; + N7: TMenuItem; + mnuExtendedEdit: TMenuItem; + N8: TMenuItem; + mnuAxisLock: TMenuItem; + mnuSelectmode: TMenuItem; + ToolButton6: TToolButton; + tbPivotMode: TToolButton; + tbRotate90CCW: TToolButton; + tbRotate90CW: TToolButton; + tbPostXswap: TToolButton; + oggleposttriangleediting1: TMenuItem; + mnuCopyTriangle: TMenuItem; + mnuPasteTriangle: TMenuItem; + ChaosPopup: TPopupMenu; + mnuChaosViewTo: TMenuItem; + mnuChaosViewFrom: TMenuItem; + N9: TMenuItem; + mnuChaosClearAll: TMenuItem; + mnuChaosSetAll: TMenuItem; + N10: TMenuItem; + mnuLinkPostxform: TMenuItem; + mnuLinkPrexform: TMenuItem; + mnuChaosRebuild: TMenuItem; + tbPostLink: TToolButton; + ToolButton8: TToolButton; + tbCopy: TToolButton; + tbPaste: TToolButton; + ToolButton11: TToolButton; + EditPnl: TPanel; + Splitter1: TSplitter; + GrphPnl: TPanel; + RightPanel: TPanel; + Splitter2: TSplitter; + ControlPanel: TPanel; + cbTransforms: TComboBox; + PageControl: TPageControl; + TriangleTab: TTabSheet; + TriangleScrollBox: TScrollBox; + TrianglePanel: TPanel; + TriangleToolBar: TToolBar; + tbCopyTriangle: TToolButton; + tbPasteTriangle: TToolButton; + tbExtendedEdit: TToolButton; + tbAxisLock: TToolButton; + tbAutoWeights: TToolButton; + tb2PostXswap: TToolButton; + tabXForm: TTabSheet; + tabColors: TTabSheet; + tabVariations: TTabSheet; + VEVars: TValueListEditor; + bClear: TBitBtn; + TabVariables: TTabSheet; + vleVariables: TValueListEditor; + chkCollapseVariables: TCheckBox; + TabChaos: TTabSheet; + vleChaos: TValueListEditor; + optFrom: TRadioButton; + optTo: TRadioButton; + txtP: TEdit; + pnlWeight: TPanel; + Panel1: TPanel; + txtName: TEdit; + Panel2: TPanel; + PrevPnl: TPanel; + PreviewImage: TImage; + GroupBox5: TGroupBox; + btTrgRotateLeft90: TSpeedButton; + btTrgRotateRight90: TSpeedButton; + btTrgScaleDown: TSpeedButton; + btTrgScaleUp: TSpeedButton; + btTrgMoveDown: TSpeedButton; + btTrgMoveLeft: TSpeedButton; + btTrgMoveRight: TSpeedButton; + btTrgMoveUp: TSpeedButton; + btTrgRotateLeft: TSpeedButton; + btTrgRotateRight: TSpeedButton; + txtTrgScaleValue: TComboBox; + txtTrgRotateValue: TComboBox; + txtTrgMoveValue: TComboBox; + GroupBox6: TGroupBox; + LabelC: TLabel; + LabelA: TLabel; + LabelB: TLabel; + txtAx: TEdit; + txtAy: TEdit; + txtBx: TEdit; + txtBy: TEdit; + txtCx: TEdit; + txtCy: TEdit; + ScrollBox1: TScrollBox; + GroupBox9: TGroupBox; + btnXcoefs: TSpeedButton; + btnYcoefs: TSpeedButton; + btnOcoefs: TSpeedButton; + btnResetCoefs: TSpeedButton; + txtA: TEdit; + txtB: TEdit; + txtC: TEdit; + txtD: TEdit; + txtE: TEdit; + txtF: TEdit; + spinA: TSpinButton; + spinB: TSpinButton; + spinC: TSpinButton; + spinD: TSpinButton; + spinE: TSpinButton; + spinF: TSpinButton; + GroupBox7: TGroupBox; + btnCoefsPolar: TSpeedButton; + btnCoefsRect: TSpeedButton; + GroupBox8: TGroupBox; + btnXpost: TSpeedButton; + btnYpost: TSpeedButton; + btnOpost: TSpeedButton; + btnResetPostCoefs: TSpeedButton; + txtPost00: TEdit; + txtPost01: TEdit; + txtPost10: TEdit; + txtPost11: TEdit; + txtPost20: TEdit; + txtPost21: TEdit; + spinPost00: TSpinButton; + spinPost01: TSpinButton; + spinPost10: TSpinButton; + spinPost11: TSpinButton; + spinPost20: TSpinButton; + spinPost21: TSpinButton; + chkAutoZscale: TCheckBox; + ScrollBox2: TScrollBox; + GroupBox1: TGroupBox; + pnlSymmetry: TPanel; + pnlXFormColor: TPanel; + shColor: TShape; + txtXFormColor: TEdit; + txtSymmetry: TEdit; + ColorBar: TPanel; + ColorBarPicture: TImage; + scrlXFormColor: TScrollBar; + pnlOpacity: TPanel; + txtOpacity: TEdit; + chkXformSolo: TCheckBox; + pnlDC: TPanel; + txtDC: TEdit; + GroupBox2: TGroupBox; + Label1: TLabel; + Label2: TLabel; + Label3: TLabel; + trkVarPreviewDensity: TTrackBar; + trkVarPreviewRange: TTrackBar; + trkVarPreviewDepth: TTrackBar; + ImgTemp: TImage; + N11: TMenuItem; + mnuEHighQuality: TMenuItem; + mnuEMediumQuality: TMenuItem; + mnuELowQuality: TMenuItem; + Label4: TLabel; + txtSearchBox: TEdit; + ToolButton5: TToolButton; + btnMathPopup: TToolButton; + tbPreLink: TToolButton; + btnFullChaos: TToolButton; + btnResetSearch: TSpeedButton; + GroupBox3: TGroupBox; + btnResetPivot: TSpeedButton; + btnPickPivot: TSpeedButton; + btnPivotMode: TSpeedButton; + editPivotY: TEdit; + editPivotX: TEdit; + MathPopup: TPopupMenu; + InsertPi1: TMenuItem; + Insert2Pi1: TMenuItem; + InsertPi21: TMenuItem; + InsertPi31: TMenuItem; + InsertGoldenratio1: TMenuItem; + InsertPi41: TMenuItem; + InsertPi61: TMenuItem; + Insertsqrt321: TMenuItem; + Insertsqrt331: TMenuItem; + Pifractions: TMenuItem; + Insert1sqrt21: TMenuItem; + CopyMenu: TPopupMenu; + PasteMenu: TPopupMenu; + Copytrianglecoordinates1: TMenuItem; + Copytransform1: TMenuItem; + Pastetrianglecoordinates1: TMenuItem; + Pastetransform1: TMenuItem; + Squareroots1: TMenuItem; + Insertsqrt361: TMenuItem; + Insertsqrt31: TMenuItem; + TriangleOperations: TPopupMenu; + InvertMovevalue1: TMenuItem; + ShowModVals: TMenuItem; + tbTriangle: TToolButton; + InvCurrentNum: TMenuItem; + N12: TMenuItem; + ScaleX: TMenuItem; + ScaleY: TMenuItem; + N13: TMenuItem; + ScaleXYO: TMenuItem; + N14: TMenuItem; + RotateXYO: TMenuItem; + RotateX: TMenuItem; + RotateY: TMenuItem; + ScaleO: TMenuItem; + RotateO: TMenuItem; + GroupBox10: TGroupBox; + btnShowLine: TSpeedButton; + btnResetFlip: TSpeedButton; + btnFlip: TSpeedButton; + editFlipY: TEdit; + editFlipX: TEdit; + Label5: TLabel; + Label6: TLabel; + Label7: TLabel; + Label8: TLabel; + lblGridType: TLabel; + GridComboBox: TComboBox; + Mul2: TMenuItem; + Div2: TMenuItem; + Squarethenumber1: TMenuItem; + RectGrid: TMenuItem; + TriGrid: TMenuItem; + N15: TMenuItem; + NormChaos: TMenuItem; + SpinPivotX: TSpinButton; + SpinPivotY: TSpinButton; + SpinFlipX: TSpinButton; + SpinFlipY: TSpinButton; + lblFlipAngle: TLabel; + RandomizeMatrix: TMenuItem; + btSwapCoefs: TButton; + CalcArcsinScale: TMenuItem; + N16: TMenuItem; + mnuFlipAllLine: TMenuItem; + btResetChaos: TButton; + ResetChaos: TMenuItem; + btClearChaos: TButton; + RandomizeChaos: TMenuItem; + N17: TMenuItem; + ChaosClearBelow: TMenuItem; + ClearAllAbove: TMenuItem; + btConjugate: TButton; + AddContainer: TMenuItem; + N18: TMenuItem; + CalcCos: TMenuItem; + CalcSin: TMenuItem; + CalcTan: TMenuItem; + UseDegrees: TMenuItem; + InheritWeights: TMenuItem; + InvertXaos: TMenuItem; + SquareRoot: TMenuItem; + btFlipX: TButton; + btFlipY: TButton; + btFlipDiag: TButton; + mnuResetTrgFlip: TMenuItem; + btChaos: TButton; + SpinXx: TSpinButton; + SpinYx: TSpinButton; + SpinOx: TSpinButton; + SpinXy: TSpinButton; + SpinYy: TSpinButton; + SpinOy: TSpinButton; + IconsAV: TImageList; + N19: TMenuItem; + ShowChaosMatrix: TMenuItem; + btnVarOrder: TBitBtn; + cbCollapseVariations: TComboBox; + btResetParams: TButton; + procedure btnResetSearchClick(Sender: TObject); + procedure txtSearchBoxKeyPress(Sender: TObject; var Key: Char); + // procedure txtSearchBoxChange(Sender: TObject); + procedure FormActivate(Sender: TObject); + procedure ScrollBox1Resize(Sender: TObject); + procedure ScrollBox2Resize(Sender: TObject); + procedure ControlPanelResize(Sender: TObject); + procedure TrianglePanelResize(Sender: TObject); + + procedure ValidateVariable; + procedure vleVariablesValidate(Sender: TObject; ACol, ARow: Integer; const KeyName, KeyValue: string); + procedure vleVariablesKeyPress(Sender: TObject; var Key: Char); + procedure vleVariablesExit(Sender: TObject); + + procedure FormCreate(Sender: TObject); + + procedure TriangleViewMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: integer); + procedure TriangleViewMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); + procedure TriangleViewMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); + procedure TriangleViewMouseWheel(Sender: TObject; Shift: TShiftState; + WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); + procedure TriangleViewDblClick(Sender: TObject); + procedure TriangleViewKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); + procedure TriangleViewKeyUp(Sender: TObject; var Key: Word; + Shift: TShiftState); + procedure TriangleViewExit(Sender: TObject); + procedure TriangleViewMouseLeave(Sender: TObject); + procedure TriangleViewInvalidate(Sender: TObject); + + procedure FormShow(Sender: TObject); + procedure mnuDeleteClick(Sender: TObject); + procedure mnuAddClick(Sender: TObject); + procedure mnuDupClick(Sender: TObject); + procedure mnuAutoZoomClick(Sender: TObject); + procedure btnCloseClick(Sender: TObject); + procedure FormResize(Sender: TObject); + procedure txtPKeyPress(Sender: TObject; var Key: Char); + procedure CornerEditKeyPress(Sender: TObject; var Key: Char); + procedure CornerEditExit(Sender: TObject); + procedure txtPExit(Sender: TObject); + procedure DrawPreview; + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure mnuUndoClick(Sender: TObject); + procedure mnuRedoClick(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure mnuLowQualityClick(Sender: TObject); + procedure mnuHighQualityClick(Sender: TObject); + procedure mnuMediumQualityClick(Sender: TObject); + procedure mnuResetLocClick(Sender: TObject); + procedure mnuFlipAllVClick(Sender: TObject); + procedure mnuFlipAllHClick(Sender: TObject); + procedure mnuFlipVerticalClick(Sender: TObject); + procedure mnuFlipHorizontalClick(Sender: TObject); + procedure cbTransformsChange(Sender: TObject); + procedure CoefKeyPress(Sender: TObject; var Key: Char); + procedure CoefValidate(Sender: TObject); + procedure scrlXFormColorScroll(Sender: TObject; + ScrollCode: TScrollCode; var ScrollPos: Integer); + procedure scrlXFormColorChange(Sender: TObject); +// procedure chkUseXFormColorClick(Sender: TObject); +// procedure chkHelpersClick(Sender: TObject); + procedure txtXFormColorExit(Sender: TObject); + procedure txtXFormColorKeyPress(Sender: TObject; var Key: Char); + procedure txtSymmetrySet(Sender: TObject); + procedure txtSymmetrKeyPress(Sender: TObject; var Key: Char); + procedure txtDCSet(Sender: TObject); + procedure txtDCKeyPress(Sender: TObject; var Key: Char); + procedure txtOpacitySet(Sender: TObject); + procedure txtOpacityKeyPress(Sender: TObject; var Key: Char); + + procedure btTrgRotateLeftClick(Sender: TObject); + procedure btTrgRotateRightClick(Sender: TObject); + procedure btTrgRotateLeft90Click(Sender: TObject); + procedure btTrgRotateRight90Click(Sender: TObject); + procedure TrgMove(dx, dy: double); + procedure btTrgMoveLeftClick(Sender: TObject); + procedure btTrgMoveRightClick(Sender: TObject); + procedure btTrgMoveUpClick(Sender: TObject); + procedure btTrgMoveDownClick(Sender: TObject); + procedure btTrgScaleUpClick(Sender: TObject); + procedure btTrgScaleDownClick(Sender: TObject); + procedure splitterMoved(Sender: TObject); + procedure tbSelectClick(Sender: TObject); + procedure EditKeyPress(Sender: TObject; var Key: Char); + procedure tbEditModeClick(Sender: TObject); + + procedure ValidateVariation; +// procedure ValidateValue(Sender: TObject); + procedure VEVarsKeyPress(Sender: TObject; var Key: Char); + procedure VEVarsChange(Sender: TObject); + procedure VEVarsValidate(Sender: TObject; ACol, ARow: Integer; + const KeyName, KeyValue: String); + procedure VEVarsMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure VEVarsMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure VEVarsMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure VEVarsDblClick(Sender: TObject); + + procedure cbTransformsDrawItem(Control: TWinControl; Index: Integer; + Rect: TRect; State: TOwnerDrawState); + + procedure tbFullViewClick(Sender: TObject); + + procedure EditKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); + procedure txtValidateValue(Sender: TObject); + procedure txtValKeyPress(Sender: TObject; var Key: Char); + procedure mnuResetTriangleClick(Sender: TObject); + procedure mnuResetAllClick(Sender: TObject); + procedure btnXcoefsClick(Sender: TObject); + procedure btnYcoefsClick(Sender: TObject); + procedure btnOcoefsClick(Sender: TObject); + procedure btnCoefsModeClick(Sender: TObject); + procedure tbVarPreviewClick(Sender: TObject); + procedure trkVarPreviewRangeChange(Sender: TObject); + procedure trkVarPreviewDensityChange(Sender: TObject); + procedure trkVarPreviewDepthChange(Sender: TObject); + procedure btnXpostClick(Sender: TObject); + procedure btnYpostClick(Sender: TObject); + procedure btnOpostClick(Sender: TObject); + procedure PostCoefValidate(Sender: TObject); + procedure PostCoefKeypress(Sender: TObject; var Key: Char); + procedure btnResetCoefsClick(Sender: TObject); + procedure btnResetPostCoefsClick(Sender: TObject); + procedure btnPivotModeClick(Sender: TObject); + procedure PivotValidate(Sender: TObject); + procedure PivotKeyPress(Sender: TObject; var Key: Char); + procedure btnResetPivotClick(Sender: TObject); + procedure btnPickPivotClick(Sender: TObject); + procedure VEVarsDrawCell(Sender: TObject; ACol, ARow: Integer; + Rect: TRect; State: TGridDrawState); + procedure tbEnableFinalXformClick(Sender: TObject); + procedure DragPanelMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure DragPanelMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure DragPanelMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure DragPanelDblClick(Sender: TObject); + procedure mnuResetTrgRotationClick(Sender: TObject); + procedure mnuResetTrgScaleClick(Sender: TObject); + procedure ResetAxisRotation(n: integer); + procedure ResetAxisScale(n: integer); + procedure tbExtendedEditClick(Sender: TObject); + procedure tbAxisLockClick(Sender: TObject); + procedure tbPostXswapClick(Sender: TObject); + procedure btnCopyTriangleClick(Sender: TObject); + procedure btnPasteTriangleClick(Sender: TObject); + procedure chkAutoZscaleClick(Sender: TObject); + procedure ValidateChaos; + procedure vleChaosExit(Sender: TObject); + procedure vleChaosKeyPress(Sender: TObject; var Key: Char); + procedure vleChaosValidate(Sender: TObject; ACol, ARow: Integer; + const KeyName, KeyValue: String); + procedure VleChaosDrawCell(Sender: TObject; ACol, ARow: Integer; + Rect: TRect; State: TGridDrawState); + procedure mnuChaosViewToClick(Sender: TObject); + procedure mnuChaosViewFromClick(Sender: TObject); + // procedure chkPlotModeClick(Sender: TObject); + procedure mnuChaosClearAllClick(Sender: TObject); + procedure mnuChaosSetAllClick(Sender: TObject); + procedure mnuLinkPostxformClick(Sender: TObject); + procedure mnuLinkPrexformClick(Sender: TObject); + procedure chkXformSoloClick(Sender: TObject); + procedure mnuChaosRebuildClick(Sender: TObject); + procedure chkCollapseVariationsClick(Sender: TObject); + procedure chkCollapseVariablesClick(Sender: TObject); + procedure shColorMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure shColorMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure shColorMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure bClearClick(Sender: TObject); + procedure ColorBarMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + // procedure btnLoadVVARClick(Sender: TObject); + procedure txtNameKeyPress(Sender: TObject; var Key: Char); + procedure txtNameExit(Sender: TObject); + procedure InsertPi1Click(Sender: TObject); + procedure Copytransform1Click(Sender: TObject); + procedure Pastetransform1Click(Sender: TObject); + procedure btResetparamsClick(Sender: TObject); + procedure SpinButtonDownClick(Sender: TObject); + procedure SpinButtonUpClick(Sender: TObject); + procedure InvertMovevalue1Click(Sender: TObject); + procedure InvCurrentNumClick(Sender: TObject); + procedure btnFlipClick(Sender: TObject); + procedure btnResetFlipClick(Sender: TObject); + procedure FlipPointKeyPress(Sender: TObject; var Key: Char); + procedure FlipPointValidate(Sender: TObject); + procedure btnShowLineClick(Sender: TObject); + procedure GridComboBoxChange(Sender: TObject); + procedure MulDiv2Click(Sender: TObject); + procedure NormChaosClick(Sender: TObject); + procedure RandomizeMatrixClick(Sender: TObject); + procedure btSwapCoefsClick(Sender: TObject); + procedure CalcArcsinScaleClick(Sender: TObject); + procedure mnuFlipAllLineClick(Sender: TObject); + procedure ResetChaosClick(Sender: TObject); + procedure ChaosClearBelowClick(Sender: TObject); + procedure ClearAllAboveClick(Sender: TObject); + procedure btConjugateClick(Sender: TObject); + procedure AddContainerClick(Sender: TObject); + procedure ResetToolsDblClick(Sender: TObject); + procedure CalcCosClick(Sender: TObject); + procedure InvertXaosClick(Sender: TObject); + procedure btFlipXYClick(Sender: TObject); + procedure AffineCoefsDblClick(Sender: TObject); + procedure mnuResetTrgFlipClick(Sender: TObject); + procedure btChaosClick(Sender: TObject); + procedure mnuChangeGridClick(Sender: TObject); +// procedure btnInvisibleClick(Sender: TObject); +// procedure btnSoloClick(Sender: TObject); + procedure ExtSysMenu(var Msg: TMessage); message WM_SysCommand; + procedure TriangleOperationsClick(Sender: TObject); + procedure btnFullChaosClick(Sender: TObject); + procedure btnVarOrderClick(Sender: TObject); + procedure FormShortCut(var Msg: TWMKey; var Handled: Boolean); // AV + private + TriangleView: TCustomDrawControl; + cmap: TColorMap; + PreviewDensity: double; + + viewDragMode, viewDragged: boolean; + editMode, oldMode, widgetMode: (modeNone, modeMove, modeRotate, modeScale, modePick); + modeHack: boolean; // for mouseOverEdge... + modeKey: word; + key_handled: boolean; + updating: boolean; + + MousePos: TPoint; // in screen coordinates + mouseOverTriangle, mouseOverEdge, mouseOverCorner, mouseOverWidget: integer; + mouseOverPos: TSPoint; + + Widgets: array[0..3] of array [0..2] of TSPoint; + xx, xy, yx, yy: double; + + varDragMode: boolean; + varDragIndex: integer; + varDragValue: double; + varDragPos, varDragOld: integer; + varMM: boolean; //hack? + pDragValue: ^double; + + SelectMode, ExtendedEdit, AxisLock: boolean; + showVarPreview: boolean; + ShowFlipLine: boolean; // AV + hasLinkX: boolean; // AV + + GraphZoom: double; + TriangleCaught, CornerCaught, EdgeCaught: boolean; + LocalAxisLocked: boolean; + oldSelected: integer; + SelectedCorner: integer; + HasChanged: boolean; + + oldTriangle: TTriangle; + gCenterX: double; + gCenterY: double; + + MemTriangle: TTriangle; + + oldx, oldy, olddist: double; + Pivot, FlipPoint, fl: TSPoint; + + VarsCache: array of double; // AV: now length is sets dynamically + // hack: to prevent slow valuelist redraw + // -JF- 64 wasn't big enough... buffer overrun + + BackgroundBmp : TBitmap; + Renderer : TRenderThread; + + pnlDragMode: boolean; + pnlDragPos, pnlDragOld: integer; + pnlDragValue: double; + + LastFocus: TEdit; + + procedure UpdateFlameX; + procedure UpdateFlame(DrawMain: boolean); + procedure UpdateWidgets; + procedure UpdateXformsList; + procedure UpdateVariationList; // AV + + procedure DeleteTriangle(t: integer); + + function GetPivot: TSPoint; overload; + function GetPivot(n: integer): TSPoint; overload; + + procedure ShowSelectedInfo; + procedure Scale(var fx, fy: double; x, y: integer); + + procedure TriangleViewPaint(Sender: TObject); + procedure AutoZoom; + + procedure KeyInput(str: string); + procedure CalcFlip; + function ValidNumField: boolean; inline; // AV: check active edit + public + cp: TControlPoint; + Render: TRenderer; + + // Accessible from scripter + SelectedTriangle: integer; // outside only for scripting + PivotMode: (pivotLocal, pivotWorld); + LocalPivot, WorldPivot: TSPoint; + + procedure UpdatePreview; + procedure UpdateDisplay(PreviewOnly: boolean = false); //(?) + + function GetTriangleColor(n: integer): TColor; + function LastTriangle: integer; + function InsideTriangle(x, y: double): integer; + + procedure ScriptGetPivot(var px, py: double); + // procedure InvokeResetAll; + procedure UpdateColorBar; + + procedure PaintBackground; + procedure CreateScreenShot; + procedure RedrawButtons; + end; + +const + {TrgColors: array[-1..13] of TColor = (clGray, + $0000ff, $00ffff, $00ff00, $ffff00, $ff0000, $ff00ff, $007fff, + $7f00ff, $55ffff, $ccffcc, $ffffaa, $ff7f7f, $ffaaff, $55ccff );} + TrgColors: array[-1..13] of TColor = (clGray, + $0000ff, $00cccc, $00cc00, $cccc00, $ff4040, $cc00cc, $0080cc, + $4f0080, $228080, $608060, $808050, $804f4f, $805080, $226080 ); + +var + EditForm: TEditForm; + +function ColorValToColor(c: TColorMap; index: double): TColor; +function FlipTriangleVertical(t: TTriangle): TTriangle; +function FlipTriangleHorizontal(t: TTriangle): TTriangle; +function RotateTriangle(t: TTriangle; rad: double): TTriangle; +function OffsetTriangle(t: TTriangle; range: double): TTriangle; +function ScaleTriangle(t: TTriangle; scale: double): TTriangle; +function RotateTriangleCenter(t: TTriangle; rad: double): TTriangle; +function RotateTrianglePoint(t: TTriangle; xr, yr: double; rad: double): TTriangle; +function Centroid(t: TTriangle): TSPoint; +function OffsetTriangleRandom(t: TTriangle): TTriangle; +function ScaleTriangleCenter(t: TTriangle; scale: double): TTriangle; +function ScaleTrianglePoint(t: TTriangle; x, y, scale: double): TTriangle; +// AV: new operations +function ScaleTriangleXY(t: TTriangle; axis: integer; scale: double): TTriangle; +function ScaleTriangleO(t: TTriangle; x, y, scale: double): TTriangle; +function RotateTriangleO(t: TTriangle; x, y, rad: double): TTriangle; +function RotateTriangleXY(t: TTriangle; axis: integer; rad: double): TTriangle; +function FlipTriangleLine(t: TTriangle; x, y, fx, fy: double): TTriangle; + +implementation + +uses + Main, Global, Adjust, Mutate, XformMan, Chaos, VarOrderForm; + +{$R *.DFM} + +{ Triangle transformations } + +function OffsetTriangleRandom(t: TTriangle): TTriangle; +var + r: integer; +begin + r := random(3); + Result.x[r] := t.x[r] + random - 0.5; + Result.y[r] := t.y[r] + random - 0.5; +end; + +function FlipTriangleVertical(t: TTriangle): TTriangle; +begin + Result := t; + Result.y[0] := -t.y[0]; + Result.y[1] := -t.y[1]; + Result.y[2] := -t.y[2]; +end; + +function FlipTriangleHorizontal(t: TTriangle): TTriangle; +begin + Result := t; + Result.x[0] := -t.x[0]; + Result.x[1] := -t.x[1]; + Result.x[2] := -t.x[2]; +end; + +function FlipTriangleLine(t: TTriangle; x, y, fx, fy: double): TTriangle; // AV +var + N: TSpoint; + N2: double; +begin + N.x := fy - y; + N.y := -(fx - x); + N2 := 2 / (N.x * N.x + N.y * N.y); + + Result.x[0] := t.x[0] - N2 *((t.x[0] - x) * N.x + (t.y[0] - y) * N.y)* N.x; + Result.y[0] := t.y[0] - N2 *((t.x[0] - x) * N.x + (t.y[0] - y) * N.y)* N.y; + Result.x[1] := t.x[1] - N2 *((t.x[1] - x) * N.x + (t.y[1] - y) * N.y)* N.x; + Result.y[1] := t.y[1] - N2 *((t.x[1] - x) * N.x + (t.y[1] - y) * N.y)* N.y; + Result.x[2] := t.x[2] - N2 *((t.x[2] - x) * N.x + (t.y[2] - y) * N.y)* N.x; + Result.y[2] := t.y[2] - N2 *((t.x[2] - x) * N.x + (t.y[2] - y) * N.y)* N.y; +end; + +function ScaleTriangle(t: TTriangle; scale: double): TTriangle; +begin + Result.y[0] := scale * t.y[0]; + Result.y[1] := scale * t.y[1]; + Result.y[2] := scale * t.y[2]; + Result.x[0] := scale * t.x[0]; + Result.x[1] := scale * t.x[1]; + Result.x[2] := scale * t.x[2]; +end; + +function ScaleTriangleXY(t: TTriangle; axis: integer; scale: double): TTriangle; // AV +begin + Result := t; + if scale < 1e-64 then Exit; + Result.x[axis] := scale * (t.x[axis] - t.x[1]) + t.x[1]; + Result.y[axis] := scale * (t.y[axis] - t.y[1]) + t.y[1]; +end; + +function ScaleTriangleO(t: TTriangle; x, y, scale: double): TTriangle; // AV +begin + Result.x[1] := scale * (t.x[1] - x) + x; + Result.y[1] := scale * (t.y[1] - y) + y; + Result.x[0] := t.x[0] - t.x[1] + Result.x[1]; + Result.y[0] := t.y[0] - t.y[1] + Result.y[1]; + Result.x[2] := t.x[2] - t.x[1] + Result.x[1]; + Result.y[2] := t.y[2] - t.y[1] + Result.y[1]; +end; + +function RotateTriangleO(t: TTriangle; x, y, rad: double): TTriangle; +begin + Result.x[1] := x + (t.x[1] - x) * cos(rad) - (t.y[1] - y) * sin(rad); + Result.y[1] := y + (t.x[1] - x) * sin(rad) + (t.y[1] - y) * cos(rad); + Result.x[0] := t.x[0] - t.x[1] + Result.x[1]; + Result.y[0] := t.y[0] - t.y[1] + Result.y[1]; + Result.x[2] := t.x[2] - t.x[1] + Result.x[1]; + Result.y[2] := t.y[2] - t.y[1] + Result.y[1]; +end; + +function RotateTriangleXY(t: TTriangle; axis: integer; rad: double): TTriangle; // AV +begin + Result := t; + Result.x[axis] := t.x[1] + (t.x[axis] - t.x[1]) * cos(rad) - (t.y[axis] - t.y[1]) * sin(rad); + Result.y[axis] := t.y[1] + (t.x[axis] - t.x[1]) * sin(rad) + (t.y[axis] - t.y[1]) * cos(rad); +end; + +function Centroid(t: TTriangle): TSPoint; +begin + Result.x := (t.x[0] + t.x[1] + t.x[2]) / 3; + Result.y := (t.y[0] + t.y[1] + t.y[2]) / 3; +end; + +function ScaleTriangleCenter(t: TTriangle; scale: double): TTriangle; +var + xr, yr: double; + z: TSPoint; +begin + assert(scale <> 0); + + z := Centroid(t); + xr := z.x; + yr := z.y; + Result.y[0] := scale * (t.y[0] - yr) + yr; + Result.y[1] := scale * (t.y[1] - yr) + yr; + Result.y[2] := scale * (t.y[2] - yr) + yr; + Result.x[0] := scale * (t.x[0] - xr) + xr; + Result.x[1] := scale * (t.x[1] - xr) + xr; + Result.x[2] := scale * (t.x[2] - xr) + xr; +end; + +function ScaleTrianglePoint(t: TTriangle; x, y, scale: double): TTriangle; +begin + //assert(scale <> 0); + if scale = 0 then scale := 1e-64; + + Result.y[0] := scale * (t.y[0] - y) + y; + Result.y[1] := scale * (t.y[1] - y) + y; + Result.y[2] := scale * (t.y[2] - y) + y; + Result.x[0] := scale * (t.x[0] - x) + x; + Result.x[1] := scale * (t.x[1] - x) + x; + Result.x[2] := scale * (t.x[2] - x) + x; +end; + +function RotateTriangle(t: TTriangle; rad: double): TTriangle; //rad in Radians +var + i: integer; +begin + for i := 0 to 2 do + begin + Result.x[i] := t.x[i] * cos(rad) - t.y[i] * sin(rad); + Result.y[i] := t.x[i] * sin(rad) + t.y[i] * cos(rad); + end; +end; + +function OffsetTriangle(t: TTriangle; range: double): TTriangle; +var + i: integer; + r: double; +begin + r := (random * 2 * range) - range; + for i := 0 to 2 do + begin + Result.x[i] := t.x[i] + r; + Result.y[i] := t.y[i] + r; + end; +end; + +function RotateTriangleCenter(t: TTriangle; rad: double): TTriangle; +var + i: integer; + xr, yr: double; + z: TSPoint; +begin + z := Centroid(t); + xr := z.x; + yr := z.y; + for i := 0 to 2 do + begin + Result.x[i] := xr + (t.x[i] - xr) * cos(rad) - (t.y[i] - yr) * sin(rad); + Result.y[i] := yr + (t.x[i] - xr) * sin(rad) + (t.y[i] - yr) * cos(rad); + end; +end; + +function RotateTrianglePoint(t: TTriangle; xr, yr: double; rad: double): TTriangle; +var + i: integer; +begin + for i := 0 to 2 do + begin + Result.x[i] := xr + (t.x[i] - xr) * cos(rad) - (t.y[i] - yr) * sin(rad); + Result.y[i] := yr + (t.x[i] - xr) * sin(rad) + (t.y[i] - yr) * cos(rad); + end; +end; + +function ColorValToColor(c: TColorMap; index: double): TColor; +var + i: integer; +begin + i := Trunc(Index * 255); + assert(i >= 0); + assert(i < 256); + result := c[i][2] shl 16 + c[i][1] shl 8 + c[i][0]; +end; + +procedure TEditForm.UpdatePreview; +var + pw, ph: integer; +begin + pw := PrevPnl.Width -2; + ph := PrevPnl.Height -2; + if (cp.width / cp.height) > (pw / ph) then + begin + PreviewImage.Width := pw; + assert(pw <> 0); + PreviewImage.Height := round(cp.height / cp.Width * pw); + PreviewImage.Left := 1; + PreviewImage.Top := (ph - PreviewImage.Height) div 2; + end + else begin + PreviewImage.Height := ph; + assert(ph <> 0); + PreviewImage.Width := round(cp.Width / cp.Height * ph); + PreviewImage.Top := 1; + PreviewImage.Left := (pw - PreviewImage.Width) div 2; + end; + cp.AdjustScale(PreviewImage.Width, PreviewImage.Height); + DrawPreview; + TriangleViewPaint(TriangleView); +end; + +procedure TEditForm.UpdateVariationList; // AV: adjust the var_order +var + i: integer; + svars: TStringList; +begin + svars := TStringList.Create; + with cp.xform[SelectedTriangle] do + for i := 0 to NrVar-1 do + svars.AddPair(ifs[i], Round6(GetVariation(GetVariationIndex(ifs[i]))).ToString); + VEVars.Strings.Assign(svars); + svars.Free; +end; + +procedure TEditForm.UpdateXformsList; +var + i, n: integer; + prefix: string; +begin + cbTransforms.Clear; + for i := 1 to Transforms do begin + cbTransforms.Items.Add(IntToStr(i)); + end; + if EnableFinalXform or cp.HasFinalXForm then + cbTransforms.Items.Add(TextByKey('editor-common-finalxformlistitem')); + cbTransforms.ItemIndex := SelectedTriangle; + + if mnuChaosViewTo.Checked then prefix := TextByKey('editor-common-toprefix') + else prefix := TextByKey('editor-common-fromprefix'); + n := Transforms + 1; + while vleChaos.RowCount > n do + vleChaos.DeleteRow(vleChaos.RowCount-1); + while vleChaos.RowCount < n do + vleChaos.InsertRow(Format(prefix, [vleChaos.RowCount]), '1', true); + + UpdateVariationList; // AV + chkCollapseVariablesClick(nil); + chkCollapseVariationsClick(nil); +end; + +procedure TEditForm.UpdateDisplay(PreviewOnly: boolean = false); +begin + // currently EditForm does not really know if we select another + // flame in the Main Window - which is not good... + + cp.copy(MainCp); + + if SelectedTriangle > LastTriangle{???} then + begin + SelectedTriangle := cp.NumXForms-1; + mouseOverTriangle := -1; + end; + + EnableFinalXform := cp.finalXformEnabled; + tbEnableFinalXform.Down := EnableFinalXform; + + UpdatePreview; + + if PreviewOnly then exit; + + cp.cmap := MainCp.cmap; + cmap := MainCp.cmap; + + UpdateXformsList; + UpdateColorBar; + UpdateVariationList; // AV + + // just in case: + SetCaptureControl(nil); + HasChanged := false; +// viewDragMode := false; + varDragMode := false; + pnlDragMode := false; + CornerCaught := false; + EdgeCaught := false; + TriangleCaught := false; + + cp.TrianglesFromCP(MainTriangles); + + ShowSelectedInfo; + if MainForm.UndoIndex = 0 then AutoZoom // auto-zoom only on 'new' flame + else TriangleView.Invalidate; +end; + +procedure TEditForm.DrawPreview; +begin + if EnableEditorPreview then exit; + + //Render.Stop; + cp.sample_density := PreviewDensity; + cp.spatial_oversample := defOversample; + cp.spatial_filter_radius := defFilterRadius; + if mnuResetLoc.checked then + begin + cp.zoom := 0; + cp.CalcBoundbox; + end; + + cp.cmap := MainCp.cmap; + Render.SetCP(cp); + Render.Render; + PreviewImage.Picture.Bitmap.Assign(Render.GetImage); + PreviewImage.refresh; +end; + +procedure TEditForm.ShowSelectedInfo; +var + i: integer; + v: double; + strval: string; +begin + updating := true; + + if (SelectedTriangle > LastTriangle) then + SelectedTriangle := LastTriangle; + + for i := 0 to Transforms - 1 do + begin + // AV: it's technically impossible inside this loop + { + if (i >= Transforms) then begin + if (cbTransforms.Items.Count > Transforms) then + cbTransforms.Items[i] := TextByKey('editor-common-finalxformlistitem'); + end else begin + n := i + 1; + } + if (cp.xform[i].TransformName <> '') then + cbTransforms.Items[i] := IntToStr(i + 1) + ' - ' + cp.xform[i].TransformName + else + cbTransforms.Items[i] := IntToStr(i + 1); + // end; + end; + + cbTransforms.ItemIndex := SelectedTriangle; + cbTransforms.Refresh; + + with MainTriangles[SelectedTriangle] do + begin + txtAx.text := Format('%.6g', [x[0]]); + txtAy.text := Format('%.6g', [y[0]]); + txtBx.text := Format('%.6g', [x[1]]); + txtBy.text := Format('%.6g', [y[1]]); + txtCx.text := Format('%.6g', [x[2]]); + txtCy.text := Format('%.6g', [y[2]]); + end; + + with cp.xform[SelectedTriangle] do + begin + if btnCoefsRect.Down then begin + txtA.text := Format('%.6g', [ c[0][0]]); + txtB.text := Format('%.6g', [-c[0][1]]); + txtC.text := Format('%.6g', [-c[1][0]]); + txtD.text := Format('%.6g', [ c[1][1]]); + txtE.text := Format('%.6g', [ c[2][0]]); + txtF.text := Format('%.6g', [-c[2][1]]); + txtPost00.text := Format('%.6g', [ p[0][0]]); + txtPost01.text := Format('%.6g', [-p[0][1]]); + txtPost10.text := Format('%.6g', [-p[1][0]]); + txtPost11.text := Format('%.6g', [ p[1][1]]); + txtPost20.text := Format('%.6g', [ p[2][0]]); + txtPost21.text := Format('%.6g', [-p[2][1]]); + end + else begin + txtA.text := Format('%.6g', [Hypot(c[0][0], c[0][1])]); + txtB.text := Format('%.6g', [arctan2(-c[0][1], c[0][0])*180/PI]); + txtC.text := Format('%.6g', [Hypot(c[1][0], c[1][1])]); + txtD.text := Format('%.6g', [arctan2(c[1][1], -c[1][0])*180/PI]); + txtE.text := Format('%.6g', [Hypot(c[2][0], c[2][1])]); + txtF.text := Format('%.6g', [arctan2(-c[2][1], c[2][0])*180/PI]); + txtPost00.text := Format('%.6g', [Hypot(p[0][0], p[0][1])]); + txtPost01.text := Format('%.6g', [arctan2(-p[0][1], p[0][0])*180/PI]); + txtPost10.text := Format('%.6g', [Hypot(p[1][0], p[1][1])]); + txtPost11.text := Format('%.6g', [arctan2(p[1][1], -p[1][0])*180/PI]); + txtPost20.text := Format('%.6g', [Hypot(p[2][0], p[2][1])]); + txtPost21.text := Format('%.6g', [arctan2(-p[2][1], p[2][0])*180/PI]); + end; + + tbPostXswap.Down := postXswap; + tb2PostXswap.Down := postXswap; + + CalcFlip; // AV + + if postXswap then begin // AV: simplified + GroupBox9.Font.Style := []; + GroupBox8.Font.Style := [fsBold]; + end + else begin + GroupBox8.Font.Style := []; + GroupBox9.Font.Style := [fsBold]; + end; + + chkAutoZscale.Checked := autoZscale; + + txtName.Text := TransformName; + if (SelectedTriangle >= Transforms) then + begin + txtName.Text := 'n/a'; + end; + + if SelectedTriangle < Transforms then + begin + txtP.text := Format('%.6g', [density]); + txtP.Enabled := true; + txtName.Enabled := true; + vleChaos.Enabled := true; + optTo.Enabled := True; // AV + optFrom.Enabled := True; // AV + //chkXformInvisible.Enabled := true; + //chkXformInvisible.Checked := (transOpacity = 0); + chkXformSolo.Enabled := true; + txtOpacity.Enabled := true; + txtDC.Enabled := true; + btChaos.Visible := True; // AV + btClearChaos.Visible := True; // AV + btResetChaos.Visible := True; // AV + + if cp.soloXform >= 0 then begin + chkXformSolo.Checked := true; + chkXformSolo.Caption := Format(TextByKey('editor-tab-color-togglesoloformat'), [cp.soloXform + 1]); + end + else begin + chkXformSolo.Checked := false; + chkXformSolo.Caption := TextByKey('editor-tab-color-togglesolo'); + end; + end + else begin // disable controls for FinalXform + txtP.Enabled := false; + txtP.Text := 'n/a'; + txtName.Enabled := false; + vleChaos.Enabled := false; + btChaos.Visible := False; // AV + btClearChaos.Visible := False; // AV + btResetChaos.Visible := False; // AV + optTo.Enabled := False; // AV + optFrom.Enabled := False; // AV + //chkXformInvisible.Enabled := false; + //chkXformInvisible.Checked := false; + txtOpacity.Enabled := false; + chkXformSolo.Enabled := false; + end; + tbEnableFinalXform.Down := EnableFinalXform; + + txtSymmetry.text := Format('%.6g', [symmetry]); + txtOpacity.text := Format('%.6g', [transOpacity]); + txtDC.Text := Format('%.6g', [pluginColor]); + + pnlXFormColor.Color := ColorValToColor(cp.cmap, color); + shColor.Brush.Color := pnlXformColor.Color; + txtXFormColor.Text := Format('%1.3f', [color]); + scrlXFormcolor.Position := Trunc(color * scrlXFormColor.Max); + + for i := 0 to NRVAR-1 do begin + v := GetVariation(i); + if v <> VarsCache[i] then + begin + VarsCache[i] := v; + VEVars.Values[VarNames(i)] := Format('%.6g', [v]); + end; + end; + + for i:= 0 to GetNrVariableNames - 1 do begin +{$ifndef VAR_STR} + GetVariable(GetVariableNameAt(i), v); + strval := Format('%.6g', [v]); +{$else} + strval := GetVariableStr(GetVariableNameAt(i)); +{$endif} + // kinda funny, but it really helped... + if vleVariables.Values[GetVariableNameAt(i)] <> strval then + vleVariables.Values[GetVariableNameAt(i)] := strval; + end; + + //Assert(vleChaos.RowCount = Transforms+1); + if SelectedTriangle < Transforms then begin + if mnuChaosViewTo.Checked then + // view as "to" values + for i := 1 to Transforms do begin + strval := Format('%.6g', [modWeights[i - 1]]); + if vleChaos.Cells[1, i] <> strval then + vleChaos.Cells[1, i] := strval; + end + else + // view as "from" values + for i := 1 to Transforms do begin + strval := Format('%.6g', [cp.xform[i - 1].modWeights[SelectedTriangle]]); + if vleChaos.Cells[1, i] <> strval then + vleChaos.Cells[1, i] := strval; + end; + end + else + for i := 1 to vleChaos.RowCount-1 do + vleChaos.Cells[1, i] := 'n/a'; + end; + + //AV: moved checks here since Apo7X didn't refresh these pages well + chkCollapseVariationsClick(nil); + chkCollapseVariablesClick(nil); + + if PivotMode = pivotLocal then begin + editPivotX.Text := Format('%.6g', [LocalPivot.x]); + editPivotY.Text := Format('%.6g', [LocalPivot.y]); + btnPivotMode.Caption := TextByKey('editor-tab-triangle-modelocal'); + btnPivotMode.Hint := TextByKey('editor-tab-triangle-toworld'); + tbPivotMode.Down := false; + end + else begin + editPivotX.Text := Format('%.6g', [WorldPivot.x]); + editPivotY.Text := Format('%.6g', [WorldPivot.y]); + btnPivotMode.Caption := TextByKey('editor-tab-triangle-modeworld'); + btnPivotMode.Hint := TextByKey('editor-tab-triangle-tolocal'); + tbPivotMode.Down := true; + end; + PageControl.Refresh; + + updating := false; +end; + +/////////////////////////////////////////////////// +procedure TEditForm.CreateScreenShot; +begin + SaveScreenShot('Apophysis Transform Editor'); +end; + +procedure TEditForm.ExtSysMenu(var Msg: TMessage); +begin + if Msg.WParam = $C0 then CreateScreenShot; + inherited; +end; + +{ /////////////// AV: arrow buttons for all num fields //////////////// } + +procedure TEditForm.SpinButtonDownClick(Sender: TObject); +var + step, n: double; + ANumEdit: TEdit; +begin + step := 0.01; + if GetKeyState(VK_MENU) < 0 then step := 0.000001 // Alt + else if GetKeyState(VK_CONTROL) < 0 then step := 0.0001 + else if GetKeyState(VK_SHIFT) < 0 then step := 0.1; + try + ANumEdit := TEdit((Sender as TSpinButton).FocusControl); + n := StrToFloat(ANumEdit.Text); + ANumEdit.Text := Format('%.6g', [n - step]); + ANumEdit.OnExit(ANumEdit); + except + // do nothing + end; +end; + +procedure TEditForm.SpinButtonUpClick(Sender: TObject); +var + step, n: double; + ANumEdit: TEdit; +begin + step := 0.01; + if GetKeyState(VK_MENU) < 0 then step := 0.000001 // Alt + else if GetKeyState(VK_CONTROL) < 0 then step := 0.0001 + else if GetKeyState(VK_SHIFT) < 0 then step := 0.1; + try + ANumEdit := TEdit((Sender as TSpinButton).FocusControl); + n := StrToFloat(ANumEdit.Text); + ANumEdit.Text := Format('%.6g', [n + step]); + ANumEdit.OnExit(ANumEdit); + except + // do nothing + end; +end; + +{ ////////////////////////////////////////////////////////////////// } + +procedure TEditForm.Scale(var fx, fy: double; x, y: integer); +var + sc: double; +begin + sc := 50 * GraphZoom; + fx := (x - (TriangleView.Width / 2)) / sc + gCenterX; + fy := -((y - (TriangleView.Height / 2)) / sc - gCentery); +end; + +procedure TEditForm.AddContainerClick(Sender: TObject); +var + i: integer; + sumw: double; +begin + if (Transforms < NXFORMS) then + begin + MainForm.UpdateUndo; + MainTriangles[Transforms + 1] := MainTriangles[Transforms]; + cp.xform[Transforms + 1].Assign(cp.xform[Transforms]); + MainTriangles[Transforms] := MainTriangles[-1]; + + for i := 0 to Transforms-1 do + cp.xform[i].TransOpacity := 0; + + cp.xform[Transforms].Clear; + cp.xform[Transforms].symmetry := 1; + cp.xform[Transforms].SetVariation(0, 1); + cp.xform[Transforms].modWeights[Transforms] := 0; + + if InheritWeights.Checked then begin + sumw := 0; + for i := 0 to Transforms-1 do + sumw := sumw + cp.xform[i].density; + cp.xform[Transforms].density := sumw; + end else + cp.xform[Transforms].density := 0.5; + + SelectedTriangle := Transforms; + cp.xform[SelectedTriangle].TransformName := 'Container TX'; + + Inc(Transforms); + UpdateXformsList; + UpdateFlame(True); + + if ChaosForm.Visible then // AV + ChaosForm.ChaosMatrix.Invalidate; + end; +end; + +procedure TEditForm.AffineCoefsDblClick(Sender: TObject); // AV +var + num: string; +begin + if not AllowResetCoefs then exit; + with TEdit(Sender) do // restore defaults + begin + if (Parent = GroupBox6) or btnCoefsRect.Down then + num := IntToStr(Tag) + else // if btnCoefsPolar.Down then + begin + if (Left = 36) and (Top < 65) then // hack... + num := '1' + else if (Tag = 1) then + num := '90' + else num := '0'; + end; + + if Text <> num then + begin + Text := num; + OnExit(Sender); + end; + end; +end; + +procedure TEditForm.AutoZoom; +var + i, j: integer; + xminz, yminz, xmaxz, ymaxz: double; + gxlength, gylength: double; +begin + xminz := 0; + yminz := 0; + xmaxz := 0; + ymaxz := 0; + for i := -1 to LastTriangle do + begin + for j := 0 to 2 do + begin + if MainTriangles[i].x[j] < xminz then xminz := MainTriangles[i].x[j]; + if MainTriangles[i].y[j] < yminz then yminz := MainTriangles[i].y[j]; + if MainTriangles[i].x[j] > xmaxz then xmaxz := MainTriangles[i].x[j]; + if MainTriangles[i].y[j] > ymaxz then ymaxz := MainTriangles[i].y[j]; + end; + end; + gxlength := xmaxz - xminz; + gylength := ymaxz - yminz; + gCenterX := xminz + gxlength / 2; + gCentery := yminz + gylength / 2; + + if gxlength >= gylength then + GraphZoom := TriangleView.Width / 60 / gxlength + else + GraphZoom := TriangleView.Height / 60 / gylength; + EditForm.StatusBar.Panels[2].Text := Format(TextByKey('editor-status-zoomformat'), [GraphZoom]); + + TriangleView.Invalidate;//Refresh; +end; + +procedure TEditForm.UpdateFlameX; +begin + cp.GetFromTriangles(MainTriangles, Transforms); + + if tbAutoWeights.Down then cp.CalculateWeights; //cp.ComputeWeights(MainTriangles, Transforms); + DrawPreview; + ShowSelectedInfo; + TriangleView.Refresh; +end; + +procedure TEditForm.UpdateFlame(DrawMain: boolean); +begin + StatusBar.Panels[2].Text := Format(TextByKey('editor-status-zoomformat'), [GraphZoom]); + + cp.GetFromTriangles(MainTriangles, LastTriangle); + +// if not chkPreserve.Checked then ComputeWeights(cp, MainTriangles, transforms); + DrawPreview; + ShowSelectedInfo; + TriangleView.Refresh; + if DrawMain then begin + MainForm.StopThread; + + MainCp.Copy(cp, true); + + MainCp.cmap := cmap; + if mnuResetLoc.checked then begin + MainCp.zoom := 0; + MainForm.center[0] := cp.center[0]; + MainForm.center[1] := cp.center[1]; + end; + if AdjustForm.Visible then AdjustForm.UpdateDisplay; + if MutateForm.Visible then MutateForm.UpdateDisplay; + if CurvesForm.Visible then CurvesForm.SetCp(MainCp); + MainForm.RedrawTimer.enabled := true; + end; + + // AV: following is included into ShowSelectedInfo + //chkCollapseVariablesClick(nil); + //chkCollapseVariationsClick(nil); +end; + +procedure TEditForm.UpdateWidgets; + function Point(x, y: double): TSPoint; + begin + Result.x := x; + Result.y := y; + end; +begin + with mainTriangles[Selectedtriangle] do + begin + xx := x[0] - x[1]; + xy := y[0] - y[1]; + yx := x[2] - x[1]; + yy := y[2] - y[1]; + Widgets[0][0] := Point(x[1] + 0.8*xx + yx, y[1] + 0.8*xy + yy); + Widgets[0][1] := Point(x[1] + xx + yx, y[1] + xy + yy); + Widgets[0][2] := Point(x[1] + xx + 0.8*yx, y[1] + xy + 0.8*yy); + + Widgets[1][0] := Point(x[1] - 0.8*xx + yx, y[1] - 0.8*xy + yy); + Widgets[1][1] := Point(x[1] - xx + yx, y[1] - xy + yy); + Widgets[1][2] := Point(x[1] - xx + 0.8*yx, y[1] - xy + 0.8*yy); + + Widgets[2][0] := Point(x[1] - 0.8*xx - yx, y[1] - 0.8*xy - yy); + Widgets[2][1] := Point(x[1] - xx - yx, y[1] - xy - yy); + Widgets[2][2] := Point(x[1] - xx - 0.8*yx, y[1] - xy - 0.8*yy); + + Widgets[3][0] := Point(x[1] + 0.8*xx - yx, y[1] + 0.8*xy - yy); + Widgets[3][1] := Point(x[1] + xx - yx, y[1] + xy - yy); + Widgets[3][2] := Point(x[1] + xx - 0.8*yx, y[1] + xy - 0.8*yy); + end; +end; + +procedure TEditForm.DeleteTriangle(t: integer); +var + i, j, nmin, nmax: integer; + lx, ps: integer; + txname: string; +begin + if (t = Transforms) then + begin + assert(cp.HasFinalXForm or EnableFinalXform); + MainForm.UpdateUndo; + EnableFinalXform := false; + cp.finalXformEnabled := false; + cp.xform[Transforms].Clear; + cp.xform[Transforms].symmetry := 1; + assert(cp.HasFinalXForm = false); + MainTriangles[Transforms] := MainTriangles[-1]; + tbEnableFinalXform.Down := false; + if (SelectedTriangle = Transforms) then Dec(SelectedTriangle); + end + else + if (Transforms <= 1) then exit + else begin + MainForm.UpdateUndo; + + for i := 0 to Transforms-1 do + begin + if (pos('link', cp.xform[i].TransformName) > 0) then + begin + // AV: correcting the numbers in linked transforms' names + if i = t then continue; + txname := cp.xform[i].TransformName; + ps := pos('TX ', txname) + 3; + txname := copy(txname, ps, length(txname) - ps + 1); + try // if user didn't change the original name + lx := StrToInt(txname) - 1; + if (lx = t) then cp.xform[i].TransformName := '' + else if (lx > t) then + cp.xform[i].TransformName := copy(cp.xform[i].TransformName, 1, ps - 1) + IntToStr(lx); + except + // leave the name as is + end; + end; + end; + + if RebuildXaosLinks then begin + // check for single "to" links + for i := 0 to NXFORMS-1 {Transforms-1} do + with cp.xform[i] do begin + nmin := NXFORMS; + nmax := -1; + for j := 0 to NXFORMS-1 {Transforms-1} do + if modWeights[j] <> 0 then begin + if j < nmin then nmin := j; + if j > nmax then nmax := j; + end; + if (nmin = nmax) and (nmin = t) then begin + for j := 0 to NXFORMS-1 {Transforms-1} do + modWeights[j] := cp.xform[t].modWeights[j]; + if (transOpacity = 0) then begin + transOpacity := cp.xform[t].transOpacity; + end; + end; + end; + // check for single "from" links + for i := 0 to NXFORMS-1 {Transforms-1} do + begin + if cp.xform[t].modWeights[i] = 0 then continue; + nmin := NXFORMS; + nmax := -1; + for j := 0 to NXFORMS-1 {Transforms-1} do + if cp.xform[j].modWeights[i] <> 0 then begin + if j < nmin then nmin := j; + if j > nmax then nmax := j; + end; + if (nmin = nmax) and (nmin = t) then begin + for j := 0 to NXFORMS-1 {Transforms-1} do + cp.xform[j].modWeights[i] := cp.xform[t].modWeights[i]; + end; + end; + + if pos('Container TX', cp.xform[t].TransformName) > 0 then + for i := 0 to t-1 do + if (cp.xform[t].transOpacity = 0) then + cp.xform[t].transOpacity := 1; + end; + + // delete xform from all probability tables + for i := 0 to NXFORMS-1 {Transforms-1} do + with cp.xform[i] do begin + for j := t to NXFORMS-1 {Transforms-1} do + modWeights[j] := modWeights[j+1]; + modWeights[Transforms-1] := 1; + end; + + if t = (Transforms - 1) then + begin + MainTriangles[t] := MainTriangles[Transforms]; + cp.xform[t].Assign(cp.xform[Transforms]); + Dec(SelectedTriangle); + end + else begin + for i := t to Transforms-1 do // was: -2 + begin + { copy higher transforms down } + MainTriangles[i] := MainTriangles[i + 1]; + cp.xform[i].Assign(cp.xform[i + 1]); + end; + end; + + if cp.soloXform > t then Dec(cp.soloXform) + else if cp.soloXform = t then cp.soloXform := -1; + + Dec(Transforms); + assert(cp.xform[transforms].density = 0); // cp.xform[transforms].density := 0; + end; + UpdateXformsList; + UpdateFlame(True); +end; + +procedure TEditForm.InsertPi1Click(Sender: TObject); +var + num: double; + sn: string; +begin + if (not ValidNumField) then + begin + Application.MessageBox(PChar(TextByKey('editor-status-nonumfield')), + PChar('Apophysis AV'), MB_ICONWARNING); + exit; + end + else if (ActiveControl = txtTrgRotateValue) then exit; + + case TMenuItem(Sender).Tag of + 0: num := 3.14159265358979; // pi; + 1: num := 6.28318530717959; // 2 * pi; + 2: num := 1.5707963267949; // pi * 0.5; + 3: num := 1.0471975511966; // pi/3; + 4: num := 0.785398163397448; // pi * 0.25; + 5: num := 0.523598775598299; // pi/6; + 6: num := 0.288675134594813; // sqrt(3)/6; + 7: num := 0.707106781186548; // sqrt(2) * 0.5; + 8: num := 0.866025403784439; // sqrt(3) * 0.5; + 9: num := 0.577350269189626; // sqrt(3)/3; + 10: num := 1.73205080756888; // sqrt(3); + 11: num := 0.618033988749895; // (sqrt(5)- 1) * 0.5; + else num := 0; + end; + if (ActiveControl = txtTrgScaleValue) then num := num * 100; + sn := Format('%.6g', [num]); + + if (ActiveControl is TEdit) then + begin + TEdit(ActiveControl).Text := sn; + TEdit(ActiveControl).OnExit(ActiveControl); + end else if (ActiveControl is TValueListEditor) then + begin + TValueListEditor(ActiveControl).Cells[1, TValueListEditor(ActiveControl).Row] := sn; + TValueListEditor(ActiveControl).OnExit(ActiveControl); + end + else // if (ActiveControl is TComboBox) then + TComboBox(ActiveControl).Text := sn; +end; + +function TEditForm.InsideTriangle(x, y: double): integer; +var + i, j, k: integer; + inside: boolean; +begin +{ is x, y inside a triangle } + Result := -1; + inside := False; + j := 2; + for k := LastTriangle downto 0 do + begin + for i := 0 to 2 do + begin + if (((MainTriangles[k].y[i] <= y) and + (y < MainTriangles[k].y[j])) or + ((MainTriangles[k].y[j] <= y) and + (y < MainTriangles[k].y[i]))) and + (x < (MainTriangles[k].x[j] - MainTriangles[k].x[i]) * + (y - MainTriangles[k].y[i]) / + (MainTriangles[k].y[j] - MainTriangles[k].y[i]) + + MainTriangles[k].x[i]) then + Inside := not Inside; + j := i + end; + if inside then break; + end; + if inside then Result := k; +end; + +function TEditForm.GetTriangleColor(n: integer): TColor; +begin + if n = Transforms then Result := clWhite + else + if UseTransformColors then + Result := ColorValToColor(MainCp.cmap, cp.xform[n].color) + else Result := TrgColors[n mod 14]; +end; + +procedure TEditForm.GridComboBoxChange(Sender: TObject); +begin + if tbVarPreview.Down then + TriangleView.Invalidate; +end; + +procedure TEditForm.ResetToolsDblClick(Sender: TObject); +begin + RotateXYO.Checked := True; + ScaleXYO.Checked := True; + ShowModvals.Checked := False; + mnuChangeGridClick(RectGrid); + txtTrgRotateValue.Text := '15'; + txtTrgScaleValue.Text := '125'; + txtTrgMoveValue.Text := '0.1'; +end; + +procedure TEditForm.RedrawButtons; +begin + if IsLightMenu then + btnMathPopup.ImageIndex := 42 // white PI + else + btnMathPopup.ImageIndex := 32; // black PI +end; + +function TEditForm.LastTriangle: integer; +begin + if EnableFinalXform or cp.HasFinalXForm then Result := Transforms + else Result := Transforms-1; +end; + +procedure TEditForm.CalcFlip; +var ang: double; +begin + if (PivotMode = pivotLocal) or (mouseOverEdge >= 0) then + with MainTriangles[SelectedTriangle] do begin + fl.x := (x[0] - x[1]) * (FlipPoint.x - LocalPivot.x) + (x[2] - x[1]) * (FlipPoint.y - LocalPivot.y); + fl.y := (y[0] - y[1]) * (FlipPoint.x - LocalPivot.x) + (y[2] - y[1]) * (FlipPoint.y - LocalPivot.y); + end + else begin + fl.x := FlipPoint.x - WorldPivot.x; + fl.y := FlipPoint.y - WorldPivot.y; + end; + ang := RadToDeg(arctan2(fl.y, fl.x)); + if (ang < 0) then ang := ang + 180.0 + else if (ang = 180.0) then ang := 0.0; + lblFlipAngle.Caption := lblFlipAngle.Hint + Format(': %1.3g'#176, [ang]); +end; + +procedure TEditForm.CalcArcsinScaleClick(Sender: TObject); +var t: double; +begin + try + t := StrToFloat(txtTrgScaleValue.Text) * 0.01; + if (abs(t) <= 1) then begin + t := RadToDeg(arcsin(t)); + txtTrgRotateValue.Text := Format('%.6g', [t]); + end else + Application.MessageBox(PChar(TextByKey('editor-status-warnscale')), + PChar('Apophysis AV'), MB_ICONWARNING); + except + Beep; + end; +end; + +procedure TEditForm.CalcCosClick(Sender: TObject); +var + num, t: double; + sn: string; +begin + if (not ValidNumField) then + begin + Application.MessageBox(PChar(TextByKey('editor-status-nonumfield')), + PChar('Apophysis AV'), MB_ICONWARNING); + exit; + end; + + try + if (ActiveControl is TEdit) then + sn := TEdit(ActiveControl).Text + else if (ActiveControl is TValueListEditor) then + sn := TValueListEditor(ActiveControl).Cells[1, TValueListEditor(ActiveControl).Row] + else //if (ActiveControl is TComboBox) then + sn := TComboBox(ActiveControl).Text; + num := StrToFloat(sn); + if UseDegrees.Checked then + num := num * pi / 180; + case TMenuItem(Sender).Tag of + 0: sn := Format('%.6g', [cos(num)]); + 1: sn := Format('%.6g', [sin(num)]); + else begin + t := abs(cos(num)); + if (t < 1E-6) then exit; + t := Round6(tan(num)); + sn := FloatToStr(t); + end; + end; + + if (ActiveControl is TEdit) then + begin + TEdit(ActiveControl).Text := sn; + TEdit(ActiveControl).OnExit(ActiveControl); + end + else if (ActiveControl is TValueListEditor) then + begin + TValueListEditor(ActiveControl).Cells[1, TValueListEditor(ActiveControl).Row] := sn; + TValueListEditor(ActiveControl).OnExit(ActiveControl); + end + else //if (ActiveControl is TComboBox) then + TComboBox(ActiveControl).Text := sn; + except + end; +end; + +procedure TEditForm.TriangleViewPaint(Sender: TObject); +const + foc_ofs = 4; + foc_size = 32; +var + ix, iy, sc: double; + + function ToScreen(fx, fy: double): TPoint; + begin + Result.x := integer(round(ix + (fx - gCenterX) * sc)); + Result.y := integer(round(iy - (fy - gCenterY) * sc)); + end; + + procedure ToUnit(p: TPoint; var fx, fy: double); + begin + fx := (p.x - ix) / sc + gCenterX; + fy := (p.y + iy) / sc + gCenterY; + end; + +var + dx, dy: double; + Width, Height: integer; + BitMap: TBitMap; + + procedure LineDxDy; + var + k: double; + begin + if (dx <> 0) and (dy <> 0) then with Bitmap.Canvas do + begin + k := dy / dx; + if abs(k) < 1 then begin + MoveTo(0, round(iy - sc*(Pivot.y - ( ix/sc-GCenterX+Pivot.x)*k - GCenterY))); + LineTo(Width, round(iy - sc*(Pivot.y - (-ix/sc-GCenterX+Pivot.x)*k - GCenterY))); + end + else begin + MoveTo(round(ix + sc*(Pivot.x - (-iy/sc-GCenterY+Pivot.y)/k - GCenterX)), 0); + LineTo(round(ix + sc*(Pivot.x - ( iy/sc-GCenterY+Pivot.y)/k - GCenterX)), Height); + end; + end; + end; + + procedure DrawFlipLine; + var k: double; + begin + with Bitmap.Canvas do + begin + k := fl.y / fl.x; + if abs(k) < 1 then begin + MoveTo(0, round(iy - sc*(GetPivot.y - ( ix/sc-GCenterX+GetPivot.x)*k - GCenterY))); + LineTo(Width, round(iy - sc*(GetPivot.y - (-ix/sc-GCenterX+GetPivot.x)*k - GCenterY))); + end + else begin + MoveTo(round(ix + sc*(GetPivot.x - (-iy/sc-GCenterY+GetPivot.y)/k - GCenterX)), 0); + LineTo(round(ix + sc*(GetPivot.x - ( iy/sc-GCenterY+GetPivot.y)/k - GCenterX)), Height); + end; + end; + end; + +var + a, b, c: TPoint; + e, f: TPoint; + + procedure DrawWidgets; + var + i: integer; + begin + with Bitmap.Canvas do + with MainTriangles[SelectedTriangle] do + begin + for i := 0 to 3 do + begin + a:=toscreen(Widgets[i][0].x, Widgets[i][0].y); + b:=toscreen(Widgets[i][1].x, Widgets[i][1].y); + c:=toscreen(Widgets[i][2].x, Widgets[i][2].y); + moveto(a.x, a.y); + lineto(b.x, b.y); + lineto(c.x, c.y); + end + end; + end; + +var + i, n, tc, tn, lin: integer; + d, d1: double; + tx, ty: double; + tr, ta, den: double; // for (bi)polar grid + ax, ay: integer; + + gridX1, gridX2, gridY1, gridY2, gi, gstep: double; + gp: TRoundToRange; + + tps: TPenStyle; + tT: TTriangle; + txx, txy, tyx, tyy: double; + str, vvstr: string; + + bf: TBlendFunction; + RenderCP : TControlPoint; + Renderer : TRenderer; + bm : TBitmap; + q, p0, p1: integer; +label DrawCorner; +begin + if (SelectedTriangle < 0) then begin + assert(false, 'Selected triangle < 0'); + SelectedTriangle := 0; + end; + assert(TCustomDrawControl(Sender) = TriangleView); + if SelectedTriangle > LastTriangle then SelectedTriangle := LastTriangle; + + BitMap := TBitMap.Create; + Width := TriangleView.Width; + Height := TriangleView.Height; + Bitmap.Width := Width; + Bitmap.Height := Height; + ix := Width / 2; + iy := Height / 2; + sc := 50 * GraphZoom; + try + with Bitmap.Canvas do + begin + try // who knows... ;) + gp:=round(log10(max(Width, Height)/sc))-1; + gstep:=power(10.0, gp); + except + gp:=0; + gstep:=1.0; + end; + + a := ToScreen(MainTriangles[-1].x[0], MainTriangles[-1].y[0]); + b := ToScreen(MainTriangles[-1].x[1], MainTriangles[-1].y[1]); + c := ToScreen(MainTriangles[-1].x[2], MainTriangles[-1].y[2]); + + brush.Color := EditorBkgColor; + FillRect(Rect(0, 0, Width, Height)); + + if EnableEditorPreview then begin + q := 0; + if EditPrevQual = 2 then q := 1; + p0 := TriangleView.Width div (2 - q); + p1 := TriangleView.Height div (2 - q); + + RenderCp := cp.Clone; + RenderCp.Width := TriangleView.Width; + Rendercp.Height := TriangleView.Height; + RenderCp.pixels_per_unit := sc; + RenderCp.AdjustScale(p0, p1); + RenderCP.sample_density := PreviewDensity * 0.5; + RenderCP.spatial_oversample := 1; + RenderCP.spatial_filter_radius := 0.001; + RenderCp.center[0] := gCenterX ; + RenderCp.center[1] := -gCenterY ; + RenderCp.background[0] := EditorBkgColor and $ff; + RenderCp.background[1] := (EditorBkgColor and $ff00) shl 8; + RenderCp.background[2] := (EditorBkgColor and $ff0000) shl 16; + Render.SetCP(RenderCp); + Render.Render; + + bf.BlendOp := AC_SRC_OVER; + bf.BlendFlags := 0; + bf.SourceConstantAlpha := 255 - EditorPreviewTransparency; + bf.AlphaFormat := 0; + bm := TBitmap.Create; + bm.Width := p0; + bm.Height := p1; + bm.Assign(Render.GetImage); + + //Windows.BitBlt(Handle, 0, 0, + Windows.AlphaBlend(Handle, 0, 0, + TriangleView.Width, TriangleView.Height, + bm.Canvas.Handle, 0, 0, + //$CC0020); + bm.Width, bm.Height, bf); + + RenderCp.Destroy; + try + bm.Dormant; + bm.FreeImage; + finally + bm.Free; + end; + end; + + Pen.Style := psSolid; + Pen.Width := 1; + + // draw grid + Pen.Color := GridColor2; + gridX1:=gCenterX-ix/sc; + gridX2:=gCenterX+(Width-ix)/sc; + gridY1:=gCenterY-iy/sc; + gridY2:=gCenterY+(Height-iy)/sc; + + gi:=RoundTo(gridX1, gp); + while gi <= gridX2 do + begin + ax:=integer(round(ix + (gi - gCenterX)*sc)); + MoveTo(ax, 0); + LineTo(ax, Height); + gi:=gi+gstep; + end; + gi:=RoundTo(gridY1, gp); + while gi <= gridY2 do + begin + ay:=integer(round(iy - (gi - gCenterY)*sc)); + MoveTo(0, ay); + LineTo(Width, ay); + gi:=gi+gstep; + end; + // draw axis + Pen.Color := GridColor1; + ax := integer(round(ix - gCenterX*sc)); + ay := integer(round(iy + gCentery*sc)); + MoveTo(ax, 0); + LineTo(ax, Height-1); + MoveTo(0, ay); + LineTo(Width-1, ay); + + {Reference Triangle} + Pen.Style := psDot; + Pen.color := ReferenceTriangleColor; + brush.Color := gridColor1 shr 1 and $7f7f7f; + Polyline([a, b, c, a]); + + brush.Color := EditorBkgColor; + Font.color := Pen.color; + TextOut(c.x-9, c.y-12, 'Y'); + TextOut(a.x+2, a.y+1, 'X'); + TextOut(b.x-8, b.y+1, 'O'); + + Pen.Style := psSolid; + + // Draw Triangles + for i := 0 to LastTriangle do + begin + if i <> SelectedTriangle then Pen.Style := psDot; + + with cp.xform[i] do // draw post-triangle + if postXswap or + ((ShowAllXforms or (i = SelectedTriangle)) and ( + (p[0,0]<>1) or (p[0,1]<>0) or + (p[1,0]<>0) or (p[1,1]<>1) or + (p[2,0]<>0) or (p[2,1]<>0) )) then + begin + Pen.Color := GetTriangleColor(i) shr 1 and $7f7f7f; + tps := Pen.Style; + Pen.Style := psDot; + + cp.GetPostTriangle(tT, i); + txx := tT.x[0] - tT.x[1]; + txy := tT.y[0] - tT.y[1]; + tyx := tT.x[2] - tT.x[1]; + tyy := tT.y[2] - tT.y[1]; + a := ToScreen(tT.x[1] + txx + tyx, tT.y[1] + txy + tyy); + b := ToScreen(tT.x[1] - txx + tyx, tT.y[1] - txy + tyy); + e := ToScreen(tT.x[1] + txx - tyx, tT.y[1] + txy - tyy); + f := ToScreen(tT.x[1] - txx - tyx, tT.y[1] - txy - tyy); + Polyline([a, b, f, e, a]); + + pen.Style := psSolid; + a := ToScreen(tT.x[1] - txx, tT.y[1] - txy); + b := ToScreen(tT.x[1] + txx, tT.y[1] + txy); + e := ToScreen(tT.x[1] + tyx, tT.y[1] + tyy); + f := ToScreen(tT.x[1] - tyx, tT.y[1] - tyy); + Polyline([a, b, e, f]); + + if postXswap and ((i = SelectedTriangle) or ShowAllXforms) then + begin + Pen.Style := psDot; + cp.GetTriangle(tT, i); + + a:=toscreen(tT.x[0], tT.y[0]); + moveto(a.x, a.y); + b:=toscreen(tT.x[2], tT.y[2]); + lineto(b.x, b.y); + + pen.Style := psSolid; + b:=toscreen(tT.x[1], tT.y[1]); + lineto(b.x, b.y); + lineto(a.x, a.y); + end; + + Pen.Style := tps; + end; + + Pen.Color := GetTriangleColor(i); + a := ToScreen(MainTriangles[i].x[0], MainTriangles[i].y[0]); + b := ToScreen(MainTriangles[i].x[1], MainTriangles[i].y[1]); + c := ToScreen(MainTriangles[i].x[2], MainTriangles[i].y[2]); + if pen.Style <> psSolid then + Polyline([a, b, c, a]) + else begin + Polyline([a, b, c]); + Pen.Style := psDot; + brush.Color := pen.color shr 1 and $7f7f7f; + Polyline([c, a]); + brush.Color := EditorBkgColor; + end; + + Pen.Style := psSolid; + Ellipse(a.x - 4, a.y - 4, a.x + 4, a.y + 4); + Ellipse(b.x - 4, b.y - 4, b.x + 4, b.y + 4); + Ellipse(c.x - 4, c.y - 4, c.x + 4, c.y + 4); + + Font.color := Pen.color; + TextOut(c.x+2, c.y+1, 'Y'); + TextOut(a.x+2, a.y+1, 'X'); + TextOut(b.x+2, b.y+1, 'O'); + end; + + UpdateWidgets; + if ExtendedEdit then begin + n := GetTriangleColor(SelectedTriangle);// shr 1 and $7f7f7f; + if mouseOverTriangle <> SelectedTriangle then n := n shr 1 and $7f7f7f; + Pen.Color := n; + Pen.Mode := pmMerge; + DrawWidgets; + + if mouseOverWidget >= 0 then + begin + pen.Color := pen.Color shr 1 and $7f7f7f; + pen.Width := 4; + DrawWidgets; + pen.Width := 1; + end; + end; + + if showVarPreview then + begin + assert(trkVarPreviewRange.position > 0); + assert(trkVarPreviewDensity.position > 0); + + cp.xform[SelectedTriangle].Prepare; + + n := trkVarPreviewRange.position * trkVarPreviewDensity.position * 5; + d1 := trkVarPreviewDensity.position * 5; + tc := GetTriangleColor(SelectedTriangle); + + // AV: draw the variation preview in the selected coordinate system + case GridComboBox.ItemIndex of + 0: begin // transform rectangular grid + for ax := -n to n do + for ay := -n to n do + try + tx := ax / d1; + ty := ay / d1; + for i := trkVarPreviewDepth.position downto 1 do + cp.xform[SelectedTriangle].NextPointXY(tx, ty); + a := toscreen(tx, -ty); + Pixels[a.x, a.y] := tc; + except + end; + end; + 1: begin // transform polar grid + try + tx := 0; ty := 0; // origin + for i := trkVarPreviewDepth.position downto 1 do + cp.xform[SelectedTriangle].NextPointXY(tx, ty); + a := ToScreen(tx, -ty); + Pixels[a.x, a.y] := tc; + except + end; + for ax := -2*n to 2*n do + for ay := 1 to n do + try + tr := ay/d1; + ta := ax * PI/2/n; + tx := tr * cos(ta); + ty := tr * sin(ta); + for i := trkVarPreviewDepth.position downto 1 do + cp.xform[SelectedTriangle].NextPointXY(tx, ty); + a := ToScreen(tx, -ty); + Pixels[a.x, a.y] := tc; + except + end; + end; + 2: begin // transform bipolar grid + for ax := -2*n to 2*n do + for ay := -n to n do + try + tr := ay/d1; + ta := ax * PI/2/n; + den := cosh(tr) - cos(ta); + tx := sinh(tr)/den; + ty := sin(ta)/den; + for i := trkVarPreviewDepth.position downto 1 do + cp.xform[SelectedTriangle].NextPointXY(tx, ty); + a := ToScreen(tx, -ty); + Pixels[a.x, a.y] := tc; + except + end; + end; + else begin // transform elliptic grid + for ax := -2*n to 2*n do + for ay := 0 to n do + try + tr := ay/d1; + ta := ax * PI/2/n; + tx := cosh(tr) * cos(ta); + ty := sinh(tr) * sin(ta); + for i := trkVarPreviewDepth.position downto 1 do + cp.xform[SelectedTriangle].NextPointXY(tx, ty); + a := ToScreen(tx, -ty); + Pixels[a.x, a.y] := tc; + except + end; + end; + end; + end; + + // *********** Reflection stuff **************************** + if ShowFlipLine then + begin + pen.Color := FlipColor; + pen.Mode := pmMerge; + pen.Style := psSolid; + + CalcFlip; + if (fl.x <> 0) and (fl.y <> 0) then + DrawFlipLine + else if (fl.x = 0) and (fl.y <> 0)then + begin + lin := round(ix + (GetPivot.x - gCenterX) * sc); + MoveTo(lin, 0); + LineTo(lin, Height); + end + else if (fl.y = 0) and (fl.x <> 0) then + begin + lin := round(iy - (GetPivot.y - gCenterY) * sc); + MoveTo(0, lin); + LineTo(Width, lin); + end; + end; + //**************************************************** + + if (TriangleCaught or CornerCaught) then // if dragging, draw pivot axis + begin + mouseOverTriangle := SelectedTriangle; + + if HelpersEnabled then + begin + pen.Color := HelpersColor; + pen.Mode := pmMerge; + pen.Style := psSolid; + a := ToScreen(Pivot.x, Pivot.y); + MoveTo(a.x, 0); + LineTo(a.x, Height); + MoveTo(0, a.y); + LineTo(Width, a.y); + + if (editMode = modeRotate) then // draw circle + begin + if CornerCaught then begin + dx := MainTriangles[SelectedTriangle].x[SelectedCorner] - Pivot.x; + dy := MainTriangles[SelectedTriangle].y[SelectedCorner] - Pivot.y; + d := Hypot(dx, dy); + end + else begin + dx := MainTriangles[SelectedTriangle].x[0] - Pivot.x; + dy := MainTriangles[SelectedTriangle].y[0] - Pivot.y; + d := Hypot(dx, dy); + for i := 1 to 2 do + begin + d1 := dist(Pivot.x, Pivot.y, MainTriangles[SelectedTriangle].x[i], MainTriangles[SelectedTriangle].y[i]); + if d1 > d then + begin + if d > 0 then begin + dx := dx/d*d1; + dy := dy/d*d1; + end; + d := d1; + end; + end; + end; + + i := integer(round(d * sc)); + if i > 4 then + begin + pen.Color := HelpersColor; + brush.Style := bsClear; + Ellipse(a.x - i, a.y - i, a.x + i, a.y + i); + + a := ToScreen(Pivot.x - dy, Pivot.y + dx); + b := ToScreen(Pivot.x + dy, Pivot.y - dx); + c := ToScreen(Pivot.x, Pivot.y); + MoveTo(a.x, a.y); + LineTo(c.X, c.y); + LineTo(b.X, b.y); + end; + + // rotated axis + LineDxDy; + end + else if (editMode = modeScale) then // draw lines + begin + if CornerCaught then begin + dx := MainTriangles[SelectedTriangle].x[SelectedCorner] - Pivot.x; + dy := MainTriangles[SelectedTriangle].y[SelectedCorner] - Pivot.y; + LineDxDy; + end + else begin // hmmm... + dx := MainTriangles[SelectedTriangle].x[0] - Pivot.x; + dy := MainTriangles[SelectedTriangle].y[0] - Pivot.y; + LineDxDy; + dx := MainTriangles[SelectedTriangle].x[1] - Pivot.x; + dy := MainTriangles[SelectedTriangle].y[1] - Pivot.y; + LineDxDy; + dx := MainTriangles[SelectedTriangle].x[2] - Pivot.x; + dy := MainTriangles[SelectedTriangle].y[2] - Pivot.y; + LineDxDy; + end; + end + else // if editMode = modeMove then // draw target axis + begin + Pen.Color := HelpersColor; + Pen.Mode := pmMerge;//Xor; + brush.Color := 0; + if CornerCaught then + a := ToScreen(MainTriangles[SelectedTriangle].x[SelectedCorner], + MainTriangles[SelectedTriangle].y[SelectedCorner]) + else + a := ToScreen(GetPivot.x, GetPivot.y); + MoveTo(a.x, 0); + LineTo(a.x, Height); + MoveTo(0, a.y); + LineTo(Width, a.y); + Pen.Mode := pmCopy; + end; + end; // endif HelpersEnabled + end; + + if (mouseOverTriangle >= 0) then // highlight triangle under cursor + begin + with MainTriangles[mouseOverTriangle] do begin + a := ToScreen(x[0], y[0]); + b := ToScreen(x[1], y[1]); + c := ToScreen(x[2], y[2]); + end; + + pen.Width:=2; + Pen.Color:=GetTriangleColor(mouseOverTriangle) shr 1 and $7f7f7f; + Pen.Mode:=pmMerge; + brush.Color:=Pen.Color shr 1 and $7f7f7f; + + if (SelectMode and (editMode <> modePick)) or (mouseOverTriangle = SelectedTriangle) then + Polygon([a, b, c]) + else + PolyLine([a, b, c, a]); + + pen.width:=4; + Ellipse(a.x - 3, a.y - 3, a.x + 3, a.y + 3); + Ellipse(b.x - 3, b.y - 3, b.x + 3, b.y + 3); + Ellipse(c.x - 3, c.y - 3, c.x + 3, c.y + 3); + pen.width:=1; + pen.mode:=pmCopy; + + if not (CornerCaught or TriangleCaught) then // show used variations + begin + font.Color := GetTriangleColor(mouseOverTriangle); + brush.Style := bsClear; + ay := Height-foc_ofs*2 + font.Height; // font.height < 0 + for i:= NRVAR - 1 downto 0 do + if cp.xform[mouseOverTriangle].GetVariation(i) <> 0 then + begin + // AV: hack, inspired by Apo 2.09 + if (pos('julian', Varnames(i))> 0) or (pos('julia3D', Varnames(i))> 0) + or (pos('juliascope', Varnames(i))> 0) then + begin + vvstr := Varnames(i) + '_power = ' + + cp.xform[mouseOverTriangle].GetVariableStr(Varnames(i) + '_power'); + ax := Width-foc_ofs*2 - TextWidth(vvstr); + TextOut(ax, ay, vvstr); + Inc(ay, font.Height); + end else + if (Varnames(i) = 'affine3D') or (Varnames(i) = 'trianglecrop') + or (Varnames(i) = 'projective') or (Varnames(i) = 'spherecrop') then + begin + vvstr := Varnames(i) + '_mode'; + vvstr := vvstr + ' = ' + cp.xform[mouseOverTriangle].GetVariableStr(vvstr); + ax := Width-foc_ofs*2 - TextWidth(vvstr); + TextOut(ax, ay, vvstr); + Inc(ay, font.Height); + end; + vvstr := Varnames(i) + Format(' = %.6g', [cp.xform[mouseOverTriangle].GetVariation(i)]); + ax := Width-foc_ofs*2 - TextWidth(vvstr); + TextOut(ax, ay, vvstr); + Inc(ay, font.Height); + end; +// brush.Style := bsSolid; + end; + end; + + pen.color := clWhite; + if CornerCaught then // draw selected corner + begin + brush.Color:=clSilver; + a := ToScreen(MainTriangles[SelectedTriangle].x[SelectedCorner], MainTriangles[SelectedTriangle].y[SelectedCorner]); + Ellipse(a.x - 4, a.y - 4, a.x + 4, a.y + 4); + end + else if (mouseOverTriangle>=0) then + begin + if (mouseOverCorner >= 0) then // highlight corner under cursor + begin + case mouseOverCorner of + 0: brush.Color:=clRed; + 2: brush.Color:=clBlue; + else brush.Color:=clSilver; + end; + + a := ToScreen(MainTriangles[mouseOverTriangle].x[mouseOverCorner], MainTriangles[mouseOverTriangle].y[mouseOverCorner]); + Ellipse(a.x - 4, a.y - 4, a.x + 4, a.y + 4); + + // hmm... TODO: optimize + if HelpersEnabled then begin + pen.Color := HelpersColor; + pen.Mode := pmMerge; + pen.Style := psDot; + brush.Style := bsClear; + if (editMode = modeRotate) then + begin + i := integer(round(olddist * sc)); + if i > 4 then begin + a := ToScreen(pivot.x, pivot.y); + Ellipse(a.x - i, a.y - i, a.x + i, a.y + i); + end; + end + else if editMode = modeScale then + begin + dx := MainTriangles[mouseOverTriangle].x[mouseOverCorner] - Pivot.x; + dy := MainTriangles[mouseOverTriangle].y[mouseOverCorner] - Pivot.y; + LineDxDy; + end; + end; + end; + + if (mouseOverEdge >= 0) then // highlight edge under cursor + begin + i := (mouseOverEdge + 1) mod 3; + a := ToScreen(MainTriangles[mouseOverTriangle].x[mouseOverEdge], MainTriangles[mouseOverTriangle].y[mouseOverEdge]); + b := ToScreen(MainTriangles[mouseOverTriangle].x[i], MainTriangles[mouseOverTriangle].y[i]); + + pen.Width:=5; + Pen.Color:=GetTriangleColor(mouseOverTriangle) shr 1 and $7f7f7f; + Pen.Mode:=pmMerge; + + MoveTo(a.X, a.Y); + LineTo(b.X, b.Y); + pen.Mode:=pmCopy; + pen.Width:=1; + end; + end; + + // draw pivot point + a := ToScreen(GetPivot.x, GetPivot.y); + Pen.Style := psSolid; + pen.Color := clWhite; + brush.Color := clSilver; + if (pivotMode = pivotLocal) or EdgeCaught then i := 2 + else i := 3; + Ellipse(a.x - i, a.y - i, a.x + i, a.y + i); + + if editMode = modePick then begin // hmm... + a := ToScreen(mouseOverPos.x, mouseOverPos.y); + brush.Style := bsClear; + Ellipse(a.x - i, a.y - i, a.x + i, a.y + i); + end; + + if TWinControl(Sender).Focused then + begin + pen.Color := HelpersColor; + pen.Mode := pmXor; + MoveTo(foc_ofs, foc_size); + LineTo(foc_ofs, foc_ofs); + LineTo(foc_size, foc_ofs); + MoveTo(Width-1-foc_ofs, foc_size); + LineTo(Width-1-foc_ofs, foc_ofs); + LineTo(Width-1-foc_size, foc_ofs); + MoveTo(Width-1-foc_ofs, Height-1-foc_size); + LineTo(Width-1-foc_ofs, Height-1-foc_ofs); + LineTo(Width-1-foc_size, Height-1-foc_ofs); + MoveTo(foc_ofs, Height-1-foc_size); + LineTo(foc_ofs, Height-1-foc_ofs); + LineTo(foc_size, Height-1-foc_ofs); + end; + end; + TriangleView.Canvas.Draw(0, 0, Bitmap); + finally + BitMap.Free; + end; +end; + +procedure TEditForm.FormCreate(Sender: TObject); +var + i: integer; + vn: string; + ExtSM: HMenu; +begin + mnuELowQuality.Caption := TextByKey('common-lowquality'); + mnuEMediumQuality.Caption := TextByKey('common-mediumquality'); + mnuEHighQuality.Caption := TextByKey('common-highquality'); + mnuLowQuality.Caption := TextByKey('common-lowquality'); + mnuMediumQuality.Caption := TextByKey('common-mediumquality'); + mnuHighQuality.Caption := TextByKey('common-highquality'); + tbCopy.Hint := TextByKey('common-copy'); + tbCopyTriangle.Hint := TextByKey('editor-popup-transform-copycoords'); + Copytrianglecoordinates1.Caption := TextByKey('editor-popup-transform-copycoords'); + Copytransform1.Caption := TextByKey('editor-popup-transform-copywhole'); + tbPaste.Hint := TextByKey('common-paste'); + tbPasteTriangle.Hint := TextByKey('editor-popup-transform-pastecoords'); + Pastetrianglecoordinates1.Caption := TextByKey('editor-popup-transform-pastecoords'); + Pastetransform1.Caption := TextByKey('editor-popup-transform-pastewhole'); + tbUndo.Caption := TextByKey('common-undo'); + tbUndo.Hint := TextByKey('common-undo'); + mnuUndo.Caption := TextByKey('common-undo'); + tbRedo.Caption := TextByKey('common-redo'); + tbRedo.Hint := TextByKey('common-redo'); + mnuRedo.Caption := TextByKey('common-redo'); + bClear.Caption := TextByKey('common-clear'); + pnlSymmetry.Hint := TextByKey('common-dragpanelhint'); + pnlOpacity.Hint := TextByKey('common-dragpanelhint'); + pnlDC.Hint := TextByKey('common-dragpanelhint'); + pnlWeight.Hint := TextByKey('common-dragpanelhint'); + pnlXFormColor.Hint := TextByKey('common-dragpanelhint'); // AV + self.Caption := TextByKey('editor-title'); + Panel1.Caption := TextByKey('editor-common-transform'); + Panel2.Caption := TextByKey('editor-common-name'); + pnlWeight.Caption := TextByKey('editor-common-weight'); + + tabVariations.Caption := TextByKey('editor-tab-variations-title'); + VEVars.TitleCaptions[0] := TextByKey('editor-tab-variations-name'); + VEVars.TitleCaptions[1] := TextByKey('editor-tab-variations-value'); + //chkCollapseVariations.Caption := TextByKey('editor-tab-variations-togglehideunused'); + cbCollapseVariations.Items[0] := TextByKey('editor-tab-variations-toggleshowall'); + cbCollapseVariations.Items[1] := TextByKey('editor-tab-variations-togglehideunused'); + cbCollapseVariations.Items[2] := TextByKey('editor-tab-variations-togglefavourites'); + btnVarOrder.Caption := TextByKey('editor-tab-variations-order'); + btnVarOrder.Hint := TextByKey('editor-tab-variations-orderhint'); + TabVariables.Caption := TextByKey('editor-tab-variables-title'); + vleVariables.TitleCaptions[0] := TextByKey('editor-tab-variables-name'); + vleVariables.TitleCaptions[1] := TextByKey('editor-tab-variables-value'); + chkCollapseVariables.Caption := TextByKey('editor-tab-variables-toggleshowall'); + btResetparams.Caption := TextByKey('editor-tab-variables-reset'); + TabChaos.Caption := TextByKey('editor-tab-chaos-title'); + vleChaos.TitleCaptions[0] := TextByKey('editor-tab-chaos-path'); + vleChaos.TitleCaptions[1] := TextByKey('editor-tab-chaos-modifier'); + optTo.Caption := TextByKey('editor-tab-chaos-viewasto'); + mnuChaosViewTo.Caption := TextByKey('editor-tab-chaos-viewasto'); + optFrom.Caption := TextByKey('editor-tab-chaos-viewasfrom'); + mnuChaosViewFrom.Caption := TextByKey('editor-tab-chaos-viewasfrom'); + TriangleTab.Caption := TextByKey('editor-tab-triangle-title'); + GroupBox3.Caption := TextByKey('editor-tab-triangle-pivot'); + GroupBox7.Caption := TextByKey('editor-tab-transform-coordsystem'); + GroupBox9.Caption := TextByKey('editor-tab-transform-affine'); + GroupBox8.Caption := TextByKey('editor-tab-transform-postaffine'); + btSwapCoefs.Caption:= TextByKey('editor-tab-transform-swapaffine'); + btSwapCoefs.Hint := TextByKey('editor-tab-transform-swapaffinehint'); + RotateXYO.Caption := TextByKey('editor-popup-triangle-rotateall'); + RotateX.Caption := TextByKey('editor-popup-triangle-rotatex'); + RotateY.Caption := TextByKey('editor-popup-triangle-rotatey'); + RotateO.Caption := TextByKey('editor-popup-triangle-rotateo'); + ScaleXYO.Caption := TextByKey('editor-popup-triangle-scaleall'); + ScaleX.Caption := TextByKey('editor-popup-triangle-scalex'); + ScaleY.Caption := TextByKey('editor-popup-triangle-scaley'); + ScaleO.Caption := TextByKey('editor-popup-triangle-scaleo'); + RectGrid.Caption := TextByKey('editor-popup-triangle-squaregrid'); + TriGrid.Caption := TextByKey('editor-popup-triangle-hexgrid'); + InvertMovevalue1.Caption := TextByKey('editor-popup-triangle-invertstep'); + CalcArcsinScale.Caption := TextByKey('editor-popup-triangle-arcsin'); + ShowModVals.Caption := TextByKey('editor-popup-triangle-display'); + mnuFlipAllLine.Caption := TextByKey('editor-popup-panel-allflipline'); + tbTriangle.Hint := TextByKey('editor-tab-triangle-menuhint'); + btnResetPivot.Hint := TextByKey('editor-tab-triangle-resetpivot'); + btnPickPivot.Hint := TextByKey('editor-tab-triangle-pickpivot'); + btTrgRotateLeft.Hint := TextByKey('editor-tab-triangle-rotateleft'); + btTrgRotateRight.Hint := TextByKey('editor-tab-triangle-rotateright'); + btTrgMoveUp.Hint := TextByKey('editor-tab-triangle-moveup'); + btTrgMoveDown.Hint := TextByKey('editor-tab-triangle-movedown'); + btTrgMoveLeft.Hint := TextByKey('editor-tab-triangle-moveleft'); + btTrgMoveRight.Hint := TextByKey('editor-tab-triangle-moveright'); + btTrgScaleDown.Hint := TextByKey('editor-tab-triangle-scaledown'); + btTrgScaleUp.Hint := TextByKey('editor-tab-triangle-scaleup'); + tbAutoWeights.Hint := TextByKey('editor-tab-triangle-autoweight'); + tabXForm.Caption := TextByKey('editor-tab-transform-title'); + btnResetCoefs.Caption := TextByKey('editor-tab-transform-reset'); + btnResetCoefs.Hint := TextByKey('editor-tab-transform-resethint'); + btnCoefsRect.Caption := TextByKey('editor-tab-transform-rectangular'); + btnCoefsRect.Hint := TextByKey('editor-tab-transform-rectangularhint'); + btnCoefsPolar.Caption := TextByKey('editor-tab-transform-polar'); + btnCoefsPolar.Hint := TextByKey('editor-tab-transform-polarhint'); + btnResetPostCoefs.Caption := TextByKey('editor-tab-transform-resetpost'); + btnResetPostCoefs.Hint := TextByKey('editor-tab-transform-resetposthint'); + btConjugate.Caption := 'TVT'#$02C9#$00B9#32#32 + TextByKey('editor-tab-transform-conjugate'); + btConjugate.Hint := TextByKey('editor-tab-transform-conjugatehint'); + chkAutoZScale.Caption := TextByKey('editor-tab-transform-autozscale'); + btnXcoefs.Hint := TextByKey('editor-tab-transform-resetxhint'); + btnXpost.Hint := TextByKey('editor-tab-transform-resetxhint'); + btnYcoefs.Hint := TextByKey('editor-tab-transform-resetyhint'); + btnYpost.Hint := TextByKey('editor-tab-transform-resetyhint'); + btnOcoefs.Hint := TextByKey('editor-tab-transform-resetohint'); + btnOpost.Hint := TextByKey('editor-tab-transform-resetohint'); + tabColors.Caption := TextByKey('editor-tab-color-title'); + GroupBox1.Caption := TextByKey('editor-tab-color-transformcolor'); + pnlSymmetry.Caption := TextByKey('editor-tab-color-colorspeed'); + pnlOpacity.Caption := TextByKey('editor-tab-color-opacity'); + pnlDC.Caption := TextByKey('editor-tab-color-directcolor'); + chkXFormSolo.Caption := TextByKey('editor-tab-color-togglesolo'); + GroupBox2.Caption := TextByKey('editor-tab-color-varpreview'); + GroupBox10.Caption := TextByKey('editor-tab-triangle-reflection'); + GroupBox5.Caption := TextByKey('editor-tab-triangle-transforms'); + GroupBox6.Caption := TextByKey('editor-tab-triangle-coordinates'); + btnResetFlip.Hint := TextByKey('editor-tab-triangle-resetflip'); + Label1.Caption := TextByKey('editor-tab-color-previewrange'); + Label2.Caption := TextByKey('editor-tab-color-previewdepth'); + Label3.Caption := TextByKey('editor-tab-color-previewdensity'); + Label1.Hint := TextByKey('editor-tab-color-previewrangehint'); + Label2.Hint := TextByKey('editor-tab-color-previewdepthhint'); + Label3.Hint := TextByKey('editor-tab-color-previewdensityhint'); + Label4.Caption := TextByKey('editor-tab-variations-search'); // AV + tbResetAll.Hint := TextByKey('editor-toolbar-newflame'); + tbAdd.Hint := TextByKey('editor-toolbar-newtransform'); + mnuAdd.Caption := TextByKey('editor-toolbar-newtransform'); + mnuAdd1.Caption := TextByKey('editor-toolbar-newtransform'); + tbPreLink.Hint := TextByKey('editor-toolbar-addlinkedpretransform'); + tbPostLink.Hint := TextByKey('editor-toolbar-addlinkedtransform'); + mnuLinkPostxform.Caption := TextByKey('editor-toolbar-addlinkedtransform'); + mnuLinkPrexform.Caption := TextByKey('editor-toolbar-addlinkedpretransform'); + tbDuplicate.Hint := TextByKey('editor-toolbar-duplicatetransform'); + mnuDuplicate.Caption := TextByKey('editor-toolbar-duplicatetransform'); + tbDelete.Hint := TextByKey('editor-toolbar-removetransform'); + mnuDelete.Caption := TextByKey('editor-toolbar-removetransform'); + tbSelect.Hint := TextByKey('editor-toolbar-modeselect'); + mnuSelectMode.Caption := TextByKey('editor-toolbar-modeselect'); + tbMove.Hint := TextByKey('editor-toolbar-modemove'); + tbRotate.Hint := TextByKey('editor-toolbar-moderotate'); + tbScale.Hint := TextByKey('editor-toolbar-modescale'); + tbPivotMode.Caption := TextByKey('editor-toolbar-toggleworldpivot'); + tbPivotMode.Hint := TextByKey('editor-toolbar-toggleworldpivot'); + tbRotate90CCW.Caption := TextByKey('editor-toolbar-rotate90ccw'); + tbRotate90CCW.Hint := TextByKey('editor-toolbar-rotate90ccw'); + btTrgRotateLeft90.Hint := TextByKey('editor-toolbar-rotate90ccw'); + RotateTriangle90CCW1.Caption := TextByKey('editor-toolbar-rotate90ccw'); + tbRotate90CW.Caption := TextByKey('editor-toolbar-rotate90cw'); + tbRotate90CW.Hint := TextByKey('editor-toolbar-rotate90cw'); + btTrgRotateRight90.Hint := TextByKey('editor-toolbar-rotate90cw'); + RotateTriangle90CCW2.Caption := TextByKey('editor-toolbar-rotate90cw'); + tbFlipHorz.Caption := TextByKey('editor-toolbar-fliph'); + tbFlipHorz.Hint := TextByKey('editor-toolbar-fliph'); + mnuFlipHorizontal.Caption := TextByKey('editor-toolbar-fliph'); + tbFlipVert.Caption := TextByKey('editor-toolbar-flipv'); + tbFlipVert.Hint := TextByKey('editor-toolbar-flipv'); + mnuFlipVertical.Caption := TextByKey('editor-toolbar-flipv'); + tbVarPreview.Caption := TextByKey('editor-toolbar-togglevarpreview'); + tbVarPreview.Hint := TextByKey('editor-toolbar-togglevarpreview'); + mnuShowVarPreview.Caption := TextByKey('editor-toolbar-togglevarpreview'); + tbPostXSwap.Caption := TextByKey('editor-toolbar-toggleposttransform'); + tbPostXSwap.Hint := TextByKey('editor-toolbar-toggleposttransform'); + tb2PostXSwap.Hint := TextByKey('editor-toolbar-toggleposttransform'); + oggleposttriangleediting1.Caption := TextByKey('editor-toolbar-toggleposttransform'); + tbEnableFinalxform.Caption := TextByKey('editor-toolbar-togglefinaltransform'); + tbEnableFinalxform.Hint := TextByKey('editor-toolbar-togglefinaltransform'); + mnuAutoZoom.Caption := TextByKey('editor-popup-panel-autozoom'); + tbExtendedEdit.Hint := TextByKey('editor-popup-panel-toggleextendededit'); + mnuExtendedEdit.Caption := TextByKey('editor-popup-panel-toggleextendededit'); + tbAxisLock.Hint := TextByKey('editor-popup-panel-locktransformaxes'); + mnuAxisLock.Caption := TextByKey('editor-popup-panel-locktransformaxes'); + btnShowLine.Caption := TextByKey('editor-tab-triangle-showline'); + btnShowLine.Hint := TextByKey('editor-tab-triangle-showlinehint'); + btnFlip.Caption := TextByKey('editor-tab-triangle-fliptriangle'); + btnFlip.Hint := TextByKey('editor-tab-triangle-fliptrianglehint'); + btFlipX.Hint := TextByKey('editor-tab-triangle-flipx'); + btFlipY.Hint := TextByKey('editor-tab-triangle-flipy'); + btFlipDiag.Hint := TextByKey('editor-tab-triangle-flipxy'); + lblFlipAngle.Hint := TextByKey('editor-status-angle'); + editPivotX.Hint := TextByKey('editor-tab-triangle-pivot1x'); + editPivotY.Hint := TextByKey('editor-tab-triangle-pivot1y'); + editFlipX.Hint := TextByKey('editor-tab-triangle-pivot2x'); + editFlipY.Hint := TextByKey('editor-tab-triangle-pivot2y'); + btnFullChaos.Hint := TextByKey('editor-toolbar-showchaos'); + ShowChaosMatrix.Caption := btnFullChaos.Hint; + + mnuFlipAllH.Caption := TextByKey('editor-popup-panel-allfliph'); + mnuFlipAllV.Caption := TextByKey('editor-popup-panel-allflipv'); + mnuResetLoc.Caption := TextByKey('editor-popup-quality-autoreset'); + mnuResetTrgPosition.Caption := TextByKey('editor-popup-transform-resetposition'); + mnuResetTrgRotation.Caption := TextByKey('editor-popup-transform-resetrotation'); + mnuResetTrgScale.Caption := TextByKey('editor-popup-transform-resetscale'); + mnuResetTrgFlip.Caption := TextByKey('editor-popup-transform-resetflip'); + mnuCopyTriangle.Caption := TextByKey('editor-popup-transform-copycoords'); + mnuPasteTriangle.Caption := TextByKey('editor-popup-transform-pastecoords'); + mnuReset.Caption := TextByKey('editor-popup-transform-resetentiretriangle'); + mnuChaosRebuild.Caption := TextByKey('editor-popup-chaos-rebuildlinks'); + mnuChaosClearAll.Caption := TextByKey('editor-popup-chaos-clearall'); + mnuChaosSetAll.Caption := TextByKey('editor-popup-chaos-setall'); + btClearChaos.Hint := TextByKey('editor-popup-chaos-clearall'); + btResetChaos.Hint := TextByKey('editor-popup-chaos-setall'); + NormChaos.Caption := TextByKey('editor-popup-chaos-normalize'); + RandomizeMatrix.Caption := TextByKey('editor-popup-chaos-randomize'); + RandomizeChaos.Caption := TextByKey('editor-popup-chaos-random'); + ResetChaos.Caption := TextByKey('editor-popup-chaos-reset'); + ChaosClearBelow.Caption := TextByKey('editor-popup-chaos-clearbelow'); + ClearAllAbove.Caption := TextByKey('editor-popup-chaos-clearabove'); + btnPivotMode.Hint := TextByKey('editor-tab-triangle-toworld'); + AddContainer.Caption := TextByKey('editor-popup-chaos-container'); + InheritWeights.Caption := TextByKey('editor-popup-chaos-keepweight'); + InvertXaos.Caption := TextByKey('editor-popup-chaos-invert'); + btChaos.Caption := TextByKey('editor-popup-chaos-showmenu'); + GridComboBox.Items[0] := TextByKey('editor-grid-rectangular'); + GridComboBox.Items[1] := TextByKey('editor-grid-polar'); + GridComboBox.Items[2] := TextByKey('editor-grid-bipolar'); + GridComboBox.Items[3] := TextByKey('editor-grid-elliptic'); + GridComboBox.ItemIndex := 0; + lblGridType.Caption := TextByKey('editor-grid-type'); + lblGridType.Hint := TextByKey('editor-grid-typehint'); + GroupBox5.Hint := StringReplace(TextByKey('editor-tab-triangle-transformshint'), + ',', ','#13, [rfReplaceAll]); + // Math constants + RedrawButtons; + btnMathPopup.Hint := TextByKey('editor-toolbar-pihint'); + Pifractions.Caption := TextByKey('editor-toolbar-pimenu') + #32#$03C0'...'; + InsertPi1.Caption := #$03C0; + Insert2Pi1.Caption := '2'#$03C0; + InsertPi21.Caption := #$03C0'/2'; + InsertPi31.Caption := #$03C0'/3'; + InsertPi41.Caption := #$03C0'/4'; + InsertPi61.Caption := #$03C0'/6'; + Insert1sqrt21.Caption := '1/'#$221A#$0305'2'; + Insertsqrt321.Caption := #$221A#$0305'3/2'; + Insertsqrt331.Caption := #$221A#$0305'3/3'; + Insertsqrt361.Caption := #$221A#$0305'3/6'; + Insertsqrt31.Caption := #$221A#$0305'3'; + SquareRoots1.Caption := TextByKey('editor-toolbar-squareroots'); + InsertGoldenratio1.Caption := TextByKey('editor-toolbar-goldenratio'); + InvCurrentNum.Caption := TextByKey('editor-toolbar-invert'); + Squarethenumber1.Caption := TextByKey('editor-toolbar-square'); + SquareRoot.Caption := TextByKey('editor-toolbar-squareroot'); + Mul2.Caption := TextByKey('editor-toolbar-multiply'); + Div2.Caption := TextByKey('editor-toolbar-divide'); + CalcCos.Caption := TextByKey('editor-toolbar-calccos'); + CalcSin.Caption := TextByKey('editor-toolbar-calcsin'); + CalcTan.Caption := TextByKey('editor-toolbar-calctan'); + UseDegrees.Caption := TextByKey('editor-toolbar-usedegrees'); + + ExtSM := GetSystemMenu(Handle, False); // AV + InsertMenu(ExtSM, UINT(5), MF_ByPosition or MF_Separator, 0, nil); + InsertMenu(ExtSM, UINT(6), MF_ByPosition, $C0, PChar(TextByKey('main-menu-screenshot'))); + + // Custom control setup + TriangleView := TCustomDrawControl.Create(self); + TriangleView.TabStop := True; + TriangleView.TabOrder := 0; + TriangleView.Parent := GrphPnl; + TriangleView.Align := alClient; + TriangleView.Visible := True; + + TriangleView.OnPaint := TriangleViewPaint; + + TriangleView.OnDblClick := TriangleViewDblClick; + TriangleView.OnMouseDown := TriangleViewMouseDown; + TriangleView.OnMouseMove := TriangleViewMouseMove; + TriangleView.OnMouseUp := TriangleViewMouseUp; + TriangleView.OnMouseWheel := TriangleViewMouseWheel; + TriangleView.OnKeyDown := TriangleViewKeyDown; + TriangleView.OnKeyUp := TriangleViewKeyUp; + + TriangleView.OnEnter := TriangleViewInvalidate; + TriangleView.OnExit := TriangleViewExit; + TriangleView.OnMouseLeave := TriangleViewmouseLeave; + + SetLength(VarsCache, NRVAR); // AV + for i:= 0 to NRVAR - 1 do begin + vn := Varnames(i); + VEVars.InsertRow(vn, '0', True); + VarsCache[i] := MinDouble; // AV: moved here + end; + for i:= 0 to GetNrVariableNames - 1 do begin + vn := GetVariableNameAt(i); + vleVariables.InsertRow(vn, '0', True); + end; + + vleChaos.InsertRow(Format(TextByKey('editor-common-toprefix'), [1]), '1', true); + mnuChaosRebuild.Checked := RebuildXaosLinks; + + GraphZoom := 1; + + case EditPrevQual of + 0: begin + mnuLowQuality.Checked := true; + PreviewDensity := prevLowQuality; + end; + 1: begin + mnuMediumQuality.Checked := true; + PreviewDensity := prevMediumQuality; + end; + 2: begin + mnuHighQuality.Checked := true; + PreviewDensity := prevHighQuality; + end; + end; + cp := TControlPoint.Create; + Render := TRenderer.Create; + + SelectMode := true; + editMode := modeMove; + AxisLock := TransformAxisLock; + tbAxisLock.Down := AxisLock; + ExtendedEdit := ExtEditEnabled; +// tbExtendedEdit.Down := ExtendedEdit; + widgetMode := modeRotate; +// tbExtendedEdit.ImageIndex := imgExtMove; + ShowFlipLine := False; + hasLinkX := False; + + EdgeCaught := false; + CornerCaught := false; + TriangleCaught := false; + mouseOverTriangle := -1; + mouseOverCorner := -1; + mouseOverEdge := -1; + mouseOverWidget := -1; + oldSelected := -1; + + MemTriangle.x[0] := 1; + MemTriangle.y[0] := 0; + MemTriangle.x[1] := 0; + MemTriangle.y[1] := 0; + MemTriangle.x[2] := 0; + MemTriangle.y[2] := 1; + + // AV: reflection start settings + FlipPoint.x := 0; + FlipPoint.y := 1; + + // AV: added some "magic" variation parameters presets :) + with vleVariables do + begin + with ItemProps['fan2_x'] do + begin + EditStyle := esPickList; + PickList.Add('1.41421'); + PickList.Add('1'); + PickList.Add('0.816497'); + PickList.Add('0.707107'); + PickList.Add('0.57735'); + PickList.Add('0.534522'); + PickList.Add('0.5'); + PickList.Add('0.471405'); + PickList.Add('0.447214'); + PickList.Add('0.426401'); + PickList.Add('0.408248'); + end; + with ItemProps['fan2_y'] do + begin + EditStyle := esPickList; + PickList.Add('6.28319'); + PickList.Add('4.71239'); + PickList.Add('4.18879'); + PickList.Add('3.92699'); + PickList.Add('3.66519'); + PickList.Add('3.59039'); + PickList.Add('3.53429'); + PickList.Add('3.49066'); + PickList.Add('3.45575'); + PickList.Add('3.42719'); + PickList.Add('3.40339'); + end; + with ItemProps['rings2_val'] do + begin + EditStyle := esPickList; + PickList.Add('1'); + PickList.Add('1.22474'); + PickList.Add('1.41421'); // degenerate case - circumferences + PickList.Add('2'); + end; + ItemProps['trianglecrop_mode'].PickList.CommaText := '"0","1","2"'; + ItemProps['projective_mode'].PickList.CommaText := '"0","1","2"';; + ItemProps['affine3D_mode'].PickList.CommaText := '"0","1","2"';; + ItemProps['spherecrop_mode'].PickList.CommaText := '"0","1","2"';; + for i := NrLocVar to NumBuiltInVars - 1 do + begin + vn := VarNames(i); + if pos('hypertile', vn) > 0 then + begin + ItemProps[vn + '_p'].PickList.CommaText := '"3","4","5","7","8"'; + ItemProps[vn + '_q'].PickList.CommaText := '"3","4","5","7","8"'; + end; + end; + + if NumBuiltInVars < NrVar then + begin + i := GetVariationIndex('hexes'); + if (i > 0) then + with ItemProps['hexes_rotate'] do + begin + EditStyle := esPickList; + PickList.Add('0.166667'); + PickList.Add('0.333333'); + PickList.Add('0.5'); + PickList.Add('0.666667'); + PickList.Add('0.833333'); + PickList.Add('1'); + end; + end; + end; + + // MainForm.Buttons.GetBitmap(9, btnResetPivot.Glyph); + // btnResetFlip.Glyph.Assign(btnResetPivot.Glyph); + + PageControl.ActivePage := tabVariations; // AV + cbCollapseVariations.ItemIndex := 0; // AV +end; + +procedure TEditForm.FormDestroy(Sender: TObject); +begin + cp.free; + Render.free; +end; + +procedure TEditForm.TriangleViewMouseMove(Sender: TObject; Shift: TShiftState; + X, Y: integer); +var + vx, vy, fx, fy: double; + mt, mc, me: integer; + a, t: double; + + i, j: integer; + d: double; + + i0, i1: integer; + + dx, dy, x1, y1: double; +label FoundCorner, Skip1, Skip2; +begin + Scale(fx, fy, x, y); + StatusBar.Panels[0].Text := Format(TextByKey('editor-status-xformat'), [fx]); + StatusBar.Panels[1].Text := Format(TextByKey('editor-status-yformat'), [fy]); + + if viewDragMode then // graph panning + begin + if (fx = oldx) and (fy = oldy) then exit; + viewDragged := true; + GcenterX := GcenterX - (fx - oldx); + GcenterY := GcenterY - (fy - oldy); + TriangleView.Refresh; + exit; + end; + + mt:=mouseOverTriangle; + mc:=MouseOverCorner; + me:=mouseOverEdge; + + if not (CornerCaught or TriangleCaught) then // look for a point under cursor + begin + mouseOverWidget := -1; + mouseOverEdge := -1; + mouseOverCorner:= -1; + mouseOverPos.x := fx; + mouseOverPos.y := fy; + + if SelectMode then + begin + i0:=0; + i1:=LastTriangle;//Transforms-1; + end + else begin + i0:=SelectedTriangle; + i1:=i0; + end; + + for i := i1 downto i0 do + begin + for j := 0 to 2 do // -- detect point hit first + begin + d := dist(fx, fy, MainTriangles[i].x[j], MainTriangles[i].y[j]); + if (d * GraphZoom * 50) < 4 then + begin + mouseOverTriangle := i; + mouseOverCorner := j; +// mouseOverEdge := -1; + +// -- from MouseDown -- for highlighting: +// TODO: optimize... + if (j = 1) then + begin + if PivotMode = pivotLocal then begin + Pivot.x := 0; + Pivot.y := 0; + end + else Pivot := GetPivot; + + LocalAxisLocked := true; + end + else begin + Pivot := GetPivot(mouseOverTriangle); + LocalAxisLocked := false; + end; + oldx := MainTriangles[mouseOverTriangle].x[j] - Pivot.X; + oldy := MainTriangles[mouseOverTriangle].y[j] - Pivot.Y; + olddist := Hypot(oldx, oldy); +// -- + +// -- for Pick Pivot + if editMode = modePick then + begin + mouseOverPos.x := MainTriangles[mouseOverTriangle].x[mouseOverCorner]; + mouseOverPos.y := MainTriangles[mouseOverTriangle].y[mouseOverCorner]; + end; +// --- + goto FoundCorner; + end; + end; + end; + + if ExtendedEdit then //and (oldMode = modeNone) then + begin + for i := 0 to 3 do // -- detect 'widget' hit + for j := 0 to 1 do begin + if abs(line_dist(fx, fy, Widgets[i][j].x, Widgets[i][j].y, + Widgets[i][j+1].x, Widgets[i][j+1].y) + ) * GraphZoom * 50 < 3 then + begin + mouseOverTriangle := SelectedTriangle; + mouseOverWidget := i; +// mouseOverEdge := -1; +// mouseOverCorner:= -1; + mouseOverPos.x := fx; + mouseOverPos.y := fy; + + goto FoundCorner; + end; + end; + + for i := i1 downto i0 do + begin + for j := 0 to 2 do // -- detect edge hit + begin + if abs(line_dist(fx, fy, MainTriangles[i].x[j], MainTriangles[i].y[j], + MainTriangles[i].x[(j+1) mod 3], MainTriangles[i].y[(j+1) mod 3]) + ) * GraphZoom * 50 < 3 then + begin + mouseOverTriangle:=i; + mouseOverEdge := j; +// mouseOverCorner:= -1; + mouseOverPos.x := fx; + mouseOverPos.y := fy; + + goto FoundCorner; + end; + end; + end; + end; + + i := InsideTriangle(fx, fy); + if i >= 0 then mouseOverTriangle:=i + else mouseOverTriangle:=-1; + +FoundCorner: + end; + + if (mouseOverTriangle >= 0) or (SelectMode = false) or (oldMode <> modeNone) then + begin + if (mouseOverWidget >= 0) and (oldMode = modeNone) then + TriangleView.Cursor := crEditRotate + else + if (mouseOverEdge >= 0) and (oldMode = modeNone) then begin // kinda hack, not good... + if mouseOverEdge = 2 then + TriangleView.Cursor := crEditScale + else + TriangleView.Cursor := crEditRotate; + end + else + case editMode of + modeMove: + TriangleView.Cursor := crEditMove; + modeRotate: + TriangleView.Cursor := crEditRotate; + modeScale: + TriangleView.Cursor := crEditScale; + modePick: + TriangleView.Cursor := crEditArrow; + end + end + else + TriangleView.Cursor := crEditArrow; //crDefault; + + Shift := Shift - [ssLeft]; + + if CornerCaught then // Modify a point /////////////////////////////////////// + begin + if (editMode = modeRotate) then // rotate point + begin // rotate point around pivot + d := dist(Pivot.X, Pivot.Y, fx, fy); + if d<>0 then begin + if ssShift in Shift then // angle snap + begin + try + t := StrToFloat(txtTrgRotateValue.Text)/180*PI; + //assert(t<>0); + except + t := 15.0*PI/180.0; + txtTrgRotateValue.Text := '15'; + end; + if t = 0 then goto Skip1; //? + + a := Round(arctan2(fy-Pivot.Y, fx-Pivot.X)/t)*t; + vx := olddist*cos(a); + vy := olddist*sin(a); + end + else begin +Skip1: + vx := (fx-Pivot.X)*olddist/d; + vy := (fy-Pivot.Y)*olddist/d; + a := arctan2(vy,vx) - arctan2(oldy,oldx); + end; + + if LocalAxisLocked then with MainTriangles[SelectedTriangle] do + begin + assert(SelectedCorner = 1); + x[0] := OldTriangle.x[0] + Pivot.X+vx - OldTriangle.x[1]; + y[0] := OldTriangle.y[0] + Pivot.Y+vy - OldTriangle.y[1]; + x[2] := OldTriangle.x[2] + Pivot.X+vx - OldTriangle.x[1]; + y[2] := OldTriangle.y[2] + Pivot.Y+vy - OldTriangle.y[1]; + end; + MainTriangles[SelectedTriangle].x[SelectedCorner] := Pivot.X+vx; + MainTriangles[SelectedTriangle].y[SelectedCorner] := Pivot.Y+vy; + end + else a := 0; + vy := abs( + arctan2(MainTriangles[SelectedTriangle].y[0]-MainTriangles[SelectedTriangle].y[1], + MainTriangles[SelectedTriangle].x[0]-MainTriangles[SelectedTriangle].x[1]) + -arctan2(MainTriangles[SelectedTriangle].y[2]-MainTriangles[SelectedTriangle].y[1], + MainTriangles[SelectedTriangle].x[2]-MainTriangles[SelectedTriangle].x[1]) + ); + if vy > PI then vy := 2*PI - vy; + StatusBar.Panels[2].Text := Format(TextByKey('editor-status-rotateformat'), [a*180/PI, vy*180/PI]); + end + else if (editMode = modeScale) then + begin // move point along vector ("scale") + if olddist<>0 then begin + d := (oldx*(fx-Pivot.X) + oldy*(fy-Pivot.Y))/olddist; + + if ssShift in Shift then // 'snapped' scale + begin + try // use move-value for 'scaling' point: + t := abs(StrToFloat(txtTrgMoveValue.Text)); + //assert(t<>0); + except + t := 0.1; + txtTrgMoveValue.Text := '0.1'; + end; + if t <> 0 then d := Trunc(d/t)*t; + end; + vx := oldx*d/olddist; + vy := oldy*d/olddist; + + if LocalAxisLocked then with MainTriangles[SelectedTriangle] do + begin + assert(SelectedCorner = 1); + x[0] := OldTriangle.x[0] + Pivot.X+vx - OldTriangle.x[1]; + y[0] := OldTriangle.y[0] + Pivot.Y+vy - OldTriangle.y[1]; + x[2] := OldTriangle.x[2] + Pivot.X+vx - OldTriangle.x[1]; + y[2] := OldTriangle.y[2] + Pivot.Y+vy - OldTriangle.y[1]; + end; + MainTriangles[SelectedTriangle].x[SelectedCorner] := Pivot.X + vx; + MainTriangles[SelectedTriangle].y[SelectedCorner] := Pivot.Y + vy; + + StatusBar.Panels[2].Text := Format(TextByKey('editor-status-scaleformat'), + [Hypot(vx, vy), d*100/olddist]); + end + else begin + MainTriangles[SelectedTriangle].x[SelectedCorner] := Pivot.X; + MainTriangles[SelectedTriangle].y[SelectedCorner] := Pivot.Y; + end; + end + else begin // snap/move + if ssShift in Shift then // snap to axis + begin + if abs(fx-Pivot.X) > abs(fy-Pivot.Y) then begin + vx := fx; + vy := Pivot.Y; + end + else begin + vx := Pivot.x; + vy := fy; + end; + end + else begin // just move + vx := fx; + vy := fy; + end; + if (SelectedCorner = 1) and AxisLock then with MainTriangles[SelectedTriangle] do + begin + x[0] := OldTriangle.x[0] + (vx - OldTriangle.x[1]); + y[0] := OldTriangle.y[0] + (vy - OldTriangle.y[1]); + x[2] := OldTriangle.x[2] + (vx - OldTriangle.x[1]); + y[2] := OldTriangle.y[2] + (vy - OldTriangle.y[1]); + end; + MainTriangles[SelectedTriangle].x[SelectedCorner] := vx; + MainTriangles[SelectedTriangle].y[SelectedCorner] := vy; + StatusBar.Panels[2].Text := Format(TextByKey('editor-status-moveformat'), [vx-(Pivot.X+oldx), vy-(Pivot.Y+oldy)]); + end; + // -- + HasChanged := True; + UpdateFlameX; +// UpdateFlame(False); + StatusBar.Refresh; + exit; + end + else if TriangleCaught then // Modify a whole triangle /////////////////////// + begin + if (editMode = modeRotate) then // rotate triangle + begin + a := arctan2(fy-Pivot.Y, fx-Pivot.X) - arctan2(oldy, oldx); + if ssShift in Shift then // angle snap + begin + try + t := StrToFloat(txtTrgRotateValue.Text)/180*PI; + //assert(t<>0); + except + t := 15.0*PI/180.0; + txtTrgRotateValue.Text := '15'; + end; + if t = 0 then goto Skip2; + + a := Round(a/t)*t + end; +Skip2: + MainTriangles[SelectedTriangle] := + RotateTrianglePoint(OldTriangle, Pivot.X, Pivot.Y, a); + + vx := MainTriangles[SelectedTriangle].x[0]-MainTriangles[SelectedTriangle].x[1]; + vy := MainTriangles[SelectedTriangle].y[0]-MainTriangles[SelectedTriangle].y[1]; + if abs(vx*(MainTriangles[SelectedTriangle].x[2]-MainTriangles[SelectedTriangle].x[1])+ + vy*(MainTriangles[SelectedTriangle].y[2]-MainTriangles[SelectedTriangle].y[1])) < 0.001 + then + StatusBar.Panels[2].Text := Format(TextByKey('editor-status-rotateformat2'), [a*180/PI, arctan2(vy, vx)*180/PI]) + else StatusBar.Panels[2].Text := Format(TextByKey('editor-status-rotateformat3'), [a*180/PI]); + end + else if (editMode = modeScale) then // scale + begin + if olddist<>0 then begin + vy := (oldx*(fx-Pivot.X) + oldy*(fy-Pivot.Y))/sqr(olddist); + + if ssShift in Shift then // 'snapped' scale + begin + try + t := abs(StrToFloat(txtTrgScaleValue.Text)/100.0 - 1.0); + //assert(t<>0); + except + t := 0.1; + txtTrgRotateValue.Text := '0.1'; + end; + if t <> 0 then vy := Trunc(vy/t)*t; + end; + + MainTriangles[SelectedTriangle] := + ScaleTrianglePoint(OldTriangle, Pivot.X, Pivot.Y, vy); + StatusBar.Panels[2].Text := Format(TextByKey('editor-status-scaleformat2'), [vy*100]); + end + else MainTriangles[SelectedTriangle] := OldTriangle; + end + else begin // snap/move + vx := fx - (Pivot.x + oldx); + vy := fy - (Pivot.y + oldy); + if ssShift in Shift then // snap to axis + begin + if abs(vx) > abs(vy) then vy := 0 + else vx := 0; + end; + with MainTriangles[SelectedTriangle] do + begin + x[0] := OldTriangle.x[0] + vx; + y[0] := OldTriangle.y[0] + vy; + x[1] := OldTriangle.x[1] + vx; + y[1] := OldTriangle.y[1] + vy; + x[2] := OldTriangle.x[2] + vx; + y[2] := OldTriangle.y[2] + vy; + end; + StatusBar.Panels[2].Text := Format(TextByKey('editor-status-moveformat2'), [vx, vy]); + end; + HasChanged := True; + UpdateFlameX; +// UpdateFlame(False); + StatusBar.Refresh; + exit; + end; + if ((mt <> mouseOverTriangle) or (mc <> MouseOverCorner) or (me <> MouseOverEdge)) then + begin + if (mouseOverTriangle >= 0) then + StatusBar.Panels[2].Text := Format(TextByKey('editor-status-transformformat'), [mouseOverTriangle+1]) + else StatusBar.Panels[2].Text := ''; + TriangleView.Refresh; + end + else if editMode = modePick then TriangleView.Refresh; // hmm... +end; + +procedure TEditForm.TriangleViewMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); +var + d, fx, fy: double; + i, j: integer; + i0, i1: integer; +label + FoundTriangle; +begin + TWinControl(Sender).SetFocus; + + viewDragged := false; + + Scale(fx, fy, x, y); + + if Button = mbLeft then + begin + if editMode = modePick then + begin + if (mouseOverCorner >= 0) then // snap to point + begin + fx := MainTriangles[mouseOverTriangle].x[mouseOverCorner]; + fy := MainTriangles[mouseOverTriangle].y[mouseOverCorner]; + end; + if PivotMode = pivotLocal then + with MainTriangles[SelectedTriangle] do begin +// xx := x[0] - x[1]; +// xy := y[0] - y[1]; +// yx := x[2] - x[1]; +// yy := y[2] - y[1]; + d := (xx*yy - yx*xy); + if d <> 0 then + begin + LocalPivot.x := ( (fx - x[1]) * yy - (fy - y[1]) * yx) / d; + LocalPivot.y := (-(fx - x[1]) * xy + (fy - y[1]) * xx) / d; + end + end + else begin + WorldPivot.x := fx; + WorldPivot.y := fy; + end; + editMode := oldMode; + oldMode := modeNone; + btnPickPivot.Down := false; + ShowSelectedInfo; + TriangleView.Invalidate; + exit; + end; + + Shift := Shift - [ssLeft]; + if SelectMode then + begin + i0:=0; + i1:=LastTriangle; + end + else begin // Only check selected triangle + i0:=SelectedTriangle; + i1:=i0; + end; + oldSelected := SelectedTriangle; + + for i := i1 downto i0 do + begin + for j := 0 to 2 do // detect corner hit + begin + d := dist(fx, fy, MainTriangles[i].x[j], MainTriangles[i].y[j]); + if (d * GraphZoom * 50) < 4 then + begin + SelectedTriangle := i; + CornerCaught := True; + + SelectedCorner := j; +// Pivot := GetPivot; + if (j = 1) then //and ((rgPivot.ItemIndex = 1) or (rgPivot.ItemIndex = 4)) then + begin + if PivotMode = pivotLocal then begin + Pivot.x := 0; + Pivot.y := 0; + end + else Pivot := GetPivot; + + LocalAxisLocked := true; + end + else begin + Pivot := GetPivot; + LocalAxisLocked := false; + end; + OldTriangle := MainTriangles[SelectedTriangle]; + oldx := MainTriangles[SelectedTriangle].x[j] - Pivot.X; + oldy := MainTriangles[SelectedTriangle].y[j] - Pivot.Y; + olddist := sqrt(sqr(oldx) + sqr(oldy)); + + HasChanged := false; + ShowSelectedInfo; + TriangleView.Invalidate; + exit; + end; + end; + end; + + if ExtendedEdit then //and (oldMode = modeNone) then + begin + for i := 0 to 3 do // -- detect 'widget' hit + for j := 0 to 1 do + begin + if abs(line_dist(fx, fy, Widgets[i][j].x, Widgets[i][j].y, + Widgets[i][j+1].x, Widgets[i][j+1].y) + ) * GraphZoom * 50 < 3 then + begin +// modeHack := true; + if (oldMode = modeNone) then + begin + modeHack := true; + oldMode := editMode; + editMode := modeRotate; + end; + goto FoundTriangle; + end; + end; + + for i := i1 downto i0 do + begin + for j := 0 to 2 do // -- detect edge hit + begin + if abs(line_dist(fx, fy, MainTriangles[i].x[j], MainTriangles[i].y[j], + MainTriangles[i].x[(j+1) mod 3], MainTriangles[i].y[(j+1) mod 3]) + ) * GraphZoom * 50 < 3 then + begin + SelectedTriangle := i; + EdgeCaught := true; +// modeHack := true; + if (oldMode = modeNone) then + begin + modeHack := true; + oldMode := editMode; + if j = 2 then + editMode := modeScale + else + if AxisLock then editMode := modeRotate + else +begin + // hacky... + CornerCaught := True; + editMode := modeRotate; + if j = 1 then SelectedCorner := 2 + else SelectedCorner := 0; + Pivot := GetPivot; + LocalAxisLocked := false; + OldTriangle := MainTriangles[SelectedTriangle]; + oldx := MainTriangles[SelectedTriangle].x[SelectedCorner] - Pivot.X; + oldy := MainTriangles[SelectedTriangle].y[SelectedCorner] - Pivot.Y; + olddist := sqrt(sqr(oldx) + sqr(oldy)); + + HasChanged := false; + ShowSelectedInfo; + TriangleView.Invalidate; + exit; +end; + end; + goto FoundTriangle; + end; + end; + end; + end; + + // so user hasn't selected any corners, + // let's check for triangles then! + + if SelectMode then + begin + i := InsideTriangle(fx, fy); + if i >= 0 then SelectedTriangle := i + else + if (oldMode = modeNone) and not(ssShift in Shift) then exit; + end; +FoundTriangle: + TriangleCaught := True; + + OldTriangle := MainTriangles[SelectedTriangle]; + //MainForm.UpdateUndo; + HasChanged := false; + + Pivot := GetPivot; + oldx := fx-Pivot.X; + oldy := fy-Pivot.Y; + olddist := sqrt(oldx*oldx + oldy*oldy); + + UpdateVariationList; // AV + ShowSelectedInfo; + TriangleView.Invalidate; + exit; + end + else if (Button = mbRight) and + not (TriangleCaught or CornerCaught) then // graph panning + begin + SetCaptureControl(TriangleView); + Screen.Cursor := crSizeAll; + + viewDragMode := true; + oldx := fx; + oldY := fy; + end; +end; + +procedure TEditForm.TriangleViewMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); +begin + if Button = mbLeft then + begin + if modeHack then begin + assert(oldMode <> modeNone); + editMode := oldMode; + oldMode := modeNone; + + modeHack := false; + end; + + if HasChanged then + begin + MainForm.UpdateUndo; + UpdateFlame(true); + HasChanged := False; + end; + EdgeCaught := false; + CornerCaught := false; + TriangleCaught := false; + TriangleView.Invalidate; + end + else if (Button = mbRight) and viewDragMode then + begin + viewDragMode := false; + + Screen.Cursor := crDefault; + SetCaptureControl(nil); + + if viewDragged = false then // haven't dragged - popup menu then + begin + //GetCursorPos(mousepos); // hmmm + mousePos := (Sender as TControl).ClientToScreen(Point(x, y)); + if mouseOverTriangle < 0 then + EditPopup.Popup(mousepos.x, mousepos.y) + else begin + SelectedTriangle := mouseOverTriangle; + cbTransforms.ItemIndex := SelectedTriangle; + TriangleView.Refresh; + TrianglePopup.Popup(mousepos.x, mousepos.y) + end; + end + else viewDragged := false; + end +end; + +// AV: added standart shotcuts for numeric feilds +procedure TEditForm.FormShortCut(var Msg: TWMKey; var Handled: Boolean); +begin + if GetKeyState(VK_CONTROL) >= 0 then + Exit; + + if Msg.CharCode = Ord('W') then begin + CreateScreenShot; + Handled := True; + end; + + if (ActiveControl = txtName) or (ActiveControl = txtSearchBox) then Exit; + if not ((ActiveControl is TEdit) or (ActiveControl is TComboBox)) then Exit; + + if Msg.CharCode = Ord('C') then begin + SendMessage(ActiveControl.Handle, WM_COPY, 0, 0); + Handled := True; + end + else + if Msg.CharCode = Ord('V') then begin + if not Clipboard.HasFormat(CF_TEXT) then + Handled := False + else begin + if StrToFloatDef(Clipboard.AsText, MaxDouble) <> MaxDouble then // hack + begin + SendMessage(ActiveControl.Handle, WM_PASTE, 0, 0); + Handled := True; + end + else + Handled := False; + end; + end + else + if Msg.CharCode = Ord('X') then begin + SendMessage(ActiveControl.Handle, WM_CUT, 0, 0); + Handled := True; + end + else + if Msg.CharCode = Ord('U') then begin + if (ActiveControl is TEdit) and TEdit(ActiveControl).CanUndo then + begin + TEdit(ActiveControl).Undo; + //SendMessage(ActiveControl.Handle, WM_UNDO, 0, 0); + Handled := True; + end + else + Handled := False; + end; +end; + +procedure TEditForm.FormShow(Sender: TObject); +var + Registry: TRegistry; +begin + Registry := TRegistry.Create; + try + Registry.RootKey := HKEY_CURRENT_USER; + if Registry.OpenKey('Software\' + APP_NAME + '\Forms\Editor', False) then + begin + { Size and position } + if Registry.ValueExists('Left') then + EditForm.Left := Registry.ReadInteger('Left'); + if Registry.ValueExists('Top') then + EditForm.Top := Registry.ReadInteger('Top'); + if Registry.ValueExists('Width') then + EditForm.Width := Registry.ReadInteger('Width'); + if Registry.ValueExists('Height') then + EditForm.Height := Registry.ReadInteger('Height'); + + if Registry.ValueExists('ResetLocation') then + mnuResetLoc.checked := Registry.ReadBool('ResetLocation') + else + mnuResetLoc.checked := false; + if Registry.ValueExists('HelpersEnabled') then + HelpersEnabled := Registry.ReadBool('HelpersEnabled') + else + HelpersEnabled := true; + + if Registry.ValueExists('VariationPreview') then + begin + showVarPreview := Registry.ReadBool('VariationPreview'); + tbVarPreview.Down := showVarPreview; + end + else begin + showVarPreview := false; + tbVarPreview.Down := false; + end; + + if Registry.ValueExists('VariationPreviewRange') then + trkVarPreviewRange.Position := Registry.ReadInteger('VariationPreviewRange'); + if Registry.ValueExists('VariationPreviewDensity') then + trkVarPreviewDensity.Position := Registry.ReadInteger('VariationPreviewDensity'); + if Registry.ValueExists('VariationPreviewDepth') then + trkVarPreviewDepth.Position := Registry.ReadInteger('VariationPreviewDepth'); + if Registry.ValueExists('VariationPreviewGrid') then + GridComboBox.ItemIndex := Registry.ReadInteger('VariationPreviewGrid'); + + if Registry.ValueExists('VariationFilter') then + cbCollapseVariations.ItemIndex := Registry.ReadInteger('VariationFilter'); + end + else begin + UseFlameBackground := False; + mnuResetLoc.checked := false; + end; + Registry.CloseKey; + finally + Registry.Free; + end; +// chkUseXFormColor.checked := UseTransformColors; +// chkHelpers.Checked := HelpersEnabled; + + if ExtendedEdit then tbExtendedEdit.Down := true + else tbMove.Down := true; + + UpdateDisplay; + TrianglePanelResize(nil); + ScrollBox1Resize(nil); +end; + +procedure TEditForm.mnuDeleteClick(Sender: TObject); +begin + if (SelectedTriangle >= 0) then DeleteTriangle(SelectedTriangle); +end; + +procedure TEditForm.mnuAddClick(Sender: TObject); +begin + if Transforms < NXFORMS then + begin + MainForm.UpdateUndo; + MainTriangles[Transforms+1] := MainTriangles[Transforms]; + cp.xform[Transforms+1].Assign(cp.xform[Transforms]); + MainTriangles[Transforms] := MainTriangles[-1]; + SelectedTriangle := Transforms; + cp.xform[Transforms].Clear(hasLinkX); + cp.xform[Transforms].density := 0.5; + cp.xform[Transforms].SetVariation(0, 1); + Inc(Transforms); + UpdateXformsList; + UpdateFlame(True); + end; +end; + +procedure TEditForm.mnuDupClick(Sender: TObject); +var + i: integer; +begin + if Transforms < NXFORMS then + begin + MainForm.UpdateUndo; + MainTriangles[Transforms+1] := MainTriangles[Transforms]; + cp.xform[Transforms+1].Assign(cp.xform[Transforms]); + if SelectedTriangle <> Transforms then + begin + MainTriangles[Transforms] := MainTriangles[SelectedTriangle]; + cp.xform[Transforms].Assign(cp.xform[SelectedTriangle]); + for i := 0 to Transforms-1 do + cp.xform[i].modWeights[Transforms] := cp.xform[i].modWeights[SelectedTriangle]; + cp.xform[Transforms].modWeights[Transforms] := cp.xform[SelectedTriangle].modWeights[SelectedTriangle]; + SelectedTriangle := Transforms; + end + else cp.xform[Transforms].density := 0.5; + Inc(Transforms); + UpdateXformsList; + UpdateFlame(True); + end; +end; + + +procedure TEditForm.mnuAutoZoomClick(Sender: TObject); +begin + AutoZoom; +end; + +procedure TEditForm.btChaosClick(Sender: TObject); +begin + vleChaos.SetFocus; + ChaosPopup.Popup(btChaos.ClientOrigin.x, btChaos.ClientOrigin.y + btChaos.Height); +end; + +procedure TEditForm.btConjugateClick(Sender: TObject); +var + deta: double; +begin + if not tbPostXSwap.Down then + begin + with cp.xform[SelectedTriangle] do + begin + deta := det(c[0,0], c[0,1], c[1,0], c[1,1]); + if (abs(deta) < 1E-4) then + begin + Application.MessageBox(PChar(TextByKey('editor-status-warninvert')), + PChar('Apophysis AV'), MB_ICONWARNING); + exit; + end; + MainForm.UpdateUndo; + p[0,0] := c[1,1] / deta; // d + p[0,1] := -c[0,1] / deta; // -c + p[1,0] := -c[1,0] / deta; // -b + p[1,1] := c[0,0] / deta; // a + p[2,0] := (c[1,0] * c[2,1] - c[1,1] * c[2,0]) / deta; // -d*e + b*f + p[2,1] := (c[0,1] * c[2,0] - c[0,0] * c[2,1]) / deta; // c*e - a*f + end; + cp.GetTriangle(MainTriangles[SelectedTriangle], SelectedTriangle); + end else + begin + with cp.xform[SelectedTriangle] do + begin + deta := det(p[0,0], p[0,1], p[1,0], p[1,1]); + if (abs(deta) < 1E-4) then + begin + Application.MessageBox(PChar(TextByKey('editor-status-warninvert')), + PChar('Apophysis AV'), MB_ICONWARNING); + exit; + end; + MainForm.UpdateUndo; + c[0,0] := p[1,1] / deta; + c[0,1] := -p[0,1] / deta; + c[1,0] := -p[1,0] / deta; + c[1,1] := p[0,0] / deta; + c[2,0] := (p[1,0] * p[2,1] - p[1,1] * p[2,0]) / deta; + c[2,1] := (p[0,1] * p[2,0] - p[0,0] * p[2,1]) / deta; + end; + cp.GetPostTriangle(MainTriangles[SelectedTriangle], SelectedTriangle); + end; + + UpdateFlame(true); +end; + +procedure TEditForm.btFlipXYClick(Sender: TObject); +begin + if (editPivotX.Text <> '0') or (editPivotY.Text <> '0') then + btnResetPivot.Click; + if (Sender = btFlipX) then + begin + FlipPoint.x := 1; editFlipX.Text := '1'; + FlipPoint.y := 0; editFlipY.Text := '0'; + end + else if (Sender = btFlipY) then + begin + FlipPoint.x := 0; editFlipX.Text := '0'; + FlipPoint.y := 1; editFlipY.Text := '1'; + end else // if Sender = btFlipDiag then + begin + FlipPoint.x := 1; editFlipX.Text := '1'; + FlipPoint.y := 1; editFlipY.Text := '1'; + end; + if not ShowFlipLine then CalcFlip; // refresh current angle + TriangleView.Invalidate; +end; + +procedure TEditForm.btnCloseClick(Sender: TObject); +begin + EditForm.Close; +end; + +procedure TEditForm.FormResize(Sender: TObject); +begin + AutoZoom; +end; + +procedure TEditForm.CornerEditExit(Sender: TObject); +var + Allow: boolean; + OldText: string; + Val: string; +begin + Allow := True; + if Sender = txtAx then + Val := Format('%.6f', [MainTriangles[SelectedTriangle].x[0]]) + else if Sender = txtAy then + Val := Format('%.6f', [MainTriangles[SelectedTriangle].y[0]]) + else if Sender = txtBx then + Val := Format('%.6f', [MainTriangles[SelectedTriangle].x[1]]) + else if Sender = txtBy then + Val := Format('%.6f', [MainTriangles[SelectedTriangle].y[1]]) + else if Sender = txtCx then + Val := Format('%.6f', [MainTriangles[SelectedTriangle].x[2]]) + else if Sender = txtCy then + Val := Format('%.6f', [MainTriangles[SelectedTriangle].y[2]]) + else if Sender = txtP then + if SelectedTriangle < Transforms then + val := Format('%.6f', [cp.xform[SelectedTriangle].density]); + OldText := Val; + { Test that it's a valid floating point number } + try + StrToFloat(TEdit(Sender).Text); + except on Exception do + begin + { It's not, so we restore the old value } + TEdit(Sender).Text := OldText; + Allow := False; + end; + end; + { If it's not the same as the old value and it was valid } + if (val <> TEdit(Sender).Text) and Allow then + begin + if Sender = txtAx then + MainTriangles[SelectedTriangle].x[0] := StrToFloat(TEdit(Sender).Text) + else if Sender = txtAy then + MainTriangles[SelectedTriangle].y[0] := StrToFloat(TEdit(Sender).Text) + else if Sender = txtBx then + MainTriangles[SelectedTriangle].x[1] := StrToFloat(TEdit(Sender).Text) + else if Sender = txtBy then + MainTriangles[SelectedTriangle].y[1] := StrToFloat(TEdit(Sender).Text) + else if Sender = txtCx then + MainTriangles[SelectedTriangle].x[2] := StrToFloat(TEdit(Sender).Text) + else if Sender = txtCy then + MainTriangles[SelectedTriangle].y[2] := StrToFloat(TEdit(Sender).Text) + else if Sender = txtP then + begin + cp.xform[SelectedTriangle].density := StrToFloat(TEdit(Sender).Text); + TEdit(Sender).Text := Format('%.6g', [cp.xform[SelectedTriangle].density]); + end; + MainForm.UpdateUndo; + UpdateFlame(True); + end; + + self.LastFocus := TEdit(sender); +end; + +procedure TEditForm.CornerEditKeyPress(Sender: TObject; var Key: Char); +var + Allow: boolean; + OldText: string; + Val: string; +begin + if key = #13 then + begin + Allow := True; + if Sender = txtAx then + Val := Format('%.6f', [MainTriangles[SelectedTriangle].x[0]]) + else if Sender = txtAy then + Val := Format('%.6f', [MainTriangles[SelectedTriangle].y[0]]) + else if Sender = txtBx then + Val := Format('%.6f', [MainTriangles[SelectedTriangle].x[1]]) + else if Sender = txtBy then + Val := Format('%.6f', [MainTriangles[SelectedTriangle].y[1]]) + else if Sender = txtCx then + Val := Format('%.6f', [MainTriangles[SelectedTriangle].x[2]]) + else if Sender = txtCy then + Val := Format('%.6f', [MainTriangles[SelectedTriangle].y[2]]) + else if Sender = txtP then + val := Format('%.6f', [cp.xform[SelectedTriangle].density]); + OldText := Val; + { Stop the beep } + Key := #0; + { Test that it's a valid floating point number } + try + StrToFloat(TEdit(Sender).Text); + except on Exception do + begin + { It's not, so we restore the old value } + TEdit(Sender).Text := OldText; + Allow := False; + end; + end; + { If it's not the same as the old value and it was valid } + if (val <> TEdit(Sender).Text) and Allow then + begin + if Sender = txtAx then + MainTriangles[SelectedTriangle].x[0] := StrToFloat(TEdit(Sender).Text) + else if Sender = txtAy then + MainTriangles[SelectedTriangle].y[0] := StrToFloat(TEdit(Sender).Text) + else if Sender = txtBx then + MainTriangles[SelectedTriangle].x[1] := StrToFloat(TEdit(Sender).Text) + else if Sender = txtBy then + MainTriangles[SelectedTriangle].y[1] := StrToFloat(TEdit(Sender).Text) + else if Sender = txtCx then + MainTriangles[SelectedTriangle].x[2] := StrToFloat(TEdit(Sender).Text) + else if Sender = txtCy then + MainTriangles[SelectedTriangle].y[2] := StrToFloat(TEdit(Sender).Text) + else if Sender = txtP then + begin + cp.xform[SelectedTriangle].density := StrToFloat(TEdit(Sender).Text); + TEdit(Sender).Text := Format('%.6g', [cp.xform[SelectedTriangle].density]); + end; + MainForm.UpdateUndo; + UpdateFlame(True); + end; + end; +end; + +{ ************************* Probability input ******************************** } + +procedure TEditForm.txtPKeyPress(Sender: TObject; var Key: Char); +var + Allow: boolean; + NewVal, OldVal: double; +begin + if (Key = '-') then Key:= #0; + if SelectedTriangle >= Transforms then key := #0; + if key = #13 then + begin + { Stop the beep } + Key := #0; + Allow := True; + OldVal := Round6(cp.xform[SelectedTriangle].density); + { Test that it's a valid floating point number } + try + StrToFloat(TEdit(Sender).Text); + except on Exception do + begin + { It's not, so we restore the old value } + TEdit(Sender).Text := Format('%.6g', [OldVal]); + Allow := False; + end; + end; + NewVal := Round6(StrToFloat(TEdit(Sender).Text)); + if NewVal < 0.000001 then NewVal := 0.000001; + if NewVal > MAX_WEIGHT then NewVal := MAX_WEIGHT; + { If it's not the same as the old value and it was valid } + TEdit(Sender).Text := Format('%.6g', [NewVal]); + if (OldVal <> NewVal) and Allow then + begin + MainForm.UpdateUndo; + cp.xform[SelectedTriangle].density := NewVal; + //ReadjustWeights(cp); + UpdateFlame(True); + if ChaosForm.Visible then // AV + ChaosForm.WeightVector.Invalidate; + end; + end; +end; + +procedure TEditForm.txtPExit(Sender: TObject); +var + Allow: boolean; + NewVal, OldVal: double; +begin + if SelectedTriangle >= Transforms then exit; + Allow := True; + OldVal := Round6(cp.xform[SelectedTriangle].density); + { Test that it's a valid floating point number } + try + StrToFloat(TEdit(Sender).Text); + except on Exception do + begin + { It's not, so we restore the old value } + TEdit(Sender).Text := Format('%.6g', [OldVal]); + Allow := False; + end; + end; + NewVal := Round6(StrToFloat(TEdit(Sender).Text)); + if NewVal < 0.000001 then NewVal := 0.000001; + if NewVal > MAX_WEIGHT then NewVal := MAX_WEIGHT; + { If it's not the same as the old value and it was valid } + TEdit(Sender).Text := Format('%.6g', [NewVal]); + if (OldVal <> NewVal) and Allow then + begin + MainForm.UpdateUndo; + cp.xform[SelectedTriangle].density := NewVal; + //ReadjustWeights(cp); + UpdateFlame(True); + if ChaosForm.Visible then // AV + ChaosForm.WeightVector.Invalidate; + end; + self.LastFocus := TEdit(sender); +end; + +{ **************************************************************************** } + +procedure TEditForm.FormClose(Sender: TObject; var Action: TCloseAction); +var + Registry: TRegistry; +begin + { Write position to registry } + Registry := TRegistry.Create; + try + Registry.RootKey := HKEY_CURRENT_USER; + { Defaults } + if Registry.OpenKey('\Software\' + APP_NAME + '\Forms\Editor', True) then + begin + { Options } + Registry.WriteBool('ResetLocation', mnuResetLoc.checked); + Registry.WriteBool('VariationPreview', showVarPreview); + Registry.WriteBool('HelpersEnabled', HelpersEnabled); + Registry.WriteInteger('VariationPreviewRange', trkVarPreviewRange.Position); + Registry.WriteInteger('VariationPreviewDensity', trkVarPreviewDensity.Position); + Registry.WriteInteger('VariationPreviewDepth', trkVarPreviewDepth.Position); + Registry.WriteInteger('VariationPreviewGrid', GridComboBox.ItemIndex); + Registry.WriteInteger('VariationFilter', cbCollapseVariations.ItemIndex); + { Size and position } + if EditForm.WindowState <> wsMaximized then begin + Registry.WriteInteger('Top', EditForm.Top); + Registry.WriteInteger('Left', EditForm.Left); + Registry.WriteInteger('Width', EditForm.Width); + Registry.WriteInteger('Height', EditForm.Height); + end; + end; + finally + Registry.Free; + end; +end; + +procedure TEditForm.mnuUndoClick(Sender: TObject); +begin + MainForm.Undo; +end; + +procedure TEditForm.MulDiv2Click(Sender: TObject); +var + num: double; + sn: string; +begin + if (not ValidNumField) then + begin + Application.MessageBox(PChar(TextByKey('editor-status-nonumfield')), + PChar('Apophysis AV'), MB_ICONWARNING); + exit; + end; + + if (txtTrgRotateValue.Focused) and (TMenuItem(Sender).Tag = 0) then exit; + try + if (ActiveControl is TEdit) then + sn := TEdit(ActiveControl).Text + else if (ActiveControl is TValueListEditor) then + sn := TValueListEditor(ActiveControl).Cells[1, TValueListEditor(ActiveControl).Row] + else // if (ActiveControl is TComboBox) then + sn := TComboBox(ActiveControl).Text; + num := StrToFloat(sn); + if (num <> 0) then + begin + case TMenuItem(Sender).Tag of + 0: if (txtTrgScaleValue.Focused) then + sn := Format('%.6g', [num * num * 0.01]) + else sn := Format('%.6g', [num * num]); + 1: sn := Format('%.6g', [num * 2]); + 2: sn := Format('%.6g', [num * 0.5]); + else if (txtTrgScaleValue.Focused) then + sn := Format('%.6g', [sign(num) * sqrt(abs(num * 0.01)) * 100]) + else sn := Format('%.6g', [sign(num) * sqrt(abs(num))]); + end; + + if (ActiveControl is TEdit) then + begin + TEdit(ActiveControl).Text := sn; + TEdit(ActiveControl).OnExit(ActiveControl); + end + else if (ActiveControl is TValueListEditor) then + begin + TValueListEditor(ActiveControl).Cells[1, TValueListEditor(ActiveControl).Row] := sn; + TValueListEditor(ActiveControl).OnExit(ActiveControl); + end + else //if (ActiveControl is TComboBox) then + TComboBox(ActiveControl).Text := sn; + end; + except + end; +end; + +procedure TEditForm.NormChaosClick(Sender: TObject); +var i, j: integer; + sum: double; +begin + MainForm.UpdateUndo; + for i := 0 to Transforms-1 do + begin + sum := 0; + for j := 0 to Transforms-1 do + sum := sum + cp.xform[i].modWeights[j]; + if sum = 1.0 then Exit; + if (sum > 0) then + for j := 0 to Transforms-1 do + cp.xform[i].modWeights[j] := cp.xform[i].modWeights[j] / sum; + end; + UpdateFlame(True); + if ChaosForm.Visible then // AV + ChaosForm.ChaosMatrix.Invalidate; +end; + +procedure TEditForm.mnuRedoClick(Sender: TObject); +begin + MainForm.Redo; +end; + +procedure TEditForm.mnuLowQualityClick(Sender: TObject); +begin + mnuLowQuality.Checked := True; + mnuELowQuality.Checked := True; + PreviewDensity := prevLowQuality; + EditPrevQual := 0; + DrawPreview; + TriangleViewPaint(TriangleView); +end; + +procedure TEditForm.mnuHighQualityClick(Sender: TObject); +begin + mnuHighQuality.Checked := True; + mnuEHighQuality.Checked := True; + PreviewDensity := prevHighQuality; + EditPrevQual := 2; + DrawPreview; + TriangleViewPaint(TriangleView); +end; + +procedure TEditForm.mnuMediumQualityClick(Sender: TObject); +begin + mnuMediumQuality.Checked := True; + mnuEMediumQuality.Checked := True; + PreviewDensity := prevMediumQuality; + EditPrevQual := 1; + DrawPreview; + TriangleViewPaint(TriangleView); +end; + +procedure TEditForm.mnuResetLocClick(Sender: TObject); +var + reset: boolean; +begin + reset:= not mnuResetLoc.Checked; + mnuResetLoc.Checked := reset; + if reset then + begin + cp.width := MainCp.width; + cp.height := MainCp.height; + cp.pixels_per_unit := MainCp.pixels_per_unit; + cp.AdjustScale(PreviewImage.width, PreviewImage.Height); + cp.zoom := MainCp.zoom; + cp.center[0] := MainCp.center[0]; + cp.center[1] := MainCp.center[1]; + end; + DrawPreview; +end; + +procedure TEditForm.mnuFlipAllVClick(Sender: TObject); +var + i: integer; +begin + MainForm.UpdateUndo; + for i := -1 to Transforms do + begin + MainTriangles[i] := FlipTriangleVertical(MainTriangles[i]); + end; + cp.GetFromTriangles(MainTriangles, Transforms); + cp.TrianglesFromCP(MainTriangles); + AutoZoom; + UpdateFlame(True); +end; + +procedure TEditForm.mnuFlipAllHClick(Sender: TObject); +var + i: integer; +begin + MainForm.UpdateUndo; + for i := -1 to Transforms do + begin + MainTriangles[i] := FlipTriangleHorizontal(MainTriangles[i]); + end; + cp.GetFromTriangles(MainTriangles, Transforms); + cp.TrianglesFromCP(MainTriangles); + AutoZoom; + UpdateFlame(True); +end; + +procedure TEditForm.mnuFlipAllLineClick(Sender: TObject); // AV +var + i: integer; +begin + if (FlipPoint.x = 0) and (FlipPoint.y = 0) then exit; + if (FlipPoint.x = 0) then mnuFlipAllH.Click + else if (FlipPoint.y = 0) then mnuFlipAllV.Click + else begin + MainForm.UpdateUndo; + for i := -1 to Transforms do + MainTriangles[i] := FlipTriangleLine(MainTriangles[i], 0, 0, + FlipPoint.x, FlipPoint.y); + cp.GetFromTriangles(MainTriangles, Transforms); + cp.TrianglesFromCP(MainTriangles); + AutoZoom; + UpdateFlame(True); + end; +end; + +procedure TEditForm.mnuFlipVerticalClick(Sender: TObject); +var + p: double; +begin + MainForm.UpdateUndo; + with MainTriangles[SelectedTriangle] do + begin + p := GetPivot.y * 2; + y[0] := p - y[0]; + y[1] := p - y[1]; + y[2] := p - y[2]; + end; + //AutoZoom; + UpdateFlame(True); +end; + +procedure TEditForm.mnuFlipHorizontalClick(Sender: TObject); +var + p: double; +begin + MainForm.UpdateUndo; + with MainTriangles[SelectedTriangle] do + begin + p := GetPivot.x * 2; + x[0] := p - x[0]; + x[1] := p - x[1]; + x[2] := p - x[2]; + end; + //AutoZoom; + UpdateFlame(True); +end; + +procedure TEditForm.cbTransformsChange(Sender: TObject); +var + n: integer; +begin + n := cbTransforms.ItemIndex; + + if (n <> SelectedTriangle) and (n >= 0) and (n <= LastTriangle) then + begin + SelectedTriangle := n; + UpdateVariationList; // AV + ShowSelectedInfo; + TriangleView.Invalidate; + end; +end; + +procedure TEditForm.cbTransformsDrawItem(Control: TWinControl; + Index: Integer; Rect: TRect; State: TOwnerDrawState); +var + h: integer; + ax,ay,bx,by: integer; + TrgColor: TColor; +begin + assert(Index >= 0); + TrgColor := GetTriangleColor(Index); + with cbTransforms.Canvas do + begin + h := Rect.Bottom - Rect.Top; + + brush.Color:=clBlack; + FillRect(Rect); + + Font.Color := clWhite; + TextOut(Rect.Left+h+2, Rect.Top, cbTransforms.Items[Index]); //IntToStr(Index+1)); + + pen.Color := TrgColor; + brush.Color := pen.Color shr 1 and $7f7f7f; + + ax:=Rect.Left+h-2; + ay:=Rect.Top+1; + bx:=Rect.Left+2; + by:=Rect.Bottom-3; + Polygon([Point(ax, ay), Point(ax, by), Point(bx, by)]); + end; +end; + +procedure TEditForm.ChaosClearBelowClick(Sender: TObject); +var i, n: integer; +begin + n := vleChaos.Row; + if n = Transforms then exit; + MainForm.UpdateUndo; + if mnuChaosViewTo.Checked then + for i := n to Transforms-1 do + cp.xform[SelectedTriangle].modWeights[i] := 0 + else for i := n to Transforms-1 do + cp.xform[i].modWeights[SelectedTriangle] := 0; + UpdateFlame(true); + if ChaosForm.Visible then // AV + ChaosForm.ChaosMatrix.Invalidate; +end; + +procedure TEditForm.ClearAllAboveClick(Sender: TObject); +var i, n: integer; +begin + n := vleChaos.Row; + if (n < 2) then exit; + MainForm.UpdateUndo; + if mnuChaosViewTo.Checked then + for i := 0 to n-2 do + cp.xform[SelectedTriangle].modWeights[i] := 0 + else for i := 0 to n-2 do + cp.xform[i].modWeights[SelectedTriangle] := 0; + UpdateFlame(true); + if ChaosForm.Visible then // AV + ChaosForm.ChaosMatrix.Invalidate; +end; + +procedure TEditForm.CoefKeyPress(Sender: TObject; var Key: Char); +begin + if key <> #13 then exit; + key := #0; + CoefValidate(Sender); +end; + +procedure TEditForm.CoefValidate(Sender: TObject); +var + NewVal: double; + x, y, r, a: double; // dumb... must optimize +begin + try + NewVal := Round6(StrToFloat(TEdit(Sender).Text)); + except on Exception do + begin + ShowSelectedInfo; //TEdit(Sender).Text := Format('%.6g', [pVal^]); + exit; + end; + end; + + //TEdit(Sender).Text := Format('%.6g', [NewVal]); + + MainForm.UpdateUndo; // TODO - prevent unnecessary UpdateUndo... + with cp.xform[SelectedTriangle] do + begin + if btnCoefsRect.Down = true then + begin + if Sender = txtA then c[0][0] := NewVal + else if Sender = txtB then c[0][1] := -NewVal + else if Sender = txtC then c[1][0] := -NewVal + else if Sender = txtD then c[1][1] := NewVal + else if Sender = txtE then c[2][0] := NewVal + else if Sender = txtF then c[2][1] := -NewVal; + end + else begin + if (Sender = txtA) or (Sender = txtB) then begin + x := c[0][0]; + y := -c[0][1]; + end else + if (Sender = txtC) or (Sender = txtD) then begin + x := -c[1][0]; + y := c[1][1]; + end else + {if (Sender = txtE) or (Sender = txtF) then} + begin + x := c[2][0]; + y := -c[2][1]; + end; + r := Hypot(x, y); + a := arctan2(y, x); + + if (Sender = txtA) or (Sender = txtC) or (Sender = txtE) then + r := NewVal + else + a := NewVal*PI/180; + + x := r * cos(a); + y := r * sin(a); + if (Sender = txtA) or (Sender = txtB) then begin + c[0][0] := x; + c[0][1] := -y; + end else + if (Sender = txtC) or (Sender = txtD) then begin + c[1][0] := -x; + c[1][1] := y; + end else + {if (Sender = txtE) or (Sender = txtF) then} + begin + c[2][0] := x; + c[2][1] := -y; + end; + end; + end; + + cp.TrianglesFromCP(MainTriangles); + if tbAutoWeights.Down then cp.CalculateWeights; // AV + ShowSelectedInfo; + UpdateFlame(true); + + self.LastFocus := TEdit(sender); +end; + +procedure TEditForm.scrlXFormColorScroll(Sender: TObject; + ScrollCode: TScrollCode; var ScrollPos: Integer); +begin + if (ScrollCode = scEndScroll) and HasChanged then begin + MainForm.UpdateUndo; + UpdateFlame(True); + end; +end; + +procedure TEditForm.scrlXFormColorChange(Sender: TObject); +var + v: double; +begin + if updating then exit; + + v := (scrlXFormColor.Position) / scrlXFormColor.Max; + if v <> cp.xform[SelectedTriangle].color then + begin + cp.xform[SelectedTriangle].color := v; + pnlXFormColor.color := ColorValToColor(MainCp.cmap, v); + shColor.Brush.Color := pnlXFormColor.Color; + txtXFormColor.Text := Format('%1.3f', [v]); + txtXFormColor.Refresh; + + HasChanged := true; + DrawPreview; + end; +end; + +function TEditForm.ValidNumField: boolean; +begin + Result := (ActiveControl is TEdit); + if Result then + if (ActiveControl = txtSearchBox) or (ActiveControl = txtName) then + Exit(False); + Result := Result or (ActiveControl is TValueListEditor) or (ActiveControl is TComboBox); +end; + +(* +procedure TEditForm.chkUseXFormColorClick(Sender: TObject); +begin + UseTransformColors := chkUseXFormColor.checked; + TriangleView.Invalidate; +end; + +procedure TEditForm.chkHelpersClick(Sender: TObject); +begin + HelpersEnabled := chkHelpers.checked; + TriangleView.Invalidate; +end; +*) + +procedure TEditForm.txtXFormColorExit(Sender: TObject); +var + v: double; +begin + try + v := StrToFloat(txtXFormColor.Text); + except on EConvertError do + begin + txtXformColor.text := Format('%1.3f', [cp.xform[SelectedTriangle].color]); + exit; + end; + end; + if v > 1 then v := 1; + if v < 0 then v := 0; + if v <> cp.xform[SelectedTriangle].color then + begin + updating := true; + scrlXFormColor.Position := round(v * scrlXFormColor.Max); + MainForm.UpdateUndo; + cp.xform[SelectedTriangle].color := v; + updating := false; + UpdateFlame(true); + end; +end; + +procedure TEditForm.txtXFormColorKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = '-') then Key:= #0; // AV + if key = #13 then + begin + key := #0; + txtXFormColorExit(Sender); + end; +end; + +procedure TEditForm.txtOpacitySet(Sender: TObject); +var + Allow: boolean; + NewVal, OldVal: double; +begin + Allow := True; + OldVal := Round6(cp.xform[SelectedTriangle].transOpacity); + { Test that it's a valid floating point number } + try + StrToFloat(TEdit(Sender).Text); + except on Exception do + begin + { It's not, so we restore the old value } + TEdit(Sender).Text := Format('%.6g', [OldVal]); + Allow := False; + end; + end; + NewVal := Round6(StrToFloat(TEdit(Sender).Text)); + if NewVal < 0 then NewVal := 0; + if NewVal > 1 then NewVal := 1; + { If it's not the same as the old value and it was valid } + TEdit(Sender).Text := Format('%.6g', [NewVal]); + if (OldVal <> NewVal) and Allow then + begin + MainForm.UpdateUndo; + cp.xform[SelectedTriangle].transOpacity := NewVal; + UpdateFlame(True); + end; +end; + +procedure TEditForm.txtDCSet(Sender: TObject); +var + Allow: boolean; + NewVal, OldVal: double; +begin + Allow := True; + OldVal := Round6(cp.xform[SelectedTriangle].pluginColor); + { Test that it's a valid floating point number } + try + StrToFloat(TEdit(Sender).Text); + except on Exception do + begin + { It's not, so we restore the old value } + TEdit(Sender).Text := Format('%.6g', [OldVal]); + Allow := False; + end; + end; + NewVal := Round6(StrToFloat(TEdit(Sender).Text)); + if NewVal < 0 then NewVal := 0; + if NewVal > 1 then NewVal := 1; + { If it's not the same as the old value and it was valid } + TEdit(Sender).Text := Format('%.6g', [NewVal]); + if (OldVal <> NewVal) and Allow then + begin + MainForm.UpdateUndo; + cp.xform[SelectedTriangle].pluginColor := NewVal; + UpdateFlame(True); + end; +end; + +procedure TEditForm.txtSymmetrySet(Sender: TObject); +var + Allow: boolean; + NewVal, OldVal: double; +begin + Allow := True; + OldVal := Round6(cp.xform[SelectedTriangle].symmetry); + { Test that it's a valid floating point number } + try + StrToFloat(TEdit(Sender).Text); + except on Exception do + begin + { It's not, so we restore the old value } + TEdit(Sender).Text := Format('%.6g', [OldVal]); + Allow := False; + end; + end; + NewVal := Round6(StrToFloat(TEdit(Sender).Text)); + if NewVal < -1 then NewVal := -1; + if NewVal > 1 then NewVal := 1; + { If it's not the same as the old value and it was valid } + TEdit(Sender).Text := Format('%.6g', [NewVal]); + if (OldVal <> NewVal) and Allow then + begin + MainForm.UpdateUndo; + cp.xform[SelectedTriangle].symmetry := NewVal; + UpdateFlame(True); + end; +end; + +procedure TEditForm.txtOpacityKeyPress(Sender: TObject; var Key: Char); +var + Allow: boolean; + NewVal, OldVal: double; +begin + if (Key = '-') then Key:= #0; // AV + if key = #13 then + begin + { Stop the beep } + Key := #0; + Allow := True; + OldVal := Round6(cp.xform[SelectedTriangle].transOpacity); + { Test that it's a valid floating point number } + try + StrToFloat(TEdit(Sender).Text); + except on Exception do + begin + { It's not, so we restore the old value } + TEdit(Sender).Text := Format('%.6g', [OldVal]); + Allow := False; + end; + end; + NewVal := Round6(StrToFloat(TEdit(Sender).Text)); + if NewVal < 0 then NewVal := 0; + if NewVal > 1 then NewVal := 1; + { If it's not the same as the old value and it was valid } + TEdit(Sender).Text := Format('%.6g', [NewVal]); + if (OldVal <> NewVal) and Allow then + begin + MainForm.UpdateUndo; + cp.xform[SelectedTriangle].transOpacity := NewVal; + UpdateFlame(True); + end; + end; +end; + +procedure TEditForm.txtDCKeyPress(Sender: TObject; var Key: Char); +var + Allow: boolean; + NewVal, OldVal: double; +begin + if (Key = '-') then Key:= #0; + if key = #13 then + begin + { Stop the beep } + Key := #0; + Allow := True; + OldVal := Round6(cp.xform[SelectedTriangle].pluginColor); + { Test that it's a valid floating point number } + try + StrToFloat(TEdit(Sender).Text); + except on Exception do + begin + { It's not, so we restore the old value } + TEdit(Sender).Text := Format('%.6g', [OldVal]); + Allow := False; + end; + end; + NewVal := Round6(StrToFloat(TEdit(Sender).Text)); + if NewVal < 0 then NewVal := 0; + if NewVal > 1 then NewVal := 1; + { If it's not the same as the old value and it was valid } + TEdit(Sender).Text := Format('%.6g', [NewVal]); + if (OldVal <> NewVal) and Allow then + begin + MainForm.UpdateUndo; + cp.xform[SelectedTriangle].pluginColor := NewVal; + UpdateFlame(True); + end; + end; +end; + +procedure TEditForm.txtSymmetrKeyPress(Sender: TObject; var Key: Char); +var + Allow: boolean; + NewVal, OldVal: double; +begin + if key = #13 then + begin + { Stop the beep } + Key := #0; + Allow := True; + OldVal := Round6(cp.xform[SelectedTriangle].symmetry); + { Test that it's a valid floating point number } + try + StrToFloat(TEdit(Sender).Text); + except on Exception do + begin + { It's not, so we restore the old value } + TEdit(Sender).Text := Format('%.6g', [OldVal]); + Allow := False; + end; + end; + NewVal := Round6(StrToFloat(TEdit(Sender).Text)); + if NewVal < -1 then NewVal := -1; + if NewVal > 1 then NewVal := 1; + { If it's not the same as the old value and it was valid } + TEdit(Sender).Text := Format('%.6g', [NewVal]); + if (OldVal <> NewVal) and Allow then + begin + MainForm.UpdateUndo; + cp.xform[SelectedTriangle].symmetry := NewVal; + UpdateFlame(True); + end; + end; +end; + +// -- Variation List Editor ---------------------------------------------------- + +procedure TEditForm.ValidateVariation; +var + i: integer; + NewVal, OldVal: double; +begin + //i := VEVars.Row - 1; + i := GetVariationIndex(VEVars.Keys[VEVars.Row]); // AV + + OldVal := Round6(cp.xform[SelectedTriangle].GetVariation(i)); + try + NewVal := Round6(StrToFloat(VEVars.Values[VarNames(i)])); + except + VEVars.Values[VarNames(i)] := Format('%.6g', [OldVal]); + exit; + end; + if (NewVal <> OldVal) then + begin + MainForm.UpdateUndo; + cp.xform[SelectedTriangle].SetVariation(i, NewVal); + VEVars.Values[VarNames(i)] := Format('%.6g', [NewVal]); + ShowSelectedInfo; + UpdateFlame(True); + end; + //chkCollapseVariationsClick(nil); + //chkCollapseVariablesClick(nil); +end; + +(* + +// here's another way to do this - +// we could use it with variables value editor, +// only if we had an *array* of variables + +type + TDblArray = array of double; + PDblArray = ^TDblArray; + +procedure ValidateValue(Sender: TValueListEditor; values: PDblArray); +var + Allow: boolean; + i: integer; + NewVal, OldVal: double; +begin + Allow := True; + + i := Sender.Row - 1; + + OldVal := values^[i]; +{ Test that it's a valid floating point number } + try + StrToFloat(Sender.Values[VarNames(i)]); + except on Exception do + begin + { It's not, so we restore the old value } + Sender.Values[VarNames(i)] := Format('%.6g', [OldVal]); + Allow := False; + end; + end; + NewVal := Round6(StrToFloat(Sender.Values[VarNames(i)])); + Sender.Values[VarNames(i)] := Format('%.6g', [NewVal]); + +{ If it's not the same as the old value and it was valid } + if (NewVal <> OldVal) and Allow then + begin + MainForm.UpdateUndo; + values^[i] := NewVal; + Sender.Values[VarNames(i)] := Format('%.6g', [NewVal]); + EditForm.ShowSelectedInfo; + EditForm.UpdateFlame(True); + end; +end; +*) + +procedure TEditForm.VEVarsKeyPress(Sender: TObject; var Key: Char); +begin + if key = #13 then + begin + key := #0; + ValidateVariation; + end; +end; + +procedure TEditForm.VEVarsChange(Sender: TObject); +begin + ValidateVariation; +end; + +procedure TEditForm.VEVarsValidate(Sender: TObject; ACol, ARow: Integer; const KeyName, KeyValue: String); +begin + ValidateVariation; +end; + +// -- ValueList mouse stuff ---------------------------------------------------- + +procedure TEditForm.VEVarsMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +var + cell: TGridCoord; +begin + if Button = mbLeft then begin + varDragOld:=x; + cell := TValueListEditor(Sender).MouseCoord(x, y); + + varDragIndex := cell.Y-1; + + if (cell.y < 1) or (cell.y >= TValueListEditor(Sender).RowCount) or + (cell.x <> 0) then exit; + + TValueListEditor(Sender).Row := cell.Y; + + Screen.Cursor := crHSplit; + + //GetCursorPos(mousepos); // hmmm + mousePos := (Sender as TControl).ClientToScreen(Point(x, y)); + + varDragMode:=true; + varDragPos:=0; + varMM := false; + SetCaptureControl(TValueListEditor(Sender)); + if Sender = VEVars then + begin + varDragIndex := GetVariationIndex(VEVars.Keys[varDragIndex+1]); // AV + varDragValue := cp.xform[SelectedTriangle].GetVariation(varDragIndex); + end + else if Sender = vleVariables then + cp.xform[SelectedTriangle].GetVariable(vleVariables.Keys[varDragIndex+1], varDragValue) + else if Sender = vleChaos then begin + if mnuChaosViewTo.Checked then + pDragValue := @cp.xform[SelectedTriangle].modWeights[varDragIndex] + else + pDragValue := @cp.xform[varDragIndex].modWeights[SelectedTriangle]; + varDragValue := pDragValue^; + end + else Assert(false); + + HasChanged := False; + end; +end; + +procedure TEditForm.VEVarsMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); +var + v: double; + cell: TGridCoord; +begin + cell := TValueListEditor(Sender).MouseCoord(x, y); + if (cell.Y > 0) and (cell.X = 0) then TValueListEditor(Sender).Cursor := crHandPoint + else TValueListEditor(Sender).Cursor := crDefault; + + if varMM then // hack: to skip MouseMove event + begin + varMM:=false; + end + else + if varDragMode and (x <> varDragOld) then + begin + Inc(varDragPos, x - varDragOld); + + if GetKeyState(VK_MENU) < 0 then v := 100000 + else if GetKeyState(VK_CONTROL) < 0 then v := 10000 + else if GetKeyState(VK_SHIFT) < 0 then v := 100 + else v := 1000; + + v := Round6(varDragValue + varDragPos/v); + + SetCursorPos(MousePos.x, MousePos.y); // hmmm + // this Delphi is WEIRD! + // why GetCursorPos deals with TPoint, + // and SetCursorPos - with two integers? :) + varMM:=true; + + //cp.xform[SelectedTriangle].vars[varDragIndex] := v; + if Sender = VEVars then + begin + cp.xform[SelectedTriangle].SetVariation(varDragIndex, v); + VEVars.Values[VarNames(varDragIndex)] := FloatToStr(v); //Format('%.6g', [v]); + end + else if Sender = vleVariables then begin + cp.xform[SelectedTriangle].SetVariable(vleVariables.Keys[varDragIndex+1], v); + vleVariables.Values[vleVariables.Keys[varDragIndex+1]] := FloatToStr(v); + end + else begin + if v < 0 then v := 0; + //cp.xform[SelectedTriangle].modWeights[varDragIndex] := v; + pDragValue^ := v; + vleChaos.Cells[1, varDragIndex+1] := FloatToStr(v); + end; + + HasChanged := True; + UpdateFlameX; + end; +end; + +procedure TEditForm.VEVarsMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + if Button <> mbLeft then exit; + SetCaptureControl(nil); + if varDragMode then + begin + varDragMode:=false; + Screen.Cursor := crDefault; + + if HasChanged then + begin + MainForm.UpdateUndo; + + UpdateFlame(true); + HasChanged := False; + + if (Sender = vleChaos) and ChaosForm.Visible then // AV + ChaosForm.ChaosMatrix.Invalidate; + end; + end; +end; + +procedure TEditForm.VEVarsDblClick(Sender: TObject); +var + n, i: integer; + v, v1: double; + changed, allzero: boolean; + varname: string; +begin + n := TValueListEditor(Sender).Row - 1; + assert(n >= 0); + assert(n < TValueListEditor(Sender).rowCount); + + //changed := false; + if (SelectedTriangle < 0) or (SelectedTriangle > High(cp.xform)) then + changed := false + else begin + if Sender = VEVars then + begin + if (n < 0) or (n > (cp.xform[SelectedTriangle].NumVariations - 1)) then + changed := false + else begin + i := n; // AV + n := GetVariationIndex(VEVars.Keys[i+1]); // AV + v := cp.xform[SelectedTriangle].GetVariation(n); + if AllowResetLinear then // AV + begin + if v = 0 then + begin + allzero := true; + for i := 1 to NrVar-1 do + allzero := allzero and (cp.xform[SelectedTriangle].GetVariation(i) = 0); + if (cp.xform[SelectedTriangle].GetVariation(0) = 1) and allzero then + cp.xform[SelectedTriangle].SetVariation(0, 0); + cp.xform[SelectedTriangle].SetVariation(n, 1); + end + else cp.xform[SelectedTriangle].SetVariation(n, 0); + end else + cp.xform[SelectedTriangle].SetVariation(n, IfThen(v = 0, 1, 0)); + changed := (cp.xform[SelectedTriangle].GetVariation(n) <> v); + end; + end + else if Sender = vleVariables then begin + varname := vleVariables.Keys[n + 1]; // AV + cp.xform[SelectedTriangle].GetVariable(varname, v); + cp.xform[SelectedTriangle].ResetVariable(varname); + cp.xform[SelectedTriangle].GetVariable(varname, v1); + changed := (v1 <> v); + end + else if Sender = vleChaos then begin + if ((varDragIndex) < 0) or ((varDragIndex) > high(cp.xform[SelectedTriangle].modWeights)) then + changed := false + else + begin + if mnuChaosViewTo.Checked then + pDragValue := @cp.xform[SelectedTriangle].modWeights[varDragIndex] + else + pDragValue := @cp.xform[varDragIndex].modWeights[SelectedTriangle]; + v := pDragValue^; + v := ifthen(v = 1, 0, 1); + pDragValue^ := v; + vleChaos.Cells[1, n+1] := FloatToStr(v); + changed := true; + + if ChaosForm.Visible then // AV + ChaosForm.ChaosMatrix.Invalidate; + end + //else Assert(false); + end else changed := false; + end; + + if changed then MainForm.UpdateUndo; + UpdateFlame(true); +end; + +{ **************************************************************************** } + +function TEditForm.GetPivot: TSPoint; +begin + Result := GetPivot(SelectedTriangle); +end; + +function TEditForm.GetPivot(n: integer): TSPoint; +begin + if (PivotMode = pivotLocal) or {EdgeCaught} (mouseOverEdge >= 0) then // should be always local for edges (hmm...?) + with MainTriangles[n] do begin + Result.x := x[1] + (x[0] - x[1])*LocalPivot.x + (x[2] - x[1])*LocalPivot.y; + Result.y := y[1] + (y[0] - y[1])*LocalPivot.x + (y[2] - y[1])*LocalPivot.y; + end + else begin + Result.x := WorldPivot.x; + Result.y := WorldPivot.y; + end; +end; + +procedure TEditForm.ScriptGetPivot(var px, py: double); +begin + // AV: sometimes the scripter swaps pre and post triangles... + if (PivotMode = pivotLocal) then + with MainTriangles[SelectedTriangle] do begin + px := x[1] + (x[0] - x[1])*LocalPivot.x + (x[2] - x[1])*LocalPivot.y; + py := y[1] + (y[0] - y[1])*LocalPivot.x + (y[2] - y[1])*LocalPivot.y; + end + { with cp.xform[SelectedTriangle] do + begin + if not postXswap then begin + px := c[2,0] + c[0,0]*LocalPivot.x + (-c[0,1])*LocalPivot.y; + py := -c[2,1] + (-c[0,1])*LocalPivot.x + c[1,1]*LocalPivot.y; + end + else begin + px := p[2,0] + p[0,0]*LocalPivot.x + (-p[0,1])*LocalPivot.y; + py := -p[2,1] + (-p[0,1])*LocalPivot.x + p[1,1]*LocalPivot.y; + end; + end } + else begin + px := WorldPivot.x; + py := WorldPivot.y; + end; +end; + +procedure TEditForm.InvCurrentNumClick(Sender: TObject); +var + num: double; + sn: string; + isEdit: boolean; +begin + if (ActiveControl = txtTrgMoveValue) then + begin + InvertMovevalue1.Click; + exit; + end + else if (ActiveControl is TComboBox) then exit; + + isEdit := (ActiveControl is TEdit); + if isEdit then + if (ActiveControl = txtSearchBox) or (ActiveControl = txtName) then + isEdit := False; + if not (isEdit or (ActiveControl is TValueListEditor)) then + begin + Application.MessageBox(PChar(TextByKey('editor-status-nonumfield')), + PChar('Apophysis AV'), MB_ICONWARNING); + exit; + end; + + try + if isEdit then + sn := TEdit(ActiveControl).Text + else // if (ActiveControl is TValueListEditor) then + sn := TValueListEditor(ActiveControl).Cells[1, TValueListEditor(ActiveControl).Row]; + num := StrToFloat(sn); + if (abs(num) < 1E-5) then exit; + sn := Format('%.6g', [1/num]); + if isEdit then + begin + TEdit(ActiveControl).Text := sn; + TEdit(ActiveControl).OnExit(ActiveControl); + end + else // if (ActiveControl is TValueListEditor) then + begin + TValueListEditor(ActiveControl).Cells[1, TValueListEditor(ActiveControl).Row] := sn; + TValueListEditor(ActiveControl).OnExit(ActiveControl); + end; + except + end; +end; + +procedure TEditForm.InvertMovevalue1Click(Sender: TObject); +var step: double; +begin + try + step := StrToFloat(txtTrgMoveValue.Text); + if (abs(step) >= 0.1) then txtTrgMoveValue.Text := Format('%.6g', [1/step]); + except + txtTrgMoveValue.ItemIndex := 1; + end; +end; + +procedure TEditForm.InvertXaosClick(Sender: TObject); +var i: integer; + cmax: double; +begin + MainForm.UpdateUndo; + if mnuChaosViewTo.Checked then + begin + cmax := MaxValue(cp.xform[SelectedTriangle].modWeights); + if (cmax > 0) then + for i := 0 to Transforms-1 do + cp.xform[SelectedTriangle].modWeights[i] := + IfThen(cp.xform[SelectedTriangle].modWeights[i] = 0, cmax, + cmax - cp.xform[SelectedTriangle].modWeights[i]) + else for i := 0 to Transforms-1 do + cp.xform[SelectedTriangle].modWeights[i] := 1; + end else begin + cmax := 0; + for i := 0 to Transforms-1 do + if (cp.xform[i].modWeights[SelectedTriangle] > cmax) then + cmax := cp.xform[i].modWeights[SelectedTriangle]; + if (cmax > 0) then + for i := 0 to Transforms-1 do + cp.xform[i].modWeights[SelectedTriangle] := + IfThen(cp.xform[i].modWeights[SelectedTriangle] = 0, cmax, + cmax - cp.xform[i].modWeights[SelectedTriangle]) + else for i := 0 to Transforms-1 do + cp.xform[i].modWeights[SelectedTriangle] := 1; + end; + UpdateFlame(true); + if ChaosForm.Visible then // AV + ChaosForm.ChaosMatrix.Invalidate; +end; + +procedure TEditForm.UpdateColorBar; +var + BitMap:TBitmap; + Row:pRGBTripleArray; + i:integer; +begin + BitMap := TBitMap.Create; + try + Bitmap.PixelFormat := pf24bit; + BitMap.Width := 256; + BitMap.Height := 1; + Row := Bitmap.Scanline[0]; + for i := 0 to 255 do + with Row[i] do + begin + rgbtRed := MainCP.cmap[i][0]; + rgbtGreen := MainCP.cmap[i][1]; + rgbtBlue := MainCP.cmap[i][2]; + end; + + EditForm.ColorBarPicture.Picture.Graphic := Bitmap; + EditForm.ColorBarPicture.Refresh; + finally + BitMap.Free; + end; +end; + +procedure TEditForm.btTrgRotateLeftClick(Sender: TObject); +var + angle: double; +begin + try + angle := StrToFloat(txtTrgRotateValue.Text); + except + txtTrgRotateValue.ItemIndex := 1; + exit; + end; + assert(angle <> 0); + + if GetKeyState(VK_CONTROL) < 0 then angle := angle/6.0 + else if GetKeyState(VK_SHIFT) < 0 then angle := angle*6.0; + // AV: to show internally modified value + if (ShowModVals.Checked) then txtTrgRotateValue.Text := Format('%.6g', [angle]); + + MainForm.UpdateUndo; + if RotateXYO.Checked then + MainTriangles[SelectedTriangle] := + RotateTrianglePoint(MainTriangles[SelectedTriangle], GetPivot.x, GetPivot.y, (PI/180)*angle) + else if RotateX.Checked then + MainTriangles[SelectedTriangle] := RotateTriangleXY(MainTriangles[SelectedTriangle], 0, (PI/180)*angle) + else if RotateY.Checked then + MainTriangles[SelectedTriangle] := RotateTriangleXY(MainTriangles[SelectedTriangle], 2, (PI/180)*angle) + else //if RotateO.Checked then + MainTriangles[SelectedTriangle] := RotateTriangleO(MainTriangles[SelectedTriangle], WorldPivot.x, WorldPivot.y, (PI/180)*angle); + HasChanged := True; + UpdateFlame(true); +end; + +procedure TEditForm.btTrgRotateLeft90Click(Sender: TObject); +begin + MainForm.UpdateUndo; + MainTriangles[SelectedTriangle] := + RotateTrianglePoint(MainTriangles[SelectedTriangle], GetPivot.x, GetPivot.y, PI/2); + HasChanged := True; + UpdateFlame(true); +end; + +procedure TEditForm.btTrgRotateRightClick(Sender: TObject); +var + angle: double; +begin + try + angle := StrToFloat(txtTrgRotateValue.Text); + except + txtTrgRotateValue.ItemIndex := 1; + exit; + end; + assert(angle <> 0); + + if GetKeyState(VK_CONTROL) < 0 then angle := angle/6.0 + else if GetKeyState(VK_SHIFT) < 0 then angle := angle*6.0; + // AV: to show internally modified value + if (ShowModVals.Checked) then txtTrgRotateValue.Text := Format('%.6g', [angle]); + + MainForm.UpdateUndo; + if RotateXYO.Checked then + MainTriangles[SelectedTriangle] := + RotateTrianglePoint(MainTriangles[SelectedTriangle], GetPivot.x, GetPivot.y, -(PI/180)*angle) + else if RotateX.Checked then begin + MainTriangles[SelectedTriangle] := RotateTriangleXY(MainTriangles[SelectedTriangle], 0, -(PI/180)*angle); + if tbAutoWeights.Down then cp.CalculateWeights; // AV + end else if RotateY.Checked then begin + MainTriangles[SelectedTriangle] := RotateTriangleXY(MainTriangles[SelectedTriangle], 2, -(PI/180)*angle); + if tbAutoWeights.Down then cp.CalculateWeights; // AV + end else //if RotateO.Checked then + MainTriangles[SelectedTriangle] := RotateTriangleO(MainTriangles[SelectedTriangle], WorldPivot.x, WorldPivot.y, -(PI/180)*angle); + + HasChanged := True; + UpdateFlame(true); +end; + +procedure TEditForm.btTrgRotateRight90Click(Sender: TObject); +begin + MainForm.UpdateUndo; + MainTriangles[SelectedTriangle] := + RotateTrianglePoint(MainTriangles[SelectedTriangle], GetPivot.x, GetPivot.y, -PI/2); + HasChanged := True; + UpdateFlame(true); +end; + +procedure TEditForm.PaintBackground; +begin + assert(false); + TriangleViewPaint(TriangleView); +end; + +procedure TEditForm.TrgMove(dx, dy: double); +var + i: integer; + offset: double; +begin + try + offset := StrToFloat(txtTrgMoveValue.Text); + assert(offset <> 0); + except + txtTrgMoveValue.ItemIndex := 1; + exit; + end; + + if GetKeyState(VK_CONTROL) < 0 then offset := offset/10.0 + else if GetKeyState(VK_SHIFT) < 0 then offset := offset*10.0; + // AV: to show internally modified value + if (ShowModVals.Checked) then txtTrgMoveValue.Text := Format('%.6g', [offset]); + + MainForm.UpdateUndo; + for i := 0 to 2 do begin + MainTriangles[SelectedTriangle].x[i] := + MainTriangles[SelectedTriangle].x[i] + dx*offset; + MainTriangles[SelectedTriangle].y[i] := + MainTriangles[SelectedTriangle].y[i] + dy*offset; + end; +// HasChanged := True; + UpdateFlame(true); +end; + +procedure TEditForm.btTrgMoveLeftClick(Sender: TObject); +begin + TrgMove(-1,0); +end; + +procedure TEditForm.btTrgMoveRightClick(Sender: TObject); +begin + TrgMove(1,0); +end; + +procedure TEditForm.btTrgMoveUpClick(Sender: TObject); +begin + if RectGrid.Checked then TrgMove(0,1) + else TrgMove(0.5, sqrt(3)*0.5); +end; + +procedure TEditForm.btTrgMoveDownClick(Sender: TObject); +begin + if RectGrid.Checked then TrgMove(0,-1) + else TrgMove(-0.5, -sqrt(3)*0.5); +end; + +{ +procedure TEditForm.btTrgMoveLUClick(Sender: TObject); +begin + TrgMove(-1,1); +end; + +procedure TEditForm.btTrgMoveLDClick(Sender: TObject); +begin + TrgMove(-1,-1); +end; + +procedure TEditForm.btTrgMoveRUClick(Sender: TObject); +begin + TrgMove(1,1); +end; + +procedure TEditForm.btTrgMoveRDClick(Sender: TObject); +begin + TrgMove(1,-1); +end; +} + +procedure TEditForm.btTrgScaleUpClick(Sender: TObject); +var + scale: double; +begin + try + scale := StrToFloat(txtTrgScaleValue.Text) / 100.0; + except + txtTrgScaleValue.ItemIndex := 1; + exit; + end; + if scale = 0 then scale := 1e-6; //assert(scale <> 0); + + // AV: fixed - added abs() for negative value + if GetKeyState(VK_CONTROL) < 0 then scale := sqrt(abs(scale)) + else if GetKeyState(VK_SHIFT) < 0 then scale := scale*scale; + // AV: to show internally modified value + if (ShowModVals.Checked) then txtTrgScaleValue.Text := Format('%.6g', [scale * 100.0]); + + MainForm.UpdateUndo; + if ScaleXYO.Checked then + MainTriangles[SelectedTriangle] := + ScaleTrianglePoint(MainTriangles[SelectedTriangle], GetPivot.x, GetPivot.y, scale) + else if ScaleX.Checked then + MainTriangles[SelectedTriangle] := ScaleTriangleXY(MainTriangles[SelectedTriangle], 0, scale) + else if ScaleY.Checked then + MainTriangles[SelectedTriangle] := ScaleTriangleXY(MainTriangles[SelectedTriangle], 2, scale) + else //if ScaleO.Checked then + MainTriangles[SelectedTriangle] := ScaleTriangleO(MainTriangles[SelectedTriangle], WorldPivot.x, WorldPivot.y, scale); + + if tbAutoWeights.Down then cp.CalculateWeights; // AV + HasChanged := True; + UpdateFlame(true); +end; + +procedure TEditForm.btTrgScaleDownClick(Sender: TObject); +var + scale: double; +begin + try + scale := 100.0 / StrToFloat(txtTrgScaleValue.Text); + except + txtTrgScaleValue.ItemIndex := 1; + exit; + end; + if scale = 0 then scale := 1e-6; //assert(scale <> 0); + + // AV: fixed for negative value + if GetKeyState(VK_CONTROL) < 0 then scale := sqrt(abs(scale)) + else if GetKeyState(VK_SHIFT) < 0 then scale := scale*scale; + // AV: to show modified value + if (ShowModVals.Checked) then txtTrgScaleValue.Text := Format('%.6g', [scale * 100.0]); + + MainForm.UpdateUndo; + if ScaleXYO.Checked then + MainTriangles[SelectedTriangle] := + ScaleTrianglePoint(MainTriangles[SelectedTriangle], GetPivot.x, GetPivot.y, scale) + else if ScaleX.Checked then + MainTriangles[SelectedTriangle] := ScaleTriangleXY(MainTriangles[SelectedTriangle], 0, scale) + else if ScaleY.Checked then + MainTriangles[SelectedTriangle] := ScaleTriangleXY(MainTriangles[SelectedTriangle], 2, scale) + else //if ScaleO.Checked then + MainTriangles[SelectedTriangle] := ScaleTriangleO(MainTriangles[SelectedTriangle], WorldPivot.x, WorldPivot.y, scale); + if tbAutoWeights.Down then cp.CalculateWeights; // AV + HasChanged := True; + UpdateFlame(true); +end; + +procedure TEditForm.TriangleViewKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); +begin + if (oldMode = modeNone) and + (key in [{VK_SHIFT,} VK_MENU, VK_CONTROL]) then + begin + oldMode := editMode; + modeKey := key; + + if key = VK_MENU then + if editMode <> modeRotate then + begin + editMode := modeRotate; + TriangleView.Cursor := crEditRotate; + end + else begin + editMode := modeMove; + TriangleView.Cursor := crEditMove; + end + else {if key = VK_CONTROL then} + begin + if editMode <> modeScale then + begin + editMode := modeScale; + TriangleView.Cursor := crEditScale; + end + else begin + editMode := modeMove; + TriangleView.Cursor := crEditMove; + end + end; + end + else + case key of + VK_LEFT: + if Shift = [ssAlt] then btTrgRotateLeftClick(Sender) + else TrgMove(-1,0); + VK_RIGHT: + if Shift = [ssAlt] then btTrgRotateRightClick(Sender) + else TrgMove(1,0); + VK_UP: + if Shift = [ssAlt] then btTrgScaleUpClick(Sender) + else TrgMove(0,1); + VK_DOWN: + if Shift = [ssAlt] then btTrgScaleDownClick(Sender) + else TrgMove(0,-1); + VK_PRIOR: btTrgRotateLeftClick(Sender); + VK_NEXT: btTrgRotateRightClick(Sender); + VK_HOME: btTrgScaleUpClick(Sender); + VK_END: btTrgScaleDownClick(Sender); + VK_INSERT: mnuDupClick(Sender); + VK_DELETE: mnuDeleteClick(Sender); + + // can be changed in the future... + Ord('R'): btnResetPivotClick(Sender); + Ord('P'): btnPickPivotClick(Sender); + Ord('T'): tbPostXswapClick(Sender); + + { + Ord('I'): // Invisible <<-- AV: or Invert :-) + chkXformInvisible.Checked := not chkXformInvisible.Checked; + } + Ord('S'): // Solo + begin + chkXformSolo.Checked := not chkXformSolo.Checked; + end; + + 189: // "-" + begin + GraphZoom := GraphZoom * 0.8; + EditForm.StatusBar.Panels[2].Text := Format(TextByKey('editor-status-zoomformat'), [GraphZoom]); + TriangleView.Invalidate; + end; + 187: // "+" + begin + GraphZoom := GraphZoom * 1.25; + EditForm.StatusBar.Panels[2].Text := Format(TextByKey('editor-status-zoomformat'), [GraphZoom]); + TriangleView.Invalidate; + end; + VK_ESCAPE: + begin + if TriangleCaught or CornerCaught or EdgeCaught then begin + if modeHack then begin + assert(oldMode <> modeNone); + editMode := oldMode; + oldMode := modeNone; + + modeHack := false; + end; + + if HasChanged then + begin + MainTriangles[SelectedTriangle] := OldTriangle; + HasChanged := False; + end; + EdgeCaught := false; + CornerCaught := false; + TriangleCaught := false; + TriangleView.Invalidate; + UpdateFlameX; + end; + end + end; +end; + +procedure TEditForm.TriangleViewKeyUp(Sender: TObject; var Key: Word; + Shift: TShiftState); +begin + if (oldMode <> modeNone) and (key = modeKey) then + begin + assert(key in [VK_MENU, VK_CONTROL]); + + editMode := oldMode; + oldMode := modeNone; +// tbMove.Down := (editMode = modeMove); +// tbRotate.Down := (editMode = modeRotate); +// tbScale.Down := (editMode = modeScale); + + // hack: to generate MouseMove event + GetCursorPos(MousePos); + SetCursorPos(MousePos.x, MousePos.y); + end; +end; + +procedure TEditForm.TriangleViewExit(Sender: TObject); +begin + if oldMode <> modeNone then + begin + editMode := oldMode; + oldMode := modeNone; +// tbMove.Down := (editMode = modeMove); +// tbRotate.Down := (editMode = modeRotate); +// tbScale.Down := (editMode = modeScale); + end; + + mouseOverTriangle := -1; + TriangleView.Invalidate; +end; + +procedure TEditForm.TriangleViewMouseLeave(Sender: TObject); +begin + if viewDragMode = false then + begin + mouseOverTriangle := -1; + TriangleView.Invalidate; + end; +end; + +procedure TEditForm.EditKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); + var num: double; + begin + case key of + VK_ADD: + if SelectedTriangle < LastTriangle then begin + txtNameExit(Sender); // store name before re-filling name box by changing xform + Inc(SelectedTriangle); + TriangleView.Invalidate; + ShowSelectedInfo; + end; + VK_SUBTRACT: + if SelectedTriangle > 0 then begin + txtNameExit(Sender); // store name before re-filling name box by changing xform + Dec(SelectedTriangle); + TriangleView.Invalidate; + ShowSelectedInfo; + end; + VK_SPACE: + if not txtName.Focused then + btnPivotModeClick(Sender); + Ord('I'): + if (not txtName.Focused) and (not txtSearchBox.Focused) then begin + if txtTrgMoveValue.Focused then InvertMoveValue1.Click + else InvCurrentNum.Click; + end; + Ord('X'): + if (not txtName.Focused) and (not txtSearchBox.Focused) then + begin + ScaleX.Checked := True; + RotateX.Checked := True; + end; + Ord('Y'): + if (not txtName.Focused) and (not txtSearchBox.Focused) then + begin + ScaleY.Checked := True; + RotateY.Checked := True; + end; + Ord('O'): + if (not txtName.Focused) and (not txtSearchBox.Focused) then + begin + ScaleO.Checked := True; + RotateO.Checked := True; + end; + Ord('A'): + if (not txtName.Focused) and (not txtSearchBox.Focused) then + begin + ScaleXYO.Checked := True; + RotateXYO.Checked := True; + end; + else + key_handled := false; + exit; + end; + key_handled := true; + key := 0; +end; + +procedure TEditForm.EditKeyPress(Sender: TObject; var Key: Char); +begin + if txtName.Focused then begin + if (key = '+') or (key='-') then begin + // nvm...code moved to EditKeyDown + key := #0; + end; + if (key='"') then key := #0; // we dont want that in "name" box -> XML mess! + exit; + end else if txtSearchBox.Focused then + begin + if (key = #13) then key := #0; // AV: to prevent a beep + exit; + end; +// kill alphanumeric keys generally + // if key_handled or (CharInSet(key,['A'..'z'])) then key := #0; // hmmm... + + { AV: the code above doesn't work properly, so I rewrote it } + { AV: a lot of users type comma as the decimal separator, + but Apo discard it. It's not normally... } + if (Key = ',') then Key := '.'; // FormatSettings.DecimalSeparator; + if key_handled or not CharinSet(Key,['0'..'9', '-', #8, #13, '.']) + then Key:= #0; +end; + +procedure TEditForm.splitterMoved(Sender: TObject); +begin + UpdatePreview; +end; + +procedure TEditForm.tbSelectClick(Sender: TObject); +begin + SelectMode := not SelectMode; + tbSelect.Down := SelectMode; + + if SelectMode then + begin + StatusBar.Panels[2].Text := TextByKey('editor-status-selecton'); + end + else begin + mouseOverTriangle := SelectedTriangle; + StatusBar.Panels[2].Text := TextByKey('editor-status-selectoff');; + end; + + // hack: to generate MouseMove event + GetCursorPos(MousePos); + SetCursorPos(MousePos.x, MousePos.y); +end; + +procedure TEditForm.TriangleViewMouseWheel(Sender: TObject; Shift: TShiftState; + WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); +var + fx, fy, sc: double; + p: TPoint; +begin + p := TriangleView.ScreenToClient(MousePos); + Scale(fx, fy, p.X, p.Y); + + if WheelDelta > 0 then GraphZoom := GraphZoom * 1.25 + else GraphZoom := GraphZoom * 0.8; + + EditForm.StatusBar.Panels[2].Text := Format(TextByKey('editor-status-zoomformat'), [GraphZoom]); + + if viewDragMode then begin + sc := GraphZoom * 50; + gCenterX := fx - (p.X - TriangleView.Width/2) / sc; + gCenterY := fy + (p.Y - TriangleView.Height/2) / sc; + end; + + TriangleView.Invalidate; + Handled := true; +end; + +procedure TEditForm.TriangleViewDblClick(Sender: TObject); +begin + if mouseOverTriangle >= 0 then + begin + if mouseOverCorner >= 0 then begin + case mouseOverCorner of + 0: if editMode = modeRotate then ResetAxisRotation(0) else ResetAxisScale(0); + 1: if editMode = modeRotate then ResetAxisRotation(1) + else begin + if editMode = modeScale then + ResetAxisScale(1) + else begin + if cp.xform[SelectedTriangle].postXswap then + btnOpostClick(Sender) + else + btnOcoefsClick(Sender); + end; + end; + 2: if editMode = modeRotate then ResetAxisRotation(2) else ResetAxisScale(2); + end; + end + else if mouseOverEdge >= 0 then begin + if AxisLock then begin + if (editMode = modeScale) or (mouseOverEdge = 2)then + mnuResetTrgScaleClick(Sender) + else + mnuResetTrgRotationClick(Sender); + end + else case mouseOverEdge of + 0: if editMode = modeScale then ResetAxisScale(0) else ResetAxisRotation(0); + 1: if editMode = modeScale then ResetAxisScale(2) else ResetAxisRotation(2); + 2: mnuResetTrgScaleClick(Sender); + end; + end + else if mouseOverWidget >= 0 then begin + case editMode of + modeScale: mnuResetTrgScaleClick(Sender); + else mnuResetTrgRotationClick(Sender); + end; + end + else case editMode of + //modeMove: Do Nothing + modeScale: mnuResetTrgScaleClick(Sender); + modeRotate: mnuResetTrgRotationClick(Sender); + end; + end + else AutoZoom; +end; + +procedure TEditForm.TriangleViewInvalidate(Sender: TObject); +begin + TriangleView.Invalidate; +end; + +procedure TEditForm.tbEditModeClick(Sender: TObject); +begin +// ExtendedEdit := (Sender = tbExtendedEdit); + if Sender = tbRotate then + begin + editMode := modeRotate; + //tbRotate.Down := true; + end + else if Sender = tbScale then + begin + editMode := modeScale; + //tbScale.Down := true; + end + else begin + editMode := modeMove; + //tbMove.Down := true; + end; + TToolButton(Sender).Down := true; + TriangleView.Invalidate; +end; + +procedure TEditForm.tbExtendedEditClick(Sender: TObject); +begin + ExtendedEdit := not ExtendedEdit; + tbExtendedEdit.Down := ExtendedEdit; + TriangleView.Invalidate; +end; + +procedure TEditForm.tbAxisLockClick(Sender: TObject); +begin + AxisLock := not AxisLock; + tbAxisLock.Down := AxisLock; +end; + +procedure TEditForm.tbFullViewClick(Sender: TObject); +begin + MainForm.mnuFullScreenClick(Sender); +end; + +//-- Variables ------------------------------------------------------------- + +procedure TEditForm.ValidateVariable; +var + i: integer; + NewVal, OldVal: double; + str, oldstr: string; +begin + i := vleVariables.Row; + +{$ifndef VAR_STR} + cp.xform[SelectedTriangle].GetVariable(vleVariables.Keys[i], OldVal); + { Test that it's a valid floating point number } + try + NewVal := Round6(StrToFloat(vleVariables.Values[vleVariables.Keys[i]])); + except + { It's not, so we restore the old value } + vleVariables.Values[vleVariables.Keys[i]] := Format('%.6g', [OldVal]); +// cp.xform[SelectedTriangle].GetVariableStr(vleVariables.Keys[i]); + exit; + end; + { If it's not the same as the old value and it was valid } + if (NewVal <> OldVal) then + begin + vleVariables.Cells[1,i]; + MainForm.UpdateUndo; + + cp.xform[SelectedTriangle].SetVariable(vleVariables.Keys[i], NewVal); + vleVariables.Values[vleVariables.Keys[i]] := Format('%.6g', [NewVal]); + + ShowSelectedInfo; + UpdateFlame(True); + end; +{$else} + oldstr := cp.xform[SelectedTriangle].GetVariableStr(vleVariables.Keys[i]); + str := vleVariables.Values[vleVariables.Keys[i]]; + cp.xform[SelectedTriangle].SetVariableStr(vleVariables.Keys[i], str); + + if str <> oldstr then + begin + MainForm.UpdateUndo; + + vleVariables.Values[vleVariables.Keys[i]] := str; + + ShowSelectedInfo; + UpdateFlame(True); + end; +{$endif} + + //chkCollapseVariationsClick(nil); + //chkCollapseVariablesClick(nil); +end; + +procedure TEditForm.vleVariablesExit(Sender: TObject); +begin + ValidateVariable; +end; + +procedure TEditForm.vleVariablesKeyPress(Sender: TObject; var Key: Char); +begin + if key <> #13 then Exit; + key := #0; + ValidateVariable; +end; + +procedure TEditForm.vleVariablesValidate(Sender: TObject; ACol, ARow: Integer; const KeyName, KeyValue: string); +begin + ValidateVariable; +end; + +// ----------------------------------------------------------------------------- + +procedure TEditForm.txtValidateValue(Sender: TObject); +var + t: double; +begin + try + t := StrToFloat(TComboBox(Sender).Text); + if t <> 0 then exit; + except + TComboBox(Sender).ItemIndex := 1; + end; +end; + +procedure TEditForm.txtValKeyPress(Sender: TObject; var Key: Char); +begin + if key <> #13 then exit; + key := #0; + txtValidateValue(Sender); +end; + +procedure TEditForm.mnuResetTriangleClick(Sender: TObject); +begin + if (MainTriangles[SelectedTriangle].x[0] = MainTriangles[-1].x[0]) and + (MainTriangles[SelectedTriangle].x[1] = MainTriangles[-1].x[1]) and + (MainTriangles[SelectedTriangle].x[2] = MainTriangles[-1].x[2]) and + (MainTriangles[SelectedTriangle].y[0] = MainTriangles[-1].y[0]) and + (MainTriangles[SelectedTriangle].y[1] = MainTriangles[-1].y[1]) and + (MainTriangles[SelectedTriangle].y[2] = MainTriangles[-1].y[2]) + then exit; + + MainForm.UpdateUndo; + MainTriangles[SelectedTriangle] := MainTriangles[-1]; + UpdateFlame(True); +end; + +procedure TEditForm.mnuResetAllClick(Sender: TObject); +var + i: integer; +begin + MainForm.UpdateUndo; + for i := 0 to Transforms do cp.xform[i].Clear; + cp.xform[0].SetVariation(0, 1); + cp.xform[0].density := 0.5; + cp.xform[1].symmetry := 1; + + cp.center[0] := 0; + cp.center[1] := 0; + cp.zoom := 0; + cp.pixels_per_unit := PreviewImage.Width/4; + cp.FAngle := 0; + + // AV: add 3D-camera resetting + cp.cameraPitch := 0; + cp.cameraYaw := 0; + cp.cameraRoll := 0; + cp.cameraPersp := 0; + cp.cameraZPos := 0; + cp.cameraDOF := 0; + + Transforms := 1; + SelectedTriangle := 1; + MainTriangles[0] := MainTriangles[-1]; + MainTriangles[1] := MainTriangles[-1]; // kinda reset finalxform + + EnableFinalXform := false; + assert(cp.HasFinalXForm = false); + + UpdateXformsList; + AutoZoom; + + UpdateFlame(True); + + if AutoSaveXML then // AV: create a flame from scratch if needed + begin + MainCp.name := 'New flame' + FormatDateTime(' (MM-dd-yyyy hh-mm-ss)', Now); + if MainForm.SaveXMLFlame(MainCp, MainCp.name, OpenFile) then + if MainForm.SortFlames.Checked then + ListXML(OpenFile, 2, MainCp.name) // show the new item + else + ListXML(OpenFile, 0); // show the last item + end; +end; + +// ----------------------------------------------------------------------------- + +procedure TEditForm.btnXcoefsClick(Sender: TObject); +begin + with cp.xform[SelectedTriangle] do + begin + if (c[0][0] = 1) and (c[0][1] = 0) then exit; + + MainForm.UpdateUndo; + c[0][0] := 1; + c[0][1] := 0; + end; + cp.TrianglesFromCP(MainTriangles); + UpdateFlame(True); +end; + +procedure TEditForm.btnYcoefsClick(Sender: TObject); +begin + if (cp.xform[SelectedTriangle].c[1][0] = 0) and + (cp.xform[SelectedTriangle].c[1][1] = 1) then exit; + + MainForm.UpdateUndo; + cp.xform[SelectedTriangle].c[1][0] := 0; + cp.xform[SelectedTriangle].c[1][1] := 1; + + cp.TrianglesFromCP(MainTriangles); + UpdateFlame(True); +end; + +procedure TEditForm.btnOcoefsClick(Sender: TObject); +begin + if (sender = mnuResetTrgPosition) and cp.xform[SelectedTriangle].postXswap then + begin + btnOpostClick(Sender); + exit; + end; + + if (cp.xform[SelectedTriangle].c[2][0] = 0) and + (cp.xform[SelectedTriangle].c[2][1] = 0) then exit; + + MainForm.UpdateUndo; + cp.xform[SelectedTriangle].c[2][0] := 0; + cp.xform[SelectedTriangle].c[2][1] := 0; + + cp.TrianglesFromCP(MainTriangles); + UpdateFlame(True); +end; + +procedure TEditForm.btnCoefsModeClick(Sender: TObject); +begin + ShowSelectedInfo; +end; + +procedure TEditForm.tbVarPreviewClick(Sender: TObject); +begin + showVarPreview := not showVarPreview; + tbVarPreview.Down := showVarPreview; + TriangleView.Invalidate; +end; + +procedure TEditForm.trkVarPreviewRangeChange(Sender: TObject); +begin + trkVarPreviewRange.Hint := Format(TextByKey('editor-tab-color-previewrange') + ' %d', [trkVarPreviewRange.position]); + TriangleView.Invalidate; +end; + +procedure TEditForm.trkVarPreviewDensityChange(Sender: TObject); +begin + trkVarPreviewDensity.Hint := Format(TextByKey('editor-tab-color-previewdensity') + ' %d', [trkVarPreviewDensity.position]); + TriangleView.Invalidate; +end; + +procedure TEditForm.trkVarPreviewDepthChange(Sender: TObject); +begin + trkVarPreviewDepth.Hint := Format(TextByKey('editor-tab-color-previewdepth') + ' %d', [trkVarPreviewDepth.position]); + TriangleView.Invalidate; +end; + +procedure TEditForm.btnXpostClick(Sender: TObject); +begin + with cp.xform[SelectedTriangle] do + begin + if (p[0][0] = 1) and (p[0][1] = 0) then exit; + + MainForm.UpdateUndo; + p[0][0] := 1; + p[0][1] := 0; + end; + cp.TrianglesFromCP(MainTriangles); + UpdateFlame(True); +end; + +procedure TEditForm.btnYpostClick(Sender: TObject); +begin + if (cp.xform[SelectedTriangle].p[1][0] = 0) and + (cp.xform[SelectedTriangle].p[1][1] = 1) then exit; + + MainForm.UpdateUndo; + cp.xform[SelectedTriangle].p[1][0] := 0; + cp.xform[SelectedTriangle].p[1][1] := 1; + cp.TrianglesFromCP(MainTriangles); + UpdateFlame(True); +end; + +procedure TEditForm.btnOpostClick(Sender: TObject); +begin + if (cp.xform[SelectedTriangle].p[2][0] = 0) and + (cp.xform[SelectedTriangle].p[2][1] = 0) then exit; + + MainForm.UpdateUndo; + cp.xform[SelectedTriangle].p[2][0] := 0; + cp.xform[SelectedTriangle].p[2][1] := 0; + cp.TrianglesFromCP(MainTriangles); + UpdateFlame(True); +end; + +// --Z-- copying functions is dumb... I am so lazy :-( + +procedure TEditForm.PostCoefKeypress(Sender: TObject; var Key: Char); +begin + if key <> #13 then exit; + key := #0; + PostCoefValidate(Sender); +end; + +procedure TEditForm.PostCoefValidate(Sender: TObject); +var + NewVal: double; + x, y, r, a: double; // dumb... must optimize +begin + try + NewVal := Round6(StrToFloat(TEdit(Sender).Text)); + except on Exception do + begin + ShowSelectedInfo; + exit; + end; + end; + + MainForm.UpdateUndo; // TODO - prevent unnecessary UpdateUndo... + with cp.xform[SelectedTriangle] do + begin + if btnCoefsRect.Down = true then + begin + if Sender = txtPost00 then p[0][0] := NewVal + else if Sender = txtPost01 then p[0][1] := -NewVal + else if Sender = txtPost10 then p[1][0] := -NewVal + else if Sender = txtPost11 then p[1][1] := NewVal + else if Sender = txtPost20 then p[2][0] := NewVal + else if Sender = txtPost21 then p[2][1] := -NewVal; + end + else begin + if (Sender = txtPost00) or (Sender = txtPost01) then begin + x := p[0][0]; + y := -p[0][1]; + end else + if (Sender = txtPost10) or (Sender = txtPost11) then begin + x := -p[1][0]; + y := p[1][1]; + end else + begin + x := p[2][0]; + y := -p[2][1]; + end; + r := Hypot(x, y); + a := arctan2(y, x); + + if (Sender = txtPost00) or (Sender = txtPost10) or (Sender = txtPost20) then + r := NewVal + else + a := NewVal*PI/180; + + x := r * cos(a); + y := r * sin(a); + if (Sender = txtPost00) or (Sender = txtPost01) then begin + p[0][0] := x; + p[0][1] := -y; + end else + if (Sender = txtPost10) or (Sender = txtPost11) then begin + p[1][0] := -x; + p[1][1] := y; + end else + begin + p[2][0] := x; + p[2][1] := -y; + end; + end; + end; + + cp.TrianglesFromCP(MainTriangles); + //if tbAutoWeights.Down then cp.CalculateWeights; + ShowSelectedInfo; + UpdateFlame(true); + + self.LastFocus := TEdit(sender); +end; + +procedure TEditForm.btnResetCoefsClick(Sender: TObject); +begin + with cp.xform[SelectedTriangle] do + begin + if (c[0,0]<>1) or (c[0,1]<>0) or(c[1,0]<>0) or (c[1,1]<>1) or (c[2,0]<>0) or (c[2,1]<>0) then + begin + MainForm.UpdateUndo; + c[0, 0] := 1; + c[0, 1] := 0; + c[1, 0] := 0; + c[1, 1] := 1; + c[2, 0] := 0; + c[2, 1] := 0; + ShowSelectedInfo; + cp.TrianglesFromCP(MainTriangles); + if tbAutoWeights.Down then cp.CalculateWeights; // AV + UpdateFlame(True); + end; + end; +end; + +procedure TEditForm.btnResetFlipClick(Sender: TObject); +begin + FlipPoint.x := 0; + FlipPoint.y := 0; + editFlipX.Text := '0'; + editFlipY.Text := '0'; + CalcFlip; + TriangleView.Invalidate; +end; + +procedure TEditForm.btnResetPostCoefsClick(Sender: TObject); +begin + with cp.xform[SelectedTriangle] do + begin + if (p[0,0]<>1) or (p[0,1]<>0) or(p[1,0]<>0) or (p[1,1]<>1) or (p[2,0]<>0) or (p[2,1]<>0) then + begin + + p[0, 0] := 1; + p[0, 1] := 0; + p[1, 0] := 0; + p[1, 1] := 1; + p[2, 0] := 0; + p[2, 1] := 0; + ShowSelectedInfo; + cp.TrianglesFromCP(MainTriangles); + UpdateFlame(True); + end; + end; +end; + +procedure TEditForm.btnPivotModeClick(Sender: TObject); +begin + if PivotMode <> pivotLocal then + // with MainTriangles[SelectedTriangle] do + PivotMode := pivotLocal + else + // with MainTriangles[SelectedTriangle] do + PivotMode := pivotWorld; + + TriangleView.Invalidate; + ShowSelectedInfo; +end; + +procedure TEditForm.PivotValidate(Sender: TObject); +var + v: double; +begin + try + v := Round6(StrToFloat(TEdit(Sender).Text)); + except on Exception do + begin + ShowSelectedInfo; + exit; + end; + end; + + if Sender = editPivotX then + if v <> Round6(GetPivot.x) then begin + if PivotMode = pivotLocal then LocalPivot.x := v + else WorldPivot.x := v; + end + else exit + else + if v <> Round6(GetPivot.y) then begin + if PivotMode = pivotLocal then LocalPivot.y := v + else WorldPivot.y := v; + end + else exit; + + TriangleView.Invalidate; + ShowSelectedInfo; + + self.LastFocus := TEdit(sender); +end; + +procedure TEditForm.PivotKeyPress(Sender: TObject; var Key: Char); +begin + if key <> #13 then exit; + key := #0; + PivotValidate(Sender); +end; + +procedure TEditForm.btnResetPivotClick(Sender: TObject); +begin + if editMode = modePick then begin + editMode := oldMode; + oldMode := modeNone; + // hack: to generate MouseMove event + GetCursorPos(MousePos); + SetCursorPos(MousePos.x, MousePos.y); + // + end; + if PivotMode = pivotLocal then + begin + LocalPivot.x := 0; + LocalPivot.y := 0; + end + else begin + WorldPivot.x := 0; + WorldPivot.y := 0; + end; + TriangleView.Invalidate; + ShowSelectedInfo; +end; + +procedure TEditForm.btnPickPivotClick(Sender: TObject); +begin + if editMode = modePick then begin + editMode := oldMode; + oldMode := modeNone; + TriangleView.Invalidate; + // hack: to generate MouseMove event + GetCursorPos(MousePos); + SetCursorPos(MousePos.x, MousePos.y); + // + exit; + end; + if oldMode <> modeNone then exit; + oldMode := editMode; + editMode := modePick; + TriangleView.Invalidate; + btnPickPivot.Down := true; +end; + +procedure TEditForm.VEVarsDrawCell(Sender: TObject; ACol, ARow: Integer; + Rect: TRect; State: TGridDrawState); +var + supports3D, supportsDC : boolean; + col : TColor; + frect : TRect; + i: integer; +begin + if (ARow = 0) then exit; // AV + i := GetVariationIndex(VEVars.Keys[ARow]); // AV + if (i > NRLOCVAR) and not (gdSelected in State) then + begin + if IsDarkTheme then // AV: dark UI design requies another colors + begin + if i > NumBuiltinVars then + col := MidColor + else begin + col := BrightColor; + if (CurrentStyle = 'Auric') then // make the text more visible + VEVars.Canvas.Font.Color := WinColor + end; + end + else begin // classic variant + if i > NumBuiltinVars then + col := $e0ffff // orange + else + col := $ffe0e0; // blue + end; + VEVars.canvas.brush.Color := col; + VEVars.canvas.fillRect(Rect); + VEVars.canvas.TextOut(Rect.Left+2, Rect.Top+2, VEVars.Cells[ACol,ARow]); + end else col := VEVars.canvas.brush.color; + if (Acol = 0) and (Arow > 0) then begin + VEVars.Canvas.Font.Name := 'Arial'; + VEVars.Canvas.Font.Size := 5; + + VarSupports(i, supports3D, supportsDC); // Arow - 1 + + frect.Left := Rect.Right - 12; + frect.Right := Rect.Right; + frect.Top := Rect.Top; + frect.Bottom := Rect.Bottom; + + if (supports3D or supportsDC) then begin + VEVars.canvas.brush.Color := col; + VEVars.canvas.fillRect(frect); + end; + + if (supports3D) then begin + VEVars.Canvas.Font.Color := $a00000; + VEVars.Canvas.TextOut(frect.Left, frect.Top + 2, '3D'); + end; + + if (supportsDC) then begin + VEVars.Canvas.Font.Color := $0000a0; + VEVars.Canvas.TextOut(frect.Left, frect.Top + 9, 'DC'); + end; + end; +end; + +procedure TEditForm.tbEnableFinalXformClick(Sender: TObject); +begin + MainForm.UpdateUndo; + EnableFinalXform := tbEnableFinalXform.Down; + if (cp.HasFinalXForm = false) then + begin + if (EnableFinalXform = true) then + begin + cbTransforms.Items.Add(TextByKey('editor-common-finalxformlistitem')); + SelectedTriangle := Transforms; + if (mouseOverTriangle > LastTriangle) then mouseOverTriangle := -1; + end + else begin + if cbTransforms.Items.Count = Transforms+1 then + cbTransforms.Items.Delete(Transforms); + if SelectedTriangle >= Transforms then SelectedTriangle := Transforms-1; + end; + end; + cp.finalXformEnabled := EnableFinalXform; + UpdateFlame(True); + TriangleView.Invalidate; +end; + +procedure TEditForm.DragPanelMouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +var dont :boolean; +begin + if Button <> mbLeft then exit; + + // -X- why? its impossible! + assert(pnlDragMode = false); //? + if pnlDragMode = true then exit; + + dont := false; + if (Sender = pnlWeight) then + if SelectedTriangle < Transforms then + pnlDragValue := cp.xform[SelectedTriangle].density + else exit + else if (Sender = pnlSymmetry) then + pnlDragValue := cp.xform[SelectedTriangle].symmetry + else if (Sender = pnlXformColor) then + pnlDragValue := cp.xform[SelectedTriangle].color + else if (Sender = pnlOpacity) then begin + if (txtOpacity.Enabled) then begin + pnlDragValue := cp.xform[SelectedTriangle].transOpacity; + end else dont := true; + end else if (Sender = pnlDC) then begin + if (txtDC.Enabled) then begin + pnlDragValue := cp.xform[SelectedTriangle].pluginColor; + end else dont := true; + end else assert(false); + + if (not dont) then begin + pnlDragMode := true; + pnlDragPos := 0; + pnlDragOld := x; + varMM := false; + //SetCaptureControl(TControl(Sender)); + + Screen.Cursor := crHSplit; + //GetCursorPos(mousepos); // hmmm + mousePos := (Sender as TControl).ClientToScreen(Point(x, y)); + HasChanged := false; + end; +end; + +procedure TEditForm.DragPanelMouseMove(Sender: TObject; Shift: TShiftState; + X, Y: Integer); +var + v: double; + pEdit: ^TEdit; +begin + if varMM then // hack: to skip MouseMove event + begin + varMM:=false; + end + else + if pnlDragMode and (x <> pnlDragOld) then + begin + Inc(pnlDragPos, x - pnlDragOld); + + if GetKeyState(VK_MENU) < 0 then v := 100000 + else if GetKeyState(VK_CONTROL) < 0 then v := 10000 + else if GetKeyState(VK_SHIFT) < 0 then v := 100 + else v := 1000; + + v := Round6(pnlDragValue + pnlDragPos / v); + + SetCursorPos(MousePos.x, MousePos.y); // hmmm + varMM:=true; + + if (Sender = pnlWeight) then + begin + if v <= 0.000001 then v := 0.000001 + else if v > MAX_WEIGHT then v := MAX_WEIGHT; + cp.xform[SelectedTriangle].density := v; + pEdit := @txtP; + end + else if (Sender = pnlSymmetry) then + begin + if v < -1 then v := -1 + else if v > 1 then v := 1; + cp.xform[SelectedTriangle].symmetry := v; + pEdit := @txtSymmetry; + end + else if (Sender = pnlOpacity) then + begin + if (txtOpacity.Enabled) then begin + if v < 0 then v := 0 + else if v > 1 then v := 1; + cp.xform[SelectedTriangle].transOpacity := v; + pEdit := @txtOpacity; + end else exit; + end + else if (Sender = pnlDC) then + begin + if (txtDC.Enabled) then begin + if v < 0 then v := 0 + else if v > 1 then v := 1; + cp.xform[SelectedTriangle].pluginColor := v; + pEdit := @txtDC; + end else exit; + end + else if (Sender = pnlXformColor) then + begin + if v < 0 then v := 0 + else if v > 1 then v := 1; + cp.xform[SelectedTriangle].color := v; + pnlXFormColor.Color := ColorValToColor(cp.cmap, v); + shColor.Brush.Color := pnlXformColor.Color; + updating := true; + scrlXformColor.Position := round(v*1000); + pEdit := @txtXformColor; + updating := false; + end + else begin + assert(false); + exit; + end; + pEdit^.Text := FloatToStr(v); + pEdit.Refresh; + HasChanged := True; + DrawPreview; + end; +end; + +procedure TEditForm.DragPanelMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + if Button <> mbLeft then exit; + + if pnlDragMode then + begin + //SetCaptureControl(nil); + + pnlDragMode := false; + Screen.Cursor := crDefault; + + if HasChanged then + begin + MainForm.UpdateUndo; + + UpdateFlame(true); + HasChanged := False; + + if (Sender = pnlWeight) and ChaosForm.Visible then // AV + ChaosForm.WeightVector.Invalidate; + end; + end; +end; + +procedure TEditForm.DragPanelDblClick(Sender: TObject); +var + pValue: ^double; + pEdit: ^TEdit; +begin + if (Sender = pnlWeight) then + begin + if SelectedTriangle >= Transforms then exit; // hmm + pValue := @cp.xform[SelectedTriangle].density; + if pValue^ = 0.5 then exit; + pValue^ := 0.5; + pEdit := @txtP; + if ChaosForm.Visible then // AV + ChaosForm.WeightVector.Invalidate; + end + else if (Sender = pnlSymmetry) then + begin + pValue := @cp.xform[SelectedTriangle].symmetry; + if SelectedTriangle = Transforms then begin + if pValue^ = 1 then exit; + pValue^ := 1; + end + else begin + if pValue^ = 0 then exit; + pValue^ := 0; + end; + pEdit := @txtSymmetry; + end + else if (Sender = pnlXformColor) then + begin + pValue := @cp.xform[SelectedTriangle].color; + if pValue^ = 0 then exit; + pValue^ := 0; + pEdit := @txtXformColor; + end + else if (Sender = pnlOpacity) then + begin + if SelectedTriangle >= Transforms then exit; // hmm + pValue := @cp.xform[SelectedTriangle].transOpacity; + if pValue^ = 1.0 then begin + pValue^ := 0.0; + end else begin + pValue^ := 1.0; + end; + pEdit := @txtOpacity; + end + else if (Sender = pnlDC) then + begin + if SelectedTriangle >= Transforms then exit; // hmm + pValue := @cp.xform[SelectedTriangle].pluginColor; + if pValue^ = 1.0 then begin + pValue^ := 0.0; + end else begin + pValue^ := 1.0; + end; + pEdit := @txtDC; + end + else begin + assert(false); + exit; + end; + + MainForm.UpdateUndo; + pEdit^.Text := FloatToStr(pValue^); + UpdateFlame(true); +end; + +procedure TEditForm.mnuResetTrgRotationClick(Sender: TObject); +var + dx, dy: double; + ax, ay, da: integer; + nx0, ny0, nx2, ny2: double; +begin + with MainTriangles[SelectedTriangle] do + begin +// xx := x[0] - x[1]; +// xy := y[0] - y[1]; +// yx := x[2] - x[1]; +// yy := y[2] - y[1]; + ax := round( arctan2(xy, xx) / (pi/2) ); + ay := round( arctan2(yy, yx) / (pi/2) ); + dx := Hypot(xx, xy); + dy := Hypot(yx, yy); + if xx*yy - yx*xy >= 0 then da := 1 else da := -1; + if ax = ay then ay := ay + da + else if abs(ax-ay) = 2 then ay := ay - da; + + nx0 := x[1] + dx*cos(ax*pi/2); + ny0 := y[1] + dx*sin(ax*pi/2); + nx2 := x[1] + dy*cos(ay*pi/2); + ny2 := y[1] + dy*sin(ay*pi/2); + if (x[0] = nx0) and (y[0] = ny0) and (x[2] = nx2) and (y[2] = ny2) then exit; + MainForm.UpdateUndo; + x[0] := nx0; + y[0] := ny0; + x[2] := nx2; + y[2] := ny2; + UpdateFlame(True); + end; +end; + +procedure TEditForm.mnuResetTrgScaleClick(Sender: TObject); +var + dx, dy: double; + nx0, ny0, nx2, ny2: double; +begin + with MainTriangles[SelectedTriangle] do + begin +// xx := x[0] - x[1]; +// xy := y[0] - y[1]; +// yx := x[2] - x[1]; +// yy := y[2] - y[1]; + dx := Hypot(xx, xy); + dy := Hypot(yx, yy); + if dx <> 0 then begin + nx0 := x[1] + (x[0] - x[1])/dx; + ny0 := y[1] + (y[0] - y[1])/dx; + end + else begin + nx0 := x[1] + 1; + ny0 := y[1]; + end; + if dx <> 0 then begin + nx2 := x[1] + (x[2] - x[1])/dy; + ny2 := y[1] + (y[2] - y[1])/dy; + end + else begin + nx2 := x[1]; + ny2 := y[1] + 1; + end; + if (x[0] = nx0) and (y[0] = ny0) and (x[2] = nx2) and (y[2] = ny2) then exit; + MainForm.UpdateUndo; + x[0] := nx0; + y[0] := ny0; + x[2] := nx2; + y[2] := ny2; + UpdateFlame(True); + end; +end; + +procedure TEditForm.RandomizeMatrixClick(Sender: TObject); +var i, j: integer; +begin + MainForm.UpdateUndo; + if Sender = RandomizeMatrix then + for i := 0 to Transforms-1 do + for j := 0 to Transforms-1 do + cp.xform[i].modWeights[j] := Round6(random) + else begin + if mnuChaosViewTo.Checked then + for j := 0 to Transforms-1 do + cp.xform[SelectedTriangle].modWeights[j] := Round6(random) + else for j := 0 to Transforms-1 do + cp.xform[j].modWeights[SelectedTriangle] := Round6(random); + end; + + UpdateFlame(True); + if ChaosForm.Visible then // AV + ChaosForm.ChaosMatrix.Invalidate; +end; + +procedure TEditForm.ResetAxisRotation(n: integer); +var + dx, dy, d: double; + a: integer; + nx, ny: double; +begin + with MainTriangles[SelectedTriangle] do + begin + if n = 1 then + begin + d := Hypot(x[1], y[1]); + if d = 0 then exit; + a := round( arctan2(y[1], x[1]) / (pi/2) ); + nx := d*cos(a*pi/2); + ny := d*sin(a*pi/2); + if (x[1] = nx) and (y[1] = ny) then exit; + MainForm.UpdateUndo; + x[1] := nx; + y[1] := ny; + x[0] := x[1] + xx; + y[0] := y[1] + xy; + x[2] := x[1] + yx; + y[2] := y[1] + yy; + UpdateFlame(True); + end + else begin + dx := x[n] - x[1]; + dy := y[n] - y[1]; + a := round( arctan2(dy, dx) / (pi/2) ); + d := Hypot(dx, dy); + nx := x[1] + d*cos(a*pi/2); + ny := y[1] + d*sin(a*pi/2); + if (x[n] = nx) and (y[n] = ny) then exit; + MainForm.UpdateUndo; + x[n] := nx; + y[n] := ny; + UpdateFlame(True); + end; + end; +end; + +procedure TEditForm.ResetAxisScale(n: integer); +var + dx, dy, d: double; + nx, ny: double; +begin + with MainTriangles[SelectedTriangle] do + begin + if n = 1 then + begin + d := Hypot(x[1], y[1]); + if d = 0 then exit; + nx := x[1]/d; + ny := y[1]/d; + if (x[1] = nx) and (y[1] = ny) then exit; + MainForm.UpdateUndo; + x[1] := nx; + y[1] := ny; + x[0] := x[1] + xx; + y[0] := y[1] + xy; + x[2] := x[1] + yx; + y[2] := y[1] + yy; + UpdateFlame(True); + end + else begin + dx := x[n] - x[1]; + dy := y[n] - y[1]; + d := Hypot(dx, dy); + if d <> 0 then begin + nx := x[1] + dx / d; + ny := y[1] + dy / d; + end + else begin + nx := x[1] + ifthen(n=0, 1, 0); + ny := y[1] + ifthen(n=2, 1, 0); + end; + if (x[n] = nx) and (y[n] = ny) then exit; + MainForm.UpdateUndo; + x[n] := nx; + y[n] := ny; + UpdateFlame(True); + end; + end; +end; + +procedure TEditForm.tbPostXswapClick(Sender: TObject); +begin + cp.GetFromTriangles(MainTriangles, cp.NumXForms); + with cp.xform[SelectedTriangle] do begin + + { // AV: it doesn't work then user press hotkey T... + if (sender = tbPostXswap) then tb2PostXswap.down := tbPostXswap.Down; + if (sender = tb2PostXswap) then tbPostXswap.Down := tb2PostXSwap.Down; + + postXswap := TToolButton(sender).Down; } + + if (sender = tbPostXswap) or (sender = tb2PostXswap) then + postXswap := TToolButton(sender).Down + else + postXswap := not postXswap; + tbPostXswap.Down := postXswap; + tb2PostXswap.Down := postXswap; + ShowSelectedInfo; + end; + cp.TrianglesFromCP(MainTriangles); + TriangleView.Refresh; +end; + +procedure TEditForm.btnCopyTriangleClick(Sender: TObject); +begin + MemTriangle := MainTriangles[SelectedTriangle]; + tbPasteTriangle.Enabled := True; + PasteTriangleCoordinates1.Enabled := True; +end; + +procedure TEditForm.btnFlipClick(Sender: TObject); +var px, py, fx, fy: double; +begin + px := GetPivot.x; + py := GetPivot.y; + if (PivotMode = pivotLocal) then + with MainTriangles[SelectedTriangle] do begin + fx := x[1] + (x[0] - x[1])* FlipPoint.x + (x[2] - x[1])* FlipPoint.y; + fy := y[1] + (y[0] - y[1])* FlipPoint.x + (y[2] - y[1])* FlipPoint.y; + end + else begin + fx := FlipPoint.x; + fy := FlipPoint.y; + end; + if (px = fx) and (py = fy) then exit; + MainForm.UpdateUndo; + //if (px = fx) then MainTriangles[SelectedTriangle] := + // FlipTriangleHorizontal(MainTriangles[SelectedTriangle]) + //else if (py = fy) then MainTriangles[SelectedTriangle] := + // FlipTriangleVertical(MainTriangles[SelectedTriangle]) else + MainTriangles[SelectedTriangle] := + FlipTriangleLine(MainTriangles[SelectedTriangle], px, py, fx, fy); + UpdateFlame(true); +end; + +procedure TEditForm.btnFullChaosClick(Sender: TObject); +begin + ChaosForm.Show; +end; + +procedure TEditForm.btnPasteTriangleClick(Sender: TObject); +begin + if (MainTriangles[SelectedTriangle].x[0] <> MemTriangle.x[0]) or + (MainTriangles[SelectedTriangle].x[1] <> MemTriangle.x[1]) or + (MainTriangles[SelectedTriangle].x[2] <> MemTriangle.x[2]) or + (MainTriangles[SelectedTriangle].y[0] <> MemTriangle.y[0]) or + (MainTriangles[SelectedTriangle].y[1] <> MemTriangle.y[1]) or + (MainTriangles[SelectedTriangle].y[2] <> MemTriangle.y[2]) then + begin + MainForm.UpdateUndo; + MainTriangles[SelectedTriangle] := MemTriangle; + UpdateFlame(True); + end; +end; + +procedure TEditForm.chkAutoZscaleClick(Sender: TObject); +begin + MainForm.UpdateUndo; + cp.xform[SelectedTriangle].autoZscale := chkAutoZscale.Checked; + UpdateFlame(True); +end; + +// --------------------------------------------------------------- Chaos Editor + +procedure TEditForm.ValidateChaos; +var + i: integer; + NewVal, OldVal: double; +begin + i := vleChaos.Row - 1; + + if mnuChaosViewTo.Checked then + OldVal := Round6(cp.xform[SelectedTriangle].modWeights[i]) + else + OldVal := Round6(cp.xform[i].modWeights[SelectedTriangle]); + + try + NewVal := Round6(StrToFloat(vleChaos.Cells[1, i+1])); + except + vleChaos.Cells[1, i+1] := Format('%.6g', [OldVal]); + exit; + end; + if (NewVal <> OldVal) then + begin + MainForm.UpdateUndo; + + if mnuChaosViewTo.Checked then + cp.xform[SelectedTriangle].modWeights[i] := NewVal + else + cp.xform[i].modWeights[SelectedTriangle] := NewVal; + + vleChaos.Cells[1, i+1] := Format('%.6g', [NewVal]); + ShowSelectedInfo; + UpdateFlame(True); + + if ChaosForm.Visible then // AV + ChaosForm.ChaosMatrix.Invalidate; + end; +end; + +procedure TEditForm.vleChaosExit(Sender: TObject); +begin + ValidateChaos; +end; + +procedure TEditForm.vleChaosKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = '-') then Key:= #0; // AV + if key = #13 then + begin + key := #0; + ValidateChaos; + end; +end; + +procedure TEditForm.vleChaosValidate(Sender: TObject; ACol, ARow: Integer; + const KeyName, KeyValue: String); +begin + ValidateChaos; +end; + +procedure TEditForm.VleChaosDrawCell(Sender: TObject; ACol, ARow: Integer; + Rect: TRect; State: TGridDrawState); +var + h,ax,ay,bx,by: integer; + trgColor: TColor; +begin + if (ACol > 0) or (ARow = 0) then exit; + + trgColor := GetTriangleColor(ARow - 1); + with vleChaos.Canvas do begin + h := Rect.Bottom - Rect.Top - 2; +// TextOut(Rect.Left+h+2, Rect.Top+1, vleChaos.Cells[ACol, ARow]); + + ax:=Rect.Right-3; + ay:=Rect.Top+2; + bx:=Rect.Right-h; + by:=Rect.Bottom-3; + + pen.Color := clBlack; + Polyline([Point(ax+1, ay-2), Point(ax+1, by+1), Point(bx-2, by+1), Point(ax+1, ay-2)]); + + pen.Color := trgColor; + brush.Color := pen.Color shr 1 and $7f7f7f; + Polygon([Point(ax, ay), Point(ax, by), Point(bx, by)]); + end; +end; + +procedure TEditForm.mnuChaosViewToClick(Sender: TObject); +var + i: integer; +begin + mnuChaosViewTo.Checked := true; + for i := 1 to vleChaos.RowCount-1 do begin + vleChaos.Cells[0, i] := Format(TextByKey('editor-common-toprefix'), [i]); + vleChaos.Cells[1, i] := FloatToStr(cp.xform[SelectedTriangle].modWeights[i-1]); + end; + //ShowSelectedInfo; +end; + +procedure TEditForm.mnuChaosViewFromClick(Sender: TObject); +var + i: integer; +begin + mnuChaosViewFrom.Checked := true; + for i := 1 to vleChaos.RowCount-1 do begin + vleChaos.Cells[0, i] := Format(TextByKey('editor-common-fromprefix'), [i]); + vleChaos.Cells[1, i] := FloatToStr(cp.xform[i-1].modWeights[SelectedTriangle]); + end; + //ShowSelectedInfo; +end; + +(* +procedure TEditForm.chkPlotModeClick(Sender: TObject); +var newMode: boolean; +begin + if (SelectedTriangle < Transforms) then + begin + newMode := chkXformInvisible.Checked; + if cp.xform[SelectedTriangle].noPlot <> newMode then begin + MainForm.UpdateUndo; + cp.xform[SelectedTriangle].noPlot := newMode; + UpdateFlame(true); + end; + end; +end; +*) + +procedure TEditForm.mnuChangeGridClick(Sender: TObject); // AV +begin + if not TMenuItem(Sender).Checked then + begin + TMenuItem(Sender).Checked := True; + try + if Sender = RectGrid then // AV: classic arrows + begin + btTrgMoveUp.Glyph := nil; + IconsAV.GetBitmap(0, btTrgMoveUp.Glyph); + btTrgMoveDown.Glyph := nil; + IconsAV.GetBitmap(1, btTrgMoveDown.Glyph); + end else begin // AV: slope arrows + btTrgMoveUp.Glyph := nil; + IconsAV.GetBitmap(2, btTrgMoveUp.Glyph); + btTrgMoveDown.Glyph := nil; + IconsAV.GetBitmap(3, btTrgMoveDown.Glyph); + end; + finally + end; + end; +end; + +procedure TEditForm.mnuChaosClearAllClick(Sender: TObject); +var + i: integer; + noEdit: boolean; +begin + noEdit := true; + for i := 1 to cp.NumXForms do + if mnuChaosViewTo.Checked then begin + if cp.xform[SelectedTriangle].modWeights[i-1] <> 0 then begin + noEdit := false; + break; + end; + end + else begin + if cp.xform[i-1].modWeights[SelectedTriangle] <> 0 then begin + noEdit := false; + break; + end; + end; + if noEdit then exit; + + Mainform.UpdateUndo; + for i := 1 to cp.NumXForms do + if mnuChaosViewTo.Checked then + cp.xform[SelectedTriangle].modWeights[i-1] := 0 + else + cp.xform[i-1].modWeights[SelectedTriangle] := 0; + UpdateFlame(true); + if ChaosForm.Visible then // AV + ChaosForm.ChaosMatrix.Invalidate; +end; + +procedure TEditForm.mnuChaosSetAllClick(Sender: TObject); +var + i: integer; + noEdit: boolean; +begin + noEdit := true; + for i := 1 to cp.NumXForms do + if mnuChaosViewTo.Checked then begin + if cp.xform[SelectedTriangle].modWeights[i-1] <> 1 then begin + noEdit := false; + break; + end; + end + else begin + if cp.xform[i-1].modWeights[SelectedTriangle] <> 1 then begin + noEdit := false; + break; + end; + end; + if noEdit then exit; + + Mainform.UpdateUndo; + for i := 1 to cp.NumXForms do + if mnuChaosViewTo.Checked then + cp.xform[SelectedTriangle].modWeights[i-1] := 1 + else + cp.xform[i-1].modWeights[SelectedTriangle] := 1; + UpdateFlame(true); + if ChaosForm.Visible then // AV + ChaosForm.ChaosMatrix.Invalidate; +end; + +procedure TEditForm.mnuLinkPostxformClick(Sender: TObject); +var + i, k: integer; +begin + if (Transforms < NXFORMS) and (SelectedTriangle <> Transforms) then + begin + MainForm.UpdateUndo; + MainTriangles[Transforms+1] := MainTriangles[Transforms]; + cp.xform[Transforms+1].Assign(cp.xform[Transforms]); + + MainTriangles[Transforms] := MainTriangles[-1]; + cp.xform[Transforms].Clear; + if InheritWeights.Checked then + cp.xform[Transforms].density := cp.xform[SelectedTriangle].density + else cp.xform[Transforms].density := 0.5; + cp.xform[Transforms].SetVariation(0, 1); + + for i := 0 to NXFORMS-1 do begin + if (i = Transforms) then continue; + cp.xform[Transforms].modWeights[i] := cp.xform[SelectedTriangle].modWeights[i]; + cp.xform[SelectedTriangle].modWeights[i] := 0; + end; + + for i := 0 to NXFORMS-1 do + cp.xform[i].modWeights[Transforms] := 0; + cp.xform[SelectedTriangle].modWeights[Transforms] := 1; + + cp.xform[Transforms].symmetry := 1; + cp.xform[Transforms].transOpacity := cp.xform[SelectedTriangle].transOpacity; + cp.xform[SelectedTriangle].transOpacity := 0; + + hasLinkX := True; + + k := SelectedTriangle; + SelectedTriangle := Transforms; + cp.xform[SelectedTriangle].TransformName := 'Post-link for TX ' + IntToStr(k + 1); + + Inc(Transforms); + UpdateXformsList; + UpdateFlame(True); + + if ChaosForm.Visible then // AV + ChaosForm.ChaosMatrix.Invalidate; + end; +end; + +procedure TEditForm.mnuLinkPreXformClick(Sender: TObject); +var + i, k: integer; +begin + if (Transforms < NXFORMS) and (SelectedTriangle <> Transforms) then + begin + MainForm.UpdateUndo; + MainTriangles[Transforms+1] := MainTriangles[Transforms]; + cp.xform[Transforms+1].Assign(cp.xform[Transforms]); + + MainTriangles[Transforms] := MainTriangles[-1]; + cp.xform[Transforms].Clear; + if InheritWeights.Checked then + cp.xform[Transforms].density := cp.xform[SelectedTriangle].density + else cp.xform[Transforms].density := 0.5; + cp.xform[Transforms].SetVariation(0, 1); + + for i := 0 to NXFORMS-1 do begin + if (i = Transforms) then continue; + cp.xform[i].modWeights[Transforms] := cp.xform[i].modWeights[SelectedTriangle]; + cp.xform[i].modWeights[SelectedTriangle] := 0; + end; + + for i := 0 to NXFORMS-1 do + cp.xform[Transforms].modWeights[i] := 0; + cp.xform[Transforms].modWeights[SelectedTriangle] := 1; + + cp.xform[Transforms].symmetry := 1; + cp.xform[Transforms].transOpacity := 0; + + hasLinkX := True; + + k := SelectedTriangle; + SelectedTriangle := Transforms; + cp.xform[SelectedTriangle].TransformName := 'Pre-link for TX ' + IntToStr(k + 1); + + Inc(Transforms); + UpdateXformsList; + UpdateFlame(True); + + if ChaosForm.Visible then // AV + ChaosForm.ChaosMatrix.Invalidate; + end; +end; + +procedure TEditForm.chkXformSoloClick(Sender: TObject); +begin + if chkXformSolo.Checked <> (cp.soloXform >=0) then begin + if chkXformSolo.Checked then begin + if (SelectedTriangle < Transforms) then begin + cp.soloXform := SelectedTriangle; + UpdateFlame(true); + end; + end + else begin + cp.soloXform := -1; + UpdateFlame(true); + end; + end; +end; + +procedure TEditForm.mnuChaosRebuildClick(Sender: TObject); +begin + RebuildXaosLinks := not RebuildXaosLinks; + mnuChaosRebuild.Checked := RebuildXaosLinks; +end; + +procedure TEditForm.chkCollapseVariationsClick(Sender: TObject); +var + i: integer; + s: string; +begin + s := Trim(txtSearchBox.Text); + for i := 1 to VEVars.RowCount - 1 do + begin + if (Length(s) = 0) then + begin + case cbCollapseVariations.ItemIndex of + 0: VEVars.RowHeights[i] := VEVars.DefaultRowHeight; // all + 1: if Assigned(cp) then + VEVars.RowHeights[i] := // active + IfThen((VEVars.Cells[1,i] = '0'), -1, VEVars.DefaultRowHeight) + else + VEVars.RowHeights[i] := -1; + 2: VEVars.RowHeights[i] := // favourites + IfThen(FavouriteVariations[GetVariationIndex(VEVars.Cells[0,i])], // i-1 + VEVars.DefaultRowHeight, -1); + end; + end + else begin // AV: search text is not empty + if (Length(s) > Length(VEVars.Cells[0, i])) then + VEVars.RowHeights[i] := -1 + else if Pos(s, VEVars.Cells[0, i]) > 0 then + begin + case cbCollapseVariations.ItemIndex of + 0: VEVars.RowHeights[i] := VEVars.DefaultRowHeight; // all + 1: if Assigned(cp) then + VEVars.RowHeights[i] := // active + IfThen((VEVars.Cells[1,i] = '0'), -1, VEVars.DefaultRowHeight) + else + VEVars.RowHeights[i] := -1; + 2: VEVars.RowHeights[i] := // favourites + IfThen(FavouriteVariations[GetVariationIndex(VEVars.Cells[0,i])], + VEVars.DefaultRowHeight, -1); + end; + end + else + VEVars.RowHeights[i] := -1; + end; + end; + +{ + s := Trim(txtSearchBox.Text); + for i:= 1 to VEVars.RowCount - 1 do + begin + if (Length(s) = 0) then + begin + if ((Assigned(cp)) and (VEVars.Cells[1,i]='0')) then + if chkCollapseVariations.Checked then + VEVars.RowHeights[i] := -1 + else + VEVars.RowHeights[i] := VEVars.DefaultRowHeight + else + VEVars.RowHeights[i] := VEVars.DefaultRowHeight; + end + else begin + if (Length(s) > Length(VEVars.Cells[0, i])) then + VEVars.RowHeights[i] := -1 + else if Pos(s, VEVars.Cells[0, i]) > 0 then + begin + if ((Assigned(cp)) and (VEVars.Cells[1,i]='0')) then + if chkCollapseVariations.Checked then + VEVars.RowHeights[i] := -1 + else + VEVars.RowHeights[i] := VEVars.DefaultRowHeight + else + VEVars.RowHeights[i] := VEVars.DefaultRowHeight; + end + else + VEVars.RowHeights[i] := -1; + end; + end; +} +end; + +procedure TEditForm.chkCollapseVariablesClick(Sender: TObject); +var + i, vari: integer; +begin + for i := 1 to vleVariables.RowCount - 1 do + begin + if chkCollapseVariables.Checked then + vleVariables.RowHeights[i] := vleVariables.DefaultRowHeight + else + begin + vari := GetVariationIndexFromVariableNameIndex(i-1); + if ( (vari = -1) or + ((Assigned(cp)) and (cp.xform[SelectedTriangle].GetVariation(vari) = 0)) ) then + vleVariables.RowHeights[i] := -1 + else + vleVariables.RowHeights[i] := vleVariables.DefaultRowHeight; + end; + end; +end; + +procedure TEditForm.shColorMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + DragPanelMouseDown(pnlXFormColor, Button, Shift, X, Y); +end; + +procedure TEditForm.shColorMouseMove(Sender: TObject; Shift: TShiftState; + X, Y: Integer); +begin + DragPanelMouseMove(pnlXFormColor, Shift, X, Y); +end; + +procedure TEditForm.shColorMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + DragPanelMouseUp(pnlXFormColor, Button, Shift, X, Y); +end; + +procedure TEditForm.bClearClick(Sender: TObject); +var + i:integer; + changed:boolean; +begin + changed := false; + for i := 0 to VEVars.RowCount - 1 do begin + if (cp.xform[SelectedTriangle].GetVariation(i) <> 0) then changed := true; + cp.xform[SelectedTriangle].SetVariation(i, 0); + end; + + if changed then MainForm.UpdateUndo; + UpdateFlame(true); +end; + +procedure TEditForm.ResetChaosClick(Sender: TObject); +var i, j: integer; + noEdit: boolean; +begin + noEdit := true; + for i := 0 to Transforms-1 do + begin + if not noEdit then break; + for j := 0 to Transforms-1 do + if cp.xform[i].modWeights[j] <> 1 then + begin + noEdit := false; + break; + end; + end; + if noEdit then exit; + + MainForm.UpdateUndo; + for i := 0 to NXforms-1 do + for j := 0 to NXforms-1 do + cp.xform[i].modWeights[j] := 1; + UpdateFlame(True); + if ChaosForm.Visible then // AV + ChaosForm.ChaosMatrix.Invalidate; +end; + +procedure TEditForm.mnuResetTrgFlipClick(Sender: TObject); +var + x0, y0, x1, y1, detT: double; +begin + with cp.xform[SelectedTriangle] do + if postXswap then + detT := det(p[0,0], p[1,0], p[0,1], p[1,1]) + else detT := det(c[0,0], c[1,0], c[0,1], c[1,1]); + if (detT >= 0) then exit; + + with MainTriangles[SelectedTriangle] do + begin + x0 := x[1]; + y0 := y[1]; + x1 := x[0] + x[2] - x0; + y1 := y[0] + y[2] - y0; + end; + MainForm.UpdateUndo; + MainTriangles[SelectedTriangle] := + FlipTriangleLine(MainTriangles[SelectedTriangle], x0, y0, x1, y1); + UpdateFlame(true); +end; + +procedure TEditForm.btResetparamsClick(Sender: TObject); +var + i: integer; +begin + for i:= 0 to GetNrVariableNames - 1 do begin + cp.xform[SelectedTriangle].ResetVariable(GetVariableNameAt(i)); + end; + + MainForm.UpdateUndo; + UpdateFlame(true); +end; + +procedure TEditForm.btSwapCoefsClick(Sender: TObject); +var + i, j: byte; + t: double; +begin + MainForm.UpdateUndo; + with cp.xform[SelectedTriangle] do + for i := 0 to 2 do + for j := 0 to 1 do + begin + t := c[i,j]; + c[i,j] := p[i,j]; + p[i,j] := t; + end; + if not tbPostXSwap.Down then + cp.GetTriangle(MainTriangles[SelectedTriangle], SelectedTriangle) + else cp.GetPostTriangle(MainTriangles[SelectedTriangle], SelectedTriangle); + UpdateFlame(true); +end; + +procedure TEditForm.ColorBarMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +var + dx: double; //Extended; +begin + // dx := Round(100 * X / ColorBar.Width) / 100; // AV: it's not correct + dx := X / (ColorBarPicture.Width - 1); // AV: this gives the best results + txtXFormColor.Text := FloatToStrF(dx, ffFixed, 4, 3); // AV: default presision + txtXFormColorExit(nil); +end; + +{ +procedure TEditForm.btnLoadVVARClick(Sender: TObject); +var + fn:string; + i:integer; +begin + if OpenSaveFileDialog(EditForm, '.dll', 'Dynamic Link Libraries (*.dll)|*.dll', '.\Plugins', 'LoadPlugin...', fn, true, false, false, true) then begin + //if (fn <> '') then begin + LoadPlugin(fn); + + VEVars.Strings.Clear; + vleVariables.Strings.Clear; + + for i:= 0 to NRVAR - 1 do begin + VEVars.InsertRow(Varnames(i), '0', True); + end; + for i:= 0 to GetNrVariableNames - 1 do begin + vleVariables.InsertRow(GetVariableNameAt(i), '0', True); + end; + + for i := 0 to Transforms - 1 do begin + cp.xform[i].InvokeAddRegVariations; + end; + end; + end; +end; +} + +procedure TEditForm.txtNameKeyPress(Sender: TObject; var Key: Char); +begin + if SelectedTriangle >= Transforms then key := #0; + if key = #13 then + begin + { Stop the beep } + Key := #0; + txtNameExit(sender); + end; + +end; + +procedure TEditForm.txtNameExit(Sender: TObject); +var + n:integer; + oldval,newval:string; +begin + + oldval := cp.xform[SelectedTriangle].TransformName; + newval := txtName.Text; + + if (oldval <> newval) then begin + MainForm.UpdateUndo; + cp.xform[SelectedTriangle].TransformName := newval; + n := SelectedTriangle + 1; + if (cp.xform[SelectedTriangle].TransformName <> '') then + cbTransforms.Items[SelectedTriangle] := IntToStr(n) + ' - ' + cp.xform[SelectedTriangle].TransformName + else + cbTransforms.Items[SelectedTriangle] := IntToStr(n); + + //workaround.. + if (SelectedTriangle >= Transforms) then + cbTransforms.Items[SelectedTriangle] := TextByKey('editor-common-finalxformlistitem'); + cbTransforms.ItemIndex := SelectedTriangle; + UpdateFlame(True); + end; +end; + +procedure TEditForm.TriangleOperationsClick(Sender: TObject); +begin + TMenuItem(Sender).Checked := True; +end; + +procedure TEditForm.TrianglePanelResize(Sender: TObject); +begin + GroupBox5.Left := (TrianglePanel.CLientWidth - GroupBox5.Width) div 2; + GroupBox6.Left := (TrianglePanel.CLientWidth - GroupBox6.Width) div 2; + GroupBox3.Left := (TrianglePanel.CLientWidth - GroupBox3.Width) div 2; + GroupBox10.Left := (TrianglePanel.CLientWidth - GroupBox10.Width) div 2; + TriangleToolBar.Left := (TrianglePanel.CLientWidth - TriangleToolBar.Width) div 2; +end; + +procedure TEditForm.ControlPanelResize(Sender: TObject); +begin + cbTransforms.ItemHeight := Panel1.Height - 6; + cbTransforms.Height := Panel1.Height; + PageControl.Top := Panel1.Height + Panel2.Height + pnlWeight.Height + 12; + PageControl.Height := ControlPanel.Height - PageControl.Top; +end; + +procedure TEditForm.Copytransform1Click(Sender: TObject); +var txt: string; +begin + MemCp.Clear; + MemCp.Name := 'Memorized XForm Parameters'; + MemCp.xform[0].Assign(cp.xform[SelectedTriangle]); + txt := Trim(MainForm.RetrieveXML(MemCp)); + Clipboard.SetTextBuf(PChar(txt)); + Pastetransform1.Enabled := True; + MainForm.mnuPaste.Enabled := False; +end; + +procedure TEditForm.Pastetransform1Click(Sender: TObject); +var + TempTriangles: TTriangles; + i: integer; +begin + if (MemCp.NumXForms > 0) and (Transforms < NXFORMS) then + begin + MainForm.UpdateUndo; + MemCp.TrianglesFromCP(TempTriangles); + for i := 0 to MemCp.NumXForms - 1 do + begin + MainTriangles[Transforms+1] := MainTriangles[Transforms]; + cp.xform[Transforms+1].Assign(cp.xform[Transforms]); + MainTriangles[Transforms] := TempTriangles[i]; + cp.xform[Transforms].Assign(MemCp.xform[i]); + SelectedTriangle := Transforms; + Inc(Transforms); + end; + UpdateXformsList; + UpdateFlame(True); + end; +end; + +procedure TEditForm.ScrollBox2Resize(Sender: TObject); +begin // AV: done + GroupBox1.Left := (ScrollBox2.ClientWidth - GroupBox1.Width) div 2; + GroupBox2.Left := (ScrollBox2.ClientWidth - GroupBox2.Width) div 2; +end; + +procedure TEditForm.ScrollBox1Resize(Sender: TObject); +var sbw: integer; // AV: for speed +begin + sbw := (ScrollBox1.ClientWidth - GroupBox9.Width) div 2; + GroupBox7.Left := sbw; + GroupBox8.Left := sbw; + GroupBox9.Left := sbw; + chkAutoZscale.Left := sbw; + btSwapCoefs.Left := sbw; + btConjugate.Left := sbw + 116; +end; + +procedure TEditForm.FlipPointKeyPress(Sender: TObject; var Key: Char); +begin + if key <> #13 then exit; + key := #0; + FlipPointValidate(Sender); +end; + +procedure TEditForm.FlipPointValidate(Sender: TObject); +var + v: double; +begin + try + v := Round6(StrToFloat(TEdit(Sender).Text)); + if Sender = editFlipX then + FlipPoint.x := v + else + FlipPoint.y := v; + except // restore old value + if Sender = editFlipX then v := FlipPoint.x + else v := FlipPoint.y; + end; + TEdit(Sender).Text := Format('%.6g',[v]); + TriangleView.Invalidate; + CalcFlip; +end; + +procedure TEditForm.FormActivate(Sender: TObject); +begin + if EnableEditorPreview and PrevPnl.Visible then + begin + Splitter2.Height := 1; + Splitter2.Visible := false; + PrevPnl.Height := 1; + PrevPnl.Visible := false; + end + else if (not EnableEditorPreview) and (not PrevPnl.Visible) then + begin + Splitter2.Height := 8; + Splitter2.Visible := true; + PrevPnl.Height := 177; + PrevPnl.Visible := true; + end; + // AV: check if these parameters were changed in options + tbExtendedEdit.Down := ExtEditEnabled; + tbAxisLock.Down := TransformAxisLock; + mnuChaosRebuild.Checked := RebuildXaosLinks; + chkCollapseVariationsClick(nil); +end; + +(* // AV: exactly the same as chkCollapseVariationsClick +procedure TEditForm.txtSearchBoxChange(Sender: TObject); +var + i: integer; + s: string; +begin + s := Trim(txtSearchBox.Text); + for i:= 1 to VEVars.RowCount - 1 do begin + if (Length(s) = 0) then begin + if ((Assigned(cp)) and (VEVars.Cells[1,i]='0')) then + if chkCollapseVariations.Checked then VEVars.RowHeights[i] := -1 + else VEVars.RowHeights[i] := VEVars.DefaultRowHeight + else VEVars.RowHeights[i] := VEVars.DefaultRowHeight; + end else begin + if (Length(s) > Length(VEVars.Cells[0, i])) then + VEVars.RowHeights[i] := -1 + else if Pos(s, VEVars.Cells[0, i]) > 0 then begin + if ((Assigned(cp)) and (VEVars.Cells[1,i]='0')) then + if chkCollapseVariations.Checked then VEVars.RowHeights[i] := -1 + else VEVars.RowHeights[i] := VEVars.DefaultRowHeight + else VEVars.RowHeights[i] := VEVars.DefaultRowHeight; + end else VEVars.RowHeights[i] := -1; + end; + end; +end; +*) + +procedure TEditForm.txtSearchBoxKeyPress(Sender: TObject; var Key: Char); +begin + // AV: exactly the same as chkCollapseVariationsClick + // txtSearchBoxChange(Sender); + chkCollapseVariationsClick(Sender); // AV +end; + +procedure TEditForm.btnResetSearchClick(Sender: TObject); +begin + txtSearchBox.Text := ''; +end; + +procedure TEditForm.btnShowLineClick(Sender: TObject); +begin + ShowFlipLine := not ShowFlipLine; + if ShowFlipLine then btnShowLine.Caption := TextByKey('editor-tab-triangle-hideline') + else btnShowLine.Caption := TextByKey('editor-tab-triangle-showline'); + TriangleView.Invalidate; +end; + +procedure TEditForm.btnVarOrderClick(Sender: TObject); +var + i: integer; +begin + if (VarOrder.ShowModal = mrOK) then + if VarOrder.Changed then + begin + MainForm.UpdateUndo; + for i := 0 to NrVar - 1 do + cp.xform[SelectedTriangle].ifs[i] := VarOrder.VarListView.Items[i].Caption; + + UpdateVariationList; + chkCollapseVariationsClick(Sender); + UpdateFlame(true); + end; +end; + +procedure TEditForm.KeyInput(str:string); +var + Inp: TInput; + mapCh: UINT; + sym: byte; + i: Integer; +begin + Application.ProcessMessages; + for i := 1 to Length(Str) do + begin + { + Inp.Itype := INPUT_KEYBOARD; + Inp.ki.wVk := Ord(Str[i]); + Inp.ki.dwFlags := 0; + SendInput(1, Inp, SizeOf(Inp)); + + Inp.Itype := INPUT_KEYBOARD; + Inp.ki.wVk := Ord(Str[i]); + Inp.ki.dwFlags := KEYEVENTF_KEYUP; + SendInput(1, Inp, SizeOf(Inp)); + } + // AV: hack - to "press" Enter when a numeric field is active + if Str[i] = #13 then + sym := VK_RETURN // for faster work + else + sym := VkKeyScan(Str[i]); + mapCh := MapVirtualKey(LOBYTE(sym), 0); + Inp.Itype := INPUT_KEYBOARD; + Inp.ki.dwFlags := KEYEVENTF_SCANCODE; + Inp.ki.wScan := mapCh; + SendInput(1, Inp, SizeOf(Inp)); + + Inp.Itype := INPUT_KEYBOARD; + Inp.ki.dwFlags := KEYEVENTF_KEYUP; + Inp.ki.wScan := mapCh; + SendInput(1, Inp, SizeOf(Inp)); + end; +end; + +end. + diff --git a/Forms/FormExport.dfm b/Forms/FormExport.dfm new file mode 100644 index 0000000..ced4273 --- /dev/null +++ b/Forms/FormExport.dfm @@ -0,0 +1,713 @@ +object ExportDialog: TExportDialog + Left = 313 + Top = 276 + BorderStyle = bsDialog + Caption = 'Export Flame' + ClientHeight = 403 + ClientWidth = 496 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + OnCreate = FormCreate + OnShow = FormShow + DesignSize = ( + 496 + 403) + PixelsPerInch = 96 + TextHeight = 13 + object btnOK: TButton + Left = 398 + Top = 182 + Width = 89 + Height = 25 + Anchors = [akTop, akRight] + Caption = '&OK' + Default = True + ModalResult = 1 + TabOrder = 0 + OnClick = btnOKClick + end + object btnCancel: TButton + Left = 398 + Top = 210 + Width = 89 + Height = 25 + Anchors = [akTop, akRight] + Caption = 'Cancel' + ModalResult = 2 + TabOrder = 1 + end + object GroupBox1: TGroupBox + Left = 8 + Top = 5 + Width = 481 + Height = 57 + Anchors = [akLeft, akTop, akRight] + Caption = ' Destination ' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 2 + DesignSize = ( + 481 + 57) + object btnBrowse: TSpeedButton + Left = 448 + Top = 19 + Width = 24 + Height = 24 + Hint = 'Browse...' + Anchors = [akTop, akRight] + Flat = True + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + Font.Style = [] + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF75848F66808F + 607987576E7B4E626F4456613948522E3A43252E351B222914191E0E12160E13 + 18FF00FFFF00FFFF00FF77879289A1AB6AB2D4008FCD008FCD008FCD048CC708 + 88BE0F82B4157CA91B779F1F7296224B5C87A2ABFF00FFFF00FF7A8A957EBED3 + 8AA4AE7EDCFF5FCFFF55CBFF4CC4FA41BCF537B3F02EAAEB24A0E5138CD42367 + 805E696DFF00FFFF00FF7D8E9879D2EC8BA4AD89C2CE71D8FF65D3FF5CCEFF51 + C9FE49C1FA3FB9F534B0EE29A8E91085CD224B5B98B2BAFF00FF80919C81D7EF + 7DC5E08CA6B080DDFE68D3FF67D4FF62D1FF58CDFF4EC7FC46BEF73BB6F231AC + EC2569817A95A1FF00FF83959F89DCF18CE2FF8DA8B18CBAC774D8FF67D4FF67 + D4FF67D4FF5FD0FF54CDFF4BC5FC41BBF72EA2DB51677498B2BA869AA392E1F2 + 98E8FD80C4DE8EA7B081DEFD84E0FF84E0FF84E0FF84E0FF81DFFF7BDDFF74D8 + FF6BD6FF56A9D18F9BA4889CA59AE6F39FEBFB98E8FE8BACB98BACB98AAAB788 + A6B386A3AF839FAA819AA67F95A17C919D7A8E99798B957788938BA0A8A0EAF6 + A6EEF99FEBFB98E8FE7ADAFF67D4FF67D4FF67D4FF67D4FF67D4FF67D4FF7788 + 93FF00FFFF00FFFF00FF8EA2ABA7EEF6ABF0F7A6EEF99FEBFB98E8FD71D4FB89 + 9EA78699A382949F7E909A7A8C97778893FF00FFFF00FFFF00FF8FA4ACA0D2DA + ABF0F7ABF0F7A6EEF99FEBFB8DA1AAB5CBD0FF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFBDCED48FA4AC8FA4AC8FA4AC8FA4AC8FA4ACB5CBD0FF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF} + ParentFont = False + ParentShowHint = False + ShowHint = True + OnClick = btnBrowseClick + end + object Label10: TPanel + Left = 8 + Top = 20 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'File name' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 1 + end + object txtFilename: TEdit + Left = 112 + Top = 20 + Width = 337 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 0 + end + end + object GroupBox3: TGroupBox + Left = 256 + Top = 66 + Width = 233 + Height = 105 + Anchors = [akTop, akRight] + Caption = ' Quality ' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 3 + DesignSize = ( + 233 + 105) + object udOversample: TUpDown + Left = 212 + Top = 68 + Width = 12 + Height = 21 + Anchors = [akTop, akRight] + Associate = txtOversample + Min = 1 + Max = 4 + Position = 2 + TabOrder = 3 + end + object Label4: TPanel + Left = 8 + Top = 20 + Width = 113 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Density' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 4 + end + object txtDensity: TEdit + Left = 120 + Top = 20 + Width = 105 + Height = 21 + Anchors = [akLeft, akTop, akRight] + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 0 + OnChange = txtDensityChange + end + object Label5: TPanel + Left = 8 + Top = 44 + Width = 113 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Filter radius' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 5 + end + object txtFilterRadius: TEdit + Left = 120 + Top = 44 + Width = 105 + Height = 21 + Anchors = [akLeft, akTop, akRight] + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 1 + OnChange = txtFilterRadiusChange + end + object Label3: TPanel + Left = 8 + Top = 68 + Width = 113 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Oversample' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 6 + end + object txtOversample: TEdit + Left = 120 + Top = 68 + Width = 92 + Height = 21 + Anchors = [akLeft, akTop, akRight] + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + ReadOnly = True + TabOrder = 2 + Text = '2' + OnChange = txtOversampleChange + end + end + object GroupBox2: TGroupBox + Left = 8 + Top = 66 + Width = 241 + Height = 105 + Anchors = [akLeft, akTop, akRight] + Caption = ' Size ' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 4 + DesignSize = ( + 241 + 105) + object chkMaintain: TCheckBox + Left = 8 + Top = 76 + Width = 225 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = 'Maintain aspect ratio' + Checked = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + State = cbChecked + TabOrder = 0 + OnClick = chkMaintainClick + end + object Label1: TPanel + Left = 8 + Top = 20 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Width' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 3 + end + object Label2: TPanel + Left = 8 + Top = 44 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Height' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 4 + end + object cbHeight: TComboBox + Left = 112 + Top = 44 + Width = 121 + Height = 21 + Anchors = [akLeft, akTop, akRight] + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 2 + OnChange = txtHeightChange + Items.Strings = ( + '200' + '240' + '480' + '600' + '768' + '1024' + '1200' + '2048' + '2400') + end + object cbWidth: TComboBox + Left = 112 + Top = 20 + Width = 121 + Height = 21 + Anchors = [akLeft, akTop, akRight] + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 1 + OnChange = txtWidthChange + Items.Strings = ( + '320' + '640' + '800' + '1024' + '1280' + '1600' + '1920' + '2048' + '2560' + '3200') + end + end + object GroupBox4: TGroupBox + Left = 8 + Top = 176 + Width = 377 + Height = 113 + Anchors = [akLeft, akTop, akRight] + Caption = ' Parameters ' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 5 + DesignSize = ( + 377 + 113) + object udStrips: TUpDown + Left = 172 + Top = 52 + Width = 12 + Height = 21 + Associate = txtStrips + Min = 1 + Max = 512 + Position = 1 + TabOrder = 2 + end + object Label7: TPanel + Left = 8 + Top = 20 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Buffer depth' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 7 + end + object Label8: TPanel + Left = 8 + Top = 52 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Strips' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 8 + end + object Label9: TPanel + Left = 192 + Top = 20 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'DE Radius' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 9 + end + object txtEstimator: TEdit + Left = 296 + Top = 20 + Width = 73 + Height = 21 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 3 + Text = '5' + OnChange = txtEstimatorChange + end + object txtStrips: TEdit + Left = 112 + Top = 52 + Width = 60 + Height = 21 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 1 + Text = '1' + end + object cmbDepth: TComboBox + Left = 112 + Top = 20 + Width = 73 + Height = 21 + Style = csDropDownList + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ItemIndex = 2 + ParentFont = False + TabOrder = 0 + Text = '32-bit float' + Items.Strings = ( + '16-bit' + '32-bit' + '32-bit float' + '64-bit') + end + object Label14: TPanel + Left = 8 + Top = 84 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Gamma threshold' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 10 + end + object Label12: TPanel + Left = 192 + Top = 52 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'DE Curve' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 11 + end + object Label11: TPanel + Left = 192 + Top = 84 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'DE Minimum' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 12 + end + object txtGammaTreshold: TEdit + Left = 112 + Top = 84 + Width = 73 + Height = 21 + Anchors = [akLeft, akTop, akRight] + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 6 + Text = '0.01' + OnChange = txtGammaTresholdChange + end + object txtEstimatorCurve: TEdit + Left = 296 + Top = 52 + Width = 73 + Height = 21 + Anchors = [akLeft, akTop, akRight] + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 5 + Text = '0.6' + OnChange = txtEstimatorCurveChange + end + object txtEstimatorMin: TEdit + Left = 296 + Top = 84 + Width = 73 + Height = 21 + Anchors = [akLeft, akTop, akRight] + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 4 + Text = '0' + OnChange = txtEstimatorMinChange + end + end + object chkRender: TCheckBox + Left = 400 + Top = 246 + Width = 89 + Height = 43 + Anchors = [akTop, akRight] + Caption = 'Render' + Checked = True + State = cbChecked + TabOrder = 6 + end + object Panel1: TPanel + Left = 8 + Top = 296 + Width = 481 + Height = 105 + Anchors = [akLeft, akTop, akRight] + BevelKind = bkSoft + BevelOuter = bvNone + Color = clInfoBk + TabOrder = 7 + OnResize = Panel1Resize + DesignSize = ( + 477 + 101) + object Label6: TLabel + Left = 8 + Top = 2 + Width = 453 + Height = 24 + Alignment = taCenter + Anchors = [akLeft, akTop, akRight] + AutoSize = False + Caption = 'WARNING!' + Font.Charset = DEFAULT_CHARSET + Font.Color = clInfoText + Font.Height = -19 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object Label15: TLabel + Left = 8 + Top = 25 + Width = 465 + Height = 54 + Alignment = taCenter + Anchors = [akLeft, akRight] + AutoSize = False + Caption = + 'Fractals created with this version of Apophysis are not supporte' + + 'd by the external renderer! To render 2D-only fractals, download' + + ' the latest version of FLAM3 from' + Color = clInfoBk + Font.Charset = DEFAULT_CHARSET + Font.Color = clInfoText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentColor = False + ParentFont = False + WordWrap = True + end + object lblFlam3Link: TLabel + Left = 180 + Top = 80 + Width = 111 + Height = 13 + Cursor = crHandPoint + Hint = 'https://code.google.com/archive/p/flam3/downloads' + Caption = 'http://www.flam3.com/' + Color = clBlue + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsUnderline] + ParentColor = False + ParentFont = False + OnClick = lblFlam3LinkClick + end + end + object SaveDialog: TSaveDialog + DefaultExt = 'jpg' + Filter = + 'JPEG Image (*.jpg)|*.jpg|PPM Image (*.ppm)|*.ppm|PNG Images (*.p' + + 'ng)|*.png' + Left = 464 + Top = 264 + end +end diff --git a/Forms/FormExport.pas b/Forms/FormExport.pas new file mode 100644 index 0000000..4b3d023 --- /dev/null +++ b/Forms/FormExport.pas @@ -0,0 +1,302 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} +unit FormExport; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, Buttons, ComCtrls, ExtCtrls, Translation; + +type + TExportDialog = class(TForm) + btnOK: TButton; + btnCancel: TButton; + GroupBox1: TGroupBox; + btnBrowse: TSpeedButton; + txtFilename: TEdit; + SaveDialog: TSaveDialog; + GroupBox3: TGroupBox; + txtOversample: TEdit; + txtFilterRadius: TEdit; + txtDensity: TEdit; + udOversample: TUpDown; + GroupBox2: TGroupBox; + chkMaintain: TCheckBox; + cbWidth: TComboBox; + cbHeight: TComboBox; + GroupBox4: TGroupBox; + cmbDepth: TComboBox; + chkRender: TCheckBox; + txtStrips: TEdit; + udStrips: TUpDown; + txtEstimator: TEdit; + txtEstimatorMin: TEdit; + txtEstimatorCurve: TEdit; + txtGammaTreshold: TEdit; + Panel1: TPanel; + Label6: TLabel; + Label15: TLabel; + Label4: TPanel; + Label5: TPanel; + Label3: TPanel; + Label1: TPanel; + Label2: TPanel; + Label7: TPanel; + Label8: TPanel; + Label9: TPanel; + Label14: TPanel; + Label12: TPanel; + Label11: TPanel; + Label10: TPanel; + lblFlam3Link: TLabel; + procedure Panel1Resize(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure btnBrowseClick(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure btnOKClick(Sender: TObject); + procedure txtWidthChange(Sender: TObject); + procedure chkMaintainClick(Sender: TObject); + procedure txtHeightChange(Sender: TObject); + procedure txtDensityChange(Sender: TObject); + procedure txtFilterRadiusChange(Sender: TObject); + procedure txtOversampleChange(Sender: TObject); + procedure txtEstimatorChange(Sender: TObject); + procedure txtEstimatorMinChange(Sender: TObject); + procedure txtEstimatorCurveChange(Sender: TObject); + procedure txtGammaTresholdChange(Sender: TObject); + procedure lblFlam3LinkClick(Sender: TObject); + private + FloatFormatSettings: TFormatSettings; + public + Filename: string; + ImageWidth, ImageHeight, Oversample, Batches, Strips: Integer; + Sample_Density, Filter_Radius: double; + Estimator, EstimatorMin, EstimatorCurve: double; + GammaTreshold: double; + Jitters: integer; + end; + +var + ExportDialog: TExportDialog; + Ratio: double; + +implementation +uses Global, Main, ShellAPI; + +{$R *.DFM} + +procedure TExportDialog.btnBrowseClick(Sender: TObject); +begin + SaveDialog.InitialDir := ExtractFileDir(txtFilename.text); + SaveDialog.Filename := txtFilename.Text; + case ExportFileFormat of + 0: SaveDialog.DefaultExt := 'jpg'; + 1: SaveDialog.DefaultExt := 'ppm'; + end; + SaveDialog.filterIndex := ExportFileFormat; + SaveDialog.Filter := Format('Portable Pixmap (*.ppm)|*.ppm|%s|*.jpg;*.jpeg|%s|*.png|%s|*.*', + [TextByKey('common-filter-jpeg'), TextByKey('common-filter-png'), + TextByKey('common-filter-allfiles')]); + if SaveDialog.Execute then + begin + case SaveDialog.FilterIndex of + 1: txtFilename.Text := ChangeFileExt(SaveDialog.Filename, '.jpg'); + 2: txtFilename.Text := ChangeFileExt(SaveDialog.Filename, '.ppm'); + 3: txtFilename.Text := ChangeFileExt(SaveDialog.Filename, '.png'); + end; + ExportFileFormat := SaveDialog.FilterIndex; + renderPath := ExtractFilePath(SaveDialog.Filename); + end; + +end; + +procedure TExportDialog.FormShow(Sender: TObject); +begin + txtFilename.Text := Filename; + cbWidth.Text := IntToStr(MainCp.Width); + cbHeight.Text := IntToStr(MainCp.Height); + ImageWidth := MainCp.Width; + ImageHeight := MainCp.Height; + txtDensity.text := FloatToStr(Sample_density); + txtFilterRadius.text := FloatToStr(Filter_Radius); + txtOversample.text := IntToSTr(Oversample); + udOversample.Position := Oversample; + Ratio := ImageWidth / ImageHeight; + Batches := 1; + Estimator := 9.0; + EstimatorMin := 0.0; + EstimatorCurve := 0.4; + Jitters := 1; + GammaTreshold := MainCP.gamma_threshold; //0.01; + GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, FloatFormatSettings); + txtEstimator.Text := FloatToStr(Estimator, FloatFormatSettings); + txtEstimatorMin.Text := FloatToStr(EstimatorMin, FloatFormatSettings); + txtEstimatorCurve.Text := FloatToStr(EstimatorCurve, FloatFormatSettings); + txtGammaTreshold.Text := FloatToStr(GammaTreshold, FloatFormatSettings); +end; + +procedure TExportDialog.btnOKClick(Sender: TObject); +begin + Filename := txtFilename.text; + ImageWidth := StrToInt(cbWidth.Text); + ImageHeight := StrToInt(cbHeight.Text); +end; + +procedure TExportDialog.txtWidthChange(Sender: TObject); +begin + try + ImageWidth := StrToInt(cbWidth.Text); + if chkMaintain.checked and cbWidth.Focused then + begin + ImageHeight := Round(ImageWidth / ratio); + cbHeight.Text := IntToStr(ImageHeight) + end; + except + end; +end; + +procedure TExportDialog.chkMaintainClick(Sender: TObject); +begin + Ratio := ImageWidth / ImageHeight; +end; + +procedure TExportDialog.txtHeightChange(Sender: TObject); +begin + try + ImageHeight := StrToInt(cbHeight.Text); + if chkMaintain.checked and cbHeight.Focused then + begin + ImageWidth := Round(ImageHeight * ratio); + cbWidth.Text := IntToStr(ImageWidth) + end; + except + end; +end; + +procedure TExportDialog.txtDensityChange(Sender: TObject); +begin + try + Sample_Density := StrToFloat(txtDensity.Text); + except + end; +end; + +procedure TExportDialog.txtFilterRadiusChange(Sender: TObject); +begin + try + Filter_Radius := StrToFloat(txtFilterRadius.Text); + except + end; +end; + +procedure TExportDialog.txtOversampleChange(Sender: TObject); +begin + if StrToInt(txtOversample.Text) > udOversample.Max then + txtOversample.Text := IntToStr(udOversample.Max); + if StrToInt(txtOversample.Text) < udOversample.Min then + txtOversample.Text := IntToStr(udOversample.Min); + try + Oversample := StrToInt(txtOversample.Text); + except + end; +end; + +procedure TExportDialog.txtEstimatorChange(Sender: TObject); +begin + Estimator := 0; + try + Estimator := StrToFloat(txtEstimator.Text, FloatFormatSettings); + except + end; +end; + +procedure TExportDialog.txtEstimatorMinChange(Sender: TObject); +begin + EstimatorMin := 0; + try + EstimatorMin := StrToFloat(txtEstimatorMin.Text, FloatFormatSettings); + except + end; +end; + +procedure TExportDialog.txtEstimatorCurveChange(Sender: TObject); +begin + EstimatorCurve := 0; + try + EstimatorCurve := StrToFloat(txtEstimatorCurve.Text, FloatFormatSettings); + except + end; +end; + +procedure TExportDialog.txtGammaTresholdChange(Sender: TObject); +begin + //GammaTreshold := 0.01; + try + GammaTreshold := StrToFloat(txtGammaTreshold.Text, FloatFormatSettings); + except + end; +end; + +procedure TExportDialog.lblFlam3LinkClick(Sender: TObject); +begin + ShellExecute(ValidParentForm(Self).Handle, 'open', PChar(TLabel(Sender).Hint), + nil, nil, SW_SHOWNORMAL); +end; + +procedure TExportDialog.FormCreate(Sender: TObject); +begin + btnOK.Caption := TextByKey('common-ok'); + btnCancel.Caption := TextByKey('common-cancel'); + Label1.Caption := TextByKey('common-width'); + Label2.Caption := TextByKey('common-height'); + GroupBox2.Caption := TextByKey('common-size'); + chkMaintain.Caption := TextByKey('common-keepaspect'); + GroupBox1.Caption := TextByKey('common-destination'); + Label10.Caption := TextByKey('common-filename'); + btnBrowse.Hint := TextByKey('common-browse'); + GroupBox3.Caption := TextByKey('common-quality'); + Label5.Caption := TextByKey('common-filterradius'); + Label4.Caption := TextByKey('common-density'); + Label3.Caption := TextByKey('common-oversample'); + Label14.Caption := TextByKey('common-gammathreshold'); + self.Caption := TextByKey('main-menu-file-exportflame'); + GroupBox4.Caption := TextByKey('export-paramoptions-title'); + Label7.Caption := TextByKey('export-paramoptions-bufferdepth'); + Label8.Caption := TextByKey('export-paramoptions-strips'); + Label9.Caption := TextByKey('export-paramoptions-estimatorradius'); + Label12.Caption := TextByKey('export-paramoptions-estimatorcurve'); + Label11.Caption := TextByKey('export-paramoptions-estimatormin'); + chkRender.Caption := TextByKey('export-paramoptions-dorender'); + Label6.Caption := TextByKey('export-paramoptions-warningtitle'); + Label15.Caption := TextByKey('export-paramoptions-warningtext'); +end; + +procedure TExportDialog.Panel1Resize(Sender: TObject); +begin + Label15.Top := (Panel1.Height - 30) div 2 - Label15.Height div 2 + 25; +end; + +end. + diff --git a/Forms/FormExportC.dfm b/Forms/FormExportC.dfm new file mode 100644 index 0000000..929f1a4 --- /dev/null +++ b/Forms/FormExportC.dfm @@ -0,0 +1,553 @@ +object ExportCDialog: TExportCDialog + Left = 313 + Top = 276 + BorderStyle = bsDialog + Caption = 'Export Flame' + ClientHeight = 134 + ClientWidth = 496 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + OnCreate = FormCreate + OnShow = FormShow + DesignSize = ( + 496 + 134) + PixelsPerInch = 96 + TextHeight = 13 + object btnOK: TButton + Left = 254 + Top = 98 + Width = 115 + Height = 25 + Anchors = [akTop, akRight] + Caption = '&OK' + Default = True + ModalResult = 1 + TabOrder = 0 + OnClick = btnOKClick + end + object btnCancel: TButton + Left = 376 + Top = 98 + Width = 111 + Height = 25 + Anchors = [akTop, akRight] + Caption = 'Cancel' + ModalResult = 2 + TabOrder = 1 + end + object GroupBox1: TGroupBox + Left = 8 + Top = 237 + Width = 481 + Height = 57 + Anchors = [akLeft, akTop, akRight] + Caption = ' Destination ' + TabOrder = 2 + Visible = False + DesignSize = ( + 481 + 57) + object btnBrowse: TSpeedButton + Left = 448 + Top = 19 + Width = 24 + Height = 24 + Hint = 'Browse...' + Anchors = [akTop, akRight] + Flat = True + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + Font.Style = [fsBold] + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF75848F66808F + 607987576E7B4E626F4456613948522E3A43252E351B222914191E0E12160E13 + 18FF00FFFF00FFFF00FF77879289A1AB6AB2D4008FCD008FCD008FCD048CC708 + 88BE0F82B4157CA91B779F1F7296224B5C87A2ABFF00FFFF00FF7A8A957EBED3 + 8AA4AE7EDCFF5FCFFF55CBFF4CC4FA41BCF537B3F02EAAEB24A0E5138CD42367 + 805E696DFF00FFFF00FF7D8E9879D2EC8BA4AD89C2CE71D8FF65D3FF5CCEFF51 + C9FE49C1FA3FB9F534B0EE29A8E91085CD224B5B98B2BAFF00FF80919C81D7EF + 7DC5E08CA6B080DDFE68D3FF67D4FF62D1FF58CDFF4EC7FC46BEF73BB6F231AC + EC2569817A95A1FF00FF83959F89DCF18CE2FF8DA8B18CBAC774D8FF67D4FF67 + D4FF67D4FF5FD0FF54CDFF4BC5FC41BBF72EA2DB51677498B2BA869AA392E1F2 + 98E8FD80C4DE8EA7B081DEFD84E0FF84E0FF84E0FF84E0FF81DFFF7BDDFF74D8 + FF6BD6FF56A9D18F9BA4889CA59AE6F39FEBFB98E8FE8BACB98BACB98AAAB788 + A6B386A3AF839FAA819AA67F95A17C919D7A8E99798B957788938BA0A8A0EAF6 + A6EEF99FEBFB98E8FE7ADAFF67D4FF67D4FF67D4FF67D4FF67D4FF67D4FF7788 + 93FF00FFFF00FFFF00FF8EA2ABA7EEF6ABF0F7A6EEF99FEBFB98E8FD71D4FB89 + 9EA78699A382949F7E909A7A8C97778893FF00FFFF00FFFF00FF8FA4ACA0D2DA + ABF0F7ABF0F7A6EEF99FEBFB8DA1AAB5CBD0FF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFBDCED48FA4AC8FA4AC8FA4AC8FA4AC8FA4ACB5CBD0FF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF} + ParentFont = False + ParentShowHint = False + ShowHint = True + OnClick = btnBrowseClick + end + object Label10: TPanel + Left = 8 + Top = 20 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'File name' + ParentShowHint = False + ShowHint = True + TabOrder = 1 + end + object txtFilename: TEdit + Left = 112 + Top = 20 + Width = 337 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 0 + end + end + object GroupBox3: TGroupBox + Left = 256 + Top = 10 + Width = 233 + Height = 79 + Anchors = [akTop, akRight] + Caption = ' Quality ' + TabOrder = 3 + DesignSize = ( + 233 + 79) + object udOversample: TUpDown + Left = 212 + Top = 44 + Width = 12 + Height = 21 + Anchors = [akTop, akRight] + Associate = txtOversample + Min = 1 + Max = 4 + Position = 2 + TabOrder = 2 + end + object Label5: TPanel + Left = 8 + Top = 20 + Width = 113 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Filter radius' + ParentShowHint = False + ShowHint = True + TabOrder = 3 + end + object txtFilterRadius: TEdit + Left = 120 + Top = 20 + Width = 105 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 0 + OnChange = txtFilterRadiusChange + end + object Label3: TPanel + Left = 8 + Top = 44 + Width = 113 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Oversample' + ParentShowHint = False + ShowHint = True + TabOrder = 4 + end + object txtOversample: TEdit + Left = 120 + Top = 44 + Width = 92 + Height = 21 + Anchors = [akLeft, akTop, akRight] + ReadOnly = True + TabOrder = 1 + Text = '2' + OnChange = txtOversampleChange + end + end + object GroupBox2: TGroupBox + Left = 8 + Top = 10 + Width = 241 + Height = 111 + Anchors = [akLeft, akTop, akRight] + Caption = ' Size ' + TabOrder = 4 + DesignSize = ( + 241 + 111) + object Label13: TLabel + Left = 184 + Top = 36 + Width = 26 + Height = 13 + Anchors = [akLeft, akTop, akRight] + Caption = 'pixels' + Visible = False + end + object Label16: TLabel + Left = 168 + Top = 22 + Width = 15 + Height = 36 + Anchors = [akLeft, akTop, akRight] + Caption = '}' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -32 + Font.Name = 'Times New Roman' + Font.Style = [] + ParentFont = False + Visible = False + end + object chkMaintain: TCheckBox + Left = 8 + Top = 76 + Width = 225 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = 'Maintain aspect ratio' + Checked = True + State = cbChecked + TabOrder = 0 + OnClick = chkMaintainClick + end + object Label1: TPanel + Left = 8 + Top = 20 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Width' + ParentShowHint = False + ShowHint = True + TabOrder = 3 + end + object Label2: TPanel + Left = 8 + Top = 44 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Height' + ParentShowHint = False + ShowHint = True + TabOrder = 4 + end + object cbHeight: TComboBox + Left = 112 + Top = 44 + Width = 121 + Height = 21 + Anchors = [akLeft, akTop, akRight] + ItemHeight = 13 + TabOrder = 2 + OnChange = txtHeightChange + Items.Strings = ( + '200' + '240' + '480' + '600' + '768' + '1024' + '1200' + '2048' + '2400') + end + object cbWidth: TComboBox + Left = 112 + Top = 20 + Width = 121 + Height = 21 + Anchors = [akLeft, akTop, akRight] + ItemHeight = 13 + TabOrder = 1 + OnChange = txtWidthChange + Items.Strings = ( + '320' + '640' + '800' + '1024' + '1280' + '1600' + '1920' + '2048' + '2560' + '3200') + end + end + object GroupBox4: TGroupBox + Left = 8 + Top = 392 + Width = 377 + Height = 113 + Anchors = [akLeft, akTop, akRight] + Caption = ' Parameters ' + TabOrder = 5 + Visible = False + DesignSize = ( + 377 + 113) + object udStrips: TUpDown + Left = 172 + Top = 52 + Width = 12 + Height = 21 + Associate = txtStrips + Min = 1 + Max = 512 + Position = 1 + TabOrder = 2 + end + object Label7: TPanel + Left = 8 + Top = 20 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Buffer depth' + ParentShowHint = False + ShowHint = True + TabOrder = 7 + end + object Label8: TPanel + Left = 8 + Top = 52 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Strips' + ParentShowHint = False + ShowHint = True + TabOrder = 8 + end + object Label9: TPanel + Left = 8 + Top = 84 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'DE Radius' + ParentShowHint = False + ShowHint = True + TabOrder = 9 + end + object txtEstimator: TEdit + Left = 112 + Top = 84 + Width = 73 + Height = 21 + TabOrder = 3 + Text = '5' + end + object txtStrips: TEdit + Left = 112 + Top = 52 + Width = 60 + Height = 21 + TabOrder = 1 + Text = '1' + end + object cmbDepth: TComboBox + Left = 112 + Top = 20 + Width = 73 + Height = 21 + Style = csDropDownList + ItemHeight = 13 + TabOrder = 0 + Items.Strings = ( + '16-bit' + '32-bit' + '32-bit float' + '64-bit') + end + object Label14: TPanel + Left = 192 + Top = 20 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Gamma threshold' + ParentShowHint = False + ShowHint = True + TabOrder = 10 + end + object Label12: TPanel + Left = 192 + Top = 52 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'DE Curve' + ParentShowHint = False + ShowHint = True + TabOrder = 11 + end + object Label11: TPanel + Left = 192 + Top = 84 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'DE Minimum' + ParentShowHint = False + ShowHint = True + TabOrder = 12 + end + object txtGammaTreshold: TEdit + Left = 296 + Top = 20 + Width = 73 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 6 + Text = '0.01' + OnChange = txtGammaTresholdChange + end + object txtEstimatorCurve: TEdit + Left = 296 + Top = 52 + Width = 73 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 5 + Text = '0.6' + end + object txtEstimatorMin: TEdit + Left = 296 + Top = 84 + Width = 73 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 4 + Text = '0' + end + end + object chkRender: TCheckBox + Left = 392 + Top = 398 + Width = 89 + Height = 43 + Anchors = [akTop, akRight] + Caption = 'Render' + Checked = True + State = cbChecked + TabOrder = 6 + Visible = False + end + object Panel1: TPanel + Left = 8 + Top = 296 + Width = 481 + Height = 89 + Anchors = [akLeft, akTop, akRight] + BevelKind = bkSoft + BevelOuter = bvNone + Color = clInfoBk + TabOrder = 7 + Visible = False + DesignSize = ( + 477 + 85) + object Label6: TLabel + Left = 8 + Top = 4 + Width = 453 + Height = 24 + Alignment = taCenter + Anchors = [akLeft, akTop, akRight] + AutoSize = False + Caption = 'WARNING!' + Font.Charset = DEFAULT_CHARSET + Font.Color = clInfoText + Font.Height = -19 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object Label15: TLabel + Left = 8 + Top = 25 + Width = 447 + Height = 26 + Alignment = taCenter + Anchors = [akLeft, akRight] + Caption = + 'Fractals created with this version of Apophysis are not supporte' + + 'd by the external renderer! To render 2D-only fractals, download' + + ' the latest version of FLAM3 from http://www.flam3.com' + Color = clInfoBk + Font.Charset = DEFAULT_CHARSET + Font.Color = clInfoText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentColor = False + ParentFont = False + WordWrap = True + end + end + object txtDensity: TEdit + Left = 120 + Top = 212 + Width = 105 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 8 + Visible = False + OnChange = txtDensityChange + end + object Label4: TPanel + Left = 8 + Top = 212 + Width = 113 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Density' + ParentShowHint = False + ShowHint = True + TabOrder = 9 + Visible = False + end + object SaveDialog: TSaveDialog + DefaultExt = 'jpg' + Filter = + 'JPEG Image (*.jpg)|*.jpg|PPM Image (*.ppm)|*.ppm|PNG Images (*.p' + + 'ng)|*.png' + Left = 464 + Top = 264 + end +end diff --git a/Forms/FormExportC.pas b/Forms/FormExportC.pas new file mode 100644 index 0000000..7902f18 --- /dev/null +++ b/Forms/FormExportC.pas @@ -0,0 +1,257 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} +unit FormExportC; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, Buttons, ComCtrls, ExtCtrls, Translation; + +type + TExportCDialog = class(TForm) + btnOK: TButton; + btnCancel: TButton; + GroupBox1: TGroupBox; + btnBrowse: TSpeedButton; + txtFilename: TEdit; + SaveDialog: TSaveDialog; + GroupBox3: TGroupBox; + txtOversample: TEdit; + txtFilterRadius: TEdit; + udOversample: TUpDown; + GroupBox2: TGroupBox; + chkMaintain: TCheckBox; + cbWidth: TComboBox; + cbHeight: TComboBox; + GroupBox4: TGroupBox; + cmbDepth: TComboBox; + chkRender: TCheckBox; + txtStrips: TEdit; + udStrips: TUpDown; + txtEstimator: TEdit; + txtEstimatorMin: TEdit; + txtEstimatorCurve: TEdit; + txtGammaTreshold: TEdit; + Panel1: TPanel; + Label6: TLabel; + Label15: TLabel; + Label13: TLabel; + Label16: TLabel; + Label5: TPanel; + Label3: TPanel; + Label1: TPanel; + Label2: TPanel; + Label7: TPanel; + Label8: TPanel; + Label9: TPanel; + Label14: TPanel; + Label12: TPanel; + Label11: TPanel; + Label10: TPanel; + txtDensity: TEdit; + Label4: TPanel; + procedure FormCreate(Sender: TObject); + procedure btnBrowseClick(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure btnOKClick(Sender: TObject); + procedure txtWidthChange(Sender: TObject); + procedure chkMaintainClick(Sender: TObject); + procedure txtHeightChange(Sender: TObject); + procedure txtDensityChange(Sender: TObject); + procedure txtFilterRadiusChange(Sender: TObject); + procedure txtOversampleChange(Sender: TObject); + procedure txtGammaTresholdChange(Sender: TObject); + private + FloatFormatSettings: TFormatSettings; + Estimator, EstimatorMin, EstimatorCurve: double; + Jitters, Batches, Strips: integer; + public + Filename: string; + ImageWidth, ImageHeight, Oversample: Integer; + Sample_Density, Filter_Radius: double; + GammaTreshold: double; + end; + +var + ExportCDialog: TExportCDialog; + Ratio: double; + +implementation +uses Global, Main, ShellAPI; + +{$R *.DFM} + +procedure TExportCDialog.btnBrowseClick(Sender: TObject); +begin + SaveDialog.InitialDir := ExtractFileDir(txtFilename.text); + SaveDialog.Filename := txtFilename.Text; + SaveDialog.DefaultExt := 'png'; + SaveDialog.filterIndex := ExportFileFormat; + SaveDialog.Filter := Format('%s|*.png|%s|*.*', + [TextByKey('common-filter-png'), + TextByKey('common-filter-allfiles')]); + if SaveDialog.Execute then + begin + ExportFileFormat := SaveDialog.FilterIndex; + renderPath := ExtractFilePath(SaveDialog.Filename); + end; + +end; + +procedure TExportCDialog.FormShow(Sender: TObject); +begin + txtFilename.Text := Filename; + cbWidth.Text := IntToStr(MainCp.Width); + cbHeight.Text := IntToStr(MainCp.Height); + ImageWidth := MainCp.Width; + ImageHeight := MainCp.Height; + txtDensity.text := FloatToStr(Sample_density); +// if cmbDepth.ItemIndex <> 2 then +// txtBatches.text := IntToStr(Round(Sample_density / 4)); + txtFilterRadius.text := FloatToStr(Filter_Radius); + txtOversample.text := IntToSTr(Oversample); + udOversample.Position := Oversample; + Ratio := ImageWidth / ImageHeight; + Batches := 1; + Estimator := 9.0; + EstimatorMin := 0.0; + EstimatorCurve := 0.4; + Jitters := 1; + GammaTreshold := MainCP.gamma_threshold; //0.01; + GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, FloatFormatSettings); + txtEstimator.Text := FloatToStr(Estimator, FloatFormatSettings); + txtEstimatorMin.Text := FloatToStr(EstimatorMin, FloatFormatSettings); + txtEstimatorCurve.Text := FloatToStr(EstimatorCurve, FloatFormatSettings); +// txtJitters.Text := IntToStr(Jitters); + txtGammaTreshold.Text := FloatToStr(GammaTreshold, FloatFormatSettings); +end; + +procedure TExportCDialog.btnOKClick(Sender: TObject); +begin + Filename := txtFilename.text; + ImageWidth := StrToInt(cbWidth.Text); + ImageHeight := StrToInt(cbHeight.Text); +end; + +procedure TExportCDialog.txtWidthChange(Sender: TObject); +begin + try + ImageWidth := StrToInt(cbWidth.Text); + if chkMaintain.checked and cbWidth.Focused then + begin + ImageHeight := Round(ImageWidth / ratio); + cbHeight.Text := IntToStr(ImageHeight) + end; + except + end; +end; + +procedure TExportCDialog.chkMaintainClick(Sender: TObject); +begin + Ratio := ImageWidth / ImageHeight; +end; + +procedure TExportCDialog.txtHeightChange(Sender: TObject); +begin + try + ImageHeight := StrToInt(cbHeight.Text); + if chkMaintain.checked and cbHeight.Focused then + begin + ImageWidth := Round(ImageHeight * ratio); + cbWidth.Text := IntToStr(ImageWidth) + end; + except + end; +end; + +procedure TExportCDialog.txtDensityChange(Sender: TObject); +begin + try + Sample_Density := StrToFloat(txtDensity.Text); +// if cmbDepth.ItemIndex <> 2 then +// txtBatches.text := IntToStr(Round(Sample_density / 4)); + except + end; +end; + +procedure TExportCDialog.txtFilterRadiusChange(Sender: TObject); +begin + try + Filter_Radius := StrToFloat(txtFilterRadius.Text); + except + end; +end; + +procedure TExportCDialog.txtOversampleChange(Sender: TObject); +begin + if StrToInt(txtOversample.Text) > udOversample.Max then + txtOversample.Text := IntToStr(udOversample.Max); + if StrToInt(txtOversample.Text) < udOversample.Min then + txtOversample.Text := IntToStr(udOversample.Min); + try + Oversample := StrToInt(txtOversample.Text); + except + end; +end; + +procedure TExportCDialog.txtGammaTresholdChange(Sender: TObject); +begin + //GammaTreshold := 0.01; + try + GammaTreshold := StrToFloat(txtGammaTreshold.Text, FloatFormatSettings); + except + end; +end; + +procedure TExportCDialog.FormCreate(Sender: TObject); +begin + btnOK.Caption := TextByKey('common-ok'); + btnCancel.Caption := TextByKey('common-cancel'); + Label1.Caption := TextByKey('common-width'); + Label2.Caption := TextByKey('common-height'); + GroupBox2.Caption := TextByKey('common-size'); + Label13.Caption := TextByKey('common-pixels'); + chkMaintain.Caption := TextByKey('common-keepaspect'); + GroupBox1.Caption := TextByKey('common-destination'); + Label10.Caption := TextByKey('common-filename'); + btnBrowse.Hint := TextByKey('common-browse'); + GroupBox3.Caption := TextByKey('common-quality'); + Label5.Caption := TextByKey('common-filterradius'); + Label4.Caption := TextByKey('common-density'); + Label3.Caption := TextByKey('common-oversample'); + Label14.Caption := TextByKey('common-gammathreshold'); + self.Caption := TextByKey('main-menu-file-exportchaotica'); + GroupBox4.Caption := TextByKey('export-paramoptions-title'); + Label7.Caption := TextByKey('export-paramoptions-bufferdepth'); + Label8.Caption := TextByKey('export-paramoptions-strips'); + Label9.Caption := TextByKey('export-paramoptions-estimatorradius'); + Label12.Caption := TextByKey('export-paramoptions-estimatorcurve'); + Label11.Caption := TextByKey('export-paramoptions-estimatormin'); + chkRender.Caption := TextByKey('export-paramoptions-dorender'); + Label6.Caption := TextByKey('export-paramoptions-warningtitle'); + Label15.Caption := TextByKey('export-paramoptions-warningtext'); +end; + +end. + diff --git a/Forms/FormFavorites.dfm b/Forms/FormFavorites.dfm new file mode 100644 index 0000000..e4d4475 --- /dev/null +++ b/Forms/FormFavorites.dfm @@ -0,0 +1,338 @@ +object FavoritesForm: TFavoritesForm + Left = 493 + Top = 541 + BorderIcons = [biSystemMenu] + BorderStyle = bsSingle + Caption = 'Favorite Scripts' + ClientHeight = 275 + ClientWidth = 352 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Icon.Data = { + 0000010001001010200000000000680400001600000028000000100000002000 + 0000010020000000000000040000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000D3D8ED00EFEFF800577FD1006988DA00EFEFFA00D3D9F600F8F9FE000000 + 0000000000000000000000000000000000000000000000000000BABADD009497 + CB005B88CB007682CA004583D2005682DB00607ED700297DE100D1D8F6000000 + 000000000000000000000000000000000000F9F9FC008080C2003737C600211D + B3003C5DB40065A7E0004497DF00419CE50032AFE800597FDF00EFEFFC000000 + 0000000000000000000000000000E9E9F3006161B300302FD2002D2EE2004E65 + D700415CB8005CA8E00084F8FF0066F9FF0032A3E8004880DF007295EA000000 + 00000000000000000000D0D0E5004949AF003232DE001C1BE5000001BF00557D + CC006F9BE00061AFE80090FFFF006DFFFF0033AFEB002BA6E700348AE7000000 + 000000000000B1B1D1003434AD002A2AE6001010E2000000D1000000D6000105 + CD001F35C30066A9DE0057BAEB0049C2EF0033AFE700697DDC00D7DAF700FDFD + FE009898C3002727B6002929F0000C0CE1000000D6000000DD000000E2000208 + D6006299D8003C5CD2002E73D7003B73E6002B7EEB003698E600DDE1F600B5B5 + D1002424B8003C3CFE004646FD003D3DF4002828EF000A0AE8000000E8000205 + E5001021D7000000D9002E70DB002C63DF00180EEC002134C600C9C9DF004C4C + A8004242F5006565FF006767FF006868FF006969FF005858FB002C2CF5000000 + F2000000EF000000EB000612DC00030ED4000501E0002019D9007E7EB5003232 + B4007171FF008181FF007B7BFF007B7BFF007D7DFF008181FF008080FF005959 + FC001B1BF5000000EE000000E8000000E1000000D8001313EB004646A9003D3D + B7009191FF009898FF009494FF009494FF009494FF009494FF009595FF009C9C + FF008E8EFE005151F8001414EC000000E1000000D7000909EB004040A8004C4C + A2009F9FFC00B9B9FF00ACACFF00ACACFF00ACACFF00ACACFF00B2B2FF00B0B0 + FF00B2B2FF00B6B6FF009797FC006565F1004646EC003030E7006969A7009B9B + BB006969C500D3D3FF00D7D7FF00D0D0FF00D1D1FF00D7D7FF00CBCBFF00CECE + FF00D5D5FF00D2D2FF00D8D8FF00E4E4FF00C9C9FF005353AF00C4C4D500F5F5 + F7007B7BA6006D6DBD00BFBFF100D6D6FF00D5D5FF00B4B4F8005757D6006A6A + DC00C0C0FD00D7D7FF00D5D5FF00B4B4E9005C5CAB009B9BB700FDFDFE000000 + 0000F7F7F900ACACC00061619B005454A8004F4FAB004C4C9E008B8BAE007C7C + A6004A4AA0005151AB005454A4006A6A9E00C1C1D000FEFEFE00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FF80 + 0000FE000000F8000000F0000000E0000000C000000000000000000000000000 + 0000000000000000000000000000000000000000000080010000FFFF0000} + OldCreateOrder = False + Position = poScreenCenter + OnCreate = FormCreate + OnDestroy = FormDestroy + OnShow = FormShow + DesignSize = ( + 352 + 275) + PixelsPerInch = 96 + TextHeight = 13 + object btnMoveUp: TSpeedButton + Left = 241 + Top = 80 + Width = 99 + Height = 25 + BiDiMode = bdLeftToRight + Caption = 'Move &Up' + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000C40E0000C40E00000000000000000000FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE5D36 + A23C0FA93F0BB24D17EBCEBEFFFFFFFFFFFFFFFFFFFFFFFFF8E1D2E46D1EE966 + 0EF16B0EF9822BFFFFFFFFFFFFA64A1EE4A66EE79146D06620B95F33FBF4F1FF + FFFFFFFFFFFDF7F3DC793FEA7720F89A40FA9D44F5720FFFFFFFFFFFFFA95233 + E0B18AFFDA96FEA754BF5212CD8F73FFFFFFFFFFFFDFA282D96B21FD9433FFA9 + 4CF79B43ED7420FFFFFFFFFFFFDFC0B5A14423F1CEA8FFC882F09546B14510EC + D4C7F3E0D6C76128F58C36FF7F14FA8524E06109F7C7A8FFFFFFFFFFFFFFFFFF + C0816FB87155FDE2BAFFBE72D97831B55B31BF6B43DF8346FF7A14FF7406E05F + 07E59461FFFFFFFFFFFFFFFFFFFFFFFFF8F0EDA74F32D5A992FFE5B5FDB362BC + 5417BC5013FD8323FF6D00E86302CE6625FAEBE1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFE1C4B89F4020ECD7C5FFDBA5F6A456F48B36FF8117F46902BF4A01EBC1 + A7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC38773B2684FFBF3DFFF + C987FFAC5BFD963BC65108D08A64FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFDFAF9A64D32CEA394FFF3D6FFC47BD87D38AF5228FBF5F2FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9D2C9A04226EC + DCD4F2D0A9A24016E5C8BAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFC68D7DB2674AB97559C0826FFFFEFEFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF8F6AE + 5D3CAB5634FBF7F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} + Margin = 3 + ParentBiDiMode = False + Spacing = 10 + OnClick = btnMoveUpClick + end + object btnMoveDown: TSpeedButton + Left = 241 + Top = 112 + Width = 99 + Height = 25 + BiDiMode = bdLeftToRight + Caption = 'Move &Down' + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000C40E0000C40E00000000000000000000FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFEF9F6EB7F38F07D30FEF6F0FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEAA177E9 + 7522F0822CF39F6AFFFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF3D5C3DA6219F8B46FFC9036EB6008F9D1B5FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF9F6D2672EEB9C5FFF + BA73FF760BF56903EC7623FEF5EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFD9916DD77538FDD29EFF9B44FF8420FE770EEE6300F0995DFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7C4B1C15117F5CBA3FFC484F9 + 9138F8872CFF8521FB7209E85F00F7C4A1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F7EEE9BC592DE3AD88FFE3B9FEB267D66317D75F11FE963CFF821BF56C07E873 + 22FCE9DBFFFFFFFFFFFFFFFFFFFFFFFFC6816AC87B56FEF0D9FFD99EE28B46CE + 6C36D57741E6853DFF973BFF7B14ED6604EE965AFFFFFFFFFFFFFFFFFFDDBAAF + AA4923F4E6D9FFF7D1F1BF85BF521AF3DBCDF7E6DBCF6225F4A05CFF8E2FFB78 + 12E65F01F5C5A3FFFFFFFFFFFFA95131E3C6BDFFFFFFFDF2C7C16430D59479FF + FFFFFFFFFFE3A688D46E35FDA75DFF8C28F77612E76D17FFFFFFFFFFFFA74F28 + E1C4B2E3C7AACC8E61B85C36FBF5F2FFFFFFFFFFFFFDF7F4D37742E07529F382 + 28F47618E46103FFFFFFFFFFFFB0613D9D3B179D3A14A7461CECD3C6FFFFFFFF + FFFFFFFFFFFFFFFFF6E3D7CF6220D1570CD65B0BE1772FFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} + Margin = 3 + ParentBiDiMode = False + Spacing = 10 + OnClick = btnMoveDownClick + end + object btnAdd: TSpeedButton + Left = 241 + Top = 16 + Width = 99 + Height = 25 + BiDiMode = bdLeftToRight + Caption = '&Add' + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000C40E0000C40E00000000000000000000FFFFFFFFFFFF + 9CD8F52195E1B7D7F3FFFFFFFFFFFFFFFFFFFFFFFFF0F6FC3A80811A6B3E196B + 3725734184B094FFFFFFFFFFFFFFFFFFBBE7F935B9EB209BE366AAE5F3F8FDFF + FFFFB7D9F21A7782288C5364BA8D95D2B264BA8D288C5381AE91FFFFFFFFFFFF + F7FCFE1BB0EBADE7F83AB1E9248ADC60ABE5249FE11D6F3F62BA8B60BA87FFFF + FF60B98767BC8F20703DFFFFFFFFFFFFFFFFFF58C7F283D7F58DDEF672D3F355 + C3EE75D7F4317B4C9CD4B6FFFFFFFFFFFFFFFFFF95D2B2196B37FFFFFFFFFFFF + FFFFFF9BDEF853C6F089DDF576D7F46FD5F463D2F345896290D3B192D6B1FFFF + FF65BC8C67BC8F20703DFFFFFFFFFFFFF3FBFE51C2F277D5F589DCF678D8F46E + D5F366D3F361B2AE61AB8195D4B4BAE6D06ABB8F2D8F5781AE91FFFFFFDBF2FD + 27AEF151C7F4A1E3F78ADDF67FD9F575D7F46CD4F36FD5F357ACB15493734F8E + 664A8A6199BDA6FFFFFFB1E6FC0CACF46AD2F6C3EDFAABE7F99AE1F788DCF57E + D9F57AD8F57ED9F58BDDF686D9F42CA5E54E9CE0F3F9FDFFFFFF30C7FA41CAF8 + 41C9F740C8F63FC6F57DD7F79CE1F78BDCF67CD7F54EC4F038BAED39BAEC34B5 + EA14A8E4A2D9F3FFFFFFF7FDFFD5F4FED2F3FED2F2FDB1B5AA36B3DA9BE1F8A1 + E3F849C5F282ACB5D2F0FBD2EFFBD2EFFBE3F5FCFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFD8B69AC18E5E7AB9C06CD4F7AAE5F916A6E2B48055CEAC92FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDABA9DC69564D9BC95BBAF8A17BBF370 + D5F75BA4B7D3B08BB78154CEAC92FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + B97940DDC299D5B581C99E5F45B5D12EC3F59E9873CDA575D3B28BA25E2AFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC7D42E2CCA4CEA867CCA46495AB8F51 + B1C1C6995BC49658DABC97A5612DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + BE8045E4CFA6D1AD6BCFAA68CDA666CBA363C99F60C79B5DDCC099A86530FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC18347E5D1A8D3B26FD2AE6DD0AB6ACE + A867CCA565CAA161DDC49DAB6933FFFFFFFFFFFFFFFFFFFFFFFF} + Margin = 3 + ParentBiDiMode = False + Spacing = 10 + OnClick = btnAddClick + end + object btnRemove: TSpeedButton + Left = 241 + Top = 48 + Width = 99 + Height = 25 + BiDiMode = bdLeftToRight + Caption = '&Remove' + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000C40E0000C40E00000000000000000000FFFFFFFFFFFF + 9CD8F52195E1B7D7F3FFFFFFFFFFFFFFFFFFFFFFFFF0F6FC417ACD084ABA0543 + BC1F59C186A6DDFFFFFFFFFFFFFFFFFFBBE7F935B9EB209BE366AAE5F3F8FDFF + FFFFB7D9F21A6DCA2565C92177E60579EA0164DD074FBE86A6DDFFFFFFFFFFFF + F7FCFE1BB0EBADE7F83AB1E9248ADC60ABE5249FE10E53BF639DF4187FFF0076 + F80076EE0368E11E59C0FFFFFFFFFFFFFFFFFF58C7F283D7F58DDEF672D3F355 + C3EE75D7F40443BCAECDFEFFFFFFFFFFFFFFFFFF187FEF0543BCFFFFFFFFFFFF + FFFFFF9BDEF853C6F089DDF576D7F46FD5F463D2F31257C18DB5F64D92FF1177 + FF2186FF408AEB245CC2FFFFFFFFFFFFF3FBFE51C2F277D5F589DCF678D8F46E + D5F366D3F34B9ADE3773D18DB5F7B8D6FE72A8F52F6DCC94AFE2FFFFFFDBF2FD + 27AEF151C7F4A1E3F78ADDF67FD9F575D7F46CD4F36FD5F33B91DB0C52C30543 + BC205AC188A7DEFFFFFFB1E6FC0CACF46AD2F6C3EDFAABE7F99AE1F788DCF57E + D9F57AD8F57ED9F58BDDF686D9F42CA5E54E9CE0F3F9FDFFFFFF30C7FA41CAF8 + 41C9F740C8F63FC6F57DD7F79CE1F78BDCF67CD7F54EC4F038BAED39BAEC34B5 + EA14A8E4A2D9F3FFFFFFF7FDFFD5F4FED2F3FED2F2FDB1B5AA36B3DA9BE1F8A1 + E3F849C5F282ACB5D2F0FBD2EFFBD2EFFBE3F5FCFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFD8B69AC18E5E7AB9C06CD4F7AAE5F916A6E2B48055CEAC92FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDABA9DC69564D9BC95BBAF8A17BBF370 + D5F75BA4B7D3B08BB78154CEAC92FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + B97940DDC299D5B581C99E5F45B5D12EC3F59E9873CDA575D3B28BA25E2AFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC7D42E2CCA4CEA867CCA46495AB8F51 + B1C1C6995BC49658DABC97A5612DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + BE8045E4CFA6D1AD6BCFAA68CDA666CBA363C99F60C79B5DDCC099A86530FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC18347E5D1A8D3B26FD2AE6DD0AB6ACE + A867CCA565CAA161DDC49DAB6933FFFFFFFFFFFFFFFFFFFFFFFF} + Margin = 3 + ParentBiDiMode = False + Spacing = 10 + OnClick = btnRemoveClick + end + object btnSort: TSpeedButton + Left = 241 + Top = 144 + Width = 99 + Height = 25 + BiDiMode = bdLeftToRight + Caption = ' &Sort' + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000C40E0000C40E00000000000000000000FFFFFFFBFBFF + C7C7FFA7A7FFA4A4FFA4A4FFA6A6FFD5D5FFFDFDFFFFFFFFC8C8C82828289898 + 98FFFFFFFFFFFFFFFFFFFFFFFFF6F6FF6A6AFF1010FF1D1DFF3434FF3C3CFFA3 + A3FFFCFCFFF9F9F98484841717175C5C5CE4E4E4FFFFFFFFFFFFFFFFFFFCFCFF + A2A2FF1D1DFF2A2AFFA2A2FFD1D1FFE9E9FFFFFFFFD8D8D83E3E3E1010102626 + 26B0B0B0FCFCFCFFFFFFFFFFFFFFFFFFEBEBFF7373FF1616FF6F6FFFEFEFFFFF + FFFFFFFFFF9090902625261A19191F1F1F636363F3F3F3FFFFFFFFFFFFFFFFFF + FFFFFFD9D9FF4D4DFF1B1BFF9A9AFFF9F9FFFFFFFFCECDCD8988883737377070 + 70BABABAFAFAFAFFFFFFFFFFFFFEFEFFDFDFFFBFBFFF7777FF1010FF3232FFCE + CEFFFFFFFFFFFFFFD3D3D34E4E4EABABABFFFFFFFFFFFFFFFFFFFFFFFFFBFBFF + 9C9CFF3B3BFF2D2DFF2525FF2C2CFFBABAFFFFFFFFFFFFFFD4D4D4575757AFAF + AFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFFE4E4FFC6C6FFC2C2FFC2C2FFC6C6FFEE + EEFFFFFFFFFFFFFFD7D6D6626262B4B4B4FFFFFFFFFFFFFFFFFFFFFFFFFEFCFB + F6E1D1F8E4D5FFFDFBFFFFFDF9E8DAF4DDCBFDFAF7FFFFFFD9D9D96D6D6DB9B9 + B9FFFFFFFFFFFFFFFFFFFFFFFFFCF8F4DC9B67D68A4CF2DAC6F5E3D4D99259D7 + 8C4FFAEFE7FFFFFFDDDDDC797979BFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFEFCFA + E4B188CA6717D07932D27D38C96210DD9D6AFCF6F2FFFFFFE0E0DF858584C4C5 + C4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D6C0CD7024CE7228CF752DC96412EB + C4A5FFFEFEFFFFFFE3E3E2919190CACACAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F9EDE3D88F54CF752CD07730D27F3BF5E2D3FFFFFFFFFFFFE6E6E69D9D9DD0D0 + D0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFCFAE5B48CC8600CC65B05DD9D6AFC + F8F4FFFFFFFFFFFFE9E9E9A9A9A9D6D6D6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF0D4BDCF752DCC6B1DEAC3A3FFFFFFFFFFFFFFFFFFECECECB8B8B8DCDC + DCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF5EFEFD2BAEDCCB1FAF0E8FF + FFFFFFFFFFFFFFFFF9F9F9E7E7E7F3F3F3FFFFFFFFFFFFFFFFFF} + Margin = 3 + ParentBiDiMode = False + Spacing = 10 + OnClick = btnSortClick + end + object btnClear: TSpeedButton + Left = 241 + Top = 176 + Width = 99 + Height = 25 + BiDiMode = bdLeftToRight + Caption = ' &Clear' + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000C40E0000C40E00000000000000000000CC483FBEBEBE + 9F9F9FA1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1 + A19F9F9FB4B4B4CC483FC7C7C7BABABAEAEAEAF2F2F2F5F5F5F7F7F7F9F9F9FB + FBFBFCFCFCFBFBFBF9F9F9F7F7F7F5F5F5F1F1F1CACACAB0B0B0A4A4A4E3E3E3 + 6E6EE41717DB1616D91414D81313D71212D61111D61212D61212D71414D81515 + D95454E1F0F0F0A3A3A3A0A0A0E9E9E92929DF1313DC1111DA1010D90E0ED80E + 0ED80E0ED80E0ED80E0ED80F0FD91111DA1212DCF1F1F1A9A9A9A0A0A0E9E9E9 + 2B2BE11515DE1717DD7F80E56566E31111DA1111DA3838DE898AE63031DF1313 + DD1515DEF1F1F1A9A9A9A0A0A0E8E8E82D2DE31818E04E4FE3ECEEEEECEEEE7B + 7CE54444E0E0E2EDECEEEE8E8FE71616DF1818E0F0F0F0A9A9A9A0A0A0E7E7E7 + 2E2EE41A1AE32020E2C6C8ECECEEEEECEEEEE6E8EDECEEEEE4E6EE4949E41919 + E11A1AE2EFEFEFA9A9A9A0A0A0E6E6E63131E61D1DE51C1CE42C2DE4D0D2EDEC + EEEEECEEEEE9EBEE5152E61B1BE31C1CE41D1DE5EDEDEDA9A9A9A0A0A0E5E5E5 + 3333E82020E71F1FE74F4FE8E2E4EEECEEEEECEEEEECEEEE8485EA1E1EE61F1F + E62020E7ECECECA8A8A8A0A0A0E3E3E33636EB2323EA3F40EAE3E5EEECEEEEE4 + E7EED1D3EDECEEEEECEEEE696AEA2222E92323EAEAEAEAA8A8A8A0A0A0E1E1E1 + 3838ED2626EC5252ECECEEEEE4E6EE5859EC3435ECC8CAEDECEEEE8E8FED2525 + EC2626ECE8E8E8A8A8A8A0A0A0E0E0E03939EE2828EE2828EE5657EE3E3EEE27 + 27ED2727ED3434ED5F5FED3030EE2828EE2828EEE6E6E6A8A8A8A0A0A0DEDEDE + 3D3DED2828EE2828EE2828EE2828EE2828EE2828EE2828EE2828EE2828EE2828 + EE2B2BEEE4E4E4A8A8A8A9A9A9D2D2D29D9DE75D5DEB5C5CEB5D5DEC5D5DEC5D + 5DEC5D5DEC5D5DEC5D5DEC5D5DEC5C5CEB8D8DE8DFDFDFA1A1A1D2D2D2A9A9A9 + CBCBCBD4D4D4D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5 + D5D0D0D0B2B2B2BBBBBBCC483FDBDBDBB3B3B3ACACACACACACACACACACACACAC + ACACACACACACACACACACACACACACACACACAFAFAFD1D1D1CC483F} + Margin = 3 + ParentBiDiMode = False + Spacing = 10 + OnClick = btnClearClick + end + object ScriptList: TListView + Left = 16 + Top = 16 + Width = 218 + Height = 215 + Anchors = [akLeft, akTop, akRight, akBottom] + Columns = < + item + AutoSize = True + Caption = 'Name' + end> + HideSelection = False + ReadOnly = True + RowSelect = True + ParentShowHint = False + ShowColumnHeaders = False + ShowHint = True + TabOrder = 0 + ViewStyle = vsReport + OnChange = ScriptListChange + OnInfoTip = ScriptListInfoTip + end + object btnOK: TButton + Left = 180 + Top = 246 + Width = 75 + Height = 25 + Anchors = [akRight, akBottom] + Caption = '&OK' + TabOrder = 1 + OnClick = btnOKClick + end + object btnCancel: TButton + Left = 260 + Top = 246 + Width = 75 + Height = 25 + Anchors = [akRight, akBottom] + Caption = '&Cancel' + ModalResult = 2 + TabOrder = 2 + end +end diff --git a/Forms/FormFavorites.pas b/Forms/FormFavorites.pas new file mode 100644 index 0000000..f29a2a5 --- /dev/null +++ b/Forms/FormFavorites.pas @@ -0,0 +1,273 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} +unit FormFavorites; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, ExtCtrls, ComCtrls, Translation, Vcl.Buttons; + +type + TFavoritesForm = class(TForm) + ScriptList: TListView; + btnMoveUp: TSpeedButton; + btnMoveDown: TSpeedButton; + btnOK: TButton; + btnCancel: TButton; + btnAdd: TSpeedButton; + btnRemove: TSpeedButton; + btnSort: TSpeedButton; + btnClear: TSpeedButton; + procedure FormShow(Sender: TObject); + procedure btnOKClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure btnAddClick(Sender: TObject); + procedure btnRemoveClick(Sender: TObject); + procedure ScriptListChange(Sender: TObject; Item: TListItem; + Change: TItemChange); + procedure btnMoveUpClick(Sender: TObject); + procedure btnMoveDownClick(Sender: TObject); + procedure ScriptListInfoTip(Sender: TObject; Item: TListItem; + var InfoTip: string); + procedure btnSortClick(Sender: TObject); + procedure btnClearClick(Sender: TObject); + private + { Private declarations } + public + Faves: TStringList; + { Public declarations } + end; + +var + FavoritesForm: TFavoritesForm; + +implementation + +uses Global, ScriptForm; +{$R *.DFM} + +procedure TFavoritesForm.FormShow(Sender: TObject); +var + ListItem: TListItem; + i: integer; + s: string; +begin + Faves.Text := Favorites.Text; + ScriptList.Items.Clear; + for i := 0 to Favorites.Count - 1 do + begin + ListItem := ScriptList.Items.Add; + s := ExtractFileName(Favorites[i]); + s := Copy(s, 0, length(s) - Length(ExtractFileExt(s))); + Listitem.Caption := s; + end; + if Favorites.Count <> 0 then + ScriptList.Selected := ScriptList.Items[0] + else + btnRemove.Enabled := False; + + if ScriptList.Items.Count <= 1 then + begin + btnMoveUp.Enabled := False; + btnMoveDown.Enabled := False; + end; +end; + +procedure TFavoritesForm.btnOKClick(Sender: TObject); +begin + ModalResult := mrOK; + Faves.SaveToFile(AppPath + scriptFavsFilename); +end; + +procedure TFavoritesForm.FormCreate(Sender: TObject); +begin + btnOK.Caption := TextByKey('common-ok'); + btnCancel.Caption := TextByKey('common-cancel'); + self.Caption := TextByKey('favscripts-title'); + btnAdd.Caption := TextByKey('favscripts-add'); + btnRemove.Caption := TextByKey('favscripts-remove'); + btnMoveUp.Caption := TextByKey('favscripts-moveup'); + btnMoveDown.Caption := TextByKey('favscripts-movedown'); + btnSort.Caption := TextByKey('varorder-byname'); // AV + btnClear.Caption := TextByKey('common-clear'); // AV + + Faves := TStringList.Create; +end; + +procedure TFavoritesForm.FormDestroy(Sender: TObject); +begin + Faves.Free; +end; + +procedure TFavoritesForm.btnAddClick(Sender: TObject); +var + ListItem: TListItem; + i : integer; + s: string; +begin + s := AppPath + 'Scripts'; + if DirectoryExists(s) then + ScriptEditor.MainOpenDialog.InitialDir := s + else ScriptEditor.MainOpenDialog.InitialDir := ParamFolder; + ScriptEditor.MainOpenDialog.Filter := Format('%s|*.aposcript;*.asc|%s|*.*', + [TextByKey('common-filter-scriptfiles'), + TextByKey('common-filter-allfiles')]); + if ScriptEditor.mainOpenDialog.Execute then + begin + for i := 0 to Faves.Count - 1 do + begin + if ScriptEditor.MainOpenDialog.Filename = Faves[i] then exit; + end; + + Faves.add(ScriptEditor.MainOpenDialog.Filename); + ListItem := ScriptList.Items.Add; + s := ExtractFileName(ScriptEditor.MainOpenDialog.Filename); + s := Copy(s, 0, length(s) - Length(ExtractFileExt(s))); + Listitem.Caption := s; + ScriptList.Selected := ScriptList.Items[ScriptList.Items.Count - 1]; + btnRemove.Enabled := True; + end; + + if ScriptList.Items.Count <= 1 then + begin + btnMoveUp.Enabled := False; + btnMoveDown.Enabled := False; + end; +end; + +procedure TFavoritesForm.btnRemoveClick(Sender: TObject); +var + i: integer; +begin + if not assigned(ScriptList.Selected) then exit; // AV + i := ScriptList.Selected.Index; + Faves.Delete(i); + ScriptList.Items[i].delete; + if ScriptList.Items.Count <> 0 then + if i < ScriptList.Items.Count then + ScriptList.Selected := ScriptList.Items[i] + else + ScriptList.Selected := ScriptList.Items[ScriptList.Items.Count - 1] + else + btnRemove.Enabled := False; + + if ScriptList.Items.Count <= 1 then + begin + btnMoveUp.Enabled := False; + btnMoveDown.Enabled := False; + end; +end; + +procedure TFavoritesForm.btnSortClick(Sender: TObject); +var + scripts: TStringList; + i : integer; +begin + if (ScriptList.Items.Count <= 1) then exit; + + scripts := TStringList.Create; + for i := 0 to Faves.Count - 1 do + scripts.AddPair(ScriptList.Items[i].Caption, Faves[i]); + ScriptList.Items.BeginUpdate; + scripts.Sort; + for i := 0 to Faves.Count - 1 do + begin + ScriptList.Items[i].Caption := scripts.Names[i]; + Faves[i] := scripts.ValueFromIndex[i]; + end; + ScriptList.Items.EndUpdate; + scripts.Free; +end; + +procedure TFavoritesForm.ScriptListChange(Sender: TObject; Item: TListItem; + Change: TItemChange); +begin + // TODO: optimize old code + btnRemove.Enabled := (ScriptList.Items.Count > 0); + + if (Item.Index = ScriptList.Items.Count - 1) then + btnMoveDown.Enabled := False + else + btnMoveDown.Enabled := True; + if (Item.Index = 0) then + btnMoveUp.Enabled := False + else + btnMoveUp.Enabled := True; + + if (ScriptList.Items.Count <= 1) then + begin + btnMoveDown.Enabled := False; + btnMoveUp.Enabled := False; + end; +end; + +procedure TFavoritesForm.ScriptListInfoTip(Sender: TObject; Item: TListItem; + var InfoTip: string); +begin + InfoTip := Faves[Item.Index]; // AV: show the corresponding full file name +end; + +procedure TFavoritesForm.btnMoveUpClick(Sender: TObject); +var + i: integer; + s: string; +begin + if not assigned(ScriptList.Selected) then exit; // AV + i := ScriptList.Selected.Index; + s := Faves[i]; + Faves[i] := Faves[i - 1]; + Faves[i - 1] := s; + s := ScriptList.Selected.Caption; + ScriptList.Selected.Caption := ScriptList.Items[i - 1].Caption; + ScriptList.Items[i - 1].Caption := s; + ScriptList.Selected := ScriptList.Items[i - 1]; +end; + +procedure TFavoritesForm.btnClearClick(Sender: TObject); +begin + ScriptList.Items.Clear; + Faves.Clear; + btnRemove.Enabled := False; +end; + +procedure TFavoritesForm.btnMoveDownClick(Sender: TObject); +var + i: integer; + s: string; +begin + if not assigned(ScriptList.Selected) then exit; // AV + i := ScriptList.Selected.Index; + s := faves[i]; + Faves[i] := Faves[i + 1]; + Faves[i + 1] := s; + s := ScriptList.Selected.Caption; + ScriptList.Selected.Caption := ScriptList.Items[i + 1].Caption; + ScriptList.Items[i + 1].Caption := s; + ScriptList.Selected := ScriptList.Items[i + 1]; +end; + +end. + diff --git a/Forms/FormRender.dfm b/Forms/FormRender.dfm new file mode 100644 index 0000000..9de91d0 --- /dev/null +++ b/Forms/FormRender.dfm @@ -0,0 +1,971 @@ +object RenderForm: TRenderForm + Left = 851 + Top = 205 + BorderIcons = [biSystemMenu, biMinimize] + BorderStyle = bsSingle + Caption = 'Render to Disk' + ClientHeight = 532 + ClientWidth = 497 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + OnActivate = FormActivate + OnClose = FormClose + OnCloseQuery = FormCloseQuery + OnCreate = FormCreate + OnDestroy = FormDestroy + OnShow = FormShow + DesignSize = ( + 497 + 532) + PixelsPerInch = 96 + TextHeight = 13 + object btnRender: TButton + Left = 252 + Top = 483 + Width = 75 + Height = 25 + Anchors = [akRight, akBottom] + Caption = 'Start' + Default = True + TabOrder = 0 + OnClick = btnRenderClick + end + object btnCancel: TButton + Left = 412 + Top = 483 + Width = 75 + Height = 25 + Anchors = [akRight, akBottom] + Caption = 'Close' + TabOrder = 1 + OnClick = btnCancelClick + end + object btnPause: TButton + Left = 332 + Top = 483 + Width = 75 + Height = 25 + Anchors = [akRight, akBottom] + Caption = 'Pause' + TabOrder = 2 + OnClick = btnPauseClick + end + object PageCtrl: TPageControl + Left = 8 + Top = 8 + Width = 481 + Height = 436 + ActivePage = TabSettings + Anchors = [akLeft, akTop, akRight, akBottom] + Images = MainForm.Buttons + TabOrder = 3 + object TabSettings: TTabSheet + Caption = 'Settings' + ImageIndex = 18 + DesignSize = ( + 473 + 407) + object btnBrowse: TSpeedButton + Left = 416 + Top = 7 + Width = 24 + Height = 24 + Hint = 'Browse...' + Anchors = [akTop, akRight] + Flat = True + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + Font.Style = [fsBold] + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF75848F66808F + 607987576E7B4E626F4456613948522E3A43252E351B222914191E0E12160E13 + 18FF00FFFF00FFFF00FF77879289A1AB6AB2D4008FCD008FCD008FCD048CC708 + 88BE0F82B4157CA91B779F1F7296224B5C87A2ABFF00FFFF00FF7A8A957EBED3 + 8AA4AE7EDCFF5FCFFF55CBFF4CC4FA41BCF537B3F02EAAEB24A0E5138CD42367 + 805E696DFF00FFFF00FF7D8E9879D2EC8BA4AD89C2CE71D8FF65D3FF5CCEFF51 + C9FE49C1FA3FB9F534B0EE29A8E91085CD224B5B98B2BAFF00FF80919C81D7EF + 7DC5E08CA6B080DDFE68D3FF67D4FF62D1FF58CDFF4EC7FC46BEF73BB6F231AC + EC2569817A95A1FF00FF83959F89DCF18CE2FF8DA8B18CBAC774D8FF67D4FF67 + D4FF67D4FF5FD0FF54CDFF4BC5FC41BBF72EA2DB51677498B2BA869AA392E1F2 + 98E8FD80C4DE8EA7B081DEFD84E0FF84E0FF84E0FF84E0FF81DFFF7BDDFF74D8 + FF6BD6FF56A9D18F9BA4889CA59AE6F39FEBFB98E8FE8BACB98BACB98AAAB788 + A6B386A3AF839FAA819AA67F95A17C919D7A8E99798B957788938BA0A8A0EAF6 + A6EEF99FEBFB98E8FE7ADAFF67D4FF67D4FF67D4FF67D4FF67D4FF67D4FF7788 + 93FF00FFFF00FFFF00FF8EA2ABA7EEF6ABF0F7A6EEF99FEBFB98E8FD71D4FB89 + 9EA78699A382949F7E909A7A8C97778893FF00FFFF00FFFF00FF8FA4ACA0D2DA + ABF0F7ABF0F7A6EEF99FEBFB8DA1AAB5CBD0FF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFBDCED48FA4AC8FA4AC8FA4AC8FA4AC8FA4ACB5CBD0FF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF} + ParentFont = False + ParentShowHint = False + ShowHint = True + OnClick = btnBrowseClick + end + object btnGoTo: TSpeedButton + Left = 440 + Top = 7 + Width = 24 + Height = 24 + Hint = 'Browse...' + Anchors = [akTop, akRight] + Flat = True + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + Font.Style = [fsBold] + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FF964924EADBD3FF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF9D + 4D259D4E28EADBD3FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFCF835D9247239A4B25A24F27AB5429BF6A3FA0502AEADBD3FF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFD78B65FDB089F7905CEC8856DE + 7F4FD17648C46E42A25631EADBD3FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFDE926CFCB997FDA578FC935EF28C59E58453D87B4CC66E41AE582BFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFE49872FBC3A6FDBE9EFEAE85FF + A87DF89D6FE58351AE582BF4E7E1FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFE89C76E29670DA8E68D1855FDB906AF79A6BAE582BF4E7E1FF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFE5 + 9973C5764EF3E6DFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFE89C76F8EDE8FF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF} + ParentFont = False + ParentShowHint = False + ShowHint = True + OnClick = btnGoToClick + end + object GroupBox5: TGroupBox + Left = 5 + Top = 35 + Width = 425 + Height = 57 + Caption = 'Preset' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 0 + object btnSavePreset: TSpeedButton + Left = 368 + Top = 18 + Width = 24 + Height = 24 + Hint = 'Save Preset' + Flat = True + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + Font.Style = [fsBold] + ParentFont = False + ParentShowHint = False + ShowHint = True + OnClick = btnSavePresetClick + end + object btnDeletePreset: TSpeedButton + Left = 392 + Top = 18 + Width = 24 + Height = 24 + Hint = 'Delete Preset' + Caption = 'r' + Flat = True + Font.Charset = SYMBOL_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Marlett' + Font.Style = [fsItalic] + ParentFont = False + ParentShowHint = False + ShowHint = True + OnClick = btnDeletePresetClick + end + object cmbPreset: TComboBox + Left = 10 + Top = 20 + Width = 351 + Height = 21 + Style = csDropDownList + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 0 + OnChange = cmbPresetChange + end + end + object GroupBox2: TGroupBox + Left = 5 + Top = 92 + Width = 233 + Height = 97 + Anchors = [akLeft, akTop, akRight] + Caption = 'Size' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 1 + DesignSize = ( + 233 + 97) + object lblRatio: TLabel + Left = 12 + Top = 72 + Width = 56 + Height = 13 + Caption = 'Aspect ratio' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + end + object pnlWidth: TPanel + Left = 8 + Top = 20 + Width = 113 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Width' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 2 + end + object pnlHeight: TPanel + Left = 8 + Top = 44 + Width = 113 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Height' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 3 + end + object cbHeight: TComboBox + Left = 120 + Top = 44 + Width = 105 + Height = 21 + Anchors = [akLeft, akTop, akRight] + BiDiMode = bdLeftToRight + Enabled = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentBiDiMode = False + ParentFont = False + TabOrder = 1 + OnChange = txtHeightChange + OnExit = cbHeightExit + OnKeyPress = NumFieldKeyPress + Items.Strings = ( + '200' + '240' + '480' + '600' + '768' + '1024' + '1200' + '1920' + '2048' + '2400') + end + object cbWidth: TComboBox + Left = 120 + Top = 20 + Width = 105 + Height = 21 + Anchors = [akLeft, akTop, akRight] + BiDiMode = bdLeftToRight + Enabled = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentBiDiMode = False + ParentFont = False + TabOrder = 0 + OnChange = txtWidthChange + OnExit = cbWidthExit + OnKeyPress = NumFieldKeyPress + Items.Strings = ( + '320' + '640' + '800' + '1024' + '1280' + '1600' + '1920' + '2048' + '2560' + '3200') + end + object cbAspectRatio: TComboBox + Left = 101 + Top = 70 + Width = 123 + Height = 21 + Style = csDropDownList + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 4 + OnChange = cbAspectRatioChange + Items.Strings = ( + 'Custom' + 'Maintain aspect ratio' + '3 : 2 (Classic Film)' + '4 : 3 (Standart Monitor)' + '5 : 4 ' + '16 : 9 (HD Video)' + '16 : 10' + '21 : 9 (CinemaScope)') + end + end + object GroupBox3: TGroupBox + Left = 248 + Top = 92 + Width = 218 + Height = 97 + Anchors = [akTop, akRight] + Caption = 'Quality settings' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 2 + DesignSize = ( + 218 + 97) + object udOversample: TUpDown + Left = 196 + Top = 68 + Width = 15 + Height = 21 + Anchors = [akTop, akRight] + Associate = txtOversample + Min = 1 + Max = 4 + Position = 1 + TabOrder = 3 + end + object pnlDensity: TPanel + Left = 8 + Top = 20 + Width = 121 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Density' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 4 + end + object pnlFilter: TPanel + Left = 8 + Top = 44 + Width = 121 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Filter radius' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 5 + end + object pnlOversample: TPanel + Left = 8 + Top = 68 + Width = 121 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Oversample' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 6 + end + object txtDensity: TComboBox + Left = 128 + Top = 20 + Width = 82 + Height = 21 + AutoComplete = False + Anchors = [akLeft, akTop, akRight] + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 0 + OnChange = txtDensityChange + OnCloseUp = txtDensityChange + OnExit = txtDensityExit + OnKeyPress = NumFieldKeyPress + Items.Strings = ( + '200' + '500' + '1000' + '2000' + '4000') + end + object txtFilterRadius: TEdit + Left = 128 + Top = 44 + Width = 68 + Height = 21 + Anchors = [akLeft, akTop, akRight] + BiDiMode = bdLeftToRight + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentBiDiMode = False + ParentFont = False + TabOrder = 1 + Text = '0.1' + OnExit = txtFilterRadiusExit + OnKeyPress = NumFieldKeyPress + end + object txtOversample: TEdit + Left = 128 + Top = 68 + Width = 68 + Height = 21 + Anchors = [akLeft, akTop, akRight] + BiDiMode = bdLeftToRight + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentBiDiMode = False + ParentFont = False + ReadOnly = True + TabOrder = 2 + Text = '1' + OnChange = txtOversampleChange + OnKeyPress = NumFieldKeyPress + end + object sbFilterRadius: TSpinButton + Left = 196 + Top = 44 + Width = 15 + Height = 21 + DownGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000008080000080800000808000000000000080800000808000008080000080 + 8000008080000080800000808000000000000000000000000000008080000080 + 8000008080000080800000808000000000000000000000000000000000000000 + 0000008080000080800000808000000000000000000000000000000000000000 + 0000000000000000000000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + FocusControl = txtFilterRadius + TabOrder = 7 + UpGlyph.Data = { + 0E010000424D0E01000000000000360000002800000009000000060000000100 + 200000000000D800000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000000000000000000000000000000000000000000000000000000000000080 + 8000008080000080800000000000000000000000000000000000000000000080 + 8000008080000080800000808000008080000000000000000000000000000080 + 8000008080000080800000808000008080000080800000808000000000000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 800000808000008080000080800000808000} + OnDownClick = sbFilterRadiusDownClick + OnUpClick = sbFilterRadiusUpClick + end + end + object GroupBox4: TGroupBox + Left = 5 + Top = 192 + Width = 461 + Height = 99 + Anchors = [akLeft, akTop, akRight] + Caption = 'Resource usage' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 3 + DesignSize = ( + 461 + 99) + object lblApproxMem: TLabel + Left = 431 + Top = 100 + Width = 50 + Height = 13 + Alignment = taRightJustify + Caption = '0000 Mb' + Visible = False + end + object lblPhysical: TLabel + Left = 439 + Top = 96 + Width = 42 + Height = 13 + Alignment = taRightJustify + Caption = '0000 Mb' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + Visible = False + end + object lblMaxbits: TLabel + Left = 433 + Top = 116 + Width = 40 + Height = 13 + Hint = '- No render stats -' + Alignment = taRightJustify + Caption = '99.999' + ParentShowHint = False + ShowHint = True + Visible = False + end + object Label9: TLabel + Left = 440 + Top = 108 + Width = 117 + Height = 13 + Hint = '- No render stats -' + Caption = 'Max bits per sample:' + ParentShowHint = False + ShowHint = True + Visible = False + end + object lblMemory: TLabel + Left = 11 + Top = 12 + Width = 445 + Height = 24 + Anchors = [akLeft, akTop, akRight] + AutoSize = False + Caption = + 'The render process will use 0000 Mb of 0000MB available physical' + + ' memory' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + Layout = tlCenter + WordWrap = True + ExplicitWidth = 442 + end + object lblCPUCores: TLabel + Left = 11 + Top = 35 + Width = 445 + Height = 26 + Anchors = [akLeft, akTop, akRight] + AutoSize = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + Layout = tlCenter + WordWrap = True + ExplicitWidth = 442 + end + object chkLimitMem: TCheckBox + Left = 444 + Top = 134 + Width = 125 + Height = 17 + Caption = 'Limit memory usage to:' + TabOrder = 0 + Visible = False + end + object pnlLimit: TPanel + Left = 8 + Top = 68 + Width = 121 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Memory limit' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 2 + end + object cbMaxMemory: TComboBox + Left = 128 + Top = 68 + Width = 97 + Height = 21 + Style = csDropDownList + BiDiMode = bdLeftToRight + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ItemIndex = 0 + ParentBiDiMode = False + ParentFont = False + TabOrder = 1 + Text = 'No limit' + OnChange = cbMaxMemoryChange + Items.Strings = ( + 'No limit' + '32' + '64' + '128' + '256' + '512' + '1024' + '1536') + end + object PBMem: TProgressBar + Left = 232 + Top = 68 + Width = 217 + Height = 21 + TabOrder = 3 + end + end + object GroupBox1: TGroupBox + Left = 5 + Top = 303 + Width = 220 + Height = 81 + Caption = 'Output options' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 5 + DesignSize = ( + 220 + 81) + object chkSave: TCheckBox + Left = 8 + Top = 16 + Width = 204 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = 'Save parameters in a flame' + Checked = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + State = cbChecked + TabOrder = 0 + end + object chkSaveIncompleteRenders: TCheckBox + Left = 8 + Top = 58 + Width = 204 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = 'Save incomplete renders' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 1 + OnClick = chkSaveIncompleteRendersClick + end + object chkEmbedFlame: TCheckBox + Left = 8 + Top = 37 + Width = 204 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = 'Save parameters in a PNG-image ' + Checked = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + State = cbChecked + TabOrder = 2 + end + end + object GroupBox6: TGroupBox + Left = 232 + Top = 303 + Width = 234 + Height = 81 + Anchors = [akLeft, akTop, akRight] + Caption = 'Completion options' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 6 + DesignSize = ( + 234 + 81) + object chkPostProcess: TCheckBox + Left = 8 + Top = 16 + Width = 217 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = 'Post-process after completion' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 0 + end + object chkShutdown: TCheckBox + Left = 8 + Top = 37 + Width = 217 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = 'Shut down computer when complete' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 1 + end + object chkPlaySound: TCheckBox + Left = 8 + Top = 58 + Width = 217 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = 'Play sound when complete' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 2 + OnClick = chkPlaySoundClick + end + end + object pnlTarget: TPanel + Left = 5 + Top = 8 + Width = 121 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Destination' + TabOrder = 7 + end + object txtFilename: TEdit + Left = 125 + Top = 8 + Width = 290 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 4 + OnChange = txtFilenameChange + end + object chkBinary: TCheckBox + Left = 13 + Top = 388 + Width = 457 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = + 'Write raw data (WARNING: this is experimental and slows down the' + + ' rendering!!!)' + Enabled = False + TabOrder = 8 + Visible = False + end + end + object TabOutput: TTabSheet + Caption = 'Output' + ImageIndex = 38 + ExplicitLeft = 0 + ExplicitTop = 0 + ExplicitWidth = 0 + ExplicitHeight = 0 + object Output: TMemo + Left = 0 + Top = 0 + Width = 473 + Height = 407 + Align = alClient + BorderStyle = bsNone + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clBtnText + Font.Height = -11 + Font.Name = 'Courier New' + Font.Style = [] + ParentFont = False + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 0 + end + end + end + object StatusBar: TStatusBar + Left = 0 + Top = 513 + Width = 497 + Height = 19 + Panels = < + item + Width = 161 + end + item + Width = 150 + end + item + Width = 50 + end> + end + object btnDonate: TButton + Left = 8 + Top = 483 + Width = 82 + Height = 25 + Anchors = [akLeft, akBottom] + Caption = 'Donate' + ParentShowHint = False + ShowHint = True + TabOrder = 6 + OnClick = btnDonateClick + end + object btnSaveLog: TButton + Left = 95 + Top = 483 + Width = 73 + Height = 25 + Anchors = [akLeft, akBottom] + Caption = 'Save log' + Enabled = False + TabOrder = 5 + Visible = False + OnClick = btnSaveLogClick + end + object ProgressBar2: TProgressBar + Left = 8 + Top = 451 + Width = 481 + Height = 25 + Anchors = [akLeft, akRight, akBottom] + TabOrder = 7 + end + object btnSnapshot: TButton + Left = 172 + Top = 483 + Width = 75 + Height = 25 + Anchors = [akLeft, akBottom] + Caption = 'Snapshot' + TabOrder = 8 + Visible = False + OnClick = btnSnapshotClick + end + object SaveDialog: TSaveDialog + Left = 456 + Top = 72 + end + object ProgressTaskbar: TTaskbar + TaskBarButtons = <> + ProgressMaxValue = 100 + TabProperties = [] + Left = 432 + Top = 424 + end +end diff --git a/Forms/FormRender.pas b/Forms/FormRender.pas new file mode 100644 index 0000000..eef8f1e --- /dev/null +++ b/Forms/FormRender.pas @@ -0,0 +1,1501 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} +unit FormRender; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, ComCtrls, Math, Buttons, Registry, ExtCtrls, MMSystem, // Windows7, + System.Win.TaskbarCore, Vcl.Taskbar, Vcl.Samples.Spin, // AV + ControlPoint, RenderThread, cmap, RenderingCommon, RenderingInterface, + ShellAPI, Translation, ActiveX, ComObj; + +const + {$ifdef T500} + rendersAV = 'rendersAV_250.flame'; + {$else} + rendersAV = 'rendersAV.flame'; + {$endif} + +type + TRenderForm = class(TForm) + btnRender: TButton; + btnCancel: TButton; + SaveDialog: TSaveDialog; + btnPause: TButton; + StatusBar: TStatusBar; + PageCtrl: TPageControl; + TabSettings: TTabSheet; + TabOutput: TTabSheet; + GroupBox5: TGroupBox; + btnSavePreset: TSpeedButton; + btnDeletePreset: TSpeedButton; + cmbPreset: TComboBox; + GroupBox2: TGroupBox; + cbWidth: TComboBox; + cbHeight: TComboBox; + GroupBox3: TGroupBox; + txtOversample: TEdit; + txtFilterRadius: TEdit; + udOversample: TUpDown; + txtDensity: TComboBox; + GroupBox4: TGroupBox; + lblApproxMem: TLabel; + lblPhysical: TLabel; + lblMaxbits: TLabel; + Label9: TLabel; + cbMaxMemory: TComboBox; + chkLimitMem: TCheckBox; + Output: TMemo; + lblMemory: TLabel; + btnBrowse: TSpeedButton; + txtFilename: TEdit; + GroupBox1: TGroupBox; + chkSave: TCheckBox; + GroupBox6: TGroupBox; + chkPostProcess: TCheckBox; + chkShutdown: TCheckBox; + btnGoTo: TSpeedButton; + pnlWidth: TPanel; + pnlHeight: TPanel; + pnlDensity: TPanel; + pnlFilter: TPanel; + pnlOversample: TPanel; + pnlLimit: TPanel; + pnlTarget: TPanel; + btnDonate: TButton; + btnSaveLog: TButton; + chkBinary: TCheckBox; + ProgressBar2: TProgressBar; + PBMem: TProgressBar; + chkSaveIncompleteRenders: TCheckBox; + lblCPUCores: TLabel; + cbAspectRatio: TComboBox; + lblRatio: TLabel; + chkEmbedFlame: TCheckBox; + chkPlaySound: TCheckBox; + btnSnapshot: TButton; + ProgressTaskbar: TTaskbar; + sbFilterRadius: TSpinButton; + procedure btnSaveLogClick(Sender: TObject); + procedure btnDonateClick(Sender: TObject); + procedure cbMaxMemoryChange(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure btnRenderClick(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure txtWidthChange(Sender: TObject); + procedure txtHeightChange(Sender: TObject); + procedure txtOversampleChange(Sender: TObject); + procedure txtFilenameChange(Sender: TObject); + procedure btnCancelClick(Sender: TObject); + procedure txtDensityChange(Sender: TObject); + procedure txtFilterRadiusExit(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure btnPauseClick(Sender: TObject); + procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); + procedure btnSavePresetClick(Sender: TObject); + procedure btnBrowseClick(Sender: TObject); + procedure btnDeletePresetClick(Sender: TObject); + procedure cmbPresetChange(Sender: TObject); + //procedure chkMaintainClick(Sender: TObject); + procedure chkSaveIncompleteRendersClick(Sender: TObject); + procedure btnGoToClick(Sender: TObject); + procedure cbAspectRatioChange(Sender: TObject); + procedure chkPlaySoundClick(Sender: TObject); + procedure FormActivate(Sender: TObject); + procedure btnSnapshotClick(Sender: TObject); + procedure NumFieldKeyPress(Sender: TObject; var Key: Char); + procedure sbFilterRadiusUpClick(Sender: TObject); + procedure sbFilterRadiusDownClick(Sender: TObject); + procedure txtDensityExit(Sender: TObject); + procedure cbWidthExit(Sender: TObject); + procedure cbHeightExit(Sender: TObject); + private + StartTime, EndTime, oldElapsed, edt: TDateTime; + oldProg: double; + + ApproxSamples: int64; + + procedure DoPostProcess; + + procedure HandleThreadCompletion(var Message: TMessage); + message WM_THREAD_COMPLETE; + procedure HandleThreadTermination(var Message: TMessage); + message WM_THREAD_TERMINATE; + procedure ListPresets; + function WindowsExit(RebootParam: Longword = EWX_POWEROFF or EWX_FORCE): Boolean; + procedure Save(const str: string); + function IsLimitingMemory():boolean; + + public + Renderer: TRenderThread; + PhysicalMemory, ApproxMemory, TotalPhysicalMemory: int64; + ColorMap: TColorMap; + cp: TControlPoint; + Filename: string; + ImageWidth, ImageHeight, Oversample: Integer; + // BitsPerSample: integer; Brightness, Gamma, Vibrancy: double; + zoom, Sample_Density, Filter_Radius: double; + center: array[0..1] of double; + MaxMemory: integer; + bRenderAll: boolean; + + procedure OnProgress(prog: double); + procedure ShowMemoryStatus; + procedure ResetControls; + end; + +function GetCpuCount: integer; // AV: this is used in Options + +var + RenderForm: TRenderForm; + Ratio: double; + +implementation + +uses + Main, Global, SavePreset, formPostProcess, PngImage, ImageMaker,Tracer; + +{$R *.DFM} + +function TRenderForm.IsLimitingMemory():boolean; +begin + Result := (cbMaxMemory.ItemIndex > 0); +end; + +procedure TRenderForm.ResetControls; +begin + txtFilename.Enabled := true; + btnBrowse.Enabled := true; + cbWidth.Enabled := true; + cbHeight.Enabled := true; + txtDensity.Enabled := true; + txtFilterRadius.enabled := true; + txtOversample.Enabled := true; + //chkLimitMem.Enabled := true; + cbMaxMemory.enabled := true; + //cbBitsPerSample.Enabled := true; + chkPostProcess.Enabled := not IsLimitingMemory; + chkSaveIncompleteRenders.Enabled := not IsLimitingMemory; + btnRender.Enabled := true; + cmbPreset.enabled := true; + btnSaveLog.Enabled := false; + chkSave.enabled := true; + chkPostProcess.enabled := true; + chkShutdown.enabled := true; + btnSavePreset.enabled := true; + btnDeletePreset.enabled := true; + btnCancel.Caption := TextByKey('common-close'); + btnPause.enabled := false; + //chkMaintain.Enabled := true; + cbAspectRatio.Enabled := true; // AV + btnSnapshot.Visible := false; // AV + + ProgressBar2.Position := 0; + ProgressTaskBar.ProgressValue := 0; // AV + ProgressTaskBar.ProgressState := TTaskBarProgressState.None; // AV + + pnlWidth.Enabled := true; + pnlHeight.Enabled := true; + pnlDensity.Enabled := true; + pnlFilter.Enabled := true; + pnlOversample.Enabled := true; + pnlLimit.Enabled := true; + pnlTarget.Enabled := true; + //pnlBufferDepth.Enabled := true; + + pnlWidth.Font.Color := clWindowText; + pnlHeight.Font.Color := clWindowText; + pnlDensity.Font.Color := clWindowText; + pnlFilter.Font.Color := clWindowText; + pnlOversample.Font.Color := clWindowText; + pnlLimit.Font.Color := clWindowText; + pnlTarget.Font.Color := clWindowText; + //pnlBufferDepth.Font.Color := clWindowText; + ShowMemoryStatus; +end; + +procedure WinShellExecute(const Operation, AssociatedFile: string); +var + a1: string; +begin + a1 := Operation; + if a1 = '' then + a1 := 'open'; + ShellExecute( + application.handle + , pchar(a1) + , pchar(AssociatedFile) + , '' + , '' + , SW_SHOWNORMAL + ); +end; + +function GetCpuCount: integer; +var + si: TSystemInfo; +begin; + GetSystemInfo(si); + Result := si.dwNumberOfProcessors; +end; + +procedure TRenderForm.ShowMemoryStatus; +var + GlobalMemoryInfo: TMemoryStatus; // holds the global memory status information +begin + GlobalMemoryInfo.dwLength := SizeOf(GlobalMemoryInfo); + GlobalMemoryStatus(GlobalMemoryInfo); + PhysicalMemory := GlobalMemoryInfo.dwAvailPhys div 1048576; + TotalPhysicalMemory := GlobalMemoryInfo.dwTotalPhys div 1048576; + //TotalPhysicalMemory := TotalPhysicalMemory * 9 div 10; // assume that OS will take 10% of RAM ;) + + if SingleBuffer then + ApproxMemory := int64(ImageHeight) * int64(ImageWidth) * sqr(Oversample) * 16 div 1048576 + else + ApproxMemory := int64(ImageHeight) * int64(ImageWidth) * sqr(Oversample) * 32 div 1048576; + + lblMemory.Caption := Format(TextByKey('render-resourceusage-infotext'), [ApproxMemory, PhysicalMemory]); + PBMem.Position := round(100 * (ApproxMemory / PhysicalMemory)); + + if ApproxMemory > PhysicalMemory then // AV: adapted for GUI styles + begin + // AV: exclude the style for the font to set its color properly + lblMemory.StyleElements := [seClient, seBorder]; + lblMemory.Font.Color := clRed; + end + else begin + lblMemory.StyleElements := [seClient, seBorder, seFont]; + lblMemory.Font.Color := clWindowText; + end; + + if NrTreads > GetCpuCount then NrTreads := GetCpuCount; // AV: only actual Nrs + { + lblCpuCores.Font.Color := clRed + else + lblCpuCores.Font.Color := clWindowText; + } + + lblCPUCores.Caption := Format(TextByKey('render-resourceusage-infotext2'), [NrTreads, GetCpuCount]); + //btnRender.Enabled := (ApproxMemory <= PhysicalMemory) or (cbMaxMemory.ItemIndex > 0); + + if ApproxMemory > 0 then + lblMaxbits.caption := format('%2.3f', [8 + log2( + sample_density * sqr(power(2, cp.zoom)) * int64(ImageHeight) * int64(ImageWidth) / sqr(oversample) + )]); +end; + +procedure Trace2(const str: string); +begin + if TraceLevel >= 2 then + RenderForm.Output.Lines.Add('. . ' + str); +end; + +procedure TRenderForm.Save(const str:string); +begin + Renderer.SaveImage(FileName); +end; + +procedure TRenderForm.sbFilterRadiusDownClick(Sender: TObject); // AV +var n: double; +begin + try + n := StrToFloat(txtFilterRadius.Text); + n := RoundTo(n - 0.05, -3); + if (n > 0) then + txtFilterRadius.Text := FloatToStr(n); + except + raise Exception.Create(TextByKey('render-status-invalidfilterradius')); + end; +end; + +procedure TRenderForm.sbFilterRadiusUpClick(Sender: TObject); // AV +var n: double; +begin + try + n := StrToFloat(txtFilterRadius.Text); + txtFilterRadius.Text := Format('%.3g', [n + 0.05]); + except + raise Exception.Create(TextByKey('render-status-invalidfilterradius')); + end; +end; + +procedure TRenderForm.HandleThreadCompletion(var Message: TMessage); +var + tryAgain: boolean; +begin + Trace2(MsgComplete + IntToStr(message.LParam)); + if not assigned(Renderer) then begin + Trace2(MsgNotAssigned); + exit; + end; + if Renderer.ThreadID <> message.LParam then begin + Trace2(MsgAnotherRunning); + exit; + end; + + EndTime := Now; + + repeat + tryAgain := false; + try + Save(FileName); + if ShowRenderImage then // AV + if FileExists(FileName) then + ShellExecute(Application.handle, PChar('open'), + PChar(ExtractFileName(FileName)), nil, PChar(renderPath), + SW_SHOWNORMAL); + except + on e: Exception do begin + Output.Lines.Add(TimeToStr(Now) + ' : ' + TextByKey('render-status-saveerror-log')); + tryAgain := (Application.MessageBox(PChar(TextByKey('render-status-saveerror-message1') + #13#10 + e.Message + + #13#10 + TextByKey('render-status-saveerror-message2')), 'Apophysis', MB_RETRYCANCEL or MB_ICONERROR) = IDRETRY); + // AV: displaying status in red + ProgressTaskBar.ProgressState := TTaskBarProgressState.Error; + end; + end; + until tryAgain = false; + + if PlaySoundOnRenderComplete then + if RenderCompleteSoundFile <> '' then + sndPlaySound(PChar(RenderCompleteSoundFile), SND_FILENAME or SND_NOSTOP or SND_ASYNC) + else + sndPlaySound(pchar(SND_ALIAS_SYSTEMASTERISK), SND_ALIAS_ID or SND_NOSTOP or SND_ASYNC); + + PageCtrl.TabIndex := 1; + if ShowRenderStats then + Renderer.ShowBigStats + else + Renderer.ShowSmallStats; + Output.Lines.Add(' ' + TextByKey('render-status-totaltime') + TimeToString(EndTime - StartTime)); + Output.Lines.Add(''); + + ProgressTaskBar.ProgressState := TTaskBarProgressState.None; // AV + + if not IsLimitingMemory and chkPostProcess.checked then + DoPostProcess; + + Renderer.Free; + Renderer := nil; + if not bRenderAll then ResetControls; + + btnSaveLog.Enabled := true; + + if chkShutdown.Checked and not bRenderAll then + WindowsExit; +end; + +procedure TRenderForm.HandleThreadTermination(var Message: TMessage); +begin + Trace2(MsgTerminated + IntToStr(message.LParam)); + if not assigned(Renderer) then begin + Trace2(MsgNotAssigned); + exit; + end; + if Renderer.ThreadID <> message.LParam then begin + Trace2(MsgAnotherRunning); + exit; + end; + + { + // AV: temporary commented out since undestroyed TBaseRenderer objects + // from Renderer.GetRenderer method cause regular large memory leaks! + + if Renderer.GetRenderer.Hibernated then + Output.Lines.Add(TimeToStr(Now) + ' : ' + TextByKey('render-status-renderhibernated')) + else } + Output.Lines.Add(TimeToStr(Now) + ' : ' + TextByKey('render-status-renderterminated')); + + Output.Lines.Add(''); + + ProgressTaskBar.ProgressState := TTaskBarProgressState.None; // AV + + sndPlaySound(pchar(SND_ALIAS_SYSTEMEXCLAMATION), SND_ALIAS_ID or SND_NOSTOP or SND_ASYNC); + + PageCtrl.TabIndex := 0; // AV: moved from btnCancelClick + + Renderer.Free; + Renderer := nil; + ResetControls; + + btnSaveLog.Enabled := true; +end; + +procedure TRenderForm.OnProgress(prog: double); +var + Elapsed, Remaining, dt: TDateTime; +begin + Elapsed := Now - StartTime; + dt := Elapsed - oldElapsed; + if (prog = 1.0) then begin + StatusBar.Panels[0].text := Format(TextByKey('render-status-elapsed') + ': %2.2d:%2.2d:%2.2d.%2.2d', + [Trunc(Elapsed * 24), + Trunc(Elapsed * 24 * 60) mod 60, + Trunc(Elapsed * 24 * 60 * 60) mod 60, + Trunc(Elapsed * 24 * 60 * 60 * 100) mod 100]); + StatusBar.Panels[1].text := TextByKey('render-status-remaining') + ': 00:00:00.00'; + exit; + end; + + //if (dt < 1/24/60/60/10) then exit; + if (dt < 1/24/60/60) then exit; // PB: too much time consuming... was every 1/10th seconds! + oldElapsed := Elapsed; + + prog := (Renderer.Slice + Prog) / Renderer.NrSlices; + if ShowProgress then begin + ProgressBar2.Position := round(100 * prog); + // AV: to display the progress on the taskbar + ProgressTaskBar.ProgressValue := ProgressBar2.Position; // AV + end; + + StatusBar.Panels[0].text := Format(TextByKey('render-status-elapsed') + ': %2.2d:%2.2d:%2.2d.%2.2d', + [Trunc(Elapsed * 24), + Trunc(Elapsed * 24 * 60) mod 60, + Trunc(Elapsed * 24 * 60 * 60) mod 60, + Trunc(Elapsed * 24 * 60 * 60 * 100) mod 100]); + + edt := edt + dt; + if (edt > 1/24/60/60/2) and (prog > 0) then + begin + Remaining := (1 - prog) * edt / (prog - oldProg); + edt := 0; + oldProg := prog; + + StatusBar.Panels[1].text := Format(TextByKey('render-status-remaining') + ': %2.2d:%2.2d:%2.2d.%2.2d', + [Trunc(Remaining * 24), + Trunc(Remaining * 24 * 60) mod 60, + Trunc(Remaining * 24 * 60 * 60) mod 60, + Trunc(Remaining * 24 * 60 * 60 * 100) mod 100]); + end; + StatusBar.Panels[2].text := Format(TextByKey('render-status-slicestatus'), [(Renderer.Slice + 1), (Renderer.nrSlices)]); + //'Slice ' + IntToStr(Renderer.Slice + 1) + ' of ' + IntToStr(Renderer.nrSlices); + Application.ProcessMessages; +end; + +procedure TRenderForm.FormCreate(Sender: TObject); +begin +{$ifdef Apo7X64} + cbMaxMemory.Items.Add('2048'); + cbMaxMemory.Items.Add('3072'); + cbMaxMemory.Items.Add('4096'); +{$endif} + + pnlWidth.Caption := TextByKey('common-width'); + pnlHeight.Caption := TextByKey('common-height'); + GroupBox2.Caption := TextByKey('common-size'); + cbAspectRatio.Items[0] := TextByKey('adjustment-tab-size-custom'); // AV + cbAspectRatio.Items[1] := TextByKey('common-keepaspect'); // AV + lblRatio.Caption := TextByKey('adjustment-tab-size-ratio'); // AV + pnlTarget.Caption := TextByKey('common-destination'); + btnBrowse.Hint := TextByKey('common-browse'); + GroupBox3.Caption := TextByKey('common-quality'); + pnlFilter.Caption := TextByKey('common-filterradius'); + pnlDensity.Caption := TextByKey('common-density'); + pnlOversample.Caption := TextByKey('common-oversample'); + btnRender.Caption := TextByKey('common-start'); + btnPause.Caption := TextByKey('common-pause'); + btnCancel.Caption := TextByKey('common-close'); + self.Caption := TextByKey('render-title'); + TabSettings.Caption := TextByKey('render-tab-settings-title'); + TabOutput.Caption := TextByKey('render-tab-output-title'); + btnGoTo.Hint := TextByKey('render-common-gotofolder'); + GroupBox4.Caption := TextByKey('render-resourceusage-title'); + pnlLimit.Caption := TextByKey('render-resourceusage-limit'); + //pnlBufferDepth.Caption := TextByKey('render-resourceusage-bufferdepth'); + chkSave.Caption := TextByKey('render-output-saveparams1'); + chkEmbedFlame.Caption := TextByKey('render-output-saveparams2'); + GroupBox6.Caption := TextByKey('render-completion-title'); + chkPostProcess.Caption := TextByKey('render-completion-postprocess'); + chkShutdown.Caption := TextByKey('render-completion-shutdown'); + chkPlaySound.Caption := TextByKey('render-completion-playsound'); + chkSaveIncompleteRenders.Caption := TextByKey('render-completion-saveincomplete'); + cbMaxMemory.Items[0] := TextByKey('render-resourceusage-nolimit') ; + Groupbox1.Caption := TextByKey('render-output-title'); + Groupbox5.Caption := TextByKey('render-presets-title'); + btnSavePreset.Hint := TextByKey('render-presets-save'); + btnDeletePreset.Hint := TextByKey('render-presets-delete'); + btnDonate.Caption := TextByKey('common-donate'); + btnDonate.Hint := TextByKey('common-donatehint'); + btnSnapshot.Caption := TextByKey('render-status-dosnapshot'); // AV + btnSnapshot.Hint := TextByKey('render-status-dosnapshothint'); + + cp := TControlPoint.Create; + cbMaxMemory.ItemIndex := 0; + cbAspectRatio.ItemIndex := 1; // AV + // BitsPerSample := 0; + MainForm.Buttons.GetBitmap(2, btnSavePreset.Glyph); + // MainForm.Buttons.GetBitmap(9, btnDeletePreset.Glyph); + bRenderAll := false; + ListPresets; +end; + +procedure TRenderForm.FormDestroy(Sender: TObject); +begin + if assigned(Renderer) then begin + Renderer.Terminate; + Renderer.WaitFor; + Renderer.Free; + end; + cp.free; +end; + +procedure TRenderForm.NumFieldKeyPress(Sender: TObject; var Key: Char); // AV +var cs: TSysCharSet; +begin + cs := ['0'..'9', #8]; + if Sender = txtFilterRadius then + begin + if (Key = ',') then Key := '.'; + include(cs, '.'); + end; + if not CharInSet(Key, cs) then Key:= #0; +end; + +procedure TRenderForm.btnRenderClick(Sender: TObject); +var + t: string; + iCurrFlame: integer; + path, ext: string; + lim:integer; + ilm:boolean; +{ sl: TStringList; + tryAgain: boolean; + cancel: boolean; + result: integer; } +begin + // overwrite target with 0b file + // this to test writability in output directory + {sl := TStringList.Create; + sl.Text := ''; + repeat + tryAgain := false; + cancel := false; + try + sl.SaveToFile(txtFileName.Text); + except + on e: Exception do begin + Output.Lines.Add(TimeToStr(Now) + ' : ' + TextByKey('render-status-saveerror-log')); + result := (Application.MessageBox(PChar(TextByKey('render-status-saveerror-message1') + #13#10 + e.Message + + #13#10 + TextByKey('render-status-saveerror-message2')), 'Apophysis', MB_RETRYCANCEL or MB_ICONERROR)); + tryAgain := (result = IDRETRY); + cancel := (result = IDCANCEL); + ProgressBar2.ProgressBarState := pbstError; + end; + end; + until (tryAgain = false) or (cancel = true); + sl.Destroy; } + + //if (cancel) then Exit; + Output.Text := ''; + + ImageWidth := StrToInt(cbWidth.text); + ImageHeight := StrToInt(cbHeight.text); + + ilm := IsLimitingMemory; + if (IsLimitingMemory) then begin + lim := StrToInt(cbMaxMemory.text); + MaxMemory := lim; + end + else lim := PhysicalMemory + 1; + + if not ilm then begin + if (ApproxMemory > {Total}PhysicalMemory) then + begin + if IDYES <> Application.MessageBox(PChar(TextByKey('render-status-notenoughmemory1')), 'Apophysis', MB_ICONWARNING or MB_YESNO) then + exit; + end; +{ + if (ApproxMemory > PhysicalMemory) then + begin + if Application.MessageBox('There is not enough memory for this render. ' + #13 + + 'You can use memory limiting, or - if you are sure that your system *should* ' + #13 + + 'have the required amount of free RAM, you can try to allocate memory anyway. ' + #13#13 + + 'Dou you want to try? (SLOW AND UNSTABLE - USE AT YOUR OWN RISK!!!)', 'Apophysis', + MB_ICONWARNING or MB_YESNO) <> IDYES then exit; + end; +} + end + else if (PhysicalMemory < lim) and (Approxmemory > PhysicalMemory) then begin + if IDYES <> Application.MessageBox(PChar(TextByKey('render-status-notenoughmemory2')), 'Apophysis', MB_ICONWARNING or MB_YESNO) then + exit; + end; + + t := txtFilename.Text; + if t = '' then + begin + Application.MessageBox(PChar(TextByKey('render-status-nofilename')), 'Apophysis', 48); + Exit; + end; + if FileExists(t) then + if Application.MessageBox(PChar(Format(TextByKey('render-status-fileexists-message1'), [t]) + #13#10 + TextByKey('render-status-fileexists-message2')), + 'Apophysis', 52) = ID_NO then exit; + if not DirectoryExists(ExtractFileDir(t)) then + raise Exception.Create(TextByKey('render-status-pathdoesnotexist')); // AV + + {Check for invalid values } + { AV: all MessageBoxes replaced by raised Exceptions for speed } + if (sample_density <= 0) then + raise Exception.Create(TextByKey('render-status-invaliddensity')); // AV + + if filter_radius <= 0 then + raise Exception.Create(TextByKey('render-status-invalidfilterradius')); // AV + { + // AV: how is it possible, if (udOversample.Min = 1) and (txtOversample.ReadOnly = true)? + if Oversample < 1 then + raise Exception.Create(TextByKey('render-status-invalidoversample')); // AV + } + if ImageWidth < 1 then + raise Exception.Create(TextByKey('render-status-invalidwidth')); // AV + + if ImageHeight < 1 then + raise Exception.Create(TextByKey('render-status-invalidheight')); // AV + + if (ilm) then + if lim * 1024*1024 < ImageWidth * (int64(ImageHeight) * 4 + oversample) then begin + // Must be enough memory to hold the final image (RGBA) + if IDYES <> Application.MessageBox(PChar(TextByKey('render-status-maxmemorytoosmall')), 'Apophysis', MB_ICONERROR or MB_YESNO) then + exit; + end; + + // AV: activate the taskbar progress + ProgressTaskBar.ProgressState := TTaskBarProgressState.Normal; // AV + ProgressTaskBar.ProgressValue := ProgressBar2.Position; // AV + + txtFilename.Enabled := false; + btnBrowse.Enabled := false; + cbWidth.Enabled := False; + cbHeight.Enabled := false; + txtDensity.Enabled := false; + txtFilterRadius.enabled := false; + txtOversample.Enabled := false; + //chkLimitMem.Enabled := true; + cbMaxMemory.Enabled := false; + //cbBitsPerSample.Enabled := false; + cmbPreset.enabled := false; + chkSave.enabled := false; + chkPostProcess.enabled := false; + chkShutdown.enabled := false; + btnSavePreset.enabled := false; + btnDeletePreset.enabled := false; + btnRender.Enabled := false; + btnSaveLog.Enabled := false; + btnPause.enabled := true; + btnCancel.Caption := TextByKey('common-cancel'); + //chkMaintain.Enabled := false; + cbAspectRatio.Enabled := False; + StartTime := Now; + + pnlWidth.Enabled := false; + pnlHeight.Enabled := false; + pnlDensity.Enabled := false; + pnlFilter.Enabled := false; + pnlOversample.Enabled := false; + pnlLimit.Enabled := false; + pnlTarget.Enabled := false; + //pnlBufferDepth.Enabled := false; + + pnlWidth.Font.Color := clGrayText; + pnlHeight.Font.Color := clGrayText; + pnlDensity.Font.Color := clGrayText; + pnlFilter.Font.Color := clGrayText; + pnlOversample.Font.Color := clGrayText; + pnlLimit.Font.Color := clGrayText; + pnlTarget.Font.Color := clGrayText; + //pnlBufferDepth.Font.Color := clGrayText; + + PageCtrl.TabIndex := 1; + + if Output.Lines.Count >= 1000 then Output.Lines.Clear; + + if bRenderAll then + begin + path := ExtractFilePath(FileName); + ext := ExtractFileExt(FileName); + + if Assigned(Renderer) then begin + Output.Lines.Add(TimeToStr(Now) + TextByKey('render-status-shuttingdownrender')); + Renderer.Terminate; + Renderer.WaitFor; + Renderer.Free; + Renderer := nil; + end; + + for iCurrFlame := 0 to MainForm.ListView1.Items.Count-1 do + begin + MainForm.ListView1.ItemIndex := iCurrFlame; + cp.Free; + cp := TControlPoint.Create; + cp.Copy(MainCP); + cp.cmap := maincp.cmap; + zoom := maincp.zoom; + Center[0] := MainForm.center[0]; + Center[1] := MainForm.center[1]; + FileName := path + cp.name + ext; + Output.Lines.Add('--- ' + Format(TextByKey('render-status-log-title'), [ExtractFileName(FileName)]) + ' ---'); + Output.Lines.Add(' ' + Format(TextByKey('render-status-log-size'), [ImageWidth, ImageHeight])); + Output.Lines.Add(' ' + Format(TextByKey('render-status-log-quality'), [sample_density])); + Output.Lines.Add(' ' + Format(TextByKey('render-status-log-oversampling'), [oversample, filter_radius])); + if SingleBuffer then + Output.Lines.Add(' ' + Format(TextByKey('render-status-log-bufferdepth'), ['32-bit float'])) + else + Output.Lines.Add(' ' + Format(TextByKey('render-status-log-bufferdepth'), ['64-bit float'])); + + if (ilm) then + Output.Lines.Add(' ' + Format(TextByKey('render-status-log-memorylimit'), [MaxMemory])) + else + if (UpperCase(ExtractFileExt(FileName)) = '.PNG') and + (ImageWidth * ImageHeight >= 20000000) then + begin + Output.Lines.Add(TextByKey('render-status-log-largepng-message1')); + Output.Lines.Add(TextByKey('render-status-log-largepng-message2')); + Output.Lines.Add(TextByKey('render-status-log-largepng-message3')); + end; + + if not Assigned(Renderer) then + begin + // disable screensaver + SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 0, nil, 0); + + cp.sample_density := Sample_density; + cp.spatial_oversample := Oversample; + cp.spatial_filter_radius := Filter_Radius; + cp.AdjustScale(ImageWidth, ImageHeight); + cp.Transparency := (PNGTransparency <> 0) and (UpperCase(ExtractFileExt(FileName)) = '.PNG'); + renderPath := ExtractFilePath(Filename); + if chkSave.checked then + MainForm.SaveXMLFlame(cp, ExtractFileName(FileName), renderPath + rendersAV); + + oldProg:=0; + oldElapsed:=0; + edt:=0; + ApproxSamples := Round(sample_density * sqr(power(2, cp.zoom)) * int64(ImageHeight) * int64(ImageWidth) / sqr(oversample) ); + + try + + if not bRenderAll then exit; + if iCurrFlame = MainForm.ListView1.Items.Count-1 then bRenderAll := false; + + Renderer := TRenderThread.Create; + assert(Renderer <> nil); +{ + if chkThreadPriority.Checked then + Renderer.SetPriority(tpLower) + else + Renderer.SetPriority(tpNormal); +} + Renderer.ExportBuffer := chkBinary.Checked; + // Renderer.BitsPerSample := BitsPerSample; + if (ilm) then + Renderer.MaxMem := lim; //StrToInt(cbMaxMemory.text); + Renderer.OnProgress := OnProgress; + Renderer.TargetHandle := self.Handle; + Renderer.SetCP(cp); + + if chkEmbedFlame.checked then + Renderer.EmbedText(Trim(MainForm.RetrieveXML(cp))); // AV + + Renderer.Priority := tpLower; // tpNormal; + Renderer.NrThreads := NrTreads; + Renderer.Output := Output.Lines; + Renderer.Resume; + + if bRenderAll then Renderer.WaitFor; + while Renderer <> nil do Application.ProcessMessages; // wait for HandleThreadCompletion + + except + Output.Lines.Add(TimeToStr(Now) + ' : ' + TextByKey('render-status-rendererror-log')); + //Application.MessageBox('Error while rendering!', 'Apophysis', 48); + end; + end; + end; + end else + begin + Output.Lines.Add('--- ' + Format(TextByKey('render-status-log-title'), [ExtractFileName(FileName)]) + '" ---'); + Output.Lines.Add(' ' + Format(TextByKey('render-status-log-size'), [ImageWidth, ImageHeight])); + Output.Lines.Add(' ' + Format(TextByKey('render-status-log-quality'), [sample_density])); + Output.Lines.Add(' ' + Format(TextByKey('render-status-log-oversampling'), [oversample, filter_radius])); + + if SingleBuffer then + Output.Lines.Add(' ' + Format(TextByKey('render-status-log-bufferdepth'), ['32-bit float'])) + else + Output.Lines.Add(' ' + Format(TextByKey('render-status-log-bufferdepth'), ['64-bit float'])); + + if (ilm) then + Output.Lines.Add(' ' + Format(TextByKey('render-status-log-memorylimit'), [lim])) + else + if (UpperCase(ExtractFileExt(FileName)) = '.PNG') and + (ImageWidth * ImageHeight >= 20000000) then + begin + Output.Lines.Add(TextByKey('render-status-log-largepng-message1')); + Output.Lines.Add(TextByKey('render-status-log-largepng-message2')); + Output.Lines.Add(TextByKey('render-status-log-largepng-message3')); + end; + + if Assigned(Renderer) then begin + Output.Lines.Add(TimeToStr(Now) + TextByKey('render-status-shuttingdownrender')); + Renderer.Terminate; + Renderer.WaitFor; + Renderer.Free; + Renderer := nil; + end; + + if not Assigned(Renderer) then + begin + // disable screensaver + SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 0, nil, 0); + + cp.sample_density := Sample_density; + cp.spatial_oversample := Oversample; + cp.spatial_filter_radius := Filter_Radius; + cp.AdjustScale(ImageWidth, ImageHeight); + cp.Transparency := (PNGTransparency <> 0) and (UpperCase(ExtractFileExt(FileName)) = '.PNG'); + renderPath := ExtractFilePath(Filename); + if chkSave.checked then + MainForm.SaveXMLFlame(cp, ExtractFileName(FileName), renderPath + rendersAV); + + oldProg:=0; + oldElapsed:=0; + edt:=0; + ApproxSamples := Round(sample_density * sqr(power(2, cp.zoom)) * int64(ImageHeight) * int64(ImageWidth) / sqr(oversample) ); + + try + + Renderer := TRenderThread.Create; + assert(Renderer <> nil); + + // Renderer.BitsPerSample := BitsPerSample; + if (ilm) then + Renderer.MaxMem := lim; //StrToInt(cbMaxMemory.text); + Renderer.ExportBuffer := chkBinary.Checked; + Renderer.OnProgress := OnProgress; + Renderer.TargetHandle := self.Handle; + Renderer.SetCP(cp); + if chkEmbedFlame.checked then + Renderer.EmbedText(Trim(MainForm.RetrieveXML(cp))); // AV + { + if chkThreadPriority.Checked then + Renderer.SetPriority(tpLower) + else + Renderer.SetPriority(tpNormal); + } + Renderer.Priority := tpLower; + Renderer.NrThreads := NrTreads; + + Renderer.Output := Output.Lines; + Renderer.Resume; + + except + Output.Lines.Add(TimeToStr(Now) + ' : ' + TextByKey('render-status-rendererror-log')); + Application.MessageBox(PChar(TextByKey('render-status-rendererror-message')), 'Apophysis', 48); + end; + end; + end; + // enable screensaver + SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 1, nil, 0); +end; + +procedure TRenderForm.FormShow(Sender: TObject); +var + Registry: TRegistry; +begin + { Read position from registry } + Registry := TRegistry.Create; + try + Registry.RootKey := HKEY_CURRENT_USER; + if Registry.OpenKey('Software\' + APP_NAME + '\Forms\Render', False) then + begin + if Registry.ValueExists('Left') then + self.Left := Registry.ReadInteger('Left'); + if Registry.ValueExists('Top') then + self.Top := Registry.ReadInteger('Top'); + end; + Registry.CloseKey; + finally + Registry.Free; + end; + + SaveDialog.FileName := Filename; + case renderFileFormat of + 1: txtFilename.Text := ChangeFileExt(SaveDialog.Filename, '.bmp'); + 2: txtFilename.Text := ChangeFileExt(SaveDialog.Filename, '.png'); + 3: txtFilename.Text := ChangeFileExt(SaveDialog.Filename, '.jpg'); + end; + chkEmbedFlame.Enabled := (renderFileFormat = 2); // AV + chkEmbedFlame.Checked := (chkEmbedFlame.Enabled and EmbedFlame); // AV + chkSave.Checked := SaveInFlame; // AV + if (renderOversample < 1) or (renderOversample > 4) then + renderOversample := 2; // AV: prevent checks in future + txtOversample.Text := IntToStr(renderOversample); + Filter_Radius := max(renderFilterRadius, 0.1); // AV: fixed! + txtFilterRadius.Text := FloatToStr(RoundTo(Filter_Radius, -3)); // AV + cbWidth.Text := IntToStr(cp.Width); + cbHeight.Text := IntToStr(cp.Height); + ImageWidth := StrToInt(cbWidth.Text); + ImageHeight := StrToInt(cbHeight.Text); + // AV: fixed "Floating point division by zero" bug + sample_density := max(renderDensity, 10); + txtDensity.Text := FloatToStr(sample_density); + // BitsPerSample := renderBitsPerSample; + ShowMemoryStatus; + Ratio := ImageWidth / ImageHeight; + chkSaveIncompleteRenders.Checked := SaveIncompleteRenders; + chkPlaySound.Checked := PlaySoundOnRenderComplete; // AV +end; + +procedure TRenderForm.txtWidthChange(Sender: TObject); +begin + try + ImageWidth := StrToInt(cbWidth.Text); + if (cbAspectRatio.ItemIndex > 0) and cbWidth.Focused then + begin + ImageHeight := Round(ImageWidth / ratio); + cbHeight.Text := IntToStr(ImageHeight) + end; + except + end; + ShowMemoryStatus; +end; + +procedure TRenderForm.txtHeightChange(Sender: TObject); +begin + try + ImageHeight := StrToInt(cbHeight.Text); + if (cbAspectRatio.ItemIndex > 0) and cbHeight.Focused then + begin + ImageWidth := Round(ImageHeight * ratio); + cbWidth.Text := IntToStr(ImageWidth) + end; + except + end; + ShowMemoryStatus; +end; + +procedure TRenderForm.txtOversampleChange(Sender: TObject); +var + o: integer; +begin + try + o := StrToInt(txtOversample.Text); + except + txtOversample.Text := IntToStr(Oversample); + exit; + end; + { + // AV: this text field is read-only, moved all checks to FormShow + if o > udOversample.Max then + begin + o := udOversample.Max; + txtOversample.Text := IntToStr(o); + end + else if o < udOversample.Min then + begin + o := udOversample.Min; + txtOversample.Text := IntToStr(o); + end; + } + Oversample := o; + ShowMemoryStatus; +end; + +procedure TRenderForm.txtFilenameChange(Sender: TObject); +var + ext : string; +begin + filename := txtFilename.text; + ext := LowerCase(ExtractFileExt(filename)); + chkEmbedFlame.Enabled := (ext = '.png'); // AV + chkEmbedFlame.Checked := (chkEmbedFlame.Enabled and EmbedFlame); +end; + +procedure TRenderForm.btnCancelClick(Sender: TObject); +begin + if Assigned(Renderer) or bRenderAll then + begin + if Assigned(Renderer) then + if Renderer.Suspended then begin + Renderer.Resume; + btnPause.caption := TextByKey('common-pause'); + end; + + if ConfirmStopRender then begin + if Application.MessageBox(PChar(TextByKey('render-status-confirmstop')), 'Apophysis', 36) = ID_NO then exit; + end; + + bRenderAll := false; + if Assigned(Renderer) then + begin + if SaveIncompleteRenders and (not IsLimitingMemory) then + Renderer.BreakRender + else + Renderer.Terminate; + Renderer.WaitFor; // ? + end; + + ProgressTaskBar.ProgressValue := 0; // AV + ProgressTaskBar.ProgressState := TTaskBarProgressState.None; // AV + end else + Close; +end; + +procedure TRenderForm.txtDensityChange(Sender: TObject); +begin + Sample_Density := StrToFloatDef(txtDensity.Text, renderDensity); // AV + if Sample_Density > 0 then ShowMemoryStatus; +end; + +procedure TRenderForm.txtDensityExit(Sender: TObject); // AV +begin + Sample_Density := StrToFloatDef(txtDensity.Text, renderDensity); + txtDensity.Text := FloatToStr(Sample_Density); +end; + +procedure TRenderForm.txtFilterRadiusExit(Sender: TObject); +begin + // AV: we don't need try - except here + Filter_Radius := StrToFloatDef(txtFilterRadius.Text, renderFilterRadius); + txtFilterRadius.Text := FloatToStr(Filter_Radius); // AV +end; + +procedure TRenderForm.FormActivate(Sender: TObject); +begin + chkPlaySound.Checked := PlaySoundOnRenderComplete; // AV + ShowMemoryStatus; //lblCPUCores.Refresh; +end; + +procedure TRenderForm.FormClose(Sender: TObject; var Action: TCloseAction); +var + Ext: string; + Registry: TRegistry; +begin + Ext := ExtractFileExt(txtFileName.Text); + if Ext = '.bmp' then renderFileFormat := 1; + if Ext = '.png' then renderFileFormat := 2; + if (Ext = '.jpg') or (Ext = '.jpeg') then renderFileFormat := 3; + renderFilterRadius := Filter_Radius; + renderWidth := ImageWidth; + renderHeight := ImageHeight; + renderDensity := Sample_density; + renderOversample := Oversample; + // renderBitsPerSample := BitsPerSample; + EmbedFlame := chkEmbedFlame.Checked; // AV + SaveInFlame := chkSave.Checked; // AV + + { Write position to registry } + Registry := TRegistry.Create; + try + Registry.RootKey := HKEY_CURRENT_USER; + if Registry.OpenKey('\Software\' + APP_NAME + '\Forms\Render', True) then + begin + Registry.WriteInteger('Top', Top); + Registry.WriteInteger('Left', Left); + end; + finally + Registry.Free; + end; +end; + +procedure TRenderForm.btnPauseClick(Sender: TObject); +begin + if Assigned(Renderer) then + if Renderer.Suspended = false then begin + renderer.Suspend; + btnPause.caption := TextByKey('common-resume'); + btnSnapshot.Visible := true; // AV + // AV: displaying progress in yellow + ProgressTaskBar.ProgressState := TTaskBarProgressState.Paused; + end else begin + renderer.Resume; + btnPause.caption := TextByKey('common-pause'); + btnSnapshot.Visible := false; // AV + // AV: restore the taskbar progress + ProgressTaskBar.ProgressState := TTaskBarProgressState.Normal; + end; +end; + +procedure TRenderForm.FormCloseQuery(Sender: TObject; + var CanClose: Boolean); +begin + if Assigned(Renderer) then + if Application.MessageBox(PChar(TextByKey('render-status-confirmstop')), 'Apophysis', 36) = ID_NO then + CanClose := False + else + begin + if Assigned(Renderer) then + begin + // AV: prevent Apo perpetual hanging when render is paused + if Renderer.Suspended then Renderer.Resume; // AV + Renderer.Terminate; + Renderer.WaitFor; + Renderer.Free; // AV + Renderer := nil; // AV + ProgressTaskBar.ProgressState := TTaskBarProgressState.None; // AV + end; + end; +end; + +procedure TRenderForm.btnSavePresetClick(Sender: TObject); +var + IFile: TextFile; + Title, Filename: string; +begin + SavePresetForm.txtPresetName.Text := cmbPreset.Text; + if SavePresetForm.ShowModal = mrOK then + begin + Title := Trim(SavePresetForm.txtPresetName.Text); + Filename := AppPath + 'Render presets.av'; + try + AssignFile(IFile, FileName); + if FileExists(FileName) then + begin + if EntryExists(Title, FileName) then DeleteEntry(Title, FileName); + Append(IFile); + end + else + ReWrite(IFile); + WriteLn(IFile, Title + ' {'); + WriteLn(IFile, Trim(cbWidth.text)); + WriteLn(IFile, Trim(cbHeight.text)); + WriteLn(IFile, Trim(txtDensity.text)); + WriteLn(IFile, Trim(txtFilterRadius.text)); + WriteLn(IFile, Trim(txtOversample.text)); + WriteLn(IFile, ExtractFileExt(txtFileName.Text)); + if (not IsLimitingMemory) then + WriteLn(IFile, 'true') + else + WriteLn(IFile, 'false'); + WriteLn(IFile, IntToStr(cbMaxMemory.ItemIndex)); + WriteLn(IFile, cbMaxMemory.Text); + WriteLn(IFile, '}'); + WriteLn(IFile, ''); + CloseFile(IFile); + except on EInOutError do + begin + Application.MessageBox(PChar(TextByKey('render-prestatus-saveerror-preset')), + PChar('Apophysis'), 16); + Exit; + end; + end; + ListPresets; + cmbPreset.ItemIndex := cmbPreset.Items.count - 1; + end; +end; + +procedure TRenderForm.btnSnapshotClick(Sender: TObject); +var + tryAgain: boolean; +begin + if Assigned(Renderer) then + if Renderer.Suspended = true then + begin + repeat + tryAgain := false; + try + Renderer.DoSnapshot; // AV: to save mid-render images + Renderer.SaveImage(FileName); + + if ShowRenderImage then // AV + if FileExists(FileName) then + ShellExecute(Application.handle, PChar('open'), + PChar(ExtractFileName(FileName)), nil, PChar(renderPath), + SW_SHOWNORMAL); + except + on e: Exception do begin + Output.Lines.Add(TimeToStr(Now) + ' : ' + TextByKey('render-status-saveerror-log')); + tryAgain := (Application.MessageBox(PChar(TextByKey('render-status-saveerror-message1') + #13#10 + e.Message + + #13#10 + TextByKey('render-status-saveerror-message1')), 'Error', MB_RETRYCANCEL or MB_ICONERROR) = IDRETRY); + // AV: displaying status in red + ProgressTaskBar.ProgressState := TTaskBarProgressState.Error; + end; + end; + until tryAgain = false; + end; +end; + +procedure TRenderForm.btnBrowseClick(Sender: TObject); +var + fn: string; + ext: string; +begin + SaveDialog.Filename := Filename; + case renderFileFormat of + 1: SaveDialog.DefaultExt := 'bmp'; + 2: SaveDialog.DefaultExt := 'png'; + 3: SaveDialog.DefaultExt := 'jpg'; + end; + SaveDialog.filterIndex := renderFileFormat; + SaveDialog.Filter := Format('%s|*.bmp;*.dib;*.jpg;*.jpeg|%s|*.bmp;*.dib|%s|*.jpg;*.jpeg|%s|*.png|%s|*.*', + [TextByKey('common-filter-allimages'), TextByKey('common-filter-bitmap'), + TextByKey('common-filter-jpeg'), TextByKey('common-filter-png'), + TextByKey('common-filter-allfiles')]); + if OpenSaveFileDialog(RenderForm, SaveDialog.DefaultExt, SaveDialog.Filter, SaveDialog.InitialDir, TextByKey('common-browse'), fn, false, true, false, false) then + //if SaveDialog.Execute then + begin + SaveDialog.FileName := fn; + ext := LowerCase(ExtractFileExt(fn)); + if (ext = '.bmp') then renderFileFormat := 1; + if (ext = '.png') then renderFileFormat := 2; + if ((ext = '.jpg') or (ext = '.jpeg')) then renderFileFormat := 3; + {case SaveDialog.FilterIndex of + 1: txtFilename.Text := ChangeFileExt(SaveDialog.Filename, '.bmp'); + 2: txtFilename.Text := ChangeFileExt(SaveDialog.Filename, '.png'); + 3: txtFilename.Text := ChangeFileExt(SaveDialog.Filename, '.jpg'); + end; } + txtFileName.Text := ChangeFileExt(fn, ext); + //renderFileFormat := SaveDialog.FilterIndex; + renderPath := ExtractFilePath(SaveDialog.Filename); + + end; +end; + +procedure TRenderForm.ListPresets; +{ List identifiers in file } +var + i, p: integer; + Title: string; + FStrings: TStringList; +begin + FStrings := TStringList.Create; + try + if fileExists(AppPath + 'Render presets.av') then begin + FStrings.LoadFromFile(AppPath + 'Render presets.av'); + cmbPreset.Clear; + if (Pos('{', FStrings.Text) <> 0) then begin + for i := 0 to FStrings.Count - 1 do begin + p := Pos('{', FStrings[i]); + if (p <> 0) then begin + Title := Trim(Copy(FStrings[i], 1, p - 1)); + if Title <> '' then begin + cmbPreset.Items.add(Copy(FStrings[i], 1, p - 1)); + end; + end; + end; + end; + end; + finally + FStrings.Free; + end; +end; + +procedure TRenderForm.btnDeletePresetClick(Sender: TObject); +var + Title, Filename: string; +begin + Title := Trim(cmbPreset.Text); + if Title = '' then exit; + Filename := AppPath + 'Render presets.av'; + if EntryExists(Title, FileName) then DeleteEntry(Title, FileName); + ListPresets; +end; + +procedure TRenderForm.cmbPresetChange(Sender: TObject); +var + chk: byte; //boolean; // AV + i, j: integer; + FStrings: TStringList; + Title, Filename: string; +begin + Title := Trim(cmbPreset.Text); + Filename := AppPath + 'Render presets.av'; // AV: added file extension + if Title = '' then exit; + if EntryExists(Title, FileName) then + begin + // Load preset + FStrings := TStringList.Create; + try + FStrings.LoadFromFile(Filename); + for i := 0 to FStrings.Count - 1 do + if Pos(LowerCase(Title) + ' {', Lowercase(FStrings[i])) <> 0 then + begin + //chk := chkMaintain.checked; + //chkMaintain.Checked := False; + chk := cbAspectRatio.ItemIndex; // AV + cbAspectRatio.ItemIndex := 0; + j := i + 1; + cbWidth.Text := FStrings[j]; + inc(j); + cbHeight.text := FStrings[j]; + //chkMaintain.Checked := chk; + cbAspectRatio.ItemIndex := chk; + inc(j); + txtDensity.text := FStrings[j]; + inc(j); + txtFilterRadius.text := FStrings[j]; + inc(j); + txtOversample.text := FStrings[j]; + inc(j); + txtFileName.Text := ChangeFileExt(txtFileName.Text, FStrings[j]); + inc(j); + //if Fstrings[j] = 'true' then (not IsLimitingMemory) else chkLimitMem.checked := false; + inc(j); + cbMaxMemory.ItemIndex := StrToInt(Fstrings[j]); + //cbMaxMemory.enabled := chkLimitMem.checked; + inc(j); + cbMaxMemory.Text := Fstrings[j]; + break; + end; + finally + FStrings.Free; + end + end; + ImageWidth := StrToInt(cbWidth.Text); + ImageHeight := StrToInt(cbHeight.Text); + Sample_Density := StrToFloat(txtDensity.Text); + ShowMemoryStatus; +end; + +{ +procedure TRenderForm.chkMaintainClick(Sender: TObject); +begin + Ratio := ImageWidth / ImageHeight; +end; +} + +procedure TRenderForm.DoPostProcess; +begin + frmPostProcess.cp := cp; + frmPostProcess.SetRenderer(Renderer.GetRenderer); + frmPostProcess.SetControlPoint(CP); + frmPostProcess.SetImageName(FileName); + frmPostProcess.Show; +end; + +function TRenderForm.WindowsExit(RebootParam: Longword = EWX_POWEROFF or EWX_FORCE): Boolean; +var + TTokenHd: THandle; + TTokenPvg: TTokenPrivileges; + cbtpPrevious: DWORD; + rTTokenPvg: TTokenPrivileges; + pcbtpPreviousRequired: DWORD; + tpResult: Boolean; +const + SE_SHUTDOWN_NAME = 'SeShutdownPrivilege'; +begin + if ((GetWinVersion = wvWinNT) or + (GetWinVersion = wvWin2000) or + (GetWinVersion = wvWinXP) or + (GetWinVersion = wvWinVista) or + (GetWinVersion = wvWin7) or + (GetWinVersion = wvWinFutureFromOuterSpace)) then + begin + tpResult := OpenProcessToken(GetCurrentProcess(), + TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, + TTokenHd); + if tpResult then + begin + tpResult := LookupPrivilegeValue(nil, + SE_SHUTDOWN_NAME, + TTokenPvg.Privileges[0].Luid); + TTokenPvg.PrivilegeCount := 1; + TTokenPvg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; + cbtpPrevious := SizeOf(rTTokenPvg); + pcbtpPreviousRequired := 0; + if tpResult then + Windows.AdjustTokenPrivileges(TTokenHd, + False, + TTokenPvg, + cbtpPrevious, + rTTokenPvg, + pcbtpPreviousRequired); + end; + end; + Result := ExitWindowsEx(RebootParam, 0); +end; + +procedure TRenderForm.chkPlaySoundClick(Sender: TObject); +begin + PlaySoundOnRenderComplete := chkPlaySound.Checked; +end; + +procedure TRenderForm.chkSaveIncompleteRendersClick(Sender: TObject); +begin + SaveIncompleteRenders := chkSaveIncompleteRenders.Checked; +end; + +procedure TRenderForm.btnGoToClick(Sender: TObject); +var + path:string; +begin + path := ExtractFilePath(txtFilename.Text); + if (path <> '') then WinShellExecute('open', path); +end; + + +procedure TRenderForm.cbAspectRatioChange(Sender: TObject); +begin + case cbAspectRatio.ItemIndex of + 1: Ratio := ImageWidth / ImageHeight; // AV: replaced "Keep aspect ratio" + 2: Ratio := 1.5; + 3: Ratio := 4 / 3; + 4: Ratio := 1.25; + 5: Ratio := 16 / 9; + 6: Ratio := 1.6; + 7: Ratio := 21 / 9; + end; +end; + +procedure TRenderForm.cbHeightExit(Sender: TObject); // AV +begin + ImageHeight := StrToIntDef(cbHeight.Text, renderHeight); + cbHeight.Text := IntToStr(ImageHeight); +end; + +procedure TRenderForm.cbWidthExit(Sender: TObject); // AV +begin + ImageWidth := StrToIntDef(cbWidth.Text, renderWidth); + cbWidth.Text := IntToStr(ImageWidth); +end; + +procedure TRenderForm.cbMaxMemoryChange(Sender: TObject); +begin + //cbMaxMemory.enabled := IsLimitingMemory; + chkPostProcess.Enabled := not IsLimitingMemory; + chkSaveIncompleteRenders.Enabled := not IsLimitingMemory; + //btnRender.Enabled := (ApproxMemory <= PhysicalMemory) or (cbMaxMemory.ItemIndex > 0); +end; + +procedure TRenderForm.btnDonateClick(Sender: TObject); +begin + WinShellExecute('open', 'https://www.donationalerts.com/r/fract_alice'); +end; + +procedure TRenderForm.btnSaveLogClick(Sender: TObject); +var + fn: string; + sl: TStringList; +begin + if OpenSaveFileDialog(RenderForm, '.log', + Format('Render-Log (*.txt;*.log)|*.txt;*.log|%s|*.*', [TextByKey('common-filter-allfiles')]), + SaveDialog.InitialDir, TextByKey('common-browse'), fn, false, true, false, false) + then begin + sl := TStringList.Create; + sl.Text := Output.Text; + sl.SaveToFile(fn); + sl.Destroy; + end; +end; + +end. + diff --git a/Forms/Fullscreen.dfm b/Forms/Fullscreen.dfm new file mode 100644 index 0000000..f7f52d9 --- /dev/null +++ b/Forms/Fullscreen.dfm @@ -0,0 +1,58 @@ +object FullscreenForm: TFullscreenForm + Left = 439 + Top = 325 + BorderStyle = bsNone + Caption = 'FullscreenForm' + ClientHeight = 131 + ClientWidth = 186 + Color = clBlack + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + PopupMenu = FullscreenPopup + OnClose = FormClose + OnCreate = FormCreate + OnDblClick = ImageDblClick + OnDestroy = FormDestroy + OnKeyPress = FormKeyPress + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object Image: TImage + Left = 0 + Top = 0 + Width = 186 + Height = 131 + PopupMenu = FullscreenPopup + OnDblClick = ImageDblClick + end + object Timelimiter: TTimer + Enabled = False + Interval = 2000 + OnTimer = TimelimiterOnTimer + Left = 8 + Top = 8 + end + object FullscreenPopup: TPopupMenu + Left = 40 + Top = 8 + object RenderStop: TMenuItem + Caption = '&Stop Render' + OnClick = RenderStopClick + end + object RenderMore: TMenuItem + Caption = 'Render &More' + OnClick = RenderMoreClick + end + object N1: TMenuItem + Caption = '-' + end + object Exit1: TMenuItem + Caption = '&Close' + OnClick = ImageDblClick + end + end +end diff --git a/Forms/Fullscreen.pas b/Forms/Fullscreen.pas new file mode 100644 index 0000000..d2d7dcf --- /dev/null +++ b/Forms/Fullscreen.pas @@ -0,0 +1,344 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} +unit Fullscreen; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + Menus, ExtCtrls, ControlPoint, RenderThread, Translation; + +type + TFullscreenForm = class(TForm) + Image: TImage; + Timelimiter: TTimer; + FullscreenPopup: TPopupMenu; + RenderStop: TMenuItem; + N1: TMenuItem; + Exit1: TMenuItem; + RenderMore: TMenuItem; + procedure FormShow(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure FormKeyPress(Sender: TObject; var Key: Char); + procedure ImageDblClick(Sender: TObject); + procedure TimelimiterOnTimer(Sender: TObject); + procedure RenderStopClick(Sender: TObject); + procedure RenderMoreClick(Sender: TObject); + + private + Remainder, StartTime, t: double; + imgLeft, imgTop, + imgWidth, imgHeight: integer; + Closing: boolean; + + Renderer: TRenderThread; + + procedure showTaskbar; + procedure hideTaskbar; + procedure DrawFlame; + procedure OnProgress(prog: double); + procedure HandleThreadCompletion(var Message: TMessage); + message WM_THREAD_COMPLETE; + procedure HandleThreadTermination(var Message: TMessage); + message WM_THREAD_TERMINATE; + + public + Calculate : boolean; + cp: TControlPoint; + Zoom: double; + center: array[0..1] of double; + + ActiveForm: TForm; + end; + +var + FullscreenForm: TFullscreenForm; + +implementation + +uses + Main, Math, Global, + Tracer; + +{$R *.DFM} + +procedure Trace1(const str: string); +begin + if TraceLevel >= 1 then + TraceForm.FullscreenTrace.Lines.Add('. ' + str); +end; + +procedure Trace2(const str: string); +begin + if TraceLevel >= 2 then + TraceForm.FullscreenTrace.Lines.Add('. . ' + str); +end; + +procedure TFullscreenForm.DrawFlame; +var + r: double; +begin + if (cp.width / cp.height) > (ClientWidth / ClientHeight) then + begin + imgWidth := ClientWidth; + r := cp.width / imgWidth; + imgHeight := round(cp.height / r); + imgLeft := 1; + imgTop := (ClientHeight - imgHeight) div 2; + end + else begin + imgHeight := ClientHeight; + r := cp.height / imgHeight; + imgWidth := round(cp.Width / r); + imgTop := 1; + imgLeft := (ClientWidth - ImgWidth) div 2; + end; + cp.AdjustScale(imgWidth, imgHeight); + +// cp.Zoom := MainForm.Zoom; +// cp.center[0] := MainForm.center[0]; +// cp.center[1] := MainForm.center[1]; + cp.sample_density := defSampleDensity; + StartTime := Now; + t := now; + Remainder := 1; + + if Assigned(Renderer) then begin // hmm... + Trace2('Killing previous RenderThread #' + inttostr(Renderer.ThreadID)); + Renderer.Terminate; + Renderer.WaitFor; + + while Renderer <> nil do + Application.ProcessMessages; // HandleThreadTermination kinda should be called here...(?) + end; + + assert(not assigned(renderer), 'Render thread is still running!?'); + + Renderer := TRenderThread.Create; // Hmm... Why do we use RenderThread here, anyway? :-\ + Renderer.TargetHandle := Handle; + Renderer.OnProgress := OnProgress; + Renderer.NrThreads := NrTreads; // AV: fixed Apo7X glitch here + if TraceLevel > 0 then Renderer.Output := TraceForm.FullscreenTrace.Lines; + Renderer.SetCP(cp); + + Renderer.WaitForMore := true; + RenderStop.Enabled := true; + RenderMore.Enabled := false; + + Renderer.Resume; +end; + +procedure TFullscreenForm.HandleThreadCompletion(var Message: TMessage); +var + bm: TBitmap; +begin + Trace2(MsgComplete + IntToStr(message.LParam)); + if not Assigned(Renderer) then begin + Trace2(MsgNotAssigned); + exit; + end; + if Renderer.ThreadID <> message.LParam then begin + Trace2(MsgAnotherRunning); + exit; + end; + + if Assigned(Renderer) then + begin + bm := TBitmap.Create; + bm.assign(Renderer.GetImage); + Image.SetBounds(imgLeft, imgTop, imgWidth, imgHeight); + Image.Picture.Graphic := bm; + bm.Free; + end; + + RenderStop.Enabled := false; + RenderMore.Enabled := true; + + TimeLimiter.Enabled := false; +end; + +procedure TFullscreenForm.HandleThreadTermination(var Message: TMessage); +var + bm: TBitmap; +begin + Trace2(MsgTerminated + IntToStr(message.LParam)); + if not Assigned(Renderer) then begin + Trace2(MsgNotAssigned); + exit; + end; + if Renderer.ThreadID <> message.LParam then begin + Trace2(MsgAnotherRunning); + exit; + end; + + RenderStop.Enabled := false; + RenderMore.Enabled := false; + + TimeLimiter.Enabled := false; +end; + +procedure TFullscreenForm.OnProgress(prog: double); +begin + prog := (Renderer.Slice + Prog) / Renderer.NrSlices; + Canvas.Lock; + try + if prog >= 1 then + begin + Canvas.Brush.Color := clBlack; + Canvas.FillRect(Rect(5, ClientHeight - 15, ClientWidth - 5, ClientHeight - 5)); + end + else if prog >= 0 then begin + Canvas.Brush.Color := clTeal; + Canvas.FrameRect(Rect(5, ClientHeight - 15, ClientWidth - 5, ClientHeight - 5)); + Canvas.Brush.Color := clTeal; + Canvas.Fillrect(Rect(7, ClientHeight - 13, 7 + Round(prog * (ClientWidth - 14)), ClientHeight - 7)); + Canvas.Brush.Color := clBlack; + Canvas.Fillrect(Rect(7 + Round(prog * (ClientWidth - 14)), ClientHeight - 13, ClientWidth - 7, ClientHeight - 7)); + end; + finally + Canvas.Unlock; + end; + //Application.ProcessMessages; +end; + +procedure TFullscreenForm.hideTaskbar; +var wndHandle: THandle; + wndClass: array[0..50] of Char; +begin + StrPCopy(@wndClass[0], 'Shell_TrayWnd'); + wndHandle := FindWindow(@wndClass[0], nil); + ShowWindow(wndHandle, SW_HIDE); +end; + +procedure TFullscreenForm.showTaskbar; +var wndHandle: THandle; + wndClass: array[0..50] of Char; +begin + StrPCopy(@wndClass[0], 'Shell_TrayWnd'); + wndHandle := FindWindow(@wndClass[0], nil); + ShowWindow(wndHandle, SW_RESTORE); +end; + +procedure TFullscreenForm.FormShow(Sender: TObject); +begin + Trace1('--- Opening Fullscreen View ---'); + + if Image.Width < ClientWidth then + Image.Left := (ClientWidth - Image.Width) div 2; + if Image.Height < ClientHeight then + Image.Top := (ClientHeight - Image.Height) div 2; + + Closing := false; + TimeLimiter.Enabled := false; + + RenderStop.Enabled := false; + RenderMore.Enabled := false; + + MainForm.mnuFullScreen.enabled := true; + HideTaskbar; + + if calculate then + DrawFlame; +end; + +procedure TFullscreenForm.FormClose(Sender: TObject; + var Action: TCloseAction); +begin + Closing := true; + if Assigned(Renderer) then begin + if Renderer.Suspended then begin + Renderer.WaitForMore := false; + Renderer.Resume; + end; + Trace2('Form closing: killing RenderThread #' + inttostr(Renderer.ThreadID)); + Renderer.Terminate; + Renderer.WaitFor; + + Trace2('Destroying RenderThread #' + IntToStr(Renderer.ThreadID)); + Renderer.Free; + Renderer := nil; + end; + Trace1('--- Closing Fullscreen View ---'); + Trace1(''); + ShowTaskbar; + + ActiveForm.SetFocus; +end; + +procedure TFullscreenForm.FormCreate(Sender: TObject); +begin + Exit1.Caption := TextByKey('common-close'); + RenderMore.Caption := TextByKey('fullscreen-popup-rendermore'); + RenderStop.Caption := TextByKey('fullscreen-popup-stoprender'); + cp := TControlPoint.Create; +end; + +procedure TFullscreenForm.FormDestroy(Sender: TObject); +begin + if assigned(Renderer) then begin + Renderer.Terminate; + Renderer.WaitFor; + Renderer.Free; + end; + cp.Free; +end; + +procedure TFullscreenForm.FormKeyPress(Sender: TObject; var Key: Char); +begin + if key = ' ' then begin + if RenderStop.Enabled then RenderStop.Click + else if RenderMore.Enabled then RenderMore.Click; + end + else Close; +end; + +procedure TFullscreenForm.ImageDblClick(Sender: TObject); +begin + Close; +end; + +procedure TFullscreenForm.TimelimiterOnTimer(Sender: TObject); +begin + //if assigned(Renderer) then Renderer.Break; + TimeLimiter.Enabled := false; +end; + +procedure TFullscreenForm.RenderStopClick(Sender: TObject); +begin + if assigned(Renderer) then Renderer.BreakRender; +end; + +procedure TFullscreenForm.RenderMoreClick(Sender: TObject); +begin + if assigned(Renderer) and Renderer.Suspended then begin + Renderer.Resume; + RenderStop.Enabled := true; + RenderMore.Enabled := false; + end; +end; + +end. + diff --git a/Forms/LoadTracker.dfm b/Forms/LoadTracker.dfm new file mode 100644 index 0000000..55513b5 --- /dev/null +++ b/Forms/LoadTracker.dfm @@ -0,0 +1,120 @@ +object LoadForm: TLoadForm + Left = 443 + Top = 274 + ActiveControl = Button1 + Anchors = [akLeft, akTop, akRight, akBottom] + Caption = 'Messages' + ClientHeight = 388 + ClientWidth = 662 + Color = clBtnFace + Constraints.MinHeight = 275 + Constraints.MinWidth = 550 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + FormStyle = fsStayOnTop + Icon.Data = { + 0000010001001010000001002000680400001600000028000000100000002000 + 0000010020000000000040040000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000006349 + 35146349352E927A69FF8C7563FF87705EFF6349352E7F6654FF7A624FFF755D + 4AFF6349352E6E5441FF6A513EFF674E3AFF6349352E00000000000000006349 + 352EAE9888FFEFE3DDFFF2E7E1FFEDDFD7FF836B59FFB79B8BFFDBBDADFFD9B7 + A6FF725946FFAE8B77FFD0A692FFCC9E87FF654B38FF6349352E00000000B7A2 + 93FFFBF8F7FFF9F4F2FFF7F0ECFFF4EBE6FFF1E5DFFF7F6754FF7A624FFF765D + 4AFF735946FF6E5542FF6B523EFF674E3AFF654B38FF634935FF00000000B7A2 + 93FFFDFCFBFFFBF9F7FFFAF5F2FFF7EFEDFFF4EAE6FFF2E5DFFFDDDCD7FFDFD7 + CEFFDECDC0FFDEC5B6FFDEBFACFFDBBAA6FFD8B5A3FF634935FF00000000B7A2 + 93FFFFFFFFFFB47F65FFB47F64FFEDDDD5FFB37E63FFF4EBE6FFF1E5DFFFEFDF + D7FFEBD9D1FFE8D3C9FFE5CDC1FFE1C6B9FFD6B3A1FF634A35FF00000000B9A4 + 95FFFFFFFFFFFFFFFFFFFDFCFCFFFCF9F7FFFAF4F2FFF6F0ECFFF4EBE5FFF2E5 + DFFFEEDFD8FFEBD9D0FFE8D3C8FFE5CCC1FFDBBDADFF634A36FF00000000BDA7 + 98FFFFFFFFFF968E88FFEEDED7FF968E87FFEDDDD6FF968D86FF958C85FFF4EB + E6FFF2E5DFFFEFDFD8FFECD9D0FFE8D3C9FFE0C7BAFF634A35FF00000000C1AB + 9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFCFCFFFBF8F7FFFAF4F2FFF7F0 + ECFFF4EAE6FFF1E5DFFFEEDFD7FFEBD9D0FFE6D1C6FF634A35FF00000000C5AF + A0FFFFFFFFFFB48065FFB48065FF968E88FFC2B0A3FF968E87FF968E86FFF9F4 + F2FFF7EFECFFF4EBE6FFF2E5DFFFEFDFD8FFEADBD1FF634936FF00000000C8B2 + A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFCFCFFFCF8 + F7FFF9F5F2FFF7F0ECFFF4EBE6FFF1E5DFFFEEE2DAFF644A36FF00000000C9B4 + A5FFFFFFFFFFFFFFFFFF66A365FF66A365FF66A365FFC0B4ADFF66A365FF66A3 + 65FF66A264FFFAF5F2FFF7F0ECFFF4EBE6FFEEE2DAFF644A36FF00000000C8B2 + A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFEFCFBFFFBF9F7FFFAF4F2FFF7F0EDFFF3EAE4FF644A36FF00000000C8B2 + A3FFCAB4A5FFCBB5A6FFCAB4A5FFC9B3A4FFC7B2A3FFC6B0A1FFC3AE9FFFC1AC + 9DFFBFAA9BFFBDA899FFBBA697FFB9A495FFB8A394FFB7A293FF000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + 0000FFFF00000003000000010000000100000001000000010000000100000001 + 0000000100000001000000010000000100000001000000010000FFFF0000} + OldCreateOrder = False + OnCreate = FormCreate + OnResize = FormResize + DesignSize = ( + 662 + 388) + PixelsPerInch = 96 + TextHeight = 13 + object Bevel1: TBevel + Left = 7 + Top = 7 + Width = 533 + Height = 308 + Anchors = [akLeft, akTop, akRight, akBottom] + Style = bsRaised + end + object Button1: TButton + Left = 527 + Top = 359 + Width = 110 + Height = 22 + Anchors = [akRight, akBottom] + Caption = 'Close' + TabOrder = 0 + OnClick = Button1Click + end + object CheckBox1: TCheckBox + Left = 8 + Top = 360 + Width = 384 + Height = 24 + Anchors = [akLeft, akRight, akBottom] + Caption = 'Automatically open this window when loading flame' + TabOrder = 1 + WordWrap = True + OnClick = CheckBox1Click + end + object Button2: TButton + Left = 406 + Top = 359 + Width = 110 + Height = 22 + Anchors = [akRight, akBottom] + Caption = 'Clear' + TabOrder = 2 + OnClick = Button2Click + end + object Output: TMemo + Left = 8 + Top = 8 + Width = 528 + Height = 303 + BevelOuter = bvRaised + BorderStyle = bsNone + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clBtnText + Font.Height = -12 + Font.Name = 'Courier New' + Font.Style = [] + ParentFont = False + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 3 + end +end diff --git a/Forms/LoadTracker.pas b/Forms/LoadTracker.pas new file mode 100644 index 0000000..3d59b3c --- /dev/null +++ b/Forms/LoadTracker.pas @@ -0,0 +1,105 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit LoadTracker; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls, Global, Settings, ExtCtrls, Translation; + +type + TLoadForm = class(TForm) + Button1: TButton; + CheckBox1: TCheckBox; + Button2: TButton; + Bevel1: TBevel; + Output: TMemo; + procedure FormResize(Sender: TObject); + procedure Button1Click(Sender: TObject); + procedure CheckBox1Click(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure Button2Click(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + LoadForm: TLoadForm; + +implementation + +{$R *.dfm} + +procedure TLoadForm.Button1Click(Sender: TObject); +begin + Close; +end; + +procedure TLoadForm.CheckBox1Click(Sender: TObject); +begin + AutoOpenLog := CheckBox1.Checked; +end; + +procedure TLoadForm.FormCreate(Sender: TObject); +begin + Button2.Caption := TextByKey('common-clear'); + Button1.Caption := TextByKey('common-close'); + self.Caption := TextByKey('messages-title'); + CheckBox1.Caption := TextByKey('messages-openautomatically'); + CheckBox1.Checked := AutoOpenLog; +end; + +procedure TLoadForm.Button2Click(Sender: TObject); +begin + Output.Text := ''; +end; + +procedure TLoadForm.FormResize(Sender: TObject); +begin + CheckBox1.Left := 2; + Checkbox1.Top := self.ClientHeight - Checkbox1.Height - 2; + CheckBox1.Width := self.ClientWidth - button1.Width - button2.Width - 8; + + Button1.Left := self.ClientWidth - button1.Width - button2.Width - 4; + Button1.Top := self.ClientHeight - Checkbox1.Height - 2 + Checkbox1.Height div 2 - Button1.Height div 2; + + Button2.Left := self.ClientWidth - button2.Width - 2; + Button2.Top := Button1.Top; + + Bevel1.Left := 2; + Bevel1.Top := 2; + Bevel1.Width := self.ClientWidth - 4; + Bevel1.Height := self.ClientHeight - 6 - checkbox1.Height; + + Output.Left := Bevel1.Left + 2; + Output.Top := Bevel1.Top + 2; + Output.Width := Bevel1.Width - 4; + Output.Height := Bevel1.Height -4; +end; + +end. diff --git a/Forms/Main.dfm b/Forms/Main.dfm new file mode 100644 index 0000000..046164d --- /dev/null +++ b/Forms/Main.dfm @@ -0,0 +1,4009 @@ +object MainForm: TMainForm + Left = 265 + Top = 172 + Caption = 'Apophysis AV' + ClientHeight = 692 + ClientWidth = 1000 + Color = clBtnFace + Constraints.MinHeight = 240 + Constraints.MinWidth = 320 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Icon.Data = { + 0000010001001818000001000800C80600001600000028000000180000003000 + 00000100080000000000A0020000000000000000000000000000000000000000 + 0000002040000020600040204000004040000040600000008000002080000020 + A0004020A00000408000006080000040A0000060A000404080004060A0000020 + C0000020E0000040C0000060C0000040E0000060E0004040E0004060E0000080 + A0004080A0000080C00000A0C0000080E00000A0E0004080C00040A0C0004080 + E00040A0E00000C0E00040C0E00040E0E00080E0E000C0DCC000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000001000101020200010102000200000100000100000000000001010700 + 0101020A08010005010102000001000000000000000000020A05012120010002 + 0D0201000000000000000101000000010414010722080C102107020200000000 + 000001010001020A0B0C1C131D141D150D02010C020000000000010100010202 + 07081D1C15121D1C020003001301000000000000010201081E211C1C200D0721 + 21150A000001010100010000040A02020C141D23251408121F0A020A05010000 + 00000000021815010A141C252517080C21070A0C1C01000000000A1C17081B1C + 0201162024231223060C15000001000100000101020C12230C07021523211313 + 100C07000101000100010100020520210C01001E21200C1C0701000000000000 + 00020112190821220F00071C210C01010101000001000101010812121A132421 + 0C020C1321120A020A010001000001000E08071A12172323171701072407121C + 0B01000000000D15020D0A240614172623112002021B0B01010100010000010A + 010C0F1D081217251D1C120A07020500000000010100010001171723120C141C + 1524130F07020100010000000000050F010000101D1C121C1C0C120202010101 + 010001000000000A07010A201320141C121D0219070201000100000000000000 + 02050D2010021A15000802050000000002000000000000000002021C0001091D + 13000D02010100000000000000000100000200050101020A0201010101000100 + 0000000000000000000200020001070001000201050000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000} + KeyPreview = True + Menu = MainMenu + OldCreateOrder = True + Position = poDefault + OnActivate = FormActivate + OnClose = FormClose + OnCloseQuery = FormCloseQuery + OnCreate = FormCreate + OnDestroy = FormDestroy + OnDeactivate = FormDeactivate + OnKeyDown = FormKeyUpDown + OnKeyPress = FormKeyPress + OnKeyUp = FormKeyUpDown + OnResize = FormResize + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object Image1: TImage + Left = 48 + Top = 104 + Width = 105 + Height = 105 + end + object Splitter: TSplitter + Left = 161 + Top = 22 + Width = 4 + Height = 651 + ExplicitHeight = 750 + end + object BackPanel: TPanel + Left = 165 + Top = 22 + Width = 835 + Height = 651 + Align = alClient + BevelInner = bvLowered + BevelOuter = bvNone + Color = clAppWorkSpace + TabOrder = 0 + OnResize = BackPanelResize + object Image: TImage + Left = 1 + Top = 1 + Width = 833 + Height = 649 + Align = alClient + Anchors = [] + Center = True + PopupMenu = DisplayPopup + Proportional = True + OnDblClick = ImageDblClick + OnMouseDown = ImageMouseDown + OnMouseMove = ImageMouseMove + OnMouseUp = ImageMouseUp + ExplicitTop = -4 + end + end + object ListBackPanel: TPanel + Left = 0 + Top = 22 + Width = 161 + Height = 651 + Align = alLeft + Alignment = taLeftJustify + BevelInner = bvLowered + BevelOuter = bvNone + Color = clWindow + Ctl3D = True + ParentCtl3D = False + TabOrder = 1 + object Shape1: TShape + Left = 1 + Top = 1 + Width = 159 + Height = 649 + Align = alClient + Brush.Color = clWindow + Pen.Color = clWindow + ExplicitHeight = 748 + end + object ListView1: TListView + Left = 1 + Top = 1 + Width = 159 + Height = 649 + Align = alClient + BorderStyle = bsNone + Columns = < + item + Caption = 'Title' + Width = 160 + end + item + Width = 40 + end> + DoubleBuffered = True + FlatScrollBars = True + IconOptions.AutoArrange = True + LargeImages = UsedThumbnails + ParentDoubleBuffered = False + PopupMenu = ListPopUp + TabOrder = 0 + OnChange = ListViewChange + OnColumnClick = ListViewColumnClick + OnDblClick = ListViewDblClick + OnEdited = ListViewEdited + end + end + object cbMain: TCoolBar + Left = 0 + Top = 0 + Width = 1000 + Height = 22 + AutoSize = True + BandBorderStyle = bsNone + Bands = < + item + Control = ToolBar + FixedBackground = False + ImageIndex = -1 + MinHeight = 22 + MinWidth = 100 + Width = 998 + end> + Color = clBtnFace + Ctl3D = False + EdgeBorders = [] + EdgeInner = esNone + EdgeOuter = esNone + FixedSize = True + FixedOrder = True + ParentColor = False + object ToolBar: TToolBar + Left = 2 + Top = 0 + Width = 998 + Height = 22 + Align = alClient + ButtonHeight = 23 + Images = Buttons + ParentShowHint = False + ShowHint = True + TabOrder = 0 + object btNew: TToolButton + Left = 0 + Top = 0 + Hint = 'New Flame | Create a new fractal project' + Caption = 'btNew' + ImageIndex = 65 + OnClick = btNewClick + end + object btnOpen: TToolButton + Left = 23 + Top = 0 + Hint = 'Open (Ctrl+O) | Open a parameter file for browsing' + Caption = 'btnOpen' + ImageIndex = 1 + OnClick = mnuOpenClick + end + object btnSave: TToolButton + Left = 46 + Top = 0 + Hint = 'Save fractal parameters (Ctrl+S)|Save parameters to a flame file' + Caption = 'btnSave' + ImageIndex = 3 + OnClick = mnuSaveAsClick + end + object ToolButton10: TToolButton + Left = 69 + Top = 0 + Width = 8 + Caption = 'ToolButton10' + ImageIndex = 39 + Style = tbsSeparator + end + object btnRender: TToolButton + Left = 77 + Top = 0 + Hint = 'Render (Ctrl+R) | Save the current flame to disk as a picture' + Caption = 'btnRender' + ImageIndex = 35 + OnClick = mnuRenderClick + end + object tbRenderAll: TToolButton + Left = 100 + Top = 0 + Hint = 'Render all | Save all fractals as pictures' + Caption = 'tbRenderAll' + ImageIndex = 64 + OnClick = mnuRenderAllClick + end + object ToolButton9: TToolButton + Left = 123 + Top = 0 + Width = 8 + ImageIndex = 8 + Style = tbsSeparator + end + object btnViewList: TToolButton + Left = 131 + Top = 0 + Hint = 'List View | Change the flame list view to a report (single text)' + Caption = 'Flame list view' + ImageIndex = 54 + OnClick = btnViewListClick + end + object btnViewIcons: TToolButton + Left = 154 + Top = 0 + Hint = 'Thumbnail View | Change a flame list view to icons' + Caption = 'Flame icon view' + ImageIndex = 55 + OnClick = btnViewIconsClick + end + object ToolButton2: TToolButton + Left = 177 + Top = 0 + Width = 8 + Caption = 'ToolButton2' + ImageIndex = 39 + Style = tbsSeparator + end + object btnUndo: TToolButton + Left = 185 + Top = 0 + Hint = 'Undo (Ctrl+Z)|Undo the last action' + Caption = 'btnUndo' + ImageIndex = 4 + OnClick = mnuUndoClick + end + object btnRedo: TToolButton + Left = 208 + Top = 0 + Hint = 'Redo (Ctrl+Y) | Redo the last cancelled action' + Caption = 'btnRedo' + ImageIndex = 5 + OnClick = mnuRedoClick + end + object ToolButton1: TToolButton + Left = 231 + Top = 0 + Width = 8 + ImageIndex = 18 + Style = tbsSeparator + end + object btnReset: TToolButton + Left = 239 + Top = 0 + Hint = + 'Reset Location (F12) | Recalculate the flame size and position ' + + ' ' + Caption = 'btnReset' + ImageIndex = 12 + OnClick = mnuResetLocationClick + end + object btnFullScreen: TToolButton + Left = 262 + Top = 0 + Hint = + 'Fullscreen (F3) | Fullscreen View (F3)|Show full-screen view of ' + + 'the f' + Caption = 'btnFullScreen' + ImageIndex = 52 + OnClick = mnuFullScreenClick + end + object ToolButton3: TToolButton + Left = 285 + Top = 0 + Width = 8 + Caption = 'ToolButton3' + ImageIndex = 54 + Style = tbsSeparator + end + object tbQualityBox: TComboBoxEx + Left = 293 + Top = 0 + Width = 69 + Height = 22 + Hint = + 'Rendering quality | Set flame quality (density) for the main pre' + + 'view window' + ItemsEx = < + item + Caption = '5' + end + item + Caption = '10' + end + item + Caption = '15' + end + item + Caption = '25' + end + item + Caption = '50' + end + item + Caption = '100' + end + item + Caption = '150' + end + item + Caption = '250' + end + item + Caption = '500' + end + item + Caption = '1000' + end> + TabOrder = 0 + OnExit = tbQualityBoxSet + OnKeyPress = tbQualityBoxKeyPress + OnSelect = tbQualityBoxSet + end + object ToolButton4: TToolButton + Left = 362 + Top = 0 + Width = 8 + Caption = 'ToolButton4' + ImageIndex = 55 + Style = tbsSeparator + end + object tbEditor: TToolButton + Left = 370 + Top = 0 + Caption = 'tbEditor' + ImageIndex = 19 + OnClick = mnuEditorClick + end + object tbAdjust: TToolButton + Left = 393 + Top = 0 + Hint = 'Adjustment | Adjust the position, size and colors of the flame' + Caption = 'tbAdjust' + ImageIndex = 18 + OnClick = mnuAdjustClick + end + object tbPalette: TToolButton + Left = 416 + Top = 0 + Hint = 'Gradient | Change a color palette of the flame' + Caption = 'tbPalette' + ImageIndex = 11 + OnClick = mnuGradClick + end + object tbCurves: TToolButton + Left = 439 + Top = 0 + Hint = 'Curves | Edit color curves of the fractal image' + Caption = 'Curves' + ImageIndex = 69 + OnClick = tbCurvesClick + end + object tbMutate: TToolButton + Left = 462 + Top = 0 + Hint = + 'Mutation | Show randomly generated modifications of the current ' + + 'flame' + Caption = 'tbMutate' + ImageIndex = 17 + OnClick = mnuMutateClick + end + object tbImageSize: TToolButton + Left = 485 + Top = 0 + Hint = 'Image size | Change the image size' + Caption = 'tbImageSize' + ImageIndex = 14 + OnClick = mnuImageSizeClick + end + object tbMessages: TToolButton + Left = 508 + Top = 0 + Hint = 'Messages | Show error messages' + ImageIndex = 63 + OnClick = tbMessagesClick + end + object tbOptions: TToolButton + Left = 531 + Top = 0 + Hint = 'Options | Change Apophysis default settings' + Caption = 'tbOptions' + ImageIndex = 13 + OnClick = mnuOptionsClick + end + object ToolButton15: TToolButton + Left = 554 + Top = 0 + Width = 8 + Caption = 'ToolButton15' + ImageIndex = 62 + Style = tbsSeparator + end + object tbShowAlpha: TToolButton + Left = 562 + Top = 0 + Hint = 'Show transparency | Show the flame on a transparent background' + Caption = 'Show Alpha' + ImageIndex = 53 + Style = tbsCheck + OnClick = tbShowAlphaClick + end + object tbGuides: TToolButton + Left = 585 + Top = 0 + Hint = 'Show guidelines | Show flame thirds, center and golden ratio' + Caption = 'Show guides' + Down = True + ImageIndex = 68 + Style = tbsCheck + OnClick = tbGuidesClick + end + object ToolButton16: TToolButton + Left = 608 + Top = 0 + Width = 8 + Caption = 'ToolButton16' + ImageIndex = 54 + Style = tbsSeparator + end + object tbEditScript: TToolButton + Left = 616 + Top = 0 + Hint = 'Edit script | Edit the script code' + Caption = 'tbEditScript' + ImageIndex = 42 + OnClick = mnuEditScriptClick + end + object btnRunScript: TToolButton + Left = 639 + Top = 0 + Hint = 'Run script | Execute the current script' + Caption = 'btnRunScript' + ImageIndex = 43 + OnClick = mnuRunClick + end + object btnStopScript: TToolButton + Left = 662 + Top = 0 + Hint = + 'Stop script | To stop an animation script, you can press any key' + + ' on your keyboard' + Caption = 'btnStopScript' + ImageIndex = 36 + OnClick = mnuStopClick + end + object ToolButton18: TToolButton + Left = 685 + Top = 0 + Width = 8 + Caption = 'ToolButton18' + ImageIndex = 37 + Style = tbsSeparator + end + object tbDrag: TToolButton + Left = 693 + Top = 0 + Hint = 'Translate the image | Translate the fractal image using mouse' + Caption = 'tbDrag' + Down = True + Grouped = True + ImageIndex = 62 + Style = tbsCheck + OnClick = tbDragClick + end + object tbRotate: TToolButton + Left = 716 + Top = 0 + Hint = 'Rotate the camera | Rotate the fractal image using mouse' + Caption = 'tbRotate' + Grouped = True + ImageIndex = 41 + Style = tbsCheck + OnClick = tbRotateClick + end + object tbZoomIn: TToolButton + Left = 739 + Top = 0 + Hint = 'Zoom in | Scale up the fractal image using mouse' + Caption = 'tbZoomIn' + Grouped = True + ImageIndex = 50 + Style = tbsCheck + OnClick = tbzoomwindowClick + end + object tbZoomOut: TToolButton + Left = 762 + Top = 0 + Hint = 'Zoom out | Scale down the fractal image using mouse' + Caption = 'tbZoomOut' + Grouped = True + ImageIndex = 49 + Style = tbsCheck + OnClick = tbzoomoutwindowClick + end + object ToolButton23: TToolButton + Left = 785 + Top = 0 + Width = 8 + Caption = 'ToolButton23' + ImageIndex = 50 + Style = tbsSeparator + end + end + end + object BottomDock: TPanel + Left = 0 + Top = 673 + Width = 1000 + Height = 19 + Align = alBottom + BevelOuter = bvNone + TabOrder = 3 + object StatusBar: TStatusBar + Left = 0 + Top = 0 + Width = 803 + Height = 19 + Align = alClient + Panels = < + item + Width = 200 + end + item + Width = 161 + end + item + Width = 150 + end + item + Width = 50 + end> + end + object pnlLSPFrame: TPanel + Left = 803 + Top = 0 + Width = 197 + Height = 19 + Align = alRight + BevelOuter = bvNone + TabOrder = 1 + object LoadSaveProgress: TProgressBar + Left = 2 + Top = 0 + Width = 194 + Height = 21 + Align = alCustom + Anchors = [akLeft, akTop, akRight, akBottom] + Smooth = True + TabOrder = 0 + end + end + end + object Buttons: TImageList + Left = 104 + Top = 280 + Bitmap = { + 494C01014C005000040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000004001000001002000000000000040 + 0100000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000D9CDC700CAB9AF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000D5864800DF762400ECA24A00ED9D4300E37E3300D16F3B00C68C + 73000000000000000000000000000000000000000000FAFAFA00F1F1F100E4E4 + E400F2F2F200F7F7F700F5F5F500000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000835B46005E2A0E00E5DDD9000000000000000000B8A29300774E2E006A3F + 1200E3DCD100000000000000000000000000000000000000000000000000DBB4 + 8400E3872B00EF7E1000F2A34A00F4BE7100F1842600F25E0000F14C0000E342 + 0000CA68320000000000000000000000000000000000CFCFCF0000000000B9B9 + B9000D0D0D000000000000000000000000000000000011111100000000000000 + 0000272727000000000000000000000000000000000000000000D8D7D800C4C4 + C400DBDBDB000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000006534 + 1A00612E13005C270B005A250800D0C2BA0000000000B59E8C00DACFC400FEFF + FE007B591A00DBD2BD0000000000000000000000000000000000DBB38900EFB6 + 5700F7AB4A00F3A64700F3CA8600EABF8D00E29C6400E7802D00F06E0C00F365 + 0700EC5D0000CB6E2D00000000000000000000000000000000009A9A9A008686 + 86000000000071717100FDFDFD00000000008C8C8C007F7F7F00959595001919 + 1900000000000000000000000000000000000000000000000000E6E6E600F3F3 + F30094949400DCDCDC0000000000F9F9F9000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000073462E005E2A + 0E005D2A0E00DBD0CA00000000005F2C0D00EEEAE700BCA99300D2C5B5000000 + 0000E4DDCC00BCB0820000000000000000000000000000000000E6954D00F7C9 + 6D00F7C67300F6B75C00F8C56600F4A13E00EEAD6F00E7B68600EE842500F286 + 2100F37C1400EA660000C98B5D000000000000000000000000008A8A8A004343 + 43007B7B7B00000000008A8A8A0084848400D5D5D500A7A7A700FEFEFE000000 + 00005454540000000000BDBDBD00000000000000000000000000000000000000 + 0000E0E0E0008F8F8F0000000000B9B9B900BAB9BA00E6E5E600A4A4A4008A88 + 8A00ACAAAA000000000000000000000000000000000000000000E6DFDA007143 + 2A00855E48000000000000000000000000006F451A00C4B59E00D5CAB8000000 + 0000B0A26700F0EDE100000000000000000000000000E1A98000F0924E00F2CE + 9E00EBD7AE00ECC48100EED3A400E6A66100EFAE6800EED9C200EB9C4800F296 + 3300F0902E00F3821500DA782100000000000000000000000000252525006E6E + 6E00000000000000000088888800D7D7D700727272003D3D3D0000000000BCBC + BC00EEEEEE000000000000000000000000000000000000000000000000000000 + 0000EEEEEE0061546100DEDEDE000000000000000000D1D1D10061546100CCCC + CC00F9F9F9000000000000000000000000000000000000000000000000000000 + 0000CEBEB6006B3B1F00D1C3B70000000000D7CCBD0079581800DFD9C7000000 + 0000ACA15B00E9E7CB00A19E27000000000000000000E8C18500F5AE6500F3D2 + C100E8DDC600E4CDAA00EBE2D900E4A77700EBAB6600F1E3D000EBB67000F3A7 + 4900F2A34800F49D3700EA8A24000000000000000000DDDDDD00000000009C9C + 9C00000000006060600044444400000000000000000000000000141414003F3F + 3F00000000003D3D3D0000000000ABABAB000000000000000000000000000000 + 0000FCFCFC00CAC9CA00C2C2C20000000000FAFAFA00E5E4E500ACABAC009C9C + 9C00000000000000000000000000000000000000000000000000F5F2F000CFBF + B700C0AC9F00C1AE9E00785128007F5D2A00F9F8F600937D3C00EAE5D900AAA0 + 5100A39C3600C5C37C00A3A61900FDFEF90000000000F0DCB800FCDB9000F6DC + B600EDD8B000EFD59C00EFEAE000EDA87700F4A65C00F4E3CA00EDCA9500F4BA + 6000F5B96600F5B35D00F4A74400000000000000000065656500000000000000 + 00001D1D1D00C6C6C6000000000000000000D5D5D500C5C5C500000000006262 + 6200000000009191910000000000ABABAB000000000000000000000000000000 + 000000000000DBDBDB009E9E9E0000000000E4E3E300E7E6E600EBEBEB00E6E6 + E600ABABAB00C0C0C00000000000000000000000000080584200551E01005823 + 0200A98F7B00DBD0C600D0C5B300BAA98A009079390099873C00998B2E00C3BD + 80000000000000000000A9B21900FCFDF80000000000F1E3CF00F5E3B800F1E1 + B900F0DDBB00F6D98500F6F1D900ECBA9500F39B5900F3D9BB00EBD9AD00F3C9 + 7500F5CE8700F8C98400F6BA6400000000000000000071717100000000000000 + 0000BBBBBB000000000000000000000000005C5C5C00161616004C4C4C000000 + 0000000000001818180000000000000000000000000000000000000000000000 + 000000000000DFDFDF0061546100FCFCFC0000000000FBFBFB00F7F7F7000000 + 0000FAFAFA00F4F4F4000000000000000000000000008D69560065351700683C + 1600B6A28C00000000000000000000000000D0C8A40090811D00A0983000BBBB + 5F00D8DA9D00DDE0A100AFBD16000000000000000000EFE2CE00F3E6D200ECE1 + CF00EFDCBE00F5CD7500F5E6B700EECFA800EF9D6200EECCB600EBE3D100E8CD + 9300F4D8A000F9D89E00F2C47600000000000000000000000000000000000000 + 00000000000000000000E1E1E100B9B9B900A9A9A900EEEEEE0000000000D5D5 + D500000000002020200000000000000000000000000000000000000000000000 + 000000000000EBEBEB009F9E9F00DEDEDE000000000000000000000000000000 + 00000000000000000000000000000000000000000000CBBBB10062330C00754E + 2300724D1600FBF7F600D5CDB2009683360097892D00D0CD9A00B5B45400ECEC + D100BBC14700E2E7AA00000000000000000000000000EAD6C000FAE8CB00F8E9 + D100F8E6B400F9D77D00F9DB8600F6E49700F7B37100F5B09000EFE2CB00EFDA + 9800FAE4AF00FEE3AB00EAC78100000000000000000050505000A8A8A800FEFE + FE003A3A3A003A3A3A0081818100D5D5D500A6A6A600BFBFBF00000000000000 + 0000888888000000000000000000000000000000000000000000000000000000 + 0000E9E9E900EDEDEC00DFDEDD008F88850094918F0000000000000000000000 + 0000000000000000000000000000000000000000000000000000775026007955 + 21007C5D1D00775A0700CAC09C00BBB3710000000000DFDFB300C7C97400E4E7 + B600C3CF5200B5C71800F5F9E1000000000000000000E7D3C400EED5B400F8E1 + BE00F8E3B600F8DF9600FAD88100FAE78F00FAD78700F8A67100EEC39D00E9D7 + 9B00F3E4B900F4DFAB000000000000000000F5F5F5001919190000000000C9C9 + C900404040000000000048484800676767008D8D8D004C4C4C00000000004747 + 4700000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000E7E7E700B2B1B2000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000F1EDE800704F + 0800B1A172000000000000000000B5AE610000000000DEE0AD00EFF1D800CDD6 + 6E00B6C81B00E1EB9E0000000000000000000000000000000000E4C9AB00F2D1 + A000F6D89A00F6D98D00F7D68100F8D68100FBEA9400FAC57D00F8B17500F3D9 + 9800F1E6C000DFCDA900000000000000000062626200F5F5F50000000000AEAE + AE009292920018181800AAAAAA00484848004F4F4F00D9D9D900000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000F1F1F100D3D3D300F9F9F900BCBABA00D0CFCF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000DFDDB800AAA83B00CDCF8100BCC44800EDF0CC000000 + 0000E9F0B800000000000000000000000000000000000000000000000000E5C6 + 9D00F1CA8000F6D17C00F6D57900F6C67200F9D98600FDE48D00FDB67100FBCD + 7600EADB9B00000000000000000000000000D4D4D400010101005B5B5B007575 + 7500E5E5E5000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000EDEDED00DAD9D9009C989800C7C6C6000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000E0DFB600A6AA2100AEB72300BBC73500F5F7DF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000E5CAA400E8C57C00EFC66C00F2B15F00F5AE6200F5D97D00EFBE7800E5B5 + 87000000000000000000000000000000000000000000F9F9F900000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FCFCFC00F6F6F600000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000009254B00081D3500000014001144 + 8400000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000B7A2930063493500634935006349 + 3500634935006349350063493500634935006349350063493500634935006349 + 35006349350063493500634935006349350000000000BBA697FF875C44FF875C + 44FF875C44FF875C44FF875C44FF875C44FF875C44FF875C44FF875C44FF875C + 44FF875C44FF875C44FF875C44FF000000000000000000000000000000000000 + 00000000000000062100021E7400000E91001171FF000015B0001368FF00042D + 7E0000036A001667E20000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000B7A29300C0C0C000FFFFFF008000 + 8000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0 + C00080008000C0C0C000FFFFFF006349350000000000BCA798FFFC8E54FFEF81 + 47FFEA763AFFE77136FFE56F2FFFDE6A2AFFD96123FFD45A1EFFC95617FFC350 + 15FFBC4C14FFB84B15FF875C44FF000000000000000000000000000000000003 + 1500031260000733E6001064FF001E61FF00104CF500084CF50003218900000C + A30005259F000F5EB8000811440002154500CE63000063636300636363006363 + 6300636363006363630063636300636363006363630063636300636363006363 + 6300636363009C9C9C000000000000000000B7A29300FFFFFF00C0C0C0008000 + 8000C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFF + FF0080008000FFFFFF00C0C0C0006349350000000000BDA899FFFC945EFFFE8C + 51FFFF8344FFFE7B39FFF97530FFF4712BFFEF6A26FFE96120FFE25E1DFFDA5B + 16FFD25415FFBE4C13FF875C44FF000000000000000000000000000735000019 + BF00001AB9001577FF003471E2001147AF003E72E4000220E100001EBC000632 + 9C000F55DD00000685000631BA00188DFF00CE63000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000636363000000000000000000B7A2930080008000800080008000 + 8000800080008000800080008000800080008000800080008000800080008000 + 80008000800080008000800080006349350000000000BEAA9AFFFC9A69FFFD91 + 57FFFF8749FFFF7B3BFFFA7831FFF5742BFFF06B27FFEB6321FFE55E1DFFE05D + 17FFD95515FFC14E13FF875C44FF000000000000000000000100166DFF000744 + ED001D92FF00002BCE00395CE400274AC4003A62E7000B2FBB001160FF00052D + B000000B880004309E001363D600060E3500CE63000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000636363000000000000000000B7A29300FFFFFF00C0C0C0008000 + 8000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0080008000FFFFFF00C0C0C0006349350000000000C0AB9BFFFCA374FFFE99 + 62FFFF8E50FFFE8343FFFB7936FFF6752CFFF16C27FFEC6422FFE75F1EFFE55D + 18FFDE5614FFC74F13FF875C44FF00000000000100001861F3000436C000135F + DC000837D500031D940005159C001B308F000A1EB00000055500032AC5000D5D + DA001557A1000732AC0000026A000127B100CE6300000000000000FF00000000 + 000000FF000000FF00000000000000FF00000000000000000000000000000000 + 000000000000636363000000000000000000BAA59600C0C0C000FFFFFF008000 + 8000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0080008000C0C0C000FFFFFF006349350000000000C2AC9DFF57D546FF47D0 + 32FF34CC1EFF2EC617FF26C310FF1FC00AFF1BB904FF18B401FF19AA00FF16A0 + 00FF159700FF117200FF875C44FF00000000010000000B3674000331BA000215 + 8A000E65F7000023B500000E6E0000053F00000D6800001375000121AC00000A + 9200000D910000129A0000005000185EBB00CE63000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000636363000000000000000000BEA99A00FFFFFF00C0C0C0008000 + 8000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0080008000FFFFFF00C0C0C0006349350000000000C4AE9FFF6AD75AFF57D3 + 46FF41D02DFF32C71DFF2AC313FF1FC00AFF1BBC03FF19B601FF18AC00FF16A3 + 00FF149B00FF107800FF875C44FF000000000000000000088900000A8D000D4F + C6001552C900021DC900001167000016810000188B0000127900000D6400072D + D600001566000D28A000083FCA000E64FF00CE6300000000000000FF000000FF + 00000000000000FF000000FF000000FF00000000000000FF0000000000000000 + 000000000000636363000000000000000000C3AE9E00C0C0C000FFFFFF008000 + 8000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0080008000C0C0C000FFFFFF006349350000000000C6AFA1FF7CDA6FFF67D6 + 58FF51D240FF3DCC2AFF30C41BFF22C10EFF1CBB05FF17B801FF16AE00FF14A4 + 00FF149D00FF107B00FF875C44FF0000000009236B000940E1000F52C9000834 + B9000123B2000A44D000001AA3000011780000118700011F940000107D000A31 + C5000E57F0000B59E800092E740010509D00CE63000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000636363000000000000000000C8B2A300FFFFFF00C0C0C0008000 + 8000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0080008000FFFFFF00C0C0C0006349350000000000C7B1A2FF8FDD84FF79DA + 6DFF62D554FF4ECD3DFF3BC728FF2AC213FF1FBD08FF17B801FF17B000FF16A6 + 00FF15A000FF107D00FF875C44FF000000001153AC000A49D40000031B00021B + 7300167FFF0000085000041FC3000630BD0000178100011B9200000C6C000327 + B3000430C8000E36A3000F64F800145DCA00CE6300000000000000FF00000000 + 000000FF000000FF00000000000000FF000000FF000000000000000000000000 + 000000000000636363000000000000000000BEA99A0080008000800080008000 + 8000800080008000800080008000800080008000800080008000800080008000 + 80008000800080008000800080006349350000000000C9B2A3FF7A85E6FF6F78 + E5FF636DE6FF5360E2FF4653DFFF394ADCFF3141D7FF2535D3FF1E2DCFFF182A + CCFF1528C7FF111FB0FF875C44FF000000000C3277000B61FF001C82FF00083A + AD0000078600000C8D000F5CD700000C91000622B400000F86000721BC00000D + 9600093EC7001057BC00156BF3001061D500CE63000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000636363000000000000000000C3AE9E00C0C0C000FFFFFF008000 + 8000C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFF + FF0080008000FFFFFF00C0C0C0006349350000000000CAB4A5FF838DE5FF7983 + E4FF6D76E5FF606CE2FF4F5ADFFF4250DBFF3746D7FF2C3AD4FF2130CFFF1A29 + CBFF1427CAFF101EB2FF875C44FF00000000041B3200051C370000002400000A + 7B0000057800093591000E4CC00000027A000A49F5000216AC000533E2000623 + 7100022377000C4198001578F000061C3600CE63000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000636363000000000000000000C8B2A300FFFFFF00C0C0C0008000 + 8000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0 + C00080008000C0C0C000FFFFFF006349350000000000CBB5A6FF8D95E5FF828D + E4FF777FE3FF6B75E1FF5C6AE0FF4A57DEFF3D4DD8FF313FD5FF2533D1FF1C2A + CDFF1426CAFF0E1FBAFF875C44FF000000000000000000000000051C5F000A34 + AF000E43B4000D54B300020237001042BC000F57D500000000001164E4000444 + BD00208FFF001987F9000000000000000000CE630000CE630000CE630000CE63 + 0000CE630000CE630000CE630000CE630000CE630000CE630000CE630000CE63 + 0000CE630000CE6300000000000000000000EAAA8B00EAAA8B00EAAA8B00EAAA + 8B00E9A58400E99F7A00E7976E00E68E6200E5865600E37D4A00E3764000E272 + 3900E2723900E2723900E2723900C8622F0000000000CCB6A7FF959DE4FF8C95 + E4FF818AE2FF757EE3FF6775E0FF5763DDFF4857D8FF3A48D4FF2D3BD1FF2432 + CDFF1629CBFF1020C6FF875C44FF0000000000000000000000000C3B7B001075 + FF000C51CE00043BAC001A5AB5001366F100083BC900032D9C001D95FF001C96 + FF000C3E7600000000000000000000000000CE63000000000000FFCE9C00FFCE + 9C00FFCE9C00FFCE9C00FFCE9C00FFCE9C00FFCE9C00FFCE9C00FFCE9C000000 + 0000CE630000000000000000000000000000EAAA8B00FFC2A200FFC2A200FEC0 + 9F00FDBD9A00FCB99600FBB59000FAB08B00F9AB8400F8A77D00F6A27700F59D + 7100F5996A00F3956500F3956500CD65310000000000CCB6A7FFCCB6A6FFCAB5 + A5FFC9B3A4FFC8B2A3FFC6B1A2FFC5AFA1FFC3AE9FFFC2AC9DFFC1AB9CFFBFA9 + 9BFFBEA89AFFBDA899FFBCA698FF00000000000000000000000003111C000720 + 47001581FF001058BA000A347A000B4DD4001D7BF5001C9EFF001367E4000310 + 280000000000000000000000000000000000CE630000CE630000CE630000CE63 + 0000CE630000CE630000CE630000CE630000CE630000CE630000CE630000CE63 + 0000CE630000CE630000CE63000000000000EAAA8B00EAAA8B00EAAA8B00EAAA + 8B00EAAA8B00EAA68600E9A17F00E89B7600E7946C00E68E6200E5875800E481 + 4E00E47B4600E3763E00E3763E00E27239000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000020B160000000000000000000F427A000A36760000050700000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000A5795F0080472800804728007F4425007E4121007C3E1C007B3A18007936 + 130078330E0077300B00762E0800000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000B7A293006349 + 3500634935006349350063493500634935006349350063493500634935006349 + 3500634935000000000000000000000000000000000000000000000000000000 + 0000EAE2DE00C8B6AB00A88E7D008E6F5A00886A57009A837300B9AAA000E1DC + D700000000000000000000000000000000000000000000000000000000000000 + 0000A97E6600FEF1EA00FEF1EA00FCECE300FAE4D900F6DBCC00F3D1C000F0C9 + B400EEC1A900ECBCA20077300A00000000000000000000000000965C5B009558 + 5700FFFFFF00C897920095525300000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000B7A29300FFFF + FF00B7A29300B7A29300B7A29300B7A29300B7A29300B7A29300B7A29300B7A2 + 930063493500000000000000000000000000000000000000000000000000D7C8 + BF00A5857200927049006B65450093664400B2663E00965D3D0079533B008169 + 5900C3B8B0000000000000000000000000000000000000000000A5795F008047 + 2800804728007F4425007E4121007C3E1C007B3A18007936130078330E007730 + 0B00762E0800EEC1A80077320D00000000000000000000000000904F4E00B162 + 6600703C3C0095525300703C3C00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000B7A29300FFFF + FF00FFFFFF00FCFAF900F7F1EE00F1E7E100ECDDD500E6D3C900E1CABD00B7A2 + 9300634935000000000000000000000000000000000000000000DACAC100A67D + 6500C57E580087742E005C74240053613E0088623C00BB663D00B6633B008B56 + 38006F544100C3B8B00000000000000000000000000000000000A97E6600FEF1 + EA00FEF1EA00FCECE300FAE4D900F6DBCC00F3D1C000F0C9B400EEC1A900ECBC + A20077300A00F0C7B10078341000000000009857550081464600C06E6A00BB61 + 5E00BE655D00DA706F00C4636300A66D69006D35360000000000000000000000 + 0000000000000000000000000000000000000000000000000000B7A29300FFFF + FF00FFFFFF00F5F5F500F1EEEC00ECE4E000E6DBD400E1D1C900E4CFC400B7A2 + 93006349350000000000000000000000000000000000EDE5E000B08E7C00CE86 + 6200E8895900CB8147005D8B1F00348822005A6737006F644100B6673D00B562 + 3A008B56380081695900E1DCD70000000000A5795F0080472800804728007F44 + 25007E4121007C3E1C007B3A18007936130078330E0077300B00762E0800EEC1 + A80077320D00F2CEBB007A37140000000000DC878600C0757700DC8786008E56 + 5700C1A4A500C6898800C4636300B1565700B156570000000000000000000000 + 0000000000000000000000000000000000000000000000000000B7A29300FFFF + FF00C1C1C100ACACAC00ABAAA900A7A4A200A39D9900A0969200B4A69F00B7A2 + 93006349350000000000000000000000000000000000D4C0B400C1886B00F594 + 6400EE906100C5845A00547E3F003B9B24003C8B28006D6C3C00B46B42008760 + 3C005D5F3E0061594400B9AAA00000000000A97E6600FBEFEB00CFA89500C799 + 8300BA928000A783710096746300856557004A372B00574B3F0077300A00F0C7 + B10078341000F5D7C6007B3A180000000000FEFAFA00D3878600E08F8D007341 + 4100DDD1D100DAC1C300CD6E6E00B1565700FBF3F30000000000000000000000 + 0000000000000000000000000000000000000000000000000000BAA59600FFFF + FF00B6B6B600ECECEC00FFFFFF00FBF8F700EEE7E4009C959100E8D8D000B7A2 + 93006349350000000000000000000000000000000000C0A19000DE967100F99C + 6E00DD9269006E7A520055A438004FA6300080952D00CD7A4C006D6D3F004B65 + 4200317B1600626A33009A83730000000000AE856D00FFFFFF00F3DFD500DCAF + 9800D39F8700CA9B8500C1978200523928009F85740039342F0077320D00F2CE + BB007A371400F8DFD2007C3D1B0000000000DD908E00E5A4A600F0A8A800AA6B + 6E008457570093606000C26C6D00B15657006D353600965C5B00955857000000 + 0000C89792009552530000000000000000000000000000000000BEA99A00FFFF + FF00B6B6B600ECECEC00FFFFFF00F8F7F600ACAAA700E7DEDA00EEE1DA00B7A2 + 93006349350000000000000000000000000000000000B38D7800F7B49200EBA4 + 7B0065795F00639B4C0060AF400096A23E00DF895D00D4805400516E48003B84 + 2C002B8D15003C7D1C00886A570000000000B28B7400B4A39600FEFBFA00F1DF + D500DFB19B00C9A79700715B4C00C7B4AA0070655D004B423F0078341000F5D7 + C6007B3A1800FBE6DB007D401F0000000000ECBDBD00DB929300F6B8B800EDA9 + A800DD898600D67D7700C26C6D00C0727200BD727300904F4E00B1626600703C + 3C0095525300703C3C0000000000000000000000000000000000C3AE9E00FFFF + FF00B6B6B600ECECEC00FCFCFC00B9B9B900CCCBCA00F7F1EE00F1E7E100B7A2 + 93006349350000000000000000000000000000000000B68F7A00F8BA9B009B9B + 800047A74E005AB64B0091955E00E5976E00E6916600DC895C0064A12B003F9D + 240040961D0045881F008E6F5A0000000000B7927B00ECE5E100AE9A8A00FCF5 + F200F0DDD2006D5646009D8A7F009D8E86004C342900ECBCA2007A371400F8DF + D2007C3D1B00FCEDE4007E432300000000000000000000000000E4A7AA00DB9F + 9E00D0827E00CE7E7A00B96F70009857550081464600C06E6A00BB615E00BE65 + 5D00DA706F00C4636300A66D69006D3536000000000000000000C8B2A300FFFF + FF00B5B5B500EDEDED00C1C1C100CBCBCB00FEFEFE00FAF7F500F5EDE900B7A2 + 93006349350000000000000000000000000000000000C4A69500E1B4990090B6 + 85004FC96C004DCB710079A17300B9A26E00D2996800E48F6400A5963C004DA5 + 2B00439F2300528A2C00A88E7D0000000000BC988200FFFFFF00E2D8D200AF99 + 89009E897C00C5A89800BAABA300BBA79D00FDDAC800EDC3AC007B3A1800FBE6 + DB007D401F00FEF1EA007F452500000000000000000000000000DD9C9B00E4AB + A900FEF9F900CE7E7A00BD727300DC878600C0757700DC8786008E565700C1A4 + A500C6898800C4636300B1565700B15657000000000000000000CCB6A700FFFF + FF00B0B0B000C7C7C700C7C7C700FFFFFF00FFFFFF00FDFCFB00B7A29300B7A2 + 9300644A360000000000000000000000000000000000D8C4B900B6A283008BCF + 980077DD960093E2A10087E4A200A2D29700ABA66B00ED996900E08D5B0053A7 + 2E004CA529006F844000C8B6AB0000000000C09D8800FFFFFF00FFFFFF00E6DC + D600E9DACD00E2E2F2005568CC003554CF00D0C3D400EECAB8007C3D1B00FCED + E4007E432300A2745A009E6F5400000000000000000000000000000000000000 + 0000000000000000000000000000FEFAFA00D3878600E08F8D0073414100DDD1 + D100DAC1C300CD6E6E00B1565700FBF3F3000000000000000000D1BBAB00FFFF + FF00B6B6B600C1C1C100FFFFFF00FFFFFF00FFFFFF00B7A29300644A3600644A + 3600644A360000000000000000000000000000000000EFE7E200BEA18E0092CB + 9900A1E8B700CBEEC000D5F4CD00EBF7D700B3E5AB0087986700D6984700B093 + 390065963A00A0877000EAE2DE0000000000C4A38E00FFFFFF00FFFDFC00FFFF + FF00FFFFFB006572C9004BA0ED002374CB002A4AC100EED3C5007D401F00FEF1 + EA007F4525000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000DD908E00E5A4A600F0A8A800AA6B6E008457 + 570093606000C26C6D00B15657006D3536000000000000000000D5BFAF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B9A49500D4C5BA00644A + 3600E1D5CD000000000000000000000000000000000000000000E0D0C700B9A5 + 8A00B5D5AD00D4F2CE00E6F8D70086B075007DDB90004EB16A008B874200C885 + 5B00A27F6100D7C8BF000000000000000000C7A79200FFFFFF00FFFBFA00FFFB + FA00FFFFFD008D97D20093C3E8004EA5EF00656CBA00EFDBD1007E432300A274 + 5A009E6F54000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000ECBDBD00DB929300F6B8B800EDA9A800DD89 + 8600D67D7700C26C6D00C0727200BD7273000000000000000000D8C2B200FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00C0AB9C00644A3600E2D6 + CD0000000000000000000000000000000000000000000000000000000000E0D0 + C700C0A29000C3C2A200CDDCBB00B7E4B60081DDA20067B670009F855600B08E + 7C00DACAC100000000000000000000000000E2BDA600FFFFFF00FFFFFF00FFFF + FF00FFFFFF00E2E5F5009BA5DD008D96D300ECE9F100FEF1EA007F4525000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000E4A7AA00DB9F9E00D082 + 7E00CE7E7A00B96F700000000000000000000000000000000000D8C2B200D8C2 + B200D8C2B200D8C2B200D8C2B200D4BEAE00CFB9A900C9B3A400E2D6CD000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000EFE7E200D9C5BA00C6A89900BB998500BD9D8B00C5A79700D4C0B500EDE5 + E00000000000000000000000000000000000E2BDA600E2BDA600C1A08A00C1A0 + 8A00BD998300B7927B00B28A7200AC826A00A77B6200A2745A009E6F54000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000DD9C9B00E4ABA900FEF9 + F900CE7E7A00BD72730000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEA + EB00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEA + EB00000000000000000000000000000000000000000000000000B7A293006349 + 3500634935006349350063493500634935006349350063493500634935006349 + 350063493500000000000000000000000000B7A2930060463200634935006349 + 350063493500634935006349350063493500634935006349350063493500684E + 3A00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FFF0EF00FFF0E000FFF0EF00FFF0EF00FFF0 + EF00FFF0F000FFFFF00000000000000000000000000000000000000000000000 + 000000000000CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEA + EB00000000000000000000000000000000000000000000000000B7A29300FFFF + FF00B7A29300B09E950077789C00B19E9500B7A29300B7A29300B7A29300B7A2 + 930063493500000000000000000000000000BDA89900FDFEFD00F0EFEE00F0EC + E900EFE9E400EEE5DE00EEE0D700EDDDD200EDDACD00ECD8CA00DBC9BD00684E + 3A00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FFF0E000D0703F00D0703F00D0703000D060 + 1000D0602000FFF0EF0000000000000000000000000000000000000000000000 + 0000CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEA + EB00CFEAEB000000000000000000000000000000000000000000B7A29300FFFF + FF00EDAF8C003153C1001639B300697ECB00C9815700CE825000E1CABD00B7A2 + 930063493500000000000000000000000000C6B0A100FDFEFD00E6D9D200E5D7 + D000E3D4CC00FCF5EF00E0CEC500DECCC200DECCC200F9E8DC00DBC9BD00684E + 3A00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FFEFE000D0703F00FFA77000C2E9FF0040AE + F700E0AF8000FFEFDF000000000000000000000000000000000000000000CFEA + EB00CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEA + EB00CFEAEB000000000000000000000000000000000000000000B7A29300DBE1 + F400294DC2002854ED00234BE2001238B5009D9FCC00EAD9D100E4CFC400B7A2 + 930063493500000000000000000000000000CCB6A700FDFEFD00FDFEFD00FDFE + FD00FCFCFA00FCF9F50075716E005754510000000000E2D8D000DECEC300684E + 3A0000000000000000000000000000000000000000000000000056B9F50056B9 + F50056B9F50056B9F50000000000FFE0DF00D0703F00FFA77000C2E9FF0040AE + F700E08F4F00FFE0D0000000000000000000000000000000000000000000CFEA + EB00CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEA + EB00CFEAEB00CFEAEB0000000000000000000000000000000000B7A293001E44 + BF002A57F4006183FB005477F8003D63EA002040B400B77A5E00E7D5CB00B7A2 + 930063493500000000000000000000000000CCB6A700FDFEFD00E8DDD700E7DC + D500E6D9D200FCFCFA00A39D9800FEFEFE0090BAC8000E121600D2CDC7007860 + 4D0000000000000000000000000000000000000000000000000056B9F50056B9 + F50056B9F50056B9F50000000000FFE0D000D0703F00FFA77000C2E9FF0040AE + F700E08F5000FFE0CF0000000000000000000000000000000000CFEAEB00CFEA + EB00CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEA + EB00CFEAEB00CFEAEB0000000000000000000000000000000000BAA5960087A2 + FC007895FB007C94FC00E0E5FD00819AF8004262E2003F57B200E7D8D200B7A2 + 930063493500000000000000000000000000CCB6A700FDFEFD00FDFEFD00FDFE + FD00FDFEFD00FDFEFD00A39D9800B3D1DB00A6E0EC008BBECE000E1216007C72 + 660000000000000000000000000000000000000000000000000056B9F50056B9 + F50056B9F50056B9F50000000000FFDFCF00D0703F00FFA77000C2E9FF0040AE + F700F0B08F00FFDFCF00000000000000000000000000CFEAEB00CFEAEB00CFEA + EB0000000000CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEA + EB00CFEAEB00CFEAEB0000000000000000000000000000000000BEA99A00E8EB + FF00C1CDFE00F0BCA500EBAE8C00D19781007D95F6002E54DD005668B100B6A2 + 930063493500000000000000000000000000CCB6A700FDFEFD00E8DDD700E8DD + D700E8DDD700FDFEFD00D7D2CF004D9CB300B5EBF4009BD6E5008BBECE000E12 + 160000000000000000000000000000000000000000000000000056B9F50056B9 + F50056B9F50056B9F50000000000FFDFC000D0703F00FFA77000C2E9FF000000 + 00000000000000000000000000000000000000000000CFEAEB00CFEAEB000000 + 000000000000CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEA + EB00CFEAEB00CFEAEB00CFEAEB00000000000000000000000000C3AE9E00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00F1F1F800748EF500264CD7006C6E + 950062493600000000000000000000000000CCB6A700FDFEFD00FDFEFD00FDFE + FD00FDFEFD00FDFEFD00FCFBF700E4E0DC0057A0B500B5EBF4009BD6E5008BBE + CE000E121600000000000000000000000000000000000000000056B9F50056B9 + F50056B9F50056B9F50000000000FFDFC000D0601F00D0703F00E07F3F000000 + 0000F0A07F000000000000000000000000000000000000000000000000000000 + 000000000000CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEAEB00CFEA + EB0000000000CFEAEB00CFEAEB00000000000000000000000000C8B2A300FFFF + FF00F7D0BB00F5C8B200EDBC9E00E6AD8C00DFA07B00DB9A72007F96F200244A + D700433E5900000000000000000000000000EBAC8D00F2C9B500F2C8B400F1C4 + AD00F0BEA400EFB79B00EEB29400EFB99D00DFC8BB0065A6B700B5EBF4009BD6 + E5008BBECE000E1216000000000000000000000000000000000056B9F50056B9 + F50056B9F50056B9F50000000000FFE0D000FFDFC000FFD0C000FFD0C0000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000CFEAEB00CFEAEB0000000000CFEAEB00CFEAEB0000000000CFEAEB00CFEA + EB0000000000CFEAEB00CFEAEB00000000000000000000000000CCB6A700FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FDFCFB00B7A293007B8D + D800274DD700000000000000000000000000EBAC8D00FFD9C400FED6C000FDD4 + BD00FCD0B900FCCDB500FBC9B000FBC6AB00F7C6AE00E2CDC10073ACB900B5EB + F400A1D9E700ACB2B2003535900000000000000000000000000056B9F5000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000CFEAEB00CFEAEB0000000000CFEAEB00CFEAEB0000000000CFEAEB00CFEA + EB000000000000000000CFEAEB00000000000000000000000000D1BBAB00FFFF + FF00F7D0BB00F5C8B200EDBC9E00E6AD8C00DFA07B00DB9A7200644A3600644A + 3600644A3600000000000000000000000000EBAC8D00EAAA8B00EAAA8B00EAA8 + 8900E9A28100E89C7700E7946B00E68C6000E5865500E68D5F00CA997F007DB0 + BB00DDD2CA00A6B1E20098A1CB0035359000000000000000000056B9F5000000 + 0000BBE5F900BBE5F900BBE5F900BBE5F900BBE5F900BBE5F9000000000056B9 + F50000000000000000000000000000000000000000000000000000000000CFEA + EB00CFEAEB000000000000000000CFEAEB00CFEAEB0000000000CFEAEB00CFEA + EB00000000000000000000000000000000000000000000000000D5BFAF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B9A49500D4C5BA00644A + 3600E1D5CD000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00005E6CAD00A4B7EB0098A7E1005E6CAD00000000000000000056B9F50056B9 + F50000000000BBE5F9000000000000000000BBE5F9000000000056B9F50056B9 + F500000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000CFEAEB00CFEAEB0000000000CFEAEB00CFEA + EB00000000000000000000000000000000000000000000000000D8C2B200FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00C0AB9C00644A3600E2D6 + CD00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000005E6CAD005E6CAD00000000000000000000000000000000000000 + 00000000000000000000BBE5F900BBE5F9000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000CFEAEB00CFEAEB0000000000000000000000 + 0000000000000000000000000000000000000000000000000000D8C2B200D8C2 + B200D8C2B200D8C2B200D8C2B200D4BEAE00CFB9A900C9B3A400E2D6CD000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FBFBFD00FBFBFD0000000000000000000000 + 0000BFBFBF005450500068666600ECECEC000000000000000000000000000000 + 000000000000747474003E3E3E00424242003434340000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000081685500262F3800262F3800262F3800262F3800262F + 3800262F3800262F3800262F3800262F38000000000000000000000000000000 + 00000000000000000000EDEDF6006464BA006464BA00ECECF60000000000C7C7 + C700625C5C00EEE3E200C4BDBC006C6B6B000000000000000000464646003E3E + 3E000000000046464600BEBEBE00C7C7C7003333330000000000000000003535 + 3500828282000000000000000000000000000000000000000000000000000000 + 00000000000000000000BA6E4700AA542900AA542900A25027009B4C25009648 + 23008F4622008A432100864120000000000000000000647E8E004F5E6F004552 + 610037414D00262F380089715E00F2EBE500D5C9C000D5C9C000D5C9C000D5C9 + C000D5C9C000D5C9C000D5C9C000262F38000000000000000000000000000000 + 000000000000D9D9EB004747AE003A3ADF003939DE004E4EBA00A6A6B7006460 + 5A00E2D8D800FBF2F200EEE8E800636262000000000054545400CECECE00D0D0 + D0003131310037373700C9C9C900C9C9C9004D4D4D002B2B2B003F3F3F00C1C1 + C100B6B6B6006B6B6B0000000000000000000000000000000000000000000000 + 00000000000000000000C1795500FDF9F600CEB09C00CCAF9B00CAAD9A00C7AC + 9900C6AB9800C4A997008943210000000000717F8B007FD5F4006BBEE2006BBE + E2006BBEE2006BBEE20091796600F6F0EE00F2EAE500EDE4DE00EADED800E6DA + D200E3D6CE00E1D5CD00D5C9C000262F38000000000000000000000000000000 + 0000BDBDDB003636AD003737E9001111DD000E0EE1001F1FCB004E4B6700E6E1 + D90000000000F3F0EF00706F6F00C3C3C3000000000066666600D9D9D900D7D7 + D700D0D0D000CECECE00CFCFCF00CCCCCC00C9C9C900C1C1C100C3C3C300C5C5 + C500C4C4C4003D3D3D0000000000000000000000000000000000000000000000 + 00000000000000000000C9856400FFFFFF00DA8C5C00D1835100D1835100D183 + 5100D1835100C6AB98008E4522000000000075849000A7DFF30074D4F60070CF + F3006DCAEF006BC2E6009A826F00FAF7F600DCD0C700DCD0C700D9CDC300D5C9 + C000E6DAD200D5C9C000D5C9C000262F3800000000000000000000000000A4A4 + CD002C2CB1003232F0000909DB000808A00019178300443F7300E1DDD3000000 + 0000F8F7F100827E7400C1C1BE000000000000000000000000007D7D7D00D9D9 + D900D7D7D700D5D5D500D2D2D200CFCFCF00CCCCCC00C9C9C900C7C7C700C5C5 + C5003F3F3F00000000000000000000000000B7A2930063493500634935006349 + 35006349350063493500D1927300FFFFFF00FEFDFB00FBEFEA00F5DED300F0CE + BE00EDC3AF00C7AC9900924723000000000079899400AEE4F50082D9F70075D4 + F6006FCEF3006BC6EB00A28A7800FEFDFC00FAF7F500F6F0EE00F2EAE500EDE4 + DE00705A4A0061524600504842003F3D3E0000000000F8F8FB008383BA002222 + BD002424F0000505DD001E1C8D009E958B00DBD4C000E5DED200FDFAFA00FAF8 + ED00807D90004B4B7E00FAFAFB0000000000000000000000000073737300DBDB + DB00D9D9D900CECECE006868680064646400C9C9C900CCCCCC00C9C9C900C1C1 + C10038383800000000000000000000000000B7A29300F8F3F000EADFD700E6D9 + CF00E1D2C700DDCBBF00D89F8200FFFFFF00F3A77F00E7976E00DA8C5C00D183 + 5100D1835100CAAE9A00984A2500000000007E8E9A00B7E9F60094E0F70085DA + F70078D5F7006BC8EE00A9928000FFFFFF00DCD0C700DCD0C700D9CDC400F2EB + E5007A604D00E6DDD7006152470000000000F5F5F9007171AF002424CD002E2E + FA000A0AE6000101BD008A808500F5E4D300F0E6E000FBF5F600F5EFE700827D + 92000C0CB7002323E0006666B400F2F2F800656565006262620066666600DFDF + DF00CFCFCF0059595900000000000000000092929200C8C8C800CCCCCC00C9C9 + C900444444003E3E3E003C3C3C0000000000B7A29300FBF8F700E5AE8100DEA1 + 7300DA9C6E00D5976800E0AA9000FFFFFF00FFFFFF00FFFFFF00FBF4F000F7E4 + DB00F2D3C500CCAE9A009D4D25000000000082949E00BFEEF800A6E7F90097E1 + F80088DCF70077D1F200B0998800FFFFFF00FFFFFF00FDFDFC00FAF7F600F6F1 + EE00816856007A604D0000000000000000009F9FC5002323C6004343FF005252 + FF004C4CFD004040C300BEAFA300AFA3AC00423F6F00CCC3C200F8EFDC00413E + 8E000000DD001212F0002626CF009090BE008F8F8F00E6E6E600E4E4E400E2E2 + E20044444400000000000000000000000000000000005F5F5F00CFCFCF00CCCC + CC00C9C9C900C7C7C7004444440000000000BBA69700FEFDFC00FBF6F500F6EF + EB00F1E6E000ECDED600E7B59C00FFFFFF00FCAE8A00FCAE8A00F1DBD200E78E + 6000B3572A00AC542900A4502700000000008699A200C7F3FA00B7EEFA00A9E8 + F9009BE3F90073D3F600B6A08E00B0998800A9928000A28A78009A8270009179 + 670089715E000000000000000000000000004040A6004949F7006E6EFF006969 + FF006969FF006665DF00847C83004F4E92005E599200E4D5CE00DDD1BB003130 + A1000000E5000000D8001818EC003E3EAB0090909000EAEAEA00E6E6E600E4E4 + E40051515100000000000000000000000000000000005F5F5F00D2D2D200CFCF + CF00CACACA00C0C0C0004747470000000000C1AB9C00FFFFFF00FAC59F00F0B8 + 8E00E5AE8100DEA17300ECBDA600FFFFFF00FFFFFF00FFFFFF00FFFFFF00EA9A + 7200F0C9B200B1572B00EDD7CD00000000008A9EA600CDF6FB00C4F3FB00BAEF + F900AAE4F30076C8E60076C8E60075C8E50073C3E3006FBFE0006BBEE2006BBE + E200303944000000000000000000000000003535B5007575FF008585FF008080 + FF008080FF008081FB00676ACC0069658500D0BFAA00D3C2B100645E88000000 + D5000000E9000000D8000A0AE8002D2DBE0090909000979797009E9E9E00E5E5 + E500D9D9D9006F6F6F0000000000000000007D7D7D00CDCDCD00D4D4D400D0D0 + D00063636300616161005959590000000000C7B2A300FFFFFF00FFFFFF00FCFA + F900F8F2F000F3EAE600F0C4AE00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EBA7 + 8500C5653500F1DBCF0000000000000000008DA1AA00CEF7FC00CCF6FC005E7D + 8A0058737F00566D7A00526977004F6673004C617000445A68007FABBF006BBE + E2003E4A58000000000000000000000000003E3EB2009191FF009D9DFF009898 + FF009898FF009899FF009999FF008887C30084809B008381A6006D6EDF002A2A + F8000000E3000000D7000404E8002B2BBB00000000000000000069696900E6E6 + E600E7E7E700D7D7D700505050004E4E4E00D4D4D400D9D9D900D7D7D700CECE + CE0031313100000000000000000000000000CFB9A900FFFFFF00FFDABA00FFD0 + AE00F0DED200B7A29300F0C4AE00EFC2AB00EFC1AA00EFB9A000EDB09200EDB0 + 9200F9E4D9000000000000000000000000008FA4AC00CEF7FC00CDF7FC005D86 + 9600BCDEE300C0EFF600B2E7F100A4DEEC0099C4D2003E5A67007BB4CB006BBE + E2004B5969000000000000000000000000005151A0009898F500BFBFFF00B0B0 + FF00AFAFFF00AFAFFF00B0B0FF00B6B6FF00B1B2FA00AEAEFD00B5B5FF00B1B1 + FF008383F6005656EC003F3FF0004545A200000000005A5A5A00E5E5E500E8E8 + E800E7E7E700E7E7E700E4E4E400E2E2E200DFDFDF00DBDBDB00D9D9D900D7D7 + D700CCCCCC00393939000000000000000000D4BEAF00FFFFFF00FFFFFF00FFFF + FF00FEFDFC00BBA69600D4C5BA008F725B00E2DDD90000000000000000000000 + 0000000000000000000000000000000000008FA4AC00CEF6FA00CEF7FC00CBF6 + FA007397A200C8F4F900667D8A00B1DDE7004C6C7C0034617800A2DCF2007FD5 + F4004E5E6F00000000000000000000000000ACACC5005A5AB700D0D0FF00DDDD + FF00D3D3FF00D3D3FF00DBDBFF00CDCDFF00CBCBFF00DBDBFF00D3D3FF00D3D3 + FF00E6E6FF00E1E1FF006A6AC0009D9DBB00000000009B9B9B00E6E6E600E7E7 + E700828282007D7D7D00E6E6E600E4E4E40082828200686868007B7B7B00D9D9 + D900CFCFCF005B5B5B000000000000000000D8C2B200FFFFFF00FFFFFF00FFFF + FF00FFFFFF00C7B1A200A5826600E2DDD9000000000000000000000000000000 + 000000000000000000000000000000000000000000008FA4AC008FA4AC008FA4 + AC005B8D9F00CBF2F600C5F2F900BCE7EE004666760073858F007A8A95007585 + 910000000000000000000000000000000000FBFBFC008888AC005D5DB200B9B9 + F200E0E0FF00E0E0FF00B7B7FF005454D7004D4DD400B2B2FD00E0E0FF00E0E0 + FF00BCBCF4006262B8007F7FA500F9F9FB000000000000000000A8A8A8009898 + 9800000000008C8C8C00E8E8E800E6E6E6006060600000000000000000007070 + 700067676700000000000000000000000000D8C2B200D8C2B200D4BFAE00D4BF + AE00CEB8A900C8B2A300E9E2DE00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000086B3C30082ADBD00799FB0000000000000000000000000000000 + 00000000000000000000000000000000000000000000FCFCFC00B2B2C4005959 + 94004D4D9C004949A100404096008686AA008B8BAC00404095004747A0004D4D + 9D0057579400A9A9BF00FAFAFB00000000000000000000000000000000000000 + 00000000000090909000989898008A8A8A008484840000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000B9A39500634935006349 + 3500634935006349350063493500634935006349350063493500634935006349 + 350063493500634935006349350000000000B7A2930063493500634935006349 + 3500634935006349350063493500634935006349350063493500634935006349 + 3500634935006349350063493500634935000000000063493500634935006349 + 3500634935006349350063493500634935006349350063493500634935006349 + 3500634935006349350000000000000000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A5A5A500A5A5A500A5A5A500A5A5 + A500A5A5A500A5A5A500000000000000000000000000B9A39500FEFDF200DEDB + D500DAD2CB00D7CBC200D3C2B700CEBAAD00C7B0A300C1A99C00BAA19300B297 + 8900AB908100A5897A006349350000000000B7A29300FBF6F000E4E1DC00E0DD + D700DFD7CE00DFD3C800E0D0C100E0CCBE00E3C8B600E3C7B300E3C4AE00E3C3 + AC00E3C3AC00E3C3AC00E3C3AC0063493500BEA99A00FEF0E800FEEFE600FEED + E300FEEBE000FEE9DD00FEE7DB00FFE6D800FFE4D600FFE2D400FFE1D200FFE0 + D000FFDFCE00FFDECD0063493500000000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A5A5A500A5A5A500A5A5A500A5A5 + A500A5A5A500A5A5A500000000000000000000000000B9A39500FFFFF600B3D0 + DD00337085009DA7AB00FADCC600F9D2B800F4C6AA00EFBDA000E7B39500DDA7 + 8900D39C7D00AB9081006349350000000000B7A29300FCF8F400AF8D7A00A37A + 65008C5D440076452C006F3E2500FAEEE400AF8D7A00A37A65008C5D44007645 + 2C006F3E2500F9E6D900E3C5AF0063493500C0AA9B00FEF2EB00CB977D00DB9D + 7F00EAA38000E99D7700E8976D00E7906300E6885900E5824F00E47C4600E478 + 3F00E57E4A00FFDFCE0063493500000000000000000000000000FFFFFF00FFFF + FF00A5A5A500A5A5A500A5A5A500A5A5A500FFFFFF00FFFFFF00FFFFFF00FFFF + FF00A5A5A500A5A5A500000000000000000000000000B9A39500FFFFF60000AF + FC00C1FDFF002D677F00FBE4D200B7A39900B49F9200B69B8E00AF948500AD8F + 7F00DDA78900B29789006349350000000000B7A29300FCFAF600C8AD9B00E5D2 + C700D0A69100A984780084523700FAEFE500C8AD9B00E5D2C700D0A69100A984 + 780084523700F9E7DA00E2C8B40063493500C1AC9D00FEF4EE00C7907400FCBF + 9E00F3AD8800F3A77F00F09D7300EC956A00E58C6200DE825A00D6795300CD70 + 4B00E2733A00FFE0D00063493500000000000000000000000000FFFFFF00FFFF + FF00A5A5A500A5A5A500A5A5A500A5A5A500FFFFFF00FFFFFF00FFFFFF00FFFF + FF00A5A5A500A5A5A500000000000000000000000000BAA59600FFFFF600B6DD + EF0000AFFC00B2D2DC00FCEDDD00FBE2CE00F9D7C000F8CDB200F4C3A600EFBD + A000E7B39500BAA193006349350000000000B7A29300FDFCF900CEB6A700B9E4 + FF00AFBFFF004E87FF00A3765F00FAF0E700CEB6A700B9E4FF00AFBFFF004E87 + FF00A3765F00F9E8DB00E1CBB90063493500C3AD9E00FEF6F000C68E7200FDC5 + A800FFE7D900FFE4D600FFE1D100FFDDCC00FFDBC800FFD5C200FFD0BC00D679 + 5300E2723900FFE1D20063493500000000000000000000000000FFFFFF00FFFF + FF00A5A5A500A5A5A500A5A5A500A5A5A500FFFFFF00FFFFFF00FFFFFF00FFFF + FF00A5A5A500A5A5A500000000000000000000000000BCA69800FFFFF600FFFF + F600FFFFF600FEFCF200FEF5E800FCEAD900FBDFCB00F9D4BC00F8CCB000F4C3 + A600EFBDA000C1A99C006349350000000000BAA59600FDFDFB00D4BEB200D1BB + AB00CBB09E00C1A38F00B2917A00FAF1EA00D4BEB200D1BBAB00CBB09E00C1A3 + 8F00B2917A00F9E9DD00E0CEBF0063493500C4AE9F00FDF7F300C68E7200FDCC + B100FDC5A700FCBE9D00F9B38F00F6AA8300F3A17800ED986F00E68E6600DE82 + 5A00E2723900FFE2D40063493500000000000000000000000000FFFFFF00FFFF + FF00A5A5A500A5A5A500A5A5A500A5A5A500FFFFFF00FFFFFF00FFFFFF00FFFF + FF00A5A5A500A5A5A500000000000000000000000000BEA89900FFFFF60095A3 + FF002E3BA5008F96CD00FEFAF000FDF2E400FCE8D500FADCC600F9D2B800F8CA + AE00F4C3A600C7B0A3006349350000000000BEA99A00FEFEFD00FDFDFB00FDFB + F900FCFAF600FCF8F300FCF6F000FBF3ED00FAF2E900FAEFE600FAEEE400FAEC + E200FAEBE000FAEADE00E0D2C50063493500C5B0A100FDF9F500C68E7200FED2 + B900FFECE100FFE9DD00FFE7D900FFE4D500FFE1D100FFDDCC00FFDBC800E58C + 6200E3733900FFE4D60063493500000000000000000000000000A5A5A500A5A5 + A500FFFFFF00FFFFFF00FFFFFF00FFFFFF00A5A5A500A5A5A500A5A5A500A5A5 + A500FFFFFF00FFFFFF00000000000000000000000000C0AA9C00FFFFF6004360 + FF0095B3FF002F39AD00FFFFF600B9A79E00B6A29700B49D9100B2998B00B096 + 8800F7C8AC00CCB6A9006349350000000000BEA99A00FFFEFE00AF8D7A00A37A + 65008C5D440076452C006F3E2500FCF5EF00AF8D7A00A37A65008C5D44007645 + 2C006F3E2500FAEBDF00DFD5CB0063493500C7B1A200FDFBF700C68E7200FFD7 + C200FED1B800FDCBAF00FDC4A600FCBD9C00FBB59100F7AB8400F2A07700EC94 + 6A00E3733900FFE6D80063493500000000000000000000000000A5A5A500A5A5 + A500FFFFFF00FFFFFF00FFFFFF00FFFFFF00A5A5A500A5A5A500A5A5A500A5A5 + A500FFFFFF00FFFFFF00000000000000000000000000C3AE9E00FFFFF60096A3 + FF004661FF0094A1FF00FFFFF600FFFEF500FEF7EA00FCEDDD00FBE2CE00F9D7 + BF00F8CDB200CEB8AB006349350000000000C3AE9E00FFFFFE00C8AD9B00E5D2 + C700D0A69100A984780084523700FCF8F300C8AD9B00E5D2C700D0A69100A984 + 780084523700FAECE100DED8D00063493500C8B2A300FDFCF900C68E7200FFDC + C900FFF0E800FFEEE500FFECE000FDC3A500FCBD9B00FBB69100FAAF8800F09C + 7200E3743A00FEE7DB0063493500000000000000000000000000A5A5A500A5A5 + A500FFFFFF00FFFFFF00FFFFFF00FFFFFF00A5A5A500A5A5A500A5A5A500A5A5 + A500FFFFFF00FFFFFF00000000000000000000000000C5B0A000FFFFF600FFFF + F600FFFFF600FFFFF600FFFFF600FFFFF600FFFDF300FEF4E700FCEAD900FADE + CA00F9D4BC00D0BBB0006349350000000000C8B2A300FFFFFF00CEB6A700B9E4 + FF00AFBFFF004E87FF00A3765F00FCFAF700CEB6A700B9E4FF00AFBFFF004E87 + FF00A3765F00FAEDE200DEDBD50063493500C9B3A400FDFDFB00C78F7400FFDF + CE00FFDBC800FFD6C000FED1B700FDCAAE00FDC3A500FCBD9B00FBB69100FAAF + 8700E4784000FEE9DD0063493500000000000000000000000000A5A5A500A5A5 + A500FFFFFF00FFFFFF00FFFFFF00FFFFFF00A5A5A500A5A5A500A5A5A500A5A5 + A500FFFFFF00FFFFFF00000000000000000000000000C7B1A200FFFFF600FF9B + 9900B8303000FF8D6A00FFFFF600FFFFF600FFFFF600FEFAF000FDF1E400FCE7 + D500FADCC700D3C1B6006349350000000000CCB6A700FFFFFF00D4BEB200D1BB + AB00CBB09E00C1A38F00B2917A00FDFCF900D4BEB200D1BBAB00CBB09E00C1A3 + 8F00B2917A00FAEFE600E2E1DB00644A3600CAB4A500FDFEFD00CE9F8700C893 + 7800C78C6F00C88B6D00C8866600C67E5A00C4774F00C3714700C36B3F00C467 + 3900CC744500FEEBE00063493500000000000000000000000000A5A5A500A5A5 + A500A5A5A500A5A5A500A5A5A500A5A5A500FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00000000000000000000000000C9B3A500FFFFF600FF83 + 7E00FFC3C400B7252500FFFFF600BAAAA100B8A69C00B6A29600B39D9000B198 + 8B00FBE4D200D6C7BD006349350000000000CCB6A700FFFFFF00FFFFFF00FFFF + FF00FFFFFE00FFFEFE00FEFDFD00FEFDFB00FDFBF900FDFAF700FCF8F300FCF5 + EF00FBF4EC00FBF1E900FAEFE600644A3600CBB5A600FDFFFE00FDFEFD00FDFD + FB00FDFCF900FDFBF700FDF9F500FDF7F300FEF6F000FEF4EE00FEF2EB00FEF0 + E800FEEFE600FEEDE30063493500000000000000000000000000A5A5A500A5A5 + A500A5A5A500A5A5A500A5A5A500A5A5A500FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00000000000000000000000000CBB5A600FFFFF600FFA9 + A900FF827F00FF989300FFFFF600FFFFF600FFFFF600FFFFF600FFFEF400FDF7 + EB00FCEDDD00D7CCC3006349350000000000EAAA8B00EAAA8B00E9A78700E9A2 + 8000E99D7700E7976D00E6906500E6895B00E4825100E37B4800E3764100E273 + 3A00E2723800E2723900E2723900C8622F0000000000CBB5A600CAB4A500C9B3 + A400C8B2A300C7B1A200C5B0A100C4AE9F00C3AD9E00C1AC9D00C0AA9B00BEA9 + 9A00BDA89900BCA7980000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000CBB5A600FFFFF600FFFF + F600FFFFF600FFFFF600FFFFF600FFFFF600FFFFF600FFFFF600FFFFF600FEFC + F300FDF4E700FCEADA006349350000000000EAAA8B00FFC2A200FEBF9D00FCBB + 9800FCB89400FBB59000FAB18C00F9AD8700F9A98100F8A67C00F6A27800F59F + 7300F59B6D00F4986800F3956500CD6531000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000CCB6A700CCB6A700CAB5 + A600CAB3A400C8B2A300C5AFA100C3AD9E00C0AB9C00BEA99A00BCA69700BAA4 + 9600B8A39400B8A39400B8A3940000000000EAAA8B00EAAA8B00EAAA8C00EAA9 + 8900EAA58400E9A17F00E89D7800E7977000E7926800E68D6000E5885900E483 + 5100E47E4A00E4794300E3763E00E27239000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000091877D00525050005954510058524D0058504900584E + 4700574C4400564A4000584C42004B413A000000000000000000000000000000 + 000000000000000000000000000000000000745A4600694F3B00CAC2BB000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000D7D7D70072747400C6C7C7000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000D7D7D70072747400C6C7C7000000000000000000000000000000 + 00000000000000000000AC9A8D00FFFFFF00FDFFFF00FFFDF700FFF8ED00FEF1 + E000FDEAD500FCE5CC00FFEACF00574B41000000000000000000000000000000 + 0000000000000000000000000000BBADA10081685400CAB2A400684E3A000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000C6C7C6004D504F00328DB300436674000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000C6C7C6004D504F00328DB300436674000000000000000000000000000000 + 00000000000000000000AC989000FFFFFE00FFFFFF00FEF8F400FFF2ED00FCEB + E300FCE6D900FCE0CE00FFE2CF00574B4100000000000000000000000000967C + 69000000000000000000000000008C735F00DFCABE00BDA79800705743000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000C6C7 + C6004D504F002B97C60087D8EF006493A5000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000C6C7 + C6004D504F002B97C60087D8EF006493A5000000000000000000000000000000 + 00000000000000000000AA9A8D00FFFFFF00FFFFFF00FFFBF900FEF6F200FCF1 + EC00FCECE200F9E3D600FEE7D500574B41000000000000000000000000009C83 + 70007F655200CEC6BF00CABEB50091796600E9D7CE007C634F00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000C6C7C6004D50 + 4F002B97C60087D8EF006493A500000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000C6C7C6004D50 + 4F002B97C60087D8EF006493A500000000000000000000000000000000009187 + 7D005250500059545100AB998C00FFFEFF00FFFFFF00FFFEFD00FFF9F800FCF3 + F000FCEDE600FDE8DD00FFEDDF00574B4100000000000000000000000000A38A + 7700DCD1CB006D533F0091796600DDCEC500D6C5BB00856C5900000000000000 + 000000000000000000000000000000000000000000000000000000000000E8E2 + DE00CDBAAD00937C6B0077584400775843009C7D6B00ABADAC002D3442002B97 + C60087D8EF006493A5000000000000000000000000000000000000000000E8E2 + DE00CDBAAD00937C6B0077584400775843009C7D6B00ABADAC002D3442002B97 + C60087D8EF006493A5000000000000000000000000000000000000000000AC9A + 8D00FFFFFF00FDFFFF00AB9B8E00FEFEFE00FFFEFF00FFFFFF00FFFFFF00FFFF + FE00FFFEF900FCF9F000FEFDF100574B4100000000000000000000000000AA91 + 7F00F9F4F100DDD4CD00856C5800F3EAE500947C6900DCD4CE00000000000000 + 0000000000000000000000000000000000000000000000000000DED6D0008668 + 54009D816500BFA27E00D0AD8700B4957300937559006E5440004F80910087D8 + EF006493A5000000000000000000000000000000000000000000DED6D0008668 + 54009D816500BFA27E00D0AD8700B4957300937559006E5440004F80910087D8 + EF006493A500000000000000000000000000000000000000000000000000AC98 + 9000FFFFFE00FFFFFF00AA998F00FBAC8500ED916500E2825600DF7D4F00DB74 + 4600D96E4000D4693800D9693600574B4100000000000000000000000000B098 + 8600FCFAF900FBF7F600F9F5F200F7F2EE00896F5C00664C38006A503C00765C + 49000000000000000000000000000000000000000000F7F5F300896E5C00C1AB + 8B00ECD1AA00EED2AE00ECCFA700E7C79E00D8B28A00A1816200725642006493 + A5000000000000000000000000000000000000000000F7F5F300896E5C00C1AB + 8B00ECD1AA0010708800114A5D0012445600D8B28A00A1816200725642006493 + A50000000000000000000000000000000000000000000000000000000000AA9A + 8D00FFFFFF00FFFFFF00C59F9400AA9B8C00B1907900C1795A00AE704F00AA63 + 470099583E0098583B009A5A3C007A4E3B00000000000000000000000000B79F + 8D00FFFFFE00FEFDFC00FDFBFA00FBF8F700FAF6F300DFD5CE00886E5B000000 + 00000000000000000000000000000000000000000000C5B7AE00B0998100F2DF + BA00F3E1C100F2E1C100F0DEBB00EDD8B200E7CBA300D3AD8700927357006D66 + 5D000000000000000000000000000000000000000000C5B7AE00B0998100F2DF + BA00F3E1C10021889A0020B8D3000C242A00E7CBA300D3AD8700927357006D66 + 5D000000000000000000000000000000000091877D005250500059545100AB99 + 8C00FFFEFF00FFFFFF00FFFEFD00FFF9F800FCF3F000FCEDE600FDE8DD00FFED + DF00574B4100000000000000000000000000000000000000000000000000BDA6 + 9400FFFFFF00FFFFFF00FFFFFF00FEFDFD00E2DAD5009A826F00000000000000 + 00000000000000000000000000000000000000000000B19E9100CDBCA400139A + C6001E98B6001E92AD001A809A000F5267000D313E000E3C4F00B5947200886E + 5E000000000000000000000000000000000000000000B19E9100CDBCA400139A + C6001E98B6001E92AD003DD4EE000F5267000D313E000E3C4F00B5947200886E + 5E0000000000000000000000000000000000AC9A8D00FFFFFF00FDFFFF00AB9B + 8E00FEFEFE00FFFEFF00FFFFFF00FFFFFF00FFFFFE00FFFEF900FCF9F000FEFD + F100574B4100000000000000000000000000000000000000000000000000C3AC + 9900FFFFFF00FFFFFF00FFFFFF00ECE7E300AB93810000000000000000000000 + 0000000000000000000000000000000000000000000097817100E3DAC40039AF + D000A4F0FC008BEBF90062EBFB0043D8F10030BED60010475500CCA682007254 + 3F00000000000000000000000000000000000000000097817100E3DAC40039AF + D000A4F0FC008BEBF90062EBFB0043D8F10030BED60010475500CCA682007254 + 3F0000000000000000000000000000000000AC989000FFFFFE00FFFFFF00AA99 + 8F00FBAC8500ED916500E2825600DF7D4F00DB744600D96E4000D4693800D969 + 3600574B4100000000000000000000000000000000000000000000000000C8B0 + 9E00FFFFFF00FFFFFF00F6F2F000BDA593000000000000000000000000000000 + 00000000000000000000000000000000000000000000BFB0A600CFC4B60057BA + DE0068C2DD0045C0CF0045C0CF0029A1B6001682900012768D00C0A27D00795C + 48000000000000000000000000000000000000000000BFB0A600CFC4B60057BA + DE0068C2DD0045C0CF0082ECFB0029A1B6001682900012768D00C0A27D00795C + 480000000000000000000000000000000000AA9A8D00FFFFFF00FFFFFF00C59F + 9400AA9B8C00B1907900C1795A00AE704F00AA63470099583E0098583B009A5A + 3C007A4E3B00000000000000000000000000000000000000000000000000CBB4 + A200FFFFFF00F7F4F100CAB3A100000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000E1DAD600C1B4A800F0EB + E300FBFAF400FBF9F100FAF5EA00F5EDD700F1DFBF00E6CBA4009E856800B6A7 + 9C000000000000000000000000000000000000000000E1DAD600C1B4A800F0EB + E300FBFAF40062BDDA00ABF4FC002FA8C600F1DFBF00E6CBA4009E856800B6A7 + 9C0000000000000000000000000000000000AB998C00FFFEFF00FFFFFF00FFFE + FD00FFF9F800FCF3F000FCEDE600FDE8DD00FFEDDF00574B4100000000000000 + 000000000000000000000000000000000000000000000000000000000000CBB4 + A200F6F3F000CBB4A20000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000F3F0EE00C1B3A900D1C6 + BE00F6F4EA00F9F6E600F6F2DE00F4EACE00E5D4B200B59E80007A5E4A00EBE7 + E5000000000000000000000000000000000000000000F3F0EE00C1B3A900D1C6 + BE00F6F4EA0061BDE0003DAFD00021A4CA00E5D4B200B59E80007A5E4A00EBE7 + E50000000000000000000000000000000000AB9B8E00FEFEFE00FFFEFF00FFFF + FF00FFFFFF00FFFFFE00FFFEF900FCF9F000FEFDF100574B4100000000000000 + 000000000000000000000000000000000000000000000000000000000000CBB4 + A200CBB4A2000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000E7E0DC00C0B2 + A900CABFB300D6CBBB00DED4BB00C3B29800A59076008D735F00D4CAC2000000 + 0000000000000000000000000000000000000000000000000000E7E0DC00C0B2 + A900CABFB300D6CBBB00DED4BB00C3B29800A59076008D735F00D4CAC2000000 + 000000000000000000000000000000000000AA998F00FBAC8500ED916500E282 + 5600DF7D4F00DB744600D96E4000D4693800D9693600574B4100000000000000 + 000000000000000000000000000000000000000000000000000000000000CBB4 + A200000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000F7F5 + F400E0D9D300C7B9AF00B7A69A00A4918200BAAA9D00F2E7E200000000000000 + 000000000000000000000000000000000000000000000000000000000000F7F5 + F400E0D9D300C7B9AF00B7A69A00A4918200BAAA9D00F2E7E200000000000000 + 000000000000000000000000000000000000C59F9400AA9B8C00B1907900C179 + 5A00AE704F00AA63470099583E0098583B009A5A3C007A4E3B00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFE8BC00D48E7D00A88B3A00D7DE + 93009F773C00BDB04400CAF28D00FCFFF000C7CD94008B62350094492900DBE9 + 6C007C5C2700D0BB5800D5EA7D0093B57F000000000000000000000000000000 + 0000A5795F0080472800804728007F4425007E4121007C3E1C007B3A18007936 + 130078330E0077300B00762E0800000000000000000000000000000000000000 + 0000F9F5F100EFDDC400F1D1A900EDCB9D00EDCB9E00F1D0AA00F0DCC300F8F4 + EF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFEFAA00D78D4B00D9692D007C64 + 2800957C0E00A1890100ECFF4600FDFFE400DDE68B00FFF0A400B1410D00AD71 + 1F00AF8A2E00B2931800F0FC4400C8E070000000000000000000000000000000 + 0000A97E6600FEF1EA00FEF1EA00FCECE300FAE4D900F6DBCC00F3D1C000F0C9 + B400EEC1A900ECBCA20077300A00000000000000000000000000FEFDFD00EFDD + CC00E1A97700D8894E00E4915D00F5A67A00F7A97E00E8956300D8895100DCA2 + 7000EDD9C700FEFEFD0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFF0A900EC885E00FFC28800CF94 + 7A00AF6F1100E8BE4700E5541C00FFFFE200DBE58800AC631F00FFF3A100ED9D + 6200B8872B00D9AE1700BE921700C0AA4A000000000000000000A5795F008047 + 2800804728007F4425007E4121007C3E1C007B3A18007936130078330E007730 + 0B00762E0800EEC1A80077320D000000000000000000FDFCFC00E8CEB800D383 + 4A00AB49180098391300AF512E00C6694600C96C4900B65936009C3F1A00A444 + 1400C7774000E5C8B000FDFDFC00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FCF2B200FFEEAF00FFF6AA00F3DE + B80096642800814A17009B552600FFFFF400E1E7A000FFF4AC00FFF4AB00FFEF + AC00A8854100BC833E00BB9842007D5532000000000000000000A97E6600FEF1 + EA00FEF1EA00FCECE300FAE4D900F6DBCC00F3D1C000F0C9B400EEC1A900ECBC + A20077300A00F0C7B100783410000000000000000000EDDACE00CA7E4A009238 + 0F007A20000087391C00944A2E00973F1C00983F1C00964C3100883C20007B22 + 010089300A00BB6F3E00E9D4C600000000000000000000000000000000000000 + 000000000000000000000000000096492400EADBD30000000000000000000000 + 000000000000000000000000000000000000FFEDAB00F3916900B0810700C8D5 + 6100EA9C5A00FF897B00C8C11400FFFFDF00E6EE9100A6611B00B2480B00E6FB + 3B00FFEFAB00F3AB6500AD781000C8D75E00A5795F0080472800804728007F44 + 25007E4121007C3E1C007B3A18007936130078330E0077300B00762E0800EEC1 + A80077320D00F2CEBB007A37140000000000F8F3F100D49C75008B3D15006017 + 000071250900BA9B8F00D4C7C30094503500924A2E00D1C2BD00BCA29A00752C + 1200631800007B300D00C58A6500F6EFED000000000000000000000000000000 + 00000000000000000000000000009D4D25009D4E2800EADBD300000000000000 + 000000000000000000000000000000000000FFF4A900FFECA800D03514008545 + 2300FFF0A300FFD9B600D8351400FFFFF200E5ED9000FFF89F00D13C2200AE38 + 0E00FFF8A500FFF1A400BE311600863C2200A97E6600FBEFEB00CFA89500C799 + 8300BA928000A783710096746300856557004A372B00574B3F0077300A00F0C7 + B10078341000F5D7C6007B3A180000000000E9D2C400A9623800521A04005114 + 000063240F00CBBCB800F7FAFB00985F4B0091554200F0F0F100D6CAC7006B30 + 1D00551400004D160200904D2800E4CABB00000000000000000000000000CF83 + 5D00924723009A4B2500A24F2700AB542900BF6A3F00A0502A00EADBD3000000 + 000000000000000000000000000000000000FFF6A40094410D00FFF1A6007D53 + 2900FFF49C00865E0600F2AE6B00FFFFF400DFE98C009B521600FFFA9700924E + 0B00FFF8A00095580E00FFF69800714F2100AE856D00FFFFFF00F3DFD500DCAF + 9800D39F8700CA9B8500C1978200523928009F85740039342F0077320D00F2CE + BB007A371400F8DFD2007C3D1B0000000000DAB19B00783A1800320B00003F0F + 0000511E0F00C4B8B500F5F7F800925D4A008A534000EDEDED00D3C9C700612E + 1D0047100000340B00005E290F00CBA28D00000000000000000000000000D78B + 6500FDB08900F7905C00EC885600DE7F4F00D1764800C46E4200A2563100EADB + D30000000000000000000000000000000000FFFFE500FFFFE100FFFFE100FFFF + EA00FFFFE100FFFFDF00FFFFE300FFFFF800FFFFE600FFFFE200FFFFE200FFFF + E100FFFFE500FFFFE200FFFFE100FFFFEC00B28B7400B4A39600FEFBFA00F1DF + D500DFB19B00C9A79700715B4C00C7B4AA0070655D004B423F0078341000F5D7 + C6007B3A1800FBE6DB007D401F0000000000C4927D005D2B1200360E0100581B + 03006C2D1500CABBB700F5F7F800AA6E5600A3644C00EDEDED00DBCEC9008744 + 2900732708005C1E0500652A0D00B6826D00000000000000000000000000DE92 + 6C00FCB99700FDA57800FC935E00F28C5900E5845300D87B4C00C66E4100AE58 + 2B0000000000000000000000000000000000FFFFF100FFFCF700FFFFE500FFFF + EA00FFFFEB00FFFFDD00FAFFE500FFFFF900FFFFEF00FFFEF400FFFFEF00FFFF + DE00FFFFF200FFFFDF00FCFFE300FCFFF000B7927B00ECE5E100AE9A8A00FCF5 + F200F0DDD2006D5646009D8A7F009D8E86004C342900ECBCA2007A371400F8DF + D2007C3D1B00FCEDE4007E43230000000000CA957E0099481D008A3511009B3F + 170097472600D1C0BA00F6F7F800BC7E6300B3735900EDEDED00E1D2CC00A458 + 3800A1441B009B401800A5491C00C4897100000000000000000000000000E498 + 7200FBC3A600FDBE9E00FEAE8500FFA87D00F89D6F00E5835100AE582B00F4E7 + E10000000000000000000000000000000000FFF1A000A8521C00E4692700989C + 3300BA752500DC931F00DCFF4C00FAFFE600CDD87C00FFDF9F00CB3E1100ABA0 + 020099551A00DA661F00E4FF4800C2ED8600BC988200FFFFFF00E2D8D200AF99 + 89009E897C00C5A89800BAABA300BBA79D00FDDAC800EDC3AC007B3A1800FBE6 + DB007D401F00FEF1EA007F45250000000000DCB09C00C2643300AD502800B055 + 2C00AA573700D6C3BD00F6F7F800CA8C7100C07F6500EDECEC00E6D6D000B669 + 4800B4582F00B0552D00B95E2F00D4A49100000000000000000000000000E89C + 7600E2967000DA8E6800D1855F00DB906A00F79A6B00AE582B00F4E7E1000000 + 000000000000000000000000000000000000FFF79E00D4985600DA5541007E1D + 1F00AD842700CFB53F00D4801000FFFFE000D9E98B00A2781F00FFDDB700FF72 + 730086571300EACA4800BD911600BCAD4900C09D8800FFFFFF00FFFFFF00E6DC + D600E9DACD00E2E2F2005568CC003554CF00D0C3D400EECAB8007C3D1B00FCED + E4007E432300A2745A009E6F540000000000E4CBC300D6865C00D4794F00D377 + 4F00C8755200DECBC300F7F9FA00E1A38900D7977B00EEEEEE00EDDDD700D386 + 6500D67A5100D67C5200CF7C5300E1C4BB000000000000000000000000000000 + 0000000000000000000000000000E5997300C5764E00F3E6DF00000000000000 + 000000000000000000000000000000000000FFEEAD00E39F5E00C7A24800906B + 3F00957B1100A97B2700C0732A00FFFFE900D7E58D00FFEFA800FFF1A300D793 + 5000935D1E00A6791000987B13008C6F3200C4A38E00FFFFFF00FFFDFC00FFFF + FF00FFFFFB006572C9004BA0ED002374CB002A4AC100EED3C5007D401F00FEF1 + EA007F452500000000000000000000000000F5F0F000DBA38800F2A07300F49A + 7100EA956F00E1C0B100E9DCD600F0AD9000ECA58500E4D3CB00E8CABB00ED9C + 7800F79D7300F39F7200D7997F00F2EBEB000000000000000000000000000000 + 0000000000000000000000000000E89C7600F8EDE80000000000000000000000 + 000000000000000000000000000000000000FFE4BB00C17C6D0099823200C3C9 + 820085522A00821E1C00ACB03F00FFFFEB00CAD198009762410084461E00E1ED + 7500FFE4BB00DE9E860090772F00D3DD9100C7A79200FFFFFF00FFFBFA00FFFB + FA00FFFFFD008D97D20093C3E8004EA5EF00656CBA00EFDBD1007E432300A274 + 5A009E6F540000000000000000000000000000000000E5D2CD00E6A78200FFBE + 9600FEB99600EFB29300E9AF9300F9B69500FAB69400E6AC8F00EBAE9000FCB9 + 9500FFBF9800E4A07E00E2CAC500000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFF1A700C3673200EF6F3A008971 + 2900975F0E00D1492F00D64F1700FFFFE900DEEC8E00FFEDA800C03B0F00B584 + 1800FFF3A800F2A36400E56E370092762F00E2BDA600FFFFFF00FFFFFF00FFFF + FF00FFFFFF00E2E5F5009BA5DD008D96D300ECE9F100FEF1EA007F4525000000 + 00000000000000000000000000000000000000000000FCFCFC00DFC2BA00E5B1 + 9100FBD2B300FFD8BD00FFD6BD00FFD5BC00FFD5BC00FFD7BE00FFD9BF00FBD2 + B500E4AD9100DDBDB500FCFBFB00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFEFA800F18C6500F8A16800CE96 + 7900F2A36400E5AF6200AB631B00FFFEF700DCEC8E00AD572100FFEEA400FC93 + 7200FFF0AB00EF955F00EF9F6000D1917900E2BDA600E2BDA600C1A08A00C1A0 + 8A00BD998300B7927B00B28A7200AC826A00A77B6200A2745A009E6F54000000 + 0000000000000000000000000000000000000000000000000000FDFDFD00E3CF + CA00DCB29E00E6C2AA00F4D7C100FEE3CE00FEE4CE00F4D8C200E6C1AA00DBAF + 9B00E2CBC700FDFDFD0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFF3AF00FFEEAB00FFF7A700FDDF + B600FFF3A800FFF1A100FFF79F00FFFFF400DEE99900FFF6A900FFF5A900FFEE + AE00FFF6AC00FFEFAB00FFF3A800FFE4BB000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000F3EDED00E2CBC400DDBDB300D7AEA400D6ADA200DCBBB000E2C8C200F1EA + EA00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000008442 + 3100844231000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000008442 + 3100844231000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000008C42 + 39008C4239000000000000000000000000000000000000000000000000000000 + 0000F0E1D900CB9E8700AE7050009956330099563300B1725200D1A28A00F4E5 + DE0000000000000000000000000000000000F3F1EF00E3DEDB00927A69008C75 + 630087705E00E3DEDB007F6654007A624F00755D4A00E3DEDB006E5441006A51 + 3E00674E3A00E3DEDB0000000000000000000000000000000000000000000000 + 000000000000DEEAE00000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000A552 + 4200A5524200A5524200A54A42009C4A42009C4A42009C4A3900944A39009442 + 39008C4A39008C4239008C4239008C423900000000000000000000000000E2C8 + BB00B5785700A7562D00B45C2E00B65C2E00B55C2D00B55C2D00BB5F3300D38D + 6A00F1D5C700000000000000000000000000E3DEDB00AE988800EFE3DD00F2E7 + E100EDDFD700836B5900B79B8B00DBBDAD00D9B7A60072594600AE8B7700D0A6 + 9200CC9E8700654B3800E3DEDB00000000000000000000000000000000000000 + 00000000000009631400DEEAE000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000B55A + 4200AD524200AD524200A5524200A5524200A5524200A55242009C4A42009C4A + 42009C4A3900944A3900944A39008C4A39000000000000000000F1E2DA00B778 + 5700B35B2E00DF835300F29A6C00F1996E00EE966900E78D5E00DC7D4D00D476 + 4800E09C7900F9EAE3000000000000000000B7A29300FBF8F700F9F4F200F7F0 + EC00F4EBE600F1E5DF007F6754007A624F00765D4A00735946006E5542006B52 + 3E00674E3A00654B380063493500000000000000000000000000000000000000 + 00000000000011681B0004600F00DEEAE0000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000B55A + 4A00B55A4A00B5524A000000000000000000000000000000000000000000A552 + 42009C4A42000000000000000000000000000000000000000000CE9F8700AA57 + 2D00DF835300FBAD8700FECBB000FDE9DF00FBE7DD00F1BCA100DC885D00D87A + 4A00E58D5F00F3C4AD000000000000000000B7A29300FDFCFB00FBF9F700FAF5 + F200F7EFED00F4EAE600F2E5DF00DDDCD700DFD7CE00DECDC000DEC5B600DEBF + AC00DBBAA600D8B5A30063493500000000000000000000000000000000000000 + 0000000000001A6F240020732C0004600F00DEEAE00000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000C65A + 4A00BD5A4A0000000000B55A4A0000000000000000000000000000000000AD52 + 4200A55242000000000000000000000000000000000000000000B5745300B85C + 2F00F0966800FDC8AE0000000000000000000000000000000000DCA58900CB6D + 3F00ED946500F4B291000000000000000000B7A29300FFFFFF00B47F6500B47F + 6400EDDDD500B37E6300F4EBE600F1E5DF00EFDFD700EBD9D100E8D3C900E5CD + C100E1C6B900D6B3A100634A3500000000000000000000000000000000000000 + 00000000000023752E002F833D0020732C0004600F00DEEAE000000000000000 + 000000000000000000000000000000000000000000000000000000000000C663 + 4A00C6634A000000000000000000BD5A4A00000000000000000000000000B552 + 4200AD5242000000000000000000000000000000000000000000A0583400BA5E + 3100EC946600FBE7DC0000000000000000000000000000000000EFDAD000BF65 + 3600EE956600F3A985000000000000000000B9A49500FFFFFF00FFFFFF00FDFC + FC00FCF9F700FAF4F200F6F0EC00F4EBE500F2E5DF00EEDFD800EBD9D000E8D3 + C800E5CCC100DBBDAD00634A3600000000000000000000000000000000000000 + 0000000000002E7C370050A25A002F833D0020732C0004600F00DEEAE0000000 + 000000000000000000000000000000000000000000000000000000000000D663 + 5200CE635200000000000000000000000000C65A4A000000000000000000BD5A + 4A00B55A4A000000000000000000000000000000000000000000A0583400B65C + 2E00DE825300F7E3D80000000000D4886200FEFCFC0000000000EFDAD000BD60 + 3300ED956700F3AB87000000000000000000BDA79800FFFFFF00968E8800EEDE + D700968E8700EDDDD600968D8600958C8500F4EBE600F2E5DF00EFDFD800ECD9 + D000E8D3C900E0C7BA00634A3500000000000000000000000000000000000000 + 000000000000388341005DB0680050A25A002F833D0020732C000B661800DEEA + E00000000000000000000000000000000000000000000000000000000000D66B + 5200D663520000000000000000000000000000000000C65A4A0000000000C65A + 4A00BD5A4A000000000000000000000000000000000000000000B6765500B65C + 2E00CE6E3D00E5AE9100E9C2AE00DC926D000000000000000000CE997E00BF63 + 3500EF976C00F5B694000000000000000000C1AB9C00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FDFCFC00FBF8F700FAF4F200F7F0EC00F4EAE600F1E5DF00EEDF + D700EBD9D000E6D1C600634A3500000000000000000000000000000000000000 + 000000000000438A4C006BBF76006BBF760050A25A002F763900D6EDD9000000 + 000000000000000000000000000000000000000000000000000000000000DE6B + 5200DE6B52000000000000000000000000000000000000000000CE635200CE63 + 5200C6634A000000000000000000000000000000000000000000D5A58C00BE62 + 3300D06B3800DB7C4D00DE855600E8A17D000000000000000000A65E3A00CB6F + 4300F6A37800FACCB3000000000000000000C5AFA000FFFFFF00B4806500B480 + 6500968E8800C2B0A300968E8700968E8600F9F4F200F7EFEC00F4EBE600F2E5 + DF00EFDFD800EADBD10063493600000000000000000000000000000000000000 + 0000000000004B9053006BBF7600A3DAB0002F763900D6EDD900000000000000 + 000000000000000000000000000000000000E76B5A00E76B5A00E76B5A00E76B + 5A00E76B5A00E76B5200DE6B5200DE6B5200DE635200D66B5200D6635200D663 + 5200CE6352000000000000000000000000000000000000000000F5E6DF00D48F + 6A00DB784600F18E5C00F69E7000F4AF8C000000000000000000BE7A5500E48F + 6500FDBC9E00FEEFE8000000000000000000C8B2A300FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FDFCFC00FCF8F700F9F5F200F7F0EC00F4EB + E600F1E5DF00EEE2DA00644A3600000000000000000000000000000000000000 + 00000000000052945A00A3DAB0002F763900D6EDD90000000000000000000000 + 000000000000000000000000000000000000E76B5A00E76B5A00E76B5A00E76B + 5A00E76B5A00E76B5A00E76B5A00E76B5A00E76B5200DE6B5200DE635200D66B + 5200D66B5200000000000000000000000000000000000000000000000000E2AF + 9400E68E6100FAA27600FFB08800FCB997000000000000000000FBF2ED00F6BF + A400FEE3D500000000000000000000000000C9B4A500FFFFFF00FFFFFF0066A3 + 650066A3650066A36500C0B4AD0066A3650066A3650066A26400FAF5F200F7F0 + EC00F4EBE600EEE2DA00644A3600000000000000000000000000000000000000 + 000000000000589860002F763900D6EDD9000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000E76B + 5A00E76B5A000000000000000000000000000000000000000000000000000000 + 000000000000DE6B520000000000000000000000000000000000DA8F6A00E39A + 7600EDA78300F6B28F00FCB99700FCB997000000000000000000000000000000 + 000000000000000000000000000000000000C8B2A300FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FEFCFB00FBF9F700FAF4 + F200F7F0ED00F3EAE400644A3600000000000000000000000000000000000000 + 00000000000058986000D6EDD900000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000E76B + 5A00E76B5A000000000000000000000000000000000000000000000000000000 + 00000000000000000000DE6B5200000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000C8B2A300CAB4A500CBB5A600CAB4 + A500C9B3A400C7B2A300C6B0A100C3AE9F00C1AC9D00BFAA9B00BDA89900BBA6 + 9700B9A49500B8A39400B7A29300000000000000000000000000000000000000 + 000000000000D6EDD90000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000E76B + 5A00E76B5A000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FDF6F000E9AC7A00D9701F00D96E1C00E0894900EDB99400EDB8 + 9400D96F2900D96C2900E5A17500FCF4F0000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000F1CAAA00E18F4C00EBB18300E3914E00DA732300DA742800E088 + 4800E7A27000E3935C00DB753300F4D5C2000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000F3F1EF00E3DEDB00927A69008C75 + 630087705E00E3DEDB007F6654007A624F00755D4A00E3DEDB006E5441006A51 + 3E00674E3A00E3DEDB0000000000000000000000000000000000000000000000 + 000000000000F6DEC800E28D4400ECB58800DC7A2C00FDF6F000FAECE100DE83 + 3C00E6A47100DC7A3400F5D6C200000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000007B7B7B00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF000000000000000000E3DEDB00AE988800EFE3DD00F2E7 + E100EDDFD700836B5900B79B8B00DBBDAD00D9B7A60072594600AE8B7700D0A6 + 9200CC9E8700654B3800E3DEDB00000000000000000000000000000000000000 + 00000000000000000000E59B5A00E6995900E4975500EEC19B0000000000EEBE + 9700E18C4C00E18B4900EDBA950000000000000000000000000000000000E39A + 7500B6623900B05C3300A7532A009D482000923E160089340D00822D0600812C + 05000000000000000000000000000000000000000000000000007B7B7B000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF000000000000000000B7A29300FBF8F700F9F4F200F7F0 + EC00F4EBE600F1E5DF007F6754007A624F00765D4A00735946006E5542006B52 + 3E00674E3A00654B380063493500000000000000000000000000000000000000 + 00000000000000000000FDF7F200E8A56B00E5985600E5955300E4955500E7A4 + 6F00E69D6300E8A46D00E18D4B0000000000000000000000000000000000E397 + 7000F3BCA000D7A18300CE8D6D00C17C5900AF6B4800A76240009B583700812C + 05000000000000000000000000000000000000000000000000007B7B7B000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0000000000FFFFFF000000000000000000B7A29300FDFCFB00FBF9F700FAF5 + F200F7EFED00F4EAE600F2E5DF00DDDCD700DFD7CE00DECDC000DEC5B600DEBF + AC00DBBAA600D8B5A30063493500000000000000000000000000000000000000 + 000000000000549C5C0039853F00317A37007F7A3200967B3000E8A36700DF7E + 2C00E3925000EBB38600DC772800FDF6F000000000000000000000000000E79B + 7400F9C9AF00F5B59400EDA37E00E6956C00DA855900CE794E00AC6543008530 + 09000000000000000000000000000000000000000000000000007B7B7B000000 + 0000FFFFFF00FFFFFF00FFFFFF00FF000000FF000000FFFFFF00FFFFFF00FFFF + FF0000000000FFFFFF000000000000000000B7A29300FFFFFF00B47F6500B47F + 6400EDDDD500B37E6300F4EBE600F1E5DF00EFDFD700EBD9D100E8D3C900E5CD + C100E1C6B900D6B3A100634A3500000000000000000000000000000000000000 + 0000000000000000000045944D00BCB27200E8A05E00BD823800FDF7F2000000 + 0000ECB28200E69E6100E1924E00F1C9A800000000000000000000000000EA9E + 7800F9D0BB00F8BDA100F4B09000EF9F7900E6926800DC845900B46B48008B36 + 0F000000000000000000000000000000000000000000000000007B7B7B000000 + 0000FFFFFF00FFFFFF00FF000000FFFFFF00FFFFFF00FF000000FFFFFF00FFFF + FF0000000000FFFFFF000000000000000000B9A49500FFFFFF00FFFFFF00FDFC + FC00FCF9F700FAF4F200F6F0EC00F4EBE500F2E5DF00EEDFD800EBD9D000E8D3 + C800E5CCC100DBBDAD00634A3600000000000000000000000000000000000000 + 000000000000A1CFA60071B67A00B6C59000E69B5500E8A46500F0C095000000 + 0000EEBD9300E69F6100E5985800EFC19C00000000000000000000000000EFA3 + 7D00FBD7C800F8C7AD00F7B79800F2AB8800ED9F7A00E6946D00BE775500923E + 16000000000000000000000000000000000000000000000000007B7B7B000000 + 0000FFFFFF00FFFFFF00FF000000FFFFFF00FFFFFF00FF000000FFFFFF00FFFF + FF0000000000FFFFFF000000000000000000BDA79800FFFFFF00968E8800EEDE + D700968E8700EDDDD600968D8600958C8500F4EBE600F2E5DF00EFDFD800ECD9 + D000E8D3C900E0C7BA00634A350000000000E9AA7900DE813A00DD803900D869 + 1A00979D540080C58800B0DCB60075B87C0090934A00E4964A00E8A36100E28B + 3C00E69E5C00E9A96F00E4995600F2CDAC00000000000000000000000000F3A8 + 8100FBE1D300F9CEBA00F8BFA500F3B39400F2A88500EB9F7A00D08D6C009A46 + 1E000000000000000000000000000000000000000000000000007B7B7B000000 + 0000FFFFFF00FFFFFF00FF000000FFFFFF00FFFFFF00FF000000FFFFFF00FFFF + FF0000000000FFFFFF000000000000000000C1AB9C00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FDFCFC00FBF8F700FAF4F200F7F0EC00F4EAE600F1E5DF00EEDF + D700EBD9D000E6D1C600634A350000000000F3D2B700E0874200ECB488000000 + 000095B7720088CB900083C68B008CC59200FDFEFD006A9C5B00F1CCA700EAAE + 7300EAAB7000ECB27C00F3CFB00000000000000000000000000000000000F6AD + 8600FBE5DA00FBDACA00F9CAB300F8C2A800F6B69800F3B39100DCA38700A24E + 25000000000000000000000000000000000000000000000000007B7B7B000000 + 0000FFFFFF00FFFFFF00FFFFFF00FF000000FF000000FFFFFF00FFFFFF00FFFF + FF0000000000FFFFFF000000000000000000C5AFA000FFFFFF00B4806500B480 + 6500968E8800C2B0A300968E8700968E8600F9F4F200F7EFEC00F4EBE600F2E5 + DF00EFDFD800EADBD1006349360000000000FDF6F100DE7E2F00E7A46F000000 + 0000FDF6F00090A3520088A45500FDFEFD000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FAB0 + 8A00FCE1D500FBE2D400FAD8C600F9CDB900F9CAB300F9C6AC00F5BB9D00AA55 + 2D000000000000000000000000000000000000000000000000007B7B7B000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0000000000FFFFFF000000000000000000C8B2A300FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FDFCFC00FCF8F700F9F5F200F7F0EC00F4EB + E600F1E5DF00EEE2DA00644A36000000000000000000E8A36800DF7E2E000000 + 000000000000E2904F00DE833A00F5D8C2000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FDB3 + 8D00FAB08A00F6AD8600F3A88100EFA37D00EA9E7800E79B7400E3977000E39A + 75000000000000000000000000000000000000000000000000007B7B7B000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF000000000000000000C9B4A500FFFFFF00FFFFFF0066A3 + 650066A3650066A36500C0B4AD0066A3650066A3650066A26400FAF5F200F7F0 + EC00F4EBE600EEE2DA00644A36000000000000000000F1C8A300E59B5900E8A3 + 6800EEBA9000E3925000DD7F3200FAECE2000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000007B7B7B007B7B + 7B007B7B7B007B7B7B007B7B7B007B7B7B007B7B7B007B7B7B007B7B7B007B7B + 7B007B7B7B007B7B7B000000000000000000C8B2A300FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FEFCFB00FBF9F700FAF4 + F200F7F0ED00F3EAE400644A36000000000000000000F9E8D900E5944C00E9A8 + 6E00EAAE7800E8A36800F4D4B900000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000C8B2A300CAB4A500CBB5A600CAB4 + A500C9B3A400C7B2A300C6B0A100C3AE9F00C1AC9D00BFAA9B00BDA89900BBA6 + 9700B9A49500B8A39400B7A29300000000000000000000000000E2904100E69D + 5900000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000F5D5B500E6954700E69A + 4E00FBF0E6000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000BD4A0000BD4A0000BD4A0000BD4A0000BD4A0000BD4A0000BD4A0800BD4A + 0800BD4A0000BD4A0000BD4A0000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000A7B3B2004A0000004D0000004600 + 010048000B004A0017004C0025004D00310050003C0051024700530552004C09 + 5500440A57003B035900330060000C002E000000000000000000000000000000 + 00000000000000000000B4A2A20073383800763B3C00602E2F00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000B5420000FFFFFF00FFFFFF00A5A5A500A5A5A500FFFFFF00FFFF + FF00A5A5A500A5A5A500AD42000000000000000000005A636300182121001821 + 21005A6363000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000A6000400A01021009614 + 3000981A40009C1D50009F246600A1287800A42D8700A6339800AA37A8009F3C + AD00943EAE008634B2007A2BBC00411472000000000000000000000000008C63 + 64007A4444008F4243008E7A7A008E4B4B00C4616000602D2D0000000000B560 + 60006E343500CBABAB0000000000000000000000000000000000000000000000 + 00000000000000000000A5420000FFFFFF00A5A5A500A5A5A500FFFFFF00FFFF + FF00A5A5A500A5A5A500A5420000000000005A6363003984B500399CE700218C + D6002173A5002121290000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000009F0003009A1020009013 + 2E0092193D00961C4D00992362009A2673009E2C8100A0319200A334A200993A + A6008E3CA7008132AB00752AB5003E136D0000000000ECDADB009D676800C176 + 7700C97B7B00642E2E006D353600BB666700C867660090454500562B2C007338 + 3900A851510076383900BA959500000000000000000094390000000000000000 + 000000000000000000000000000094390000FFFFFF00FFFFFF00A5A5A500A5A5 + A500FFFFFF00FFFFFF009439000000000000182121007BC6FF0073C6FF004AAD + EF003194DE001010100000000000000000000000000000000000000000005A63 + 630018212100182121005A63630000000000000000009F0003009A1020009013 + 2E0092193D00961C4D00992362009A2673009E2C8100A0319200A334A200993A + A6008E3CA7008132AB00752AB5003E136D0000000000E0BFC000A65E5E00E493 + 9300E08C8C00CB7C7C00C5757400D1757500CC6E6E00C8676700A3535300B458 + 5700C15D5C00BA5A590070383900000000000000000084310000843100000000 + 00000000000000000000000000000000000084310000FFFFFF00A5A5A500A5A5 + A500FFFFFF00FFFFFF0084310000000000001010100084D6FF009CE7FF0073C6 + FF005AB5EF0018212100000000000000000000000000000000005A6363003984 + B500399CE700218CD6002173A50021212900000000009F0003009A1020009013 + 2E0092193D00961C4D00992362009A2673009E2C8100A0319200A334A200993A + A6008E3CA7008132AB00752AB5003E136D0000000000E6CBCC00CA8D8D00BC75 + 7500E5939300E08C8C00DC858500D67D7D00D1767500CC6E6D00C8676600C361 + 6100BE5C5B00753A3B00DCC3C300000000000000000073290000CE5208007329 + 0000000000000000000000000000000000007329000073290000FFFFFF00FFFF + FF00A5A5A500A5A5A50073290000000000002121210073ADCE009CDEFF009CDE + FF0073A5CE005A63630000000000000000000000000000000000182121007BC6 + FF0073C6FF004AADEF003194DE0010101000000000009F0003009A1020009013 + 2E0092193D00961C4D00992362009A2673009E2C8100A0319200A334A200993A + A6008E3CA7008132AB00752AB5003E136D000000000000000000AA8E8F00B36A + 6C00E5979800E5939300C2747500A4606100A05C5D00B9686800CC6E6D00C767 + 6600A55353006430310000000000000000000000000063290000CE520800E77B + 420063290000000000000000000063290000632900006329000063290000FFFF + FF00A5A5A500A5A5A5006329000000000000000000005A636300182121000000 + 00005A63630000000000000000000000000000000000000000001010100084D6 + FF009CE7FF0073C6FF005AB5EF0018212100000000009F0003009A1020009013 + 2E0092193D00961C4D00992362009A2673009E2C8100A0319200A334A200993A + A6008E3CA7008132AB00752AB5003E136D00D8C9CA00B75A5B00AC595A00B45C + 5D00EFA2A300C178790087515100E8CDCD00DBB7B800BE858600B8676700CC6E + 6D00C86766008D3B3B00703839006E3637000000000052210000CE520800E77B + 4200F7AD7B005A2100005A2100005A2100005A21000000000000000000005A21 + 0000FFFFFF00FFFFFF005A210000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000002121210073AD + CE009CDEFF009CDEFF0073A5CE005A636300000000009F0003009A1020009013 + 2E0092193D00961C4D00992362009A2673009E2C8100A0319200A334A200993A + A6008E3CA7008132AB00752AB5003E136D00C6B1B100DD858600FCB6B800F9B1 + B200F4AAAB007D3D3D00B1717000CDADAF00E6D4D500B17675009B575800D175 + 7500CC6E6D00C7676600C46161007D3D3E00000000004A180000CE520800E77B + 4200F7AD7B00FFCEB5004A1800004A1800000000000000000000000000000000 + 00004A180000FFFFFF004A180000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000005A63 + 630018212100182121005A63630000000000000000009F0003009A1020009013 + 2E0092193D00961C4D00992362009A2673009E2C8100A0319200A334A200993A + A6008E3CA7008132AB00752AB5003E136D00C5B0B100DE868600FDC0C100FBB5 + B600F8B1B20090494900DA939400824445008E555600C27E7F0099575800D67E + 7D00D1767500C5696A009E515200804041000000000039180000CE520800E77B + 4200F7AD7B00FFD6B500FFF7EF00391800000000000000000000000000000000 + 0000000000003910000039180000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000009F0003009A1020009013 + 2E0092193D00961C4D00992362009A2673009E2C8100A0319200A334A200993A + A6008E3CA7008132AB00752AB5003E136D0000000000E5999A00E2A3A400E095 + 9600FAB4B600DB929300A96E6F00E7A4A500E49F9F00B0797900C0737400DB85 + 8400CE787800A35D5D00AE787800A67272000000000029100000CE520800E77B + 4200F7AD7B00FFD6B500FFF7EF00BDE7FF002910000000000000000000000000 + 0000000000000000000029100000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000009F0003009A1020009013 + 2E0092193D00961C4D00992362009A2673009E2C8100A0319200A334A200993A + A6008E3CA7008132AB00752AB5003E136D00000000000000000000000000BB60 + 6100FBB6B700FDB7B800D78E8F008B48490088474800D1868700E4939300E08C + 8C00C37575006533340000000000000000000000000018080000CE520800E77B + 4200F7AD7B00FFCEB500FFF7EF00BDE7FF004AADF70018080000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000009F0003009A1020009013 + 2E0092193D00961C4D00992362009A2673009E2C8100A0319200A334A200993A + A6008E3CA7008132AB00752AB5003E136D000000000000000000BC515100F8B2 + B300FFBBBC00FDB9BA00FCB7B800F9B1B200F4AAAB00EEA3A300E8999900E593 + 9400E08C8C00BE7172007A484800000000000000000008000000CE520800E77B + 4200F7AD7B00FFCEB500FFF7EF00BDE7FF004AADF7000884EF00080000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000009F0003009A1020009013 + 2E0092193D00961C4D00992362009A2673009E2C8100A0319200A334A200993A + A6008E3CA7008132AB00752AB5003E136D000000000000000000E5949300FAB5 + B600FEB9BA00CA7A7A00C3747500FCB6B800F9B1B200C07A7B00A2626300B873 + 7400E5939300C3787800A5656600000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000A6000400A01021009614 + 3000981A40009C1D50009F246600A1287800A42D8700A6339800AA37A8009F3C + AD00943EAE008634B2007A2BBC0041147200000000000000000000000000E8A2 + A200DE8F900000000000CF8A8D00FFBBBC00FCB6B700A0575A0000000000DAAF + B000A9696800AA696A0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000B1BEBD005C000000600A14005A0C + 1D005B0F26005D1130005F163D0060184800621B5100641E5B00662165005F24 + 680058256800501F6A00491A7100260C44000000000000000000000000000000 + 00000000000000000000CE888900D7909100CD818200CD7B7C00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000002929290000000000293131000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000E77B42000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000D7D7D70072747400C6C7C7000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000DE733100DE733100DE7331000000 + 00000000000000000000E77B3900E77B3900E77B420000000000000000000000 + 0000E7844A00E7844A00E7844A000000000000000000DCD5C900E1BB9B00E6A5 + 7200EA935100EC883800EF832D00ED8B3900EA975200E7A97200E2BD9B00DCD6 + C900000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000C6C7C6004D504F00328DB300436674000000000000000000000000000000 + 0000ADEFFF0084DEFF0084DEFF000000000000000000084273001894FF000000 + 0000C6A5F700AD7BF700AD7BF70000000000DE6B2900DE6B2900000000000000 + 000000000000DE733100DE733900DE7B3900E77B3900E77B3900000000000000 + 000000000000E7844A00E7844A000000000000000000E7A66B00F0852B008269 + 57007B614F00F0862B00F0862B00F0872B00F0862B00F0862B00F0862B00E7A6 + 6B00000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000C6C7 + C6004D504F002B97C60087D8EF006493A5000000000000000000000000000000 + 0000ADEFFF0084DEFF0084DEFF0000000000000000001894FF001894FF000000 + 0000C6A5F700AD7BF700AD7BF70000000000DE6B210000000000DE6B29000000 + 0000000000000000000000000000DE7331000000000000000000000000000000 + 0000E77B420000000000E78442000000000000000000DCD7C900E2BF9B00B9A6 + 9800FFFFFF007259450063483300EE8D3900EB9A5200E7AA7200E2BF9B00DCD6 + C900000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000C6C7C6004D50 + 4F002B97C60087D8EF006493A500000000000000000000000000000000000000 + 0000ADEFFF00ADEFFF0031424A0000000000105A7B0021BDFF0021BDFF000000 + 0000C6A5F700C6A5F700C6A5F70000000000000000000000000000000000DE6B + 2900000000000000000000000000DE733100000000000000000000000000DE7B + 3900000000000000000000000000000000000000000000000000000000000000 + 0000B9A69800E5DEDB00B59C8F00715642000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000E8E2 + DE00CDBAAD00937C6B0077584400775843009C7D6B00ABADAC002D3442002B97 + C60087D8EF006493A50000000000000000000000000000000000000000003110 + 0000180800001808000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000BD4A0800BD4A + 0800BD4A0800BD4A0000C64A0000C64A0800C64A0000C64A0800C64A0000C64A + 0800C64A08000000000000000000000000000000000000000000000000000000 + 0000B9A69800FFFFFF00E7DCD800B59C8F007055410000000000000000000000 + 0000000000000000000000000000000000000000000000000000DED6D0008668 + 54009D816500BFA27E00D0AD8700B4957300937559006E5440004F80910087D8 + EF006493A50000000000000000000000000000000000846B5A0029080000B57B + 5A00EFE7DE00E7CEC600AD735200290800006B73730052BDFF0052BDFF000000 + 0000EF842100DE631800DE6318000000000000000000B54200007B5AA5001810 + E7006B296B00B54A00008CBD8C0031EFA5007B944200BD4A0800E78C7300F76B + 6300D6522900BD4A000000000000000000000000000000000000000000000000 + 000000000000B9A69800FFFFFF00E7DDD700B59C8F0070554100000000000000 + 00000000000000000000000000000000000000000000F7F5F300896E5C00C1AB + 8B00ECD1AA00EED2AE00ECCFA700E7C79E00D8B28A00A1816200725642006493 + A500000000000000000000000000000000000000000031080000EFDECE00EFE7 + D600FFEFE700F7EFE700FFF7EF00E7D6CE0039100800637B940052BDFF000000 + 0000EF842100DE631800DE6318000000000000000000A54200003129F7000000 + FF002108CE00AD4200004AF7E70018FFBD0031D68400AD420000FFADAD00FF6B + 6B00EF524A00B542000000000000000000000000000000000000000000000000 + 00000000000000000000B9A69800FFFFFF00E6DCD600B59C8F00725844000000 + 00000000000000000000000000000000000000000000C5B7AE00B0998100F2DF + BA00F3E1C100F2E1C100F0DEBB00EDD8B200E7CBA300D3AD8700927357006D66 + 5D000000000000000000000000000000000039292100D6AD9400FFEFD600CEAD + 9C00EFD6C600EFDECE00F7E7D600EFE7D600D6B5A500181810006BD6FF000000 + 0000EF842100EF842100EF84210000000000000000009C3900003129F7000000 + FF002110CE009C3900004AF7E70021FFDE0031DE9400A5420000FFADAD00FF94 + 9400EF635200AD42000000000000000000000000000000000000000000000000 + 0000000000000000000000000000B9A69800FFFFFF00DED0CA00B59C8F007258 + 4400BCCBCE007A848500000000000000000000000000B19E9100CDBCA400F4E8 + CC00F6EED700F7EFDA00F4EAD200F2E2C500ECD5B300E3C39D00B5947200886E + 5E000000000000000000000000000000000000000000F7E7D600F7CEB500AD7B + 6300A5735A00A57B6300B5947B00DEC6AD00FFF7DE0000000000000000000000 + 00000000000000000000000000000000000000000000943900007352A5002121 + FF007352A5009439000084B58C0042FFEF0084B58C009C390000DE847300FFB5 + B500DE8473009C39000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000B9A69800FFFFFF00DED0CA00CAB7 + AD001E1B17000504020000000000000000000000000097817100E3DAC400F7F1 + DE00FAF6EB00FBF8EE00F9F3E600F4E9D300EFDCBE00E7CAA500CCA682007254 + 3F000000000000000000000000000000000000000000FFEFDE00EFB59C009C5A + 4200E7A58C00EFAD9400EFBD9C00CEA58C00FFEFD60008080000FFFFFF000000 + 0000FFDEC600FFCEAD00FFCEAD00000000000000000000000000843100008431 + 00008C3100008C3100008C3100008C3900008C3900008C3900008C3900009439 + 0000943900000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000B9A69800BBC8C800392E + 2400413831000D090700000000000000000000000000BFB0A600CFC4B600F9F5 + EA00FCFAF300FCFBF400FBF6EE00F6EDDA00F0DEC100ECCFA900C0A27D00795C + 48000000000000000000000000000000000000000000FFE7D600F7B59C00A552 + 3100E7948400E79C8400EFAD8C00D69C8400EFCEB50008080800FFFFFF000000 + 0000FFDEC600FFCEAD00FFCEAD0000000000000000000000000000000000CE52 + 0800000000000000000000000000D65A1000000000000000000000000000D663 + 1800000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000C1CFD1003E3228004138 + 3100484846003A38360041444400909B9D0000000000E1DAD600C1B4A800F0EB + E300FBFAF400FBF9F100FAF5EA00F5EDD700F1DFBF00E6CBA4009E856800B6A7 + 9C000000000000000000000000000000000063525200B57B5A00FFCEBD00CE84 + 6B00F79C7B00F79C8400F7B59400EFB59400945239007B635A00FFFFFF000000 + 0000FFDEC600FFDEC600FFDEC60000000000CE52080000000000CE5208000000 + 0000000000000000000000000000CE5208000000000000000000000000000000 + 0000D65A180000000000D6631800000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007D838200251A12004846 + 4400635D58007E7875005B56540035393A0000000000F3F0EE00C1B3A900D1C6 + BE00F6F4EA00F9F6E600F6F2DE00F4EACE00E5D4B200B59E80007A5E4A00EBE7 + E500000000000000000000000000000000000000000063423900BD8C7300FFDE + C600F7CEB500EFB59C00F7BDA5008C4A31000800000000000000000000000000 + 000000000000000000000000000000000000CE520800CE520800000000000000 + 000000000000CE520800CE520800CE520800CE520800CE520800000000000000 + 000000000000D65A1000D65A1800000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000BBC9CB00A1AC + AD0063636200CDCDCD008E8A8800383A39000000000000000000E7E0DC00C0B2 + A900CABFB300D6CBBB00DED4BB00C3B29800A59076008D735F00D4CAC2000000 + 0000000000000000000000000000000000000000000000000000524242000000 + 00005A3921004229180000000000423931000000000000000000000000000000 + 000000000000000000000000000000000000CE520800CE520800CE5208000000 + 00000000000000000000CE520800CE520800CE52080000000000000000000000 + 0000CE520800D65A1000D65A1000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000909C9E00363A3A00353A3A00909B9D00000000000000000000000000F7F5 + F400E0D9D300C7B9AF00B7A69A00A4918200BAAA9D00F2E7E200000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000CE5208000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFF7F700FFF7 + EF00FFEFE700FFEFE700FFF7E700FFF7EF00FFF7EF00FFF7EF00FFF7EF00FFF7 + EF00FFF7F7000000000000000000000000000000000000000000FFF7F700FFF7 + EF00FFEFE700FFEFE700FFF7E700FFF7EF00FFF7EF00FFF7EF00FFF7EF00FFF7 + EF00FFF7F7000000000000000000000000000000000000000000CEE7FF0094C6 + F7006BB5EF0063ADEF0063ADEF0063ADEF0063ADEF0063ADEF0063ADEF0063AD + EF006BB5EF000000000000000000000000000000000000000000000000000000 + 0000FFF7EF00FFF7E700FFF7EF00FFF7EF00FFF7EF00FFF7F700FFFFF7000000 + 0000000000000000000000000000000000000000000000000000FFF7EF00FFEF + E700FFEFDE00FFEFDE00FFEFE700FFEFE700FFEFE700FFEFE700FFEFE700FFEF + E700FFF7EF000000000000000000000000000000000000000000FFF7EF00FFEF + E700FFEFDE00FFEFDE00FFEFE700FFEFE700FFEFE700FFEFE700FFEFE700FFEF + E700FFF7EF000000000000000000000000000000000000000000D6EFFF009CCE + F7007BBDEF006BB5EF006BB5EF006BB5EF006BB5EF006BB5EF006BB5EF006BB5 + EF007BBDEF000000000000000000000000000000000000000000000000000000 + 0000FFF7E700FFE7D60063848C00A5A5A500FFEFE700FFF7E700FFF7EF000000 + 0000521800005218000052180000521800000000000000000000FFF7EF00FFEF + DE00FFE7DE00F7DED60063737B007B7B7B00FFEFDE00FFEFDE00FFEFDE00FFEF + E700FFEFE7000000000000000000000000000000000000000000FFF7EF00FFEF + DE00AD9C9400000000000000000000000000000000000000000000000000DECE + C600FFEFE7000000000000000000000000000000000000000000DEEFFF00B5D6 + F700638CA5000000000000000000000000000000000000000000000000007BAD + CE0094CEEF000000000000000000000000000000000000000000000000000000 + 0000FFEFE7006BBDD60000B5E7001094B500EFD6C600F7DED600FFEFDE000000 + 0000FFF7EF00FFF7F700FFFFF700521800000000000000000000FFEFE700FFE7 + DE00E7D6CE005A9CB5000094D6000073A5007B949C00FFE7D600FFE7D600FFE7 + D600FFEFDE000000000000000000000000000000000000000000FFEFE700FFE7 + DE00FFE7D6007B736B00BDAD9C00FFE7D600FFE7D600FFE7D60063525200AD9C + 9400FFEFDE000000000000000000000000000000000000000000EFF7FF00D6E7 + F700C6DEEF005A6B73008CA5B500BDDEEF00BDDEEF00BDDEEF0042525A008494 + A500C6DEF7000000000000000000000000008C4221008C4221008C4221000000 + 0000FFE7DE0010DEFF0000DEFF0000BDF70084A5B5006B529400FFE7D6000000 + 0000CE733900C65A2100FFF7EF00521800000000000000000000FFEFE700FFE7 + D60000B5E70000C6FF0000DEFF0000DEFF00007BB500DECEBD00FFE7D6009C84 + AD00FFE7D6000000000000000000000000000000000000000000FFEFE700FFE7 + D600FFDECE00FFDECE0063524A00DEC6B500FFE7CE00FFE7D600EFD6C600BDAD + 9C00FFE7D6000000000000000000000000000000000000000000FFFFFF00F7F7 + F700EFEFEF00EFEFEF005A5A5A00CECED600EFEFEF00EFEFF700DEDEE700ADB5 + B500EFEFF7000000000000000000000000008C422100FFF7EF00FFF7E7000000 + 0000FFE7D600A5EFDE0008EFFF0000EFFF004A73AD0010089400FFE7CE000000 + 0000BDFFFF008C7B7B00FFEFDE00521800000000000000000000FFEFDE00FFE7 + CE0000FFFF0000D6FF0000CEFF0000D6FF0000ADEF006B9C9C008C63AD000000 + 6B00FFE7D6000000000000000000000000000000000000000000FFEFDE00FFE7 + CE00FFDEC600FFDEC600EFCEBD0063524A00EFCEBD00FFDECE00FFDECE00FFDE + CE00FFE7D6000000000000000000000000000000000000000000FFFFFF00FFF7 + EF00FFEFE700FFEFE700EFDED600635A5200EFDED600FFEFE700FFEFE700FFEF + E700FFEFE7000000000000000000000000008C422100FFF7E700D66321000000 + 0000FFDECE00F7D6BD004AD6BD0010848C000000B5001008BD00FFDECE000000 + 0000BDF7FF008C7B7300FFE7D600521800000000000000000000FFEFDE00FFDE + CE00CEEFDE005AF7E70000DEFF0000E7FF0000E7FF008C9CB50000009C000000 + 9400FFDECE000000000000000000000000000000000000000000FFEFDE00FFDE + CE00FFD6C600FFD6BD00FFD6BD007B6B5A00735A5200FFDEC600FFDEC600FFDE + CE00FFDECE000000000000000000000000000000000000000000FFF7F700FFEF + DE00FFE7CE00FFDECE00FFDECE007B6B630073635A00FFDECE00FFE7CE00FFE7 + D600FFE7D6000000000000000000000000008C422100FFEFE700E7A57B000000 + 0000FFDEC600B55A4200941000007B1808000000000000000000000000000000 + 0000BDF7FF008C7B7300FFE7CE00521800000000000000000000FFE7DE00FFDE + C600FFD6BD00B5D6C60000FFFF0000FFFF00217B8C0000008C000000A5000000 + 9400FFE7D6000000000000000000000000000000000000000000FFE7DE00FFDE + C600FFD6BD00FFD6B500CEAD940000000000BDA58C00FFDEC600FFDEC600FFDE + CE00FFE7D6000000000000000000000000000000000000000000FFF7EF00FFDE + CE00FFD6BD00FFCEB500CEA5940000000000BD9C8C00FFD6BD00FFDEC600FFDE + CE00FFE7D6000000000000000000000000008C422100FFE7DE00E7945A000000 + 0000FFDEC600DE5A3900DE4A2900D673520000000000F7A57B0000000000FFD6 + B500C6FFFF009C847B00FFDECE00521800000000000000000000FFE7D600FFD6 + BD00E7A58C00E7A58C00843110008C290000210039000000FF000000FF000000 + B500FFEFDE000000000000000000000000000000000000000000FFE7D600FFD6 + BD00FFCEB500EFC6A500211810007B635A00FFD6B500FFDEC600BDAD9C00FFE7 + DE00FFEFDE000000000000000000000000000000000000000000FFEFE700FFD6 + BD00FFC6A500EFB59400211810007B5A4A00FFC6A500FFCEB500BDAD9C00FFEF + DE00FFEFE7000000000000000000000000008C422100FFE7D600E78442000000 + 0000FFE7D600FFDEC600FFD6C600FFD6C6000000000000000000FF945A00FFF7 + DE00521800005218000052180000521800000000000000000000FFE7D600FFD6 + BD009429100084180000841000008C180000AD6B5A0000000000080818001810 + 5A00000000000000000000000000000000000000000000000000FFE7D600FFD6 + BD00FFCEAD004231290042312900FFCEAD00FFCEB50000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFEFDE00FFCE + AD00F7B58C003929210039292100F7AD8400F7B58C0000000000000000000000 + 0000000000000000000000000000000000008C422100FFDECE00E78439000000 + 00000000000000000000000000000000000000000000D65A1000D6631800E773 + 310052180000F7A57B0052180000000000000000000000000000FFE7CE00FFD6 + BD00F76B4A00EF633900EF633900F7633900E79C7B0000000000E77B4200EF94 + 5A00000000000000000000000000000000000000000000000000FFE7CE00FFD6 + BD00AD8C730042312900735A4A007B6352007B6352000000000063311800EF94 + 5A00000000000000000000000000000000000000000000000000FFE7D600F7C6 + A500A5735200392918006B423100735239007B5242000000000063311800EF94 + 5A00000000000000000000000000000000008C422100FFDEC600E78C4200FFFF + FF00FFFFF7008C4221008C42210052180000FFE7D600FFDEC600FFD6C600FFD6 + C600521800005218000000000000000000000000000000000000FFE7D600FFD6 + BD00FFD6B500FFCEB500FFCEB500FFD6B500FFD6BD0000000000F7A57B000000 + 0000000000000000000000000000000000000000000000000000FFE7D600FFD6 + BD00FFD6B500FFCEB500FFCEB500FFD6B500FFD6BD0000000000F7A57B000000 + 0000000000000000000000000000000000000000000000000000FFE7DE00F7CE + AD00EFB59400EFAD8C00EFAD8C00EFAD8C00EFB5940000000000F7A57B000000 + 0000000000000000000000000000000000008C422100FFDEC600D6631800D673 + 3900E77B39008C422100F7A57B00521800005218000052180000521800005218 + 0000521800000000000000000000000000000000000000000000FFE7DE00FFE7 + D600FFDECE00FFDECE00FFDECE00FFDECE00FFDECE0000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFE7DE00FFE7 + D600FFDECE00FFDECE00FFDECE00FFDECE00FFDECE0000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFF7EF00F7E7 + D600F7DECE00F7D6C600F7D6C600F7D6C600F7DECE0000000000000000000000 + 0000000000000000000000000000000000008C422100FFE7D600FFDEC600FFD6 + C600FFD6C600000000008C422100000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000008C4221008C4221008C4221008C42 + 21008C4221008C42210000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000D3D8ED00EFEFF800577F + D1006988DA00EFEFFA00D3D9F600F8F9FE000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000BABADD009497CB005B88CB007682CA004583 + D2005682DB00607ED700297DE100D1D8F6000000000000000000000000000000 + 000000000000000000008F796900664B3700674D3800684E3A00694F3B006A50 + 3D006A503D00644A360000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000F9F9FC008080C2003737C600211DB3003C5DB40065A7E0004497 + DF00419CE50032AFE800597FDF00EFEFFC000000000000000000000000000000 + 00000000000000000000D6CCC400BBAA9E00AA948500AC978700AC968600AE98 + 8A00998271006A503D0000000000000000000000000000000000FFF7F700FFF7 + EF00FFEFE700FFEFE700FFF7E700FFF7EF00FFF7EF00FFF7EF00FFF7EF00FFF7 + EF00FFF7F7000000000000000000000000000000000000000000FFF7EF00FFF7 + E700FFF7EF00FFF7EF00FFF7EF00FFF7F700FFFFF70000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000E9E9F3006161B300302FD2002D2EE2004E65D700415CB8005CA8E00084F8 + FF0066F9FF0032A3E8004880DF007295EA000000000000000000000000000000 + 0000B19C8D007B655400E5DED800FFFFFF00FCF8F600F5ECE700EEE0D800E9D4 + CA00A690800069503C0000000000000000000000000000000000FFF7EF00FFEF + E700FFEFDE00FFEFDE00FFEFE700FFEFE700FFEFE700FFEFE700FFEFE700FFEF + E700FFF7EF000000000000000000000000000000000000000000FFF7E700D663 + 2100D6733100D6733100D6631000D6632100FFF7EF0000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000D0D0 + E5004949AF003232DE001C1BE5000001BF00557DCC006F9BE00061AFE80090FF + FF006DFFFF0033AFEB002BA6E700348AE7000000000000000000000000000000 + 0000C7B7AA00FBF8F700E2DAD400FFFFFF00FEFDFC00F7F2EF00F1E6E000EADA + D100A48E7E00694F3C0000000000000000000000000000000000FFF7EF00CE52 + 0800CE520800CE520800CE520800CE520800CE520800CE520800CE520800CE52 + 0800FFEFE7000000000000000000000000000000000000000000FFEFE700E7A5 + 7B00FFFFE7000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000B1B1D1003434 + AD002A2AE6001010E2000000D1000000D6000105CD001F35C30066A9DE0057BA + EB0049C2EF0033AFE700697DDC00D7DAF7000000000000000000BCA99C00C6BB + B200BFADA000FFFFFF00E4DCD600FFFFFF00FFFFFF00FBF9F800F5EDE900EEE1 + D900A48E7E00694F3B0000000000000000000000000000000000FFEFE700CE52 + 0800E7631800EF7B3100FFA57300FFD6B500FFF7EF00C6EFFF0042ADF700CE52 + 0800FFEFDE000000000000000000000000000000000000000000FFE7DE00E794 + 5A00FFF7EF0000000000FFF7EF00FFF7E700FFF7EF00FFF7EF00FFF7EF00FFF7 + F700FFFFF700000000000000000000000000FDFDFE009898C3002727B6002929 + F0000C0CE1000000D6000000DD000000E2000208D6006299D8003C5CD2002E73 + D7003B73E6002B7EEB003698E600DDE1F6000000000000000000C1AEA100F7F3 + F000C9B8AB00FFFFFF00E7DED800FFFFFF00FFFFFF00FEFEFE00F9F5F300F5EB + E600A48E7E00684E3A0000000000000000000000000000000000FFEFE700CE52 + 0800E7631800EF7B3100FFA57300FFD6B500FFF7EF00C6EFFF0042ADF700CE52 + 0800FFE7D6000000000000000000000000000000000000000000FFE7D600E784 + 4200FFFFFF0000000000FFF7E700D6632100D6733100D6733100D6631000D663 + 2100FFF7EF00000000000000000000000000B5B5D1002424B8003C3CFE004646 + FD003D3DF4002828EF000A0AE8000000E8000205E5001021D7000000D9002E70 + DB002C63DF00180EEC002134C600C9C9DF000000000000000000BFAC9E00EFEA + E600CCBCB000FFFFFF00E9E0DA00FFFFFF00FFFFFF00FFFFFF00FFFFFF00F1E8 + E200A99383006A503C0000000000000000000000000000000000FFEFDE00CE52 + 0800E7631800EF7B3100FFA57300FFD6B500FFF7EF00C6EFFF0042ADF700CE52 + 0800FFE7D6000000000000000000000000000000000000000000FFDECE00E784 + 3900FFFFF70000000000FFEFE700E7A57B00FFFFE700FFF7E700FFAD6B00E7AD + 8400FFEFDE000000000000000000000000004C4CA8004242F5006565FF006767 + FF006868FF006969FF005858FB002C2CF5000000F2000000EF000000EB000612 + DC00030ED4000501E0002019D9007E7EB5000000000000000000C3B0A300EFEA + E700D1C1B400FFFFFF00EBE3DC00FFFFFF00FFFFFF00FFFFFF00EBE5E0009179 + 6700806754006146320000000000000000000000000000000000FFEFDE00CE52 + 0800E7631800EF7B3100FFA57300FFD6B500FFF7EF00C6EFFF0042ADF700CE52 + 0800FFDECE000000000000000000000000000000000000000000FFDEC600E78C + 4200FFFFFF0000000000FFE7DE00E7945A00FFF7EF00FFCEAD00FFCEAD00E78C + 4A00FFE7D6000000000000000000000000003232B4007171FF008181FF007B7B + FF007B7BFF007D7DFF008181FF008080FF005959FC001B1BF5000000EE000000 + E8000000E1000000D8001313EB004646A9000000000000000000C8B6A700F1EC + E900D6C4B900FFFFFF00EEE6DF00FFFFFF00FFFFFF00FFFFFF00CFC1B7009D87 + 770072594700AD9C8F0000000000000000000000000000000000FFE7DE00CE52 + 0800E7631800EF7B3100FFA57300FFD6B500FFF7EF00C6EFFF0042ADF700CE52 + 0800FFE7D6000000000000000000000000000000000000000000FFDEC600D663 + 1800D673390000000000FFE7D600E7844200FFFFFF00FFB59400FFE7CE00E78C + 5200FFE7CE000000000000000000000000003D3DB7009191FF009898FF009494 + FF009494FF009494FF009494FF009595FF009C9CFF008E8EFE005151F8001414 + EC000000E1000000D7000909EB004040A8000000000000000000CEBAAD00F2ED + EA00DACABC00FFFFFF00ECE2DB00FBF8F600FBF8F600FAF8F600D7C8BF008E76 + 6400D7CAC0000000000000000000000000000000000000000000FFE7D600CE52 + 0800E7631800EF7B3900FFAD7300FFD6B500FFF7EF00C6EFFF0042ADF700CE52 + 0800FFEFDE000000000000000000000000000000000000000000FFE7D600FFDE + C600FFD6C60000000000FFDECE00E7843900FFFFF700FFC69C00FFD6A500F7B5 + 8C00FFDECE000000000000000000000000004C4CA2009F9FFC00B9B9FF00ACAC + FF00ACACFF00ACACFF00ACACFF00B2B2FF00B0B0FF00B2B2FF00B6B6FF009797 + FC006565F1004646EC003030E7006969A7000000000000000000D2BFB100F3EE + EB00DFCEC100FFFFFF00DECCBF00E0CEC100DFCDC000D3BFB100C6B0A100D0C0 + B500000000000000000000000000000000000000000000000000FFE7D600CE52 + 0800EF7B3100FF945200FFBD8C00FFE7C600FFFFFF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000FFDEC600E78C4200FFFFFF00FFFFF700000000000000 + 0000000000000000000000000000000000009B9BBB006969C500D3D3FF00D7D7 + FF00D0D0FF00D1D1FF00D7D7FF00CBCBFF00CECEFF00D5D5FF00D2D2FF00D8D8 + FF00E4E4FF00C9C9FF005353AF00C4C4D5000000000000000000D8C4B600F5F0 + ED00DBC7B800EADFD600EADFD600E9DDD500E3D5CB00AD978700CCBFB4000000 + 0000000000000000000000000000000000000000000000000000FFE7CE00CE52 + 0800CE520800CE520800CE520800CE520800CE52080000000000E77B4200EF94 + 5A00000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000FFDEC600D6631800D6733900E77B390000000000F7A5 + 7B0000000000000000000000000000000000F5F5F7007B7BA6006D6DBD00BFBF + F100D6D6FF00D5D5FF00B4B4F8005757D6006A6ADC00C0C0FD00D7D7FF00D5D5 + FF00B4B4E9005C5CAB009B9BB700FDFDFE000000000000000000DBC8B900F6F1 + ED00FFFFFF00FFFFFF00FFFFFF00C7B6A900907A6A00D6C9C000000000000000 + 0000000000000000000000000000000000000000000000000000FFE7D600FFD6 + BD00FFD6B500FFCEB500FFCEB500FFD6B500FFD6BD0000000000F7A57B000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000FFE7D600FFDEC600FFD6C600FFD6C600000000000000 + 00000000000000000000000000000000000000000000F7F7F900ACACC0006161 + 9B005454A8004F4FAB004C4C9E008B8BAE007C7CA6004A4AA0005151AB005454 + A4006A6A9E00C1C1D000FEFEFE00000000000000000000000000D9C3B300DBC7 + B800DCC8BA00DBC8B900D6C2B400CAB4A500D3C6BB0000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFE7DE00FFE7 + D600FFDECE00FFDECE00FFDECE00FFDECE00FFDECE0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000BA881F00BA8A2100AC7D + 1C00BD891B0000000000B1832100B5831A00B4831B00B4841F0000000000BB87 + 1900A7791C00B9892200B9892200000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000004C4846004B4745004B47 + 44004B4743004B4742004B4641004B4540004A443F004A443E004A433D004A42 + 3B004A423B004A413A004A413A00564C450000000000C08A180035506D004D39 + 1B00BC871A0000000000BF891800242D3D0025324800BA85160000000000C48C + 1700503B1D00354E6900C088160000000000B7A2930060463200634935006349 + 350063493500634935006349350063493500634935006349350063493500684E + 3A000000000000000000000000000000000000000000000000006E6D6E004444 + 4400787878000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000B8A89D00FFFFFF00FFFFFF00FFFF + FC00FFFBF800FFF7F200FFF3EC00FFEFE500FEEBDF00FCE6D900FCE2D200FBDE + CC00FADAC600F9D7C100EACBB5002E28220000000000A97F2500655128007A5C + 2100A97B1D0000000000A67C22005F4A2300614A2200A77D240000000000B07F + 1900805F200063502C00AA7F260000000000BDA89900FCFEFC00E7E6E400E7E2 + DC00E6DCD400E5D6CB00E4CFC100E3CAB800E3C5B100E2C2AC00C7AA9800684E + 3A0000000000000000000000000000000000000000000000000099989900C8C7 + C800111111007A7A7A0000000000E1E1E1000000000000000000000000000000 + 000000000000000000000000000000000000B8A89E00FFFFFF00FFFFFE00FFFD + FB00FEFAF800FEF7F200FCF3EC00FBEFE700FBEBE000FAE6DA00F9E2D400F8DE + CD00F7DAC700F6D6C200EACBB500312B260000000000B4841E00B7861E00B27E + 1300BE89190000000000BA851600B5821800B2801800B6841D0000000000BC88 + 1C00A9791800B6862100BD891B0000000000C6B0A100FCFEFC00D8C4B900D6C0 + B500D3BCAF00FAEFE600CFB3A500CCAF9F00CCAF9F00F6DBC800C7AA9800684E + 3A00000000000000000000000000000000000000000000000000000000000000 + 0000848484000E0E0E00000000003333330034333400979697001C1C1C000C0B + 0C0024222200000000000000000000000000B8A89E00FFFFFF00FFFFFF00FFFE + FE00FFFCFA00FEF8F600FDF6F000FCF2EB00FCEEE500FAE9DF00FAE5D800F8E1 + D100F8DDCB00F7D8C600EACDB900312B27000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000CCB6A700FCFEFC00FCFEFC00FCFE + FC00FBFAF700FBF5EF0075716E005754510000000000D2C2B500CBB2A100684E + 3A00000000000000000000000000000000000000000000000000000000000000 + 0000B6B6B600020102007F7F7F0000000000000000005F5E5F00020102005454 + 5400E4E4E300000000000000000000000000B8A89E00FFFFFF00FFFFFF00FFFF + FF00FFFEFD00FEFBF900FDF8F500FDF4EF00FCF0E900FBECE300FAE8DC00FAE4 + D600F9DFD000F8DCC900EACEBD00312B270000000000B27F1600B2811800AC7A + 1400B28119000000000054452A004D4028004C4027005748290000000000B17D + 1300A7781900B1801A00B2811A0000000000CCB6A700FCFEFC00DBCAC000DAC8 + BD00D8C4B900FBFAF700A39D9800FDFEFE005193A9000E121600B8B1A8007860 + 4D00000000000000000000000000000000000000000000000000000000000000 + 0000EEEEEE00504E50004141410000000000E6E5E50094939400242324001616 + 160000000000000000000000000000000000B8A89E00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFDFC00FEFAF800FEF7F300FCF2ED00FCEFE700FBEBE100FAE7 + DA00F9E2D400F8DECD00EAD1C000322B270000000000B78824002F456100513F + 2200B8851C00000000005D4E2D0076928D007D9890005D4D2B0000000000BC87 + 19004F3E26002D405900B687240000000000CCB6A700FCFEFC00FCFEFC00FCFE + FC00FCFEFC00FCFEFC00A39D980088B7C70074CEE200499AB2000E1216007C72 + 6600000000000000000000000000000000000000000000000000000000000000 + 00000000000078787800171717000000000093908F009A999900A8A8A8009898 + 9800232323003D3D3D000000000000000000B8A89E00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFEFF00FEFCFA00FEF9F500FDF6F100FCF2EB00FCEEE500FAEA + DF00FAE5D800F9E0D200EAD4C300322B270000000000B17E13002F2F32005E42 + 1500B17F170000000000473B270069818000698586004E41290000000000B07F + 1700543D18002A2D3500AF7D180000000000CCB6A700FCFEFC00DBCAC000DBCA + C000DBCAC000FCFEFC00C1B9B4004D9CB3008CE0EE0062BFD700499AB2000E12 + 1600CEDBDF000000000000000000000000000000000000000000000000000000 + 0000000000008383830002010200F2F2F20000000000EDEDED00DADADA000000 + 0000E9E9E900CDCDCD000000000000000000B8A89E00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFEFD00FEFAF900FEF8F500FDF4EF00FCF1E900FBEC + E300FAE8DD00F9E4D600EAD6C800322C270000000000B7861F00B6872400B07E + 1800BB881B00000000006C5A2F005A4C2C005E502F006B59300000000000B986 + 1C00AE7F1D00B9871E00B788230000000000CCB6A700FCFEFC00FCFEFC00FCFE + FC00FCFEFC00FCFEFC00FBF8F300D5CEC80057A0B5008CE0EE0062BFD700499A + B2000E121600CEDBDF0000000000000000000000000000000000000000000000 + 000000000000A9A9A900181718007F7F7F000000000000000000000000000000 + 000000000000000000000000000000000000B8A89E00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFDFC00FEFAF800FDF7F300FCF3ED00FCEF + E700FAEBE100FAE7DB00EAD9CB00322C27000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000EBAC8D00EAAA8C00EAA98900E9A2 + 7E00E8997100E68F6300E5875800E6926500CDA9950065A6B7008CE0EE0062BF + D700499AB2000E121600D7DFE200000000000000000000000000000000000000 + 0000A3A2A100B1AFAE00817F7E000E0B0A00110F0E0000000000000000000000 + 000000000000000000000000000000000000AB998E00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFEFE00FFFBFA00FEF8F500FDF5 + EF00FCF1E800FBECE200EADFD400322C270000000000B9882200B6882600A678 + 1A00BA881D0000000000B4842000B9871C00AE802100B1821F0000000000BE8C + 1F00A87B1E00B98B2500BC8B230000000000EBAC8D00FFC3A200FEBF9D00FCBB + 9800FBB69200FAB08B00F8AB8400F8A67C00F3A68000D2B09E0073ACB9008CE0 + EE006CC4D9007D86860035359000BFC2D9000000000000000000000000000000 + 000000000000000000009D9C9D002A292A000000000000000000000000000000 + 000000000000000000000000000000000000AC9A8E00F7F0EC00FCF6F400FCF6 + F300FBF5F200FAF4F100FAF4F000FAF2EE00FAF2EE00FAF0EA00F9EDE600F9EA + E100F8E6DC00F8E3D600E6D6C90035302A0000000000B37F14003A3631006146 + 1800B27C0F0000000000B17D12002D272300332B2400AB7B180000000000AF7C + 12005F44170035302E00B17F180000000000EBAC8D00EAAA8B00EAAA8B00EAA8 + 8900E9A28100E89C7700E7946B00E68C6000E5865500E68D5F00CA997F007DB0 + BB00CAB8AC007385D1005E6CAD00353590000000000000000000000000000000 + 00000000000000000000C1C1C10064636400E2E2E200373535005B5959000000 + 000000000000000000000000000000000000CEA58F00F0B19200F4B29100E89F + 7A00E1906800DD885D00DC875B00DA835700D87F5200D77C4E00D6794B00D578 + 4900D4774700D4764600CA7041004731240000000000B5862400334861005642 + 2000B384220000000000B1822300242E4200222F4700B082230000000000B886 + 1C004F3C1F0030496500B4862300000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000DCE5 + E8005E6CAD00708FDF005E76D0005E6CAD000000000000000000000000000000 + 0000000000000000000000000000B1B0B1007471710016131300494848000000 + 000000000000000000000000000000000000D8AA9200FCC0A000FCBD9B00F9B6 + 9400F5B08B00F1A98500EEA47F00ECA07900EB9C7200E7956B00E48F6500E18B + 5E00DF865900DD825400CE774C0038281E0000000000AD812300AF822300AC7E + 1E00B4831E0000000000A77C2500B0822000AB7D1D00A97D240000000000B684 + 1C00A6791C00B0822000B2842300000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000D4DAEE005E6CAD005E6CAD00E2E6F2000000000000000000000000000000 + 000000000000000000000000000000000000EEEEEE00D5D5D500000000000000 + 000000000000000000000000000000000000CEAB9A00DCAE9800D5A58E00D3A0 + 8600CE9B8100C88B6D00CA856400C57F5D00B6755600AD705200A76B4E00A76B + 4E00A76B4E00A76B4E00A66A4D00795847000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000007C7573004E4B4B00544F4D00544F + 4D00544F4D0056514D0053504C00524F4B00524F4C00524F4B00514E4B00544E + 46000000000000000000000000000000000000000000CE520800FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 00000000000000000000000000000000000000000000A3887700634935006349 + 3500634935006349350063493500634935006349350063493500634935006349 + 3500634935006349350000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000D9CFC800FFFFFF00FBFDFF00FBFD + FF00FFFFF600FFFFF600FFFFF600FFF9EC00FFF0E100FFEAD500FFEAD200544E + 46000000000000000000000000000000000000000000CE520800FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 00000000000000000000000000000000000000000000AD938300FEFBFA00FDF9 + F600FCF5F200FBF2ED00FAEEE800F9E9E200F7E5DC00F6E1D700F5DDD100F3D8 + CB00F3D4C600634935000000000000000000000000000000000000000000E39A + 7500B6623900B6623900B05C3300A7532A009D482000923E160089340D00822D + 0600812C0500000000000000000000000000D2C8C100FFFFFF00C4AFA200C4AF + A200FFFBF900C4AFA200C4AFA200C4AFA200C4AFA200C4AFA200FDDECB00544E + 46000000000000000000000000000000000000000000CE520800FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000B4998A00FEFDFC00FDFA + F900FCF7F500FCF4F100FBF0EC00F9ECE600F8E8E100F6E4DB00F5DFD500F5DB + D000F3D7CA00634935000000000000000000000000000000000000000000E39A + 7500E58C5E00E2845500E17E4C00DF774200DE713B00DC6B3400FFFFFF00DA62 + 2700812C0500000000000000000000000000D2C8C100FFFFFF00FBFDFF00FBFD + FF00FFFEFC00FDFAF800FBF4EF00FBEEE600FAE9DE00F8E2D200FFE2D000544E + 46000000000000000000000000000000000000000000CE520800FFFFFF00CE52 + 0800FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF000000000000000000BAA09300FFFFFE00FFFC + FB00FDF9F700FCF6F400FCF3EF00FAEFEA00F9EBE400F7E7DF00F7E2D900F5DE + D300F4DACD00634935000000000000000000000000000000000000000000E397 + 7000E7946B00E58D6100E3865700D0AE9C00DF784500DE733C00FFFFFF00DA68 + 2E00812C0500000000000000000000000000D3C9C200FFFFFF00C4AFA200C4AF + A200FFFFFE00C4AFA200C4AFA200C4AFA200C4AFA200C4AFA200FFE5D600544E + 46000000000000000000000000000000000000000000CE520800FFFFFF00CE52 + 0800FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF000000000000000000EAAA8B00EAAA8B00E9A5 + 8400E99F7A00E7976E00E68E6200E5865600E37D4A00E3764000E2723900E272 + 3900E2723900E27239000000000000000000000000000000000000000000E79B + 7400EA9E7700E7966C00DDC4B900FFFFFF00E2805000E07A4600FFFFFF00DD6E + 360085300900000000000000000000000000D1C7C000FFFFFF00FBFDFF00FBFD + FF00FFFFFF00FEFEFD00FEFBF800FDF6F200FCF0E800FCF0E800FFE9DC00544E + 46000000000000000000000000000000000000000000CE520800FFFFFF00CE52 + 0800FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF000000000000000000EAAA8B00FFFFFE00FFC2 + A200FCB99600FBB59000FAB08B00F9AB8400F8A77D00F6A27700F59D7100F599 + 6A00F3956500E27239000000000000000000000000000000000000000000EA9E + 7800ECA68300E9D4CA00FFFFFF00FFFFFF00E4895B00E2825100FFFFFF00DF75 + 40008B360F00000000000000000000000000D1C8C100FFFFFF00FBFDFF00FBFD + FF00FFFFFF00FFFFFF00FEFEFC00B0ADAC00415C7200E3D9D300FFEDE300544E + 46000000000000000000000000000000000000000000CE520800FFFFFF00CE52 + 0800FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF000000000000000000EAAA8B00EAAA8B00EAAA + 8B00EAA68600E9A17F00E89B7600E7946C00E68E6200E5875800E4814E00E47B + 4600E3763E00E27239000000000000000000000000000000000000000000EFA3 + 7D00F3E2D900FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00ECD3C600E17D + 4A00923E1600000000000000000000000000D1C8C100FFFFFF00E2E9E9005E75 + 8400DFE4E500FFFFFF00C2CACE004A6170002EA9D6000B101B005D5C6000A49D + 9600000000000000000093B699001C66290000000000CE520800FFFFFF00CE52 + 0800FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF000000000000000000A3887700634935006349 + 3500634935006349350063493500634935006349350063493500634935006349 + 350063493500634935000000000000000000000000000000000000000000F3A8 + 8100F2B89C00F8E9E100FFFFFF00FFFFFF00E99B7400E7946A00E58D6000E385 + 56009A461E00000000000000000000000000DF9D7D00F1CAB7008FA4AC0086D3 + E5004B617000A79289004A61700061C1DE00574D59001FD0FF00152733001007 + 0A0002212E004F56650059785B00188C320000000000CE520800FFFFFF00CE52 + 0800CE520800CE520800CE520800CE520800CE520800CE520800CE520800CE52 + 0800CE520800CE520800CE5208000000000000000000AD938300FEFBFA00FDF9 + F600FCF5F200FBF2ED00FAEEE800F9E9E200F7E5DC00F6E1D700F5DDD100F3D8 + CB00F3D4C600634935000000000000000000000000000000000000000000F6AD + 8600F4C1A800F2BA9E00FAE4DA00FFFFFF00ECA48000E99D7500E7956C00E68D + 6200A24E2500000000000000000000000000DF9D7D00FFC5A400E5C9B9008FA4 + AC0083E1F6004B6170007ACDE2005260670068EDFF00413D500032B2DF001D99 + C8001593C40014628E004066510029973F0000000000CE520800FFFFFF00CE52 + 0800FFFFFF00FFBD9400FFBD9400FFBD9400FFBD9400FFBD9400FFBD9400FFBD + 9400FFBD9400FFBD9400CE5208000000000000000000B4998A00FEFDFC00FDFA + F900FCF7F500FCF4F100FBF0EC00F9ECE600F8E8E100F6E4DB00F5DFD500F5DB + D000F3D7CA00634935000000000000000000000000000000000000000000FAB0 + 8A00F6C9B200F4C2A900F2BCA000F9E0D300EEAD8D00ECA58300EA9E7800E897 + 6E00AA552D00000000000000000000000000DF9D7D00DF9D7D00DF9D7D00DABA + AA008FA4AC007FE3F9005384950068EDFF00303A4F0069DBF60058D2F30040C3 + ED0031BBEA0011A8EC0050908C00329E410000000000CE520800FFFFFF00CE52 + 0800CE520800CE520800CE520800CE520800CE520800CE520800CE520800CE52 + 0800CE520800CE520800CE5208000000000000000000BAA09300FFFFFE00FFFC + FB00FDF9F700FCF6F400FCF3EF00FAEFEA00F9EBE400F7E7DF00F7E2D900F5DE + D300F4DACD00634935000000000000000000000000000000000000000000FDB3 + 8D00FDB38D00FDB38D00F6AD8600F3A88100EFA37D00EA9E7800E79B7400E397 + 7000E39A75000000000000000000000000000000000000000000000000000000 + 000000000000576B800068EDFF005898AE006EEBFF0072E1F9006ADDF70056CF + F2004BC7ED0022BAFA005FA2A60041AC530000000000CE520800FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 00000000000000000000000000000000000000000000EAAA8B00EAAA8B00E9A5 + 8400E99F7A00E7976E00E68E6200E5865600E37D4A00E3764000E2723900E272 + 3900E2723900E272390000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000C2C8D000B0EBFA005B6D7F006EEBFF006EEBFF006EEBFF0072E2FA0067D7 + F40054BDDC0051728B00699C890085CC850000000000CE520800CE520800CE52 + 0800CE520800CE520800CE520800CE520800CE520800CE520800CE5208000000 + 00000000000000000000000000000000000000000000EAAA8B00FFFFFE00FFC2 + A200FCB99600FBB59000FAB08B00F9AB8400F8A77D00F6A27700F59D7100F599 + 6A00F3956500E272390000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000A3ACB80095B8C400D4D9DD0081A6B5008097A3008096A0007A8F99007385 + 93005C718000BFC8CD009AD3A40070C17D0000000000CE520800FFFFFF00FFBD + 9400FFBD9400FFBD9400FFBD9400FFBD9400FFBD9400FFBD9400CE5208000000 + 00000000000000000000000000000000000000000000EAAA8B00EAAA8B00EAAA + 8B00EAA68600E9A17F00E89B7600E7946C00E68E6200E5875800E4814E00E47B + 4600E3763E00E272390000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000CE520800CE520800CE52 + 0800CE520800CE520800CE520800CE520800CE520800CE520800CE5208000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000081685500262F3800262F3800262F3800262F3800262F + 3800262F3800262F3800262F3800262F38000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000BCCCD200647E8E004F5E6F004552 + 610037414D00262F380089715E00E8DCD300B7A29300B7A29300B7A29300B7A2 + 9300B7A29300B7A29300B7A29300262F38000000000000000000A1A09F005656 + 550091919100B6B6B60000000000000000000000000000000000000000000000 + 0000BCBCBC00B8B8B80000000000000000000000000000000000FFF0EF00FFF0 + E000FFF0EF00FFF0EF00FFF0EF00FFF0F000FFFFF00000000000000000000000 + 000000000000000000000000000000000000FEFEFE00FEFEFE00FEFEFE00FEFE + FE00FEFEFE00FEFEFE00FEFEFE00FEFEFE00FEFEFE00FEFEFE00FEFEFE00FEFE + FE00FEFEFE00FEFEFE00FEFEFE00FEFEFE00717F8B0022B6EC00008FCD00008F + CD00008FCD00008FCD0091796600EFE6E100E8DBD300E0D0C600DAC6BC00D4BF + B200CFB9AB00CCB6A800B7A29300262F380000000000BBBBBB00676666001713 + 12004D4B4A00A5A4A400BEBEBE0000000000000000000000000000000000BDBD + BD00727070009A9A9A00BEBEBE00000000000000000000000000FFF0E000D060 + 2000D0703000D0703000D0601000D0602000FFF0EF0000000000000000000000 + 000000000000000000000000000000000000FEFEFE003E36F500332CF2002B22 + EE00241CED00FEFEFE00C100A100BF009900BF009400BE008F00FEFEFE00F3C8 + 2E00F2C51B00F3C20B00F3BF0000FEFEFE007584900068C8EA0010B5F00008AC + EB0003A4E3000096D4009A826F00F7F1EF00C3AE9E00C3AE9E00BDA89800B7A2 + 9300D4BFB200B7A29300B7A29300262F3800000000000000000090908F002018 + 16002B262500706F6E00B8B8B800000000000000000000000000BEBEBE00AAAA + A90038373700AAAAAA00BEBEBE00000000000000000000000000FFEFE000D070 + 3F00C2E9FF000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FEFEFE004E47FA00443CF7003830 + F3002E26F000FEFEFE00C100AB00C100A300BF009C00BF009500FEFEFE00F2CE + 4B00F3CA3800F3C62500F3C21300FEFEFE007989940074D0ED0028BDF10011B5 + F00007ABEA00009DDC00A28A7800FDFBFA00F7F2EE00EFE6E100E8DBD300E0D0 + C600705A4A0061524600504842003F3D3E000000000000000000BBBBBB005E5A + 590029242100403C3B00A8A7A7000000000000000000BABABA00B6B5B5004D4B + 490064626000BEBEBE0000000000000000000000000000000000FFE0DF00D070 + 3F00C2E9FF0000000000FFF0EF00FFF0E000FFF0EF00FFF0EF00FFF0EF00FFF0 + F000FFFFF000000000000000000000000000FEFEFE005A53FE00524CFB004942 + F8003E36F500FEFEFE00C300B600C200AE00C100A600C0009E00FEFEFE00F2D2 + 6100F2CF5400F2CC4100F3C82E00FEFEFE007E8E9A0083D9F00046C9F2002DBF + F20016B7F10000A0E200A9928000FFFFFF00C3AE9E00C3AE9E00BDA89900E8DC + D3007A604D00D4C5BA006152470000000000000000000000000000000000B2B1 + B10043413E0025211E0053505000B4B4B400B8B8B800B8B8B800646260003936 + 3600AFAEAE000000000000000000000000000000000000000000FFE0D000D070 + 3F00C2E9FF0000000000FFF0E000D0703F00D0703F00D0703000D0601000D060 + 2000FFF0EF00000000000000000000000000FEFEFE005D56FF005D56FF00574F + FD004E46FA00FEFEFE00C400BF00C300B800C200B000C200A900FEFEFE00F2D3 + 6600F2D36600F2D15B00F2CD4B00FEFEFE0082949E0091E2F30066D5F4004CCB + F30032C2F20015AFE900B0998800FFFFFF00FFFFFF00FCFBF900F7F1EF00EFE7 + E100816856007A604D0000000000000000000000000000000000000000000000 + 0000AFAEAE0043413F002D2827005B5A59009D9D9C00504D4C00333130008281 + 8000000000000000000000000000000000000000000000000000FFDFCF00D070 + 3F00C2E9FF0000000000FFEFE000D0703F00FFA77000C2E9FF0040AEF700E0AF + 8000FFEFDF00000000000000000000000000FEFEFE005D56FF005D56FF005D56 + FF005A54FE00FEFEFE00C500C500C400C000C400BA00C300B300FEFEFE00F2D3 + 6600F2D36600F2D36600F2D26100FEFEFE008699A2009FEAF60083E1F6006BD8 + F50053CEF4000EB3F000B6A08E00B0998800A9928000A28A78009A8270009179 + 670089715E000000000000000000000000000000000000000000000000000000 + 000000000000AEAEAE0046424100312E2D0034302F003835340042403F000000 + 0000000000000000000000000000000000000000000000000000FFDFC000D070 + 3F00C2E9FF0000000000FFE0DF00D0703F00FFA77000C2E9FF0040AEF700E08F + 4F00FFE0D000000000000000000000000000FEFEFE00FEFEFE00FEFEFE00FEFE + FE00FEFEFE00FEFEFE00FEFEFE00FEFEFE00FEFEFE00FEFEFE00FEFEFE00FEFE + FE00FEFEFE00FEFEFE00FEFEFE00FEFEFE008A9EA600A9F0F80099EAF80088E3 + F5006DD1EA0013A1D40013A1D40012A0D3000D97CF000791CA00008FCD00008F + CD00303944000000000000000000000000000000000000000000000000000000 + 000000000000000000009C9B9B00373231003D3A390044414000B5B4B4000000 + 0000000000000000000000000000000000000000000000000000FFDFC000D070 + 3F00D0703F0000000000FFE0D000D0703F00FFA77000C2E9FF0040AEF700E08F + 5000FFE0CF00000000000000000000000000FEFEFE0000B0FF0000AAFF0000A5 + FF0000A2FF00FEFEFE0000B7340000B1310000AB2E0000A52C00FEFEFE00CE28 + 2F00C21F2600B6161D00AB0D1500FEFEFE008DA1AA00AAF1F900A7F0F9005E7D + 8A0058737F00566D7A00526977004F6673004C617000445A6800236F9000008F + CD003E4A58000000000000000000000000000000000000000000000000000000 + 0000BFBFBF00ABABAB00595756003B3736003A3736003A3B39005B595600BABA + BA00000000000000000000000000000000000000000000000000FFE0D000FFDF + C000FFD0C00000000000FFDFCF00D0703F00FFA77000C2E9FF0040AEF700F0B0 + 8F00FFDFCF00000000000000000000000000FEFEFE0000B8FF0000B2FF0000AC + FF0000A7FF00FEFEFE0000BF380000B9350000B2320000AD3000FEFEFE00DD34 + 3B00D12A3300C5212800B9171F00FEFEFE008FA4AC00AAF1F900A8F1F9005D86 + 96008CC6CF0093E4F0007AD5E70062C6DE004F9AB2003E5A67001C7DA500008F + CD004B596900000000000000000000000000000000000000000000000000BDBD + BD008988880044424100423E3E0075757400A8A7A700757272003C3C3D006F6D + 6B00B7B7B6000000000000000000000000000000000000000000000000000000 + 00000000000000000000FFDFC000D0703F00FFA77000C2E9FF00000000000000 + 000000000000000000000000000000000000FEFEFE0000C0FF0000BAFF0000B4 + FF0000AEFF00FEFEFE0000C63C0000C0390000BB360000B53300FEFEFE00EB3F + 4600E0363E00D42D3400C7232B00FEFEFE008FA4AC00ABF0F700AAF1F900A6EF + F7007397A200A1ECF500667D8A0078C5D6004C6C7C00346178005FC3E80022B6 + EC004E5E6F0000000000000000000000000000000000B3B3B300A4A4A4006765 + 64003F3C3A00403F3E006E707100BABBBB0000000000BBBBBB00717170004341 + 3F0075747400B9B9B80000000000000000000000000000000000000000000000 + 00000000000000000000FFDFC000D0601F00D0703F00E07F3F0000000000F0A0 + 7F0000000000000000000000000000000000FEFEFE0000C7FF0000C2FF0000BD + FF0000B6FF00FEFEFE0000CD3E0000C83B0000C2390000BD3600FEFEFE00F748 + 5000ED404800E3394000D7303700FEFEFE00B7CACF008FA4AC008FA4AC008FA4 + AC005B8D9F00A5E8EF009BE8F4008CD5E2004666760073858F007A8A95007585 + 9100BDCED300000000000000000000000000BEBEBE00908F8F00666363003D39 + 37004541400087868600BEBEBE00000000000000000000000000BBBBBB009F9E + 9D004D4D4E007271710000000000000000000000000000000000000000000000 + 00000000000000000000FFE0D000FFDFC000FFD0C000FFD0C000000000000000 + 000000000000000000000000000000000000FEFEFE0000CCFF0000C8FF0000C4 + FF0000BFFF00FEFEFE0000D1400000CD3E0000CA3C0000C43A00FEFEFE00FF4E + 5600F9495100F0434A00E63B4200FEFEFE000000000000000000000000000000 + 00000000000086B3C30082ADBD00799FB000BCCED30000000000000000000000 + 000000000000000000000000000000000000BEBEBE008E8D8D00444141004747 + 46009A9A9A00BEBEBE000000000000000000000000000000000000000000BDBD + BD00B1B1B1008B8B8B0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FEFEFE00FEFEFE00FEFEFE00FEFE + FE00FEFEFE00FEFEFE00FEFEFE00FEFEFE00FEFEFE00FEFEFE00FEFEFE00FEFE + FE00FEFEFE00FEFEFE00FEFEFE00FEFEFE000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000C0C0C000A9A9A90068696700A1A1 + A000BFBFBF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000BBA1 + 9400975F450063423200A28D8200000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FBD7C500F8D5C3000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000F8D5C300FBD7C500000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000CD86 + 6300AB623F008A50330062453700BDBDBE00B99F9200664334005E3F3000A891 + 8600000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000BA6E4700AA542900AA542900A25027009B4C25009648 + 23008F4622008A43210086412000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000F8DCCF00F38A5700E195 + 7100000000000000000000000000000000000000000000000000000000000000 + 0000E1957100F38A5700F8DCCF00000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000DD83 + 5500C3B2AA00B89C8E00854E3300C0C0C000C5826100AA623E00633C29002F25 + 2300000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000C1795500FDF9F600CEB09C00CCAF9B00CAAD9A00C7AC + 9900C6AB9800C4A9970089432100000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000EECBBA00F085 + 5000DA865E00000000000000000000000000000000000000000000000000DA86 + 5E00F0855000EECBBA0000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000E185 + 5700C5B3AA00BDAEA8008C523500BCB8B600D47C5200C2B2AA00AE9486006B42 + 2D00000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000C9856400FFFFFF00DA8C5C00D1835100D1835100D183 + 5100D1835100C6AB98008E452200000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000CA80 + 5C00F0885500EAC8B70000000000000000000000000000000000EAC8B700F088 + 5500CA805C000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000DA98 + 7600E5865600B06641008F5538009C725D00C9754D00C1B9B500BA9E90008F55 + 360000000000000000000000000000000000B7A2930063493500634935006349 + 35006349350063493500D1927300FFFFFF00FEFDFB00FBEFEA00F5DED300F0CE + BE00EDC3AF00C7AC990092472300000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000E1CD + C300DB784700EF93670000000000000000000000000000000000EF936700DB78 + 4700E1CDC3000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000C8B5 + AC00EB8E5D00DB8256009F5F400094604700BE744F00D57B4F00B96B4500AD87 + 740000000000000000000000000000000000B7A29300F8F3F000EADFD700E6D9 + CF00E1D2C700DDCBBF00D89F8200FFFFFF00F3A77F00E7976E00DA8C5C00D183 + 5100D1835100CAAE9A00984A2500000000000000000000000000000000008A46 + 2500954C2800A4542E00B65F3400C7693A00D672400000000000000000000000 + 0000AE5C3600EC865200F2CFBD000000000000000000F2CFBD00EC865200AE5C + 3600000000000000000000000000D6724000C7693A00B65F3400A4542E00954C + 28008A4625000000000000000000000000000000000000000000000000000000 + 0000C8B6AE00DE997600DF845600C68D7000CC784D00D27C5100C6917700BDA7 + 9C0000000000000000000000000000000000B7A29300FBF8F700E5AE8100DEA1 + 7300DA9C6E00D5976800E0AA9000FFFFFF00FFFFFF00FFFFFF00FBF4F000F7E4 + DB00F2D3C500CCAE9A009D4D250000000000000000000000000000000000954C + 2800DF733600EA824900F39A6A00F5B594000000000000000000000000000000 + 0000A3664800E9845200F7C2A7000000000000000000F7C2A700E9845200A366 + 480000000000000000000000000000000000F5B59400F39A6A00EA824900DF73 + 3600954C28000000000000000000000000000000000000000000000000000000 + 00000000000000000000887366007160560086675500AB9E9900000000000000 + 000000000000000000000000000000000000BBA69700FEFDFC00FBF6F500F6EF + EB00F1E6E000ECDED600E7B59C00FFFFFF00FCAE8A00FCAE8A00F1DBD200E78E + 6000B3572A00AC542900A450270000000000000000000000000000000000A355 + 2E00EC824B00F38D5B00EC9C7600B6866F00E9D5CB0000000000000000000000 + 0000A9745900E1825400F7BE9E000000000000000000F7BE9E00E1825400A974 + 5900000000000000000000000000E9D5CB00B6866F00EC9C7600F38D5B00EC82 + 4B00A3552E000000000000000000000000000000000000000000000000000000 + 000000000000B8B4B1008E8074007E6E6300695D550076726E00000000000000 + 000000000000000000000000000000000000C1AB9C00FFFFFF00FAC59F00F0B8 + 8E00E5AE8100DEA17300ECBDA600FFFFFF00FFFFFF00FFFFFF00FFFFFF00EA9A + 7200F0C9B200B1572B00EDD7CD0000000000000000000000000000000000B55F + 3400F39A6A00F49C7100F29465009D533000AA613B00DAB8A70000000000F6C5 + AE009D644600DE805100F7BDA1000000000000000000F7BDA100DE8051009D64 + 4600F6C5AE0000000000DAB8A700AA613B009D533000F2946500F49C7100F39A + 6A00B55F34000000000000000000000000000000000000000000000000000000 + 000000000000BAB0AA00A2948B00A8A099008E817700635B5500000000000000 + 000000000000000000000000000000000000C7B2A300FFFFFF00FFFFFF00FCFA + F900F8F2F000F3EAE600F0C4AE00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EBA7 + 8500C5653500F1DBCF000000000000000000000000000000000000000000C769 + 3B00F7CAAE00FBDDCB00F4A37600F3946400B4623900B0643E00BF816200BB84 + 6000A15E3900EE8B5A00F6C8B0000000000000000000F6C8B000EE8B5A00A15E + 3900BB846000BF816200B0643E00B4623900F3946400F4A37600FBDDCB00F7CA + AE00C7693B000000000000000000000000000000000000000000000000000000 + 000000000000BEB1AA00A1948B00C8C6C400CDC5C0006B5F5600ADADAE000000 + 000000000000000000000000000000000000CFB9A900FFFFFF00FFDABA00FFD0 + AE00F0DED200B7A29300F0C4AE00EFC2AB00EFC1AA00EFB9A000EDB09200EDB0 + 9200F9E4D900000000000000000000000000000000000000000000000000D672 + 40000000000000000000FBDECF00F5A57E00F49D7200C9734700B7663C00B665 + 3D00E2815300F6BCA100F6CBB7000000000000000000F6CBB700F6BCA100E281 + 5300B6653D00B7663C00C9734700F49D7200F5A57E00FBDECF00000000000000 + 0000D67240000000000000000000000000000000000000000000000000000000 + 000000000000A99B9200B2A8A300C3C3C300E8E4E2007C6F6600A8A9AA000000 + 000000000000000000000000000000000000D4BEAF00FFFFFF00FFFFFF00FFFF + FF00FEFDFC00BBA69600D4C5BA008F725B00E2DDD90000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FBDACA00F5A67E00F6B69600F5B28F00F6B0 + 9100F6C1A800F6C5AE0000000000000000000000000000000000F6C5AE00F6C1 + A800F6B09100F5B28F00F6B69600F5A67E00FBDACA0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000BBB8B600A3968C00BCBAB90000000000DDDCDC00BCB2AB00A6A19E000000 + 000000000000000000000000000000000000D8C2B200FFFFFF00FFFFFF00FFFF + FF00FFFFFF00C7B1A200A5826600E2DDD9000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FBE0D200F6C3A900F7CF + BB00F9DBCD00000000000000000000000000000000000000000000000000F9DB + CD00F7CFBB00F6C3A900FBE0D200000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000BFB8B300B3A89E000000000000000000CBCBCB00E2DDDA00A19790000000 + 000000000000000000000000000000000000D8C2B200D8C2B200D4BFAE00D4BF + AE00CEB8A900C8B2A300E9E2DE00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00009E8D80006349350063493500634935006349350063493500634935006349 + 3500634935006349350000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF000000000000000000EFCECF00C3646500AA55 + 5600A45253009F4F50009A4D4D00944A4A008F4747008944440083414100783B + 3C00783B3C00723939006E363700000000000000000000000000000000000000 + 00009B8A7D00FCFAF800D9C0AE00D5BCAB00CFB7A600C8B1A000C1AB9B00BBA6 + 9600B7A2930063493500000000000000000075848F0066808F0060798700576E + 7B004E626F0044566100394852002E3A4300252E35001B22290014191E000E12 + 16000E1318000000000000000000000000000000000000000000EB925D00EB92 + 5D0000000000000000000000000000000000FFFFFF00E39A6F00FFFFFF00E399 + 6C00E2996D00E3996D00FFFFFF000000000000000000CF6B6C00F38E8F00E680 + 8100AA44240047322100C3B4AB00C6BBB300CAC1BC00CEC8C400564D48009E3E + 33009C3D36009839310072393900000000000000000000000000000000000000 + 00009B8A7D00FEFEFE00FBF8F700F6F1ED00F1E8E100EBDED600E5D5C900E1CD + BE00BCA596006349350000000000000000007787920089A1AB006AB2D400008F + CD00008FCD00008FCD00048CC7000888BE000F82B400157CA9001B779F001F72 + 9600224B5C0087A2AB0000000000000000000000000000000000EB925D00EB92 + 5D0000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF000000000000000000D16F7000FF999A00EC86 + 8700E6808100715B4B00473C34008D786800EDE0D800F1E7E0008F7F7300A341 + 3500A2423C009C3D3500783B3C00000000000000000000000000000000000000 + 00009E8D8000FFFFFF00FEFDFD00FAF7F500F5EFEA00F0E6DF00EBDDD300E5D4 + C700C1AA9B006349350000000000000000007A8A95007EBED3008AA4AE007EDC + FF005FCFFF0055CBFF004CC4FA0041BCF50037B3F0002EAAEB0024A0E500138C + D400236780005E696D0000000000000000000000000000000000EB925D00EB92 + 5D0000000000000000000000000000000000FFFFFF00E2956600E3936300FFFF + FF00E3926200E2936300FFFFFF000000000000000000D4757600FF9FA000F590 + 9100EC868700715B4B0000000000473C3400E9D9CE00ECDDD40085746700AE4B + 4300AA494400A3423C007D3E3E00000000000000000000000000000000000000 + 0000A2918400FFFFFF00FFFFFF00FDFDFB00F9F5F300F4EDE800EFE4DC00E9DB + D000C8B1A1006349350000000000000000007D8E980079D2EC008BA4AD0089C2 + CE0071D8FF0065D3FF005CCEFF0051C9FE0049C1FA003FB9F50034B0EE0029A8 + E9001085CD00224B5B0098B2BA0000000000000000000B090900EB925D00EB92 + 5D0000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF000000000000000000D77B7C00FFA9AA00FB9F + A000F5939400715B4B00715B4B00715B4B00715B4B00766252007D6A5B00BA56 + 5400B24F4C00AA49440083414100000000000000000000000000000000000000 + 0000A7958800FFFFFF00FFFFFF00FFFFFF00FCFBFA00F9F4F100F3ECE600EDE3 + DA00CFB7A60063493500000000000000000080919C0081D7EF007DC5E0008CA6 + B00080DDFE0068D3FF0067D4FF0062D1FF0058CDFF004EC7FC0046BEF7003BB6 + F20031ACEC00256981007A95A10000000000000000001D1D1D00EB925D00EB92 + 5D00EB925D00EB925D00EB925D0000000000FFFFFF00E3915F00E28C5800FFFF + FF00FFFFFF00E2936400FFFFFF000000000000000000DB838400FFB3B400FFAD + AE00FCA3A400F48E8F00EC868700E6808100DF797A00D7717200D16B6C00C15D + 5C00BA565400B2504C0089444400000000000000000000000000000000000000 + 0000AB9A8C00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FCFAF800F7F3EF00F2EA + E400D5BCAB0063493500000000000000000083959F0089DCF1008CE2FF008DA8 + B1008CBAC70074D8FF0067D4FF0067D4FF0067D4FF005FD0FF0054CDFF004BC5 + FC0041BBF7002EA2DB005167740098B2BA000000000000000000EB925D00EB92 + 5D00171717000F0F0F000707070000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF000000000000000000000000000000000000000000DF8A8B00FFBBBC00FFB6 + B700C9636000C45E5600BE584B00B8523F00B34D3400AD472800A7411C00A13B + 1100C15D5C00BA5654008F474700000000000000000000000000000000000000 + 0000B09E9000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFEFE00FBF9F700F6F1 + ED00D9C0AE00634935000000000000000000869AA30092E1F20098E8FD0080C4 + DE008EA7B00081DEFD0084E0FF0084E0FF0084E0FF0084E0FF0081DFFF007BDD + FF0074D8FF006BD6FF0056A9D1008F9BA4000000000000000000EB925D003133 + 3100FFE0CF00FFE0CF00FFE0CF0000000000FFFFFF00E2916000FFFFFF00FFFF + FF0000000000FFFFFF00000000000000000000000000E2919200FFBDBE00CC66 + 6700FFFFFF00FFFFFF00FBF8F600F6EEEA00F0E5DE00EADBD200E5D1C600E1CA + BD00A13B1100C25D5C00944A4A00000000000000000070C7E10081D8EE0086E6 + FA0039BEE50099D8DF0091E1F60081D0E900FFFFFF00FFFFFF00FEFEFD00C4AD + 9D00C3AB9C00644A36000000000000000000889CA5009AE6F3009FEBFB0098E8 + FE008BACB9008BACB9008AAAB70088A6B30086A3AF00839FAA00819AA6007F95 + A1007C919D007A8E9900798B9500778893000000000000000000EB925D000000 + 0000FFE0CF00FFE0CF00FFE0CF0000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF000000000000000000000000000000000000000000E5979800FFBDBE00D36D + 6E00FFFFFF00FFFFFF00FFFFFF00FBF8F600F6EEEA00F0E5DE00EADBD200E5D1 + C600A7411C00CC6767009A4D4D00000000000000000098E2F30031B7DF007DE9 + FD005DC6E60093F0FF002FB6DF00A0E8F900FFFFFF00FFFFFF00A9988A00644A + 3600644A3600644A360000000000000000008BA0A800A0EAF600A6EEF9009FEB + FB0098E8FE007ADAFF0067D4FF0067D4FF0067D4FF0067D4FF0067D4FF0067D4 + FF00778893000000000000000000000000000000000000000000EB925D000000 + 0000FFE0CF00FFE0CF00FFE0CF00000000000000000000000000000000000000 + 000000000000EB925D00000000000000000000000000E99E9F00FFBDBE00DC76 + 7700FFFFFF00FFFFFF00FFFFFF00FFFFFF00FBF8F600F6EEEA00F0E5DE00EADB + D200AD472800D77172009F4F5000000000000000000094EAFA0093F1FF00BFF8 + FF00AFE8F400C7FBFF0093F1FF009FF0FF00FFFFFF00FFFFFF00AE9C8E00D4C5 + BA00644A3600D0CBC40000000000000000008EA2AB00A7EEF600ABF0F700A6EE + F9009FEBFB0098E8FD0071D4FB00899EA7008699A30082949F007E909A007A8C + 9700778893000000000000000000000000000000000000000000EB925D000000 + 0000FFE0CF00FFE0CF00FFE0CF00FFE0CF00FFE0CF00FFE0CF00FFE0CF00FFE0 + CF0021212100EB925D0011110F000000000000000000EDA6A700FFBDBE00E680 + 8100FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FBF8F600F6EEEA00F0E5 + DE00B34D3400DF797A00A4525300000000000000000022ABD90053BFE100AFE8 + F400F0FFFD00B4EBF60053BFE10036BBE500FFFFFF00FFFFFF00B2A09200644A + 3600D0CCC5000000000000000000000000008FA4AC00A0D2DA00ABF0F700ABF0 + F700A6EEF9009FEBFB008DA1AA00B5CBD0000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000EB925D000000 + 0000FFE0CF00FFE0CF00FFE0CF00FFE0CF00FFE0CF00FFE0CF00FFE0CF00FFE0 + CF00333535002B2D2B00232323000000000000000000F0ACAD00FFBDBE00EF89 + 8A00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FBF8F600F6EE + EA00B8523F0067333300AA555600000000000000000094EAFA0096F3FF00C7FB + FF00ADE5F300C3FBFF0096F3FF008BD7E200B6A49600B6A49600B5A39500D0CC + C50000000000000000000000000000000000BDCED4008FA4AC008FA4AC008FA4 + AC008FA4AC008FA4AC00B5CBD000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000EB925D000000 + 0000FFE0CF00FFE0CF00FFE0CF00FFE0CF00FFE0CF00FFE0CF00FFE0CF00FFE0 + CF0045474700FFE0CF00353537000000000000000000F3B2B300FFBDBE00F892 + 9300FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FBF8 + F600BE584B00B0585900B0585900000000000000000096E1F30032B8E0008CF1 + FF0058C2E30090F1FF002FB6DF008DDDF0000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000F5B6B700F5B6B700F3B2 + B300F1ADAE00EEA7A800EAA1A200E79A9B00E4939400E08E8F00DD878800DA80 + 8100D67A7B00D3747500D16F7000000000000000000066C3E00081D8EE0094EA + FA0026AFDB008CE8FA008EDEF10081CCE3000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000424D3E000000000000003E000000 + 2800000040000000400100000100010000000000000A00000000000000000000 + 000000000000000000000000FFFFFF0000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000FFFFFFFFFFFFFFFFFF9FF80F81FFFFFF + F187E0078007C7FFE083C003C103C2FFC213C001C411F207C7138001C801F187 + F111800188C8F10FC00080018308F903800C80019019F89387018001CC23F8FF + 800380018027F07FC0818003240FFCFFC683C003203FFC1FFC17E00707FFFE1F + FC1FF00FBFFFFF3FFFFFFFFFFFFFFFFFFFFF0000FF0FFFFF00000000F8030001 + 00000000E000000100000000C000000100000000800000010000000000000001 + 0000000000000001000000008000000100000000000000010000000000000001 + 0000000000000001000000000000000100000000C043000100000000C0074015 + 00000000C00F000100000000F63FFFFFFFFFFFFFFFFFF001FFFFC007F00FF001 + C1FFC007E007C001C1FFC007C003C001007FC00780010001007FC00780010001 + 007FC007800100010013C007800100010003C00780010001C000C00780010001 + C000C00780010001FE00C00780010007FE00C007C0030007FE00C00FE007001F + FF83C01FF00F001FFF83FFFFFFFFFFFFFFFFFFFFF807FFFFFFFFFC01F807C007 + 000FFC01F007C007000FFC01E003C007000FC001C003C007000F8001C001C007 + 000F80018001C007000F80010001C007000F80010000C007000780039000C007 + 00038007E000C00700018007C000C00700008007C005C007FFF08007E407C00F + FFF9C00FFC0FC01FFFFFF87FFE7FFFFFFFFFFFFFFFFFFE70F87FFFFFFC00FC20 + C867FC018000F8008003FC010000F0088003FC010000E011C007000100008001 + C007000100010000030100010003000007810001000700000781000100070000 + 0301000300070000C0070007000700008003007F00070000800300FF800F0000 + C86701FFF8FF8001F87FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF800180010000 + 8003800180010000000180018001000000018001800100000001800180010000 + 0001800180010000000180018001000000018001800100000001800180010000 + 0001800180010000000180018001000000018001800100000001800180010000 + 8003800180010000FFFFFFFF80010000FFFFFFFFFFFFFC00FF1FFFF8FFF8FC00 + FE1FFFF0FFF0FC00EE1FFFE0FFE0FC00E03FFFC1FFC1E000E03FE003E003E000 + E03FC007C007E000E00F800F800FE000E01F800F800F0007E03F800F800F0007 + E07F800F800F0007E0FF800F800F0007E1FF800F800F003FE3FF800F800F003F + E7FFC01FC01F003FEFFFE03FE03F003FFFFF0000F001F00FFFFF0000F001C003 + FFFF0000C0018001FFFF0000C0018001FE7F000000010000FE3F000000010000 + E01F000000010000E00F000000010000E00F000000010000E00F000000010000 + E01F000000010000FE3F000000070000FE7F000000078001FFFF0000001F8001 + FFFF0000001FC003FFFF0000FFFFF00FFFE7FFFFFFFFFFFFFFE7FFFFFFFFFFFF + FFE7F00F0003FBFFE000E0070001F9FFE000C0030001F8FFE3E7C0030001F87F + E5E7C3C30001F83FE6E7C3C30001F81FE767C2430001F80FE7A7C0C30001F81F + E7C7C0C30001F83F0007C0C30001F87F0007E0C70001F8FFE7FBC0FF0001F9FF + E7FDFFFF0001FBFFE7FFFFFFFFFFFFFFFFFFFFFFFFFFF800FFFFFFFFFFFFF800 + FFFFFFFF0003F801FFFFC0030001FC21E00FCFFB0001FC01E00FC00B0001F800 + E00FC00B0001FC10E00FC00B0001F810E00FC00B00010000E00FC00B00011001 + E00FC00B000110FFE00FC00B000198FFE00FC003000180FFFFFFC003000181FF + FFFFFFFF0001CFFFFFFFFFFFFFFF87FFFFFFDFFFFFFFFFFFF001DFFB0000FC3F + F80187FB8000E023FC0103FB80008001BE0103E1800080019F0103C080008001 + 8F0103C08000C003860187C0800000008061EFC08000000080F1EFE180000000 + 80F9EFF780008000807DF7EF8000E003803FF7EF8000C001801FFBDF8000C001 + 800FFC3F8000E423FFFFFFFF0000FC3FFFFFFF1FFEFFFFFFFFF8E0001C71800F + FFF0E0003839800FFFE0E0005EF5800FFFC1E000EEEFF0FFE003E000C007F07F + C00780008003F83F800F80008003FC1F800F00008003FE03800F00008003FF03 + 800F0000C007FF83800F0000EEEFFF80800F00005EF5FF80800F80003839FFC0 + C01FC0FF1C71FFF0E03FFFFFFEFFFFFFFFFFFFFFFFFFFFFF800380038003E00F + 800380038003E00F800380038003E000800380038003E0008003800380030000 + 8003800380030000800380038003000080038003800300008003800380030000 + 800380038003000080038003800300018007800780070003800F800F800F0007 + 801F801F801F01FF803F803F803F03FFFF80FFFFFFFFFFFFFE00FC038003803F + F800FC038003803FF000F0038003803FE000F00380038003C000C00380038003 + 0000C003800380030000C003800380030000C003800380030000C00380038003 + 0000C007800380030000C00F800380030000C01F8007F8070000C03F800FF80F + 8001C07F801FF81FFFFFFFFF803FFFFFFFFFFFFFFFFFFFFFFFFF8421FFFFFFFF + 80008421000FC7FF00008421000FC2FF00008421000FF2070000FFFF000FF187 + 00008421000FF10F00008421000FF903000084210007F893000084210003F8FF + 0000FFFF0001F07F000084210000FCFF000084210000FC1F00008421FFE0FE1F + 00008421FFF0FF3F0000FFFFFFFFFFFFFFFFFFFF800FFFFFFFFF000F800F8003 + FFFF000F800F8003E007000F80008003E007000F80008003E007000F80008003 + E007000F80008003E007000F80008003E007000C80008003E007000080008003 + E007000080008003E007000080008003E007F800800F8003FFFFF000800F8003 + FFFFF000800F8003FFFFFFFF800FFFFFFFFFFFFFFFFFFFFFFC00FFFF803FFFFF + 0000C3F3803F0000000081E1803F00000000C1C1800300000000C18380030000 + 0001E007800300000003F00F800300000007F81F800300000007FC1F80030000 + 0007F00F800300000007E0078003000000078083F8070000000701C3F80F0000 + F87F03E3F81F0000FFFF07FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1FFFFFF + FF9FF9FFE00FFC01FF8FF1FFE00FFC01FFC7E3FFE00FFC01FFE3C7FFE00F0001 + FFE3C7FFE00F0001E0718E07F00F0001E0F18F07FC3F0001E0718E07F83F0001 + E0218407F83F0003E0018007F81F0007EC018037F81F007FFE03C07FF11F00FF + FF87E1FFF31F01FFFFFFFFFFFFFFFFFFFFFFFFFFFE00FFFFF003FFFFC0008001 + F003000780008001F003000380008001F003000380008001F003000180008001 + F003000180008001F003000080008001F0030000800180018003000080018001 + 80030007800180018003000780018001800700FF80018001800F01FF80018001 + 80FFFFFF8001800180FFFFFFFFFFFFFF00000000000000000000000000000000 + 000000000000} + end + object MainMenu: TMainMenu + Images = Buttons + Left = 24 + Top = 168 + object MainFile: TMenuItem + Caption = '&File' + OnClick = MainMenuClick + object New1: TMenuItem + Caption = 'New...' + ImageIndex = 65 + ShortCut = 16462 + OnClick = btNewClick + end + object mnuOpen: TMenuItem + Caption = '&Open...' + ImageIndex = 1 + ShortCut = 16463 + OnClick = mnuOpenClick + end + object Restorelastautosave1: TMenuItem + Caption = 'Restore last autosave' + ShortCut = 49217 + OnClick = Restorelastautosave1Click + end + object ImportFromPNG: TMenuItem + Caption = 'Load parameters from PNG' + OnClick = ImportFromPNGClick + end + object N3: TMenuItem + Caption = '-' + end + object mnuSaveAs: TMenuItem + Caption = '&Save Parameters...' + ImageIndex = 3 + ShortCut = 16467 + OnClick = mnuSaveAsClick + end + object mnuSaveAllAs: TMenuItem + Caption = 'Save &All Parameters' + ShortCut = 24659 + OnClick = mnuSaveAllAsClick + end + object N9: TMenuItem + Caption = '-' + end + object mnuSmoothGradient: TMenuItem + Caption = 'Smooth Palette...' + ImageIndex = 34 + OnClick = mnuSmoothGradientClick + end + object mnuOpenGradient: TMenuItem + Caption = 'Gradient Browser...' + ImageIndex = 29 + OnClick = mnuOpenGradientClick + end + object N18: TMenuItem + Caption = '-' + end + object mnuSaveUPR: TMenuItem + Caption = 'Export &UPR...' + ImageIndex = 73 + OnClick = mnuSaveUPRClick + end + object mnuExportFLame: TMenuItem + Caption = 'Export Flame...' + ImageIndex = 74 + ShortCut = 16472 + OnClick = mnuExportFLameClick + end + object mnuExportChaotica: TMenuItem + Caption = 'Export to Chaotica...' + ImageIndex = 72 + ShortCut = 49240 + OnClick = mnuExportChaoticaClick + end + object mnuImportGimp: TMenuItem + Caption = 'Import Gimp Parameters' + Visible = False + end + object N1: TMenuItem + Caption = '-' + end + object mnuRandomBatch: TMenuItem + Caption = '&Random Batch' + ShortCut = 16450 + OnClick = mnuRandomBatchClick + end + object FileExitSep: TMenuItem + Caption = '-' + end + object mnuExit: TMenuItem + Caption = 'E&xit' + OnClick = mnuExitClick + end + end + object MainEdit: TMenuItem + Caption = '&Edit' + OnClick = MainMenuClick + object mnuUndo: TMenuItem + Caption = '&Undo' + Enabled = False + ImageIndex = 4 + ShortCut = 16474 + OnClick = mnuUndoClick + end + object mnuRedo: TMenuItem + Caption = '&Redo' + Enabled = False + ImageIndex = 5 + ShortCut = 16473 + OnClick = mnuRedoClick + end + object mnuSaveUndo: TMenuItem + Caption = 'Save Undo...' + Enabled = False + ShortCut = 49237 + OnClick = mnuSaveUndoClick + end + object N13: TMenuItem + Caption = '-' + end + object mnuCopy: TMenuItem + Caption = 'Copy' + ImageIndex = 7 + ShortCut = 16451 + OnClick = mnuCopyClick + end + object mnuPaste: TMenuItem + Caption = 'Paste' + ImageIndex = 8 + ShortCut = 16470 + OnClick = mnuPasteClick + end + object N20: TMenuItem + Caption = '-' + end + object mnuCopyUPR: TMenuItem + Caption = 'Copy as U&PR' + ImageIndex = 23 + ShortCut = 16469 + OnClick = mnuCopyUPRClick + end + end + object View1: TMenuItem + Caption = '&View' + object mnuFullScreen: TMenuItem + Caption = 'Full Screen' + ImageIndex = 52 + ShortCut = 114 + OnClick = mnuFullScreenClick + end + object N4: TMenuItem + Caption = '-' + end + object mnuEditor: TMenuItem + Caption = '&Editor' + ImageIndex = 19 + ShortCut = 115 + OnClick = mnuEditorClick + end + object mnuAdjust: TMenuItem + Caption = 'Adjust' + ImageIndex = 18 + ShortCut = 116 + OnClick = mnuAdjustClick + end + object mnuGrad: TMenuItem + Caption = 'Gradient' + ImageIndex = 11 + ShortCut = 117 + OnClick = mnuGradClick + end + object mnuMutate: TMenuItem + Caption = 'Mutation' + ImageIndex = 17 + ShortCut = 118 + OnClick = mnuMutateClick + end + object mnuCurves: TMenuItem + Caption = 'Curves' + ImageIndex = 69 + ShortCut = 119 + OnClick = tbCurvesClick + end + object N5: TMenuItem + Caption = '-' + end + object mnuImageSize: TMenuItem + Caption = 'Image Size' + ImageIndex = 14 + OnClick = mnuImageSizeClick + end + object mnuMessages: TMenuItem + Caption = 'Messages' + ImageIndex = 63 + OnClick = tbMessagesClick + end + end + object MainFlame: TMenuItem + Caption = 'Flame' + OnClick = MainMenuClick + object mnuResetLocation: TMenuItem + Caption = 'Reset Location' + ImageIndex = 12 + ShortCut = 123 + OnClick = mnuResetLocationClick + end + object mnuRandom: TMenuItem + Caption = '&Randomize' + OnClick = mnuRandomClick + end + object N19: TMenuItem + Caption = '-' + end + object Changeweightdistribution1: TMenuItem + Caption = 'Change Weight distribution' + ImageIndex = 25 + object mnuRWeights: TMenuItem + Caption = 'Random &Weights' + OnClick = mnuRWeightsClick + end + object mnuEqualize: TMenuItem + Caption = '&Equalize Weights' + OnClick = mnuEqualizeClick + end + object CalculateWeights: TMenuItem + Caption = 'Calculate Weights' + OnClick = CalculateWeightsClick + end + object mnuNormalWeights: TMenuItem + Caption = 'Normalize Weights' + OnClick = mnuNormalWeightsClick + end + end + object Changecolordistribution1: TMenuItem + Caption = 'Change Color distribution' + ImageIndex = 30 + object mnuCalculateColors: TMenuItem + Caption = 'Calculate Colors Values' + OnClick = mnuCalculateColorsClick + end + object mnuRandomizeColorValues: TMenuItem + Caption = 'Randomize Color Values' + ShortCut = 49230 + OnClick = mnuRandomizeColorValuesClick + end + object ResetColorValues: TMenuItem + Caption = 'Reset color values' + OnClick = ResetColorValuesClick + end + object Calculatecolorspeed1: TMenuItem + Caption = 'Calculate color speed' + OnClick = Calculatecolorspeed1Click + end + object Randomizecolorspeed1: TMenuItem + Caption = 'Randomize color speed' + OnClick = Randomizecolorspeed1Click + end + object ResetColorSpeed: TMenuItem + Caption = 'Reset color speed' + OnClick = ResetColorSpeedClick + end + end + object N2: TMenuItem + Caption = '-' + end + object AddSymmetry: TMenuItem + Caption = 'Add equiaffine symmetry...' + object BilateralSym: TMenuItem + Tag = -1 + Caption = 'Bilateral' + OnClick = AddSymmetryClick + end + object RotationalSym: TMenuItem + Caption = 'Rotational, order...' + object rot2: TMenuItem + Tag = 2 + Caption = '2' + OnClick = AddSymmetryClick + end + object rot3: TMenuItem + Tag = 3 + Caption = '3' + OnClick = AddSymmetryClick + end + object rot4: TMenuItem + Tag = 4 + Caption = '4' + OnClick = AddSymmetryClick + end + object rot5: TMenuItem + Tag = 5 + Caption = '5' + OnClick = AddSymmetryClick + end + object rot6: TMenuItem + Tag = 6 + Caption = '6' + OnClick = AddSymmetryClick + end + object rot7: TMenuItem + Tag = 7 + Caption = '7' + OnClick = AddSymmetryClick + end + object rot8: TMenuItem + Tag = 8 + Caption = '8' + OnClick = AddSymmetryClick + end + end + object DihedralSym: TMenuItem + Caption = 'Dihedral, order...' + object dih2: TMenuItem + Tag = -2 + Caption = '2' + OnClick = AddSymmetryClick + end + object dih3: TMenuItem + Tag = -3 + Caption = '3' + OnClick = AddSymmetryClick + end + object dih4: TMenuItem + Tag = -4 + Caption = '4' + OnClick = AddSymmetryClick + end + object dih5: TMenuItem + Tag = -5 + Caption = '5' + OnClick = AddSymmetryClick + end + object dih6: TMenuItem + Tag = -6 + Caption = '6' + OnClick = AddSymmetryClick + end + object dih7: TMenuItem + Tag = -7 + Caption = '7' + OnClick = AddSymmetryClick + end + object dih8: TMenuItem + Tag = -8 + Caption = '8' + OnClick = AddSymmetryClick + end + end + end + object AddTile: TMenuItem + Caption = 'Add equiaffine tile...' + OnClick = AddTileClick + object Rhombic1: TMenuItem + Tag = 1 + Caption = 'Rhombus' + OnClick = AddTileClick + end + object Square1: TMenuItem + Tag = 2 + Caption = 'Square' + OnClick = AddTileClick + end + object Hexagonal1: TMenuItem + Tag = 3 + Caption = 'Hexagonal' + OnClick = AddTileClick + end + end + object N24: TMenuItem + Caption = '-' + end + object mnuFlatten: TMenuItem + Caption = 'Apply flatten' + OnClick = mnuFlattenClick + end + object mnuUnflatten: TMenuItem + Caption = 'Unflatten' + OnClick = mnuUnflattenClick + end + object N12: TMenuItem + Caption = '-' + end + object AddTemplate: TMenuItem + Caption = 'Save as template' + OnClick = AddTemplateClick + end + object N21: TMenuItem + Caption = '-' + end + object mnuRender: TMenuItem + Caption = 'Render to Disk...' + ImageIndex = 35 + ShortCut = 16466 + OnClick = mnuRenderClick + end + object mnuRenderAll: TMenuItem + Caption = 'Render &All Flames' + ImageIndex = 64 + ShortCut = 49234 + OnClick = mnuRenderAllClick + end + object mnuResumeRender: TMenuItem + Caption = 'Resume unfinished render...' + Enabled = False + Hint = 'Resume unfinished render process from a saved file' + Visible = False + end + object N22: TMenuItem + Caption = '-' + end + object mnuReportFlame: TMenuItem + Caption = 'Generate report...' + OnClick = mnuReportFlameClick + end + end + object mnuVar: TMenuItem + Caption = 'Variation' + object mnuVRandom: TMenuItem + Caption = 'Random' + Checked = True + GroupIndex = 2 + RadioItem = True + ShortCut = 122 + OnClick = mnuVRandomClick + end + object N8: TMenuItem + Caption = '-' + GroupIndex = 2 + end + object mnuBuiltinVars: TMenuItem + Caption = 'Built-in' + GroupIndex = 2 + end + object mnuPluginVars: TMenuItem + Caption = 'Plugins' + GroupIndex = 2 + end + end + object mnuScript: TMenuItem + Caption = 'Script' + object mnuRun: TMenuItem + Caption = 'Run script' + ImageIndex = 43 + ShortCut = 120 + OnClick = mnuRunClick + end + object mnuStop: TMenuItem + Caption = 'Stop script' + ImageIndex = 36 + ShortCut = 121 + OnClick = mnuStopClick + end + object N15: TMenuItem + Caption = '-' + end + object mnuOpenScript: TMenuItem + Caption = 'Open...' + ImageIndex = 1 + ShortCut = 16453 + OnClick = mnuOpenScriptClick + end + object mnuEditScript: TMenuItem + Caption = 'Edit' + ImageIndex = 42 + ShortCut = 16452 + OnClick = mnuEditScriptClick + end + object mnuTurnFlameToScript: TMenuItem + Caption = 'Turn flame into script...' + ShortCut = 16454 + OnClick = mnuTurnFlameToScriptClick + end + object N10: TMenuItem + Caption = '-' + end + object mnuManageFavorites: TMenuItem + Caption = 'Manage Favorites' + ImageIndex = 59 + OnClick = mnuManageFavoritesClick + end + object FavouriteScripts1: TMenuItem + AutoHotkeys = maManual + Caption = 'Favourite Scripts' + Enabled = False + end + object Directory1: TMenuItem + AutoHotkeys = maManual + Caption = 'Directory' + Enabled = False + end + end + object mnuView: TMenuItem + Caption = 'Options' + object mnuToolbar: TMenuItem + Caption = 'Main toolbar' + Checked = True + OnClick = mnuToolbarClick + end + object mnuStatusBar: TMenuItem + Caption = 'Status Bar' + Checked = True + OnClick = mnuStatusBarClick + end + object mnuFileContents: TMenuItem + Caption = 'File Contents' + Checked = True + OnClick = mnuFileContentsClick + end + object N25: TMenuItem + Caption = '-' + end + object SortFlames: TMenuItem + Caption = 'Sort flame list alphabetically' + ShortCut = 49222 + OnClick = SortFlamesClick + end + object EnumerateFlames: TMenuItem + AutoCheck = True + Caption = 'Display flame indices' + OnClick = EnumerateFlamesClick + end + object mnuResetUI: TMenuItem + Caption = 'Reset file content list width' + OnClick = mnuResetUIClick + end + object N17: TMenuItem + Caption = '-' + end + object mnuTrace: TMenuItem + Caption = 'Trace log...' + ImageIndex = 71 + OnClick = mnuTraceClick + end + object N14: TMenuItem + Caption = '-' + end + object mnuOptions: TMenuItem + Caption = 'Options...' + ImageIndex = 13 + ShortCut = 16464 + OnClick = mnuOptionsClick + end + object N7: TMenuItem + Caption = '-' + end + object mnuApoStyle: TMenuItem + AutoHotkeys = maManual + Caption = 'Apophysis UI style...' + end + end + object MainHelp: TMenuItem + Caption = '&Help' + Hint = 'About Apophys and its fractal algoritm' + object mnuHelpTopics: TMenuItem + Caption = 'Contents' + ShortCut = 112 + OnClick = mnuHelpTopicsClick + end + object mnuFlamepdf: TMenuItem + Caption = 'The Fractal Flame Algorithm' + OnClick = mnuFlamepdfClick + end + object mnuManual: TMenuItem + Caption = 'IFS Fractal Theory...' + Hint = + 'https://www.amazon.com/Fractals-Everywhere-Dover-Books-Mathemati' + + 'cs/dp/0486488705' + OnClick = mnuManualClick + end + object N11: TMenuItem + Caption = '-' + end + object mnuAbout: TMenuItem + Caption = 'About Apophysis...' + ImageIndex = 70 + OnClick = mnuAboutClick + end + object DownloadPlugins: TMenuItem + Caption = 'Download Apophysis plugins....' + Hint = 'https://sourceforge.net/projects/apo-plugins/' + OnClick = DownloadPluginsClick + end + end + end + object OpenDialog: TOpenDialog + Filter = + 'Apophysis Parameter Files (*.apo)|*.apo|Apophysis 1.0 Parameters' + + ' (*fla)|*.fla|IFS Files (*.ifs)|*.ifs' + Options = [ofHideReadOnly, ofPathMustExist, ofFileMustExist, ofEnableSizing] + Left = 24 + Top = 456 + end + object ListPopUp: TPopupMenu + OnPopup = ListPopUpPopup + Left = 24 + Top = 224 + object mnuItemDelete: TMenuItem + Caption = '&Delete' + Hint = 'Delete the selected IFS fractal from the file' + ShortCut = 16430 + OnClick = mnuItemDeleteClick + end + object mnuListRename: TMenuItem + Caption = '&Rename' + Hint = 'Rename the selected IFS fractal' + ShortCut = 113 + OnClick = mnuListRenameClick + end + object N27: TMenuItem + Caption = '-' + end + object mnuRefreshThumb: TMenuItem + Caption = 'Refresh thumbnail' + OnClick = mnuRefreshThumbClick + end + object mnuRefreshAllThumbs: TMenuItem + Caption = 'Refresh all thumbnails' + OnClick = ListViewDblClick + end + object N26: TMenuItem + Caption = '-' + end + object mnuLowQuality: TMenuItem + Caption = 'Low Quality' + RadioItem = True + OnClick = mnuThumbnailQualityClick + end + object mnuMediumQuality: TMenuItem + Tag = 1 + Caption = 'Medium Quality' + Checked = True + RadioItem = True + OnClick = mnuThumbnailQualityClick + end + object mnuHighQuality: TMenuItem + Tag = 2 + Caption = 'High Quality' + RadioItem = True + OnClick = mnuThumbnailQualityClick + end + end + object DisplayPopup: TPopupMenu + Images = Buttons + Left = 104 + Top = 224 + object mnuPopUndo: TMenuItem + Caption = 'Undo' + Enabled = False + ImageIndex = 4 + ShortCut = 16474 + OnClick = mnuUndoClick + end + object mnuPopRedo: TMenuItem + Caption = 'Redo' + Enabled = False + ImageIndex = 5 + ShortCut = 16473 + OnClick = mnuRedoClick + end + object N16: TMenuItem + Caption = '-' + end + object mnuPopResetLocation: TMenuItem + Caption = 'Reset Location' + ImageIndex = 12 + ShortCut = 123 + OnClick = mnuResetLocationClick + end + object N6: TMenuItem + Caption = '-' + end + object mnuPopFullscreen: TMenuItem + Caption = 'Fullscreen View' + Hint = 'Show the flame in fullscreen mode' + ImageIndex = 52 + ShortCut = 114 + OnClick = mnuFullScreenClick + end + object N23: TMenuItem + Caption = '-' + end + object mnuScreenShot: TMenuItem + Caption = 'Make a screenshot of the window' + ImageIndex = 16 + OnClick = mnuScreenShotClick + end + object mnuExportBitmap: TMenuItem + Caption = 'Save preview image' + OnClick = mnuExportBitmapClick + end + end + object RedrawTimer: TTimer + Enabled = False + Interval = 50 + OnTimer = RedrawTimerTimer + Left = 24 + Top = 336 + end + object SaveDialog: TSaveDialog + DefaultExt = 'bmp' + Filter = 'Bitmap Files|*.bmp' + Options = [ofOverwritePrompt, ofHideReadOnly, ofEnableSizing] + Left = 104 + Top = 400 + end + object ApplicationEvents: TApplicationEvents + OnActivate = ApplicationEventsActivate + Left = 104 + Top = 456 + end + object UsedThumbnails: TImageList + Height = 128 + Masked = False + Width = 128 + Left = 24 + Top = 280 + end + object ColorDialog: TColorDialog + Options = [cdFullOpen] + Left = 24 + Top = 400 + end + object AutoSaveTimer: TTimer + Enabled = False + OnTimer = AutoSaveTimerTimer + Left = 104 + Top = 334 + end +end diff --git a/Forms/Main.pas b/Forms/Main.pas new file mode 100644 index 0000000..e425288 --- /dev/null +++ b/Forms/Main.pas @@ -0,0 +1,8306 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +//{$D-,L-,O+,Q-,R-,Y-,S-} + +unit Main; + +//{$define VAR_STR} + +interface + +uses + Windows, Forms, Dialogs, Menus, Controls, ComCtrls, + ToolWin, StdCtrls, Classes, Messages, ExtCtrls, ImgList, + Jpeg, SyncObjs, SysUtils, Graphics, Math, + ExtDlgs, AppEvnts, ShellAPI, Registry, Curves, + Global, Xform, XFormMan, ControlPoint, CMap, + RenderThread, RenderingCommon, RenderingInterface, + LibXmlParser, LibXmlComps, Vcl.Imaging.PngImage, XPMan, + StrUtils, LoadTracker, CheckLst, + CommandLine, RegularExpressionsCore, Translation, + RegexHelper, System.ImageList, Vcl.Themes, Vcl.Styles; // AV + +const + PixelCountMax = 32768; + RS_A1 = 0; + RS_DR = 1; + RS_XO = 2; + RS_VO = 3; + + {$ifndef Apo7X64} + randFilename = 'ApophysisAV.rand'; + undoFilename = 'ApophysisAV.undo'; + {$else} + randFilename = 'ApophysisAV_64.rand'; // AV + undoFilename = 'ApophysisAV_64.undo'; // AV + {$endif} + templateFilename = 'ApophysisAV.temp'; + templatePath = '\templates'; + scriptPath = '\scripts'; + +type + TMouseMoveState = (msUsual, msZoomWindow, msZoomOutWindow, msZoomWindowMove, + msZoomOutWindowMove, msDrag, msDragMove, msRotate, msRotateMove, msPitchYaw, msHeight); + +type + TWin32Version = (wvUnknown, wvWin95, wvWin98, wvWinNT, wvWin2000, wvWinXP, + wvWinVista, wvWin7, wvWinFutureFromOuterSpace); + +type + TThumbnailThread = class(TThread) + private + FCount: integer; + class var + FPreviewDensity: double; // AV + FThumbnailSize : integer; // AV: added F to avoid of name conflicts + public + constructor Create; + procedure Execute; override; + destructor Destroy; override; + end; + +type + pRGBTripleArray = ^TRGBTripleArray; + TRGBTripleArray = array[0..PixelCountMax - 1] of TRGBTriple; + + TMainForm = class(TForm) + Buttons: TImageList; + MainMenu: TMainMenu; + MainFile: TMenuItem; + mnuSaveUPR: TMenuItem; + N1: TMenuItem; + mnuRandomBatch: TMenuItem; + FileExitSep: TMenuItem; + mnuExit: TMenuItem; + MainEdit: TMenuItem; + mnuCopyUPR: TMenuItem; + mnuEditor: TMenuItem; + mnuRandom: TMenuItem; + mnuNormalWeights: TMenuItem; + mnuEqualize: TMenuItem; + mnuRWeights: TMenuItem; + mnuOptions: TMenuItem; + MainHelp: TMenuItem; + mnuHelpTopics: TMenuItem; + OpenDialog: TOpenDialog; + ListPopUp: TPopupMenu; + mnuItemDelete: TMenuItem; + mnuListRename: TMenuItem; + DisplayPopup: TPopupMenu; + mnuPopFullscreen: TMenuItem; + RedrawTimer: TTimer; + mnuVar: TMenuItem; + mnuVRandom: TMenuItem; + N3: TMenuItem; + mnuOpen: TMenuItem; + mnuSaveAs: TMenuItem; + N8: TMenuItem; + mnuGrad: TMenuItem; + mnuSmoothGradient: TMenuItem; + mnuView: TMenuItem; + mnuToolbar: TMenuItem; + mnuStatusBar: TMenuItem; + BackPanel: TPanel; + mnuFileContents: TMenuItem; + mnuUndo: TMenuItem; + mnuRedo: TMenuItem; + N5: TMenuItem; + SaveDialog: TSaveDialog; + MainFlame: TMenuItem; + N11: TMenuItem; + mnuAbout: TMenuItem; + mnuFullScreen: TMenuItem; + mnuRender: TMenuItem; + mnuMutate: TMenuItem; + mnuAdjust: TMenuItem; + mnuOpenGradient: TMenuItem; + mnuResetLocation: TMenuItem; + N4: TMenuItem; + N14: TMenuItem; + mnuSaveUndo: TMenuItem; + N2: TMenuItem; + mnuPopResetLocation: TMenuItem; + N6: TMenuItem; + mnuPopUndo: TMenuItem; + N16: TMenuItem; + mnuPopRedo: TMenuItem; + mnuCalculateColors: TMenuItem; + mnuRandomizeColorValues: TMenuItem; + N18: TMenuItem; + N19: TMenuItem; + mnuScript: TMenuItem; + mnuRun: TMenuItem; + mnuEditScript: TMenuItem; + N15: TMenuItem; + mnuStop: TMenuItem; + mnuOpenScript: TMenuItem; + mnuImportGimp: TMenuItem; + N9: TMenuItem; + N10: TMenuItem; + mnuManageFavorites: TMenuItem; + mnuImageSize: TMenuItem; + N13: TMenuItem; + ApplicationEvents: TApplicationEvents; + mnuPaste: TMenuItem; + mnuCopy: TMenuItem; + N20: TMenuItem; + mnuExportFLame: TMenuItem; + mnuFlamepdf: TMenuItem; + mnuSaveAllAs: TMenuItem; + View1: TMenuItem; + mnuRenderAll: TMenuItem; + mnuBuiltinVars: TMenuItem; + mnuPluginVars: TMenuItem; + UsedThumbnails: TImageList; + Image1: TImage; + Splitter: TSplitter; + ListBackPanel: TPanel; + Shape1: TShape; + ListView1: TListView; + cbMain: TCoolBar; + ToolBar: TToolBar; + btNew: TToolButton; + btnOpen: TToolButton; + btnSave: TToolButton; + ToolButton10: TToolButton; + btnRender: TToolButton; + tbRenderAll: TToolButton; + ToolButton9: TToolButton; + btnViewList: TToolButton; + btnViewIcons: TToolButton; + ToolButton2: TToolButton; + btnUndo: TToolButton; + btnRedo: TToolButton; + ToolButton1: TToolButton; + btnReset: TToolButton; + btnFullScreen: TToolButton; + ToolButton3: TToolButton; + tbQualityBox: TComboBoxEx; + New1: TMenuItem; + ColorDialog: TColorDialog; + mnuResetUI: TMenuItem; + ToolButton4: TToolButton; + tbEditor: TToolButton; + tbAdjust: TToolButton; + tbPalette: TToolButton; + tbMutate: TToolButton; + tbImageSize: TToolButton; + tbMessages: TToolButton; + tbOptions: TToolButton; + ToolButton15: TToolButton; + tbShowAlpha: TToolButton; + ToolButton16: TToolButton; + tbEditScript: TToolButton; + btnRunScript: TToolButton; + btnStopScript: TToolButton; + ToolButton18: TToolButton; + tbDrag: TToolButton; + tbRotate: TToolButton; + tbZoomIn: TToolButton; + tbZoomOut: TToolButton; + AutoSaveTimer: TTimer; + Restorelastautosave1: TMenuItem; + tbGuides: TToolButton; + mnuTurnFlameToScript: TMenuItem; + N12: TMenuItem; + mnuReportFlame: TMenuItem; + mnuMessages: TMenuItem; + BottomDock: TPanel; + StatusBar: TStatusBar; + Image: TImage; + pnlLSPFrame: TPanel; + LoadSaveProgress: TProgressBar; + mnuExportChaotica: TMenuItem; + mnuResumeRender: TMenuItem; + mnuManual: TMenuItem; + tbCurves: TToolButton; + mnuCurves: TMenuItem; + N17: TMenuItem; + mnuTrace: TMenuItem; + CalculateWeights: TMenuItem; + FavouriteScripts1: TMenuItem; + Directory1: TMenuItem; + Randomizecolorspeed1: TMenuItem; + Calculatecolorspeed1: TMenuItem; + Changecolordistribution1: TMenuItem; + Changeweightdistribution1: TMenuItem; + ResetColorSpeed: TMenuItem; + mnuApoStyle: TMenuItem; // AV + N7: TMenuItem; + N22: TMenuItem; + AddSymmetry: TMenuItem; + BilateralSym: TMenuItem; + RotationalSym: TMenuItem; + DihedralSym: TMenuItem; + rot2: TMenuItem; + rot3: TMenuItem; + rot4: TMenuItem; + rot5: TMenuItem; + rot6: TMenuItem; + rot8: TMenuItem; + dih2: TMenuItem; + dih3: TMenuItem; + dih4: TMenuItem; + dih5: TMenuItem; + dih6: TMenuItem; + dih8: TMenuItem; + AddTile: TMenuItem; // AV + Square1: TMenuItem; + Rhombic1: TMenuItem; + Hexagonal1: TMenuItem; + ImportFromPNG: TMenuItem; + ToolButton23: TToolButton; + mnuScreenShot: TMenuItem; + N23: TMenuItem; + rot7: TMenuItem; + dih7: TMenuItem; + AddTemplate: TMenuItem; + N21: TMenuItem; + ResetColorValues: TMenuItem; + mnuExportBitmap: TMenuItem; + N24: TMenuItem; + mnuUnflatten: TMenuItem; // AV + mnuFlatten: TMenuItem; + N25: TMenuItem; + SortFlames: TMenuItem; + N26: TMenuItem; + mnuLowQuality: TMenuItem; + mnuMediumQuality: TMenuItem; + mnuHighQuality: TMenuItem; + mnuRefreshThumb: TMenuItem; + EnumerateFlames: TMenuItem; + DownloadPlugins: TMenuItem; + N27: TMenuItem; + mnuRefreshAllThumbs: TMenuItem; // AV + procedure mnuManualClick(Sender: TObject); + procedure mnuReportFlameClick(Sender: TObject); + procedure mnuTurnFlameToScriptClick(Sender: TObject); + procedure tbzoomoutwindowClick(Sender: TObject); + procedure mnuExitClick(Sender: TObject); + procedure mnuSaveUPRClick(Sender: TObject); + procedure ListViewChange(Sender: TObject; Item: TListItem; + Change: TItemChange); + procedure FormCreate(Sender: TObject); + procedure mnuRandomClick(Sender: TObject); + procedure mnuEqualizeClick(Sender: TObject); + procedure mnuEditorClick(Sender: TObject); + procedure mnuRWeightsClick(Sender: TObject); + procedure mnuRandomBatchClick(Sender: TObject); + procedure FormKeyPress(Sender: TObject; var Key: Char); + procedure FormKeyUpDown(Sender: TObject; var Key: Word; + Shift: TShiftState); + procedure mnuOptionsClick(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure mnuHelpTopicsClick(Sender: TObject); + procedure mnuRefreshClick(Sender: TObject); + procedure mnuNormalWeightsClick(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure mnuCopyUPRClick(Sender: TObject); + procedure mnuItemDeleteClick(Sender: TObject); + procedure ListViewEdited(Sender: TObject; Item: TListItem; + var S: string); + procedure mnuListRenameClick(Sender: TObject); + procedure BackPanelResize(Sender: TObject); + procedure mnuNextClick(Sender: TObject); + procedure mnuPreviousClick(Sender: TObject); + procedure RedrawTimerTimer(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure ShowStyledWindows(Sender: TObject); + procedure MainMenuClick(Sender: TObject); + procedure mnuVRandomClick(Sender: TObject); + procedure mnuSaveAsClick(Sender: TObject); + procedure mnuOpenClick(Sender: TObject); + procedure mnuGradClick(Sender: TObject); + procedure mnuSmoothGradientClick(Sender: TObject); + procedure mnuToolbarClick(Sender: TObject); + procedure mnuStatusBarClick(Sender: TObject); + procedure mnuFileContentsClick(Sender: TObject); + procedure mnuUndoClick(Sender: TObject); + procedure mnuRedoClick(Sender: TObject); + procedure Undo; + procedure Redo; + procedure mnuSaveUndoClick(Sender: TObject); // AV: restored and works + procedure mnuExportBitmapClick(Sender: TObject); // AV: to fast save params in PNG + procedure mnuFullScreenClick(Sender: TObject); + procedure mnuRenderClick(Sender: TObject); + procedure mnuMutateClick(Sender: TObject); + procedure mnuAdjustClick(Sender: TObject); + procedure mnuResetLocationClick(Sender: TObject); + procedure mnuAboutClick(Sender: TObject); + procedure mnuOpenGradientClick(Sender: TObject); + procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); + procedure FormActivate(Sender: TObject); + procedure FormDeactivate(Sender: TObject); + procedure mnuCalculateColorsClick(Sender: TObject); + procedure mnuRandomizeColorValuesClick(Sender: TObject); + procedure mnuEditScriptClick(Sender: TObject); + procedure mnuRunClick(Sender: TObject); + procedure mnuOpenScriptClick(Sender: TObject); + procedure mnuStopClick(Sender: TObject); + // procedure mnuImportGimpClick(Sender: TObject); // AV: rudiment from Apo 2.02 + procedure mnuManageFavoritesClick(Sender: TObject); + procedure mnuShowFullClick(Sender: TObject); + procedure mnuImageSizeClick(Sender: TObject); + procedure ApplicationEventsActivate(Sender: TObject); + procedure mnuPasteClick(Sender: TObject); + procedure mnuCopyClick(Sender: TObject); + procedure mnuExportFlameClick(Sender: TObject); + procedure mnuExportChaoticaClick(Sender: TObject); + + procedure ListXmlScannerStartTag(Sender: TObject; TagName: string; + Attributes: TAttrList); + procedure XMLScannerStartTag(Sender: TObject; TagName: string; + Attributes: TAttrList); + procedure XMLScannerEmptyTag(Sender: TObject; TagName: string; + Attributes: TAttrList); + procedure mnuFlamepdfClick(Sender: TObject); + procedure ImageMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure ImageMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure ImageMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure tbzoomwindowClick(Sender: TObject); + procedure tbDragClick(Sender: TObject); + procedure tbRotateClick(Sender: TObject); + procedure mnuSaveAllAsClick(Sender: TObject); + procedure tbQualityBoxKeyPress(Sender: TObject; var Key: Char); + procedure tbQualityBoxSet(Sender: TObject); + procedure ImageDblClick(Sender: TObject); + procedure tbShowAlphaClick(Sender: TObject); + procedure tbShowTraceClick(Sender: TObject); + procedure XmlScannerContent(Sender: TObject; Content: String); + procedure mnuRenderAllClick(Sender: TObject); +{ procedure ListViewChanging(Sender: TObject; Item: TListItem; + Change: TItemChange; var AllowChange: Boolean); } + procedure btnViewIconsClick(Sender: TObject); + procedure btnViewListClick(Sender: TObject); + procedure XmlScannerEndTag(Sender: TObject; TagName: String); + procedure tbMessagesClick(Sender: TObject); + procedure btNewClick(Sender: TObject); + procedure FormResize(Sender: TObject); + procedure mnuResetUIClick(Sender: TObject); + procedure AutoSaveTimerTimer(Sender: TObject); + procedure Restorelastautosave1Click(Sender: TObject); + procedure tbGuidesClick(Sender: TObject); + procedure tbCurvesClick(Sender: TObject); + procedure mnuTraceClick(Sender: TObject); + procedure CalculateWeightsClick(Sender: TObject); + procedure Randomizecolorspeed1Click(Sender: TObject); + procedure Calculatecolorspeed1Click(Sender: TObject); + procedure ResetColorSpeedClick(Sender: TObject); + procedure AddSymmetryClick(Sender: TObject); //AV + procedure AddTileClick(Sender: TObject); // AV + procedure ImportFromPNGClick(Sender: TObject); // AV + procedure mnuScreenShotClick(Sender: TObject); // AV + procedure ExtSysMenu(var Msg: TMessage); message WM_SysCommand; // AV + procedure AddTemplateClick(Sender: TObject); + procedure ResetColorValuesClick(Sender: TObject); + procedure mnuUnflattenClick(Sender: TObject); + procedure mnuFlattenClick(Sender: TObject); + procedure SortFlamesClick(Sender: TObject); + procedure ListViewColumnClick(Sender: TObject; Column: TListColumn); + procedure mnuThumbnailQualityClick(Sender: TObject); + procedure ListPopUpPopup(Sender: TObject); + procedure mnuRefreshThumbClick(Sender: TObject); + procedure EnumerateFlamesClick(Sender: TObject); + procedure ListViewDblClick(Sender: TObject); + procedure DownloadPluginsClick(Sender: TObject); + private + SubstSource: TStringList; + SubstTarget: TStringList; + + Renderer: TRenderThread; + + FMouseMoveState: TMouseMoveState; + FSelectRect, FClickRect: TRect; + DrawSelection: boolean; + FRotateAngle: double; + FClickAngle: double; + FViewImage: TPngObject; + FViewPos, FViewOldPos: TSPoint; + FViewScale: double; + // FClickPitch, FNewPitch: double; + // FClickYaw, FNewYaw: double; + FShiftState: TShiftState; + + // For parsing: + FinalXformLoaded: boolean; + ActiveXformSet: integer; + XMLPaletteFormat: string; + XMLPaletteCount: integer; + + camDragMode, camDragged, camMM: boolean; + camDragPos, camDragOld: TPoint; + camDragValueX, camDragValueY: double; + + oldApo: boolean; // AV: to check relict variations + defKB: HKL; // AV: for non-English users :) + + procedure CreateSubstMap; + procedure InsertStrings; + procedure DrawImageView; + procedure DrawZoomWindow; + procedure DrawRotatelines(Angle: double); + // procedure DrawPitchYawLines(YawAngle: double; PitchAngle:double); + + procedure FillVariantMenu; + procedure VariantMenuClick(Sender: TObject); + + procedure FavoriteClick(Sender: TObject); + procedure ScriptItemClick(Sender: TObject); + + // AV: for Apo GUI themes + procedure CreateStyleList; + procedure StyleItemClick(Sender: TObject); + + procedure HandleThreadCompletion(var Message: TMessage); + message WM_THREAD_COMPLETE; + procedure HandleThreadTermination(var Message: TMessage); + message WM_THREAD_TERMINATE; + + public + { Public declarations } + UndoIndex, UndoMax: integer; + Center: array[0..1] of double; + //MainZoom: double; + StartTime: TDateTime; + CurrentFileName: string; + ParseLoadingBatch : boolean; + SurpressHandleMissingPlugins : boolean; + + VarMenus: array of TMenuItem; + + ListXmlScanner : TEasyXmlScanner; + XmlScanner : TXmlScanner; + + function ReadWithSubst(Attributes: TAttrList; attrname: string): string; + procedure InvokeLoadXML(xmltext:string); + // AV: added 3-rd parameter to be able to discard multiple updates + procedure LoadXMLFlame(filename, name: string; upd: boolean = true); + procedure DisableFavorites; + procedure EnableFavorites; + procedure ParseXML(var cp1: TControlPoint; const params: string; const ignoreErrors : boolean); + function SaveFlame(cp1: TControlPoint; title, filename: string): boolean; + function SaveXMLFlame(const cp1: TControlPoint; title, filename: string): boolean; + procedure DisplayHint(Sender: TObject); + procedure OnProgress(prog: double); + procedure ResizeImage; + procedure DrawPreview; + procedure DrawFlame; + procedure UpdateUndo; + procedure LoadUndoFlame(index: integer; filename: string); + procedure SmoothPalette; + procedure Smoothize(const oldpal: TColorMap; const a, b: byte); + procedure RandomizeCP(var cp1: TControlPoint; alg: integer = 0); + function UPRString(cp1: TControlPoint; Entry: string): string; + function SaveGradient(Gradient, Title, FileName: string): boolean; + function GradientFromPalette(const pal: TColorMap; const title: string): string; + procedure StopThread; + procedure UpdateWindows; + procedure ResetLocation; + procedure RandomBatch; + procedure GetScripts; + function ApplicationOnHelp(Command: Word; Data: Integer; var CallHelp: Boolean): Boolean; + function SystemErrorMessage: string; + function SystemErrorMessage2(errno: cardinal): string; + function RetrieveXML(cp : TControlPoint):string; + procedure ApplyThemedColors; + + // AV: for reading / writing embedded parameters + procedure PasteFlameXML(flameXML: string); + procedure ImportThumbnailPNG(Filename: string); + function LoadXMLFlameTextPNG(FileName: string): string; + + // AV: for updating the list with flame previews + procedure SetThumbnailProperties; + procedure RefreshThumbnail; + procedure UpdateThumbnails; + end; + +procedure ListXML(FileName: string; sel: integer; selname: string = ''); // AV +function EntryExists(En, Fl: string): boolean; +function XMLEntryExists(title, filename: string): boolean; +function DeleteEntry(Entry, FileName: string): boolean; +function CleanIdentifier(ident: string): string; +function CleanUPRTitle(ident: string): string; +function GradientString(c: TColorMap): string; +procedure ListFlames(FileName: string; sel: integer); // AV: outdated, for affine coefs only +procedure ListIFS(FileName: string; sel: integer); // AV: for loading Undo flame files +procedure NormalizeVariations(var cp1: TControlPoint); +function GetWinVersion: TWin32Version; +function LoadXMLFlameText(filename, name: string) : string; +function FindFlameXML(const FlameStr: string; const Title: string) : Integer; // AV + +function FlameInClipboard: boolean; // AV +function RemoveExt(filename: string): string; // AV + +// AV: for making window screenshots +procedure GetFormScreenShot(const AFileName: string); +procedure SaveScreenShot(const AFormName: string); + +var + MainForm: TMainForm; + pname, ptime: String; + //pversion: string; + nxform: integer; + TbBreakWidth: integer; + + MainCp: TControlPoint; + ParseCp: TControlPoint; + MemCp: TControlPoint; + CurrentFlame, FlameString: string; + ThumbnailSize: integer; + AboutToExit: boolean; + GeneratingThumbs: boolean; // AV + + ApophysisSVN: string; //APP_VERSION; + AppVersionString: string; //APP_NAME+'.'+ APP_VERSION; + +implementation + +uses + ClipBrd, Editor, Options, Settings, Template, MissingPlugin, Base64, Chaotica, + FullScreen, FormRender, Mutate, Adjust, Browser, Save, About, CmapData, + ScriptForm, FormFavorites, FormExport, RndFlame, Tracer, Types, SplashForm; + +{$R *.DFM} + +procedure AssignBitmapProperly(var Bitmap:TBitmap; Source:TBitmap); +begin + Bitmap.Dormant; + Bitmap.FreeImage; + Bitmap.Width := 0; + Bitmap.Assign(Source); +end; + +procedure FreeBitmapProperly(var Bitmap:TBitmap); +begin + try + Bitmap.Dormant; + Bitmap.FreeImage; + finally + Bitmap.Free; + end; +end; + +{//////////////// Screenshot utils ////////////////////////} + +procedure GetFormScreenShot(const AFileName: string); // AV +var + ScreenShot: TBitmap; + WindowRect: TRect; +begin + ScreenShot := TBitmap.Create; + try + ScreenShot.PixelFormat := pf32bit; + try + WindowRect := Screen.ActiveForm.BoundsRect; + ScreenShot.Width := WindowRect.Width; + ScreenShot.Height := WindowRect.Height; + BitBlt(ScreenShot.Canvas.Handle, 0, 0, WindowRect.Width, WindowRect.Height, + GetWindowDC(Screen.ActiveForm.Handle), 0, 0, SRCCOPY); + except + ScreenShot := nil; + end; + if ScreenShot <> nil then + ScreenShot.SaveToFile(AFileName); + finally + ScreenShot.Free; + end; +end; + +procedure SaveScreenShot(const AFormName: string); // AV +var + s: string; +begin + if not DirectoryExists(ScreenShotPath) then + begin + CreateDir(AppPath + 'ScreenShots\'); + ScreenShotPath := AppPath + 'ScreenShots\'; + end; + s := ScreenShotPath + AFormName + FormatDateTime(' (MM-dd-yyyy hh-mm-ss)', Now) + '.bmp'; + try + GetFormScreenShot(s); + Application.MessageBox(PChar(Format(TextByKey('common-screenshot-saved'), + [ExtractFileName(s), ExtractFilePath(s)])), PChar('Apophysis AV'), MB_ICONINFORMATION); + except + Application.MessageBox(PChar(TextByKey('common-screenshot-error')), PChar('Apophysis AV'), MB_ICONERROR); + end; +end; + +{//////////////////////////////////////////////////////////////////////////////} + +procedure NormalizeVariations(var cp1: TControlPoint); +var + totvar, v: double; + i, j: integer; +begin + for i := 0 to NXFORMS - 1 do + begin + totvar := 0; + for j := 0 to NRVAR - 1 do + begin + v := cp1.xform[i].GetVariation(j); // AV + if v < 0 then + cp1.xform[i].SetVariation(j, -v); + totvar := totvar + v; + end; + if totVar = 0 then + begin + cp1.xform[i].SetVariation(0, 1) + end + else + for j := 0 to NRVAR - 1 do begin + if totVar <> 0 then + cp1.xform[i].SetVariation(j, cp1.xform[i].GetVariation(j) / totvar); + end; + end; +end; + +function FlameInClipboard: boolean; +var + flamestr: string; + isstart, isend: integer; +begin + { returns true if a flame in clipboard - can be tricked } + result := false; + if Clipboard.HasFormat(CF_TEXT) then + begin + flamestr := Clipboard.AsText; + isstart := Pos('', flamestr); + if (isstart > 0) and (isend > 0) and (isstart < isend) then + Result := true; + end; +end; + +function GetWinVersion: TWin32Version; +{ Returns current version of a host Win32 platform } +begin + Result := wvUnknown; + if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then + if (Win32MajorVersion > 4) or ((Win32MajorVersion = 4) and (Win32MinorVersion > 0)) then + Result := wvWin98 + else + Result := wvWin95 + else + if Win32MajorVersion <= 4 then + Result := wvWinNT + else if Win32MajorVersion = 5 then + begin // AV + if Win32MinorVersion = 0 then + Result := wvWin2000 + else if Win32MinorVersion >= 1 then + Result := wvWinXP + end + else if Win32MajorVersion = 6 then + begin // AV + if Win32MinorVersion = 0 then + Result := wvWinVista + else if Win32MinorVersion >= 1 then + Result := wvWin7 + end + else if Win32MajorVersion >= 7 then + Result := wvWinFutureFromOuterSpace; +end; + +{ ************************************* Help ********************************* } + +procedure ShowHelp(Pt: TPoint; ContextId: Integer); +//var + //Popup: THHPopup; +begin + (* -X- context help not longer supported + FillChar(Popup, SizeOf(Popup), 0); + Popup.cbStruct := SizeOf(Popup); + Popup.hinst := 0; + Popup.idString := ContextId; + Popup.pszText := nil; + GetCursorPos(Pt); + Popup.pt := Pt; + Popup.clrForeGround := TColorRef(-1); + Popup.clrBackground := TColorRef(-1); + Popup.rcMargins := Rect(-1, -1, -1, -1); + Popup.pszFont := ''; + HtmlHelp(0, PChar(AppPath + 'Apophysis7x.chm::/Popups.txt'), HH_DISPLAY_TEXT_POPUP, DWORD(@Popup)); + *) +end; + +procedure TMainForm.ExtSysMenu(var Msg: TMessage); +begin + if Msg.WParam = $C0 then mnuScreenShot.Click; + inherited; +end; + +(* +procedure TMainForm.RebuildListView; +var + i: integer; + item: TListItem; +begin + ListView.Items.Clear; + + /// backup in old lv + for i := 0 to ListView1.Items.Count-1 do begin + item := ListView.Items.Add; + item.Caption := ListView1.Items[i].Caption; + end; + + // rebuild new lv + ListView1.Items.Clear; + + for i := 0 to ListView.Items.Count-1 do begin + item := ListView1.Items.Add; + item.Caption := ListView.Items[i].Caption; + if (not ClassicListMode) then item.ImageIndex := i; + end; + + ListView.Items.Clear; +end; +*) + +procedure TMainForm.InsertStrings; +begin + mnuCopy.Caption := TextByKey('common-copy'); + mnuPaste.Caption := TextByKey('common-paste'); + mnuCopy.Hint := TextByKey('main-menu-edit-copy'); + mnuPaste.Hint := TextByKey('main-menu-edit-paste'); + mnuItemDelete.Caption := TextByKey('common-delete'); + mnuListRename.Caption := TextByKey('common-rename'); + mnuItemDelete.Hint := TextByKey('main-menu-deletehint'); // AV + mnuListRename.Hint := TextByKey('main-menu-renamehint'); // AV + mnuRefreshThumb.Caption := TextByKey('main-menu-updatethumb'); + mnuRefreshAllThumbs.Caption := TextByKey('main-menu-updateallthumbs'); + mnuLowQuality.Caption := TextByKey('common-lowquality'); // AV + mnuMediumQuality.Caption := TextByKey('common-mediumquality'); // AV + mnuHighQuality.Caption := TextByKey('common-highquality'); // AV + mnuUndo.Caption := TextByKey('common-undo'); + mnuPopUndo.Caption := TextByKey('common-undo'); + btnUndo.Hint := TextByKey('main-toolbar-undo'); + mnuUndo.Hint := TextByKey('main-toolbar-undo'); + mnuRedo.Caption := TextByKey('common-redo'); + mnuPopRedo.Caption := TextByKey('common-redo'); + btnRedo.Hint := TextByKey('main-toolbar-redo'); + mnuRedo.Hint := TextByKey('main-toolbar-redo'); + MainFile.Caption := TextByKey('main-menu-file-title'); + New1.Caption := TextByKey('main-menu-file-new'); + New1.Hint := TextByKey('main-toolbar-new'); + mnuTrace.Caption := TextByKey('main-menu-options-tracelog'); + btNew.Hint := TextByKey('main-toolbar-new'); + mnuOpen.Caption := TextByKey('main-menu-file-open'); + btnOpen.Hint := TextByKey('main-toolbar-open'); + mnuOpen.Hint := TextByKey('main-toolbar-open'); + ImportFromPNG.Caption := TextByKey('main-menu-file-loadpng'); + ImportFromPNG.Hint := TextByKey('main-menu-file-loadpnghint'); + mnuScreenShot.Caption := TextByKey('main-menu-screenshot'); + RestoreLastAutosave1.Caption := TextByKey('main-menu-file-restoreautosave'); + RestoreLastAutosave1.Hint := TextByKey('main-menu-file-autosavehint'); + mnuSaveAs.Caption := TextByKey('main-menu-file-saveparams'); + mnuSaveAs.Hint := TextByKey('main-toolbar-saveparams'); + btnSave.Hint := TextByKey('main-toolbar-saveparams'); + mnuSaveAllAs.Caption := TextByKey('main-menu-file-saveallparams'); + mnuSaveAllAs.Hint := TextByKey('main-menu-file-saveallhint'); + mnuSmoothGradient.Caption := TextByKey('main-menu-file-smoothpalette'); + mnuSmoothGradient.Hint := TextByKey('main-menu-file-smoothpalettehint'); + mnuOpenGradient.Caption := TextByKey('main-menu-file-gradientbrowser'); + mnuOpenGradient.Hint := TextByKey('main-menu-file-gradientbrowserhint'); + mnuSaveUPR.Caption := TextByKey('main-menu-file-exportupr'); + mnuExportFlame.Caption := TextByKey('main-menu-file-exportflame'); + mnuExportChaotica.Caption := TextByKey('main-menu-file-exportchaotica'); + // mnuImportGimp.Caption := TextByKey('main-menu-file-importgimp'); + // mnuImportGimp.Hint := TextByKey('main-menu-file-importgimphint'); + mnuRandomBatch.Caption := TextByKey('main-menu-file-randombatch'); + mnuExit.Caption := TextByKey('main-menu-file-exit'); + mnuExit.Hint := TextByKey('main-menu-file-exithint'); + mnuSaveUPR.Hint := TextByKey('main-menu-file-exportuprhint'); + mnuExportFlame.Hint := TextByKey('main-menu-file-exportflamehint'); + mnuExportChaotica.Hint := TextByKey('main-menu-file-exportchaoticahint'); + mnuExportBitmap.Caption := TextByKey('main-menu-saveimage'); // AV + mnuRandomBatch.Hint := TextByKey('main-menu-file-randombatchhint'); + MainEdit.Caption := TextByKey('main-menu-edit-title'); + mnuSaveUndo.Caption := TextByKey('main-menu-edit-saveundo'); + mnuCopyUPR.Caption := TextByKey('main-menu-edit-copyasupr'); + mnuCopyUPR.Hint := TextByKey('main-menu-edit-copyuprhint'); + View1.Caption := TextByKey('main-menu-view-title'); + mnuFullScreen.Caption := TextByKey('main-menu-view-fullscreen'); + mnuPopFullscreen.Caption := TextByKey('main-menu-view-fullscreen'); + btnFullScreen.Hint := TextByKey('main-toolbar-fullscreen'); + mnuFullScreen.Hint := TextByKey('main-toolbar-fullscreen'); + mnuEditor.Caption := TextByKey('main-menu-view-editor'); + mnuEditor.Hint := TextByKey('main-toolbar-editor'); + tbEditor.Hint := TextByKey('main-toolbar-editor'); + mnuAdjust.Caption := TextByKey('main-menu-view-adjustment'); + mnuAdjust.Hint := TextByKey('main-toolbar-adjustment'); + tbAdjust.Hint := TextByKey('main-toolbar-adjustment'); + mnuGrad.Caption := TextByKey('main-menu-view-gradient'); + mnuGrad.Hint := TextByKey('main-toolbar-gradient'); + tbPalette.Hint := TextByKey('main-toolbar-gradient'); + mnuMutate.Hint := TextByKey('main-toolbar-mutation'); + mnuMutate.Caption := TextByKey('main-menu-view-mutation'); + tbMutate.Hint := TextByKey('main-toolbar-mutation'); + mnuImageSize.Caption := TextByKey('main-menu-view-imagesize'); + mnuImageSize.Hint := TextByKey('main-toolbar-imagesize'); + tbImageSize.Hint := TextByKey('main-toolbar-imagesize'); + mnuMessages.Caption := TextByKey('main-menu-view-messages'); + mnuMessages.Hint := TextByKey('main-toolbar-messages'); + tbMessages.Hint := TextByKey('main-toolbar-messages'); + tbCurves.Hint := TextByKey('main-toolbar-curves'); + mnuCurves.Hint := TextByKey('main-toolbar-curves'); + mnuCurves.Caption := TextByKey('main-menu-view-curves'); + MainFlame.Caption := TextByKey('main-menu-flame-title'); + mnuResetLocation.Caption := TextByKey('main-menu-flame-reset'); + mnuPopResetLocation.Caption := TextByKey('main-menu-flame-reset'); + mnuResetLocation.Hint := TextByKey('main-toolbar-reset'); + btnReset.Hint := TextByKey('main-toolbar-reset'); + mnuRandom.Caption := TextByKey('main-menu-flame-randomize'); + mnuRandom.Hint := TextByKey('main-menu-flame-randomizehint'); + mnuRWeights.Caption := TextByKey('main-menu-flame-randomweights'); + mnuRWeights.Hint := TextByKey('main-menu-flame-randomweightshint'); + mnuEqualize.Caption := TextByKey('main-menu-flame-equalweights'); + mnuEqualize.Hint := TextByKey('main-menu-flame-equalweightshint'); + CalculateWeights.Caption := TextByKey('main-menu-flame-calculateweights'); + CalculateWeights.Hint := TextByKey('main-menu-flame-calculateweightshint'); + mnuNormalWeights.Caption := TextByKey('main-menu-flame-normweights'); + mnuNormalWeights.Hint := TextByKey('main-menu-flame-normweightshint'); + mnuCalculateColors.Caption := TextByKey('main-menu-flame-calculatecolors'); + mnuRandomizeColorValues.Caption := TextByKey('main-menu-flame-randomizecolors'); + Calculatecolorspeed1.Caption := TextByKey('main-menu-flame-calculatecolorspeed'); + Randomizecolorspeed1.Caption := TextByKey('main-menu-flame-randomizecolorspeed'); + ResetColorSpeed.Caption := TextByKey('main-menu-flame-resetcolorspeed'); + ResetColorValues.Caption := TextByKey('main-menu-flame-resetcolors'); + ResetColorValues.Hint := TextByKey('main-menu-flame-resetcolorshint'); + mnuCalculateColors.Hint := TextByKey('main-menu-flame-calccolorshint'); + mnuRandomizeColorValues.Hint := TextByKey('main-menu-flame-randcolorshint'); + Calculatecolorspeed1.Hint := TextByKey('main-menu-flame-calccolorspeedhint'); + Randomizecolorspeed1.Hint := TextByKey('main-menu-flame-randcolorspeedhint'); + Resetcolorspeed.Hint := TextByKey('main-menu-flame-resetcolorspeedhint'); + mnuFlatten.Caption := TextByKey('main-menu-flame-flatten'); + mnuFlatten.Hint := TextByKey('main-menu-flame-flattenhint'); + mnuUnflatten.Caption := TextByKey('main-menu-flame-unflatten'); + mnuUnflatten.Hint := TextByKey('main-menu-flame-unflattenhint'); + mnuRender.Caption := TextByKey('main-menu-flame-rendertodisk'); + mnuRender.Hint := TextByKey('main-toolbar-render'); + btnRender.Hint := TextByKey('main-toolbar-render'); + mnuRenderAll.Caption := TextByKey('main-menu-flame-renderallflames'); + mnuRenderAll.Hint := TextByKey('main-toolbar-renderall'); + tbRenderAll.Hint := TextByKey('main-toolbar-renderall'); + mnuReportFlame.Caption := TextByKey('main-menu-flame-generatereport'); + mnuReportFlame.Hint := TextByKey('main-menu-flame-reporthint'); + AddTemplate.Caption := TextByKey('main-menu-flame-template'); + AddTemplate.Hint := TextByKey('main-menu-flame-templatehint'); + mnuVar.Caption := TextByKey('main-menu-variation-title'); + mnuVRandom.Caption := TextByKey('main-menu-variation-random'); + mnuBuiltinVars.Caption := TextByKey('main-menu-variation-builtin'); + mnuPluginVars.Caption := TextByKey('main-menu-variation-plugins'); + mnuVRandom.Hint := TextByKey('main-menu-variation-randomhint'); + mnuBuiltinVars.Hint := TextByKey('main-menu-variation-builtinhint'); + mnuPluginVars.Hint := TextByKey('main-menu-variation-pluginshint'); + mnuScript.Caption := TextByKey('main-menu-script-title'); + mnuRun.Caption := TextByKey('main-menu-script-run'); + mnuRun.Hint := TextByKey('main-toolbar-runscript'); + btnRunScript.Hint := TextByKey('main-toolbar-runscript'); + mnuStop.Caption := TextByKey('main-menu-script-stop'); + mnuStop.Hint := TextByKey('main-toolbar-stopscript'); + btnStopScript.Hint := TextByKey('main-toolbar-stopscript'); + mnuOpenScript.Caption := TextByKey('main-menu-script-open'); + mnuOpenScript.Hint := TextByKey('main-menu-script-openhint'); + mnuEditScript.Caption := TextByKey('main-menu-script-edit'); + mnuEditScript.Hint := TextByKey('main-toolbar-editscript'); + tbEditScript.Hint := TextByKey('main-toolbar-editscript'); + mnuManageFavorites.Caption := TextByKey('main-menu-script-managefaves'); + mnuTurnFlameToScript.Caption := TextByKey('main-menu-script-flametoscript'); + mnuManageFavorites.Hint := TextByKey('main-menu-script-managefaveshint'); + mnuTurnFlameToScript.Hint := TextByKey('main-menu-script-flametoscripthint'); + FavouriteScripts1.Caption := TextByKey('favscripts-title'); + FavouriteScripts1.Hint := TextByKey('favscripts-hint'); + mnuView.Caption := TextByKey('main-menu-options-title'); + Directory1.Caption := IfThen(FavouriteScripts1.Enabled, + TextByKey('main-menu-script-more'), TextByKey('main-menu-script-directory')); + Directory1.Hint := TextByKey('main-menu-script-directoryhint'); + mnuToolbar.Caption := TextByKey('main-menu-options-togglemaintoolbar'); + mnuStatusBar.Caption := TextByKey('main-menu-options-togglestatusbar'); + mnuFileContents.Caption := TextByKey('main-menu-options-togglefilelist'); + mnuResetUI.Caption := TextByKey('main-menu-options-resetfilelistwidth'); + mnuResetUI.Hint := TextByKey('main-menu-options-resetwidthhint'); + SortFlames.Caption := TextByKey('main-menu-options-sortflames'); + EnumerateFlames.Caption := TextByKey('main-menu-options-enumflames'); + mnuTrace.Hint := TextByKey('main-menu-options-traceloghint'); + mnuOptions.Caption := TextByKey('main-menu-options-showoptions'); + mnuOptions.Hint := TextByKey('main-toolbar-options'); + tbOptions.Hint := TextByKey('main-toolbar-options'); + MainHelp.Caption := TextByKey('main-menu-help-title'); + mnuHelpTopics.Caption := TextByKey('main-menu-help-contents'); + mnuFlamePDF.Caption := TextByKey('main-menu-help-aboutalgorithm'); + mnuAbout.Caption := TextByKey('main-menu-help-aboutapophysis'); + mnuHelpTopics.Hint := TextByKey('main-menu-help-contentshint'); + mnuFlamePDF.Hint := TextByKey('main-menu-help-aboutalgorithmhint'); + mnuAbout.Hint := TextByKey('main-menu-help-aboutapophysishint'); + btnViewList.Hint := TextByKey('main-toolbar-listviewmode-classic'); + btnViewIcons.Hint := TextByKey('main-toolbar-listviewmode-icons'); + tbShowAlpha.Hint := TextByKey('main-toolbar-togglealpha'); + tbGuides.Hint := TextByKey('main-toolbar-toggleguides'); + tbQualityBox.Hint := TextByKey('main-toolbar-quality'); + tbDrag.Hint := TextByKey('main-toolbar-modemove'); + tbRotate.Hint := TextByKey('main-toolbar-moderotate'); + tbZoomIn.Hint := TextByKey('main-toolbar-modezoomin'); + tbZoomOut.Hint := TextByKey('main-toolbar-modezoomout'); + ListView1.Columns[0].Caption := TextByKey('save-name'); + mnuResumeRender.Caption := TextByKey('main-menu-flame-resumeunfinished'); + mnuApoStyle.Caption := TextByKey('main-menu-options-apouistyle'); + mnuApoStyle.Hint := TextByKey('main-menu-options-apouistylehint'); + mnuManual.Caption := TextByKey('main-menu-help-ifstheory'); + mnuManual.Hint := TextByKey('main-menu-help-ifstheoryhint'); // AV + DownloadPlugins.Caption := TextByKey('main-menu-help-pluginlink'); // AV + Changeweightdistribution1.Caption := TextByKey('main-menu-flame-changeweights'); + Changecolordistribution1.Caption := TextByKey('main-menu-flame-changecolors'); + Hexagonal1.Caption := TextByKey('main-menu-flame-hextile'); + Rhombic1.Caption := TextByKey('main-menu-flame-rhombustile'); + Square1.Caption := TextByKey('main-menu-flame-squaretile'); + AddTile.Caption := TextByKey('main-menu-flame-addtile'); + AddSymmetry.Caption := TextByKey('main-menu-flame-addsymmetry'); + BilateralSym.Caption := TextByKey('options-tab-random-type-bilateral'); + RotationalSym.Caption := TextByKey('options-tab-random-type-rotational') + TextByKey('main-menu-flame-symorder'); + DihedralSym.Caption := TextByKey('options-tab-random-type-dihedral') + TextByKey('main-menu-flame-symorder'); +end; + +procedure TMainForm.InvokeLoadXML(xmltext: string); +begin + ParseXML(MainCP, PCHAR(xmltext), false); +end; + +function TMainForm.ApplicationOnHelp(Command: Word; Data: Integer; var CallHelp: Boolean): Boolean; +var + Pos: TPoint; +begin + Pos.x := 0; + Pos.y := 0; + + CallHelp := False; + Result := True; + case Command of + HELP_SETPOPUP_POS: Pos := SmallPointToPoint(TSmallPoint(Data)); + HELP_CONTEXTPOPUP: ShowHelp(Pos, Data); + else Result := False; + end; +end; + +procedure TMainForm.ApplyThemedColors; // AV +var + AStyle: TCustomStyleServices; + MenuC1, MenuC2: TColor; + mb: TMenuBreak; + i: integer; +begin + AStyle := TStyleManager.ActiveStyle; + CurrentStyle := AStyle.Name; + + BrightColor := AStyle.GetSystemColor(clHighlight); + WinColor := AStyle.GetSystemColor(clWindow); + TextColor := AStyle.GetSystemColor(clWindowText); + MidColor := MiddleColor(BrightColor, WinColor); + + AStyle.GetElementColor(AStyle.GetElementDetails(tmPopupItemNormal), + ecTextColor, MenuC1); + AStyle.GetElementColor(AStyle.GetElementDetails(tmMenuBarItemNormal), + ecTextColor, MenuC2); + + IsLightMenu := (MenuC1 > $00BEBEBE); + if IsLightMenu then + mnuEditor.ImageIndex := 75 + else + mnuEditor.ImageIndex := 19; + + if CurrentStyle <> 'Obsidian' then + IsLightMenu := IsLightMenu or (MenuC2 > $00BEBEBE); + if IsLightMenu then + tbEditor.ImageIndex := 75 + else + tbEditor.ImageIndex := 19; + + IsDarkTheme := (CurrentStyle = 'TabletDark') or (CurrentStyle = 'Auric') + or (CurrentStyle = 'Cobalt XEMedia') or (CurrentStyle = 'Onyx Blue') + or (CurrentStyle = 'Ruby Graphite') or (CurrentStyle = 'Golden Graphite'); + + i := 0; + if (CurrentStyle = 'Windows') then mb := mbNone else mb := mbBreak; + while i < length(VarMenus) do + begin + VarMenus[i].Break := mb; + inc(i, 30); + end; +end; + +{ **************************************************************************** } + +procedure TMainForm.StopThread; +begin + RedrawTimer.Enabled := False; + if Assigned(Renderer) then begin + assert(Renderer.Suspended = false); + Renderer.Terminate; + Renderer.WaitFor; + end; +end; + +(* +// AV: how old are they? Maybe since Apo 1.0? :) + +procedure EqualizeVars(const x: integer); +var + i: integer; +begin + for i := 0 to Transforms - 1 do + MainCp.xform[x].SetVariation(i, 1.0 / NRVAR); +end; + +procedure NormalVars(const x: integer); +var + i: integer; + td: double; +begin + td := 0.0; + for i := 0 to 6 do + td := td + Maincp.xform[x].GetVariation(i); + if (td < 0.001) then + EqualizeVars(x) + else + for i := 0 to 6 do + MainCp.xform[x].SetVariation(i, MainCp.xform[x].GetVariation(i) / td); +end; +*) + +procedure RandomVariation(cp: TControlPoint); +{ Randomise variation parameters } +var + a, b, i, j: integer; +begin + inc(MainSeed); + RandSeed := MainSeed; + for i := 0 to cp.NumXForms - 1 do + begin + for j := 0 to NRVAR - 1 do + cp.xform[i].SetVariation(j, 0); + repeat + a := random(NRVAR); + until Variations[a]; + repeat + b := random(NRVAR); + until Variations[b]; + if (a = b) then + begin + cp.xform[i].SetVariation(a, 1); + end + else + begin + cp.xform[i].SetVariation(a, random); + cp.xform[i].SetVariation(b, 1 - cp.xform[i].GetVariation(a)); + end; + end; +end; + +procedure SetVariation(cp: TControlPoint); +{ Set the current Variation } +var + i, j: integer; +begin + if Variation = vRandom then + begin + RandomVariation(cp); + end + else + for i := 0 to cp.NumXForms - 1 do + begin + for j := 0 to NRVAR - 1 do + cp.xform[i].SetVariation(j, 0); + cp.xform[i].SetVariation(integer(Variation), 1); + end; +end; + +function FindFlameXML(const FlameStr: string; const Title: string) : Integer; +var + i: integer; + FlameStart: string; +begin + Result := 0; + FlameStart := ' '' then + FlameStart := ' '' then + begin + i := Pos(FlameStart, Lowercase(FlameStr)); + while i > 0 do + if PosEx(' i then + begin + Result := i; + break; + end; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// + +procedure TMainForm.RandomizeColorSpeed1Click(Sender: TObject); +var + i: integer; +begin + inc(MainSeed); + RandSeed := MainSeed; + StopThread; + UpdateUndo; + for i := 0 to Transforms - 1 do + maincp.xform[i].symmetry := 2 * random - 1; + RedrawTimer.Enabled := True; + UpdateWindows; +end; + +procedure TMainForm.RandomizeCP(var cp1: TControlPoint; alg: integer = 0); +var + sourceCP: TControlPoint; +begin + if assigned(MainCP) then + sourceCP := MainCP.Clone + else + SourceCP := nil; + + if assigned(cp1) then begin + cp1.Free; + cp1 := nil; + end; + cp1 := RandomFlame(sourceCP, alg); + + if assigned(sourceCP) then + sourceCP.Free; +end; + +function TMainForm.GradientFromPalette(const pal: TColorMap; const title: string): string; +var + c, i, j: integer; + strings: TStringList; +begin + strings := TStringList.Create; + try + strings.add('gradient:'); + strings.add(' title="' + CleanUPRTitle(title) + '" smooth=no'); + for i := 0 to 255 do + begin + j := round(i * (399 / 255)); + c := pal[i][2] shl 16 + pal[i][1] shl 8 + pal[i][0]; + strings.Add(' index=' + IntToStr(j) + ' color=' + intToStr(c)); + end; + result := strings.text; + finally + strings.free; + end; +end; + +function CleanIdentifier(ident: string): string; +{ Strips unwanted characters from an identifier} +var + i: integer; +begin + for i := 0 to Length(ident) do + begin + if ident[i] = #32 then + ident[i] := '_' + else if ident[i] = '}' then + ident[i] := '_' + else if ident[i] = '{' then + ident[i] := '_'; + end; + Result := ident; +end; + +procedure TMainForm.OnProgress(prog: double); +var + Elapsed, Remaining: TDateTime; + IntProg: Integer; +begin + IntProg := (round(prog * 100)); + LoadSaveProgress.Position := IntProg; + if (IntProg = 100) then LoadSaveProgress.Position := 0; + Elapsed := Now - StartTime; + StatusBar.Panels[1].Text := Format(TextByKey('render-status-elapsed') + ' %2.2d:%2.2d:%2.2d.%2.2d', + [Trunc(Elapsed * 24), + Trunc((Elapsed * 24 - Trunc(Elapsed * 24)) * 60), + Trunc((Elapsed * 24 * 60 - Trunc(Elapsed * 24 * 60)) * 60), + Trunc((Elapsed * 24 * 60 * 60 - Trunc(Elapsed * 24 * 60 * 60)) * 100)]); + if prog > 0 then + Remaining := Elapsed/prog - Elapsed + else + Remaining := 0; + + StatusBar.Panels[2].Text := Format(TextByKey('render-status-remaining') + ' %2.2d:%2.2d:%2.2d.%2.2d', + [Trunc(Remaining * 24), + Trunc((Remaining * 24 - Trunc(Remaining * 24)) * 60), + Trunc((Remaining * 24 * 60 - Trunc(Remaining * 24 * 60)) * 60), + Trunc((Remaining * 24 * 60 * 60 - Trunc(Remaining * 24 * 60 * 60)) * 100)]); + StatusBar.Panels[3].Text := MainCp.name; + Application.ProcessMessages; +end; + +procedure TMainForm.UpdateUndo; +begin + MainCp.FillUsedPlugins; + SaveFlame(MainCp, Format('%.4d-', [UndoIndex]) + MainCp.name, + AppPath + undoFilename); + Inc(UndoIndex); + UndoMax := UndoIndex; //Inc(UndoMax); + mnuSaveUndo.Enabled := true; + mnuUndo.Enabled := True; + mnuPopUndo.Enabled := True; + mnuRedo.Enabled := false; + mnuPopRedo.Enabled := false; + btnUndo.enabled := true; + btnRedo.Enabled := false; + EditForm.mnuUndo.Enabled := True; + EditForm.mnuRedo.Enabled := false; + EditForm.tbUndo.enabled := true; + EditForm.tbRedo.enabled := false; + AdjustForm.btnUndo.enabled := true; + AdjustForm.btnRedo.enabled := false; +end; + +function GradientEntries(gFilename: string): string; +var + i, p: integer; + Title: string; + FileStrings: TStringList; + NewStrings: TStringList; +begin + FileStrings := TStringList.Create; + NewStrings := TStringList.Create; + NewStrings.Text := ''; + FileStrings.LoadFromFile(gFilename); + try + if (Pos('{', FileStrings.Text) <> 0) then + begin + for i := 0 to FileStrings.Count - 1 do + begin + p := Pos('{', FileStrings[i]); + if (p <> 0) then + begin + Title := Trim(Copy(FileStrings[i], 1, p - 1)); + if (Title <> '') and (LowerCase(Title) <> 'comment') then + begin { Otherwise bad format } + NewStrings.Add(Title); + end; + end; + end; + GradientEntries := NewStrings.Text; + end; + finally + FileStrings.Free; + NewStrings.Free; + end; +end; + +{ ********************************* File ************************************* } + +function EntryExists(En, Fl: string): boolean; +{ Searches for existing identifier in parameter files } +var + FStrings: TStringList; + i: integer; +begin + Result := False; + if FileExists(Fl) then + begin + FStrings := TStringList.Create; + try + FStrings.LoadFromFile(Fl); + for i := 0 to FStrings.Count - 1 do + if Pos(LowerCase(En) + ' {', Lowercase(FStrings[i])) <> 0 then + Result := True; + finally + FStrings.Free; + end + end + else + Result := False; +end; + +function CleanEntry(ident: string): string; +{ Strips unwanted characters from an identifier} +var + i: integer; +begin + for i := 1 to Length(ident) do + begin + if ident[i] = #32 then + ident[i] := '_' + else if ident[i] = '}' then + ident[i] := '_' + else if ident[i] = '{' then + ident[i] := '_'; + end; + Result := ident; +end; + +function CleanXMLName(ident: string): string; +var + i: integer; +begin + for i := 1 to Length(ident) do + begin + if ident[i] = '*' then + ident[i] := '_' + else if ident[i] = '"' then + ident[i] := #39; + end; + Result := ident; +end; + + +function CleanUPRTitle(ident: string): string; +{ Strips braces but leave spaces } +var + i: integer; +begin + for i := 1 to Length(ident) do + begin + if ident[i] = '}' then + ident[i] := '_' + else if ident[i] = '{' then + ident[i] := '_'; + end; + Result := ident; +end; + +function DeleteEntry(Entry, FileName: string): boolean; +{ Deletes an entry from a multi-entry file } +var + Strings: TStringList; + p, i: integer; +begin + Result := True; + Strings := TStringList.Create; + try + i := 0; + Strings.LoadFromFile(FileName); + while Pos(Entry + ' ', Trim(Strings[i])) <> 1 do + begin + inc(i); + end; + repeat + p := Pos('}', Strings[i]); + Strings.Delete(i); + until p <> 0; + if (i < Strings.Count) and (Trim(Strings[i]) = '') then Strings.Delete(i); + Strings.SaveToFile(FileName); + finally + Strings.Free; + end; +end; + +function SaveUPR(Entry, FileName: string): boolean; +{ Saves UF parameter to end of file } +var + UPRFile: TextFile; +begin + Result := True; + try + AssignFile(UPRFile, FileName); + if FileExists(FileName) then + begin + if EntryExists(Entry, FileName) then DeleteEntry(Entry, FileName); + Append(UPRFile); + end + else + ReWrite(UPRFile); + WriteLn(UPRFile, MainForm.UPRString(MainCp, Entry)); + CloseFile(UPRFile); + except on E: EInOutError do + begin + Application.MessageBox(PChar(Format(TextByKey('common-genericsavefailure'), [FileName])), 'Apophysis', 16); + Result := False; + end; + end; +end; + +function IFSToString(cp: TControlPoint; Title: string): string; +{ Creates a string containing a formated IFS parameter set } +var + i: integer; + a, b, c, d, e, f, p: double; + Strings: TStringList; +begin + Strings := TStringList.Create; + try + Strings.Add(CleanEntry(Title) + ' {'); + for i := 0 to Transforms - 1 do + begin + a := cp.xform[i].c[0][0]; + b := cp.xform[i].c[0][1]; + c := cp.xform[i].c[1][0]; + d := cp.xform[i].c[1][1]; + e := cp.xform[i].c[2][0]; + f := cp.xform[i].c[2][1]; + p := cp.xform[i].density; + Strings.Add(Format('%.6g %.6g %.6g %.6g %.6g %.6g %.6g', + [a, b, c, d, e, f, p])); + end; + Strings.Add('}'); + IFSToString := Strings.Text; + finally + Strings.Free; + end; +end; + +function GetTitle(str: string): string; +var + p: integer; +begin + str := Trim(str); + p := Pos(' ', str); + GetTitle := Trim(Copy(str, 1, p)); +end; + +function GetComment(str: string): string; +{ Extracts comment form line of IFS file } +var + p: integer; +begin + str := Trim(str); + p := Pos(';', str); + if p <> 0 then + GetComment := Trim(Copy(str, p + 1, Length(str) - p)) + else + GetComment := ''; +end; + +function GetParameters(str: string; var a, b, c, d, e, f, p: double): boolean; +var + Tokens: TStringList; +begin + GetParameters := False; + Tokens := TStringList.Create; + try + try + GetTokens(str, tokens); + if Tokens.Count >= 7 then {enough tokens} + begin + a := StrToFloat(Tokens[0]); + b := StrToFloat(Tokens[1]); + c := StrToFloat(Tokens[2]); + d := StrToFloat(Tokens[3]); + e := StrToFloat(Tokens[4]); + f := StrToFloat(Tokens[5]); + p := StrToFloat(Tokens[6]); + Result := True; + end; + except on E: EConvertError do + begin + Result := False + end; + end; + finally + Tokens.Free; + end; +end; + +function StringToIFS(strng: string): boolean; +{ Loads an IFS parameter set from string} +var + Strings: TStringList; + Comments: TStringList; + i, sTransforms: integer; + cmnt, sTitle: string; + a, b, c, d: double; + e, f, p: double; +begin + MainCp.clear; + StringToIFS := True; + sTransforms := 0; + Strings := TStringList.Create; + Comments := TStringList.Create; + try + try + Strings.Text := strng; + if Pos('}', Strings.Text) = 0 then + raise EFormatInvalid.Create('No closing brace'); + if Pos('{', Strings[0]) = 0 then + raise EFormatInvalid.Create('No opening brace.'); + {To Do ... !!!!} + sTitle := GetTitle(Strings[0]); + if sTitle = '' then raise EFormatInvalid.Create('No identifier.'); + cmnt := GetComment(Strings[0]); + if cmnt <> '' then Comments.Add(cmnt); + i := 1; + try + repeat + cmnt := GetComment(Strings[i]); + if cmnt <> '' then Comments.Add(cmnt); + if (Pos(';', Trim(Strings[i])) <> 1) and (Trim(Strings[i]) <> '') then + if GetParameters(Strings[i], a, b, c, d, e, f, p) then + begin + MainCp.xform[sTransforms].c[0][0] := a; + MainCp.xform[sTransforms].c[0][1] := c; + MainCp.xform[sTransforms].c[1][0] := b; + MainCp.xform[sTransforms].c[1][1] := d; + MainCp.xform[sTransforms].c[2][0] := e; + MainCp.xform[sTransforms].c[2][1] := f; + MainCp.xform[sTransforms].density := p; + inc(sTransforms); + end + else + EFormatInvalid.Create('Insufficient parameters.'); + inc(i); + until (Pos('}', Strings[i]) <> 0) or (sTransforms = NXFORMS); + except on E: EMathError do + end; + if sTransforms < 2 then + raise EFormatInvalid.Create('Insufficient parameters.'); + MainCp.name := sTitle; + Transforms := sTransforms; + for i := 1 to Transforms - 1 do + MainCp.xform[i].color := 0; + MainCp.xform[0].color := 1; + + except on E: EFormatInvalid do + begin + Application.MessageBox(PChar(TextByKey('common-invalidformat')), PChar('Apophysis'), 16); + end; + end; + finally + Strings.Free; + Comments.Free; + end; +end; + + +function SaveIFS(cp: TControlPoint; Title, FileName: string): boolean; +{ Saves IFS parameters to end of file } +var + a, b, c: double; + d, e, f, p: double; + m: integer; + IFile: TextFile; +begin + Result := True; + try + AssignFile(IFile, FileName); + if FileExists(FileName) then + begin + if EntryExists(Title, FileName) then DeleteEntry(Title, FileName); + Append(IFile); + end + else + ReWrite(IFile); + WriteLn(IFile, Title + ' {'); + for m := 0 to Transforms - 1 do + begin + a := cp.xform[m].c[0][0]; + c := cp.xform[m].c[0][1]; + b := cp.xform[m].c[1][0]; + d := cp.xform[m].c[1][1]; + e := cp.xform[m].c[2][0]; + f := cp.xform[m].c[2][1]; + p := cp.xform[m].density; + Write(IFile, Format('%.6g %.6g %.6g %.6g %.6g %.6g %.6g', + [a, b, c, d, e, f, p])); + WriteLn(IFile, ''); + end; + WriteLn(IFile, '}'); + WriteLn(IFile, ' '); + CloseFile(IFile); + except on E: EInOutError do + begin + Application.MessageBox(PChar(Format(TextByKey('common-genericsavefailure'), [FileName])), 'Apophysis', 16); + Result := False; + end; + end; +end; + +function TMainForm.SaveFlame(cp1: TControlPoint; title, filename: string): boolean; +{ Saves Flame parameters to end of file } +var + IFile: TextFile; + sl: TStringList; + i: integer; +begin + Result := True; + try + AssignFile(IFile, filename); + if FileExists(filename) then + begin + if EntryExists(title, filename) then DeleteEntry(title, fileName); + Append(IFile); + end + else ReWrite(IFile); + + sl := TStringList.Create; + try + cp1.SaveToStringList(sl); + WriteLn(IFile, title + ' {'); + write(IFile, sl.Text); + WriteLn(IFile, 'palette:'); + for i := 0 to 255 do + begin + WriteLn(IFile, IntToStr(cp1.cmap[i][0]) + ' ' + + IntToStr(cp1.cmap[i][1]) + ' ' + + IntToStr(cp1.cmap[i][2])) + end; + WriteLn(IFile, ' }'); + finally + sl.free + end; + WriteLn(IFile, ' '); + CloseFile(IFile); + + except on EInOutError do + begin + Application.MessageBox(PChar(Format(TextByKey('common-genericsavefailure'), [FileName])), 'Apophysis', 16); + Result := False; + end; + end; +end; + +function ColorToXmlCompact(cp1: TControlPoint): string; +var + i: integer; +begin + Result := ' '; + for i := 0 to 255 do begin + if ((i and 7) = 0) then Result := Result + #13#10 + ' '; + Result := Result + IntToHex(cp1.cmap[i, 0],2) + + IntToHex(cp1.cmap[i, 1],2) + + IntToHex(cp1.cmap[i, 2],2); + end; + Result := Result + #13#10 + ' '; +end; + + +function ColorToXml(cp1: TControlPoint): string; +var + i: integer; +begin + Result := ''; + for i := 0 to 255 do begin + Result := Result + ' ' + #13#10; + end; +end; + + +function FlameToXMLAS(const cp1: TControlPoint; title: string; exporting: boolean): string; +var + t, i{, j}: integer; + FileList: TStringList; + x, y: double; + parameters: string; + curves, str: string; +begin + FileList := TStringList.create; + x := cp1.center[0]; + y := cp1.center[1]; + +// if cp1.cmapindex >= 0 then pal := pal + 'gradient="' + IntToStr(cp1.cmapindex) + '" '; + + try + parameters := 'version="' + AppVersionString + '" '; + if cp1.time <> 0 then + parameters := parameters + format('time="%g" ', [cp1.time]); + + parameters := parameters + + 'size="' + IntToStr(cp1.width) + ' ' + IntToStr(cp1.height) + + format('" center="%g %g" ', [x, y]) + + format('scale="%g" ', [cp1.pixels_per_unit]); + + if cp1.FAngle <> 0 then + parameters := parameters + format('angle="%g" ', [cp1.FAngle]) + + format('rotate="%g" ', [-180 * cp1.FAngle/Pi]); + if cp1.zoom <> 0 then + parameters := parameters + format('zoom="%g" ', [cp1.zoom]); + +// 3d + if cp1.cameraPitch <> 0 then + parameters := parameters + format('cam_pitch="%g" ', [cp1.cameraPitch]); + if cp1.cameraYaw <> 0 then + parameters := parameters + format('cam_yaw="%g" ', [cp1.cameraYaw]); + if cp1.cameraRoll <> 0 then + parameters := parameters + format('cam_roll="%g" ', [cp1.cameraRoll]); + if cp1.cameraPersp <> 0 then + parameters := parameters + format('cam_perspective="%g" ', [cp1.cameraPersp]); + if cp1.cameraZpos <> 0 then + parameters := parameters + format('cam_zpos="%g" ', [cp1.cameraZpos]); + if cp1.cameraDOF <> 0 then + parameters := parameters + format('cam_dof="%g" ', [cp1.cameraDOF]); +// + parameters := parameters + format( + 'oversample="%d" filter="%g" quality="%g" ', + [cp1.spatial_oversample, + cp1.spatial_filter_radius, + cp1.sample_density] + ); + if cp1.nbatches <> 1 then parameters := parameters + 'batches="' + IntToStr(cp1.nbatches) + '" '; + if cp1.hue_rotation <> 1 then parameters := parameters + format('hue="%g" ', [cp1.hue_rotation]); // AV + + parameters := parameters + + format('background="%g %g %g" ', [cp1.background[0] / 255, cp1.background[1] / 255, cp1.background[2] / 255]) + + format('brightness="%g" ', [cp1.brightness]) + + format('gamma="%g" ', [cp1.gamma]); + + if cp1.contrast <> 1 then // AV + parameters := parameters + format('contrast="%g" ', [cp1.contrast]); + + if cp1.vibrancy <> 1 then + parameters := parameters + format('vibrancy="%g" ', [cp1.vibrancy]); + + if cp1.gamma_threshold <> 0 then + parameters := parameters + format('gamma_threshold="%g" ', [cp1.gamma_threshold]); + + if cp1.soloXform >= 0 then + parameters := parameters + format('soloxform="%d" ', [cp1.soloXform]); + + parameters := parameters + + format('estimator_radius="%g" ', [cp1.estimator]) + + format('estimator_minimum="%g" ', [cp1.estimator_min]) + + format('estimator_curve="%g" ', [cp1.estimator_curve]); + if (cp1.enable_de) then + parameters := parameters + ('enable_de="1" ') + else parameters := parameters + ('enable_de="0" '); + + str := ''; + for i := 0 to cp1.used_plugins.Count-1 do begin + str := str + cp1.used_plugins[i]; + if (i = cp1.used_plugins.Count-1) then break; + str := str + ' '; + end; + parameters := parameters + format('plugins="%s" new_linear="1" ', [str]); + + for i := 0 to 3 do + begin + curves := curves + FloatToStr(cp1.curvePoints[i][0].x) + ' '; + curves := curves + FloatToStr(cp1.curvePoints[i][0].y) + ' '; + curves := curves + FloatToStr(cp1.curveWeights[i][0]) + ' '; + + curves := curves + FloatToStr(cp1.curvePoints[i][1].x) + ' '; + curves := curves + FloatToStr(cp1.curvePoints[i][1].y) + ' '; + curves := curves + FloatToStr(cp1.curveWeights[i][1]) + ' '; + + curves := curves + FloatToStr(cp1.curvePoints[i][2].x) + ' '; + curves := curves + FloatToStr(cp1.curvePoints[i][2].y) + ' '; + curves := curves + FloatToStr(cp1.curveWeights[i][2]) + ' '; + + curves := curves + FloatToStr(cp1.curvePoints[i][3].x) + ' '; + curves := curves + FloatToStr(cp1.curvePoints[i][3].y) + ' '; + curves := curves + FloatToStr(cp1.curveWeights[i][3]) + ' '; + end; + + curves := trim(curves); + parameters := parameters + format('curves="%s" ', [curves]); + + FileList.Add(''); + { Write transform parameters } + t := cp1.NumXForms; + for i := 0 to t - 1 do + FileList.Add(cp1.xform[i].ToXMLString); + if cp1.HasFinalXForm then + begin + // 'enabled' flag disabled in this release + FileList.Add(cp1.xform[t].FinalToXMLString(cp1.finalXformEnabled)); + end; + + { Write palette data } + if exporting or OldPaletteFormat then + FileList.Add(ColorToXml(cp1)) + else + FileList.Add(ColorToXmlCompact(cp1)); + + FileList.Add(''); + result := FileList.text; + finally + FileList.free + end; +end; + +/////////// AV: working with embedded PNG-parameters //////////////////////// + +procedure TMainForm.ImportFromPNGClick(Sender: TObject); +begin + OpenDialog.Title := TextByKey('common-open-apoimage'); + OpenDialog.Filter := TextByKey('common-filter-png') + ' |*.png'; + OpenDialog.InitialDir := ParamFolder; + OpenDialog.FileName := ''; + if OpenDialog.Execute then + ImportThumbnailPNG(OpenDialog.FileName); +end; + +procedure TMainForm.ImportThumbnailPNG(FileName: string); +var + flameXML: string; +begin + flameXML := MainForm.LoadXMLFlameTextPNG(FileName); + if flameXML <> '' then + begin + try + PasteFlameXML(flameXML); + except + Application.MessageBox(PChar(Format(TextByKey('common-openpngerror1'), + [ExtractFileName(FileName)])), PChar('Apophysis AV'), MB_ICONWARNING or MB_OK); + end; + end; +end; + +function TMainForm.LoadXMLFlameTextPNG(FileName: string): string; +var + PngObject: TPNGObject; + ChunkList: TPngList; + TextChunk: TChunkTEXT; + flameXML: string; + label loadedFlame; +begin + Result := ''; + PngObject := TPngObject.Create; + try + PngObject.LoadFromFile(FileName); + ChunkList := PngObject.Chunks; + if ChunkList <> nil then + begin + TextChunk := ChunkList.FindChunk(TChunkTEXT) as TChunkTEXT; + // iterate through text chunks until 'ApoFlame' keyword is found + while TextChunk <> nil do + begin + if TextChunk.Keyword = 'ApoFlame' then + begin + if FindFlameXML(String(TextChunk.Text), '') > 0 then + begin + Result := String(TextChunk.Text); + goto loadedFlame; + end; + break; + end else + ChunkList.RemoveChunk(TextChunk); + end; + Application.MessageBox(PChar(Format(TextByKey('common-openpngerror2'), + [ExtractFileName(FileName)])), PChar('Apophysis AV'), MB_ICONWARNING or MB_OK); + loadedFlame: + end; + except + Application.MessageBox(PChar(Format(TextByKey('common-openpngerror3'), + [ExtractFileName(FileName)])), PChar('Apophysis AV'), MB_ICONWARNING or MB_OK); + end; + PngObject.Free; +end; + +/////////////////////////////// + + +function GetThumbnailBase64(const cp1: TControlPoint) : string; +var + st: TMemoryStream; + tempcp : TControlPoint; + render : TRenderer; + buffer : array of byte; + base64 : string; + size : integer; + bmp : TJPegImage; + w, h, r: double; +begin + w := cp1.Width; + h := cp1.Height; + r := w / h; + if (w < h) then + begin + w := r * ThumbnailSize; + h := ThumbnailSize; + end else if (w > h) then + begin + h := ThumbnailSize / r; + w := ThumbnailSize; + end else + begin + w := ThumbnailSize; + h := ThumbnailSize; + end; + + render := TRenderer.Create; + tempcp := TControlPoint.create; + tempcp.Copy(cp1); + + tempcp.AdjustScale(round(w), round(h)); + tempcp.Width := round(w); + tempcp.Height := round(h); + tempcp.spatial_oversample := defOversample; + tempcp.spatial_filter_radius := defFilterRadius; + tempcp.sample_density := 10; + + render.SetCP(tempcp); + render.Render; + + st := TMemoryStream.Create; + bmp := TJpegImage.Create; + bmp.Assign(render.GetImage); + bmp.SaveToStream(st); + size := st.Size; + SetLength(buffer, size); + st.Seek(0, soBeginning); + + st.ReadBuffer(buffer[0], length(buffer)); + base64 := B64Encode(TBinArray(buffer), length(buffer)); + + tempcp.Free; + render.Free; + st.Free; + bmp.Free; + + result := base64; +end; + +function FlameToXML(const cp1: TControlPoint; exporting, embedthumb: boolean): String; +var + t, i{, j}, pos: integer; + FileList: TStringList; + x, y: double; + parameters: string; + curves, str, buf, xdata: string; +begin + FileList := TStringList.create; + x := cp1.center[0]; + y := cp1.center[1]; + +// if cp1.cmapindex >= 0 then pal := pal + 'gradient="' + IntToStr(cp1.cmapindex) + '" '; + + try + parameters := 'version="' + AppVersionString + '" '; + if cp1.time <> 0 then + parameters := parameters + format('time="%g" ', [cp1.time]); + + parameters := parameters + + 'size="' + IntToStr(cp1.width) + ' ' + IntToStr(cp1.height) + + format('" center="%g %g" ', [x, y]) + + format('scale="%g" ', [cp1.pixels_per_unit]); + + if cp1.FAngle <> 0 then + parameters := parameters + format('angle="%g" ', [cp1.FAngle]) + // !?!?!? + format('rotate="%g" ', [-180 * cp1.FAngle/Pi]); + if cp1.zoom <> 0 then + parameters := parameters + format('zoom="%g" ', [cp1.zoom]); + +// 3d + if cp1.cameraPitch <> 0 then + parameters := parameters + format('cam_pitch="%g" ', [cp1.cameraPitch]); + if cp1.cameraYaw <> 0 then + parameters := parameters + format('cam_yaw="%g" ', [cp1.cameraYaw]); + if cp1.cameraRoll <> 0 then // AV + parameters := parameters + format('cam_roll="%g" ', [cp1.cameraRoll]); + if cp1.cameraPersp <> 0 then + parameters := parameters + format('cam_perspective="%g" ', [cp1.cameraPersp]); + if cp1.cameraZpos <> 0 then + parameters := parameters + format('cam_zpos="%g" ', [cp1.cameraZpos]); + if cp1.cameraDOF <> 0 then + parameters := parameters + format('cam_dof="%g" ', [cp1.cameraDOF]); +// + parameters := parameters + format( + 'oversample="%d" filter="%g" quality="%g" ', + [cp1.spatial_oversample, + cp1.spatial_filter_radius, + cp1.sample_density] + ); + if cp1.nbatches <> 1 then parameters := parameters + 'batches="' + IntToStr(cp1.nbatches) + '" '; + if cp1.hue_rotation <> 1 then parameters := parameters + format('hue="%g" ', [cp1.hue_rotation]); // AV + + parameters := parameters + + format('background="%g %g %g" ', [cp1.background[0] / 255, cp1.background[1] / 255, cp1.background[2] / 255]) + + format('brightness="%g" ', [cp1.brightness]) + + format('gamma="%g" ', [cp1.gamma]); + + if cp1.contrast <> 1 then // AV + parameters := parameters + format('contrast="%g" ', [cp1.contrast]); + + if cp1.vibrancy <> 1 then + parameters := parameters + format('vibrancy="%g" ', [cp1.vibrancy]); + + if cp1.gamma_threshold <> 0 then + parameters := parameters + format('gamma_threshold="%g" ', [cp1.gamma_threshold]); + + if cp1.soloXform >= 0 then + parameters := parameters + format('soloxform="%d" ', [cp1.soloXform]); + + // + parameters := parameters + + format('estimator_radius="%g" ', [cp1.estimator]) + + format('estimator_minimum="%g" ', [cp1.estimator_min]) + + format('estimator_curve="%g" ', [cp1.estimator_curve]); + if exporting then parameters := parameters + + format('temporal_samples="%d" ', [cp1.jitters]); + if (cp1.enable_de) then + parameters := parameters + ('enable_de="1" ') + else parameters := parameters + ('enable_de="0" '); + + str := ''; + for i := 0 to cp1.used_plugins.Count-1 do begin + str := str + cp1.used_plugins[i]; + if (i = cp1.used_plugins.Count-1) then break; + str := str + ' '; + end; + parameters := parameters + format('plugins="%s" new_linear="1" ', [str]); + + for i := 0 to 3 do + begin + curves := curves + FloatToStr(cp1.curvePoints[i][0].x) + ' '; + curves := curves + FloatToStr(cp1.curvePoints[i][0].y) + ' '; + curves := curves + FloatToStr(cp1.curveWeights[i][0]) + ' '; + + curves := curves + FloatToStr(cp1.curvePoints[i][1].x) + ' '; + curves := curves + FloatToStr(cp1.curvePoints[i][1].y) + ' '; + curves := curves + FloatToStr(cp1.curveWeights[i][1]) + ' '; + + curves := curves + FloatToStr(cp1.curvePoints[i][2].x) + ' '; + curves := curves + FloatToStr(cp1.curvePoints[i][2].y) + ' '; + curves := curves + FloatToStr(cp1.curveWeights[i][2]) + ' '; + + curves := curves + FloatToStr(cp1.curvePoints[i][3].x) + ' '; + curves := curves + FloatToStr(cp1.curvePoints[i][3].y) + ' '; + curves := curves + FloatToStr(cp1.curveWeights[i][3]) + ' '; + end; + + curves := trim(curves); + parameters := parameters + format('curves="%s" ', [curves]); + + FileList.Add(''); + { Write transform parameters } + t := cp1.NumXForms; + for i := 0 to t - 1 do + FileList.Add(cp1.xform[i].ToXMLString); + if cp1.HasFinalXForm then + begin + // 'enabled' flag disabled in this release + FileList.Add(cp1.xform[t].FinalToXMLString(cp1.finalXformEnabled)); + end; + + if (embedthumb and EmbedThumbnails) then begin + xdata := GetThumbnailBase64(cp1); + buf := ''; + for i := 1 to length(xdata) do begin + buf := buf + xdata[i]; + if (length(buf) = 150) then begin + FileList.Add(' '); + buf := ''; + end; + end; + if (Length(buf) > 0) then FileList.Add(' '); + end; + + { Write palette data } + if exporting or OldPaletteFormat then + FileList.Add(ColorToXml(cp1)) + else + FileList.Add(ColorToXmlCompact(cp1)); + + FileList.Add(''); + result := FileList.text; + finally + FileList.free + end; +end; + +function RemoveExt(filename: string): string; +var + ext: string; + p: integer; +begin + filename := ExtractFileName(filename); + ext := ExtractFileExt(filename); + p := Pos(ext, filename); + Result := Copy(filename, 0, p - 1); +end; + +function XMLEntryExists(title, filename: string): boolean; +var + FileList: TStringList; +begin + + Result := false; + if FileExists(filename) then + begin + FileList := TStringList.Create; + try + FileList.LoadFromFile(filename); + if pos(' 0 then Result := true; + finally + FileList.Free; + end + end else + result := false; +end; + +procedure DeleteXMLEntry(title, filename: string); +var + Strings: TStringList; + p, i: integer; +begin + Strings := TStringList.Create; + try + i := 0; + Strings.LoadFromFile(FileName); + while Pos('name="' + title + '"', Trim(Strings[i])) = 0 do + inc(i); + + p := 0; + while p = 0 do + begin + p := Pos('', Strings[i]); + Strings.Delete(i); + end; + Strings.SaveToFile(FileName); + finally + Strings.Free; + end; +end; + + +function TMainForm.SaveXMLFlame(const cp1: TControlPoint; title, filename: string): boolean; +{ Saves Flame parameters to end of file } +var + Tag: string; + IFile: File; + FileList: TStringList; + i, p: integer; + bakname: string; +begin + Tag := RemoveExt(filename); + Result := True; + try + if FileExists(filename) then + begin + bakname := ChangeFileExt(filename, '.bak'); + if FileExists(bakname) then DeleteFile(bakname); + RenameFile(filename, bakname); + + FileList := TStringList.create; + try + FileList.LoadFromFile(bakname); + + if Pos(' 0 then + begin + i := 0; + while Pos('', FileList[i]); + FileList.Delete(i); + end; + end; + + // fix first line + if (FileList.Count > 0) then begin + //FileList[0] := ''; + // AV: fix fixed :-) + if (pos(' 0) then + FileList[0] := '' + else // single-flame support + FileList.Insert(0, ''); + end; + + if FileList.Count > 2 then + begin + // AV fix last line :-) + if (pos('', FileList[FileList.Count - 1]) = 0) then + FileList.Add(''); + + if pos(' 0 then + repeat + FileList.Delete(FileList.Count - 1); + until (Pos('', FileList[FileList.count - 1]) <> 0) + else + repeat + FileList.Delete(FileList.Count - 1); + until (Pos('<' + Tag + '>', FileList[FileList.count - 1]) <> 0) or + (Pos('', FileList[FileList.count - 1]) <> 0); + end else + begin + FileList.Delete(FileList.Count - 1); + end; + + FileList.Add(Trim(FlameToXML(cp1, false, true))); + FileList.Add(''); + FileList.SaveToFile(filename); + + finally + if FileExists(bakname) and not FileExists(filename) then + RenameFile(bakname, filename); + + FileList.Free; + end; + end + else + begin + // New file ... easy + FileList := TStringList.Create; + FileList.Text := '' + #$0D#$0A + + FlameToXML(cp1, false, true) + #$0D#$0A + ''; + FileList.SaveToFile(filename, TEncoding.UTF8); + FileList.Destroy; + end; + except // AV: fixed multi-updating + Result := False; // AV: first assign the value, then exit + raise Exception.CreateFmt(TextByKey('common-genericsavefailure'), [FileName]); // AV + //Application.MessageBox(PChar(Format(TextByKey('common-genericsavefailure'), [FileName])), 'Apophysis', 16); + end; +end; + +function TMainForm.SaveGradient(Gradient, Title, FileName: string): boolean; +{ Saves gradient parameters to end of file } +var + IFile: TextFile; +begin + Result := True; + try + AssignFile(IFile, FileName); + if FileExists(FileName) then + begin + if EntryExists(Title, FileName) then DeleteEntry(Title, FileName); + Append(IFile); + end + else + ReWrite(IFile); + Write(IFile, Gradient); + WriteLn(IFile, ' '); + CloseFile(IFile); + except on EInOutError do + begin + Result := False; + raise Exception.CreateFmt(TextByKey('common-genericsavefailure'), [FileName]); // AV + end; + end; +end; + +function RenameIFS(OldIdent: string; var NewIdent: string): boolean; +{ Renames an IFS parameter set in a file } +var + Strings: TStringList; + p, i: integer; + s: string; +begin + Result := True; + NewIdent := CleanEntry(NewIdent); + Strings := TStringList.Create; + try + try + i := 0; + Strings.LoadFromFile(OpenFile); + if Pos(OldIdent + ' ', Trim(Strings.Text)) <> 0 then + begin + while Pos(OldIdent + ' ', Trim(Strings[i])) <> 1 do + begin + inc(i); + end; + p := Pos('{', Strings[i]); + s := Copy(Strings[i], p, Length(Strings[i]) - p + 1); + Strings[i] := NewIdent + ' ' + s; + Strings.SaveToFile(OpenFile); + end + else + Result := False; + except on Exception do Result := False; + end; + finally + Strings.Free; + end; +end; + +function RenameXML(OldIdent: string; var NewIdent: string): boolean; +{ Renames an XML parameter set in a file } +var + Strings: TStringList; + i: integer; + bakname: string; +begin + Result := True; + Strings := TStringList.Create; + try + try + i := 0; + Strings.LoadFromFile(OpenFile); + if Pos('name="' + OldIdent + '"', Strings.Text) <> 0 then + begin + while Pos('name="' + OldIdent + '"', Strings[i]) = 0 do + begin + inc(i); + end; + Strings[i] := StringReplace(Strings[i], OldIdent, NewIdent, []); + + bakname := ChangeFileExt(OpenFile, '.bak'); + if FileExists(bakname) then DeleteFile(bakname); + RenameFile(OpenFile, bakname); + + Strings.SaveToFile(OpenFile); + end + else + Result := False; + except on Exception do + Result := False; + end; + finally + Strings.Free; + end; +end; + + +procedure ListIFS(FileName: string; sel: integer); +{ List identifiers in file } +var + i, p: integer; + Title: string; + ListItem: TListItem; + FStrings: TStringList; +begin + MainForm.ParseLoadingBatch := true; + FStrings := TStringList.Create; + FStrings.LoadFromFile(FileName); + try + MainForm.ListView1.Items.BeginUpdate; + MainForm.ListView1.Items.Clear; + if (Pos('{', FStrings.Text) <> 0) then + begin + for i := 0 to FStrings.Count - 1 do + begin + p := Pos('{', FStrings[i]); + // AV: why do we use 2-nd condition? A rudiment from 3D-hack? + if (p <> 0) and (Pos('(3D)', FStrings[i]) = 0) then + begin + Title := Trim(Copy(FStrings[i], 1, p - 1)); + if Title <> '' then + begin { Otherwise bad format } + if ((i mod 5) = 0) then + MainForm.LoadSaveProgress.Position := + round(100 * i / FStrings.Count); // AV + ListItem := MainForm.ListView1.Items.Add; + Listitem.Caption := Title; // Trim(Copy(FStrings[i], 1, p - 1)); + end; + end; + end; + end; + MainForm.LoadSaveProgress.Position := 0; // AV + MainForm.ListView1.Items.EndUpdate; + + with MainForm.ListView1 do + if Items.Count > 0 then // AV + case sel of + 0: Selected := Items[Items.Count - 1]; + 1: Selected := Items[0]; + end; + finally + FStrings.Free; + end; + MainForm.ParseLoadingBatch := false; // AV +end; + +procedure ListFlames(FileName: string; sel: integer); +{ List identifiers in file } +var + i, p: integer; + Title: string; + ListItem: TListItem; + FStrings: TStringList; +begin + FStrings := TStringList.Create; + FStrings.LoadFromFile(FileName); + try + MainForm.ListView1.Items.BeginUpdate; + MainForm.ListView1.Items.Clear; + if (Pos('{', FStrings.Text) <> 0) then + begin + for i := 0 to FStrings.Count - 1 do + begin + p := Pos('{', FStrings[i]); + if (p <> 0) then + begin + Title := Trim(Copy(FStrings[i], 1, p - 1)); + if Title <> '' then + begin { Otherwise bad format } + ListItem := MainForm.ListView1.Items.Add; + Listitem.Caption := Trim(Copy(FStrings[i], 1, p - 1)); + end; + end; + end; + end; + MainForm.ListView1.Items.EndUpdate; + if sel = 1 then MainForm.ListView1.Selected := MainForm.ListView1.Items[0]; + finally + FStrings.Free; + end; +end; + +{ ****************************** Display ************************************ } + +procedure Trace1(const str: string); +begin + if TraceLevel >= 1 then + TraceForm.MainTrace.Lines.Add('. ' + str); +end; + +procedure Trace2(const str: string); +begin + if TraceLevel >= 2 then + TraceForm.MainTrace.Lines.Add('. . ' + str); +end; + +procedure TMainForm.HandleThreadCompletion(var Message: TMessage); +var + oldscale: double; +begin + Trace2(MsgComplete + IntToStr(message.LParam)); + if not Assigned(Renderer) then begin + Trace2(MsgNotAssigned); + exit; + end; + if Renderer.ThreadID <> message.LParam then begin + Trace2(MsgAnotherRunning); + exit; + end; + Image.Cursor := crDefault; + + if assigned(FViewImage) then begin + oldscale := FViewImage.Width / Image.Width; + FViewImage.Free; + end + else oldscale := FViewScale; + + FViewImage := Renderer.GetTransparentImage; + + if (FViewImage <> nil) and (FViewImage.Width > 0) then begin + FViewScale := FViewImage.Width / Image.Width; + + FViewPos.X := FViewScale/oldscale * (FViewPos.X - FViewOldPos.X); + FViewPos.Y := FViewScale/oldscale * (FViewPos.Y - FViewOldPos.Y); + + DrawImageView; +{ + case FMouseMoveState of + msZoomWindowMove: FMouseMoveState := msZoomWindow; + msZoomOutWindowMove: FMouseMoveState := msZoomOutWindow; +// msDragMove: FMouseMoveState := msDrag; + msRotateMove: FMouseMoveState := msRotate; + end; +} + if FMouseMoveState in [msZoomWindowMove, msZoomOutWindowMove, msRotateMove] then + DrawSelection := false; + + Trace1(TimeToStr(Now) + ' : Render complete'); + Renderer.ShowSmallStats; + end + else Trace2('WARNING: No image rendered!'); + + Renderer.WaitFor; + Trace2('Destroying RenderThread #' + IntToStr(Renderer.ThreadID)); + Renderer.Free; + Renderer := nil; + Trace1(''); +end; + +procedure TMainForm.HandleThreadTermination(var Message: TMessage); +begin + Trace2(MsgTerminated + IntToStr(message.LParam)); + if not Assigned(Renderer) then begin + Trace2(MsgNotAssigned); + exit; + end; + if Renderer.ThreadID <> message.LParam then begin + Trace2(MsgAnotherRunning); + exit; + end; + Image.Cursor := crDefault; + Trace2(' Render aborted'); + + Trace2('Destroying RenderThread #' + IntToStr(Renderer.ThreadID)); + Renderer.Free; + Renderer := nil; + Trace1(''); +end; + +procedure TMainForm.DrawPreview; +var + cp : TControlPoint; + Render : TRenderer; + BM: TBitmap; +begin + Render := TRenderer.Create; + bm := TBitmap.Create; + + cp := MainCP.Clone; + + cp.sample_density := 1; + cp.spatial_oversample := 1; + cp.spatial_filter_radius := 1; + + //Render.NrThreads := NrTreads; + Render.SetCP(cp); + Render.Render; + BM.Assign(Render.GetImage); + Image.Picture.Graphic := bm; +end; + +procedure TMainForm.DrawFlame; +var + GlobalMemoryInfo: TMemoryStatus; // holds the global memory status information + RenderCP: TControlPoint; + Mem, ApproxMem: cardinal; + bs: integer; +begin + RedrawTimer.Enabled := False; + if Assigned(Renderer) then begin + assert(Renderer.Suspended = false); + + Trace2('Killing previous RenderThread #' + inttostr(Renderer.ThreadID)); + Renderer.Terminate; + Renderer.WaitFor; + Trace2('Destroying RenderThread #' + IntToStr(Renderer.ThreadID)); + + Renderer.Free; + Renderer := nil; + end; + + if not Assigned(Renderer) then + begin + if EditForm.Visible and ((MainCP.Width / MainCP.Height) <> (EditForm.cp.Width / EditForm.cp.Height)) + then EditForm.UpdateDisplay(true); // preview only? + if AdjustForm.Visible then AdjustForm.UpdateDisplay(true); // preview only! + + RenderCP := MainCP.Clone; + RenderCp.AdjustScale(Image.width, Image.height); + + // following needed ? +// cp.Zoom := Zoom; +// cp.center[0] := center[0]; +// cp.center[1] := center[1]; + + RenderCP.sample_density := defSampleDensity; + // oversample and filter are just slowing us down here... + RenderCP.spatial_oversample := 1; // defOversample; + RenderCP.spatial_filter_radius := 0.001; {?} //defFilterRadius; + RenderCP.Transparency := true; // always generate transparency here + + GlobalMemoryInfo.dwLength := SizeOf(GlobalMemoryInfo); + GlobalMemoryStatus(GlobalMemoryInfo); + Mem := GlobalMemoryInfo.dwAvailPhys; + + if (singleBuffer) then bs := 16 + else bs := 32; + +// if Output.Lines.Count >= 1000 then Output.Lines.Clear; + Trace1('--- Previewing "' + RenderCP.name + '" ---'); + Trace1(Format(' Available memory: %f Mb', [Mem / (1024*1024)])); + ApproxMem := int64(RenderCp.Width) * int64(RenderCp.Height) {* sqr(Oversample)} + * (bs + 4 + 4); // +4 for temp image(s)...? + assert(MainPreviewScale <> 0); + if ApproxMem * sqr(MainPreviewScale) < Mem then begin + if ExtendMainPreview then begin + RenderCP.sample_density := RenderCP.sample_density / sqr(MainPreviewScale); + RenderCP.Width := round(RenderCp.Width * MainPreviewScale); + RenderCP.Height := round(RenderCp.Height * MainPreviewScale); + end; + end + else Trace1('WARNING: Not enough memory for extended preview!'); + if ApproxMem > Mem then + Trace1('OUTRAGEOUS: Not enough memory even for normal preview! :-('); + Trace1(Format(' Size: %dx%d, Quality: %f', + [RenderCP.Width, RenderCP.Height, RenderCP.sample_density])); + FViewOldPos.x := FViewPos.x; + FViewOldPos.y := FViewPos.y; + StartTime := Now; + try + Renderer := TRenderThread.Create; + Renderer.TargetHandle := MainForm.Handle; + if TraceLevel > 0 then Renderer.Output := TraceForm.MainTrace.Lines; + Renderer.OnProgress := OnProgress; + Renderer.SetCP(RenderCP); + // Renderer.NrThreads := NrTreads; + + Trace2('Starting RenderThread #' + inttostr(Renderer.ThreadID)); + Renderer.Resume; + + Image.Cursor := crAppStart; + except + Trace1('ERROR: Cannot start renderer!'); + end; + RenderCP.Free; + + end; +end; + +{ ************************** IFS and triangle stuff ************************* } + +function FlameToString(Title: string): string; +{ Creates a string containing the formated flame parameter set } +var + I: integer; + sl, Strings: TStringList; +begin + Strings := TStringList.Create; + sl := TStringList.Create; + try + Strings.Add(CleanEntry(Title) + ' {'); + MainCp.SaveToStringList(sl); + Strings.Add(sl.text); + Strings.Add('palette:'); + for i := 0 to 255 do + begin + Strings.Add(IntToStr(MainCp.cmap[i][0]) + ' ' + + IntToStr(MainCp.cmap[i][1]) + ' ' + + IntToStr(MainCp.cmap[i][2])) + end; + Strings.Add('}'); + Result := Strings.Text; + finally + sl.Free; + Strings.Free; + end; +end; + +procedure TMainForm.RandomBatch; +{ Write a series of random ifs to a file } +var + i: integer; + F: TextFile; + b, RandFile: string; +begin + b := IntToStr(BatchSize); + inc(MainSeed); + RandSeed := MainSeed; + try + AssignFile(F, AppPath + randFilename); + OpenFile := AppPath + randFilename; + ReWrite(F); + WriteLn(F, ''); // AV: fixed ''); + for i := 0 to BatchSize - 1 do + begin + inc(RandomIndex); + Statusbar.SimpleText := Format(TextByKey('main-status-batchgenerate'), [(i+1), b]); + RandSeed := MainSeed; + if randGradient = 0 then cmap_index := random(NRCMAPS); + inc(MainSeed); + RandSeed := MainSeed; + RandomizeCP(MainCp); + MainCp.CalcBoundbox; + MainCp.name := RandomPrefix + RandomDate + '-' + IntToStr(RandomIndex); + Write(F, FlameToXML(MainCp, False, false)); + end; + Write(F, ''); // AV: fixed ''); + CloseFile(F); + except + on EInOutError do + Application.MessageBox(PChar(TextByKey('main-status-batcherror')), PChar('Apophysis'), 16); + end; + RandFile := AppPath + randFilename; + MainCp.name := ''; +end; + +{ ******************************** Menu ************************************ } + +function LoadXMLFlameText(filename, name: string) : string; +var + i, p: integer; + FileStrings: TStringList; + ParamStrings: TStringList; + Tokens: TStringList; + time: integer; +begin + time := -1; + FileStrings := TStringList.Create; + ParamStrings := TStringList.Create; + Result := ''; + + if pos('*untitled', name) <> 0 then + begin + Tokens := TStringList.Create; + GetTokens(name, tokens); + time := StrToInt(tokens[1]); + Tokens.free; + end; + try + { if UpperCase(ExtractFileExt(filename)) = '.PNG' then + FileStrings.Text := MainForm.LoadXMLFlameTextPNG(filename) + else } + FileStrings.LoadFromFile(filename); + + for i := 0 to FileStrings.Count - 1 do + begin + pname := ''; + ptime := ''; + p := Pos(' 0) then + begin + MainForm.ListXMLScanner.LoadFromBuffer(TCharType(TStringType(FileStrings[i]))); + MainForm.ListXMLScanner.Execute; + if pname <> '' then + begin + if (Trim(pname) = Trim(name)) then + begin + ParamStrings.Add(FileStrings[i]); + Break; + end; + end + else + begin + if ptime <> '' then + begin + if StrToInt(ptime) = time then + begin + ParamStrings.Add(FileStrings[i]); + Break; + end; + end; + end; + end; + end; + repeat + inc(i); + ParamStrings.Add(FileStrings[i]); + until pos('', Lowercase(FileStrings[i])) <> 0; + + Result := ParamStrings.Text; + + finally + FileStrings.free; + ParamStrings.free; + end; +end; + +procedure AddThumbnail(renderer : TRenderer; width, height : double); +var + Bmp: TBitmap; + x, y : double; +begin + Bmp := TBitmap.Create; + Bmp.PixelFormat := pf24bit; + Bmp.HandleType := bmDIB; + Bmp.Width := ThumbnailSize; + Bmp.Height := ThumbnailSize; + + x := ThumbnailSize / 2; + y := ThumbnailSize / 2; + + x := x - width / 2; + y := y - height / 2; + + with Bmp.Canvas do begin + Brush.Color := GetSysColor(5); // window background + FillRect(Rect(0, 0, Bmp.Width, Bmp.Height)); + Draw(round(x), round(y), renderer.GetImage); + end; + + MainForm.UsedThumbnails.Add(bmp, nil); + + if (Bmp <> nil) then Bmp.Free; +end; + +function ScanVariations(name:string):boolean; +var + i,count:integer; + vname:string; +begin + count:=NrVar; + for i:=0 to count - 1 do + begin + vname := VarNames(i); + if (vname = name) then + begin + Result := true; + exit; + end; + end; + for i := 0 to MainForm.SubstSource.Count - 1 do + begin + vname := MainForm.SubstSource[i]; + if (vname = name) then + begin + Result := true; + exit; + end; + end; + Result := false; +end; +function ScanVariables(name:string):boolean; +var + i,count:integer; +begin + count:=GetNrVariableNames; + for i:=0 to count - 1 do + begin + if (GetVariableNameAt(i) = name) then + begin + Result := true; + exit; + end; + end; + for i := 0 to MainForm.SubstSource.Count - 1 do + begin + if (MainForm.SubstSource[i] = name) then + begin + Result := true; + exit; + end; + end; + Result := false; +end; + +procedure TMainForm.mnuOpenClick(Sender: TObject); +var + fn: string; +begin + //ScriptEditor.Stopped := True; + MainMenuClick(nil); // AV + + OpenDialog.Filter := TextByKey('common-filter-flamefiles') + '|*.flame;*.xml|' + + TextByKey('common-filter-templatefiles') + ' |*.template;*.temp|' + + TextByKey('common-filter-undofiles') + '|*.undo;*.apo|' + + TextByKey('common-filter-allfiles') + '|*.*'; + OpenDialog.InitialDir := ParamFolder; + OpenDialog.FileName := ''; + if OpenSaveFileDialog(MainForm, '.flame', OpenDialog.Filter, OpenDialog.InitialDir, + TextByKey('common-browse'), fn, true, false, false, true) then + begin + OpenDialog.FileName := fn; + MainForm.CurrentFileName := OpenDialog.FileName; + LastOpenFile := OpenDialog.FileName; + Maincp.name := ''; + ParamFolder := ExtractFilePath(OpenDialog.FileName); + OpenFile := OpenDialog.FileName; + //MainForm.Caption := AppVersionString + ' - ' + OpenFile; // --Z-- + if APP_BUILD = '' then MainForm.Caption := AppVersionString + ' - ' + openFile + else MainForm.Caption := AppVersionString + ' ' + APP_BUILD + ' - ' + openFile; + OpenFileType := ftXML; + (* if UpperCase(ExtractFileExt(OpenDialog.FileName)) = '.IFS' then + begin + OpenFileType := ftIfs; + Variation := vLinear; + VarMenus[0].Checked := True; + end; *) + if (UpperCase(ExtractFileExt(OpenDialog.FileName)) = '.UNDO') or + (UpperCase(ExtractFileExt(OpenDialog.FileName)) = '.APO') then + OpenFileType := ftFla; // AV + if OpenFileType = ftXML then + ListXML(OpenDialog.FileName, 1) + else + ListIFS(OpenDialog.FileName, 1); + end; +end; + +procedure TMainForm.mnuNextClick(Sender: TObject); +begin + with ListView1 do + if Items.Count <> 0 then + Selected := Items[(Selected.Index + 1) mod Items.Count]; +end; + +procedure TMainForm.mnuPreviousClick(Sender: TObject); +var + i: integer; +begin + with ListView1 do + if Items.Count <> 0 then + begin + i := Selected.Index - 1; + if i < 0 then i := Items.Count - 1; + Selected := Items[i]; + end; +end; + +procedure TMainForm.mnuListRenameClick(Sender: TObject); +var + i: integer; +begin + if ListView1.SelCount <> 0 then + begin + if (UndoIndex <> 0) then // AV + if Application.MessageBox(PChar(Format(TextByKey('common-confirmrename'), + [ListView1.Selected.Caption])), 'Apophysis AV', 36) <> IDYES then exit; + ListView1.Items[ListView1.Selected.Index].EditCaption; + end; +end; + +procedure TMainForm.mnuCopyUPRClick(Sender: TObject); +begin + Clipboard.SetTextBuf(PChar(UPRString(MainCp, Maincp.name))); +end; + +procedure TMainForm.mnuItemDeleteClick(Sender: TObject); +var + c: boolean; +begin + if ListView1.SelCount <> 0 then + begin + if ConfirmDelete then + begin + if (UndoIndex <> 0) then // AV: if the flame is not saved in the list + c := Application.MessageBox( + PChar(Format(TextByKey('common-confirmdelete'), [ListView1.Selected.Caption]) + + #32 + TextByKey('common-deletecurrent')), 'Apophysis', 36) = IDYES + else + c := Application.MessageBox( + PChar(Format(TextByKey('common-confirmdelete'), [ListView1.Selected.Caption])), 'Apophysis', 36) = IDYES + end + else + c := True; + if c then + if ListView1.Focused and (ListView1.SelCount <> 0) then + begin + Application.ProcessMessages; + if OpenFileType = ftXML then + DeleteXMLEntry(ListView1.Selected.Caption, OpenFile) + else + DeleteEntry(ListView1.Selected.Caption, OpenFile); + { + if (ListView1.Selected.Index >= 0) and (ListView1.Selected.Index < UsedThumbnails.Count) + and (not ClassicListMode) then + UsedThumbnails.Delete(ListView1.Selected.Index); + } + ListView1.Items.Delete(ListView1.Selected.Index); + Application.ProcessMessages; + ListView1.Selected := ListView1.ItemFocused; + // AV: re-adjust the displayed numbers... + if EnumerateFlames.Checked then EnumerateFlamesClick(EnumerateFlames); + (* + // AV: I set ListView1.IconOptions.AutoArrange := True; + // for auto-updating the flame list without redrawing the thumbs. + // An alternative (but slow) way to do the same thing: + + if ListView1.Items.Count > 0 then // refresh the list + begin + i := ListView1.ItemFocused.Index; // AV + if OpenFileType = ftXML then + UpdateThumbnails // AV + else + ListIFS(OpenFile, 2); // AV: for undo files + // AV: now scroll to the nearest item + i := min(i, ListView1.Items.Count - 1); + ListView1.Selected := ListView1.Items[i]; + ListView1.Items[i].MakeVisible(true); + end; + *) + end; + end; +end; + +procedure TMainForm.mnuOptionsClick(Sender: TObject); +var isSmallThumb: boolean; +begin + isSmallThumb := UseSmallThumbnails; // AV + OptionsForm.ShowModal; + // --Z-- + StopThread; + RedrawTimer.Enabled := True; + tbQualityBox.Text := FloatToStr(defSampleDensity); + tbShowAlpha.Down := ShowTransparency; + if (isSmallThumb <> UseSmallThumbnails) then // update the thumbs + begin + SetThumbnailProperties; // AV + UpdateThumbnails; // AV + end; + if EnumerateFlames.Checked then EnumerateFlamesClick(EnumerateFlames); // AV + + DrawImageView; + UpdateWindows; +end; + +procedure TMainForm.mnuRefreshClick(Sender: TObject); +begin + RedrawTimer.enabled := true; +end; + +procedure TMainForm.mnuRefreshThumbClick(Sender: TObject); +begin + if (ListView1.Selected = nil) or ParseLoadingBatch then exit; + RefreshThumbnail; // current only +end; + +procedure TMainForm.mnuNormalWeightsClick(Sender: TObject); +begin + StopThread; + UpdateUndo; + // TODO: ...something <-- AV: something's done :) + MainCp.NormalizeProbabilities; + RedrawTimer.Enabled := True; + UpdateWindows; +end; + +procedure TMainForm.mnuRWeightsClick(Sender: TObject); +begin + StopThread; + UpdateUndo; + inc(MainSeed); + RandSeed := MainSeed; + MainCp.RandomizeWeights; + RedrawTimer.Enabled := True; + UpdateWindows; +end; + +procedure TMainForm.mnuRandomBatchClick(Sender: TObject); +begin + //ScriptEditor.Stopped := True; + MainMenuClick(nil); // AV + + inc(MainSeed); + RandSeed := MainSeed; + RandomBatch; + OpenFile := AppPath + randFilename; + OpenFileType := ftXML; + MainForm.Caption := AppVersionString + ' - ' + TextByKey('main-common-randombatch'); + ListXML(OpenFile, 1); + ListView1.SetFocus; // AV + if batchsize = 1 then DrawFlame; +end; + +function GradientString(c: TColorMap): string; +var + strings: TStringList; + i, j, cl: integer; +begin + strings := TStringList.Create; + for i := 0 to 255 do + begin + j := round(i * (399 / 255)); + cl := (c[i][2] shl 16) + (c[i][1] shl 8) + (c[i][0]); + strings.Add(' index=' + IntToStr(j) + ' color=' + intToStr(cl)); + end; + Result := Strings.Text; + strings.Free; +end; + +function TMainForm.UPRString(cp1: TControlPoint; Entry: string): string; +{ Returns a string containing an Ultra Fractal parameter set for copying + or saving to file } +var + IterDensity, m, i, j: integer; + scale, a, b, c, d, e, f, p, v: double; + GradStrings, Strings: TStringList; + rept, cby, smap, sol: string; + uprcenter: array[0..1] of double; // camera center + Backcolor: longint; + xf_str: string; +begin + cp1.Prepare; + uprcenter[0] := cp1.Center[0]; + uprcenter[1] := cp1.Center[1]; + cp1.Width := UPRWidth; + cp1.Height := UPRHeight; + scale := power(2, cp1.zoom) * CalcUPRMagn(cp1); + cp1.center[0] := uprCenter[0]; + cp1.center[1] := uprCenter[1]; + smap := 'no'; + sol := 'no'; + rept := ''; + cby := 'Hit Frequency'; + Strings := TStringList.Create; + GradStrings := TStringList.Create; + try + Strings.Add(CleanEntry(Entry) + ' {'); + Strings.Add('fractal:'); + Strings.Add(' title="' + CleanUPRTitle(Entry) + + '" width=' + IntToStr(UPRWidth) + ' height=' + IntToStr(UPRHeight) + ' layers=1'); + Strings.Add('layer:'); + Strings.Add(' method=linear caption="Background" opacity=100 mergemode=normal'); + Strings.Add('mapping:'); + Strings.Add(' center=' + floatToStr(cp1.center[0]) + '/' + floatToStr(-cp1.center[1]) + + ' magn=' + FloatToStr(scale)); + Strings.Add('formula:'); + Strings.Add(' maxiter=1 filename="' + UPRFormulaFile + '" entry="' + UPRFormulaIdent + '"'); + Strings.Add('inside:'); + Strings.Add(' transfer=none'); + Strings.Add('outside:'); + Strings.Add(' transfer=linear repeat=no ' + 'filename="' + UPRColoringFile + '" entry="' + + UPRColoringIdent + '"'); + if (UPRAdjustDensity) and (scale > 1) then + IterDensity := Trunc(UPRSampleDensity * scale * scale) + else + IterDensity := UPRSampleDensity; + Strings.Add(' p_iter_density=' + IntToStr(IterDensity) + ' p_spat_filt_rad=' + + Format('%.3g', [UPRFilterRadius]) + ' p_oversample=' + IntToStr(UPROversample)); + backcolor := 255 shl 24 + cp1.background[0] shl 16 + cp1.background[1] shl 8 + cp1.background[2]; + Strings.Add(' p_bk_color=' + IntToStr(Backcolor) + ' p_contrast=' + FloatToStr(cp1.Contrast) + + ' p_brightness=' + FloatToStr(cp1.Brightness) + ' p_gamma=' + FloatToStr(cp1.Gamma)); + Strings.Add(' p_white_level=200 p_xforms=' + inttostr(Transforms)); + for m := 0 to Transforms do + begin + a := cp1.xform[m].c[0][0]; + c := cp1.xform[m].c[0][1]; + b := cp1.xform[m].c[1][0]; + d := cp1.xform[m].c[1][1]; + e := cp1.xform[m].c[2][0]; + f := cp1.xform[m].c[2][1]; + p := cp1.xform[m].Density; + if m < Transforms then xf_str := 'p_xf' + inttostr(m) + else begin + if cp1.HasFinalXForm = false then break; + xf_str := 'p_finalxf'; + end; + Strings.Add(' ' + xf_str + '_p=' + Format('%.6g ', [p])); + Strings.Add(' ' + xf_str + '_c=' + floatTostr(cp1.xform[m].color)); + Strings.Add(' ' + xf_str + '_sym=' + floatTostr(cp1.xform[m].symmetry)); + Strings.Add(' ' + xf_str + '_cfa=' + Format('%.6g ', [a]) + + xf_str + '_cfb=' + Format('%.6g ', [b]) + + xf_str + '_cfc=' + Format('%.6g ', [c]) + + xf_str + '_cfd=' + Format('%.6g ', [d])); + Strings.Add(' ' + xf_str + '_cfe=' + Format('%.6g ', [e]) + + ' ' + xf_str + '_cff=' + Format('%.6g ', [f])); + for i := 0 to NRVAR-1 do + if cp1.xform[m].GetVariation(i) <> 0 then begin + Strings.Add(' ' + xf_str + '_var_' + VarNames(i) + '=' + + floatToStr(cp1.xform[m].GetVariation(i))); + for j:= 0 to GetNrVariableNames - 1 do begin + {$ifndef VAR_STR} + cp1.xform[m].GetVariable(GetVariableNameAt(j), v); + Strings.Add(' ' + xf_str + '_par_' + GetVariableNameAt(j) + '=' + floatToStr(v)); + {$else} + Strings.Add(' ' + xf_str + '_par_' + + GetVariableNameAt(j) + '=' + cp1.xform[m].GetVariableStr(GetVariableNameAt(j))); + {$endif} + end; + end; + end; + Strings.Add('gradient:'); + Strings.Add(GradientString(cp1.cmap)); + Strings.Add('}'); + UPRString := Strings.Text; + finally + GradStrings.Free; + Strings.Free; + end; +end; + +procedure TMainForm.mnuRandomClick(Sender: TObject); +begin + StopThread; + UpdateUndo; + inc(MainSeed); + RandomizeCP(MainCp); + inc(RandomIndex); + MainCp.name := RandomPrefix + RandomDate + '-' + + IntToStr(RandomIndex); + Transforms := MainCp.TrianglesFromCP(MainTriangles); + + if AdjustForm.visible then AdjustForm.UpdateDisplay; + + StatusBar.Panels[3].text := maincp.name; + ResetLocation; + RedrawTimer.Enabled := true; + UpdateWindows; +end; + +procedure TMainForm.mnuEqualizeClick(Sender: TObject); +begin + StopThread; + UpdateUndo; + MainCP.EqualizeWeights; + RedrawTimer.Enabled := True; + UpdateWindows; +end; + +procedure TMainForm.mnuEditorClick(Sender: TObject); +begin + EditForm.Show; +end; + +procedure TMainForm.mnuExitClick(Sender: TObject); +begin + MainMenuClick(nil); // AV + + Close; +end; + +procedure TMainForm.mnuSaveUPRClick(Sender: TObject); +{ Write a UPR to a file } +begin + SaveForm.SaveType := stExportUPR; + SaveForm.Filename := UPRPath + 'Apophysis.upr'; // AV + SaveForm.Title := maincp.name; + if SaveForm.ShowModal = mrOK then + begin + UPRPath := SaveForm.FileName; + SaveUPR(SaveForm.Title, SaveForm.Filename); + end; +end; + +procedure TMainForm.mnuSaveAsClick(Sender: TObject); +{ Save parameters to a file } +var saved: boolean; // AV +begin + SaveForm.SaveType := stSaveParameters; + SaveForm.Filename := SavePath; + SaveForm.Title := maincp.name; + if SaveForm.ShowModal = mrOK then + begin + maincp.name := SaveForm.Title; + SavePath := SaveForm.Filename; + if ExtractFileExt(SavePath) = '' then + SavePath := SavePath + '.flame'; + if (LowerCase(ExtractFileExt(SaveForm.Filename)) = '.undo') or + (LowerCase(ExtractFileExt(SaveForm.Filename)) = '.apo') then + saved := SaveFlame(maincp, maincp.name, SavePath) // AV + else + saved := SaveXMLFlame(maincp, maincp.name, SavePath); + StatusBar.Panels[3].Text := maincp.name; + if (SavePath = OpenFile) and saved then // AV: added status check + begin + if OpenFileType = ftXML then + // AV: fixed re-saving error with OpenDialog.FileName! + ListXML(OpenFile, 2, maincp.name) // AV: remember the current position + else + ListIFS(OpenFile, 0); // AV: fixed re-saving error! + end; + end; +end; + +procedure TMainForm.mnuSaveAllAsClick(Sender: TObject); +{ Save all parameters to a file } +var + i, current: integer; + currentXML : string; +begin + SaveForm.SaveType := stSaveAllParameters; + SaveForm.Filename := SavePath; + if SaveForm.ShowModal = mrOK then + begin + SavePath := SaveForm.Filename; + if ExtractFileExt(SavePath) = '' then + SavePath := SavePath + '.flame'; + current := ListView1.ItemIndex; + currentXML := Trim(FlameToXML(Maincp, false, true)); + + for i := 0 to ListView1.Items.Count-1 do + begin + // -X- what if there are unsaved changes at the current CP? + // AV: this only can be if UndoIndex <> 0 + if (i = current) and (UndoIndex <> 0) then begin + ParseXML(maincp, PCHAR(currentXML), true); + SaveXMLFlame(maincp, maincp.name, SavePath); + end else begin + // AV: cancel unneseccary multiple preview updated + LoadXMLFlame(OpenFile, ListView1.Items.Item[i].Caption, false); + SaveXMLFlame(maincp, maincp.name, SavePath); + end; + MainForm.LoadSaveProgress.Position := + round(100 * i / (ListView1.Items.Count - 1)); // AV + end; + MainForm.LoadSaveProgress.Position := 0; // AV + // AV: we don't need to do this because it resets the Undo history! + { + ListXML(SavePath, 2); + if (current < 0) then current := 0; + ListView1.Selected := ListView1.Items[current]; + LoadXMLFlame(SavePath, ListView1.Selected.caption); + } + end; +end; + +function GradTitle(str: string): string; +var + p: integer; +begin + p := pos('{', str); + GradTitle := Trim(copy(str, 1, p - 1)); +end; + +procedure TMainForm.DisplayHint(Sender: TObject); +var + T: TComponent; +begin + T := MainForm.FindComponent('StatusBar'); + if T <> nil then + if Application.Hint = '' then + begin + TStatusBar(T).SimpleText := ''; + TStatusBar(T).SimplePanel := False; + TStatusBar(T).Refresh; + end + else + begin + // AV: fixed - someone forgot to change this property + TStatusBar(T).SimplePanel := True; + TStatusBar(T).SimpleText := Application.Hint; + end; +end; + +procedure TMainForm.DownloadPluginsClick(Sender: TObject); +begin + AboutForm.lblPluginsClick(nil); +end; + +procedure TMainForm.MainMenuClick(Sender: TObject); +begin + try // AV: sometimes this damn Stopped causes AccessViolations... + if ScriptEditor.btnPause.Down then ScriptEditor.btnPause.Click; // AV + ScriptEditor.Stopped := True; + except + // ? + end; +end; + +procedure TMainForm.mnuScreenShotClick(Sender: TObject); +begin + SaveScreenShot('Apophysis Main Window'); +end; + +{ ********************************* Form ************************************ } + +procedure TMainForm.FavoriteClick(Sender: TObject); +var + i: integer; + s: string; +begin + i := TMenuItem(Sender).Tag; + Script := favorites[i]; + if FileExists(Script) then + begin + ScriptEditor.Editor.Lines.LoadFromFile(Script); + s := ExtractFileName(Script); + s := Copy(s, 0, length(s) - Length(ExtractFileExt(s))); + mnuRun.Caption := Format(TextByKey('main-menu-script-run2'), [s]); + btnRunScript.Hint := Format(TextByKey('main-menu-script-run2'), [s]); + ScriptEditor.Caption := s; + ScriptEditor.RunScript; + end else + TMenuItem(Sender).Enabled := False; +end; + +procedure TMainForm.ScriptItemClick(Sender: TObject); +var + s: string; +begin + s := AppPath + 'Scripts\' + TMenuItem(Sender).Caption; + // AV: fixed Apo7X bug that didn't recognize the new extension + if TMenuItem(Sender).Tag = 1 then + s := s + '.aposcript' + else + s := s + '.asc'; + if FileExists(s) then + begin + Script := s; + ScriptEditor.Editor.Lines.LoadFromFile(Script); + s := ExtractFileName(Script); + s := RemoveExt(s); + mnuRun.Caption := Format(TextByKey('main-menu-script-run2'), [s]); + btnRunScript.Hint := Format(TextByKey('main-menu-script-run2'), [s]); + ScriptEditor.Caption := s; + ScriptEditor.RunScript; + end else // if the script was removed or renamed + TMenuItem(Sender).Visible := False; +end; + +procedure TMainForm.GetScripts; +var + NewItem, NewItem2, MenuItem: TMenuItem; + searchResult: TSearchRec; + i: integer; + s, path, path1: string; + sl: TStringList; +begin + + sl := TStringList.Create; + if FileExists(AppPath + scriptFavsFilename) then + begin + Favorites.LoadFromFile(AppPath + scriptFavsFilename); + if Trim(Favorites.Text) <> '' then + begin + if Favorites.count <> 0 then + begin + FavouriteScripts1.Enabled := True; + FavouriteScripts1.Clear; // AV: refresh the menu everytime it updates + for i := 0 to Favorites.Count - 1 do + begin + if FileExists(Favorites[i]) then + begin + NewItem := TMenuItem.Create(FavouriteScripts1); // (Self); + if i < 12 then + NewItem.ShortCut := TextToShortCut('Ctrl+F' + IntToStr(i + 1)); + NewItem.Tag := i; + s := ExtractFileName(Favorites[i]); + sl.Add(s); + s := RemoveExt(s); + + MenuItem := Directory1.Find(s); // check the default folder + if (MenuItem <> nil) then + begin + path := LowerCase(ExtractFilePath(Favorites[i])); + if (path = LowerCase(AppPath + 'scripts\')) then + MenuItem.Free; + end; + + NewItem.Caption := s; + NewItem.Hint := Format(TextByKey('main-menu-script-run3'), [s]); + NewItem.OnClick := FavoriteClick; + OnClick := FavoriteClick; + FavouriteScripts1.Add(NewItem); + end; + end; + end; + Directory1.Caption := TextByKey('main-menu-script-more'); + end + else begin // disable unused items + FavouriteScripts1.Enabled := False; + Directory1.Caption := TextByKey('main-menu-script-directory'); + end; + end; + + // Try to find regular files matching *.asc in the scripts dir + path := AppPath + 'Scripts\*.asc'; + if FindFirst(path, faAnyFile, searchResult) = 0 then + begin + Directory1.Enabled := True; + repeat + NewItem2 := TMenuItem.Create(Directory1); // (Self); + s := searchResult.Name; + if (sl.IndexOf(s) < 0) then + begin + s := RemoveExt(s); + NewItem2.AutoHotkeys := maManual; // AV: to prevent underlined letters + NewItem2.Caption := s; + NewItem2.Hint := Format(TextByKey('main-menu-script-run3'), [s]); + NewItem2.OnClick := ScriptItemClick; + if (Directory1.Find(s) = nil) then Directory1.Add(NewItem2); + end; + until (FindNext(searchResult) <> 0); + FindClose(searchResult); + end; + // AV: the same procedure for new extensions + path := AppPath + 'Scripts\*.aposcript'; + if FindFirst(path, faAnyFile, searchResult) = 0 then + begin + Directory1.Enabled := True; + repeat + NewItem2 := TMenuItem.Create(Directory1); // (Self); + s := searchResult.Name; + if (sl.IndexOf(s) < 0) then + begin + s := RemoveExt(s); + NewItem2.AutoHotkeys := maManual; // AV: to prevent underlined letters + NewItem2.Caption := s; + NewItem2.Tag := 1; // AV: to identify scripts with different extensions + NewItem2.Hint := Format(TextByKey('main-menu-script-run3'), [s]); + NewItem2.OnClick := ScriptItemClick; + if (Directory1.Find(s) = nil) then Directory1.Add(NewItem2); + end; + until (FindNext(searchResult) <> 0); + FindClose(searchResult); + end; + if (Directory1.Count = 0) then Directory1.Enabled := False; // AV + sl.Free; +end; + +procedure TMainForm.FormCreate(Sender: TObject); +var + dte: string; + cmdl : TCommandLine; + Registry: TRegistry; + apoUI: string; + Layouts: array[0..7] of THandle; + lnum, i: byte; + ExtSM: HMenu; + extStyle: TSearchRec; +begin + ApophysisSVN := APP_VERSION; + AppVersionString := APP_NAME +' '+ APP_VERSION; + + SubstSource := TStringList.Create; + SubstTarget := TStringList.Create; + + CreateSubstMap; + TbBreakWidth := 802; + + ListXmlScanner := TEasyXmlScanner.Create(nil); + XmlScanner := TXmlScanner.Create(nil); + + MainForm.ListXmlScanner.Normalize := False; + MainForm.ListXmlScanner.OnStartTag := ListXmlScannerStartTag; + + MainForm.XmlScanner.Normalize := False; + MainForm.XmlScanner.OnContent := XmlScannerContent; + MainForm.XmlScanner.OnEmptyTag := XMLScannerEmptyTag; + MainForm.XmlScanner.OnEndTag := XmlScannerEndTag; + MainForm.XmlScanner.OnStartTag := XMLScannerStartTag; + + AppPath := ExtractFilePath(Application.ExeName); // AV: moved here + ReadSettings; + + InternalBitsPerSample := 0; // AV: now unused + // renderBitsPerSample := 0; + + //SaveSettings; + LoadLanguage(LanguageFile); + InsertStrings; + + AvailableLanguages := TStringList.Create; + AvailableLanguages.Add(''); + ListLanguages; + + MissingPluginList := TStringList.Create; // AV + + C_SyncDllPlugins; + + cmdl := TCommandLine.Create; + cmdl.Load; + + if (NXFORMS > 100) then + AppVersionString := AppVersionString + ' (' + TextByKey('main-common-title-t500') + ')' + else if (NXFORMS < 100) or (cmdl.Lite) then + AppVersionString := AppVersionString + ' (' + TextByKey('main-common-title-lite') + ')'; + + SplashWindow.SetInfo(TextByKey('splash-loadingui')); + + { //*************** GUI Style Stuff *****************************// } + + // AV: trying to load externals GUI styles + apoUI := AppPath + 'Styles\'; + if FindFirst(apoUI + '*.vsf', faAnyFile, extStyle) = 0 then + begin + repeat + if TStyleManager.IsValidStyle(apoUI + extStyle.Name) then + TStyleManager.LoadFromFile(apoUI + extStyle.Name); + until (FindNext(extStyle) <> 0); + FindClose(extStyle); + end; + + { AV: Read Apophysis style name from registry } + Registry := TRegistry.Create; + try + Registry.RootKey := HKEY_CURRENT_USER; + if Registry.OpenKey('\Software\' + APP_NAME + '\Defaults', False) then + if Registry.ValueExists('UIStyle') then begin + apoUI := Registry.ReadString('UIStyle'); + TStyleManager.TrySetStyle(apoUI, false); + end; + Registry.CloseKey; + finally + Registry.Free; + end; + + CreateStyleList; // create Apo GUI style menu... + ApplyThemedColors; // AV + + { //******************************************************************// } + + Screen.Cursors[crEditArrow] := LoadCursor(HInstance, 'ARROW_WHITE'); + Screen.Cursors[crEditMove] := LoadCursor(HInstance, 'MOVE_WB'); + Screen.Cursors[crEditRotate] := LoadCursor(HInstance, 'ROTATE_WB'); + Screen.Cursors[crEditScale] := LoadCursor(HInstance, 'SCALE_WB'); + Caption := AppVersionString + APP_BUILD; + + mnuExportFLame.Enabled := FileExists(flam3Path); + mnuExportChaotica.Enabled := FileExists(chaoticaPath + '\chaotica.exe'); + + // AV: hack for creating screenshots of Apo windows + ExtSM := GetSystemMenu(Handle, False); + InsertMenu(ExtSM, UINT(5), MF_ByPosition or MF_Separator, 0, nil); + InsertMenu(ExtSM, UINT(6), MF_ByPosition, $C0, PChar(TextByKey('main-menu-screenshot'))); + + FMouseMoveState := msDrag; + LimitVibrancy := False; + Favorites := TStringList.Create; + GetScripts; + Randomize; + MainSeed := Random(123456789); + maincp := TControlPoint.Create; + ParseCp := TControlPoint.create; + MemCp := TControlPoint.Create; // AV + OpenFileType := ftXML; + Application.OnHint := DisplayHint; + CanDrawOnResize := False; + + SplashWindow.SetInfo(TextByKey('splash-loadingsettings')); + + Dte := FormatDateTime('yymmdd', Now); + if Dte <> RandomDate then + RandomIndex := 0; + RandomDate := Dte; + mnuExit.ShortCut := TextToShortCut('Alt+F4'); + + defKB := Screen.DefaultKbLayout; + if SetEngLayout then // AV: switch to English language if needed + begin + lnum := GetKeyboardLayoutList(High(Layouts) + 1, Layouts); + for i := 0 to lnum-1 do + if (LoWord(Layouts[i]) and $FF) = Lang_English then + begin + ActivateKeyboardLayout(Layouts[i], 0); + PInteger(@Screen.DefaultKbLayout)^ := -1; // AV: hack - to rewrite a read-only value + break; + end; + end; + + SplashWindow.SetInfo(TextByKey('splash-loadingplugins')); + FillVariantMenu; + + tbQualityBox.Text := FloatToStr(defSampleDensity); + tbShowAlpha.Down := ShowTransparency; + DrawSelection := true; + FViewScale := 1; + + { ************ AV: setting flame thumbnails properties *************} + case ThumbPrevQual of + 0: begin + TThumbnailThread.FPreviewDensity := prevLowQuality; + mnuLowQuality.Checked := True; + end; + 1: begin + TThumbnailThread.FPreviewDensity := prevMediumQuality; + mnuMediumQuality.Checked := True; + end; + 2: begin + TThumbnailThread.FPreviewDensity := prevHighQuality; + mnuHighQuality.Checked := True; + end; + else TThumbnailThread.FPreviewDensity := 1; // just in case... + end; + + ThumbnailPlaceholder := TBitmap.Create; // AV + SetThumbnailProperties; // AV + // AV: deleted duplicated image lists to reduce memory allocation + ListView1.LargeImages := UsedThumbnails; + // AV: to prevent updating flame list before it's created + GeneratingThumbs := True; + + { *******************************************************************} + + if not cmdl.Lite then + begin + if ClassicListMode = true then + btnViewListClick(nil) + else + btnViewIconsClick(nil); + end else + begin // AV: Lite version from command line cannot change NXFORM const :( + ListView1.ViewStyle := vsReport; + ToolBar.Perform(CM_CONTROLCHANGE, WPARAM(btnViewList), 0); + ToolBar.Perform(CM_CONTROLCHANGE, WPARAM(btnViewIcons), 0); + ToolBar.Perform(CM_CONTROLCHANGE, WPARAM(ToolButton9), 0); + TbBreakWidth := TbBreakWidth - (2 * 26 + 1 * 8); + end; + cmdl.Free; // <-- AV: fixed memory leak + + SaveSettings; // AV: moved back from top to the end +end; + +procedure TMainForm.FormShow(Sender: TObject); +var + Registry: TRegistry; + i: integer; + index: integer; + mins:integer; + cmdl : TCommandLine; + fn, flameXML : string; + openScript: string; + autoScript: TStringList; // AV +begin + tbGuides.Down := EnableGuides; + + { Read position from registry } + Registry := TRegistry.Create; + try + Registry.RootKey := HKEY_CURRENT_USER; + if Registry.OpenKey('\Software\' + APP_NAME + '\Forms\Main', False) then + begin + if Registry.ValueExists('Left') then + MainForm.Left := Registry.ReadInteger('Left'); + if Registry.ValueExists('Top') then + MainForm.Top := Registry.ReadInteger('Top'); + if Registry.ValueExists('Width') then + MainForm.Width := Registry.ReadInteger('Width'); + if Registry.ValueExists('Height') then + MainForm.Height := Registry.ReadInteger('Height'); + if Registry.ValueExists('SortFlames') then // AV + begin + if Registry.ReadBool('SortFlames') then SortFlames.Click; + end; + if Registry.ValueExists('EnumerateFlames') then // AV + EnumerateFlames.Checked := Registry.ReadBool('EnumerateFlames'); + end; + Registry.CloseKey; + + if Registry.OpenKey('\Software\' + APP_NAME + '\Defaults', False) then + begin // AV + if Registry.ValueExists('RandBackColor') then + RandBackColor := Registry.ReadInteger('RandBackColor') + else RandBackColor := 0; // AV + end; + Registry.CloseKey; + finally + Registry.Free; + end; + { Synchronize menus etc..} + // should be defaults.... + SplashWindow.SetInfo(TextByKey('splash-initrenderer')); + UndoIndex := 0; + UndoMax := 0; + index := 1; + ListView1.RowSelect := True; + inc(MainSeed); + RandSeed := MainSeed; + Variation := vRandom; + Maincp.brightness := defBrightness; + maincp.contrast := defContrast; // AV + maincp.gamma := defGamma; + maincp.vibrancy := defVibrancy; + maincp.sample_density := defSampleDensity; + maincp.spatial_oversample := defOversample; + maincp.spatial_filter_radius := defFilterRadius; + maincp.gammaThreshRelative := defGammaThreshold; + + if KeepBackGround and (RandBackColor <> 0) then begin // AV + maincp.background[0] := RandBackColor and 255; + maincp.background[1] := RandBackColor shr 8 and 255; + maincp.background[2] := RandBackColor shr 16 and 255; + end; + + inc(MainSeed); + RandSeed := MainSeed; + +// somehow this doesn't work: +// Image.Width := BackPanel.Width - 2; +// Image.Height := BackPanel.Height - 2; + +// so we'll do it 'bad' way ;-) + Image.Align := alNone; + + SplashWindow.SetInfo(TextByKey('splash-initcolormap')); + if FileExists(AppPath + 'Gradients\default.map') then + begin + DefaultPalette := GradientBrowser.LoadFractintMap(AppPath + 'Gradients\default.map'); + maincp.cmap := DefaultPalette; + end + else + begin + cmap_index := random(NRCMAPS); + GetCMap(cmap_index, 1, maincp.cmap); + DefaultPalette := maincp.cmap; + end; + if FileExists(AppPath + randFilename) then + DeleteFile(AppPath + randFilename); + + cmdl := TCommandLine.Create; + cmdl.Load; + + openScript := ''; + + // get filename from command line argument + SplashWindow.SetInfo(TextByKey('splash-initbatch')); + if ParamCount > 0 then + openFile := ParamStr(1) + else + openFile := defFlameFile; + + if ((openFile = '') or (not FileExists(openFile))) and RememberLastOpenFile then begin + openFile := LastOpenFile; + index := LastOpenFileEntry; + end; + + // if FileExists(openFile) and ((LowerCase(ExtractFileExt(OpenFile)) <> '.asc') or (LowerCase(ExtractFileExt(OpenFile)) <> '.aposcript')) then begin + // AV: something's wrong here... + if FileExists(openFile) and (not ((LowerCase(ExtractFileExt(OpenFile)) = '.asc') or (LowerCase(ExtractFileExt(OpenFile)) = '.aposcript'))) then begin + LastOpenFile := openFile; + LastOpenFileEntry := index; + end; + + // if (openFile = '') or (not FileExists(openFile)) and ((LowerCase(ExtractFileExt(OpenFile)) <> '.asc') or (LowerCase(ExtractFileExt(OpenFile)) <> '.aposcript')) then + // AV: something's wrong here... + if (openFile = '') or (not FileExists(openFile)) and + (not ((LowerCase(ExtractFileExt(OpenFile)) = '.asc') or (LowerCase(ExtractFileExt(OpenFile)) = '.aposcript'))) then + begin + MainCp.Width := Image.Width; + MainCp.Height := Image.Height; + RandomBatch; + if APP_BUILD = '' then + MainForm.Caption := AppVersionString + ' - ' + TextByKey('main-common-randombatch') + else + MainForm.Caption := AppVersionString + ' ' + APP_BUILD + ' - ' + TextByKey('main-common-randombatch'); + OpenFile := AppPath + randFilename; + ListXML(OpenFile, 1); + OpenFileType := ftXML; + if batchsize = 1 then DrawFlame; + end + else + begin + if (LowerCase(ExtractFileExt(OpenFile)) = '.apo') or (LowerCase(ExtractFileExt(OpenFile)) = '.undo') then + begin + ListFlames(OpenFile, 1); + OpenFileType := ftFla; + end else + if (LowerCase(ExtractFileExt(OpenFile)) = '.asc') or (LowerCase(ExtractFileExt(OpenFile)) = '.aposcript') then + begin + openScript := OpenFile; + RandomBatch; + if APP_BUILD = '' then + MainForm.Caption := AppVersionString + ' - ' + TextByKey('main-common-randombatch') + else + MainForm.Caption := AppVersionString + ' ' + APP_BUILD + ' - ' + TextByKey('main-common-randombatch'); + OpenFile := AppPath + randFilename; + ListXML(OpenFile, 1); + OpenFileType := ftXML; + if batchsize = 1 then DrawFlame; + end else begin + ListXML(OpenFile, 2); + OpenFileType := ftXML; + MainForm.ListView1.Selected := MainForm.ListView1.Items[index - 1]; + end; + if APP_BUILD = '' then MainForm.Caption := AppVersionString + ' - ' + openFile + else MainForm.Caption := AppVersionString + ' ' + APP_BUILD + ' - ' + openFile; + end; + ListView1.SetFocus; // AV + CanDrawOnResize := True; + Statusbar.Panels[3].Text := maincp.name; + + AdjustForm.cmbPalette.Items.clear; + for i := 0 to NRCMAPS -1 do + AdjustForm.cmbPalette.Items.Add(cMapnames[i]); + AdjustForm.cmbPalette.ItemIndex := 0; + + // ExportDialog.cmbDepth.ItemIndex := 2; // AV: changed inside ExportForm + // DoNotAskAboutChange := false; + + if (AutoSaveFreq = 0) then mins := 1 + else if (AutoSaveFreq = 1) then mins := 2 + else if (AutoSaveFreq = 2) then mins := 5 + else if (AutoSaveFreq = 3) then mins := 10 + else begin + mins := 5; + AutoSaveFreq := 2; + AutoSaveEnabled := false; + end; + + AutoSaveTimer.Interval := 60 * 1000 * mins; + AutoSaveTimer.Enabled := AutoSaveEnabled; + + // loading done..now do what is told by cmdline ... + if (cmdl.CreateFromTemplate) then begin + if FileExists(cmdl.TemplateFile) then begin + fn := cmdl.TemplateFile; + flameXML := LoadXMLFlameText(fn, cmdl.TemplateName); + UpdateUndo; + + ScriptEditor.Stopped := True; + + StopThread; + InvokeLoadXML(flameXML); + Transforms := MainCp.TrianglesFromCP(MainTriangles); + Statusbar.Panels[3].Text := MainCp.name; + ResizeImage; + RedrawTimer.Enabled := True; + Application.ProcessMessages; + UpdateWindows; + //AdjustForm.TemplateRandomizeGradient; + AdjustForm.mnuRandomize.Click; + end; + end; + cmdl.Free; // <-- AV: fixed memory leak + + // .. and run autoexec.asc + SplashWindow.SetInfo(TextByKey('splash-execstartupscript')); + if (FileExists(AppPath + 'autoexec.asc')) then + begin + // AV: first we must check that the file is not empty + autoScript := TStringList.Create; + autoScript.LoadFromFile(AppPath + 'autoexec.asc'); + if Trim(autoScript.Text) <> '' then // AV + begin + ScriptEditor.LoadRunAndClear(AppPath + 'autoexec.asc'); + mnuRun.Caption := TextByKey('main-menu-script-run'); + btnRunScript.Hint := TextByKey('main-menu-script-run'); + end; + autoScript.Free; + end; + + if (openScript <> '') then begin + ScriptEditor.LoadScriptFile(openScript); + ScriptEditor.Show; + end; + + if ScriptEditor.Editor.IsEmpty then // AV: is there any code? + begin + mnuStop.Enabled := False; + btnStopScript.Enabled := False; + end; + + SplashWindow.Hide; + SplashWindow.Free; +end; + +function TMainForm.SystemErrorMessage: string; +var + P: PChar; +begin + if FormatMessage(Format_Message_Allocate_Buffer + Format_Message_From_System, + nil, + GetLastError, + 0, + @P, + 0, + nil) <> 0 then + begin + Result := P; + LocalFree(Integer(P)) + end + else + Result := ''; +end; + +function TMainForm.SystemErrorMessage2(errno: cardinal): string; +var + P: PChar; +begin + if FormatMessage(Format_Message_Allocate_Buffer + Format_Message_From_System, + nil, + errno, + 0, + @P, + 0, + nil) <> 0 then + begin + Result := P; + LocalFree(Integer(P)) + end + else + Result := ''; +end; + +procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction); +var + Registry: TRegistry; +begin + if ConfirmExit and (UndoIndex <> 0) then + if Application.MessageBox(PChar(TextByKey('common-confirmexit')), 'Apophysis', MB_ICONWARNING or MB_YESNO) <> IDYES then + begin + Action := caNone; + exit; + end; + + if ScriptEditor.btnPause.Down then ScriptEditor.btnPause.Click; // AV + ScriptEditor.Stopped := True; + + HtmlHelp(0, nil, HH_CLOSE_ALL, 0); + { To capture secondary window positions } + if EditForm.visible then EditForm.Close; + if AdjustForm.visible then AdjustForm.close; + if GradientBrowser.visible then GradientBrowser.close; + if MutateForm.visible then MutateForm.Close; + if ScriptEditor.visible then ScriptEditor.Close; + + { Stop the render thread } + if assigned(Renderer) then Renderer.Terminate; + if assigned(Renderer) then Renderer.WaitFor; + + if RenderForm.Visible then RenderForm.Close; + + { Write position to registry } + Registry := TRegistry.Create; + try + Registry.RootKey := HKEY_CURRENT_USER; + if Registry.OpenKey('\Software\' + APP_NAME + '\Forms\Main', True) then + begin + if MainForm.WindowState <> wsMaximized then begin + Registry.WriteInteger('Top', MainForm.Top); + Registry.WriteInteger('Left', MainForm.Left); + Registry.WriteInteger('Width', MainForm.Width); + Registry.WriteInteger('Height', MainForm.Height); + end; + Registry.WriteBool('SortFlames', SortFlames.Checked); // AV + Registry.WriteBool('EnumerateFlames', EnumerateFlames.Checked); // AV + end; + finally + Registry.Free; + end; + Application.ProcessMessages; + CanDrawOnResize := False; + if FileExists(AppPath + randFilename) then + DeleteFile(AppPath + randFilename); + if FileExists(AppPath + undoFilename) then + DeleteFile(AppPath + undoFilename); + + if KeepBackGround then // AV + RandBackColor := MainCp.background[2] * 65536 + MainCp.background[1] * 256 + MainCp.background[0]; + // AV: remember the flame position if the list was sorted + if assigned(ListView1.Selected) then + LastOpenFileEntry := ListView1.Selected.Index + 1; + + SaveSettings; +end; + +procedure TMainForm.FormDestroy(Sender: TObject); +var i: word; +begin + if assigned(Renderer) then Renderer.Terminate; + if assigned(Renderer) then Renderer.WaitFor; + if assigned(Renderer) then Renderer.Free; + if assigned(FViewImage) then FViewImage.Free; + + ListXmlScanner.Free; // AV: fixed memory leak + XmlScanner.Free; // AV: fixed memory leak + + // AV: all memory leaks with cp.used_plugins are fixed + MainCP.free; + ParseCp.free; + MemCp.free; // AV + Favorites.Free; + + SubstSource.Free; // AV: fixed memory leak + SubstTarget.Free; // AV: fixed memory leak + + MissingPluginList.Free; // AV + + if assigned(ThumbnailPlaceholder) then + begin + ThumbnailPlaceholder.Free; // AV: fixed memory leak + ThumbnailPlaceholder := nil; + end; + + AvailableLanguages.Free; // AV: fixed memory leak + for i := 0 to length(Translation.language) - 1 do + Translation.language[i].Free; // AV: fixed memory leaks + + ActivateKeyboardLayout(defKB, 0); // AV: restore default user's language +end; + +procedure TMainForm.FormKeyPress(Sender: TObject; var Key: Char); +var + scale: double; +begin + if Key = #27 then begin + case FMouseMoveState of + msZoomWindowMove: + FMouseMoveState := msZoomWindow; + msZoomOutWindowMove: + FMouseMoveState := msZoomOutWindow; + msDragMove: + begin + FMouseMoveState := msDrag; + + scale := FViewScale * Image.Width / FViewImage.Width; + FViewPos.X := FViewPos.X - (FClickRect.Right - FClickRect.Left) / scale; + FViewPos.Y := FViewPos.Y - (FClickRect.Bottom - FClickRect.Top) / scale; + end; + msRotateMove: + FMouseMoveState := msRotate; + end; + DrawImageView; + end; + + //ScriptEditor.Stopped := True; +end; + +{ ****************************** Misc controls ****************************** } + +procedure TMainForm.BackPanelResize(Sender: TObject); +begin + StopThread; + if CanDrawOnResize then + reDrawTimer.Enabled := True; + + ResizeImage; + DrawImageView; +end; + + // AV: added the third parameter to prevent multiple updates of the previews +procedure TMainForm.LoadXMLFlame(filename, name: string; upd: boolean = true); +var + i, p: integer; + FileStrings: TStringList; + ParamStrings: TStringList; + Tokens: TStringList; + time: integer; +begin + time := -1; + FileStrings := TStringList.Create; + ParamStrings := TStringList.Create; + + if pos('*untitled', name) <> 0 then + begin + Tokens := TStringList.Create; + GetTokens(name, tokens); + time := StrToInt(tokens[1]); + Tokens.free; + end; + try + FileStrings.LoadFromFile(filename); + for i := 0 to FileStrings.Count - 1 do + begin + pname := ''; + ptime := ''; + p := Pos(' 0) then + begin + MainForm.ListXMLScanner.LoadFromBuffer(TCharType(TStringType(FileStrings[i]))); + MainForm.ListXMLScanner.Execute; + if pname <> '' then + begin + if (Trim(pname) = Trim(name)) then + begin + ParamStrings.Add(FileStrings[i]); + Break; + end; + end + else + begin + if ptime='' then ptime:='0'; //hack + if StrToInt(ptime) = time then + begin + ParamStrings.Add(FileStrings[i]); + Break; + end; + end; + end; + end; + repeat + inc(i); + ParamStrings.Add(FileStrings[i]); + until pos('', Lowercase(FileStrings[i])) <> 0; + + //ScriptEditor.Stopped := True; // AV: I hate this... + // If script preview isnit visible, it's useless, + // otherwise it loads wrong flame from sripter... + + StopThread; + ParseXML(MainCp,ParamStrings.Text, true); + + if upd then + begin // AV: to prevent redrawing when saving a batch + mnuSaveUndo.Enabled := false; + mnuUndo.Enabled := False; + mnuPopUndo.Enabled := False; + mnuRedo.enabled := False; + mnuPopRedo.enabled := False; + EditForm.mnuUndo.Enabled := False; + EditForm.mnuRedo.enabled := False; + EditForm.tbUndo.enabled := false; + EditForm.tbRedo.enabled := false; + AdjustForm.btnUndo.enabled := false; + AdjustForm.btnRedo.enabled := false; + btnUndo.Enabled := false; + btnRedo.enabled := false; + + Transforms := MainCp.TrianglesFromCP(MainTriangles); + + UndoIndex := 0; + UndoMax := 0; + if fileExists(AppPath + undoFilename) then + DeleteFile(AppPath + undoFilename); + Statusbar.Panels[3].Text := Maincp.name; + RedrawTimer.Enabled := True; + Application.ProcessMessages; + + EditForm.SelectedTriangle := 0; // (?) + + UpdateWindows; + end; // end updates + + finally + FileStrings.free; + ParamStrings.free; + end; +end; + +procedure TMainForm.ResizeImage; +var + pw, ph: integer; +begin + pw := BackPanel.Width - 2; + ph := BackPanel.Height - 2; + begin + if (MainCP.Width / MainCP.Height) > (pw / ph) then + begin + Image.Width := pw; + Image.Height := round(MainCP.Height / MainCP.Width * pw); + Image.Left := 1; + Image.Top := (ph - Image.Height) div 2; + end + else begin + Image.Height := ph; + Image.Width := round(MainCP.Width / MainCP.Height * ph); + Image.Top := 1; + Image.Left := (pw - Image.Width) div 2; + end; + end; + //MainCP.AdjustScale(Image.Width, Image.Height); +end; + +procedure TMainForm.ListViewColumnClick(Sender: TObject; Column: TListColumn); +begin // AV + if Column = ListView1.Columns[0] then + SortFlames.Click // sorting flames alphabetically or chronologically + else // if Column = ListView1.Columns[1] then + EnumerateFlames.Click; +end; + +procedure TMainForm.ListPopUpPopup(Sender: TObject); // AV +var + i: byte; + IsSel: boolean; +begin + IsSel := assigned(ListView1.Selected); + mnuListRename.Enabled := IsSel; + mnuItemDelete.Enabled := IsSel; + mnuRefreshThumb.Enabled := IsSel; + + if ClassicListMode then + for i := 2 to 8 do ListPopUp.Items[i].Visible := False + else + for i := 2 to 8 do ListPopUp.Items[i].Visible := True; +end; + +procedure TMainForm.ListViewDblClick(Sender: TObject); +begin + if not (ClassicListMode or ParseLoadingBatch) then UpdateThumbnails; +end; + +procedure TMainForm.ListViewChange(Sender: TObject; Item: TListItem; + Change: TItemChange); +var + FStrings: TStringList; + IFSStrings: TStringList; + EntryStrings, Tokens: TStringList; + SavedPal: Boolean; + i, j: integer; + floatcolor: double; + s: string; + Palette: TcolorMap; + name:string; +begin + if (ListView1.SelCount <> 0) and (Trim(ListView1.Selected.Caption) <> Trim(maincp.name)) then + begin + LastOpenFileEntry := ListView1.Selected.Index + 1; + RedrawTimer.Enabled := False; //? + StopThread; + + if OpenFileType = ftXML then + begin + name := ListView1.Selected.caption; + ParseLoadingBatch := false; + LoadXMLFlame(OpenFile, name); + AnnoyUser; + end + else + begin + SavedPal := false; + //ScriptEditor.Stopped := True; + + FStrings := TStringList.Create; + IFSStrings := TStringList.Create; + Tokens := TStringList.Create; + EntryStrings := TStringList.Create; + try + FStrings.LoadFromFile(OpenFile); + for i := 0 to FStrings.count - 1 do + if Pos(ListView1.Selected.Caption + ' {', Trim(FStrings[i])) = 1 then + break; + IFSStrings.Add(FStrings[i]); + repeat + inc(i); + IFSStrings.Add(FStrings[i]); + until Pos('}', FStrings[i]) <> 0; + maincp.Clear; // initialize control point for new flame; + maincp.background[0] := 0; + maincp.background[1] := 0; + maincp.background[2] := 0; + maincp.sample_density := defSampleDensity; + maincp.spatial_oversample := defOversample; + maincp.spatial_filter_radius := defFilterRadius; + if OpenFileType = ftFla then // AV: Undo flame list + begin + for i := 0 to FStrings.count - 1 do + begin + if Pos(ListView1.Selected.Caption + ' {', Trim(FStrings[i])) = 1 then + break; + end; + inc(i); + while (Pos('}', FStrings[i]) = 0) and (Pos('palette:', FStrings[i]) = 0) do + begin + EntryStrings.Add(FStrings[i]); + inc(i); + end; + if Pos('palette:', FStrings[i]) = 1 then + begin + SavedPal := True; + inc(i); + for j := 0 to 255 do begin + s := FStrings[i]; + GetTokens(s, tokens); + floatcolor := StrToFloat(Tokens[0]); + Palette[j][0] := round(floatcolor); + floatcolor := StrToFloat(Tokens[1]); + Palette[j][1] := round(floatcolor); + floatcolor := StrToFloat(Tokens[2]); + Palette[j][2] := round(floatcolor); + inc(i); + end; + end; + FlameString := EntryStrings.Text; + maincp.ParseString(FlameString); + Transforms := MainCP.NumXForms; + end + else + begin + { Open *.ifs File } + Variation := vLinear; + VarMenus[0].Checked := True; + StringToIFS(IFSStrings.Text); + SetVariation(maincp); + maincp.CalcBoundBox; + end; + Center[0] := maincp.Center[0]; + Center[1] := maincp.Center[1]; + mnuSaveUndo.Enabled := false; + mnuUndo.Enabled := False; + mnuPopUndo.Enabled := False; + mnuRedo.enabled := False; + mnuPopRedo.enabled := False; + EditForm.mnuUndo.Enabled := False; + EditForm.mnuRedo.enabled := False; + EditForm.tbUndo.enabled := false; + EditForm.tbRedo.enabled := false; + AdjustForm.btnUndo.enabled := false; + AdjustForm.btnRedo.enabled := false; + btnUndo.Enabled := false; + btnRedo.enabled := false; + Transforms := MainCp.TrianglesFromCP(MainTriangles); + // Fix Apophysis 1.0 parameters with negative color parameteres! + for i := 0 to Transforms - 1 do + if maincp.xform[i].color < 0 then maincp.xform[i].color := 0; + if SavedPal then maincp.cmap := Palette; + UndoIndex := 0; + UndoMax := 0; + if fileExists(AppPath + undoFilename) then + DeleteFile(AppPath + undoFilename); + maincp.name := ListView1.Selected.Caption; // AV: fixed Apo7X bug + Statusbar.Panels[3].Text := maincp.name; + RedrawTimer.Enabled := True; + Application.ProcessMessages; + UpdateWindows; + finally + IFSStrings.Free; + FStrings.Free; + Tokens.free; + EntryStrings.free; + end; + end; + {if ResizeOnLoad then} + ResizeImage; + end; +end; + +procedure TMainForm.UpdateWindows; +begin + if AdjustForm.visible then AdjustForm.UpdateDisplay; + if EditForm.visible then EditForm.UpdateDisplay; + if MutateForm.visible then MutateForm.UpdateDisplay; + if CurvesForm.Visible then CurvesForm.SetCp(MainCp); +end; + +procedure TMainForm.LoadUndoFlame(index: integer; filename: string); +var + FStrings: TStringList; + IFSStrings: TStringList; + EntryStrings, Tokens: TStringList; + SavedPal: Boolean; + i, j: integer; + s: string; + Palette: TColorMap; +begin + //ScriptEditor.Stopped := True; + + FStrings := TStringList.Create; + IFSStrings := TStringList.Create; + Tokens := TStringList.Create; + EntryStrings := TStringList.Create; + try + FStrings.LoadFromFile(filename); + for i := 0 to FStrings.count - 1 do + if Pos(Format('%.4d-', [UndoIndex]), Trim(FStrings[i])) = 1 then + break; + IFSStrings.Add(FStrings[i]); + repeat + inc(i); + IFSStrings.Add(FStrings[i]); + until Pos('}', FStrings[i]) <> 0; + for i := 0 to FStrings.count - 1 do + begin + if Pos(Format('%.4d-', [UndoIndex]), Trim(Lowercase(FStrings[i]))) = 1 then + break; + end; + inc(i); + while (Pos('}', FStrings[i]) = 0) and (Pos('palette:', FStrings[i]) = 0) do + begin + EntryStrings.Add(FStrings[i]); + inc(i); + end; + SavedPal := false; + if Pos('palette:', FStrings[i]) = 1 then + begin + SavedPal := True; + inc(i); + for j := 0 to 255 do begin + s := FStrings[i]; + GetTokens(s, tokens); + Palette[j][0] := StrToInt(Tokens[0]); + Palette[j][1] := StrToInt(Tokens[1]); + Palette[j][2] := StrToInt(Tokens[2]); + inc(i); + end; + end; + maincp.Clear; + FlameString := EntryStrings.Text; + maincp.zoom := 0; + maincp.center[0] := 0; + maincp.center[0] := 0; + maincp.ParseString(FlameString); + maincp.sample_density := defSampleDensity; + Center[0] := maincp.Center[0]; + Center[1] := maincp.Center[1]; + Transforms := MainCp.TrianglesFromCP(MainTriangles); + // Trim undo index from title + maincp.name := Copy(Fstrings[0], 6, length(Fstrings[0]) - 7); + + if SavedPal then maincp.cmap := palette; + if AdjustForm.visible then AdjustForm.UpdateDisplay; + + RedrawTimer.Enabled := True; + UpdateWindows; + finally + IFSStrings.Free; + FStrings.Free; + Tokens.free; + EntryStrings.free; + end; +end; + +procedure TMainForm.ResetColorSpeedClick(Sender: TObject); +var i: integer; +begin + StopThread; + UpdateUndo; + for i := 0 to Transforms-1 do + maincp.xform[i].symmetry := 0; + RedrawTimer.Enabled := True; + UpdateWindows; +end; + +procedure TMainForm.ResetColorValuesClick(Sender: TObject); +var i: integer; +begin + StopThread; + UpdateUndo; + for i := 0 to Transforms-1 do + maincp.xform[i].color := 0; + RedrawTimer.Enabled := True; + UpdateWindows; +end; + +procedure TMainForm.ResetLocation; +begin + maincp.zoom := 0; + //maincp.FAngle := 0; + //maincp.Width := Image.Width; + //maincp.Height := Image.Height; + maincp.CalcBoundBox; + center[0] := maincp.center[0]; + center[1] := maincp.center[1]; +end; + + +procedure TMainForm.ListViewEdited(Sender: TObject; Item: TListItem; + var S: string); +var Discard: boolean; +begin + if (s <> Item.Caption) then + begin + // AV: fixed 'List index out of bounds' bugs + if (s = '') then + begin + MessageBox(Handle, PChar(TextByKey('save-status-notitle')), PCHar('Apophysis AV'), 48); + Discard := True; + end else if (ListView1.FindCaption(0, s, false, true, false) <> nil) then + begin + MessageBox(Handle, PChar(Format(TextByKey('save-status-alreadyexists3'), + [s])), PChar('Apophysis AV'), 48); + Discard := True; + end + else if OpenFileType = ftXML then + Discard := (not RenameXML(Item.Caption, s)) + else + Discard := (not RenameIFS(Item.Caption, s)); + + if Discard then + s := Item.Caption + else + if SortFlames.Checked and EnumerateFlames.Checked then + EnumerateFlamesClick(EnumerateFlames); + end; +end; + +procedure TMainForm.RedrawTimerTimer(Sender: TObject); +{ Draw flame when timer fires. This seems to stop a lot of errors } +begin + if FMouseMoveState in [msZoomWindowMove, msZoomOutWindowMove, msDragMove, msRotateMove] then exit; + + RedrawTimer.enabled := False; + DrawFlame; +end; + +procedure TMainForm.mnuVRandomClick(Sender: TObject); +var i: integer; +begin + mnuVRandom.Checked := True; + // AV: only one variation can be active here + for i := 0 to NRVAR - 1 do + VarMenus[i].Checked := False; + mnuBuiltinVars.Checked := False; + mnuPluginVars.Checked := False; + StopThread; + UpdateUndo; + inc(MainSeed); + RandSeed := MainSeed; + repeat + Variation := vRandom; + SetVariation(maincp); + until not maincp.blowsup(1000); + inc(randomindex); + MainCp.name := RandomPrefix + RandomDate + '-' + + IntToStr(RandomIndex); + ResetLocation; + RedrawTimer.Enabled := True; + UpdateWindows; +end; + +procedure TMainForm.mnuGradClick(Sender: TObject); +begin + AdjustForm.UpdateDisplay; + AdjustForm.PageControl.TabIndex:=2; + AdjustForm.Show; +end; + +/////////////////////////////////////////////////////////////////////////////// + +procedure swapcolor(var clist: array of cardinal; i, j: integer); +var + t: cardinal; +begin + t := clist[j]; + clist[j] := clist[i]; + clist[i] := t; +end; + +function diffcolor(clist: array of cardinal; i, j: integer): cardinal; +var + r1, g1, b1, r2, g2, b2: byte; +begin + r1 := clist[j] and 255; + g1 := clist[j] shr 8 and 255; + b1 := clist[j] shr 16 and 255; + r2 := clist[i] and 255; + g2 := clist[i] shr 8 and 255; + b2 := clist[i] shr 16 and 255; + Result := abs((r1 - r2) * (r1 - r2)) + abs((g1 - g2) * (g1 - g2)) + + abs((b1 - b2) * (b1 - b2)); +end; + +procedure TMainForm.mnuSmoothGradientClick(Sender: TObject); +begin + SmoothPalette; +end; + +procedure TMainForm.SmoothPalette; +{ From Draves' Smooth palette Gimp plug-in } +var + Bitmap: TBitMap; + JPEG: TJPEGImage; + pal: TColorMap; + strings: TStringlist; + ident, FileName: string; + len, len_best, as_is, swapd: cardinal; + cmap_best, original, clist: array[0..255] of cardinal; + {p, total,} j, rand, tryit, i0, i1, x, y, i, iw, ih: integer; + fn: string; +begin + //Total := Trunc(NumTries * TryLength / 100); + //p := 0; + Bitmap := TBitmap.Create; + JPEG := TJPEGImage.Create; + strings := TStringList.Create; + try + begin + inc(MainSeed); + RandSeed := MainSeed; + OpenDialog.Filter := Format('%s|*.bmp;*.dib;*.jpg;*.jpeg|%s|*.bmp;*.dib|%s|*.jpg;*.jpeg|%s|*.*', + [TextByKey('common-filter-allimages'), TextByKey('common-filter-bitmap'), + TextByKey('common-filter-jpeg'), TextByKey('common-filter-allfiles')]); + OpenDialog.InitialDir := ImageFolder; + OpenDialog.Title := TextByKey('common-browse'); + OpenDialog.FileName := ''; + if OpenSaveFileDialog(MainForm, OpenDialog.DefaultExt, OpenDialog.Filter, OpenDialog.InitialDir, TextByKey('common-browse'), fn, true, false, false, true) then + begin + OpenDialog.FileName := fn; + ImageFolder := ExtractFilePath(OpenDialog.FileName); + Application.ProcessMessages; + len_best := 0; + if (UpperCase(ExtractFileExt(Opendialog.FileName)) = '.BMP') + or (UpperCase(ExtractFileExt(Opendialog.FileName)) = '.DIB') then + Bitmap.LoadFromFile(Opendialog.FileName); + if (UpperCase(ExtractFileExt(Opendialog.FileName)) = '.JPG') + or (UpperCase(ExtractFileExt(Opendialog.FileName)) = '.JPEG') then + begin + JPEG.LoadFromFile(Opendialog.FileName); + with Bitmap do + begin + Width := JPEG.Width; + Height := JPEG.Height; + Canvas.Draw(0, 0, JPEG); + end; + end; + iw := Bitmap.Width; + ih := Bitmap.Height; + for i := 0 to 255 do + begin + { Pick colors from 256 random pixels in the image } + x := random(iw); + y := random(ih); + clist[i] := Bitmap.canvas.Pixels[x, y]; + end; + original := clist; + cmap_best := clist; + for tryit := 1 to NumTries do + begin + clist := original; + // scramble + for i := 0 to 255 do + begin + rand := random(256); + swapcolor(clist, i, rand); + end; + // measure + len := 0; + for i := 0 to 255 do + len := len + diffcolor(clist, i, i + 1); + // improve + for i := 1 to TryLength do + begin + //inc(p); + // StatusBar.SimpleText := Format(TextByKey('main-status-calculatingpalette'), [p div total]); + i0 := 1 + random(254); + i1 := 1 + random(254); + if ((i0 - i1) = 1) then + begin + as_is := diffcolor(clist, i1 - 1, i1) + diffcolor(clist, i0, i0 + 1); + swapd := diffcolor(clist, i1 - 1, i0) + diffcolor(clist, i1, i0 + 1); + end + else if ((i1 - i0) = 1) then + begin + as_is := diffcolor(clist, i0 - 1, i0) + diffcolor(clist, i1, i1 + 1); + swapd := diffcolor(clist, i0 - 1, i1) + diffcolor(clist, i0, i1 + 1); + end + else + begin + as_is := diffcolor(clist, i0, i0 + 1) + diffcolor(clist, i0, i0 - 1) + + diffcolor(clist, i1, i1 + 1) + diffcolor(clist, i1, i1 - 1); + swapd := diffcolor(clist, i1, i0 + 1) + diffcolor(clist, i1, i0 - 1) + + diffcolor(clist, i0, i1 + 1) + diffcolor(clist, i0, i1 - 1); + end; + if (swapd < as_is) then + begin + swapcolor(clist, i0, i1); + len := abs(len + swapd - as_is); + end; + end; + if (tryit = 1) or (len < len_best) then + begin + cmap_best := clist; + len_best := len; + end; + end; + clist := cmap_best; + // clean + for i := 1 to 1024 do + begin + i0 := 1 + random(254); + i1 := i0 + 1; + as_is := diffcolor(clist, i0 - 1, i0) + diffcolor(clist, i1, i1 + 1); + swapd := diffcolor(clist, i0 - 1, i1) + diffcolor(clist, i0, i1 + 1); + if (swapd < as_is) then + begin + swapcolor(clist, i0, i1); + len_best := len_best + swapd - as_is; + end; + end; + { Convert to TColorMap, Gradient and save } + FileName := lowercase(ExtractFileName(Opendialog.FileName)); + ident := CleanEntry(FileName); + strings.add(ident + ' {'); + strings.add('gradient:'); + strings.add(' title="' + CleanUPRTitle(FileName) + '" smooth=no'); + for i := 0 to 255 do + begin + pal[i][0] := clist[i] and 255; + pal[i][1] := clist[i] shr 8 and 255; + pal[i][2] := clist[i] shr 16 and 255; + j := round(i * (399 / 255)); + strings.Add(' index=' + IntToStr(j) + ' color=' + intToStr(clist[i])); + end; + strings.Add('}'); + if not DirectoryExists(ExtractFilePath(defSmoothPaletteFile)) then // AV + begin + CreateDir(AppPath + 'Gradients\'); + defSmoothPaletteFile := AppPath + 'Gradients\SmoothPalette.ugr'; + end; + SaveGradient(Strings.Text, Ident, defSmoothPaletteFile); + + StopThread; + UpdateUndo; + maincp.cmap := Pal; + maincp.cmapindex := -1; + AdjustForm.UpdateDisplay; + + if EditForm.Visible then EditForm.UpdateDisplay; + if MutateForm.Visible then MutateForm.UpdateDisplay; + RedrawTimer.enabled := true; + + end; + // StatusBar.SimpleText := ''; + end; + finally + Bitmap.Free; + JPEG.Free; + strings.Free; + end; +end; + +procedure TMainForm.SortFlamesClick(Sender: TObject); +begin + StopThread; + SortFlames.Checked := not SortFlames.Checked; + if SortFlames.Checked then + begin + ListView1.SortType := stText; + // AV: to use Morph scripting method properly + ScriptForm.FileList.Sorted := True; + if ListView1.Items.Count > 1 then ListView1.AlphaSort; + EnumerateFlamesClick(EnumerateFlames); + end + else begin + ListView1.SortType := stNone; + ScriptForm.FileList.Sorted := False; + if (OpenFile <> '') then + if OpenFileType = ftXML then + begin + if assigned(ListView1.Selected) then + ListXML(OpenFile, 2, ListView1.Selected.Caption) + else + ListXML(OpenFile, 1); + end; + end; +end; + +procedure TMainForm.Smoothize(const oldpal: TColorMap; const a, b: byte); +{ AV: this one applies Smooth palette to the current gradient or its part } +var + pal: TColorMap; + len, len_best, as_is, swapd: cardinal; + cmap_best, original, clist: array[0..255] of cardinal; + rand, tryit, i0, i1, i: integer; +begin + try + inc(MainSeed); + RandSeed := MainSeed; + Application.ProcessMessages; + len_best := 0; + for i := 0 to 255 do + clist[i] := OldPal[i, 2] * 65536 + OldPal[i, 1] * 256 + oldpal[i, 0]; + original := clist; + cmap_best := clist; + for tryit := 1 to NumTries do + begin + clist := original; + // scramble + for i := a to b do + begin + { Pick color from randomly selected index of the palette } + rand := a + random(b - a + 1); // random(256); + swapcolor(clist, i, rand); + end; + // measure + len := 0; + for i := a to b do + len := len + diffcolor(clist, i, i + 1); + // improve + for i := 1 to TryLength do + begin + i0 := a + 1 + random(b - a - 1); // 1 + random(254); + i1 := a + 1 + random(b - a - 1); // 1 + random(254); + if ((i0 - i1) = 1) then + begin + as_is := diffcolor(clist, i1 - 1, i1) + diffcolor(clist, i0, i0 + 1); + swapd := diffcolor(clist, i1 - 1, i0) + diffcolor(clist, i1, i0 + 1); + end + else if ((i1 - i0) = 1) then + begin + as_is := diffcolor(clist, i0 - 1, i0) + diffcolor(clist, i1, i1 + 1); + swapd := diffcolor(clist, i0 - 1, i1) + diffcolor(clist, i0, i1 + 1); + end + else + begin + as_is := diffcolor(clist, i0, i0 + 1) + diffcolor(clist, i0, i0 - 1) + + diffcolor(clist, i1, i1 + 1) + diffcolor(clist, i1, i1 - 1); + swapd := diffcolor(clist, i1, i0 + 1) + diffcolor(clist, i1, i0 - 1) + + diffcolor(clist, i0, i1 + 1) + diffcolor(clist, i0, i1 - 1); + end; + if (swapd < as_is) then + begin + swapcolor(clist, i0, i1); + len := abs(len + swapd - as_is); + end; + end; + if (tryit = 1) or (len < len_best) then + begin + cmap_best := clist; + len_best := len; + end; + end; + clist := cmap_best; + // clean + for i := 1 to 1024 do + begin + i0 := a + 1 + random(b - a - 1); // 1 + random(254); + i1 := i0 + 1; + as_is := diffcolor(clist, i0 - 1, i0) + diffcolor(clist, i1, i1 + 1); + swapd := diffcolor(clist, i0 - 1, i1) + diffcolor(clist, i0, i1 + 1); + if (swapd < as_is) then + begin + swapcolor(clist, i0, i1); + len_best := len_best + swapd - as_is; + end; + end; + { Convert to TColorMap } + for i := 0 to 255 do + begin + pal[i][0] := clist[i] and 255; + pal[i][1] := clist[i] shr 8 and 255; + pal[i][2] := clist[i] shr 16 and 255; + end; + + StopThread; + UpdateUndo; + maincp.cmap := Pal; + maincp.cmapindex := -1; + AdjustForm.UpdateDisplay; + + if EditForm.Visible then EditForm.UpdateDisplay; + if MutateForm.Visible then MutateForm.UpdateDisplay; + RedrawTimer.enabled := true; + + finally + end; +end; + +procedure TMainForm.mnuThumbnailQualityClick(Sender: TObject); // AV +begin + if TMenuItem(Sender).Checked then exit; // prevent unneseccary updating + TMenuItem(Sender).Checked := True; + + case TMenuItem(Sender).Tag of + 0: TThumbnailThread.FPreviewDensity := prevMediumQuality; + 1: TThumbnailThread.FPreviewDensity := prevMediumQuality; + 2: TThumbnailThread.FPreviewDensity := prevHighQuality; + end; + ThumbPrevQual := TMenuItem(Sender).Tag; + + // refresh the list of flame previews + if (OpenFile <> '') and (OpenFileType = ftXML) then + if not ParseLoadingBatch then UpdateThumbnails; +end; + +procedure TMainForm.mnuToolbarClick(Sender: TObject); +begin + Toolbar.Visible := not Toolbar.Visible; + mnuToolbar.Checked := Toolbar.visible; +end; + +procedure TMainForm.mnuTraceClick(Sender: TObject); +begin + TraceForm.Show; +end; + +procedure TMainForm.mnuStatusBarClick(Sender: TObject); +begin + // Statusbar.Visible := not Statusbar.Visible; + // AV: fixed Apo7X bug - someone forget to hide other components... + BottomDock.Visible := not BottomDock.Visible; // AV + mnuStatusbar.Checked := BottomDock.Visible; // Statusbar.visible; +end; + +procedure TMainForm.mnuFileContentsClick(Sender: TObject); +begin + ListBackPanel.Visible := not ListBackPanel.Visible; + mnuFileContents.Checked := ListBackPanel.Visible; // ListView1.Visible; + if ListBackPanel.Visible then + Splitter.Width := 4 + else + Splitter.Width := 0; +end; + +procedure TMainForm.Undo; +begin + if UndoIndex = UndoMax then + SaveFlame(maincp, Format('%.4d-', [UndoIndex]) + maincp.name, + AppPath + undoFilename); + StopThread; + Dec(UndoIndex); + LoadUndoFlame(UndoIndex, AppPath + undoFilename); + mnuRedo.Enabled := True; + mnuPopRedo.Enabled := True; + btnRedo.Enabled := True; + EditForm.mnuRedo.Enabled := True; + EditForm.tbRedo.enabled := true; + AdjustForm.btnRedo.enabled := true; + if UndoIndex = 0 then begin + mnuUndo.Enabled := false; + mnuPopUndo.Enabled := false; + btnUndo.Enabled := false; + EditForm.mnuUndo.Enabled := false; + EditForm.tbUndo.enabled := false; + AdjustForm.btnUndo.enabled := false; + end; +end; + +procedure TMainForm.mnuUndoClick(Sender: TObject); +begin + Undo; + StatusBar.Panels[3].Text := maincp.name; +end; + +procedure TMainForm.mnuUnflattenClick(Sender: TObject); +var + i, t: integer; + refresh: boolean; +begin + StopThread; + refresh := False; + if maincp.HasFinalXForm then t := Transforms + else t := Transforms - 1; + + for i := 0 to t do + if maincp.xform[i].GetVariation(1) <> 0 then + begin + maincp.xform[i].SetVariation(1, 0); + refresh := True; + end; + if refresh then + begin + UpdateUndo; + RedrawTimer.Enabled := True; + UpdateWindows; + end; +end; + +procedure TMainForm.Redo; +begin + StopThread; + Inc(UndoIndex); + + assert(UndoIndex <= UndoMax, 'Undo list index out of range!'); + + LoadUndoFlame(UndoIndex, AppPath + undoFilename); + mnuUndo.Enabled := True; + mnuPopUndo.Enabled := True; + btnUndo.Enabled := True; + EditForm.mnuUndo.Enabled := True; + EditForm.tbUndo.enabled := true; + AdjustForm.btnUndo.enabled := true; + if UndoIndex = UndoMax then begin + mnuRedo.Enabled := false; + mnuPopRedo.Enabled := false; + btnRedo.Enabled := false; + EditForm.mnuRedo.Enabled := false; + EditForm.tbRedo.enabled := false; + AdjustForm.btnRedo.enabled := false; + end; +end; + +procedure TMainForm.mnuRedoClick(Sender: TObject); +begin + Redo; + StatusBar.Panels[3].Text := maincp.name; +end; + +// AV: added support for fast preview and params saving without rendering +// for absolute beginners :) +procedure TMainForm.mnuExportBitmapClick(Sender: TObject); +var pic: TPNGObject; +begin + SaveDialog.DefaultExt := 'png'; + SaveDialog.Filter := Format('%s|*.png', [TextByKey('common-filter-png')]); + SaveDialog.Filename := maincp.name; + if SaveDialog.Execute then + begin + try + pic := TPNGObject.Create; + try + pic.Assign(Image.Picture.Bitmap); + pic.AddtEXt('ApoFlame', AnsiString(Trim(FlameToXML(Maincp, false, false)))); + pic.SaveToFile(SaveDialog.Filename); + finally + pic.Free; + end; + except + Image.Picture.Bitmap.SaveToFile(ChangeFileExt(SaveDialog.FileName, '.bmp')); + end; + end; +end; + +procedure TMainForm.mnuFullScreenClick(Sender: TObject); +begin + FullScreenForm.ActiveForm := Screen.ActiveForm; + FullScreenForm.Width := Screen.Width; + FullScreenForm.Height := Screen.Height; + FullScreenForm.Top := 0; + FullScreenForm.Left := 0; + FullScreenForm.cp.Copy(maincp); + FullScreenForm.cp.cmap := maincp.cmap; + FullScreenForm.center[0] := center[0]; + FullScreenForm.center[1] := center[1]; + FullScreenForm.Calculate := True; + FullScreenForm.Show; +end; + +procedure TMainForm.mnuRenderClick(Sender: TObject); +var + Ext: string; + NewRender: Boolean; +begin + NewRender := True; + + if Assigned(RenderForm.Renderer) then + if Application.MessageBox(PChar(TextByKey('render-status-confirmstop')), 'Apophysis', 36) = ID_NO then + NewRender := false; + + if NewRender then + begin + + if Assigned(RenderForm.Renderer) then RenderForm.Renderer.Terminate; + if Assigned(RenderForm.Renderer) then RenderForm.Renderer.WaitFor; // hmm #1 + RenderForm.ResetControls; + RenderForm.PageCtrl.TabIndex := 0; + + case renderFileFormat of + 1: Ext := '.bmp'; + 2: Ext := '.png'; + 3: Ext := '.jpg'; + end; + + //RenderForm.caption := 'Render ' + #39 + maincp.name + #39 + ' to Disk'; + RenderForm.Filename := RenderPath + maincp.name + Ext; + RenderForm.SaveDialog.FileName := RenderPath + maincp.name + Ext; + RenderForm.txtFilename.Text := ChangeFileExt(RenderForm.SaveDialog.Filename, Ext); + + RenderForm.cp.Copy(MainCP); + RenderForm.cp.cmap := maincp.cmap; + RenderForm.zoom := maincp.zoom; + RenderForm.Center[0] := center[0]; + RenderForm.Center[1] := center[1]; + if Assigned(RenderForm.Renderer) then RenderForm.Renderer.WaitFor; // hmm #2 + end; + RenderForm.Show; +end; + +procedure TMainForm.mnuRenderAllClick(Sender: TObject); +var + Ext: string; + NewRender: Boolean; +begin + NewRender := True; + + if Assigned(RenderForm.Renderer) then + if Application.MessageBox(PChar(TextByKey('render-status-confirmstop')), 'Apophysis', 36) = ID_NO then + NewRender := false; + + if NewRender then + begin + + if Assigned(RenderForm.Renderer) then RenderForm.Renderer.Terminate; + if Assigned(RenderForm.Renderer) then RenderForm.Renderer.WaitFor; // hmm #1 + RenderForm.ResetControls; + RenderForm.PageCtrl.TabIndex := 0; + + case renderFileFormat of + 1: Ext := '.bmp'; + 2: Ext := '.png'; + 3: Ext := '.jpg'; + end; + + //RenderForm.caption := 'Render all flames to disk'; + RenderForm.bRenderAll := true; + RenderForm.Filename := RenderPath + maincp.name + Ext; + RenderForm.SaveDialog.FileName := RenderForm.Filename; + RenderForm.txtFilename.Text := ChangeFileExt(RenderForm.SaveDialog.Filename, Ext); + + RenderForm.cp.Copy(MainCP); + RenderForm.cp.cmap := maincp.cmap; + RenderForm.zoom := maincp.zoom; + RenderForm.Center[0] := center[0]; + RenderForm.Center[1] := center[1]; + if Assigned(RenderForm.Renderer) then RenderForm.Renderer.WaitFor; // hmm #2 + end; + RenderForm.Show; +end; + +procedure TMainForm.mnuMutateClick(Sender: TObject); +begin + MutateForm.Show; + MutateForm.UpdateDisplay; +end; + +procedure TMainForm.mnuAdjustClick(Sender: TObject); +begin + AdjustForm.UpdateDisplay; + AdjustForm.PageControl.TabIndex := 0; + AdjustForm.Show; +end; + +procedure TMainForm.mnuResetLocationClick(Sender: TObject); +var + scale: double; + dx, dy, cdx, cdy: double; + sina, cosa: extended; +begin + StopThread; // AV + UpdateUndo; + try // AV + scale := MainCP.pixels_per_unit / MainCP.Width * power(2, MainCP.zoom); + cdx := MainCP.center[0]; + cdy := MainCP.center[1]; + + ResetLocation; + + cdx := MainCP.center[0] - cdx; + cdy := MainCP.center[1] - cdy; + Sincos(MainCP.FAngle, sina, cosa); + if IsZero(sina) then begin + dy := cdy*cosa {- cdx*sina}; + dx := (cdx {+ dy*sina})/cosa; + end + else begin + dx := cdy*sina + cdx*cosa; + dy := (dx*cosa - cdx)/sina; + end; + FViewPos.x := FViewPos.x - dx * scale * Image.Width; + FViewPos.y := FViewPos.y - dy * scale * Image.Width; + + FViewScale := FViewScale * MainCP.pixels_per_unit / MainCP.Width * power(2, MainCP.zoom) / scale; + + DrawImageView; + + RedrawTimer.enabled := true; + UpdateWindows; + except on EMathError do // AV + Trace2('Cannot calculate the flame scale and bounds...'); + end; +end; + +procedure TMainForm.mnuAboutClick(Sender: TObject); +begin + AboutForm.ShowModal; +end; + +procedure TMainForm.mnuOpenGradientClick(Sender: TObject); +begin + GradientBrowser.Filename := GradientFile; + GradientBrowser.Show; +end; + +procedure TMainForm.mnuSaveUndoClick(Sender: TObject); +begin + if FileExists(AppPath + undoFilename) then + begin + SaveDialog.DefaultExt := 'undo'; + SaveDialog.Filter := TextByKey('common-filter-undofiles') + '|*undo;*.apo'; + SaveDialog.Filename := maincp.name; + if SaveDialog.Execute then + begin + if FileExists(SaveDialog.Filename) then DeleteFile(SaveDialog.Filename); + CopyFile(PChar(AppPath + undoFilename), PChar(SaveDialog.Filename), False); + end; + end; +end; + +procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); +begin + if Assigned(RenderForm.Renderer) then + if Application.MessageBox(PChar(TextByKey('render-status-confirmstop')), 'Apophysis', 36) = ID_NO then + CanClose := False; + + AboutToExit := CanClose; +end; + +procedure TMainForm.FormActivate(Sender: TObject); +begin + if Assigned(Renderer) then Renderer.Priority := tpNormal; + mnuPaste.Enabled := FlameInClipboard; // AV +end; + +procedure TMainForm.FormDeactivate(Sender: TObject); +begin + if Assigned(Renderer) then Renderer.Priority := tpLower; +end; + +procedure TMainForm.mnuCalculateColorsClick(Sender: TObject); +var + i: integer; +begin + StopThread; + UpdateUndo; + for i := 0 to Transforms - 1 do + maincp.xform[i].color := i / (transforms - 1); + RedrawTimer.Enabled := True; + UpdateWindows; +end; + +procedure TMainForm.mnuRandomizeColorValuesClick(Sender: TObject); +var + i: integer; +begin + inc(MainSeed); + RandSeed := MainSeed; + StopThread; + UpdateUndo; + for i := 0 to Transforms - 1 do + maincp.xform[i].color := random; + RedrawTimer.Enabled := True; + UpdateWindows; +end; + +procedure TMainForm.mnuEditScriptClick(Sender: TObject); +begin + ScriptEditor.Show; +end; + +procedure TMainForm.mnuRunClick(Sender: TObject); +begin + if not ScriptEditor.Editor.IsEmpty then // AV: is there any code? + ScriptEditor.RunScript; +end; + +procedure TMainForm.mnuOpenScriptClick(Sender: TObject); +begin + ScriptEditor.OpenScript; +end; + +procedure TMainForm.mnuStopClick(Sender: TObject); +begin + //ScriptEditor.Stopped := True; + // AV: what if script is paused? + ScriptEditor.btnStop.Click; // AV +end; + +{ +procedure TMainForm.mnuImportGimpClick(Sender: TObject); +var + flist: tStringList; +begin + flist := TStringList.Create; + OpenDialog.Filter := Format('%s|*.*', [TextByKey('common-filter-allfiles')]); + try + if OpenDialog.Execute then + begin + flist.loadFromFile(OpenDialog.filename); + maincp.clear; + maincp.ParseStringList(flist); + maincp.Width := Image.Width; + maincp.Height := Image.Height; + maincp.zoom := 0; + maincp.CalcBoundBox; + center[0] := maincp.center[0]; + center[1] := maincp.center[1]; + RedrawTimer.Enabled := True; + Application.ProcessMessages; + Transforms := MainCp.TrianglesFromCP(MainTriangles); + UpdateWindows; + end; + finally + flist.free; + end; +end; +} + +procedure TMainForm.mnuManageFavoritesClick(Sender: TObject); +var + MenuItem: TMenuItem; + i: integer; + s: string; +begin + if FavoritesForm.ShowModal = mrOK then + begin + if favorites.count <> 0 then + begin + for i := 0 to Favorites.Count - 1 do + begin + s := ExtractFileName(Favorites[i]); + s := Copy(s, 0, length(s) - Length(ExtractFileExt(s))); + MenuItem := FavouriteScripts1.Find(s); + if MenuItem <> nil then + MenuItem.Free; + end; + end; + GetScripts; + end; +end; + +procedure TMainForm.DisableFavorites; +var + MenuItem: TMenuItem; + i: integer; + s: string; +begin + for i := 0 to Favorites.Count - 1 do + begin + s := ExtractFileName(Favorites[i]); + s := Copy(s, 0, length(s) - Length(ExtractFileExt(s))); + MenuItem := FavouriteScripts1.Find(s); + if MenuItem <> nil then + MenuItem.Enabled := False; + end; +end; + +procedure TMainForm.EnableFavorites; +var + MenuItem: TMenuItem; + i: integer; + s: string; +begin + for i := 0 to Favorites.Count - 1 do + begin + s := ExtractFileName(Favorites[i]); + s := Copy(s, 0, length(s) - Length(ExtractFileExt(s))); + MenuItem := FavouriteScripts1.Find(s); + if MenuItem <> nil then + MenuItem.Enabled := True; + end; +end; + +procedure TMainForm.EnumerateFlamesClick(Sender: TObject); +var i: integer; +begin + with MainForm.ListView1.Items do + begin + BeginUpdate; + for i := 0 to Count - 1 do Item[i].SubItems.Clear; // AV: hide the index + + if TMenuItem(Sender).Checked then + begin // AV: displaying the index + MainForm.ListView1.Column[1].Caption := ' N '; + if FlameEnumMode = 0 then + for i := 0 to Count - 1 do Item[i].SubItems.Add(IntToStr(i)) + else + for i := 0 to Count - 1 do Item[i].SubItems.Add(IntToStr(i+1)); + end + else + MainForm.ListView1.Column[1].Caption := ''; + + EndUpdate; + end; +end; + +procedure TMainForm.mnuShowFullClick(Sender: TObject); +begin + FullScreenForm.Calculate := False; + FullScreenForm.Show; +end; + +procedure TMainForm.mnuImageSizeClick(Sender: TObject); +begin + AdjustForm.UpdateDisplay; + AdjustForm.PageControl.TabIndex:=3; + AdjustForm.Show; +end; + +procedure TMainForm.AddSymmetryClick(Sender: TObject); +var finTX: TXForm; +begin + if (Transforms + TMenuItem(Sender).Tag > NXForms) then Exit; + StopThread; + UpdateUndo; + finTX := TXForm.Create; + finTX.Assign(MainCp.xform[Transforms]); + MainCp.NormalizeProbabilities; + add_symmetry_to_control_point(MainCp, TMenuItem(Sender).Tag); + Transforms := MainCp.TrianglesFromCP(MainTriangles); + MainCp.xform[Transforms].Assign(finTX); + ResetLocation; + RedrawTimer.Enabled := True; + UpdateWindows; + finTX.Free; +end; + +procedure TMainForm.AddTemplateClick(Sender: TObject); // AV +var + tmpdir: string; +begin + tmpdir := AppPath + 'Templates\'; + if not DirectoryExists(tmpdir) then + CreateDir(tmpdir); + + with SaveForm do + begin + SaveType := stSaveTemplate; + Filename := tmpdir + 'Fractal Templates.template'; + Title := maincp.name; + ActiveControl := txtTitle; + if ShowModal = mrOK then + begin + maincp.name := Title; + SaveXMLFlame(maincp, maincp.name, Filename); + StatusBar.Panels[3].Text := maincp.name; + end; + end; +end; + +procedure TMainForm.AddTileClick(Sender: TObject); +var finTX: TXForm; +begin + if (Transforms + 6 > NXForms) then Exit; + StopThread; + UpdateUndo; + finTX := TXForm.Create; + finTX.Assign(MainCp.xform[Transforms]); + MainCp.NormalizeProbabilities; + tile_control_point(MainCp, TMenuItem(Sender).Tag); + Transforms := MainCp.TrianglesFromCP(MainTriangles); + MainCp.xform[Transforms].Assign(finTX); + ResetLocation; + RedrawTimer.Enabled := True; + UpdateWindows; + finTX.Free; +end; + +// AV: make a common event handler for Main and Adjust forms +procedure TMainForm.ApplicationEventsActivate(Sender: TObject); +begin + if GradientInClipboard then + begin + AdjustForm.mnuPaste.enabled := true; + AdjustForm.btnPaste.enabled := true; + mnuPaste.enabled := false; + end + else if FlameInClipboard then + begin + AdjustForm.mnuPaste.enabled := false; + AdjustForm.btnPaste.enabled := false; + if (pos('Memorized XForm Parameters', Clipboard.AsText) > 0) then + mnuPaste.enabled := False // AV: hack + else + mnuPaste.Enabled := true; + end + else + begin + AdjustForm.mnuPaste.enabled := false; + AdjustForm.btnPaste.enabled := false; + mnuPaste.enabled := false; + end; +end; + +procedure TMainForm.ParseXML(var cp1: TControlPoint; const params: string; const ignoreErrors : boolean); +var + i: integer; + h, s, v: real; +begin + CurrentFlame := cp1.name; + nxform := 0; + FinalXformLoaded := false; + ActiveXformSet := 0; + XMLPaletteFormat := ''; + XMLPaletteCount := 0; + SurpressHandleMissingPlugins := ignoreErrors; + + ParseCp.Free; // we're creating this CP from the scratch + ParseCp := TControlPoint.create; // to reset variables properly (randomize) + + XMLScanner.LoadFromBuffer(TCharType(TStringType(params))); + XMLScanner.Execute; + + cp1.copy(ParseCp); + + if (Parsecp.cmapindex = -2) then + begin + if cp1.cmapindex < NRCMAPS then + GetCMap(cp1.cmapindex, 1, cp1.cmap) + {else + ShowMessage('Palette index too high')}; + + if (cp1.hue_rotation > 0) and (cp1.hue_rotation < 1) then + for i := 0 to 255 do + begin + RGBToHSV(cp1.cmap[i][0], cp1.cmap[i][1], cp1.cmap[i][2], h, s, v); + h := Round(360 + h + (cp1.hue_rotation * 360)) mod 360; + HSVToRGB(h, s, v, cp1.cmap[i][0], cp1.cmap[i][1], cp1.cmap[i][2]); + end; + end; + + if FinalXformLoaded = false then begin + cp1.xform[nxform].Clear; + cp1.xform[nxform].symmetry := 1; + end; + + if nxform < NXFORMS then + for i := nxform to NXFORMS - 1 do + cp1.xform[i].density := 0; + + // Check for symmetry parameter + if ParseCp.symmetry <> 0 then + begin + add_symmetry_to_control_point(cp1, ParseCp.symmetry); + cp1.symmetry := 0; + end; + + cp1.FillUsedPlugins; + SurpressHandleMissingPlugins := false; +end; + +procedure TMainForm.PasteFlameXML(flameXML: string); // AV +begin + if (flameXML <> '') then + begin + UpdateUndo; + //ScriptEditor.Stopped := True; + MainMenuClick(nil); // AV + + StopThread; + ParseXML(MainCP, PCHAR(flameXML), false); + AnnoyUser; + Transforms := MainCp.TrianglesFromCP(MainTriangles); + Statusbar.Panels[3].Text := MainCp.name; + if AutoSaveXML then // AV: saving loaded parameters in the current file + begin + if XMLEntryExists(MainCp.name, OpenFile) then + MainCp.name := MainCp.name + ' (new)'; // hmm... + if (OpenFile = AppPath + randfilename) then // random batch will be deleted + SaveXMLFlame(MainCp, MainCp.name, + IfThen(DirectoryExists(ExtractFilePath(AutoSavePath)), ExtractFilePath(AutoSavePath), + AppPath) + 'Saved by ApophysisAV.flame'); // :) + // AV: display these changes and scroll to the selected item + if SaveXMLFlame(MainCp, MainCp.name, OpenFile) then + ListXML(OpenFile, 2, MainCp.name); + end; + ResizeImage; + RedrawTimer.Enabled := True; + Application.ProcessMessages; + UpdateWindows; + end; +end; + +procedure TMainForm.mnuPasteClick(Sender: TObject); +begin + //if Clipboard.HasFormat(CF_TEXT) then + if FlameInClipboard then // AV + PasteFlameXML(Clipboard.AsText); +end; + +procedure TMainForm.mnuCopyClick(Sender: TObject); +var + txt: string; + i: integer; +begin + txt := Trim(FlameToXML(Maincp, false, false)); + Clipboard.SetTextBuf(PChar(txt)); + mnuPaste.enabled := true; + + AdjustForm.mnuPaste.enabled := False; + AdjustForm.btnPaste.enabled := False; + + // AV: for pasting multiple transforms into editor + MemCp.Clear; + for i := 0 to Maincp.NumXForms - 1 do //FIXME: skip final transform! + MemCp.xform[i].Assign(Maincp.xform[i]); + EditForm.PasteTransform1.Enabled := True; +end; + +function WinShellExecute(const Operation, AssociatedFile: string): Boolean; +var + a1: string; + r: Cardinal; +begin + a1 := Operation; + if a1 = '' then + a1 := 'open'; + + r := ShellExecute( + application.handle + , pchar(a1) + , pchar(AssociatedFile) + , '' + , '' + , SW_SHOWNORMAL + ); + if (r > 32) then WinShellExecute := true + else WinShellExecute := false; +end; + +procedure WinShellOpen(const AssociatedFile: string); +begin + WinShellExecute('open', AssociatedFile); +end; + +procedure TMainForm.mnuExportFlameClick(Sender: TObject); +var + FileList: Tstringlist; + Ext, ex, Path: string; + cp1: TControlPoint; +begin + if not FileExists(flam3Path) then + begin + Application.MessageBox(PChar(TextByKey('main-status-noflam3')), 'Apophysis', 16); + exit; + end; + + // AV: we really don't need to waste the memory and create it at startup + ExportDialog := TExportDialog.Create(Application); // AV + case ExportFileFormat of + 1: Ext := 'jpg'; + 2: Ext := 'ppm'; + 3: Ext := 'png'; + end; + FileList := TstringList.Create; + cp1 := TControlPoint.Create; + cp1.copy(Maincp); + ExportDialog.ImageWidth := ExportWidth; + ExportDialog.ImageHeight := ExportHeight; + ExportDialog.Sample_density := ExportDensity; + ExportDialog.Filter_Radius := ExportFilter; + ExportDialog.Oversample := ExportOversample; + try + ExportDialog.Filename := RenderPath + Maincp.name + '.' + Ext; + if ExportDialog.ShowModal = mrOK then + begin + ex := ExtractFileExt(ExportDialog.Filename); + if ExtractFileExt(ExportDialog.Filename) = '.ppm' then + ExportFileFormat := 2 + else if ExtractFileExt(ExportDialog.Filename) = '.png' then + ExportFileFormat := 3 + else + ExportFileFormat := 1; + case ExportFileFormat of + 1: Ext := 'jpg'; + 2: Ext := 'ppm'; + 3: Ext := 'png'; + end; + ExportWidth := ExportDialog.ImageWidth; + ExportHeight := ExportDialog.ImageHeight; + ExportDensity := ExportDialog.Sample_density; + ExportFilter := ExportDialog.Filter_Radius; + ExportOversample := ExportDialog.Oversample; + ExportBatches := ExportDialog.Batches; + ExportEstimator := ExportDialog.Estimator; + ExportEstimatorMin := ExportDialog.EstimatorMin; + ExportEstimatorCurve := ExportDialog.EstimatorCurve; + ExportJitters := ExportDialog.Jitters; + ExportGammaTreshold := ExportDialog.GammaTreshold; + cp1.sample_density := ExportDensity; + cp1.spatial_oversample := ExportOversample; + cp1.spatial_filter_radius := ExportFilter; + cp1.nbatches := ExportBatches; + if (cp1.width <> ExportWidth) or (cp1.Height <> ExportHeight) then + cp1.AdjustScale(ExportWidth, ExportHeight); + cp1.estimator := ExportEstimator; + cp1.estimator_min := ExportEstimatorMin; + cp1.estimator_curve := ExportEstimatorCurve; + cp1.jitters := ExportJitters; + cp1.gamma_threshold := ExportGammaTreshold; + FileList.Text := FlameToXML(cp1, true, false); + FileList.SaveToFile(ChangeFileExt(ExportDialog.Filename, '.flame')); + FileList.Clear; + FileList.Add('@echo off'); + FileList.Add('set verbose=1'); + FileList.Add('set format=' + Ext); + if ExportFileFormat = 1 then + FileList.Add('set jpeg=' + IntToStr(JPEGQuality)); + case ExportDialog.cmbDepth.ItemIndex of + 0: FileList.Add('set bits=16'); + 1: FileList.Add('set bits=32'); + 2: FileList.Add('set bits=33'); + 3: FileList.Add('set bits=64'); + end; + if ExportDialog.udStrips.Position > 1 then + FileList.Add('set nstrips=' + IntToStr(ExportDialog.udStrips.Position)); + if (PNGTransparency > 0) then + FileList.Add('set transparency=1') + else + FileList.Add('set transparency=0'); + FileList.Add('set out=' + ExportDialog.Filename); + FileList.Add('@echo Rendering "' + ExportDialog.Filename + '"'); + + FileList.Add('"' + flam3Path + '" < "' + ChangeFileExt(ExportDialog.Filename, '.flame') + '"'); + Path := ExtractFilePath(ExtractFileDir(ExportDialog.Filename) + '\'); + + FileList.SaveToFile(ChangeFileExt(ExportDialog.Filename, '.bat')); + if ExportDialog.chkRender.Checked then + begin + SetCurrentDir(Path); + WinShellOpen(ChangeFileExt(ExportDialog.Filename, '.bat')); + end; + end; + finally + FileList.Free; + cp1.free; + ExportDialog.Free; // AV + end; + +end; + +//////////////////////////////////////////////////////////////////////////////// + +procedure ParseCompactColors(cp: TControlPoint; count: integer; in_data: string; alpha: boolean = true); + function HexChar(c: Char): Byte; + begin + case c of + '0'..'9': Result := Byte(c) - Byte('0'); + 'a'..'f': Result := (Byte(c) - Byte('a')) + 10; + 'A'..'F': Result := (Byte(c) - Byte('A')) + 10; + else + Result := 0; + end; + end; +var + i, pos, len: integer; + c: char; + data: string; +begin + // diable generating pallete + if Parsecp.cmapindex = -2 then + Parsecp.cmapindex := -1; + + Assert(Count = 256, 'only 256 color gradients are supported at the moment'); + data := ''; + for i := 1 to Length(in_data) do + begin + c := in_data[i]; + if CharInSet(c,['0'..'9']+['A'..'F']+['a'..'f']) then data := data + c; + end; + + if alpha then len := count * 8 + else len := count * 6; + + Assert(len = Length(data), 'color-data size mismatch'); + + for i := 0 to Count-1 do begin + if alpha then pos := i*8 + 2 + else pos := i*6; + Parsecp.cmap[i][0] := 16 * HexChar(Data[pos + 1]) + HexChar(Data[pos + 2]); + Parsecp.cmap[i][1] := 16 * HexChar(Data[pos + 3]) + HexChar(Data[pos + 4]); + Parsecp.cmap[i][2] := 16 * HexChar(Data[pos + 5]) + HexChar(Data[pos + 6]); + end; +end; + +procedure TMainForm.ListXmlScannerStartTag(Sender: TObject; + TagName: string; Attributes: TAttrList); +begin + pname := String(Attributes.value(TStringType('name'))); + ptime := String(Attributes.value(TStringType('time'))); + // pversion := String(Attributes.value(TStringType('version'))); +end; + +procedure TMainForm.XMLScannerStartTag(Sender: TObject; TagName: string; + Attributes: TAttrList); +var + Tokens: TStringList; + v: TStringType; + ParsePos, i : integer; +begin + Tokens := TStringList.Create; + try + + if TagName='xformset' then // unused in this release... + begin + v := Attributes.Value(TStringType('enabled')); + if v <> '' then ParseCP.finalXformEnabled := (StrToInt(String(v)) <> 0) + else ParseCP.finalXformEnabled := true; + + inc(activeXformSet); + end + else if TagName='flame' then + begin + BeginParsing; + + v := Attributes.value(TStringType('version')); // AV + if (pos('Apophysis 2.0', String(v)) > 0) or (v = '') then + oldApo := true else oldApo := false; + + v := Attributes.value(TStringType('name')); + if v <> '' then Parsecp.name := String(v) else Parsecp.name := 'untitled'; + v := Attributes.Value('time'); + if v <> '' then Parsecp.Time := StrToFloat(String(v)); + v := Attributes.value('palette'); + if v <> '' then + Parsecp.cmapindex := StrToInt(String(v)) + else + Parsecp.cmapindex := -1; + v := Attributes.value('gradient'); + if v <> '' then + Parsecp.cmapindex := StrToInt(String(v)) + else + Parsecp.cmapindex := -1; + + //ParseCP.hue_rotation := 1; + v := Attributes.value('hue'); // AV: to animate the palette + if v <> '' then + Parsecp.hue_rotation := StrToFloat(String(v)) + else + ParseCP.hue_rotation := 1; + + v := Attributes.Value('brightness'); + if v <> '' then Parsecp.Brightness := StrToFloat(String(v)); + v := Attributes.Value('gamma'); + if v <> '' then Parsecp.gamma := StrToFloat(String(v)); + v := Attributes.Value('contrast'); // AV + if v <> '' then Parsecp.contrast := StrToFloat(String(v)); + v := Attributes.Value('vibrancy'); + if v <> '' then Parsecp.vibrancy := StrToFloat(String(v)); + if (LimitVibrancy) and (Parsecp.vibrancy > 1) then Parsecp.vibrancy := 1; + v := Attributes.Value('gamma_threshold'); + if v <> '' then Parsecp.gamma_threshold := StrToFloat(String(v)) + else Parsecp.gamma_threshold := 0; + + v := Attributes.Value('zoom'); + if v <> '' then Parsecp.zoom := StrToFloat(String(v)); + v := Attributes.Value('scale'); + if v <> '' then Parsecp.pixels_per_unit := StrToFloat(String(v)); + v := Attributes.Value('rotate'); + if v <> '' then Parsecp.FAngle := -PI * StrToFloat(String(v))/180; + v := Attributes.Value('angle'); + if v <> '' then Parsecp.FAngle := StrToFloat(String(v)); + + // 3d + v := Attributes.Value('cam_pitch'); + if v <> '' then Parsecp.cameraPitch := StrToFloat(String(v)); + v := Attributes.Value('cam_yaw'); + if v <> '' then Parsecp.cameraYaw := StrToFloat(String(v)); + v := Attributes.Value('cam_roll'); + if v <> '' then Parsecp.cameraRoll := StrToFloat(String(v)); + v := Attributes.Value('cam_dist'); + if v <> '' then Parsecp.cameraPersp := 1/StrToFloat(String(v)); + v := Attributes.Value('cam_perspective'); + if v <> '' then Parsecp.cameraPersp := StrToFloat(String(v)); + v := Attributes.Value('cam_zpos'); + if v <> '' then Parsecp.cameraZpos := StrToFloat(String(v)); + v := Attributes.Value('cam_dof'); + if v <> '' then Parsecp.cameraDOF := abs(StrToFloat(String(v))); + + //density estimation + v := Attributes.Value('estimator_radius'); + if v <> '' then Parsecp.estimator := StrToFloat(String(v)); + v := Attributes.Value('estimator_minimum'); + if v <> '' then Parsecp.estimator_min := StrToFloat(String(v)); + v := Attributes.Value('estimator_curve'); + if v <> '' then Parsecp.estimator_curve := StrToFloat(String(v)); + v := Attributes.Value('enable_de'); + if (v = '1') then Parsecp.enable_de := true; + + v := Attributes.Value('new_linear'); + if (v = '1') then // AV + Parsecp.noLinearFix := true + else ParseCp.noLinearFix := false; + + v := Attributes.Value('curves'); + if (v <> '') then begin + GetTokens(String(v), tokens); + ParsePos := -1; + for i := 0 to 3 do + begin + Inc(ParsePos);ParseCp.curvePoints[i][0].x := StrToFloat(Tokens[ParsePos]); + Inc(ParsePos);ParseCp.curvePoints[i][0].y := StrToFloat(Tokens[ParsePos]); + Inc(ParsePos);ParseCp.curveWeights[i][0] := StrToFloat(Tokens[ParsePos]); + Inc(ParsePos);ParseCp.curvePoints[i][1].x := StrToFloat(Tokens[ParsePos]); + Inc(ParsePos);ParseCp.curvePoints[i][1].y := StrToFloat(Tokens[ParsePos]); + Inc(ParsePos);ParseCp.curveWeights[i][1] := StrToFloat(Tokens[ParsePos]); + Inc(ParsePos);ParseCp.curvePoints[i][2].x := StrToFloat(Tokens[ParsePos]); + Inc(ParsePos);ParseCp.curvePoints[i][2].y := StrToFloat(Tokens[ParsePos]); + Inc(ParsePos);ParseCp.curveWeights[i][2] := StrToFloat(Tokens[ParsePos]); + Inc(ParsePos);ParseCp.curvePoints[i][3].x := StrToFloat(Tokens[ParsePos]); + Inc(ParsePos);ParseCp.curvePoints[i][3].y := StrToFloat(Tokens[ParsePos]); + Inc(ParsePos);ParseCp.curveWeights[i][3] := StrToFloat(Tokens[ParsePos]); + end; + + end; + + try + v := Attributes.Value('center'); + GetTokens(String(v), tokens); + + Parsecp.center[0] := StrToFloat(Tokens[0]); + Parsecp.center[1] := StrToFloat(Tokens[1]); + except + Parsecp.center[0] := 0; + Parsecp.center[1] := 0; + end; + + v := Attributes.Value('size'); + GetTokens(String(v), tokens); + + Parsecp.width := StrToInt(Tokens[0]); + Parsecp.height := StrToInt(Tokens[1]); + + try + v := Attributes.Value('background'); + GetTokens(String(v), tokens); + + Parsecp.background[0] := Floor(StrToFloat(Tokens[0]) * 255); + Parsecp.background[1] := Floor(StrToFloat(Tokens[1]) * 255); + Parsecp.background[2] := Floor(StrToFloat(Tokens[2]) * 255); + except + Parsecp.background[0] := 0; + Parsecp.background[1] := 0; + Parsecp.background[2] := 0; + end; + + v := Attributes.Value('soloxform'); + if v <> '' then Parsecp.soloXform := StrToInt(String(v)); + + v := Attributes.Value('plugins'); + GetTokens(String(v), tokens); + if (tokens.Count > 0) then begin + ParseCP.used_plugins.Clear; + + for i := 0 to tokens.Count - 1 do + ParseCP.used_plugins.Add(tokens[i]); + end; + (* // AV: commented out since it's useless + v := Attributes.Value('nick'); + if Trim(String(v)) = '' then v := TStringType(SheepNick); + Parsecp.Nick := String(v); + v := Attributes.Value('url'); + if Trim(String(v)) = '' then v := TStringType(SheepUrl); + Parsecp.URL := String(v); + *) + end + else if TagName='palette' then + begin + XMLPaletteFormat := String(Attributes.Value('format')); + XMLPaletteCount := StrToIntDef(String(Attributes.Value('count')), 256); + end; + finally + Tokens.free; + end; +end; + +function flatten_val(Attributes: TAttrList): double; +var + vv: array of double; + vn: array of string; + i: integer; + s: string; + d: boolean; +begin + // AV: invert the behavior since it flatten real 3D figures like bubble + vn := ['crop', 'auger', 'bipolar', 'blur', 'blur_circle', 'blur_pixelize', + 'blur_zoom', 'horseshoe', 'diamond', 'disc', 'bent2', 'escher', 'eyefish', + 'fan2', 'flux', 'foci', 'log', 'bwraps', 'juliascope', 'julian', 'mobius', + 'noise', 'ngon', 'curl', 'rings2', 'scry', 'spherical', 'spiral', 'cropn', + 'swirl', 'wedge', 'checks', 'polar', 'polar2', 'linear', 'cross', 'pdj', + 'hyperbolic', 'radial_blur', 'elliptic', 'lazysusan', 'post_smartcrop', + 'circlecrop', 'rectangles']; + + SetLength(vv, length(vn)); // AV + + d := false; + for i := 0 to High(vn) do + begin + s := String(Attributes.Value(TStringType(vn[i]))); + if (s <> '') then vv[i] := StrToFloat(s) + else vv[i] := 0; + d := d or (vv[i] <> 0); + end; + + // AV: changed 0 to 1 and vice versa + if (d) then Result := 1 + else Result := 0; + + SetLength(vv, 0); + SetLength(vn, 0); +end; + +function linear_val(Attributes: TAttrList): double; +var + vv: array of double; + vn: array of string; + i: integer; + s: string; +begin + SetLength(vv, 2); + vn := ['linear3D', 'linear']; + + Result := 0; + + for i := 0 to 1 do + begin + s := String(Attributes.Value(TStringType(vn[i]))); + if (s <> '') then vv[i] := StrToFloat(s) + else vv[i] := 0; + Result := Result + vv[i]; + end; + + SetLength(vv, 0); + SetLength(vn, 0); +end; + +procedure TMainForm.XmlScannerContent(Sender: TObject; Content: String); +var i: byte; + h, s, v, hue: real; +begin + if XMLPaletteCount <= 0 then begin + //ShowMessage('ERROR: No colors in palette!'); + Application.MessageBox(PChar(TextByKey('common-invalidformat')), 'Apophysis', MB_ICONERROR); + exit; + end; + if XMLPaletteFormat = 'RGB' then + begin + ParseCompactColors(ParseCP, XMLPaletteCount, Content, false); + end + else if XMLPaletteFormat = 'RGBA' then + begin + ParseCompactColors(ParseCP, XMLPaletteCount, Content); + end + else begin + Application.MessageBox(PChar(TextByKey('common-invalidformat')), 'Apophysis', MB_ICONERROR); + exit; + end; + Parsecp.cmapindex := -1; + + // AV: restored hue rotation support, useful for animation + hue := Parsecp.hue_rotation; + if (hue < 1) and (hue > 0) then + for i := 0 to 255 do + begin + RGBToHSV(Parsecp.cmap[i][0], Parsecp.cmap[i][1], Parsecp.cmap[i][2], h, s, v); + h := Round(360 + h + (hue * 360)) mod 360; + HSVToRGB(h, s, v, Parsecp.cmap[i][0], Parsecp.cmap[i][1], Parsecp.cmap[i][2]); + end; + + XMLPaletteFormat := ''; + XMLPaletteCount := 0; +end; + +procedure TMainForm.XMLScannerEmptyTag(Sender: TObject; TagName: string; + Attributes: TAttrList); +var + i, j, k, vindex: integer; // j, k - AV + v, l, s: TStringType; + d, floatcolor, vl, n: double; + Tokens: TStringList; +begin + + Tokens := TStringList.Create; + try + if (TagName = 'xform') or (TagName = 'finalxform') then + if {(TagName = 'finalxform') and} (FinalXformLoaded) then Application.MessageBox(PChar(TextByKey('common-invalidformat')), 'Apophysis', MB_ICONERROR) + else + begin + for i := 0 to Attributes.Count - 1 do begin + if not ScanVariations(String(attributes.Name(i))) and + not ScanVariables(String(attributes.Name(i))) then + CheckAttribute(String(Attributes.Name(i))); + end; + if (TagName = 'finalxform') or (activeXformSet > 0) then FinalXformLoaded := true; + + with ParseCP.xform[nXform] do begin + Clear; + v := Attributes.Value('weight'); + if (v <> '') and (TagName = 'xform') then density := StrToFloat(String(v)); + if (TagName = 'finalxform') then + begin + v := Attributes.Value('enabled'); + if v <> '' then ParseCP.finalXformEnabled := (StrToInt(String(v)) <> 0) + else ParseCP.finalXformEnabled := true; + end; + + if activexformset > 0 then density := 0; // tmp... + + ///////////// AV: checking variation order //////////////////// + // TODO: optimize! + v := Attributes.Value('var_order'); + if v <> '' then begin + GetTokens(String(v), tokens); + k := -1; + for j := 0 to Tokens.Count-1 do + begin + vindex := ifs.IndexOf(Tokens[j]); + if vindex >= 0 then + begin + inc(k); + ifs.Move(vindex, k); + end; + end; + end; + ////////////////////////////////////////////////////////////// + + v := Attributes.Value('color'); + if v <> '' then color := StrToFloat(String(v)); + v := Attributes.Value('var_color'); + if v <> '' then pluginColor := StrToFloat(String(v)); + v := Attributes.Value('symmetry'); + if v <> '' then symmetry := StrToFloat(String(v)); + v := Attributes.Value('coefs'); + GetTokens(String(v), tokens); + if Tokens.Count < 6 then Application.MessageBox(PChar(TextByKey('common-invalidformat')), 'Apophysis', MB_ICONERROR); + c[0][0] := StrToFloat(Tokens[0]); + c[0][1] := StrToFloat(Tokens[1]); + c[1][0] := StrToFloat(Tokens[2]); + c[1][1] := StrToFloat(Tokens[3]); + c[2][0] := StrToFloat(Tokens[4]); + c[2][1] := StrToFloat(Tokens[5]); + + v := Attributes.Value('post'); + if v <> '' then begin + GetTokens(String(v), tokens); + if Tokens.Count < 6 then Application.MessageBox(PChar(TextByKey('common-invalidformat')), 'Apophysis', MB_ICONERROR); + p[0][0] := StrToFloat(Tokens[0]); + p[0][1] := StrToFloat(Tokens[1]); + p[1][0] := StrToFloat(Tokens[2]); + p[1][1] := StrToFloat(Tokens[3]); + p[2][0] := StrToFloat(Tokens[4]); + p[2][1] := StrToFloat(Tokens[5]); + end; + + v := Attributes.Value('chaos'); + if v <> '' then begin + GetTokens(String(v), tokens); + for i := 0 to Tokens.Count-1 do + modWeights[i] := Abs(StrToFloat(Tokens[i])); + end; + //else for i := 0 to NXFORMS-1 do modWeights[i] := 1; + + // for 2.09 flames compatibility + v := Attributes.Value('opacity'); + if v <> '' then begin + if StrToFloat(String(v)) = 0.0 then begin + transOpacity := 0; + end else begin + transOpacity := StrToFloat(String(v)); + end; + end; + + // 7x.9 name tag + v := Attributes.Value('name'); + if v <> '' then begin + TransformName := String(v); + end; + + v := Attributes.Value('plotmode'); + if v <> '' then begin + if v = 'off' then begin + transOpacity := 0; + end; + end; + + // tricky: attempt to convert parameters to 15C+-format if necessary + if ParseCp.noLinearFix then + for i := 0 to 1 do + begin + SetVariation(i, 0); + v := TStringType(ReadWithSubst(Attributes, varnames(i))); + //v := Attributes.Value(AnsiString(varnames(i))); + if v <> '' then + SetVariation(i, StrToFloat(String(v))); + end + else begin + SetVariation(0, linear_val(Attributes)); + if ApplyFlatten then // AV + SetVariation(1, flatten_val(Attributes)); + end; + + // now parse the rest of the variations...as usual + for i := 2 to NRVAR - 1 do + begin + SetVariation(i, 0); + v := TStringType(ReadWithSubst(Attributes, varnames(i))); + //v := Attributes.Value(AnsiString(varnames(i))); + if v <> '' then + SetVariation(i, StrToFloat(String(v))); + end; + + // and the variables + for i := 0 to GetNrVariableNames - 1 do begin + v := TStringType(ReadWithSubst(Attributes, GetVariableNameAt(i))); + //v := Attributes.Value(AnsiString(GetVariableNameAt(i))); + if v <> '' then begin + {$ifndef VAR_STR} + d := StrToFloat(String(v)); + SetVariable(GetVariableNameAt(i), d); + {$else} + SetVariableStr(GetVariableNameAt(i), String(v)); + {$endif} + end; + end; + + {***** AV: tryig to convert old Apo 2.0x variations into new ones *****} + if oldApo then begin + // AV: 'perspective' into 'projective' + v := Attributes.Value('perspective'); + s := Attributes.Value('projective'); + if (v <> '') and (s = '') then // avoid to overwrite + begin + d := StrToFloat(String(v)); + SetVariation(GetVariationIndex('projective'), d); + v := Attributes.Value('perspective_dist'); + l := Attributes.Value('perspective_angle'); + vl := StrToFloat(String(v)); // dist + d := StrToFloat(String(l)); // angle + n := 0; + SetVariable('pr_A', n); + SetVariable('pr_B1', n); + SetVariable('pr_C1', n); + SetVariable('pr_A2', n); + SetVariable('pr_C2', n); + SetVariable('pr_A1', vl); + SetVariable('pr_C', vl); + n := -sin(d * pi * 0.5); + SetVariable('pr_B', n); + n := vl * cos(d * pi * 0.5); + SetVariable('pr_B2', n); + n := 1; + SetVariable('projective_mode', n); + end + else if (v <> '') and (s <> '') then + begin + MissingPlugin.MissingPluginList.Add('perspective'); + MissingPlugin.MissingPluginList.Add('perspective_angle'); + MissingPlugin.MissingPluginList.Add('perspective_dist'); + end; + + v := Attributes.Value('rings'); + s := Attributes.Value('rings2'); + if (v <> '') and (s = '') then + begin + d := StrToFloat(String(v)); + SetVariation(GetVariationIndex('rings2'), d); + n := c[2][0]; + SetVariable('rings2_val', n); + n := 1; + SetVariable('rings2_old', n); + end + else if (v <> '') and (s <> '') then + MissingPlugin.MissingPluginList.Add('rings'); + + v := Attributes.Value('fan'); + s := Attributes.Value('fan2'); + if (v <> '') and (s = '') then + begin + d := StrToFloat(String(v)); + SetVariation(GetVariationIndex('fan2'), d); + n := c[2][0]; + SetVariable('fan2_x', n); + n := c[2][1]; + SetVariable('fan2_y', n); + n := 0; // AV: it is 1 only for 2.09 'fan2' + SetVariable('fan2_old', n); + end + else if (v <> '') and (s <> '') then + MissingPlugin.MissingPluginList.Add('fan'); + + v := Attributes.Value('bent'); + if (v <> '') then + begin + s := Attributes.Value('bent2'); + if (s = '') then + begin + d := StrToFloat(String(v)); + SetVariation(GetVariationIndex('bent2'), d); + n := 2; + SetVariable('bent2_x', n); + n := 0.5; + SetVariable('bent2_y', n); + n := 1; + SetVariable('bent2_z', n); + end + else MissingPlugin.MissingPluginList.Add('bent'); + end; + + v := Attributes.Value('waves'); + s := Attributes.Value('waves2'); + if (v <> '') and (s = '') then + begin + d := StrToFloat(String(v)); + SetVariation(GetVariationIndex('waves2'), d); + n := c[1][0]; + SetVariable('waves2_scalex', n); + n := 1/(sqr(c[2][0]) + 1E-300); + SetVariable('waves2_freqx', n); + n := c[1][1]; + SetVariable('waves2_scaley', n); + n := 1/(sqr(c[2][1]) + 1E-300); + SetVariable('waves2_freqy', n); + n := 0; + SetVariable('waves2_scalez', n); + SetVariable('waves2_freqz', n); + end + else if (v <> '') and (s <> '') then + MissingPlugin.MissingPluginList.Add('waves'); + + v := Attributes.Value('popcorn'); + if (v <> '') then + begin + s := Attributes.Value('popcorn2'); + if (s = '') then + begin + d := StrToFloat(String(v)); + SetVariation(GetVariationIndex('popcorn2'), d); + n := c[2][0]; + SetVariable('popcorn2_x', n); + n := c[2][1]; + SetVariable('popcorn2_y', n); + n := 3; + SetVariable('popcorn2_c', n); + end + else MissingPlugin.MissingPluginList.Add('popcorn'); + end; + end; // oldApo + + // AV: Droste into Escher + v := Attributes.Value('droste'); + s := Attributes.Value('escher'); + if (v <> '') and (s = '') then + begin + d := StrToFloat(String(v)); + SetVariation(GetVariationIndex('escher'), d); + v := Attributes.Value('droste_r1'); + l := Attributes.Value('droste_r2'); + try + vl := StrToFloat(String(v)); // r1 + d := StrToFloat(String(l)); // r2 + if (vl <> d) then + n := 2 * arctan(ln(d / vl) / 2 / pi) + else n := 0; + SetVariable('escher_beta', n); + except + n := 0; + SetVariable('escher_beta', n); + end; + end + else if (v <> '') and (s <> '') then + begin + MissingPlugin.MissingPluginList.Add('droste'); + MissingPlugin.MissingPluginList.Add('droste_r1'); + MissingPlugin.MissingPluginList.Add('droste_r2'); + end; + + // Spherical3D into inversion3D + v := Attributes.Value('Spherical3D'); + if (v <> '') and (GetVariationIndex('Spherical3D')< 0) then + // if plugin is NOT available + begin + s := Attributes.Value('inversion3D'); + if (s = '') then + begin + d := StrToFloat(String(v)); + SetVariation(GetVariationIndex('inversion3D'), d); + n := 1; + SetVariable('inversion3D_radius', n); + n := 0; + SetVariable('inversion3D_x0', n); + SetVariable('inversion3D_y0', n); + SetVariable('inversion3D_z0', n); + end + else MissingPlugin.MissingPluginList.Add('Spherical3D'); + end; + + // secant into secant2 + v := Attributes.Value('secant'); + if (v <> '') and (GetVariationIndex('secant') < 0) then + // if plugin is NOT available + begin + s := Attributes.Value('secant2'); + if (s = '') then + begin + d := StrToFloat(String(v)); + SetVariation(GetVariationIndex('secant2'), d); + n := 1; + SetVariable('secant2_old', n); + end + else MissingPlugin.MissingPluginList.Add('secant'); + end; + + // arch into Z_arch + v := Attributes.Value('arch'); + if (v <> '') then + begin + s := Attributes.Value('Z_arch'); + if (s = '') then + begin + d := StrToFloat(String(v)); + SetVariation(GetVariationIndex('Z_arch'), d); + SetVariable('Z_arch_weight', d); + end + else MissingPlugin.MissingPluginList.Add('arch'); + end; + + {*****************************************************************************} + + // legacy variation/variable notation + v := Attributes.Value('var1'); + if v <> '' then + begin + for i := 0 to NRVAR - 1 do + SetVariation(i, 0); + SetVariation(StrToInt(String(v)), 1); + end; + v := Attributes.Value('var'); + if v <> '' then + begin + for i := 0 to NRVAR - 1 do + SetVariation(i, 0); + GetTokens(String(v), tokens); + if Tokens.Count > NRVAR then Application.MessageBox(PChar(TextByKey('common-invalidformat')), 'Apophysis', MB_ICONERROR); + for i := 0 to Tokens.Count - 1 do + SetVariation(i, StrToFloat(Tokens[i])); + end; + end; + Inc(nXform); + end; + if TagName = 'color' then + begin + // disable generating palette + //if Parsecp.cmapindex = -2 then + Parsecp.cmapindex := -1; + + i := StrToInt(String(Attributes.value('index'))); + v := Attributes.value('rgb'); + GetTokens(String(v), tokens); + floatcolor := StrToFloat(Tokens[0]); + Parsecp.cmap[i][0] := round(floatcolor); + floatcolor := StrToFloat(Tokens[1]); + Parsecp.cmap[i][1] := round(floatcolor); + floatcolor := StrToFloat(Tokens[2]); + Parsecp.cmap[i][2] := round(floatcolor); + end; + if TagName = 'colors' then + begin + ParseCompactcolors(Parsecp, StrToInt(String(Attributes.value('count'))), + String(Attributes.value('data'))); + Parsecp.cmapindex := -1; + end; + if TagName = 'symmetry' then + begin + i := StrToInt(String(Attributes.value('kind'))); + Parsecp.symmetry := i; + end; + if TagName = 'xdata' then + begin + Parsecp.xdata := Parsecp.xdata + String(Attributes.value('content')); + end; + finally + Tokens.free; + end; +end; + +procedure TMainForm.mnuFlamepdfClick(Sender: TObject); +begin + WinShellOpen('http://www.flam3.com/flame_draves.pdf'); +end; + +procedure TMainForm.mnuFlattenClick(Sender: TObject); +var + i, j, t: integer; + v: double; + refresh: boolean; + flat: array of integer; +begin + StopThread; + refresh := False; + // AV: using new Delphi's feature for dynamic arrays + flat := [GetVariationIndex('crop'), GetVariationIndex('auger'), + GetVariationIndex('bipolar'), GetVariationIndex('blur'), + GetVariationIndex('blur_circle'), GetVariationIndex('blur_pixelize'), + GetVariationIndex('blur_zoom'), GetVariationIndex('horseshoe'), + GetVariationIndex('diamond'), GetVariationIndex('disc'), + GetVariationIndex('bent2'), GetVariationIndex('escher'), + GetVariationIndex('eyefish'), GetVariationIndex('fan2'), + GetVariationIndex('flux'), GetVariationIndex('foci'), + GetVariationIndex('log'), GetVariationIndex('bwraps'), + GetVariationIndex('juliascope'), GetVariationIndex('julian'), + GetVariationIndex('mobius'), GetVariationIndex('noise'), + GetVariationIndex('ngon'), GetVariationIndex('curl'), + GetVariationIndex('rings2'), GetVariationIndex('scry'), + GetVariationIndex('spherical'), GetVariationIndex('spiral'), + GetVariationIndex('circlecrop'), GetVariationIndex('swirl'), + GetVariationIndex('wedge'), GetVariationIndex('rectangles'), + GetVariationIndex('polar'), GetVariationIndex('polar2'), + GetVariationIndex('linear'), GetVariationIndex('cross'), + GetVariationIndex('pdj'), GetVariationIndex('hyperbolic'), + GetVariationIndex('radial_blur'), GetVariationIndex('elliptic'), + GetVariationIndex('lazysusan'), GetVariationIndex('checks'), + GetVariationIndex('cropn'), GetVariationIndex('post_smartcrop')]; + + if maincp.HasFinalXForm then t := Transforms + else t := Transforms - 1; + + for i := 0 to t do + for j in flat do // AV: iterate only for chosen variation indices + begin + if (j < 0) then continue; + v := maincp.xform[i].GetVariation(j); + if (v <> 0) and (maincp.xform[i].GetVariation(1) = 0) then + begin + maincp.xform[i].SetVariation(1, 1); // apply flatten + refresh := True; + end; + end; + + if refresh then + begin + UpdateUndo; + RedrawTimer.Enabled := True; + UpdateWindows; + end; + + SetLength(flat, 0); +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TMainForm.ImageMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin +(* + if button = mbMiddle then begin + //FMouseMoveState := msHeight; + exit; + end else if button = mbRight then begin + //FMouseMoveState := msPitchYaw; + camDragValueY := MainCP.cameraPitch * 180.0 / PI; + camDragValueX := MainCP.cameraYaw * 180.0 / PI; + + camDragMode := true; + camDragPos.x := 0; + camDragPos.y := 0; + camDragOld.x := x; + camDragOld.y := y; + camMM := false; + //SetCaptureControl(TControl(Sender)); + + //Screen.Cursor := crNone; + //GetCursorPos(mousepos); // hmmm + //mousePos := (Sender as TControl).ClientToScreen(Point(x, y)); + camDragged := false; + exit; + end; +*) + if button <> mbLeft then exit; + FClickRect.TopLeft := Point(x, y); + FClickRect.BottomRight := FClickRect.TopLeft; + case FMouseMoveState of + msZoomWindow: + begin + FSelectRect.TopLeft := Point(x, y); + FSelectRect.BottomRight := Point(x, y); + DrawZoomWindow; + +// if ssAlt in Shift then +// FMouseMoveState := msZoomOutWindowMove +// else + FMouseMoveState := msZoomWindowMove; + end; + msZoomOutWindow: + begin + FSelectRect.TopLeft := Point(x, y); + FSelectRect.BottomRight := Point(x, y); + DrawZoomWindow; + +// if ssAlt in Shift then +// FMouseMoveState := msZoomWindowMove +// else + FMouseMoveState := msZoomOutWindowMove; + end; + msDrag: + begin + if not assigned(FViewImage) then exit; + +// FSelectRect.TopLeft := Point(x, y); +// FSelectRect.BottomRight := Point(x, y); + FMouseMoveState := msDragMove; + end; + msRotate: + begin + FClickAngle := arctan2(y - Image.Height/2, Image.Width/2 - x); + + FRotateAngle := 0; +// FSelectRect.Left := x; + DrawRotateLines(FRotateAngle); + FMouseMoveState := msRotateMove; + end; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TMainForm.ImageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); +const + snap_angle = 0.261799387799149; // AV: the same as 15*pi/180; +var + dx, dy, cx, cy, sgn: integer; + sc, vx, vy, scale: double; + q : Extended; +begin +{ + case FMouseMoveState of + msRotate, msRotateMove: + Image.Cursor := crEditRotate; + msDrag, msDragMove: + Image.Cursor := crEditMove; + else + Image.Cursor := crEditArrow; + end; +} + case FMouseMoveState of + msZoomWindowMove, + msZoomOutWindowMove: + begin + if DrawSelection then DrawZoomWindow; + FClickRect.BottomRight := Point(x, y); + dx := x - FClickRect.TopLeft.X; + dy := y - FClickRect.TopLeft.Y; + + if ssShift in Shift then begin + if (dy = 0) or (abs(dx/dy) >= Image.Width/Image.Height) then + dy := Round(dx / Image.Width * Image.Height) + else + dx := Round(dy / Image.Height * Image.Width); + FSelectRect.Left := FClickRect.TopLeft.X - dx; + FSelectRect.Top := FClickRect.TopLeft.Y - dy; + FSelectRect.Right := FClickRect.TopLeft.X + dx; + FSelectRect.Bottom := FClickRect.TopLeft.Y + dy; + end + else if ssCtrl in Shift then begin + FSelectRect.TopLeft := FClickRect.TopLeft; + sgn := IfThen(dy*dx >=0, 1, -1); + if (dy = 0) or (abs(dx/dy) >= Image.Width/Image.Height) then begin + FSelectRect.Right := x; + FSelectRect.Bottom := FClickRect.TopLeft.Y + sgn * Round(dx / Image.Width * Image.Height); + end + else begin + FSelectRect.Right := FClickRect.TopLeft.X + sgn * Round(dy / Image.Height * Image.Width); + FSelectRect.Bottom := y; + end; + end + else begin + sgn := IfThen(dy*dx >=0, 1, -1); + if (dy = 0) or (abs(dx/dy) >= Image.Width/Image.Height) then begin + cy := (y + FClickRect.TopLeft.Y) div 2; + FSelectRect.Left := FClickRect.TopLeft.X; + FSelectRect.Right := x; + FSelectRect.Top := cy - sgn * Round(dx / 2 / Image.Width * Image.Height); + FSelectRect.Bottom := cy + sgn * Round(dx / 2 / Image.Width * Image.Height); + end + else begin + cx := (x + FClickRect.TopLeft.X) div 2; + FSelectRect.Left := cx - sgn * Round(dy / 2 / Image.Height * Image.Width); + FSelectRect.Right := cx + sgn * Round(dy / 2 / Image.Height * Image.Width); + FSelectRect.Top := FClickRect.TopLeft.Y; + FSelectRect.Bottom := y; + end; + end; + DrawZoomWindow; + DrawSelection := true; + end; + msDragMove: + begin + assert(assigned(FviewImage)); + assert(FViewScale <> 0); + + scale := FViewScale * Image.Width / FViewImage.Width; + FViewPos.X := FViewPos.X + (x - FClickRect.Right) / scale; + FViewPos.Y := FViewPos.Y + (y - FClickRect.Bottom) / scale; + //FClickRect.BottomRight := Point(x, y); + + DrawImageView; + end; + { msPitchYaw: + begin + if camDragMode and ( (x <> camDragOld.x) or (y <> camDragOld.y) ) then + begin + Inc(camDragPos.x, x - camDragOld.x); + Inc(camDragPos.y, y - camDragOld.y); + + vx := Round6(camDragValueX + camDragPos.x / 10); + vy := Round6(camDragValueY - camDragPos.y / 10); + + MainCP.cameraPitch := vy * PI / 180.0; + MainCP.cameraYaw := vx * PI / 180.0; + + vx := Round(vx); + vy := Round(vy); + + camDragged := True; + //StatusBar.Panels.Items[1].Text := Format('Pitch: %f°, Yaw: %f°', [vx,vy]); + end; + end; } + msRotateMove: + begin + if DrawSelection then DrawRotatelines(FRotateAngle); + + FRotateAngle := arctan2(y-Image.Height/2, Image.Width/2-x) - FClickAngle; + if ssShift in Shift then // angle snap + FRotateAngle := Round(FRotateAngle/snap_angle)*snap_angle; + //SelectRect.Left := x; + +// pdjpointgen.Rotate(FRotateAngle); +// FRotateAngle := 0; + + DrawRotatelines(FRotateAngle); + DrawSelection := true; + { + Image.Refresh; + if AdjustForm.Visible then begin + MainCp.FAngle:=-FRotateAngle; + AdjustForm.UpdateDisplay; + end; + } + end; + end; + FClickRect.BottomRight := Point(x, y); +end; + +function ScaleRect(r: TRect; scale: double): TSRect; +begin + Result.Left := r.Left * scale; + Result.Top := r.Top * scale; + Result.Right := r.Right * scale; + Result.Bottom := r.Bottom * scale; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TMainForm.ImageMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +var + scale: double; + rs: TSRect; +begin + case FMouseMoveState of + msZoomWindowMove: + begin + DrawZoomWindow; + FMouseMoveState := msZoomWindow; + if (abs(FSelectRect.Left - FSelectRect.Right) < 10) or + (abs(FSelectRect.Top - FSelectRect.Bottom) < 10) then + Exit; // zoom to much or double clicked + + StopThread; + UpdateUndo; + MainCp.ZoomtoRect(ScaleRect(FSelectRect, MainCP.Width / Image.Width)); + + FViewScale := FViewScale * Image.Width / abs(FSelectRect.Right - FSelectRect.Left); + FViewPos.x := FViewPos.x - ((FSelectRect.Right + FSelectRect.Left) - Image.Width)/2; + FViewPos.y := FViewPos.y - ((FSelectRect.Bottom + FSelectRect.Top) - Image.Height)/2; + DrawImageView; + + RedrawTimer.Enabled := True; + UpdateWindows; + end; + msZoomOutWindowMove: + begin + DrawZoomWindow; + FMouseMoveState := msZoomOutWindow; + if (abs(FSelectRect.Left - FSelectRect.Right) < 10) or + (abs(FSelectRect.Top - FSelectRect.Bottom) < 10) then + Exit; // zoom to much or double clicked + + StopThread; + UpdateUndo; + MainCp.ZoomOuttoRect(ScaleRect(FSelectRect, MainCP.Width / Image.Width)); + + scale := Image.Width / abs(FSelectRect.Right - FSelectRect.Left); + FViewScale := FViewScale / scale; + FViewPos.x := scale * (FViewPos.x + ((FSelectRect.Right + FSelectRect.Left) - Image.Width)/2); + FViewPos.y := scale * (FViewPos.y + ((FSelectRect.Bottom + FSelectRect.Top) - Image.Height)/2); + + DrawImageView; + + RedrawTimer.Enabled := True; + UpdateWindows; + end; + msDragMove: + begin + FClickRect.BottomRight := Point(x, y); + FMouseMoveState := msDrag; + + if ((x = 0) and (y = 0)) or // double clicked + ((FClickRect.left = FClickRect.right) and (FClickRect.top = FClickRect.bottom)) + then Exit; + + StopThread; + UpdateUndo; + MainCp.MoveRect(ScaleRect(FClickRect, MainCP.Width / Image.Width)); + + RedrawTimer.Enabled := True; + UpdateWindows; + end; + msRotateMove: + begin + DrawRotatelines(FRotateAngle); + + FMouseMoveState := msRotate; + + if (FRotateAngle = 0) then Exit; // double clicked + + StopThread; + UpdateUndo; + if MainForm_RotationMode = 0 then MainCp.Rotate(FRotateAngle) + else MainCp.Rotate(-FRotateAngle); + + if assigned(FViewImage) then begin + FViewImage.Free; + FViewImage := nil; + DrawImageView; + end; + + RedrawTimer.Enabled := True; + UpdateWindows; + end; + { msPitchYaw: + begin + camDragMode := false; + Screen.Cursor := crDefault; + + if camDragged then + begin + camDragged := False; + RedrawTimer.Enabled := True; + UpdateWindows; + end; + + + end; } + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TMainForm.DrawImageView; +var + i, j: integer; + bm: TBitmap; + r: TRect; + scale: double; +const + msg = #54; // 'NO PREVIEW'; +var + ok: boolean; + GlobalMemoryInfo: TMemoryStatus; // holds the global memory status information + area: int64; + gridp: integer; +begin + bm := TBitmap.Create; + bm.Width := Image.Width; + bm.Height := Image.Height; + with bm.Canvas do begin + if ShowTransparency then begin + Brush.Color := $F0F0F0; + FillRect(Rect(0, 0, bm.Width, bm.Height)); + Brush.Color := $C0C0C0; + for i := 0 to ((bm.Width - 1) shr 3) do begin + for j := 0 to ((bm.Height - 1) shr 3) do begin + if odd(i + j) then + FillRect(Rect(i shl 3, j shl 3, (i+1) shl 3, (j+1) shl 3)); + end; + end; + end + else begin + Brush.Color := MainCP.background[0] or (MainCP.background[1] shl 8) or (MainCP.background[2] shl 16); + FillRect(Rect(0, 0, bm.Width, bm.Height)); + end; + end; + + ok := false; + if assigned(FViewImage) then begin + scale := FViewScale * Image.Width / FViewImage.Width; + + r.Left := Image.Width div 2 + round(scale * (FViewPos.X - FViewImage.Width/2)); + r.Right := Image.Width div 2 + round(scale * (FViewPos.X + FViewImage.Width/2)); + r.Top := Image.Height div 2 + round(scale * (FViewPos.Y - FViewImage.Height/2)); + r.Bottom := Image.Height div 2 + round(scale * (FViewPos.Y + FViewImage.Height/2)); + + GlobalMemoryInfo.dwLength := SizeOf(GlobalMemoryInfo); + GlobalMemoryStatus(GlobalMemoryInfo); + area := abs(r.Right - r.Left) * int64(abs(r.Bottom - r.Top)); + + if (area * 4 < GlobalMemoryInfo.dwAvailPhys div 2) or + (area <= Screen.Width*Screen.Height*4) then + try + FViewImage.Draw(bm.Canvas, r); + ok := true; + except + end; + + // Gridlines for composition (taken from JK mod by Jed Kelsey) + if (EnableGuides) then begin + with bm.Canvas do begin + Pen.Width := 1; + Pen.Color := TColor(LineCenterColor); //$000000; // Center + MoveTo(0, bm.Height shr 1); LineTo(bm.Width, bm.Height shr 1); + MoveTo(bm.Width shr 1, 0); LineTo(bm.Width shr 1, bm.Height); + Pen.Color := TColor(LineThirdsColor); //$C000C0; // Thirds + gridp := Floor(bm.Height/3); + MoveTo(0, gridp); LineTo(bm.Width, gridp); + MoveTo(0, bm.Height-gridp); LineTo(bm.Width, bm.Height-gridp); + gridp := Floor(bm.Width/3); + MoveTo(gridp, 0); LineTo(gridp, bm.Height); + MoveTo(bm.Width-gridp, 0); LineTo(bm.Width-gridp, bm.Height); + Pen.Color := TColor(LineGRColor); //$0000F0; // "Golden Ratio" (per axis) + gridp := Floor(bm.Height * 0.61803399); + MoveTo(0, gridp); LineTo(bm.Width, gridp); + MoveTo(0, bm.Height-gridp); LineTo(bm.Width, bm.Height-gridp); + gridp := Floor(bm.Width * 0.61803399); + MoveTo(gridp, 0); LineTo(gridp, bm.Height); + MoveTo(bm.Width-gridp, 0); LineTo(bm.Width-gridp, bm.Height); + end; + end; + end; + + if not ok then + with bm.Canvas do + begin + Font.Name := 'Wingdings'; // 'Arial'; + Font.Height := bm.Height div 4; + Font.Color := $808080; + Brush.Style := bsClear; + i := (bm.Width - TextWidth(msg)) div 2; + j := (bm.Height - TextHeight(msg)) div 2; + Font.Color := 0; + TextOut(i+2,j+2, msg); + Font.Color := clWhite; //$808080; + TextOut(i,j, msg); + end; + Image.Picture.Graphic := bm; + //EditForm.PaintBackground; + Image.Refresh; + bm.Free; +end; + +/////////////////////////////////////////////////////////////////////////////// +(* +procedure TMainForm.DrawPitchYawLines(YawAngle: double; PitchAngle: double); +var + bkuPen: TPen; + points: array[0..3] of TPoint; + i: integer; +begin + bkuPen := TPen.Create; + bkuPen.Assign(Image.Canvas.Pen); + Image.Canvas.Pen.Mode := pmXor; + Image.Canvas.Pen.Color := clWhite; + Image.Canvas.Pen.Style := psDot; //psDash; + Image.Canvas.Brush.Style := bsClear; + +// Image.Canvas.Rectangle(FSelectRect); + points[0].x := 0; + points[0].y := round((Image.Height / 2) * sin(PitchAngle)); + points[1].x := Image.Width - 1; + points[1].y := points[0].y; + points[2].x := points[1].x; + points[2].y := round((Image.Height) - ((Image.Height / 2) * sin(PitchAngle))); + points[3].x := points[0].x; + points[3].y := points[2].y; + + Image.Canvas.MoveTo(Points[3].x, Points[3].y); + for i := 0 to 3 do begin + Image.Canvas.LineTo(Points[i].x, Points[i].y); + end; + + Image.Canvas.Pen.Assign(bkuPen); + bkuPen.Free; +end; + *) + +procedure TMainForm.DrawRotateLines(Angle: double); +var + bkuPen: TPen; + points: array[0..3] of TPoint; + i,x,y: integer; +begin + bkuPen := TPen.Create; + bkuPen.Assign(Image.Canvas.Pen); + Image.Canvas.Pen.Mode := pmXor; + Image.Canvas.Pen.Color := clWhite; + Image.Canvas.Pen.Style := psDot; //psDash; + Image.Canvas.Brush.Style := bsClear; + +// Image.Canvas.Rectangle(FSelectRect); + points[0].x := (Image.Width div 2)-1; + points[0].y := (Image.Height div 2)-1; + points[1].x := (Image.Width div 2)-1; + points[1].y := -Image.Height div 2; + points[2].x := -Image.Width div 2; + points[2].y := -Image.Height div 2; + points[3].x := -Image.Width div 2; + points[3].y := (Image.Height div 2)-1; + + for i := 0 to 3 do begin + x := points[i].x; + y := points[i].y; + + points[i].x := round(cos(Angle) * x + sin(Angle) * y) + Image.Width div 2; + points[i].y := round(-sin(Angle) * x + cos(Angle) * y) + Image.Height div 2; + end; + + Image.Canvas.MoveTo(Points[3].x, Points[3].y); + for i := 0 to 3 do begin + Image.Canvas.LineTo(Points[i].x, Points[i].y); + end; + + Image.Canvas.Pen.Assign(bkuPen); + bkuPen.Free; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TMainForm.DrawZoomWindow; +const + cornerSize = 32; +var + bkuPen: TPen; + dx, dy, cx, cy: integer; + l, r, t, b: integer; +begin + bkuPen := TPen.Create; + bkuPen.Assign(Image.Canvas.Pen); + with Image.Canvas do begin + Pen.Mode := pmXor; + Pen.Color := clWhite; + Brush.Style := bsClear; + + Pen.Style := psDot; //psDash; + + if ssShift in FShiftState then + begin + dx := FClickRect.Right - FClickRect.Left; + dy := FClickRect.Bottom - FClickRect.Top; + Rectangle(FClickRect.Left - dx, FClickRect.Top - dy, FClickRect.Right, FClickRect.Bottom); + end + else Rectangle(FClickRect); + + dx := FSelectRect.Right - FSelectRect.Left; + if dx >= 0 then begin + l := FSelectRect.Left - 1; + r := FSelectRect.Right; + end + else begin + dx := -dx; + l := FSelectRect.Right - 1; + r := FSelectRect.Left; + end; + dx := min(dx div 2 - 1, cornerSize); + + dy := FSelectRect.Bottom - FSelectRect.Top; + if dy >= 0 then begin + t := FSelectRect.Top - 1; + b := FSelectRect.Bottom; + end + else begin + dy := -dy; + t := FSelectRect.Bottom - 1; + b := FSelectRect.Top; + end; + dy := min(dy div 2, cornerSize); + + pen.Style := psSolid; + + MoveTo(l + dx, t); + LineTo(l, t); + LineTo(l, t + dy); + MoveTo(r - dx, t); + LineTo(r, t); + LineTo(r, t + dy); + MoveTo(r - dx, b); + LineTo(r, b); + LineTo(r, b - dy); + MoveTo(l + dx, b); + LineTo(l, b); + LineTo(l, b - dy); +{ + cx := (l + r) div 2; + cy := (t + b) div 2; + MoveTo(cx - dx div 2, cy); + LineTo(cx + dx div 2 + 1, cy); + MoveTo(cx, cy - dy div 2); + LineTo(cx, cy + dy div 2 + 1); +} + Pen.Assign(bkuPen); + end; + bkuPen.Free; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TMainForm.tbzoomwindowClick(Sender: TObject); +begin + FMouseMoveState := msZoomWindow; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TMainForm.tbzoomoutwindowClick(Sender: TObject); +begin + FMouseMoveState := msZoomOutWindow; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TMainForm.tbDragClick(Sender: TObject); +begin + FMouseMoveState := msDrag; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TMainForm.tbRotateClick(Sender: TObject); +begin + FMouseMoveState := msRotate; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TMainForm.FillVariantMenu; +var + i: integer; + s: string; + NewMenuItem : TMenuItem; +begin + SetLength(VarMenus, NrVar); + // AV: to prevent underlined letters with GUI themes + mnuBuiltinVars.AutoHotkeys := maManual; + mnuPluginVars.AutoHotkeys := maManual; + + for i := 0 to NRVAR - 1 do begin + NewMenuItem := TMenuItem.Create(self); + s := varnames(i); + NewMenuItem.Caption := uppercase(s[1]) + copy(s, 2, length(s)-1); + NewMenuItem.OnClick := VariantMenuClick; + NewMenuItem.Enabled := True; + NewMenuItem.Name := 'var' + intTostr(i); + NewMenuItem.Tag := i; + NewMenuItem.GroupIndex := 2; + NewMenuItem.RadioItem := True; + // AV: exotic GUI styles not always work well :-/ + if TStyleManager.ActiveStyle.Name <> 'Windows' then + if (i mod 30 = 0) then NewMenuItem.Break := mbBreak; + VarMenus[i] := NewMenuItem; + if i < NumBuiltinVars then + mnuBuiltinVars.Add(NewMenuItem) + else + mnuPluginVars.Add(NewMenuItem); + end; +end; + +/////////////////////////////////////////////////////////////////////////////// + +procedure TMainForm.VariantMenuClick(Sender: TObject); +var i: integer; +begin + TMenuItem(Sender).Checked := True; + // AV: only one variation type can be active, + // but Apo allows to check up to 3 menu items, confusing users... + mnuVRandom.Checked := False; + if (TMenuItem(Sender).Tag >= NumBuiltinVars) then + begin + for i := 0 to NumBuiltinVars-1 do + VarMenus[i].Checked := False; // AV + mnuBuiltinVars.Checked := False; + mnuPluginVars.Checked := True; + end + else begin + for i := NumBuiltinVars to NrVar - 1 do + VarMenus[i].Checked := False; // AV + mnuBuiltinVars.Checked := True; + mnuPluginVars.Checked := False; + end; + UpdateUndo; + Variation := TVariation(TMenuItem(Sender).Tag); // ? + SetVariation(maincp); + ResetLocation; + RedrawTimer.Enabled := True; + UpdateWindows; +end; + +////////// AV: Apo UI Appearance ///////////////////// + +procedure TMainForm.CreateStyleList; +var i: integer; + s: string; + apostyle : TMenuItem; + sm: TStyleManager; +begin + sm := TStyleManager.Create; + for i := 0 to Length(sm.StyleNames)-1 do + begin + apostyle := TMenuItem.Create(mnuApoStyle); + s := sm.StyleNames[i]; + apostyle.Caption := s; + if (sm.ActiveStyle.Name = s) then + apostyle.Checked := True; + apostyle.Name := 'style' + IntToStr(i); + apostyle.RadioItem := True; + apostyle.Enabled := True; + apostyle.Tag := i; + apostyle.OnClick := StyleItemClick; + mnuApoStyle.Add(apostyle); + end; + sm.Free; +end; + +procedure TMainForm.ShowStyledWindows(Sender: TObject); +begin + self.ApplyThemedColors; + ScriptEditor.AdjustScripterColors; + EditForm.RedrawButtons; + AboutForm.SetTitleColor; +end; + +procedure TMainForm.StyleItemClick(Sender: TObject); +var + newGUI: string; + Registry: TRegistry; +begin + if not TMenuItem(Sender).Checked then + begin + TMenuItem(Sender).Checked := True; + newGUI := TStyleManager.StyleNames[TMenuItem(Sender).Tag]; + + try + StopThread; + self.OnShow := ShowStyledWindows; + + if EditForm.Visible then EditForm.Close; + if AdjustForm.Visible then AdjustForm.Close; + if MutateForm.Visible then MutateForm.Close; + if ScriptEditor.Visible then ScriptEditor.Close; + + TStyleManager.TrySetStyle(newGUI, false); + + except on EAccessViolation do // hmmm... + Application.MessageBox(PChar(TextByKey('options-restartnotice')), + PChar('Apophysis AV'), MB_ICONWARNING); + end; + + Registry := TRegistry.Create; + try + Registry.RootKey := HKEY_CURRENT_USER; + if Registry.OpenKey('\Software\' + APP_NAME + '\Defaults', True) then + Registry.WriteString('UIStyle', newGUI); + Registry.CloseKey; + finally + Registry.Free; + end; + end; +end; +//--Z--//////////////////////////////////////////////////////////////////////// + +procedure TMainForm.tbQualityBoxKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = ',') then Key := '.'; // AV + if not CharinSet(Key,['0'..'9', #8, #13, #27, '.']) then Key := #0; // AV + if key = #13 then + begin + tbQualityBoxSet(Sender); + key := #0; + end + else if key = #27 then // AV: Esc + tbQualityBox.Text := FloatToStr(defSampleDensity); +end; + +procedure TMainForm.tbQualityBoxSet(Sender: TObject); +var + q: double; +begin + try + q := StrToFloat(tbQualityBox.Text); + except + exit; + end; + defSampleDensity := q; + + StopThread; + RedrawTimer.Enabled := True; + UpdateWindows; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TMainForm.ImageDblClick(Sender: TObject); +begin + if FMouseMoveState = msRotateMove then + begin + StopThread; + UpdateUndo; + MainCp.FAngle := 0; + RedrawTimer.Enabled := True; + UpdateWindows; + end + else mnuResetLocationClick(Sender); +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TMainForm.tbShowAlphaClick(Sender: TObject); +begin + //tbShowAlpha.Down := not tbShowAlpha.Down; + ShowTransparency := tbShowAlpha.Down; + + DrawImageView; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TMainForm.tbShowTraceClick(Sender: TObject); +begin + TraceForm.Show; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TMainForm.FormKeyUpDown(Sender: TObject; var Key: Word; + Shift: TShiftState); +var + MousePos: TPoint; +begin + if Shift <> FShiftState then begin + if FMouseMoveState in [msZoomWindowMove, msZoomOutWindowMove, msRotateMove, msDragMove] then + begin + // hack: to generate MouseMove event + GetCursorPos(MousePos); + SetCursorPos(MousePos.x, MousePos.y); + end; + + if (FMouseMoveState in [msZoomWindowMove, msZoomOutWindowMove]) then + begin + DrawZoomWindow; + FShiftState := Shift; + DrawZoomWindow; + end + else FShiftState := Shift; + end; +end; + +{ +procedure TMainForm.ListViewChanging(Sender: TObject; Item: TListItem; + Change: TItemChange; var AllowChange: Boolean); +var sc, fc: string; +begin + if (Item = nil) or (Sender <> ListView1) then exit; + + sc := ''; fc := ''; + if (ListView1.Selected <> nil) then sc := ListView1.Selected.Caption; + if (ListView1.ItemFocused <> nil) then fc := ListView1.ItemFocused.Caption; + + if (Trim(Item.Caption) = Trim(maincp.name)) and (Item.Selected) and + (Item.Selected) and (Change = ctState) then + begin + if (DoNotAskAboutChange = true) then + begin + exit; + end; + if (UndoIndex <> 0) then + begin + // hack + if (LastCaptionSel = sc) and (LastCaptionFoc = fc) then begin + AllowChange := LastDecision; + if Not AllowChange then begin + ListView1.OnChange := nil; + ListView1.OnChanging := nil; + ListView1.Selected := Item; + ListView1.ItemFocused := Item; + ListView1.OnChanging := ListViewChanging; + ListView1.OnChange := ListViewChange; + end; + Exit; + end; + + LastCaptionSel := sc; + LastCaptionFoc := fc; + + if Application.MessageBox('Do you really want to open another flame? All changes made to the current flame will be lost.', 'Apophysis', MB_ICONWARNING or MB_YESNO) <> IDYES then + begin + AllowChange := false; + ListView1.OnChange := nil; + ListView1.OnChanging := nil; + ListView1.Selected := Item; + ListView1.ItemFocused := Item; + ListView1.OnChanging := ListViewChanging; + ListView1.OnChange := ListViewChange; + end + else + begin + AllowChange := true; + end; + + LastDecision := AllowChange; + end; + end; +end; + +procedure TMainForm.ListViewInfoTip(Sender: TObject; Item: TListItem; + var InfoTip: String); +var + Bitmap: TBitmap; + lcp: TControlPoint; +begin + // flame preview in a tooltip... + + BitMap := TBitMap.create; + Bitmap.PixelFormat := pf24bit; + BitMap.Width := 100; + BitMap.Height := 100; + + lcp := TControlPoint.Create; + lcp.Copy(mainCP); + lcp.cmap := mainCP.cmap; + + if Assigned(Renderer) then begin + Renderer.WaitFor; + Renderer.Free; + end; + if not Assigned(Renderer) then + begin + lcp.sample_density := 1; + lcp.spatial_oversample := 1; + lcp.spatial_filter_radius := 0.3; + lcp.AdjustScale(100, 100); + lcp.Transparency := false; + end; + try + Renderer := TRenderThread.Create; + assert(Renderer <> nil); + Renderer.BitsPerSample := 0 + Renderer.TargetHandle := self.Handle; + Renderer.SetCP(lcp); + Renderer.Priority := tpLower; + Renderer.NrThreads := 1 + Renderer.Resume; + Renderer.WaitFor; + except + end; + + lcp.Free; + Bitmap.Free; +end; +} + +procedure TMainForm.btnViewIconsClick(Sender: TObject); +var thumbs: TThumbnailThread; +begin + ListView1.ViewStyle := vsIcon; + btnViewList.Down := false; + btnViewIcons.Down := true; + ClassicListMode := false; + + // AV: refresh flame images ONLY if they didn't exist + if not GeneratingThumbs then + begin + thumbs := TThumbnailThread.Create; + thumbs.Start; + GeneratingThumbs := True; + end; + + // AV: scroll down to the selected flame preview + if MainForm.ListView1.SelCount > 0 then + MainForm.ListView1.Selected.MakeVisible(True); +end; + +procedure TMainForm.btnViewListClick(Sender: TObject); +begin + ListView1.ViewStyle := vsReport; + btnViewList.Down := true; + btnViewIcons.Down := false; + ClassicListMode := true; + ListView1.Column[1].Caption := IfThen(EnumerateFlames.Checked,' N ', ''); +end; + +procedure TMainForm.XmlScannerEndTag(Sender: TObject; TagName: String); +var sb : string; +begin + if (TagName = 'flame') then begin + EndParsing(ParseCP, sb); + MainForm.StatusBar.Panels[0].Text := sb; + end; +end; + +procedure TMainForm.tbCurvesClick(Sender: TObject); +begin + AdjustForm.UpdateDisplay; + AdjustForm.PageControl.TabIndex:=4; + AdjustForm.Show; +end; + +procedure TMainForm.tbMessagesClick(Sender: TObject); +begin + if (LoadForm.Showing = false) then LoadForm.Show; +end; + +procedure TMainForm.btNewClick(Sender: TObject); +begin + StopThread; // AV + if AlwaysCreateBlankFlame then + EditForm.tbResetAll.Click // AV + else + if TemplateForm.ShowModal = mrOK then // AV + if AutoSaveXML then + // AV: create a flame from scratch (rather than replace the current) if needed + begin + MainCp.name := MainCp.name + FormatDateTime(' (MM-dd-yyyy hh-mm-ss)', Now); + if MainForm.SaveXMLFlame(MainCp, MainCp.name, OpenFile) then + if SortFlames.Checked then + ListXML(OpenFile, 2, MainCp.name) // show the new item + else + ListXML(OpenFile, 0); // show the last item + end; +end; + +procedure TMainForm.FormResize(Sender: TObject); +begin + if (MainForm.Width <= TbBreakWidth) then + Toolbar.Height := 26 * 2 + 8 + else Toolbar.Height := 26; +end; + +{ +// AV: exactly the same code exists in the Global module +function Split(const fText: String; const fSep: Char; fTrim: Boolean=false; fQuotes: Boolean=false):TStringList; +var vI: Integer; + vBuffer: String; + vOn: Boolean; +begin + Result := TStringList.Create; + vBuffer:=''; + vOn:=true; + for vI:=1 to Length(fText) do + begin + if (fQuotes and(fText[vI]=fSep)and vOn)or(Not(fQuotes) and (fText[vI]=fSep)) then + begin + if fTrim then vBuffer:=Trim(vBuffer); + if vBuffer='' then vBuffer:=fSep; // !!! e.g. split(',**',',')... + if vBuffer[1]=fSep then + vBuffer:=Copy(vBuffer,2,Length(vBuffer)); + Result.Add(vBuffer); + vBuffer:=''; + end; + if fQuotes then + begin + if fText[vI]='"' then + begin + vOn:=Not(vOn); + Continue; + end; + if (fText[vI]<>fSep)or((fText[vI]=fSep)and(vOn=false)) then + vBuffer:=vBuffer+fText[vI]; + end else + if fText[vI]<>fSep then + vBuffer:=vBuffer+fText[vI]; + end; + if vBuffer<>'' then + begin + if fTrim then vBuffer:=Trim(vBuffer); + Result.Add(vBuffer); + end; +end; +} + +procedure TMainForm.mnuResetUIClick(Sender: TObject); +begin + ListBackPanel.Width := ThumbnailSize + 90; + Splitter.Left := ListBackPanel.Width; + ListView1.Columns[0].Width := ThumbnailSize + 30; // AV + ListView1.Columns[1].Width := 35; // AV +end; + +procedure TMainForm.AutoSaveTimerTimer(Sender: TObject); +var + filename,title : string; + Tag: string; + IFile: TextFile; + FileList, FileListPre: TStringList; + i, p: integer; + erase : boolean; + bakname: string; +begin + erase := false; + filename := AutoSavePath; + title := CleanXMLName(maincp.name) + ' (' + FormatDateTime('MM-dd-yyyy hh:mm:ss', Now) + ')'; + Tag := RemoveExt(filename); + + if FileExists(filename) then begin + FileListPre := TStringList.create; + try + FileListPre.LoadFromFile(filename); + if (FileListPre.Count > 1000) then erase := true; + finally + FileListPre.Free; + end; + + if (erase) then begin + bakname := ChangeFileExt(filename, '.bak'); + if FileExists(bakname) then DeleteFile(bakname); + RenameFile(filename, bakname); + end; + end; + + try + if FileExists(filename) then + begin + bakname := ChangeFileExt(filename, '.temp'); + if FileExists(bakname) then DeleteFile(bakname); + RenameFile(filename, bakname); + + FileList := TStringList.create; + try + FileList.LoadFromFile(bakname); + + if Pos(' 0 then + begin + i := 0; + while Pos('', FileList[i]); + FileList.Delete(i); + end; + end; + + // fix first line + if (FileList.Count > 0) then begin + FileList[0] := ''; + end; + + if FileList.Count > 2 then + begin + if pos(' 0 then + repeat + FileList.Delete(FileList.Count - 1); + until (Pos('', FileList[FileList.count - 1]) <> 0) + else + repeat + FileList.Delete(FileList.Count - 1); + until (Pos('<' + Tag + '>', FileList[FileList.count - 1]) <> 0) or + (Pos('', FileList[FileList.count - 1]) <> 0); + end else + begin + FileList.Delete(FileList.Count - 1); + end; + + FileList.Add(Trim(FlameToXMLAS(maincp, title, false))); + FileList.Add(''); + FileList.SaveToFile(filename); + + finally + if FileExists(bakname) and not FileExists(filename) then + RenameFile(bakname, filename); + + FileList.Free; + if FileExists(bakname) then DeleteFile(bakname); + end; + end + else + begin + // New file ... easy + AssignFile(IFile, filename); + ReWrite(IFile); + Writeln(IFile, ''); + Write(IFile, FlameToXMLAS(maincp, title, false)); + Writeln(IFile, ''); + CloseFile(IFile); + end; + except on EInOutError do // AV + raise Exception.CreateFmt(TextByKey('common-genericsavefailure'),[title]); + end; +end; + +procedure TMainForm.Restorelastautosave1Click(Sender: TObject); +var fn:string; +begin + if (not fileexists(AutoSavePath)) then + raise Exception.Create(TextByKey('main-status-noautosave')); // AV + + //ScriptEditor.Stopped := True; + MainMenuClick(nil); // AV + + fn := AutoSavePath; + MainForm.CurrentFileName := fn; + LastOpenFile := fn; + Maincp.name := ''; + ParamFolder := ExtractFilePath(fn); + OpenFile := fn; + //MainForm.Caption := AppVersionString + ' - ' + OpenFile; // --Z-- + if APP_BUILD = '' then MainForm.Caption := AppVersionString + ' - ' + openFile + else MainForm.Caption := AppVersionString + ' ' + APP_BUILD + ' - ' + openFile; + OpenFileType := ftXML; + ListXML(fn, 1) +end; + +procedure TMainForm.mnuHelpTopicsClick(Sender: TObject); +var + URL, HelpTopic: string; +begin + {if EditForm.Active then HelpTopic := 'Transform editor.htm' +// else if GradientForm.Active then HelpTopic := 'Gradient window.htm' + else if AdjustForm.Active then HelpTopic := 'Adjust window.htm' + else if MutateForm.Active then HelpTopic := 'Mutation window.htm' + else if RenderForm.Active then HelpTopic := 'Render window.htm'; + HtmlHelp(0, nil, HH_CLOSE_ALL, 0); + URL := AppPath + 'Apophysis 2.0.chm'; + if HelpTopic <> '' then URL := URL + '::\' + HelpTopic; + HtmlHelp(0, PChar(URL), HH_DISPLAY_TOC, 0); } + //if (FileExists(HelpPath)) then + if (HelpPath <> '') then begin + if (not WinShellExecute('open', HelpPath)) then begin + MessageBox(self.Handle, PCHAR(Format(TextByKey('common-genericopenfailure'), [HelpPath])), + PCHAR('Apophysis AV'), MB_ICONHAND); + end; + end else MessageBox(self.Handle, PCHAR(TextByKey('main-status-nohelpfile')), + PCHAR('Apophysis AV'), MB_ICONHAND); +end; + +function TMainForm.RetrieveXML(cp : TControlPoint):string; +begin + Result := FlameToXML(cp, false, false); +end; + +procedure TMainForm.tbGuidesClick(Sender: TObject); +begin +// tbGuides.Down := not tbGuides.Down; + EnableGuides := tbGuides.Down; + DrawImageView; +end; + +(* +function WinExecAndWait32(FileName: string): integer; +var + zAppName: array[0..1024] of Char; + zCurDir: array[0..255] of Char; + WorkDir: string; + StartupInfo: TStartupInfo; + ProcessInfo: TProcessInformation; + r : dword; +begin + StrPCopy(zAppName, FileName); + GetDir(0, WorkDir); + StrPCopy(zCurDir, WorkDir); + FillChar(StartupInfo, Sizeof(StartupInfo), #0); + StartupInfo.cb := Sizeof(StartupInfo); + + StartupInfo.dwFlags := STARTF_USESHOWWINDOW; + StartupInfo.wShowWindow := 0; + if (not CreateProcess(nil, zAppName, nil, nil, false, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo)) then + Result := -1 + else begin + WaitforSingleObject(ProcessInfo.hProcess, INFINITE); + GetExitCodeProcess(ProcessInfo.hProcess, r); + result := r; + CloseHandle(ProcessInfo.hProcess); + CloseHandle(ProcessInfo.hThread); + end; +end; +*) + +procedure TMainForm.mnuTurnFlameToScriptClick(Sender: TObject); +var + txt: string; +begin + txt := Trim(FlameToXML(Maincp, false, false)); + + ScriptEditor.ScriptFromFlame(txt); + ScriptEditor.Show; +end; + +constructor TThumbnailThread.Create; +begin + inherited create(True); // AV: don't run the thread immediately + FCount := MainForm.ListView1.Items.Count - 1; + FreeOnTerminate := true; // AV: fixed - someone forgot to free the memory + Trace2('Creating ThumbnailThread #' + IntToStr(self.ThreadID)); +end; + +destructor TThumbnailThread.Destroy; +begin + // AV: added tracing to fix Apo7X memory leaks + Synchronize( + procedure + begin + Trace2('Destroying ThumbnailThread #' + IntToStr(self.ThreadID)); + end); + inherited; +end; + +procedure TThumbnailThread.Execute; +var + Renderer : TRenderer; + cp : TControlPoint; + Thumbnail : TBitmap; + flameXML, fCaption : string; + w, h, i : integer; + r : double; + { + stored_thumb : TJPegImage; + stored_thumb_data : TBinArray; + stored_thumb_size : integer; + memstream : TMemoryStream; + } +begin + inherited; + Renderer := TRenderer.Create; + cp := TControlPoint.Create; + Thumbnail := TBitmap.Create; + try // AV: added try-finally block + // AV: moved outside the loop for speed + Thumbnail.PixelFormat := pf24bit; + Thumbnail.HandleType := bmDIB; + Thumbnail.Width := FThumbnailSize; + Thumbnail.Height := FThumbnailSize; + Thumbnail.Canvas.Brush.Color := WinColor; // AV: theme-aware GetSysColor(5); + + for i := 0 to FCount do + begin + cp.Clear; + fCaption := MainForm.ListView1.Items[i].Caption; + flameXML := LoadXMLFlameText(Openfile, fCaption); + MainForm.ParseXML(cp, PCHAR(flameXML), true); + { + // AV: great idea, but somehow it doesn't work and causes crashes :( + if (cp.xdata <> '') then + begin + stored_thumb := TJPegImage.Create; + B64Decode(cp.xdata, stored_thumb_data, stored_thumb_size); + memstream := TMemoryStream.Create; + memstream.Size := stored_thumb_size; + stored_thumb_size := Length(stored_thumb_data); + memstream.WriteBuffer(stored_thumb_data[0], stored_thumb_size); + memstream.Seek(0, soBeginning); + //-X- test thumbnail integrity... memstream.SaveToFile('C:\Test.jpg'); + stored_thumb.LoadFromStream(memstream); + memstream.Free; + + w := stored_thumb.Width; + h := stored_thumb.Height; + + Thumbnail.Canvas.FillRect(Rect(0, 0, FThumbnailSize, FThumbnailSize)); + Thumbnail.Canvas.Draw(round(FThumbnailSize / 2 - w / 2), + round(FThumbnailSize / 2 - h / 2), stored_thumb); + + // AV: added thread synchronization for visual components + Synchronize( + procedure + begin + Trace2('Generating thumbnail for "' + fCaption + '"'); + MainForm.UsedThumbnails.Add(Thumbnail, nil); + MainForm.ListView1.Items[i].ImageIndex := MainForm.UsedThumbnails.Count - 1; + end); + + stored_thumb.Free; + end else } + begin + w := cp.Width; + h := cp.Height; + r := w / h; + if (w < h) then + begin + w := round(r * FThumbnailSize); + h := FThumbnailSize; + end else if (w > h) then + begin + h := round(FThumbnailSize / r); + w := FThumbnailSize; + end else + begin + w := FThumbnailSize; + h := FThumbnailSize; + end; + cp.AdjustScale(w, h); + cp.spatial_oversample := defOversample; + cp.spatial_filter_radius := defFilterRadius; + cp.sample_density := FPreviewDensity; // AV + + Renderer.SetCP(cp); + Renderer.Render; + + Thumbnail.Canvas.FillRect(Rect(0, 0, FThumbnailSize, FThumbnailSize)); + Thumbnail.Canvas.Draw(round(FThumbnailSize / 2 - w / 2), + round(FThumbnailSize / 2 - h / 2), Renderer.GetImage); + + // AV: added thread synchronization for updating visual components + Synchronize( + procedure + begin + MainForm.UsedThumbnails.Add(Thumbnail, nil); + MainForm.ListView1.Items[i].ImageIndex := MainForm.UsedThumbnails.Count - 1; + Trace2('Generating thumbnail for "' + fCaption + '"'); + end); + end; + if Terminated then break; // AV + end; + finally + cp.Free; + Renderer.Free; + Thumbnail.Free; + Thumbnail := nil; + end; +end; + +procedure ListXML(FileName: string; sel: integer; selname: string = ''); +var + FStrings : TStringList; + i, p : integer; + title : string; + thread : TThumbnailThread; + item : TListItem; +begin + MainForm.ParseLoadingBatch := true; + FStrings := TStringList.Create; + FStrings.LoadFromFile(FileName); + + MainForm.ListView1.Items.BeginUpdate; + + try + // AV: moved all the main code inside try-finally block + // because Apo often crashes here + MainForm.ListView1.Items.Clear; + + // AV: moved from TThumbnailThread.Execute - seems like it saves a lot of time + MainForm.UsedThumbnails.Clear; + MainForm.UsedThumbnails.Add(ThumbnailPlaceholder, nil); + + if (Pos(' 0) then + begin + for i := 0 to FStrings.Count - 1 do + begin + p := Pos(' 0) then + begin + MainForm.ListXMLScanner.LoadFromBuffer(TCharType(TStringType(FStrings[i]))); + MainForm.ListXMLScanner.Execute; + + if Trim(pname) = '' then + Title := '*untitled ' + ptime + else + Title := Trim(pname); + if Title <> '' then + begin + if ((i mod 5) = 0) then + MainForm.LoadSaveProgress.Position := + round(100 * i / FStrings.Count); + item := MainForm.ListView1.Items.Add; + item.Caption := Title; + item.ImageIndex := 0; // AV: now we can load a hourglass icon + end; + end; + end; + end; + MainForm.LoadSaveProgress.Position := 0; + //MainForm.ListView1.AllocBy := MainForm.ListView1.Items.Count; + + if ClassicListMode then // AV: thumbs are useless + GeneratingThumbs := False + else begin + thread := TThumbnailThread.Create; + thread.Start; // AV: thread.Resume method is deprecated here + GeneratingThumbs := True; + end; + + finally + MainForm.ListView1.Items.EndUpdate; + FStrings.Free; + + with MainForm.ListView1 do // AV + if Items.Count > 0 then // AV: added a check + case sel of + 0: Selected := Items[Items.Count - 1]; + 1: Selected := Items[0]; + 2: if (selname <> '') then // AV: show the flame with the specified name + Selected := FindCaption(0, selname, false, true, false); + end; + + if MainForm.EnumerateFlames.Checked then // AV: displaying indices + MainForm.EnumerateFlamesClick(MainForm.EnumerateFlames); + end; + MainForm.ParseLoadingBatch := false; +end; + +procedure TMainForm.RefreshThumbnail; +var + Renderer : TRenderer; + Thumbnail : TBitmap; + r, sd: double; + i, w, h, w_old, h_old: integer; +begin + if not Assigned(ListView1.Selected) then exit; + i := ListView1.Selected.Index; + if (i > UsedThumbnails.Count) then exit; + + w := Maincp.Width; + h := Maincp.Height; + w_old := w; + h_old := h; + + r := w / h; + if (w < h) then + begin + w := round(r * ThumbnailSize); + h := ThumbnailSize; + end else if (w > h) then + begin + h := round(ThumbnailSize / r); + w := ThumbnailSize; + end else + begin + w := ThumbnailSize; + h := ThumbnailSize; + end; + sd := Maincp.sample_density; + Maincp.AdjustScale(w, h); + Maincp.spatial_oversample := defOversample; + Maincp.spatial_filter_radius := defFilterRadius; + Maincp.sample_density := TThumbnailThread.FPreviewDensity; + + Renderer := TRenderer.Create; + Thumbnail := TBitmap.Create; + try + Renderer.SetCP(Maincp); + Renderer.Render; + + Thumbnail.PixelFormat := pf24bit; + Thumbnail.HandleType := bmDIB; + Thumbnail.Width := ThumbnailSize; + Thumbnail.Height := ThumbnailSize; + Thumbnail.Canvas.Brush.Color := WinColor; // theme-aware system color + Thumbnail.Canvas.FillRect(Rect(0, 0, ThumbnailSize, ThumbnailSize)); + Thumbnail.Canvas.Draw(round(ThumbnailSize / 2 - w / 2), + round(ThumbnailSize / 2 - h / 2), Renderer.GetImage); + + try + UsedThumbnails.Replace(i + 1, Thumbnail, nil); + ListView1.Items.Item[i].Update; + Trace2('Updating thumbnail for "' + ListView1.Items[i].Caption + '"'); + except + ListView1.Items[i].ImageIndex := 0; + end; + finally + Thumbnail.Free; + Thumbnail := nil; + Renderer.Free; + // restore old settings + Maincp.AdjustScale(w_old, h_old); + Maincp.sample_density := sd; + end; +end; + +procedure TMainForm.UpdateThumbnails; // AV: refreshes images only +var + i: integer; + thumbs: TThumbnailThread; +begin + UsedThumbnails.Clear; + UsedThumbnails.Add(ThumbnailPlaceholder, nil); + + with ListView1.Items do + begin + BeginUpdate; + for i := 0 to Count - 1 do Item[i].ImageIndex := 0; // hourglass icon + EndUpdate; + end; + + thumbs := TThumbnailThread.Create; + thumbs.Start; + GeneratingThumbs := True; + + // hightlight the item if possible + ListView1.Selected := ListView1.ItemFocused; +end; + +procedure TMainForm.SetThumbnailProperties; // AV +begin + if UseSmallThumbnails then + ThumbnailSize := 96 + else + ThumbnailSize := 128; + UsedThumbnails.Height := ThumbnailSize; + UsedThumbnails.Width := ThumbnailSize; + + TThumbnailThread.FThumbnailSize := ThumbnailSize; + LoadThumbnailPlaceholder(ThumbnailSize); + + mnuResetUI.Click; +end; + +procedure TMainForm.mnuReportFlameClick(Sender: TObject); +var + str: string; + i : integer; +begin + if (not LoadForm.Visible) then LoadForm.Show; + str := MainCP.name + #13#10 + StringOfChar('=', length(MainCP.name)) + #13#10 + + Format(TextByKey('main-report-transformcount'), [MainCp.NumXForms]) + #13#10 + + Format(TextByKey('main-report-finaltransform'), [IfThen(maincp.finalXformEnabled, TextByKey('common-yes'), TextByKey('common-no'))]) + #13#10 + + TextByKey('main-report-usedplugins'); + MainCP.FillUsedPlugins; + if MainCp.used_plugins.Count = 0 then begin + LoadForm.Output.Text := LoadForm.Output.Text + #13#10 + str + ' ' + TextByKey('main-report-noplugins') + #13#10; + exit; + end; + for i := 0 to MainCP.used_plugins.Count-1 do begin + str := str + #13#10 + ' - ' + MainCP.used_plugins[i]; + end; + // AV: added 3D and DC status + str := str + #13#10 + TextByKey('main-report-directcoloring') + #32 + + IfThen((pos('dc', str) > 0) or (pos('falloff', str) > 0) or (pos('affine3D', str) > 0), + TextByKey('common-yes'), TextByKey('common-no')); + str := str + #13#10 + TextByKey('main-report-flame3d') + #32 + + IfThen((MainCP.cameraPitch <> 0) or (MainCP.cameraRoll <> 0) or (pos('_rotate_', str) > 0), + TextByKey('common-yes'), TextByKey('common-no')); + + LoadForm.Output.Text := LoadForm.Output.Text + #13#10 + str + #13#10; +end; + +procedure TMainForm.mnuExportChaoticaClick(Sender: TObject); +begin + MainCP.FillUsedPlugins; + C_ExecuteChaotica(FlameToXml(MainCp, false, false), MainCp.used_plugins, UseX64IfPossible); +end; + +procedure TMainForm.mnuManualClick(Sender: TObject); // AV: Apo7X link is dead... +begin + // AV: first link is for Russian people only + // WinShellOpen('https://books.google.ru/books?id=PbMAAQAAQBAJ&printsec=frontcover&hl=ru#v=onepage&q&f=false'); + WinShellOpen('https://www.amazon.com/Fractals-Everywhere-Dover-Books-Mathematics/dp/0486488705'); +end; + +procedure TMainForm.CalculateColorSpeed1Click(Sender: TObject); // AV +begin + StopThread; + UpdateUndo; + MainCp.CalculateColorSpeed; + RedrawTimer.Enabled := True; + UpdateWindows; +end; + +procedure TMainForm.CalculateWeightsClick(Sender: TObject); // AV +begin + StopThread; + UpdateUndo; + MainCp.CalculateWeights; + RedrawTimer.Enabled := True; + UpdateWindows; +end; + +procedure TMainForm.CreateSubstMap; +begin + // AV: set backward compatibility since both plugins crash the scripter + SubstSource.Add('epispiral'); SubstTarget.Add('Epispiral'); + SubstSource.Add('epispiral_n'); SubstTarget.Add('Epispiral_n'); + SubstSource.Add('epispiral_thickness'); SubstTarget.Add('Epispiral_thickness'); + SubstSource.Add('epispiral_holes'); SubstTarget.Add('Epispiral_holes'); + + { AV: Apo7X has a bug here: when a source variation + is avaliable as a plugin, the application internally sets both versions + (source and substitute). It gives wrong visual results. So I added a checking } + if (GetVariationIndex('cross2') < 0) then begin // only if plugin is not loaded + SubstSource.Add('cross2'); SubstTarget.Add('cross'); + end; + if (GetVariationIndex('bwraps2') < 0) then begin + SubstSource.Add('bwraps2'); SubstTarget.Add('bwraps'); + SubstSource.Add('bwraps2_cellsize'); SubstTarget.Add('bwraps_cellsize'); + SubstSource.Add('bwraps2_space'); SubstTarget.Add('bwraps_space'); + SubstSource.Add('bwraps2_gain'); SubstTarget.Add('bwraps_gain'); + SubstSource.Add('bwraps2_inner_twist'); SubstTarget.Add('bwraps_inner_twist'); + SubstSource.Add('bwraps2_outer_twist'); SubstTarget.Add('bwraps_outer_twist'); + end; + if (GetVariationIndex('pre_bwraps2') < 0) then begin + SubstSource.Add('pre_bwraps2'); SubstTarget.Add('pre_bwraps'); + SubstSource.Add('pre_bwraps2_cellsize'); SubstTarget.Add('pre_bwraps_cellsize'); + SubstSource.Add('pre_bwraps2_space'); SubstTarget.Add('pre_bwraps_space'); + SubstSource.Add('pre_bwraps2_gain'); SubstTarget.Add('pre_bwraps_gain'); + SubstSource.Add('pre_bwraps2_inner_twist'); SubstTarget.Add('pre_bwraps_inner_twist'); + SubstSource.Add('pre_bwraps2_outer_twist'); SubstTarget.Add('pre_bwraps_outer_twist'); + end; + if (GetVariationIndex('post_bwraps2') < 0) then begin + SubstSource.Add('post_bwraps2'); SubstTarget.Add('post_bwraps'); + SubstSource.Add('post_bwraps2_cellsize'); SubstTarget.Add('post_bwraps_cellsize'); + SubstSource.Add('post_bwraps2_space'); SubstTarget.Add('post_bwraps_space'); + SubstSource.Add('post_bwraps2_gain'); SubstTarget.Add('post_bwraps_gain'); + SubstSource.Add('post_bwraps2_inner_twist'); SubstTarget.Add('post_bwraps_inner_twist'); + SubstSource.Add('post_bwraps2_outer_twist'); SubstTarget.Add('post_bwraps_outer_twist'); + end; + if (GetVariationIndex('bwraps7') < 0) then begin + SubstSource.Add('bwraps7'); SubstTarget.Add('bwraps'); + SubstSource.Add('bwraps7_cellsize'); SubstTarget.Add('bwraps_cellsize'); + SubstSource.Add('bwraps7_space'); SubstTarget.Add('bwraps_space'); + SubstSource.Add('bwraps7_gain'); SubstTarget.Add('bwraps_gain'); + SubstSource.Add('bwraps7_inner_twist'); SubstTarget.Add('bwraps_inner_twist'); + SubstSource.Add('bwraps7_outer_twist'); SubstTarget.Add('bwraps_outer_twist'); + end; + if (GetVariationIndex('logn') < 0) then begin + SubstSource.Add('logn'); SubstTarget.Add('log'); + SubstSource.Add('logn_base'); SubstTarget.Add('log_base'); + end; + if (GetVariationIndex('circleblur') < 0) then begin // AV + SubstSource.Add('circleblur'); SubstTarget.Add('blur_circle'); + end; + if (GetVariationIndex('circle2') < 0) then begin // AV + SubstSource.Add('circle2'); SubstTarget.Add('blur_circle'); + end; + if (GetVariationIndex('boarders') < 0) then begin // AV + SubstSource.Add('boarders'); SubstTarget.Add('boarders2'); + end; + if (GetVariationIndex('dc_boarders') < 0) then begin // AV + SubstSource.Add('dc_boarders'); SubstTarget.Add('boarders2'); + end; + if (GetVariationIndex('splits3D') < 0) then begin // AV + SubstSource.Add('splits3D'); SubstTarget.Add('splits'); + SubstSource.Add('splits3D_x'); SubstTarget.Add('splits_x'); + SubstSource.Add('splits3D_y'); SubstTarget.Add('splits_y'); + SubstSource.Add('splits3D_z'); SubstTarget.Add('splits_z'); + end; + if (GetVariationIndex('blob_fl') < 0) then // AV + begin + SubstSource.Add('blob_fl'); SubstTarget.Add('blob'); + SubstSource.Add('blob_fl_high'); SubstTarget.Add('blob_fl_high'); + SubstSource.Add('blob_fl_low'); SubstTarget.Add('blob_low'); + SubstSource.Add('blob_fl_waves'); SubstTarget.Add('blob_waves'); + end; + if (GetVariationIndex('twintrian2') < 0) then begin // AV + SubstSource.Add('twintrian2'); SubstTarget.Add('twintrian'); + end; + if (GetVariationIndex('Z_disc2') < 0) then // AV + begin + SubstSource.Add('Z_disc2'); SubstTarget.Add('disc2'); + SubstSource.Add('Z_disc2_rot'); SubstTarget.Add('disc2_rot'); + SubstSource.Add('Z_disc2_twist'); SubstTarget.Add('disc2_twist'); + end; +end; + +function TMainForm.ReadWithSubst(Attributes: TAttrList; attrname: string): string; +var i: integer; v: TStringType; +begin + v := Attributes.Value(TStringType(attrname)); + if (v <> '') then begin + Result := String(v); + Exit; + end; + + for i := 0 to SubstTarget.Count - 1 do begin + if (SubstTarget[i] = attrname) then begin + v := Attributes.Value(TStringType(SubstSource[i])); + if (v <> '') then begin + Result := String(v); + Exit; + end; + end; + end; + + Result := ''; +end; + +end. diff --git a/Forms/Mutate.dfm b/Forms/Mutate.dfm new file mode 100644 index 0000000..1f801f4 --- /dev/null +++ b/Forms/Mutate.dfm @@ -0,0 +1,383 @@ +object MutateForm: TMutateForm + Left = 589 + Top = 326 + BorderIcons = [biSystemMenu, biMinimize] + BorderStyle = bsSingle + Caption = 'Mutation' + ClientHeight = 398 + ClientWidth = 422 + Color = clBtnFace + Constraints.MinHeight = 400 + Constraints.MinWidth = 400 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poDefault + OnClose = FormClose + OnCreate = FormCreate + OnDestroy = FormDestroy + OnShow = FormShow + DesignSize = ( + 422 + 398) + PixelsPerInch = 96 + TextHeight = 13 + object GroupBox1: TGroupBox + Left = 8 + Top = 8 + Width = 409 + Height = 273 + Anchors = [akLeft, akTop, akRight, akBottom] + Caption = 'Directions' + TabOrder = 0 + DesignSize = ( + 409 + 273) + object Panel10: TPanel + Left = 12 + Top = 20 + Width = 384 + Height = 238 + Anchors = [akLeft, akTop, akRight, akBottom] + BevelOuter = bvNone + TabOrder = 0 + object Panel6: TPanel + Left = 112 + Top = 168 + Width = 108 + Height = 80 + BevelOuter = bvLowered + Caption = 'PrevPnl3' + Color = clBlack + ShowCaption = False + TabOrder = 0 + object Image6: TImage + Tag = 6 + Left = 1 + Top = 1 + Width = 106 + Height = 78 + Align = alClient + PopupMenu = QualityPopup + Stretch = True + OnClick = MutantClick + end + end + object Panel7: TPanel + Left = 0 + Top = 168 + Width = 108 + Height = 80 + BevelOuter = bvLowered + Caption = 'PrevPnl3' + Color = clBlack + ShowCaption = False + TabOrder = 1 + object Image7: TImage + Tag = 7 + Left = 1 + Top = 1 + Width = 106 + Height = 78 + Align = alClient + PopupMenu = QualityPopup + Stretch = True + OnClick = MutantClick + end + end + object Panel4: TPanel + Left = 224 + Top = 84 + Width = 108 + Height = 80 + BevelOuter = bvLowered + Caption = 'PrevPnl3' + Color = clBlack + ShowCaption = False + TabOrder = 2 + object Image4: TImage + Tag = 4 + Left = 1 + Top = 1 + Width = 106 + Height = 78 + Align = alClient + PopupMenu = QualityPopup + Stretch = True + OnClick = MutantClick + end + end + object Panel0: TPanel + Left = 112 + Top = 84 + Width = 108 + Height = 80 + HelpContext = 2003 + BevelOuter = bvLowered + Caption = 'PrevPnl3' + Color = clBlack + ShowCaption = False + TabOrder = 3 + object Image0: TImage + Left = 1 + Top = 1 + Width = 106 + Height = 78 + Align = alClient + PopupMenu = QualityPopup + Stretch = True + OnClick = Image0Click + end + end + object Panel8: TPanel + Left = 0 + Top = 84 + Width = 108 + Height = 80 + BevelOuter = bvLowered + Caption = 'PrevPnl3' + Color = clBlack + ShowCaption = False + TabOrder = 4 + object Image8: TImage + Tag = 8 + Left = 1 + Top = 1 + Width = 106 + Height = 78 + Align = alClient + PopupMenu = QualityPopup + Stretch = True + OnClick = MutantClick + end + end + object Panel3: TPanel + Left = 224 + Top = 0 + Width = 108 + Height = 80 + BevelOuter = bvLowered + Caption = 'PrevPnl3' + Color = clBlack + ShowCaption = False + TabOrder = 5 + object Image3: TImage + Tag = 3 + Left = 1 + Top = 1 + Width = 106 + Height = 78 + Align = alClient + PopupMenu = QualityPopup + Stretch = True + OnClick = MutantClick + end + end + object Panel2: TPanel + Left = 112 + Top = 0 + Width = 108 + Height = 80 + BevelOuter = bvLowered + Caption = 'PrevPnl3' + Color = clBlack + ShowCaption = False + TabOrder = 6 + object Image2: TImage + Tag = 2 + Left = 1 + Top = 1 + Width = 106 + Height = 78 + Align = alClient + PopupMenu = QualityPopup + Stretch = True + OnClick = MutantClick + end + end + object Panel1: TPanel + Left = 0 + Top = 0 + Width = 108 + Height = 80 + BevelOuter = bvLowered + Caption = 'PrevPnl3' + Color = clBlack + ShowCaption = False + TabOrder = 7 + object Image1: TImage + Tag = 1 + Left = 1 + Top = 1 + Width = 106 + Height = 78 + Align = alClient + PopupMenu = QualityPopup + Stretch = True + OnClick = MutantClick + end + end + object Panel5: TPanel + Left = 224 + Top = 168 + Width = 108 + Height = 80 + BevelOuter = bvLowered + Caption = 'PrevPnl3' + Color = clBlack + ShowCaption = False + TabOrder = 8 + object Image5: TImage + Tag = 5 + Left = 1 + Top = 1 + Width = 106 + Height = 78 + Align = alClient + PopupMenu = QualityPopup + Stretch = True + OnClick = MutantClick + end + end + end + end + object GroupBox2: TGroupBox + Left = 8 + Top = 288 + Width = 409 + Height = 105 + Anchors = [akLeft, akRight, akBottom] + TabOrder = 1 + DesignSize = ( + 409 + 105) + object scrollTime: TScrollBar + Left = 120 + Top = 20 + Width = 202 + Height = 20 + Anchors = [akLeft, akTop, akRight] + LargeChange = 5 + Max = 50 + Min = 1 + PageSize = 0 + Position = 1 + TabOrder = 0 + OnChange = scrollTimeChange + end + object cmbTrend: TComboBox + Left = 119 + Top = 48 + Width = 282 + Height = 21 + Style = csDropDownList + Anchors = [akLeft, akTop, akRight] + DropDownCount = 16 + TabOrder = 1 + OnChange = cmbTrendChange + Items.Strings = ( + 'Random' + 'Linear') + end + object chkSameNum: TCheckBox + Left = 12 + Top = 78 + Width = 389 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = 'Same no. of transforms' + TabOrder = 2 + OnClick = chkSameNumClick + end + object pnlSpeed: TPanel + Left = 12 + Top = 20 + Width = 101 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Speed' + ParentShowHint = False + ShowHint = True + TabOrder = 3 + end + object txtTime: TEdit + Left = 328 + Top = 20 + Width = 73 + Height = 21 + Anchors = [akTop, akRight] + ReadOnly = True + TabOrder = 4 + Text = '0.25' + end + object pnlTrend: TPanel + Left = 12 + Top = 48 + Width = 101 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Trend' + ParentShowHint = False + ShowHint = True + TabOrder = 5 + end + end + object Timer: TTimer + Enabled = False + Interval = 100 + OnTimer = TimerTimer + Left = 168 + Top = 80 + end + object QualityPopup: TPopupMenu + Images = MainForm.Buttons + Left = 144 + Top = 40 + object mnuLowQuality: TMenuItem + Caption = 'Low Quality' + RadioItem = True + OnClick = mnuLowQualityClick + end + object mnuMediumQuality: TMenuItem + Caption = 'Medium Quality' + Checked = True + RadioItem = True + OnClick = mnuMediumQualityClick + end + object mnuHighQuality: TMenuItem + Caption = 'High Quality' + RadioItem = True + OnClick = mnuHighQualityClick + end + object N3: TMenuItem + Caption = '-' + end + object mnuBack: TMenuItem + Caption = 'Previous' + Enabled = False + ImageIndex = 4 + OnClick = mnuBackClick + end + object N1: TMenuItem + Caption = '-' + end + object mnuMaintainSym: TMenuItem + Caption = 'Maintain Symmetry' + Checked = True + OnClick = mnuMaintainSymClick + end + object N2: TMenuItem + Caption = '-' + end + object mnuResetLocation: TMenuItem + Caption = 'Reset Location' + Checked = True + OnClick = mnuResetLocationClick + end + end +end diff --git a/Forms/Mutate.pas b/Forms/Mutate.pas new file mode 100644 index 0000000..69faaac --- /dev/null +++ b/Forms/Mutate.pas @@ -0,0 +1,634 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} +unit Mutate; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + ExtCtrls, StdCtrls, ControlPoint, ComCtrls, Menus, Buttons, Cmap, + RenderingInterface, Translation, Curves; + +type + TMutateForm = class(TForm) + GroupBox1: TGroupBox; + Timer: TTimer; + GroupBox2: TGroupBox; + scrollTime: TScrollBar; + cmbTrend: TComboBox; + chkSameNum: TCheckBox; + QualityPopup: TPopupMenu; + mnuLowQuality: TMenuItem; + mnuMediumQuality: TMenuItem; + mnuHighQuality: TMenuItem; + N3: TMenuItem; + mnuResetLocation: TMenuItem; + mnuBack: TMenuItem; + N1: TMenuItem; + mnuMaintainSym: TMenuItem; + N2: TMenuItem; + Panel10: TPanel; + Panel6: TPanel; + Image6: TImage; + Panel7: TPanel; + Image7: TImage; + Panel4: TPanel; + Image4: TImage; + Panel0: TPanel; + Image0: TImage; + Panel8: TPanel; + Image8: TImage; + Panel3: TPanel; + Image3: TImage; + Panel2: TPanel; + Image2: TImage; + Panel1: TPanel; + Image1: TImage; + Panel5: TPanel; + Image5: TImage; + pnlSpeed: TPanel; + txtTime: TEdit; + pnlTrend: TPanel; + //procedure Panel10Resize(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure Image0Click(Sender: TObject); + procedure MutantClick(Sender: TObject); + procedure sbTimeChange(Sender: TObject); + procedure TimerTimer(Sender: TObject); + procedure scrollTimeChange(Sender: TObject); + procedure cmbTrendChange(Sender: TObject); + procedure btnCancelClick(Sender: TObject); + procedure mnuHighQualityClick(Sender: TObject); + procedure mnuLowQualityClick(Sender: TObject); + procedure mnuMediumQualityClick(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure chkSameNumClick(Sender: TObject); + procedure mnuResetLocationClick(Sender: TObject); + procedure mnuBackClick(Sender: TObject); + procedure mnuMaintainSymClick(Sender: TObject); + private + name: string; + bm: TBitmap; + PreviewDensity: double; + Updating: boolean; + cps: array[0..8] of TControlPoint; + Mutants: array[0..8] of TControlPoint; + Render: TRenderer; + Time: double; + bstop: boolean; + brightness, gamma, vibrancy, contrast, gamma_threshold: double; + width, height: integer; // AV: to keep original flame size + seed, InitSeed: integer; + procedure RandomSet; + procedure ShowMain; + procedure ShowMutants; + procedure Interpolate; + public + Zoom: Double; + Center: array[0..1] of double; + cmap: TColorMap; + procedure UpdateDisplay; + procedure UpdateFlame; + end; + +var + MutateForm: TMutateForm; + +implementation + +uses + Main, Global, Registry, Editor, Adjust, XFormMan; + +{$R *.DFM} + +procedure TMutateForm.UpdateFlame; +begin + MainForm.StopThread; + MainForm.UpdateUndo; + MainCp.Copy(cps[0]); + Transforms := MainCp.TrianglesFromCP(MainTriangles); + MainCp.cmap := cmap; + MainCp.name := name; // this is kinda funny + MainCp.AdjustScale(width, height); // AV: restore normal size + if mnuResetLocation.checked then + begin + //MainForm.Mainzoom := cps[0].zoom; + MainForm.Center[0] := cps[0].Center[0]; + MainForm.Center[1] := cps[0].Center[1]; + end; + MainForm.RedrawTimer.enabled := true; + if EditForm.Visible then EditForm.UpdateDisplay; +// if AdjustForm.Visible then AdjustForm.UpdateDisplay; +end; + +procedure TMutateForm.UpdateDisplay; +begin + cps[0].copy(MainCp); + cps[0].AdjustScale(Image0.Width, Image0.Height); + cps[0].cmap := MainCp.cmap; + cmap := MainCp.cmap; + name := Maincp.name; + zoom := MainCp.zoom; + width := MainCp.Width; // AV + height := MainCp.Height; // AV + center[0] := MainCp.center[0]; + center[1] := MainCp.center[1]; + vibrancy := cps[0].vibrancy; + gamma := cps[0].gamma; + gamma_threshold := cps[0].gamma_threshold; // AV + brightness := cps[0].brightness; + contrast := cps[0].contrast; // AV + Interpolate; + ShowMain; + Application.ProcessMessages; + ShowMutants; +end; + +procedure TMutateForm.ShowMain; +begin + cps[0].Width := Image0.Width; + cps[0].Height := Image0.Height; + cps[0].spatial_oversample := defOversample; + cps[0].spatial_filter_radius := defFilterRadius; + cps[0].sample_density := PreviewDensity; + cps[0].brightness := brightness; + cps[0].contrast := contrast; // AV + cps[0].gamma := gamma; + cps[0].gamma_threshold := gamma_threshold; // AV + cps[0].vibrancy := vibrancy; + cps[0].sample_density := PreviewDensity; + cps[0].cmap := cmap; + cps[0].background := MainCp.background; + if mnuResetLocation.checked then begin + cps[0].CalcBoundbox; + zoom := 0; + center[0] := cps[0].center[0]; + center[1] := cps[0].Center[1]; + end; + cps[0].zoom := zoom; + cps[0].center[0] := center[0]; + cps[0].center[1] := center[1]; + + Render.SetCP(cps[0]); + Render.Render; + BM.Assign(Render.GetImage); + Image0.Picture.Graphic := bm; +end; + +procedure TMutateForm.ShowMutants; +var + i: integer; +begin + if Visible = false then exit; + Updating := true; + for i := 1 to 8 do + begin + mutants[i].Width := Image1.Width; + mutants[i].Height := Image1.Height; + mutants[i].spatial_filter_radius := defFilterRadius; + mutants[i].spatial_oversample := defOversample; + mutants[i].sample_density := PreviewDensity; + mutants[i].brightness := brightness; + mutants[i].contrast := contrast; // AV + mutants[i].gamma := gamma; + mutants[i].vibrancy := vibrancy; + mutants[i].gamma_threshold := gamma_threshold; // AV + + if mnuResetLocation.checked then + begin + mutants[i].CalcBoundbox; + mutants[i].zoom := 0; + end + else begin + mutants[i].zoom := zoom; + mutants[i].center[0] := center[0]; + mutants[i].center[1] := center[1]; + end; + + Render.SetCP(mutants[i]); + Render.Render; + BM.Assign(Render.GetImage); + + case i of + 1: begin + Image1.Picture.Graphic := bm; + Image1.Refresh; + end; + 2: begin + Image2.Picture.Graphic := bm; + Image2.Refresh; + end; + 3: begin + Image3.Picture.Graphic := bm; + Image3.Refresh; + end; + 4: begin + Image4.Picture.Graphic := bm; + Image4.Refresh; + end; + 5: begin + Image5.Picture.Graphic := bm; + Image5.Refresh; + end; + 6: begin + Image6.Picture.Graphic := bm; + Image6.Refresh; + end; + 7: begin + Image7.Picture.Graphic := bm; + Image7.Refresh; + end; + 8: begin + Image8.Picture.Graphic := bm; + Image8.Refresh; + end; + end; + Updating := false; + end; +end; + +procedure TMutateForm.Interpolate; +var i, j, k: Integer; +begin + if MainCp = nil then Exit; + + for i := 1 to 8 do + begin + if bstop then exit; + cps[0].Time := 0; + cps[i].Time := 1; + (* -X- something is not right here... + Mutants[i] may be destroyed already + Investigate? *) + Mutants[i].clear; + Mutants[i].InterpolateX(cps[0], cps[i], Time / 100); + Mutants[i].cmapindex := cps[0].cmapindex; + Mutants[i].cmap := cps[0].cmap; + Mutants[i].background := MainCp.background; + if mnuMaintainSym.Checked then // maintain symmetry + for j := 0 to transforms - 1 do + if cps[0].xform[j].Symmetry = 1 then + mutants[i].xform[j].Assign(cps[0].xform[j]); + end; +end; + +procedure TMutateForm.RandomSet; +var i, j, k: Integer; +begin + RandSeed := seed; + for i := 1 to 8 do + begin + cps[i].clear; + if chkSameNum.checked then + cps[i].RandomCP(transforms, transforms, false) + else + cps[i].RandomCP(mutantMinTransforms, mutantMaxTransforms, false); + + if cmbTrend.ItemIndex = NRVAR then // AV + cps[i].SetVariation(vRandom) + else + for j := 0 to cps[i].NumXforms-1 do + begin + for k := 0 to NrVar-1 do // AV: simplified the calculations + cps[i].xform[j].SetVariation(k, 0); + cps[i].xform[j].SetVariation(cmbTrend.ItemIndex, 1); + end; + + if cps[0].HasFinalXForm = false then + begin + cps[i].xform[cps[i].NumXForms].Clear; + cps[i].xform[cps[i].NumXForms].symmetry := 1; + end; + end; + Interpolate; +end; + +procedure TMutateForm.FormShow(Sender: TObject); +var + Registry: TRegistry; +begin + { Read position from registry } + + Registry := TRegistry.Create; + try + Registry.RootKey := HKEY_CURRENT_USER; + if Registry.OpenKey('Software\' + APP_NAME + '\Forms\Mutate', False) then + begin + if Registry.ValueExists('Left') then + MutateForm.Left := Registry.ReadInteger('Left'); + if Registry.ValueExists('Top') then + MutateForm.Top := Registry.ReadInteger('Top'); + end; + Registry.CloseKey; + finally + Registry.Free; + end; + { + if (cps[0].xform[0].density <> 0) and Assigned(MainCp) then + begin // hmm...!? + //Interpolate; // AV: this method is already called inside RandomSet + ShowMain; + ShowMutants; + end; + } +end; + +procedure TMutateForm.FormCreate(Sender: TObject); +var + i: integer; +begin + self.Caption := TextByKey('mutation-title'); + GroupBox1.Caption := TextByKey('mutation-directions'); + pnlSpeed.Caption := TextByKey('mutation-speed'); + pnlTrend.Caption := TextByKey('mutation-trend'); + chkSameNum.Caption := TextByKey('mutation-keepnumberoftransforms'); + mnuLowQuality.Caption := TextByKey('common-lowquality'); + mnuMediumQuality.Caption := TextByKey('common-mediumquality'); + mnuHighQuality.Caption := TextByKey('common-highquality'); + mnuResetLocation.Caption := TextByKey('common-resetlocation'); + mnuMaintainSym.Caption := TextByKey('mutation-maintainsymmetry'); + mnuBack.Caption := TextByKey('mutation-previous'); + cmbTrend.Items.clear; + + for i:= 0 to NRVAR -1 do // AV + cmbTrend.Items.Add(varnames(i)); + cmbTrend.Items.Add(TextByKey('mutation-randomtrend')); + + bm := TBitMap.Create; + + case MutatePrevQual of + 0: begin + mnuLowQuality.Checked := true; + PreviewDensity := prevLowQuality; + end; + 1: begin + mnuMediumQuality.Checked := true; + PreviewDensity := prevMediumQuality; + end; + 2: begin + mnuHighQuality.Checked := true; + PreviewDensity := prevHighQuality; + end; + end; + + Render := TRenderer.Create; + for i := 0 to 8 do + begin + cps[i] := TControlPoint.Create; + Mutants[i] := TControlPoint.Create; + end; + + Time := 35; + scrollTime.Position := 25; + txtTime.Text := '0.25'; // AV + cmbTrend.ItemIndex := NRVAR; // AV + InitSeed := random(1234567890); + seed := InitSeed; + RandomSet; +end; + +procedure TMutateForm.FormDestroy(Sender: TObject); +var + i: integer; +begin + Render.Stop; + Render.Free; + for i := 0 to 8 do + begin + cps[i].Free; + Mutants[i].Free; + end; + bm.free; +end; + +procedure TMutateForm.Image0Click(Sender: TObject); +begin + Render.Stop; + mnuBack.Enabled := true; + inc(seed); + RandomSet; + ShowMutants; +end; + +procedure TMutateForm.MutantClick(Sender: TObject); +var + i: integer; + cpt: TControlPoint; +begin + cpt := TControlPoint.Create; + cpt.Copy(cps[0], false, transforms); // AV + bstop := true; + + // AV: optimized fast version without checking indices + i := TImage(Sender).Tag; + cps[0].Time := 0; + cps[i].Time := 1; + cps[0].InterpolateX(cps[0], cps[i], Time / 100); + + if mnuMaintainSym.Checked then // maintain symmetry + begin + for i := 0 to transforms - 1 do + begin + if cpt.xform[i].Symmetry = 1 then + cps[0].xform[i].Assign(cpt.xform[i]); + end; + end; + + bstop := false; + ShowMain; + Interpolate; + ShowMutants; + UpdateFlame; + cpt.free; +end; + +procedure TMutateForm.sbTimeChange(Sender: TObject); +begin + bstop := true; + Render.Stop; + Time := scrollTime.Position; + bstop := false; + Interpolate; + ShowMutants; +end; + +procedure TMutateForm.TimerTimer(Sender: TObject); +begin + Timer.Enabled := false; + if (Time <> scrollTime.Position) and (not updating) then + begin + Time := scrollTime.Position; + Interpolate; + ShowMutants; + end; +end; + +procedure TMutateForm.scrollTimeChange(Sender: TObject); +begin + Timer.Enabled := true; + txtTime.Text := FloatToStr(scrollTime.Position / 100); +end; + +procedure TMutateForm.cmbTrendChange(Sender: TObject); +var + i, j, k: integer; +begin + for i := 1 to 8 do + if cmbTrend.ItemIndex = NRVAR then + cps[i].SetVariation(VRandom) // AV + else + for j := 0 to cps[i].NumXforms-1 do + begin // AV + for k := 0 to NrVar-1 do + cps[i].xform[j].SetVariation(k, 0); + cps[i].xform[j].SetVariation(cmbTrend.ItemIndex, 1); + end; + + Interpolate; + ShowMutants; +end; + +procedure TMutateForm.btnCancelClick(Sender: TObject); +begin + ModalResult := mrCancel; +end; + +procedure TMutateForm.mnuHighQualityClick(Sender: TObject); +begin + mnuHighQuality.Checked := True; + PreviewDensity := prevHighQuality; + MutatePrevQual := 2; + ShowMain; + ShowMutants; +end; + +procedure TMutateForm.mnuLowQualityClick(Sender: TObject); +begin + mnuLowQuality.Checked := True; + PreviewDensity := prevLowQuality; + MutatePrevQual := 0; + ShowMain; + ShowMutants; +end; + +procedure TMutateForm.mnuMediumQualityClick(Sender: TObject); +begin + mnuMediumQuality.Checked := True; + PreviewDensity := prevMediumQuality; + MutatePrevQual := 1; + ShowMain; + ShowMutants; +end; + +procedure TMutateForm.FormClose(Sender: TObject; var Action: TCloseAction); +var + Registry: TRegistry; +begin + { Write position to registry } + Registry := TRegistry.Create; + try + Registry.RootKey := HKEY_CURRENT_USER; + if Registry.OpenKey('\Software\' + APP_NAME + '\Forms\Mutate', True) then + begin + Registry.WriteInteger('Top', MutateForm.Top); + Registry.WriteInteger('Left', MutateForm.Left); + end; + finally + Registry.Free; + end; +end; + +procedure TMutateForm.chkSameNumClick(Sender: TObject); +begin + RandomSet; + // Interpolate; // AV: this method is already called inside RandomSet + ShowMutants; +end; + +procedure TMutateForm.mnuResetLocationClick(Sender: TObject); +begin + mnuResetLocation.Checked := not mnuResetLocation.Checked; + if not mnuResetLocation.checked then + begin + cps[0].width := MainCp.width; + cps[0].height := MainCp.height; + cps[0].pixels_per_unit := MainCp.pixels_per_unit; + cps[0].AdjustScale(Image0.width, Image0.Height); + cps[0].zoom := MainCp.zoom; + cps[0].center[0] := MainCp.center[0]; + cps[0].center[1] := MainCp.center[1]; + zoom := cps[0].zoom; + center[0] := cps[0].center[0]; + center[1] := cps[0].center[1]; + end; + ShowMain; + ShowMutants; +end; + +procedure TMutateForm.mnuBackClick(Sender: TObject); +begin + Render.Stop; + if seed > InitSeed then + dec(seed); + if seed = InitSeed then mnuBack.enabled := false; + RandomSet; + ShowMutants; +end; + +procedure TMutateForm.mnuMaintainSymClick(Sender: TObject); +begin + mnuMaintainSym.Checked := not mnuMaintainSym.Checked; + Interpolate; + ShowMutants; +end; + +(* + procedure TMutateForm.Panel10Resize(Sender: TObject); + const gap:integer = 4 ; + var + w, h : integer; + begin + w := (Panel10.Width - 2*gap) div 3; + h := (Panel10.Height - 2*gap) div 3; + + Panel0.Width := w; Panel1.Width := w; Panel2.Width := w; + Panel3.Width := w; Panel4.Width := w; Panel5.Width := w; + Panel6.Width := w; Panel7.Width := w; Panel8.Width := w; + Panel0.Height := h; Panel1.Height := h; Panel2.Height := h; + Panel3.Height := h; Panel4.Height := h; Panel5.Height := h; + Panel6.Height := h; Panel7.Height := h; Panel8.Height := h; + + Panel2.Left := w + gap; Panel0.Left := w + gap; Panel6.Left := w + gap; + Panel3.Left := 2*(w + gap); Panel4.Left := 2*(w + gap); Panel5.Left := 2*(w + gap); + + Panel8.Top := h + gap; Panel0.Top := h + gap; Panel4.Top := h + gap; + Panel7.Top := 2*(h + gap); Panel6.Top := 2*(h + gap); Panel5.Top := 2*(h + gap); + end; + +*) +end. + + diff --git a/Forms/Options.dfm b/Forms/Options.dfm new file mode 100644 index 0000000..00884a8 --- /dev/null +++ b/Forms/Options.dfm @@ -0,0 +1,4308 @@ +object OptionsForm: TOptionsForm + Left = 899 + Top = 428 + BorderIcons = [biSystemMenu, biMinimize, biMaximize, biHelp] + BorderStyle = bsSingle + Caption = 'Options' + ClientHeight = 498 + ClientWidth = 524 + Color = clBtnFace + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + HelpFile = 'Apophysis AV.chm' + Icon.Data = { + 0000010001001010000001002000680400001600000028000000100000002000 + 0000010020000000000040040000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000007C75 + 73FF4E4B4BFF544F4DFF544F4DFF544F4DFF56514DFF53504CFF524F4BFF524F + 4CFF524F4BFF514E4BFF544E46FF00000000000000000000000000000000D9CF + C8FFFFFFFFFFFBFDFFFFFBFDFFFFFFFFF6FFFFFFF6FFFFFFF6FFFFF9ECFFFFF0 + E1FFFFEAD5FFFFEAD2FF544E46FF00000000000000000000000000000000D2C8 + C1FFFFFFFFFFC4AFA2FFC4AFA2FFFFFBF9FFC4AFA2FFC4AFA2FFC4AFA2FFC4AF + A2FFC4AFA2FFFDDECBFF544E46FF00000000000000000000000000000000D2C8 + C1FFFFFFFFFFFBFDFFFFFBFDFFFFFFFEFCFFFDFAF8FFFBF4EFFFFBEEE6FFFAE9 + DEFFF8E2D2FFFFE2D0FF544E46FF00000000000000000000000000000000D3C9 + C2FFFFFFFFFFC4AFA2FFC4AFA2FFFFFFFEFFC4AFA2FFC4AFA2FFC4AFA2FFC4AF + A2FFC4AFA2FFFFE5D6FF544E46FF00000000000000000000000000000000D1C7 + C0FFFFFFFFFFFBFDFFFFFBFDFFFFFFFFFFFFFEFEFDFFFEFBF8FFFDF6F2FFFCF0 + E8FFFCF0E8FFFFE9DCFF544E46FF00000000000000000000000000000000D1C8 + C1FFFFFFFFFFFBFDFFFFFBFDFFFFFFFFFFFFFFFFFFFFFEFEFCFFB0ADACFF415C + 72FFE3D9D3FFFFEDE3FF544E46FF00000000000000000000000000000000D1C8 + C1FFFFFFFFFFE2E9E9FF5E7584FFDFE4E5FFFFFFFFFFC2CACEFF4A6170FF2EA9 + D6FF0B101BFF5D5C60FFA49D96FF00000000000000001C6629791C6629FFDF9D + 7DFFF1CAB7FF8FA4ACFF86D3E5FF4B6170FFA79289FF4A6170FF61C1DEFF574D + 59FF1FD0FFFF152733FF10070AFF02212EFF4F5665FF59785BFF188C32FFDF9D + 7DFFFFC5A4FFE5C9B9FF8FA4ACFF83E1F6FF4B6170FF7ACDE2FF526067FF68ED + FFFF413D50FF32B2DFFF1D99C8FF1593C4FF14628EFF406651FF29973FFFDF9D + 7DFFDF9D7DFFDF9D7DFFDABAAAFF8FA4ACFF7FE3F9FF538495FF68EDFFFF303A + 4FFF69DBF6FF58D2F3FF40C3EDFF31BBEAFF11A8ECFF50908CFF329E41FF0000 + 0000000000000000000000000000869BA43341576FE168EDFFFF5898AEFF6EEB + FFFF72E1F9FF6ADDF7FF56CFF2FF4BC7EDFF22BAFAFF5FA2A6FF41AC53FF0000 + 0000000000000000000000000000A2AAB7A686E0F7A642566BDD6EEBFFFF6EEB + FFFF6EEBFFFF72E2FAFF67D7F4FF54BDDCFF51728BFF699C89FF85CC85FF0000 + 0000000000000000000096AAB005939EACDA86AEBCE06778854880A5B4FC8097 + A3FF8096A0FF7A8F99FF738593FF5B7080FE7A8B967A41AC538741AC53C00000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + 0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000C + 0000000000000000000000000000F0000000F0000000E0000000FFFF0000} + OldCreateOrder = True + PopupMode = pmExplicit + OnClose = FormClose + OnCreate = FormCreate + OnShow = FormShow + DesignSize = ( + 524 + 498) + PixelsPerInch = 96 + TextHeight = 13 + object Tabs: TPageControl + Left = 8 + Top = 8 + Width = 512 + Height = 456 + ActivePage = PathsPage + Anchors = [akLeft, akTop, akRight, akBottom] + MultiLine = True + TabOrder = 2 + TabStop = False + object GeneralPage: TTabSheet + HelpContext = 1 + Caption = 'General' + ExplicitLeft = 0 + ExplicitTop = 0 + ExplicitWidth = 0 + ExplicitHeight = 0 + DesignSize = ( + 504 + 428) + object SpeedButton1: TSpeedButton + Left = 474 + Top = 7 + Width = 24 + Height = 24 + Hint = 'Browse...' + Anchors = [akTop, akRight] + Flat = True + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + Font.Style = [fsBold] + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF75848F66808F + 607987576E7B4E626F4456613948522E3A43252E351B222914191E0E12160E13 + 18FF00FFFF00FFFF00FF77879289A1AB6AB2D4008FCD008FCD008FCD048CC708 + 88BE0F82B4157CA91B779F1F7296224B5C87A2ABFF00FFFF00FF7A8A957EBED3 + 8AA4AE7EDCFF5FCFFF55CBFF4CC4FA41BCF537B3F02EAAEB24A0E5138CD42367 + 805E696DFF00FFFF00FF7D8E9879D2EC8BA4AD89C2CE71D8FF65D3FF5CCEFF51 + C9FE49C1FA3FB9F534B0EE29A8E91085CD224B5B98B2BAFF00FF80919C81D7EF + 7DC5E08CA6B080DDFE68D3FF67D4FF62D1FF58CDFF4EC7FC46BEF73BB6F231AC + EC2569817A95A1FF00FF83959F89DCF18CE2FF8DA8B18CBAC774D8FF67D4FF67 + D4FF67D4FF5FD0FF54CDFF4BC5FC41BBF72EA2DB51677498B2BA869AA392E1F2 + 98E8FD80C4DE8EA7B081DEFD84E0FF84E0FF84E0FF84E0FF81DFFF7BDDFF74D8 + FF6BD6FF56A9D18F9BA4889CA59AE6F39FEBFB98E8FE8BACB98BACB98AAAB788 + A6B386A3AF839FAA819AA67F95A17C919D7A8E99798B957788938BA0A8A0EAF6 + A6EEF99FEBFB98E8FE7ADAFF67D4FF67D4FF67D4FF67D4FF67D4FF67D4FF7788 + 93FF00FFFF00FFFF00FF8EA2ABA7EEF6ABF0F7A6EEF99FEBFB98E8FD71D4FB89 + 9EA78699A382949F7E909A7A8C97778893FF00FFFF00FFFF00FF8FA4ACA0D2DA + ABF0F7ABF0F7A6EEF99FEBFB8DA1AAB5CBD0FF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFBDCED48FA4AC8FA4AC8FA4AC8FA4AC8FA4ACB5CBD0FF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF} + ParentFont = False + ParentShowHint = False + ShowHint = True + OnClick = SpeedButton1Click + ExplicitLeft = 437 + end + object pnlJPEGQuality: TPanel + Left = 8 + Top = 36 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'JPEG Quality' + ParentShowHint = False + ShowHint = True + TabOrder = 9 + end + object chkConfirmDel: TCheckBox + Left = 236 + Top = 115 + Width = 258 + Height = 17 + HelpContext = 1005 + Anchors = [akLeft, akTop, akRight] + Caption = 'Confirm delete' + TabOrder = 0 + end + object chkOldPaletteFormat: TCheckBox + Left = 236 + Top = 75 + Width = 258 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = 'Save gradient in old file format' + TabOrder = 1 + WordWrap = True + end + object chkConfirmExit: TCheckBox + Left = 236 + Top = 135 + Width = 258 + Height = 17 + HelpContext = 1005 + Anchors = [akLeft, akTop, akRight] + Caption = 'Confirm exit' + TabOrder = 18 + end + object chkConfirmStopRender: TCheckBox + Left = 236 + Top = 155 + Width = 258 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = 'Confirm stop render' + TabOrder = 3 + end + object cbUseTemplate: TCheckBox + Left = 236 + Top = 35 + Width = 258 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = 'Always create blank flame' + TabOrder = 4 + end + object cbMissingPlugin: TCheckBox + Left = 236 + Top = 55 + Width = 258 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = 'Warn when plugins are missing' + TabOrder = 5 + WordWrap = True + end + object cbEmbedThumbs: TCheckBox + Left = 236 + Top = 255 + Width = 258 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = 'Enable thumbnail embedding' + TabOrder = 6 + Visible = False + WordWrap = True + end + object pnlMultithreading: TPanel + Left = 8 + Top = 92 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Multithreading' + ParentShowHint = False + ShowHint = True + TabOrder = 7 + end + object cbNrTheads: TComboBox + Left = 112 + Top = 92 + Width = 113 + Height = 21 + Style = csDropDownList + ItemIndex = 0 + TabOrder = 8 + Text = 'Off' + Items.Strings = ( + 'Off') + end + object pnlPNGTransparency: TPanel + Left = 8 + Top = 64 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'PNG Transparency' + ParentShowHint = False + ShowHint = True + TabOrder = 11 + end + object grpGuidelines: TGroupBox + Left = 8 + Top = 124 + Width = 217 + Height = 135 + Caption = 'Guidelines' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 13 + object cbGL: TCheckBox + Left = 8 + Top = 23 + Width = 193 + Height = 17 + Caption = 'Enable' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 0 + OnClick = cbGLClick + end + object pnlCenterLine: TPanel + Left = 112 + Top = 48 + Width = 97 + Height = 21 + Cursor = crHandPoint + BevelInner = bvRaised + BevelOuter = bvLowered + BorderStyle = bsSingle + Color = clBlack + TabOrder = 1 + OnClick = pnlCenterLineClick + object shCenterLine: TShape + Left = 2 + Top = 2 + Width = 89 + Height = 13 + Align = alClient + OnMouseUp = shCenterLineMouseUp + end + end + object pnlThirdsLine: TPanel + Left = 112 + Top = 72 + Width = 97 + Height = 21 + Cursor = crHandPoint + BevelInner = bvRaised + BevelOuter = bvLowered + BorderStyle = bsSingle + Color = clBlack + TabOrder = 2 + OnClick = pnlThirdsLineClick + object shThirdsLine: TShape + Left = 2 + Top = 2 + Width = 89 + Height = 13 + Align = alClient + OnMouseUp = shThirdsLineMouseUp + end + end + object pnlGRLine: TPanel + Left = 112 + Top = 96 + Width = 97 + Height = 21 + Cursor = crHandPoint + BevelInner = bvRaised + BevelOuter = bvLowered + BorderStyle = bsSingle + Color = clBlack + TabOrder = 3 + OnClick = pnlGRLineClick + object shGRLine: TShape + Left = 2 + Top = 2 + Width = 89 + Height = 13 + Align = alClient + OnMouseUp = shGRLineMouseUp + end + end + object pnlCenter: TPanel + Left = 8 + Top = 48 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Center' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 4 + end + object pnlThirds: TPanel + Left = 8 + Top = 72 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Thirds' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 5 + end + object pnlGoldenRatio: TPanel + Left = 8 + Top = 96 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Golden ratio' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 6 + end + end + object Panel46: TPanel + Left = 8 + Top = 8 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Language file' + ParentShowHint = False + ShowHint = True + TabOrder = 14 + end + object txtLanguageFile: TComboBox + Left = 112 + Top = 8 + Width = 360 + Height = 21 + Style = csDropDownList + Anchors = [akLeft, akTop, akRight] + TabOrder = 15 + end + object cbPNGTransparency: TComboBox + Left = 112 + Top = 64 + Width = 113 + Height = 21 + Style = csDropDownList + ItemIndex = 0 + TabOrder = 12 + Text = 'Disabled' + Items.Strings = ( + 'Disabled' + 'Enabled') + end + object txtJPEGquality: TComboBox + Left = 112 + Top = 36 + Width = 113 + Height = 21 + TabOrder = 10 + Text = '100' + OnKeyPress = NumFieldKeyPress + Items.Strings = ( + '60' + '80' + '100') + end + object chkEngLayout: TCheckBox + Left = 236 + Top = 195 + Width = 258 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = 'Set English keyboard layout' + TabOrder = 16 + end + object chkConfirmClearScript: TCheckBox + Left = 236 + Top = 175 + Width = 258 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = 'Confirm clear script' + TabOrder = 17 + end + object GroupBox15: TGroupBox + Left = 6 + Top = 290 + Width = 354 + Height = 120 + Anchors = [akLeft, akTop, akRight] + Caption = 'On render complete' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 2 + DesignSize = ( + 354 + 120) + object btnBrowseSound: TSpeedButton + Left = 321 + Top = 41 + Width = 24 + Height = 24 + Hint = 'Browse...' + Anchors = [akTop, akRight] + Flat = True + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + Font.Style = [fsBold] + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF75848F66808F + 607987576E7B4E626F4456613948522E3A43252E351B222914191E0E12160E13 + 18FF00FFFF00FFFF00FF77879289A1AB6AB2D4008FCD008FCD008FCD048CC708 + 88BE0F82B4157CA91B779F1F7296224B5C87A2ABFF00FFFF00FF7A8A957EBED3 + 8AA4AE7EDCFF5FCFFF55CBFF4CC4FA41BCF537B3F02EAAEB24A0E5138CD42367 + 805E696DFF00FFFF00FF7D8E9879D2EC8BA4AD89C2CE71D8FF65D3FF5CCEFF51 + C9FE49C1FA3FB9F534B0EE29A8E91085CD224B5B98B2BAFF00FF80919C81D7EF + 7DC5E08CA6B080DDFE68D3FF67D4FF62D1FF58CDFF4EC7FC46BEF73BB6F231AC + EC2569817A95A1FF00FF83959F89DCF18CE2FF8DA8B18CBAC774D8FF67D4FF67 + D4FF67D4FF5FD0FF54CDFF4BC5FC41BBF72EA2DB51677498B2BA869AA392E1F2 + 98E8FD80C4DE8EA7B081DEFD84E0FF84E0FF84E0FF84E0FF81DFFF7BDDFF74D8 + FF6BD6FF56A9D18F9BA4889CA59AE6F39FEBFB98E8FE8BACB98BACB98AAAB788 + A6B386A3AF839FAA819AA67F95A17C919D7A8E99798B957788938BA0A8A0EAF6 + A6EEF99FEBFB98E8FE7ADAFF67D4FF67D4FF67D4FF67D4FF67D4FF67D4FF7788 + 93FF00FFFF00FFFF00FF8EA2ABA7EEF6ABF0F7A6EEF99FEBFB98E8FD71D4FB89 + 9EA78699A382949F7E909A7A8C97778893FF00FFFF00FFFF00FF8FA4ACA0D2DA + ABF0F7ABF0F7A6EEF99FEBFB8DA1AAB5CBD0FF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFBDCED48FA4AC8FA4AC8FA4AC8FA4AC8FA4ACB5CBD0FF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF} + ParentFont = False + ParentShowHint = False + ShowHint = True + OnClick = btnBrowseSoundClick + ExplicitLeft = 284 + end + object btnPlay: TSpeedButton + Left = 321 + Top = 14 + Width = 24 + Height = 24 + Hint = 'Play' + Anchors = [akTop, akRight] + Flat = True + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + Font.Style = [fsBold] + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFDEEAE0FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF096314DEEAE0FF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FF11681B04600FDEEAE0FF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF1A6F2420732C04 + 600FDEEAE0FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FF23752E2F833D20732C04600FDEEAE0FF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF2E7C3750A25A2F + 833D20732C04600FDEEAE0FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FF3883415DB06850A25A2F833D20732C0B6618DEEAE0FF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF438A4C6BBF766B + BF7650A25A2F7639D6EDD9FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FF4B90536BBF76A3DAB02F7639D6EDD9FF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF52945AA3DAB02F + 7639D6EDD9FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FF5898602F7639D6EDD9FF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF589860D6EDD9FF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFD6EDD9FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF} + ParentFont = False + ParentShowHint = False + ShowHint = True + OnClick = btnPlayClick + ExplicitLeft = 284 + end + object Label44: TLabel + Left = 10 + Top = 44 + Width = 49 + Height = 13 + Caption = 'File name:' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object txtSoundFile: TEdit + Left = 84 + Top = 42 + Width = 230 + Height = 21 + HelpContext = 1000 + Anchors = [akLeft, akTop, akRight] + ParentShowHint = False + ShowHint = False + TabOrder = 0 + end + object chkPlaysound: TCheckBox + Left = 8 + Top = 18 + Width = 270 + Height = 17 + Caption = 'Play sound' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 1 + end + object chkShowRenderStats: TCheckBox + Left = 8 + Top = 72 + Width = 306 + Height = 17 + Caption = 'Show extended render statistics' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 2 + end + object chkShowRenderImage: TCheckBox + Left = 8 + Top = 92 + Width = 306 + Height = 17 + Caption = 'Show rendered image' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 3 + end + end + object chkAutoSaveXML: TCheckBox + Left = 236 + Top = 215 + Width = 258 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = 'Automatically save pasted parameters' + TabOrder = 19 + end + object chkRandomTemplates: TCheckBox + Left = 236 + Top = 95 + Width = 258 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = 'Randomize gradient for templates' + TabOrder = 20 + WordWrap = True + end + object chkApplyFlatten: TCheckBox + Left = 236 + Top = 235 + Width = 258 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = 'Apply flattening to old flames' + TabOrder = 21 + WordWrap = True + end + end + object EditorPage: TTabSheet + Caption = 'Editor' + ImageIndex = 8 + ExplicitLeft = 0 + ExplicitTop = 0 + ExplicitWidth = 0 + ExplicitHeight = 0 + DesignSize = ( + 504 + 428) + object GroupBox1: TGroupBox + Left = 8 + Top = 4 + Width = 217 + Height = 81 + Caption = 'Editor Graph' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 0 + DesignSize = ( + 217 + 81) + object chkUseXFormColor: TCheckBox + Left = 8 + Top = 16 + Width = 201 + Height = 17 + Caption = 'Use transform color' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 0 + end + object chkHelpers: TCheckBox + Left = 8 + Top = 36 + Width = 201 + Height = 17 + Caption = 'Helper lines' + Checked = True + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + State = cbChecked + TabOrder = 1 + end + object chkShowAllXforms: TCheckBox + Left = 8 + Top = 56 + Width = 491 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = 'Always show both type of transforms' + Checked = True + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + State = cbChecked + TabOrder = 2 + WordWrap = True + end + end + object GroupBox21: TGroupBox + Left = 231 + Top = 4 + Width = 268 + Height = 128 + Anchors = [akLeft, akTop, akRight] + Caption = 'Editor defaults' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 1 + DesignSize = ( + 268 + 128) + object chkAxisLock: TCheckBox + Left = 8 + Top = 38 + Width = 257 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = 'Lock transform axis' + Checked = True + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + State = cbChecked + TabOrder = 0 + end + object chkExtendedEdit: TCheckBox + Left = 8 + Top = 18 + Width = 257 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = 'Extended edit mode' + Checked = True + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + State = cbChecked + TabOrder = 1 + end + object chkXaosRebuild: TCheckBox + Left = 8 + Top = 58 + Width = 257 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = 'Rebuild xaos links' + Checked = True + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + State = cbChecked + TabOrder = 2 + end + object chkResetCoefs: TCheckBox + Left = 8 + Top = 78 + Width = 257 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = 'Reset coefs by double-click' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 3 + end + object chkResetLinear: TCheckBox + Left = 8 + Top = 98 + Width = 257 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = 'Reset linear when other variation is set' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 4 + end + end + object grpEditorColors: TGroupBox + Left = 8 + Top = 92 + Width = 217 + Height = 155 + Caption = 'Editor colors' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 2 + object pnlBackground: TPanel + Left = 8 + Top = 24 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Background' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 5 + end + object pnlReferenceC: TPanel + Left = 8 + Top = 48 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Reference' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 6 + end + object pnlHelpers: TPanel + Left = 8 + Top = 72 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Helpers' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 7 + end + object pnlGrid: TPanel + Left = 8 + Top = 96 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Grid' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 8 + end + object pnlBackColor: TPanel + Left = 112 + Top = 24 + Width = 97 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + BorderStyle = bsSingle + Color = clBlack + TabOrder = 0 + OnClick = pnlBackColorClick + object shBackground: TShape + Left = 1 + Top = 1 + Width = 91 + Height = 15 + Align = alClient + Pen.Style = psClear + OnMouseUp = shBackgroundMouseUp + end + end + object pnlReference: TPanel + Left = 112 + Top = 48 + Width = 97 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + BorderStyle = bsSingle + Color = clGray + TabOrder = 1 + OnClick = pnlReferenceClick + object shRef: TShape + Left = 1 + Top = 1 + Width = 91 + Height = 15 + Align = alClient + Pen.Style = psClear + OnMouseUp = shRefMouseUp + end + end + object pnlHelpersColor: TPanel + Left = 112 + Top = 72 + Width = 97 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + BorderStyle = bsSingle + Color = clGray + TabOrder = 2 + OnClick = pnlHelpersColorClick + object shHelpers: TShape + Left = 1 + Top = 1 + Width = 91 + Height = 15 + Align = alClient + Pen.Style = psClear + OnMouseUp = shHelpersMouseUp + end + end + object pnlGridColor1: TPanel + Left = 112 + Top = 96 + Width = 49 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + BorderStyle = bsSingle + Color = clBlack + TabOrder = 3 + OnClick = pnlGridColor1Click + object shGC1: TShape + Left = 1 + Top = 1 + Width = 43 + Height = 15 + Align = alClient + Pen.Style = psClear + OnMouseUp = shGC1MouseUp + end + end + object pnlGridColor2: TPanel + Left = 164 + Top = 96 + Width = 45 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + BorderStyle = bsSingle + Color = clBlack + TabOrder = 4 + OnClick = pnlGridColor2Click + object shGC2: TShape + Left = 1 + Top = 1 + Width = 39 + Height = 15 + Align = alClient + Pen.Style = psClear + OnMouseUp = shGC2MouseUp + end + end + object pnlReflection: TPanel + Left = 8 + Top = 120 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Reflection' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 9 + end + object pnlReflectionC: TPanel + Left = 112 + Top = 120 + Width = 97 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + BorderStyle = bsSingle + Color = clGray + TabOrder = 10 + OnClick = pnlReflectionCClick + object shReflection: TShape + Left = 1 + Top = 1 + Width = 91 + Height = 15 + Align = alClient + Pen.Style = psClear + OnMouseUp = shReflectionMouseUp + end + end + end + object chkEnableEditorPreview: TCheckBox + Left = 8 + Top = 256 + Width = 486 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = 'Enable editor preview' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 3 + OnClick = chkEnableEditorPreviewClick + end + object Panel48: TPanel + Left = 16 + Top = 278 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Transparency' + ParentShowHint = False + ShowHint = True + TabOrder = 4 + end + object tbEPTransparency: TTrackBar + Left = 128 + Top = 276 + Width = 366 + Height = 25 + Anchors = [akLeft, akTop, akRight] + LineSize = 4 + Max = 255 + PageSize = 32 + Frequency = 16 + TabOrder = 5 + end + end + object DisplayPage: TTabSheet + Caption = 'Display' + ExplicitLeft = 0 + ExplicitTop = 0 + ExplicitWidth = 0 + ExplicitHeight = 0 + DesignSize = ( + 504 + 428) + object GroupBox2: TGroupBox + Left = 243 + Top = 78 + Width = 226 + Height = 100 + Anchors = [akTop, akRight] + Caption = 'Preview density' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 1 + object pnlLowQ: TPanel + Tag = 8 + Left = 8 + Top = 24 + Width = 105 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Low quality' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 3 + OnDblClick = RenderPanelsDblClick + end + object pnlMediumQ: TPanel + Tag = 9 + Left = 8 + Top = 48 + Width = 105 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Medium quality' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 4 + OnDblClick = RenderPanelsDblClick + end + object pnlHighQ: TPanel + Tag = 10 + Left = 8 + Top = 72 + Width = 105 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'High quality' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 5 + OnDblClick = RenderPanelsDblClick + end + object txtHighQuality: TEdit + Left = 112 + Top = 72 + Width = 89 + Height = 21 + HelpContext = 1014 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 2 + OnKeyPress = NumFloatKeyPress + end + object txtMediumQuality: TEdit + Left = 112 + Top = 48 + Width = 89 + Height = 21 + HelpContext = 1013 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 1 + OnKeyPress = NumFloatKeyPress + end + object txtLowQuality: TEdit + Left = 112 + Top = 24 + Width = 89 + Height = 21 + HelpContext = 1012 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 0 + OnKeyPress = NumFloatKeyPress + end + end + object grpRendering: TGroupBox + Left = 8 + Top = 78 + Width = 217 + Height = 245 + Caption = 'Rendering' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 0 + object pnlDensity: TPanel + Left = 8 + Top = 24 + Width = 105 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Density' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 7 + OnDblClick = RenderPanelsDblClick + end + object pnlGamma: TPanel + Tag = 1 + Left = 8 + Top = 48 + Width = 105 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Gamma' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 8 + OnDblClick = RenderPanelsDblClick + end + object pnlBright: TPanel + Tag = 2 + Left = 8 + Top = 72 + Width = 105 + Height = 29 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Brightness' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 9 + OnDblClick = RenderPanelsDblClick + end + object pnlVibrancy: TPanel + Tag = 3 + Left = 8 + Top = 96 + Width = 105 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Vibrancy' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 10 + OnDblClick = RenderPanelsDblClick + end + object pnlRelGamma: TPanel + Tag = 4 + Left = 8 + Top = 120 + Width = 105 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Gamma threshold' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 11 + OnDblClick = RenderPanelsDblClick + end + object pnlOSample: TPanel + Tag = 5 + Left = 8 + Top = 144 + Width = 105 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Oversample' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 12 + OnDblClick = RenderPanelsDblClick + end + object pnlFilter: TPanel + Tag = 6 + Left = 8 + Top = 168 + Width = 105 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Filter radius' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 13 + OnDblClick = RenderPanelsDblClick + end + object txtGammaThreshold: TEdit + Left = 112 + Top = 120 + Width = 89 + Height = 21 + HelpContext = 1011 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 6 + OnKeyPress = NumFloatKeyPress + end + object txtFilterRadius: TEdit + Left = 112 + Top = 168 + Width = 89 + Height = 21 + HelpContext = 1011 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 5 + OnKeyPress = NumFloatKeyPress + end + object txtOversample: TEdit + Left = 112 + Top = 144 + Width = 89 + Height = 21 + HelpContext = 1010 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 15 + OnKeyPress = NumFieldKeyPress + end + object txtVibrancy: TEdit + Left = 112 + Top = 96 + Width = 89 + Height = 21 + HelpContext = 1009 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 3 + OnKeyPress = NumFloatKeyPress + end + object txtBrightness: TEdit + Left = 112 + Top = 72 + Width = 89 + Height = 21 + HelpContext = 1008 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 2 + OnKeyPress = NumFloatKeyPress + end + object txtGamma: TEdit + Left = 112 + Top = 48 + Width = 89 + Height = 21 + HelpContext = 1007 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 1 + OnKeyPress = NumFloatKeyPress + end + object txtSampleDensity: TEdit + Left = 112 + Top = 24 + Width = 89 + Height = 21 + HelpContext = 1006 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 0 + OnKeyPress = NumFloatKeyPress + end + object pnlFuse: TPanel + Tag = 7 + Left = 8 + Top = 216 + Width = 105 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Skipped iterations' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 14 + OnDblClick = RenderPanelsDblClick + end + object txtFuse: TSpinEdit + Left = 112 + Top = 216 + Width = 89 + Height = 22 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + MaxValue = 250 + MinValue = 5 + ParentFont = False + TabOrder = 4 + Value = 15 + OnKeyPress = NumFieldKeyPress + end + object pnlContrast: TPanel + Tag = 11 + Left = 8 + Top = 192 + Width = 105 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Contrast' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 16 + OnDblClick = RenderPanelsDblClick + end + object txtContrast: TEdit + Left = 112 + Top = 192 + Width = 89 + Height = 21 + HelpContext = 1011 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 17 + OnKeyPress = NumFloatKeyPress + end + end + object GroupBox20: TGroupBox + Left = 8 + Top = 2 + Width = 491 + Height = 73 + Anchors = [akLeft, akTop, akRight] + Caption = 'Main Window Preview' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 2 + object Label48: TLabel + Left = 188 + Top = 46 + Width = 11 + Height = 13 + Caption = '%' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object chkShowTransparency: TCheckBox + Left = 250 + Top = 20 + Width = 233 + Height = 17 + Caption = 'Show Transparency' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 2 + end + object chkExtendMainPreview: TCheckBox + Left = 8 + Top = 20 + Width = 225 + Height = 17 + Caption = 'Extend preview buffer' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 0 + end + object pnlExtension: TPanel + Left = 8 + Top = 42 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Buffer extension' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 4 + end + object cbExtendPercent: TComboBox + Left = 112 + Top = 42 + Width = 73 + Height = 21 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 1 + OnKeyPress = NumFieldKeyPress + Items.Strings = ( + '0' + '10' + '25' + '50' + '100' + '150' + '200') + end + object chkUseSmallThumbs: TCheckBox + Left = 250 + Top = 38 + Width = 209 + Height = 31 + Caption = 'Use small thumbnails' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 3 + WordWrap = True + end + end + object GroupBox7: TGroupBox + Left = 243 + Top = 179 + Width = 226 + Height = 100 + Anchors = [akTop, akRight] + Caption = 'Tile radius' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 3 + object pnSTile: TPanel + Left = 8 + Top = 24 + Width = 105 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Square' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 3 + OnDblClick = TilePanelDblClick + end + object pnRTile: TPanel + Tag = 1 + Left = 8 + Top = 48 + Width = 105 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Rhombus ' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 4 + OnDblClick = TilePanelDblClick + end + object pnHexTile: TPanel + Tag = 2 + Left = 8 + Top = 72 + Width = 105 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Hexagonal' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 5 + OnDblClick = TilePanelDblClick + end + object txtHexTile: TEdit + Left = 112 + Top = 72 + Width = 89 + Height = 21 + HelpContext = 1014 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 2 + OnKeyPress = NumFloatKeyPress + end + object txtRTile: TEdit + Left = 112 + Top = 48 + Width = 89 + Height = 21 + HelpContext = 1013 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 1 + OnKeyPress = NumFloatKeyPress + end + object txtSTile: TEdit + Left = 112 + Top = 24 + Width = 89 + Height = 21 + HelpContext = 1012 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 0 + OnKeyPress = NumFloatKeyPress + end + end + object rgRotationMode: TRadioGroup + Left = 8 + Top = 358 + Width = 220 + Height = 66 + Anchors = [akLeft, akBottom] + Caption = 'Rotation Mode' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Items.Strings = ( + 'Rotate image' + 'Rotate frame') + ParentFont = False + TabOrder = 4 + end + object rgZoomingMode: TRadioGroup + Left = 243 + Top = 358 + Width = 226 + Height = 66 + Anchors = [akRight, akBottom] + Caption = 'Zooming mode' + Items.Strings = ( + 'Preserve quality' + 'Preserve speed') + TabOrder = 5 + end + object rgEnumMode: TRadioGroup + Left = 243 + Top = 298 + Width = 226 + Height = 55 + Anchors = [akRight, akBottom] + Caption = 'Enumerating mode ' + Items.Strings = ( + 'From 0' + 'From 1') + TabOrder = 6 + end + end + object RandomPage: TTabSheet + Caption = 'Random' + ExplicitLeft = 0 + ExplicitTop = 0 + ExplicitWidth = 0 + ExplicitHeight = 0 + DesignSize = ( + 504 + 428) + object gpNumberOfTransforms: TGroupBox + Left = 8 + Top = 6 + Width = 209 + Height = 75 + Caption = 'Number of transforms' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 0 + object udMinXforms: TUpDown + Left = 189 + Top = 20 + Width = 12 + Height = 21 + Associate = txtMinXForms + Min = 1 + Position = 2 + TabOrder = 2 + end + object udMaxXForms: TUpDown + Left = 189 + Top = 44 + Width = 12 + Height = 21 + Associate = txtMaxXforms + Min = 2 + Position = 6 + TabOrder = 3 + end + object Panel15: TPanel + Left = 8 + Top = 20 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Minimum' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 4 + end + object Panel16: TPanel + Left = 8 + Top = 44 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Maximum' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 5 + end + object txtMaxXforms: TEdit + Left = 112 + Top = 44 + Width = 77 + Height = 21 + HelpContext = 1018 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 1 + Text = '6' + OnChange = txtMaxXformsChange + OnKeyPress = NumFieldKeyPress + end + object txtMinXForms: TEdit + Left = 112 + Top = 20 + Width = 77 + Height = 21 + HelpContext = 1017 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 0 + Text = '2' + OnChange = txtMinXFormsChange + OnKeyPress = NumFieldKeyPress + end + end + object gpFlameTitlePrefix: TGroupBox + Left = 269 + Top = 88 + Width = 217 + Height = 122 + Anchors = [akTop, akRight] + Caption = 'Random batch' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 1 + object udBatchSize: TUpDown + Left = 195 + Top = 20 + Width = 13 + Height = 21 + Associate = txtBatchSize + Min = 1 + Max = 300 + Position = 10 + TabOrder = 2 + Thousands = False + end + object chkKeepBackground: TCheckBox + Left = 8 + Top = 96 + Width = 201 + Height = 17 + HelpContext = 1023 + Caption = 'Keep background color' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 3 + OnClick = chkKeepBackgroundClick + end + object Panel11: TPanel + Left = 8 + Top = 20 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Batch size' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 4 + end + object Panel12: TPanel + Left = 8 + Top = 44 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Title prefix' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 5 + end + object txtBatchSize: TEdit + Left = 112 + Top = 20 + Width = 83 + Height = 21 + HelpContext = 1004 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 1 + Text = '10' + OnKeyPress = NumFieldKeyPress + end + object txtRandomPrefix: TEdit + Left = 112 + Top = 44 + Width = 96 + Height = 21 + HelpContext = 1021 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 0 + Text = 'Apophysis' + end + object pnlRandBackground: TPanel + Left = 8 + Top = 68 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Background' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 6 + end + object pnlRandBackColor: TPanel + Left = 112 + Top = 68 + Width = 97 + Height = 21 + Cursor = crHandPoint + BevelInner = bvRaised + BevelOuter = bvLowered + BorderStyle = bsSingle + Color = clBlack + TabOrder = 7 + OnClick = pnlRandBackColorClick + object shRandBackColor: TShape + Left = 2 + Top = 2 + Width = 89 + Height = 13 + Align = alClient + Brush.Color = clBlack + OnMouseUp = shRandBackColorMouseUp + ExplicitTop = 0 + end + end + end + object gpMutationTransforms: TGroupBox + Left = 269 + Top = 6 + Width = 214 + Height = 75 + Anchors = [akTop, akRight] + Caption = 'Mutation transforms' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 3 + object udMinMutate: TUpDown + Left = 197 + Top = 20 + Width = 12 + Height = 21 + Associate = txtMinMutate + Min = 2 + Max = 12 + Position = 2 + TabOrder = 2 + end + object udMaxMutate: TUpDown + Left = 197 + Top = 44 + Width = 12 + Height = 21 + Associate = txtMaxMutate + Min = 2 + Max = 12 + Position = 6 + TabOrder = 3 + end + object Panel13: TPanel + Left = 8 + Top = 20 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Minimum' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 4 + end + object Panel14: TPanel + Left = 8 + Top = 44 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Maximum' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 5 + end + object txtMaxMutate: TEdit + Left = 112 + Top = 44 + Width = 85 + Height = 21 + HelpContext = 1020 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 1 + Text = '6' + OnChange = txtMaxMutateChange + OnKeyPress = NumFieldKeyPress + end + object txtMinMutate: TEdit + Left = 112 + Top = 20 + Width = 85 + Height = 21 + HelpContext = 1019 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 0 + Text = '2' + OnChange = txtMinMutateChange + OnKeyPress = NumFieldKeyPress + end + end + object gpForcedSymmetry: TGroupBox + Left = 8 + Top = 88 + Width = 209 + Height = 97 + Caption = 'Forced symmetry' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 2 + object udSymOrder: TUpDown + Left = 187 + Top = 43 + Width = 13 + Height = 21 + Associate = txtSymOrder + Min = 2 + Max = 2000 + Position = 4 + TabOrder = 2 + Thousands = False + end + object udSymNVars: TUpDown + Left = 187 + Top = 68 + Width = 13 + Height = 21 + Associate = txtSymNVars + Min = 4 + Position = 12 + TabOrder = 4 + Thousands = False + end + object Panel17: TPanel + Left = 8 + Top = 20 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Type' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 5 + end + object Panel18: TPanel + Left = 8 + Top = 44 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Order' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 6 + end + object Panel19: TPanel + Left = 8 + Top = 68 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Limit' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 7 + end + object txtSymNVars: TEdit + Left = 112 + Top = 68 + Width = 75 + Height = 21 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 3 + Text = '12' + OnKeyPress = NumFieldKeyPress + end + object txtSymOrder: TEdit + Left = 112 + Top = 43 + Width = 75 + Height = 21 + HelpContext = 1025 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 1 + Text = '4' + OnKeyPress = NumFieldKeyPress + end + object cmbSymType: TComboBox + Left = 112 + Top = 20 + Width = 89 + Height = 21 + HelpContext = 1024 + Style = csDropDownList + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 0 + OnChange = cmbSymTypeChange + Items.Strings = ( + 'None' + 'Bilateral' + 'Rotational' + 'Dihedral') + end + end + object grpGradient: TRadioGroup + Left = 8 + Top = 192 + Width = 209 + Height = 121 + HelpContext = 1029 + Caption = 'On random flame' + ItemIndex = 0 + Items.Strings = ( + 'Use random preset' + 'Use default' + 'Use current' + 'Randomize' + 'Random from a file') + TabOrder = 4 + end + object GroupBox16: TGroupBox + Left = 8 + Top = 320 + Width = 209 + Height = 49 + Caption = 'Random file to use' + TabOrder = 5 + object btnGradientsFile: TSpeedButton + Left = 185 + Top = 18 + Width = 24 + Height = 24 + Hint = 'Browse...' + Flat = True + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + Font.Style = [fsBold] + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF75848F66808F + 607987576E7B4E626F4456613948522E3A43252E351B222914191E0E12160E13 + 18FF00FFFF00FFFF00FF77879289A1AB6AB2D4008FCD008FCD008FCD048CC708 + 88BE0F82B4157CA91B779F1F7296224B5C87A2ABFF00FFFF00FF7A8A957EBED3 + 8AA4AE7EDCFF5FCFFF55CBFF4CC4FA41BCF537B3F02EAAEB24A0E5138CD42367 + 805E696DFF00FFFF00FF7D8E9879D2EC8BA4AD89C2CE71D8FF65D3FF5CCEFF51 + C9FE49C1FA3FB9F534B0EE29A8E91085CD224B5B98B2BAFF00FF80919C81D7EF + 7DC5E08CA6B080DDFE68D3FF67D4FF62D1FF58CDFF4EC7FC46BEF73BB6F231AC + EC2569817A95A1FF00FF83959F89DCF18CE2FF8DA8B18CBAC774D8FF67D4FF67 + D4FF67D4FF5FD0FF54CDFF4BC5FC41BBF72EA2DB51677498B2BA869AA392E1F2 + 98E8FD80C4DE8EA7B081DEFD84E0FF84E0FF84E0FF84E0FF81DFFF7BDDFF74D8 + FF6BD6FF56A9D18F9BA4889CA59AE6F39FEBFB98E8FE8BACB98BACB98AAAB788 + A6B386A3AF839FAA819AA67F95A17C919D7A8E99798B957788938BA0A8A0EAF6 + A6EEF99FEBFB98E8FE7ADAFF67D4FF67D4FF67D4FF67D4FF67D4FF67D4FF7788 + 93FF00FFFF00FFFF00FF8EA2ABA7EEF6ABF0F7A6EEF99FEBFB98E8FD71D4FB89 + 9EA78699A382949F7E909A7A8C97778893FF00FFFF00FFFF00FF8FA4ACA0D2DA + ABF0F7ABF0F7A6EEF99FEBFB8DA1AAB5CBD0FF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFBDCED48FA4AC8FA4AC8FA4AC8FA4AC8FA4ACB5CBD0FF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF} + ParentFont = False + ParentShowHint = False + ShowHint = True + OnClick = btnGradientsFileClick + end + object txtGradientsFile: TEdit + Left = 11 + Top = 19 + Width = 174 + Height = 21 + TabOrder = 0 + end + end + end + object VariationsPage: TTabSheet + Caption = 'Variations' + ImageIndex = 4 + ExplicitLeft = 0 + ExplicitTop = 0 + ExplicitWidth = 0 + ExplicitHeight = 0 + DesignSize = ( + 504 + 428) + object btnSetAll: TButton + Left = 410 + Top = 24 + Width = 91 + Height = 25 + HelpContext = 1027 + Anchors = [akTop, akRight] + Caption = 'Set All' + TabOrder = 0 + OnClick = btnSetAllClick + end + object btnClearAll: TButton + Left = 410 + Top = 52 + Width = 91 + Height = 25 + HelpContext = 1028 + Anchors = [akTop, akRight] + Caption = 'Clear All' + TabOrder = 1 + OnClick = btnClearAllClick + end + object btnInvert: TButton + Left = 410 + Top = 80 + Width = 91 + Height = 25 + HelpContext = 1028 + Anchors = [akTop, akRight] + Caption = 'Invert Selection' + TabOrder = 3 + OnClick = btnInvertClick + end + object VarsPages: TPageControl + Left = 0 + Top = 0 + Width = 403 + Height = 426 + ActivePage = tabRandomVars + Anchors = [akLeft, akTop, akRight, akBottom] + TabOrder = 2 + object tabRandomVars: TTabSheet + Caption = 'Random choise' + ExplicitLeft = 0 + ExplicitTop = 0 + ExplicitWidth = 0 + ExplicitHeight = 0 + object clbVarEnabled: TCheckListBox + Left = 0 + Top = 0 + Width = 395 + Height = 398 + Align = alClient + Columns = 2 + ItemHeight = 13 + TabOrder = 0 + TabWidth = 100 + end + end + object tabFavouriteVars: TTabSheet + Caption = 'Favourites' + ExplicitLeft = 0 + ExplicitTop = 0 + ExplicitWidth = 0 + ExplicitHeight = 0 + object clbVarFavourite: TCheckListBox + Left = 0 + Top = 0 + Width = 395 + Height = 398 + Align = alClient + Columns = 2 + ItemHeight = 13 + TabOrder = 0 + TabWidth = 100 + end + end + end + end + object GradientPage: TTabSheet + Caption = 'Gradient' + ImageIndex = 5 + ExplicitLeft = 0 + ExplicitTop = 0 + ExplicitWidth = 0 + ExplicitHeight = 0 + DesignSize = ( + 504 + 428) + object GroupBox13: TGroupBox + Left = 8 + Top = 186 + Width = 209 + Height = 79 + Caption = 'Smooth palette' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 0 + object Panel28: TPanel + Tag = 8 + Left = 8 + Top = 20 + Width = 105 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Number of tries' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 2 + OnDblClick = GradientPanelsDblClick + end + object Panel29: TPanel + Tag = 9 + Left = 8 + Top = 44 + Width = 105 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Try length' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 3 + OnDblClick = GradientPanelsDblClick + end + object txtTryLength: TEdit + Left = 112 + Top = 44 + Width = 89 + Height = 21 + HelpContext = 1003 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 1 + Text = '10000' + OnKeyPress = NumFieldKeyPress + end + object txtNumtries: TEdit + Left = 112 + Top = 20 + Width = 89 + Height = 21 + HelpContext = 1002 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 0 + Text = '50' + OnKeyPress = NumFieldKeyPress + end + end + object GroupBox17: TGroupBox + Left = 8 + Top = 8 + Width = 209 + Height = 81 + Caption = 'Hue range' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 1 + object udMinHue: TUpDown + Left = 185 + Top = 20 + Width = 15 + Height = 21 + HelpContext = 1032 + Associate = txtMinHue + Max = 600 + TabOrder = 0 + end + object Panel20: TPanel + Tag = 1 + Left = 8 + Top = 44 + Width = 105 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Maximum' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 2 + OnDblClick = GradientPanelsDblClick + end + object Panel21: TPanel + Left = 8 + Top = 20 + Width = 105 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Minimum' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 3 + OnDblClick = GradientPanelsDblClick + end + object udMaxHue: TUpDown + Left = 185 + Top = 44 + Width = 15 + Height = 21 + HelpContext = 1033 + Associate = txtMaxHue + Max = 600 + Position = 600 + TabOrder = 4 + end + object txtMaxHue: TEdit + Left = 112 + Top = 44 + Width = 73 + Height = 21 + HelpContext = 1033 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 5 + Text = '600' + OnChange = txtMaxHueChange + OnKeyPress = NumFieldKeyPress + end + object txtMinHue: TEdit + Left = 112 + Top = 20 + Width = 73 + Height = 21 + HelpContext = 1032 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 1 + Text = '0' + OnChange = txtMinHueChange + OnKeyPress = NumFieldKeyPress + end + end + object GroupBox18: TGroupBox + Left = 266 + Top = 8 + Width = 209 + Height = 81 + Anchors = [akTop, akRight] + Caption = 'Saturation range' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 2 + object Panel22: TPanel + Tag = 2 + Left = 8 + Top = 20 + Width = 105 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Minimum' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 0 + OnDblClick = GradientPanelsDblClick + end + object Panel23: TPanel + Tag = 3 + Left = 8 + Top = 44 + Width = 105 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Maximum' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 1 + OnDblClick = GradientPanelsDblClick + end + object udMinSat: TUpDown + Left = 185 + Top = 20 + Width = 15 + Height = 21 + HelpContext = 1034 + Associate = txtMinSat + TabOrder = 2 + end + object txtMinSat: TEdit + Left = 112 + Top = 20 + Width = 73 + Height = 21 + HelpContext = 1034 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 3 + Text = '0' + OnChange = txtMinSatChange + OnKeyPress = NumFieldKeyPress + end + object udmaxSat: TUpDown + Left = 185 + Top = 44 + Width = 15 + Height = 21 + HelpContext = 1035 + Associate = txtMaxSat + Position = 100 + TabOrder = 4 + end + object txtMaxSat: TEdit + Left = 112 + Top = 44 + Width = 73 + Height = 21 + HelpContext = 1035 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 5 + Text = '100' + OnChange = txtMaxSatChange + OnKeyPress = NumFieldKeyPress + end + end + object GroupBox22: TGroupBox + Left = 8 + Top = 96 + Width = 209 + Height = 81 + Caption = 'Luminance range' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 3 + object Panel24: TPanel + Tag = 5 + Left = 8 + Top = 44 + Width = 105 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Maximum' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 0 + OnDblClick = GradientPanelsDblClick + end + object Panel25: TPanel + Tag = 4 + Left = 8 + Top = 20 + Width = 105 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Minimum' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 1 + OnDblClick = GradientPanelsDblClick + end + object udMinLum: TUpDown + Left = 185 + Top = 20 + Width = 15 + Height = 21 + HelpContext = 1036 + Associate = txtMinLum + Min = 1 + Position = 1 + TabOrder = 2 + end + object txtMinLum: TEdit + Left = 112 + Top = 20 + Width = 73 + Height = 21 + HelpContext = 1036 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 3 + Text = '1' + OnChange = txtMinLumChange + OnKeyPress = NumFieldKeyPress + end + object udMaxLum: TUpDown + Left = 185 + Top = 44 + Width = 15 + Height = 21 + HelpContext = 1037 + Associate = txtMaxLum + Position = 100 + TabOrder = 4 + end + object txtMaxLum: TEdit + Left = 112 + Top = 44 + Width = 73 + Height = 21 + HelpContext = 1037 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 5 + Text = '100' + OnChange = txtMaxLumChange + OnKeyPress = NumFieldKeyPress + end + end + object GroupBox23: TGroupBox + Left = 266 + Top = 96 + Width = 209 + Height = 81 + Anchors = [akTop, akRight] + Caption = 'Number of nodes' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 4 + object Panel26: TPanel + Tag = 6 + Left = 8 + Top = 20 + Width = 105 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Minimum' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 0 + OnDblClick = GradientPanelsDblClick + end + object Panel27: TPanel + Tag = 7 + Left = 8 + Top = 44 + Width = 105 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Maximum' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 1 + OnDblClick = GradientPanelsDblClick + end + object udMinNodes: TUpDown + Left = 185 + Top = 20 + Width = 15 + Height = 21 + HelpContext = 1030 + Associate = txtMinNodes + Min = 2 + Max = 64 + Position = 2 + TabOrder = 2 + end + object txtMinNodes: TEdit + Left = 112 + Top = 20 + Width = 73 + Height = 21 + HelpContext = 1030 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 3 + Text = '2' + OnChange = txtMinNodesChange + OnKeyPress = NumFieldKeyPress + end + object udMaxNodes: TUpDown + Left = 185 + Top = 44 + Width = 15 + Height = 21 + HelpContext = 1031 + Associate = txtMaxNodes + Min = 2 + Max = 64 + Position = 2 + TabOrder = 4 + end + object txtMaxNodes: TEdit + Left = 112 + Top = 44 + Width = 73 + Height = 21 + HelpContext = 1031 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 5 + Text = '2' + OnChange = txtMaxNodesChange + OnKeyPress = NumFieldKeyPress + end + end + object rgColorBlend: TRadioGroup + Left = 266 + Top = 183 + Width = 209 + Height = 82 + Anchors = [akTop, akRight] + Caption = 'Color blending ' + ItemIndex = 0 + Items.Strings = ( + 'RGB blend' + 'HSV blend' + 'No blend') + TabOrder = 5 + end + object chkEqualStripes: TCheckBox + Left = 13 + Top = 275 + Width = 491 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = ' Use equal color stripes' + Checked = True + State = cbChecked + TabOrder = 6 + WordWrap = True + end + end + object UPRPage: TTabSheet + Caption = 'UPR' + ImageIndex = 5 + ExplicitLeft = 0 + ExplicitTop = 0 + ExplicitWidth = 0 + ExplicitHeight = 0 + DesignSize = ( + 504 + 428) + object chkAdjustDensity: TCheckBox + Left = 274 + Top = 264 + Width = 228 + Height = 33 + Anchors = [akTop, akRight] + Caption = 'Adjust sample density' + TabOrder = 4 + WordWrap = True + end + object GroupBox11: TGroupBox + Left = 274 + Top = 184 + Width = 228 + Height = 81 + Anchors = [akTop, akRight] + Caption = 'UPR size' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 1 + object Panel37: TPanel + Left = 8 + Top = 24 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Width' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 2 + end + object Panel38: TPanel + Left = 8 + Top = 48 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Height' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 3 + end + object txtUPRHeight: TEdit + Left = 112 + Top = 48 + Width = 105 + Height = 21 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 1 + Text = '480' + OnKeyPress = NumFieldKeyPress + end + object txtUPRWidth: TEdit + Left = 112 + Top = 24 + Width = 105 + Height = 21 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 0 + Text = '640' + OnKeyPress = NumFieldKeyPress + end + end + object GroupBox9: TGroupBox + Left = 8 + Top = 182 + Width = 217 + Height = 107 + Caption = 'Parameter defaults' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 0 + object Panel34: TPanel + Left = 8 + Top = 24 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Sample density' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 3 + end + object Panel35: TPanel + Left = 8 + Top = 48 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Filter radius' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 4 + end + object Panel36: TPanel + Left = 8 + Top = 72 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Oversample' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 5 + end + object txtUPROversample: TEdit + Left = 112 + Top = 72 + Width = 97 + Height = 21 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 2 + Text = '3' + OnKeyPress = NumFieldKeyPress + end + object txtUPRFilterRadius: TEdit + Left = 112 + Top = 48 + Width = 97 + Height = 21 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 1 + Text = '0.7' + OnKeyPress = NumFloatKeyPress + end + object txtFIterDensity: TEdit + Left = 112 + Top = 24 + Width = 97 + Height = 21 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 0 + Text = '35' + OnKeyPress = NumFloatKeyPress + end + end + object GroupBox4: TGroupBox + Left = 8 + Top = 6 + Width = 494 + Height = 83 + Anchors = [akLeft, akTop, akRight] + Caption = 'Coloring algorithm' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 2 + object Panel30: TPanel + Left = 8 + Top = 24 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Title' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 2 + end + object Panel31: TPanel + Left = 8 + Top = 48 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'File name' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 3 + end + object txtFCFile: TEdit + Left = 112 + Top = 48 + Width = 337 + Height = 21 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 1 + Text = 'apophysis.ucl' + end + object txtFCIdent: TEdit + Left = 112 + Top = 24 + Width = 337 + Height = 21 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 0 + Text = 'apophysis-205' + end + end + object GroupBox5: TGroupBox + Left = 8 + Top = 95 + Width = 494 + Height = 82 + Anchors = [akLeft, akTop, akRight] + Caption = 'Fractal formula' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 3 + object Panel32: TPanel + Left = 8 + Top = 24 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Title' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 2 + end + object Panel33: TPanel + Left = 8 + Top = 48 + Width = 105 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'File name' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 3 + end + object txtFFFile: TEdit + Left = 112 + Top = 48 + Width = 337 + Height = 21 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 1 + Text = 'mt.ufm' + end + object txtFFIdent: TEdit + Left = 112 + Top = 24 + Width = 337 + Height = 21 + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 0 + Text = 'mt-pixel' + end + end + end + object PathsPage: TTabSheet + Caption = 'Environment' + ImageIndex = 7 + DesignSize = ( + 504 + 428) + object btnDefGradient: TSpeedButton + Left = 474 + Top = 7 + Width = 24 + Height = 24 + Hint = 'Browse...' + Anchors = [akTop, akRight] + Flat = True + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + Font.Style = [fsBold] + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF75848F66808F + 607987576E7B4E626F4456613948522E3A43252E351B222914191E0E12160E13 + 18FF00FFFF00FFFF00FF77879289A1AB6AB2D4008FCD008FCD008FCD048CC708 + 88BE0F82B4157CA91B779F1F7296224B5C87A2ABFF00FFFF00FF7A8A957EBED3 + 8AA4AE7EDCFF5FCFFF55CBFF4CC4FA41BCF537B3F02EAAEB24A0E5138CD42367 + 805E696DFF00FFFF00FF7D8E9879D2EC8BA4AD89C2CE71D8FF65D3FF5CCEFF51 + C9FE49C1FA3FB9F534B0EE29A8E91085CD224B5B98B2BAFF00FF80919C81D7EF + 7DC5E08CA6B080DDFE68D3FF67D4FF62D1FF58CDFF4EC7FC46BEF73BB6F231AC + EC2569817A95A1FF00FF83959F89DCF18CE2FF8DA8B18CBAC774D8FF67D4FF67 + D4FF67D4FF5FD0FF54CDFF4BC5FC41BBF72EA2DB51677498B2BA869AA392E1F2 + 98E8FD80C4DE8EA7B081DEFD84E0FF84E0FF84E0FF84E0FF81DFFF7BDDFF74D8 + FF6BD6FF56A9D18F9BA4889CA59AE6F39FEBFB98E8FE8BACB98BACB98AAAB788 + A6B386A3AF839FAA819AA67F95A17C919D7A8E99798B957788938BA0A8A0EAF6 + A6EEF99FEBFB98E8FE7ADAFF67D4FF67D4FF67D4FF67D4FF67D4FF67D4FF7788 + 93FF00FFFF00FFFF00FF8EA2ABA7EEF6ABF0F7A6EEF99FEBFB98E8FD71D4FB89 + 9EA78699A382949F7E909A7A8C97778893FF00FFFF00FFFF00FF8FA4ACA0D2DA + ABF0F7ABF0F7A6EEF99FEBFB8DA1AAB5CBD0FF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFBDCED48FA4AC8FA4AC8FA4AC8FA4AC8FA4ACB5CBD0FF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF} + ParentFont = False + ParentShowHint = False + ShowHint = True + OnClick = btnDefGradientClick + ExplicitLeft = 437 + end + object btnSmooth: TSpeedButton + Left = 474 + Top = 31 + Width = 24 + Height = 24 + Hint = 'Browse...' + Anchors = [akTop, akRight] + Flat = True + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + Font.Style = [fsBold] + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF75848F66808F + 607987576E7B4E626F4456613948522E3A43252E351B222914191E0E12160E13 + 18FF00FFFF00FFFF00FF77879289A1AB6AB2D4008FCD008FCD008FCD048CC708 + 88BE0F82B4157CA91B779F1F7296224B5C87A2ABFF00FFFF00FF7A8A957EBED3 + 8AA4AE7EDCFF5FCFFF55CBFF4CC4FA41BCF537B3F02EAAEB24A0E5138CD42367 + 805E696DFF00FFFF00FF7D8E9879D2EC8BA4AD89C2CE71D8FF65D3FF5CCEFF51 + C9FE49C1FA3FB9F534B0EE29A8E91085CD224B5B98B2BAFF00FF80919C81D7EF + 7DC5E08CA6B080DDFE68D3FF67D4FF62D1FF58CDFF4EC7FC46BEF73BB6F231AC + EC2569817A95A1FF00FF83959F89DCF18CE2FF8DA8B18CBAC774D8FF67D4FF67 + D4FF67D4FF5FD0FF54CDFF4BC5FC41BBF72EA2DB51677498B2BA869AA392E1F2 + 98E8FD80C4DE8EA7B081DEFD84E0FF84E0FF84E0FF84E0FF81DFFF7BDDFF74D8 + FF6BD6FF56A9D18F9BA4889CA59AE6F39FEBFB98E8FE8BACB98BACB98AAAB788 + A6B386A3AF839FAA819AA67F95A17C919D7A8E99798B957788938BA0A8A0EAF6 + A6EEF99FEBFB98E8FE7ADAFF67D4FF67D4FF67D4FF67D4FF67D4FF67D4FF7788 + 93FF00FFFF00FFFF00FF8EA2ABA7EEF6ABF0F7A6EEF99FEBFB98E8FD71D4FB89 + 9EA78699A382949F7E909A7A8C97778893FF00FFFF00FFFF00FF8FA4ACA0D2DA + ABF0F7ABF0F7A6EEF99FEBFB8DA1AAB5CBD0FF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFBDCED48FA4AC8FA4AC8FA4AC8FA4AC8FA4ACB5CBD0FF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF} + ParentFont = False + ParentShowHint = False + ShowHint = True + OnClick = btnSmoothClick + ExplicitLeft = 437 + end + object SpeedButton2: TSpeedButton + Left = 474 + Top = 55 + Width = 24 + Height = 24 + Hint = 'Browse...' + Anchors = [akTop, akRight] + Flat = True + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + Font.Style = [fsBold] + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF75848F66808F + 607987576E7B4E626F4456613948522E3A43252E351B222914191E0E12160E13 + 18FF00FFFF00FFFF00FF77879289A1AB6AB2D4008FCD008FCD008FCD048CC708 + 88BE0F82B4157CA91B779F1F7296224B5C87A2ABFF00FFFF00FF7A8A957EBED3 + 8AA4AE7EDCFF5FCFFF55CBFF4CC4FA41BCF537B3F02EAAEB24A0E5138CD42367 + 805E696DFF00FFFF00FF7D8E9879D2EC8BA4AD89C2CE71D8FF65D3FF5CCEFF51 + C9FE49C1FA3FB9F534B0EE29A8E91085CD224B5B98B2BAFF00FF80919C81D7EF + 7DC5E08CA6B080DDFE68D3FF67D4FF62D1FF58CDFF4EC7FC46BEF73BB6F231AC + EC2569817A95A1FF00FF83959F89DCF18CE2FF8DA8B18CBAC774D8FF67D4FF67 + D4FF67D4FF5FD0FF54CDFF4BC5FC41BBF72EA2DB51677498B2BA869AA392E1F2 + 98E8FD80C4DE8EA7B081DEFD84E0FF84E0FF84E0FF84E0FF81DFFF7BDDFF74D8 + FF6BD6FF56A9D18F9BA4889CA59AE6F39FEBFB98E8FE8BACB98BACB98AAAB788 + A6B386A3AF839FAA819AA67F95A17C919D7A8E99798B957788938BA0A8A0EAF6 + A6EEF99FEBFB98E8FE7ADAFF67D4FF67D4FF67D4FF67D4FF67D4FF67D4FF7788 + 93FF00FFFF00FFFF00FF8EA2ABA7EEF6ABF0F7A6EEF99FEBFB98E8FD71D4FB89 + 9EA78699A382949F7E909A7A8C97778893FF00FFFF00FFFF00FF8FA4ACA0D2DA + ABF0F7ABF0F7A6EEF99FEBFB8DA1AAB5CBD0FF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFBDCED48FA4AC8FA4AC8FA4AC8FA4AC8FA4ACB5CBD0FF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF} + ParentFont = False + ParentShowHint = False + ShowHint = True + OnClick = SpeedButton2Click + ExplicitLeft = 437 + end + object btnRenderer: TSpeedButton + Left = 474 + Top = 79 + Width = 24 + Height = 24 + Hint = 'Browse...' + Anchors = [akTop, akRight] + Flat = True + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + Font.Style = [fsBold] + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF75848F66808F + 607987576E7B4E626F4456613948522E3A43252E351B222914191E0E12160E13 + 18FF00FFFF00FFFF00FF77879289A1AB6AB2D4008FCD008FCD008FCD048CC708 + 88BE0F82B4157CA91B779F1F7296224B5C87A2ABFF00FFFF00FF7A8A957EBED3 + 8AA4AE7EDCFF5FCFFF55CBFF4CC4FA41BCF537B3F02EAAEB24A0E5138CD42367 + 805E696DFF00FFFF00FF7D8E9879D2EC8BA4AD89C2CE71D8FF65D3FF5CCEFF51 + C9FE49C1FA3FB9F534B0EE29A8E91085CD224B5B98B2BAFF00FF80919C81D7EF + 7DC5E08CA6B080DDFE68D3FF67D4FF62D1FF58CDFF4EC7FC46BEF73BB6F231AC + EC2569817A95A1FF00FF83959F89DCF18CE2FF8DA8B18CBAC774D8FF67D4FF67 + D4FF67D4FF5FD0FF54CDFF4BC5FC41BBF72EA2DB51677498B2BA869AA392E1F2 + 98E8FD80C4DE8EA7B081DEFD84E0FF84E0FF84E0FF84E0FF81DFFF7BDDFF74D8 + FF6BD6FF56A9D18F9BA4889CA59AE6F39FEBFB98E8FE8BACB98BACB98AAAB788 + A6B386A3AF839FAA819AA67F95A17C919D7A8E99798B957788938BA0A8A0EAF6 + A6EEF99FEBFB98E8FE7ADAFF67D4FF67D4FF67D4FF67D4FF67D4FF67D4FF7788 + 93FF00FFFF00FFFF00FF8EA2ABA7EEF6ABF0F7A6EEF99FEBFB98E8FD71D4FB89 + 9EA78699A382949F7E909A7A8C97778893FF00FFFF00FFFF00FF8FA4ACA0D2DA + ABF0F7ABF0F7A6EEF99FEBFB8DA1AAB5CBD0FF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFBDCED48FA4AC8FA4AC8FA4AC8FA4AC8FA4ACB5CBD0FF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF} + ParentFont = False + ParentShowHint = False + ShowHint = True + OnClick = btnRendererClick + ExplicitLeft = 437 + end + object btnHelp: TSpeedButton + Left = 474 + Top = 103 + Width = 24 + Height = 24 + Hint = 'Browse...' + Anchors = [akTop, akRight] + Flat = True + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + Font.Style = [fsBold] + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF75848F66808F + 607987576E7B4E626F4456613948522E3A43252E351B222914191E0E12160E13 + 18FF00FFFF00FFFF00FF77879289A1AB6AB2D4008FCD008FCD008FCD048CC708 + 88BE0F82B4157CA91B779F1F7296224B5C87A2ABFF00FFFF00FF7A8A957EBED3 + 8AA4AE7EDCFF5FCFFF55CBFF4CC4FA41BCF537B3F02EAAEB24A0E5138CD42367 + 805E696DFF00FFFF00FF7D8E9879D2EC8BA4AD89C2CE71D8FF65D3FF5CCEFF51 + C9FE49C1FA3FB9F534B0EE29A8E91085CD224B5B98B2BAFF00FF80919C81D7EF + 7DC5E08CA6B080DDFE68D3FF67D4FF62D1FF58CDFF4EC7FC46BEF73BB6F231AC + EC2569817A95A1FF00FF83959F89DCF18CE2FF8DA8B18CBAC774D8FF67D4FF67 + D4FF67D4FF5FD0FF54CDFF4BC5FC41BBF72EA2DB51677498B2BA869AA392E1F2 + 98E8FD80C4DE8EA7B081DEFD84E0FF84E0FF84E0FF84E0FF81DFFF7BDDFF74D8 + FF6BD6FF56A9D18F9BA4889CA59AE6F39FEBFB98E8FE8BACB98BACB98AAAB788 + A6B386A3AF839FAA819AA67F95A17C919D7A8E99798B957788938BA0A8A0EAF6 + A6EEF99FEBFB98E8FE7ADAFF67D4FF67D4FF67D4FF67D4FF67D4FF67D4FF7788 + 93FF00FFFF00FFFF00FF8EA2ABA7EEF6ABF0F7A6EEF99FEBFB98E8FD71D4FB89 + 9EA78699A382949F7E909A7A8C97778893FF00FFFF00FFFF00FF8FA4ACA0D2DA + ABF0F7ABF0F7A6EEF99FEBFB8DA1AAB5CBD0FF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFBDCED48FA4AC8FA4AC8FA4AC8FA4AC8FA4ACB5CBD0FF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF} + ParentFont = False + ParentShowHint = False + ShowHint = True + OnClick = btnHelpClick + ExplicitLeft = 437 + end + object Label49: TLabel + Left = 245 + Top = 301 + Width = 37 + Height = 13 + Caption = 'minutes' + end + object btnFindDefaultSaveFile: TSpeedButton + Left = 437 + Top = 272 + Width = 24 + Height = 24 + Hint = 'Browse...' + Flat = True + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + Font.Style = [fsBold] + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF75848F66808F + 607987576E7B4E626F4456613948522E3A43252E351B222914191E0E12160E13 + 18FF00FFFF00FFFF00FF77879289A1AB6AB2D4008FCD008FCD008FCD048CC708 + 88BE0F82B4157CA91B779F1F7296224B5C87A2ABFF00FFFF00FF7A8A957EBED3 + 8AA4AE7EDCFF5FCFFF55CBFF4CC4FA41BCF537B3F02EAAEB24A0E5138CD42367 + 805E696DFF00FFFF00FF7D8E9879D2EC8BA4AD89C2CE71D8FF65D3FF5CCEFF51 + C9FE49C1FA3FB9F534B0EE29A8E91085CD224B5B98B2BAFF00FF80919C81D7EF + 7DC5E08CA6B080DDFE68D3FF67D4FF62D1FF58CDFF4EC7FC46BEF73BB6F231AC + EC2569817A95A1FF00FF83959F89DCF18CE2FF8DA8B18CBAC774D8FF67D4FF67 + D4FF67D4FF5FD0FF54CDFF4BC5FC41BBF72EA2DB51677498B2BA869AA392E1F2 + 98E8FD80C4DE8EA7B081DEFD84E0FF84E0FF84E0FF84E0FF81DFFF7BDDFF74D8 + FF6BD6FF56A9D18F9BA4889CA59AE6F39FEBFB98E8FE8BACB98BACB98AAAB788 + A6B386A3AF839FAA819AA67F95A17C919D7A8E99798B957788938BA0A8A0EAF6 + A6EEF99FEBFB98E8FE7ADAFF67D4FF67D4FF67D4FF67D4FF67D4FF67D4FF7788 + 93FF00FFFF00FFFF00FF8EA2ABA7EEF6ABF0F7A6EEF99FEBFB98E8FD71D4FB89 + 9EA78699A382949F7E909A7A8C97778893FF00FFFF00FFFF00FF8FA4ACA0D2DA + ABF0F7ABF0F7A6EEF99FEBFB8DA1AAB5CBD0FF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFBDCED48FA4AC8FA4AC8FA4AC8FA4AC8FA4ACB5CBD0FF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF} + ParentFont = False + ParentShowHint = False + ShowHint = True + OnClick = btnFindDefaultSaveFileClick + end + object btnPluginPath: TSpeedButton + Left = 474 + Top = 128 + Width = 24 + Height = 24 + Hint = 'Browse...' + Anchors = [akTop, akRight] + Flat = True + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + Font.Style = [fsBold] + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF75848F66808F + 607987576E7B4E626F4456613948522E3A43252E351B222914191E0E12160E13 + 18FF00FFFF00FFFF00FF77879289A1AB6AB2D4008FCD008FCD008FCD048CC708 + 88BE0F82B4157CA91B779F1F7296224B5C87A2ABFF00FFFF00FF7A8A957EBED3 + 8AA4AE7EDCFF5FCFFF55CBFF4CC4FA41BCF537B3F02EAAEB24A0E5138CD42367 + 805E696DFF00FFFF00FF7D8E9879D2EC8BA4AD89C2CE71D8FF65D3FF5CCEFF51 + C9FE49C1FA3FB9F534B0EE29A8E91085CD224B5B98B2BAFF00FF80919C81D7EF + 7DC5E08CA6B080DDFE68D3FF67D4FF62D1FF58CDFF4EC7FC46BEF73BB6F231AC + EC2569817A95A1FF00FF83959F89DCF18CE2FF8DA8B18CBAC774D8FF67D4FF67 + D4FF67D4FF5FD0FF54CDFF4BC5FC41BBF72EA2DB51677498B2BA869AA392E1F2 + 98E8FD80C4DE8EA7B081DEFD84E0FF84E0FF84E0FF84E0FF81DFFF7BDDFF74D8 + FF6BD6FF56A9D18F9BA4889CA59AE6F39FEBFB98E8FE8BACB98BACB98AAAB788 + A6B386A3AF839FAA819AA67F95A17C919D7A8E99798B957788938BA0A8A0EAF6 + A6EEF99FEBFB98E8FE7ADAFF67D4FF67D4FF67D4FF67D4FF67D4FF67D4FF7788 + 93FF00FFFF00FFFF00FF8EA2ABA7EEF6ABF0F7A6EEF99FEBFB98E8FD71D4FB89 + 9EA78699A382949F7E909A7A8C97778893FF00FFFF00FFFF00FF8FA4ACA0D2DA + ABF0F7ABF0F7A6EEF99FEBFB8DA1AAB5CBD0FF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFBDCED48FA4AC8FA4AC8FA4AC8FA4AC8FA4ACB5CBD0FF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF} + ParentFont = False + ParentShowHint = False + ShowHint = True + OnClick = btnPluginPathClick + ExplicitLeft = 437 + end + object btnSShotPath: TSpeedButton + Left = 474 + Top = 155 + Width = 24 + Height = 24 + Hint = 'Browse...' + Anchors = [akTop, akRight] + Flat = True + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + Font.Style = [fsBold] + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF75848F66808F + 607987576E7B4E626F4456613948522E3A43252E351B222914191E0E12160E13 + 18FF00FFFF00FFFF00FF77879289A1AB6AB2D4008FCD008FCD008FCD048CC708 + 88BE0F82B4157CA91B779F1F7296224B5C87A2ABFF00FFFF00FF7A8A957EBED3 + 8AA4AE7EDCFF5FCFFF55CBFF4CC4FA41BCF537B3F02EAAEB24A0E5138CD42367 + 805E696DFF00FFFF00FF7D8E9879D2EC8BA4AD89C2CE71D8FF65D3FF5CCEFF51 + C9FE49C1FA3FB9F534B0EE29A8E91085CD224B5B98B2BAFF00FF80919C81D7EF + 7DC5E08CA6B080DDFE68D3FF67D4FF62D1FF58CDFF4EC7FC46BEF73BB6F231AC + EC2569817A95A1FF00FF83959F89DCF18CE2FF8DA8B18CBAC774D8FF67D4FF67 + D4FF67D4FF5FD0FF54CDFF4BC5FC41BBF72EA2DB51677498B2BA869AA392E1F2 + 98E8FD80C4DE8EA7B081DEFD84E0FF84E0FF84E0FF84E0FF81DFFF7BDDFF74D8 + FF6BD6FF56A9D18F9BA4889CA59AE6F39FEBFB98E8FE8BACB98BACB98AAAB788 + A6B386A3AF839FAA819AA67F95A17C919D7A8E99798B957788938BA0A8A0EAF6 + A6EEF99FEBFB98E8FE7ADAFF67D4FF67D4FF67D4FF67D4FF67D4FF67D4FF7788 + 93FF00FFFF00FFFF00FF8EA2ABA7EEF6ABF0F7A6EEF99FEBFB98E8FD71D4FB89 + 9EA78699A382949F7E909A7A8C97778893FF00FFFF00FFFF00FF8FA4ACA0D2DA + ABF0F7ABF0F7A6EEF99FEBFB8DA1AAB5CBD0FF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFBDCED48FA4AC8FA4AC8FA4AC8FA4AC8FA4ACB5CBD0FF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF} + ParentFont = False + ParentShowHint = False + ShowHint = True + OnClick = btnSShotPathClick + ExplicitLeft = 437 + end + object btnDefScript: TSpeedButton + Left = 474 + Top = 181 + Width = 24 + Height = 24 + Hint = 'Browse...' + Anchors = [akTop, akRight] + Flat = True + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + Font.Style = [fsBold] + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF75848F66808F + 607987576E7B4E626F4456613948522E3A43252E351B222914191E0E12160E13 + 18FF00FFFF00FFFF00FF77879289A1AB6AB2D4008FCD008FCD008FCD048CC708 + 88BE0F82B4157CA91B779F1F7296224B5C87A2ABFF00FFFF00FF7A8A957EBED3 + 8AA4AE7EDCFF5FCFFF55CBFF4CC4FA41BCF537B3F02EAAEB24A0E5138CD42367 + 805E696DFF00FFFF00FF7D8E9879D2EC8BA4AD89C2CE71D8FF65D3FF5CCEFF51 + C9FE49C1FA3FB9F534B0EE29A8E91085CD224B5B98B2BAFF00FF80919C81D7EF + 7DC5E08CA6B080DDFE68D3FF67D4FF62D1FF58CDFF4EC7FC46BEF73BB6F231AC + EC2569817A95A1FF00FF83959F89DCF18CE2FF8DA8B18CBAC774D8FF67D4FF67 + D4FF67D4FF5FD0FF54CDFF4BC5FC41BBF72EA2DB51677498B2BA869AA392E1F2 + 98E8FD80C4DE8EA7B081DEFD84E0FF84E0FF84E0FF84E0FF81DFFF7BDDFF74D8 + FF6BD6FF56A9D18F9BA4889CA59AE6F39FEBFB98E8FE8BACB98BACB98AAAB788 + A6B386A3AF839FAA819AA67F95A17C919D7A8E99798B957788938BA0A8A0EAF6 + A6EEF99FEBFB98E8FE7ADAFF67D4FF67D4FF67D4FF67D4FF67D4FF67D4FF7788 + 93FF00FFFF00FFFF00FF8EA2ABA7EEF6ABF0F7A6EEF99FEBFB98E8FD71D4FB89 + 9EA78699A382949F7E909A7A8C97778893FF00FFFF00FFFF00FF8FA4ACA0D2DA + ABF0F7ABF0F7A6EEF99FEBFB8DA1AAB5CBD0FF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFBDCED48FA4AC8FA4AC8FA4AC8FA4AC8FA4ACB5CBD0FF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF} + ParentFont = False + ParentShowHint = False + ShowHint = True + OnClick = btnDefScriptClick + ExplicitLeft = 437 + end + object chkRememberLastOpen: TCheckBox + Left = 8 + Top = 215 + Width = 433 + Height = 17 + Caption = 'Remember last opened parameters' + TabOrder = 0 + OnClick = chkRememberLastOpenClick + end + object Panel39: TPanel + Left = 8 + Top = 8 + Width = 139 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Default parameters' + ParentShowHint = False + ShowHint = True + TabOrder = 1 + OnDblClick = DefaultPathsDblCick + end + object txtDefParameterFile: TEdit + Left = 146 + Top = 8 + Width = 329 + Height = 21 + HelpContext = 1000 + Anchors = [akLeft, akTop, akRight] + ParentShowHint = False + ShowHint = False + TabOrder = 2 + OnDblClick = DefaultPathsDblCick + end + object Panel40: TPanel + Tag = 1 + Left = 8 + Top = 32 + Width = 139 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Smooth palette file' + ParentShowHint = False + ShowHint = True + TabOrder = 4 + OnDblClick = DefaultPathsDblCick + end + object txtDefSmoothFile: TEdit + Left = 146 + Top = 32 + Width = 329 + Height = 21 + HelpContext = 1001 + Anchors = [akLeft, akTop, akRight] + TabOrder = 3 + OnDblClick = DefaultPathsDblCick + end + object Panel41: TPanel + Tag = 2 + Left = 8 + Top = 56 + Width = 139 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Function library' + ParentShowHint = False + ShowHint = True + TabOrder = 8 + OnDblClick = DefaultPathsDblCick + end + object Panel42: TPanel + Tag = 3 + Left = 8 + Top = 80 + Width = 139 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'flam3' + ParentShowHint = False + ShowHint = True + TabOrder = 9 + OnDblClick = DefaultPathsDblCick + end + object Panel43: TPanel + Tag = 4 + Left = 8 + Top = 104 + Width = 139 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Help file' + ParentShowHint = False + ShowHint = True + TabOrder = 10 + OnDblClick = DefaultPathsDblCick + end + object txtLibrary: TEdit + Left = 146 + Top = 56 + Width = 329 + Height = 21 + HelpContext = 1000 + Anchors = [akLeft, akTop, akRight] + ParentShowHint = False + ShowHint = False + TabOrder = 5 + OnDblClick = DefaultPathsDblCick + end + object txtRenderer: TEdit + Left = 146 + Top = 80 + Width = 329 + Height = 21 + HelpContext = 1000 + Anchors = [akLeft, akTop, akRight] + ParentShowHint = False + ShowHint = False + TabOrder = 6 + OnDblClick = DefaultPathsDblCick + end + object txtHelp: TEdit + Left = 146 + Top = 104 + Width = 329 + Height = 21 + HelpContext = 1000 + Anchors = [akLeft, akTop, akRight] + ParentShowHint = False + ShowHint = False + TabOrder = 7 + OnDblClick = DefaultPathsDblCick + end + object cbEnableAutosave: TCheckBox + Left = 8 + Top = 249 + Width = 425 + Height = 17 + Caption = 'Enable autosave' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 13 + OnClick = cbEnableAutosaveClick + end + object Panel44: TPanel + Tag = 8 + Left = 24 + Top = 273 + Width = 113 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'File name' + ParentShowHint = False + ShowHint = True + TabOrder = 14 + OnDblClick = DefaultPathsDblCick + end + object txtDefaultSaveFile: TEdit + Left = 136 + Top = 273 + Width = 302 + Height = 21 + HelpContext = 1000 + ParentShowHint = False + ShowHint = False + TabOrder = 12 + end + object Panel45: TPanel + Left = 24 + Top = 297 + Width = 113 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Save frequency' + ParentShowHint = False + ShowHint = True + TabOrder = 15 + end + object cbFreq: TComboBox + Left = 136 + Top = 297 + Width = 105 + Height = 21 + Style = csDropDownList + ItemIndex = 2 + TabOrder = 11 + Text = '5' + Items.Strings = ( + '1' + '2' + '5' + '10') + end + object GroupBox3: TGroupBox + Left = 8 + Top = 329 + Width = 457 + Height = 73 + Caption = 'Chaotica 0.45+' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 16 + DesignSize = ( + 457 + 73) + object btnChaotica: TSpeedButton + Left = 425 + Top = 18 + Width = 24 + Height = 24 + Hint = 'Browse...' + Anchors = [akTop, akRight] + Flat = True + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Arial' + Font.Style = [fsBold] + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF75848F66808F + 607987576E7B4E626F4456613948522E3A43252E351B222914191E0E12160E13 + 18FF00FFFF00FFFF00FF77879289A1AB6AB2D4008FCD008FCD008FCD048CC708 + 88BE0F82B4157CA91B779F1F7296224B5C87A2ABFF00FFFF00FF7A8A957EBED3 + 8AA4AE7EDCFF5FCFFF55CBFF4CC4FA41BCF537B3F02EAAEB24A0E5138CD42367 + 805E696DFF00FFFF00FF7D8E9879D2EC8BA4AD89C2CE71D8FF65D3FF5CCEFF51 + C9FE49C1FA3FB9F534B0EE29A8E91085CD224B5B98B2BAFF00FF80919C81D7EF + 7DC5E08CA6B080DDFE68D3FF67D4FF62D1FF58CDFF4EC7FC46BEF73BB6F231AC + EC2569817A95A1FF00FF83959F89DCF18CE2FF8DA8B18CBAC774D8FF67D4FF67 + D4FF67D4FF5FD0FF54CDFF4BC5FC41BBF72EA2DB51677498B2BA869AA392E1F2 + 98E8FD80C4DE8EA7B081DEFD84E0FF84E0FF84E0FF84E0FF81DFFF7BDDFF74D8 + FF6BD6FF56A9D18F9BA4889CA59AE6F39FEBFB98E8FE8BACB98BACB98AAAB788 + A6B386A3AF839FAA819AA67F95A17C919D7A8E99798B957788938BA0A8A0EAF6 + A6EEF99FEBFB98E8FE7ADAFF67D4FF67D4FF67D4FF67D4FF67D4FF67D4FF7788 + 93FF00FFFF00FFFF00FF8EA2ABA7EEF6ABF0F7A6EEF99FEBFB98E8FD71D4FB89 + 9EA78699A382949F7E909A7A8C97778893FF00FFFF00FFFF00FF8FA4ACA0D2DA + ABF0F7ABF0F7A6EEF99FEBFB8DA1AAB5CBD0FF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFBDCED48FA4AC8FA4AC8FA4AC8FA4AC8FA4ACB5CBD0FF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF} + ParentFont = False + ParentShowHint = False + ShowHint = True + OnClick = btnChaoticaClick + end + object Panel47: TPanel + Left = 8 + Top = 20 + Width = 129 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Location' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 1 + end + object cbC64: TCheckBox + Left = 8 + Top = 48 + Width = 441 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = 'Use x64-version if possible' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 2 + end + object txtChaotica: TEdit + Left = 136 + Top = 20 + Width = 289 + Height = 21 + HelpContext = 1000 + Anchors = [akLeft, akTop, akRight] + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = False + TabOrder = 0 + end + object Panel49: TPanel + Left = 8 + Top = 100 + Width = 129 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'File name (x64)' + ParentShowHint = False + ShowHint = True + TabOrder = 3 + Visible = False + end + end + object Panel50: TPanel + Tag = 5 + Left = 8 + Top = 130 + Width = 139 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Plugin folder' + ParentShowHint = False + ShowHint = True + TabOrder = 17 + OnDblClick = DefaultPathsDblCick + end + object txtPluginFolder: TEdit + Left = 146 + Top = 130 + Width = 329 + Height = 21 + HelpContext = 1000 + Anchors = [akLeft, akTop, akRight] + ParentShowHint = False + ShowHint = False + TabOrder = 18 + OnDblClick = DefaultPathsDblCick + end + object pnlScreenShot: TPanel + Tag = 6 + Left = 8 + Top = 156 + Width = 139 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Screenshot folder' + ParentShowHint = False + ShowHint = True + TabOrder = 19 + OnDblClick = DefaultPathsDblCick + end + object txtSShotFolder: TEdit + Left = 146 + Top = 156 + Width = 329 + Height = 21 + HelpContext = 1000 + Anchors = [akLeft, akTop, akRight] + ParentShowHint = False + ShowHint = False + TabOrder = 20 + end + object pnlScriptFile: TPanel + Tag = 7 + Left = 8 + Top = 182 + Width = 139 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Default script file' + ParentShowHint = False + ShowHint = True + TabOrder = 21 + OnDblClick = DefaultPathsDblCick + end + object txtDefScript: TEdit + Left = 146 + Top = 182 + Width = 329 + Height = 21 + HelpContext = 1000 + Anchors = [akLeft, akTop, akRight] + ParentShowHint = False + ShowHint = False + TabOrder = 22 + end + end + end + object btnOK: TButton + Left = 327 + Top = 469 + Width = 86 + Height = 25 + Anchors = [akRight, akBottom] + Caption = 'OK' + Default = True + TabOrder = 0 + OnClick = btnOKClick + end + object btnCancel: TButton + Left = 422 + Top = 469 + Width = 86 + Height = 25 + Anchors = [akRight, akBottom] + Caption = 'Cancel' + TabOrder = 1 + OnClick = btnCancelClick + end + object OpenDialog: TOpenDialog + Left = 424 + Top = 392 + end +end diff --git a/Forms/Options.pas b/Forms/Options.pas new file mode 100644 index 0000000..b997b46 --- /dev/null +++ b/Forms/Options.pas @@ -0,0 +1,1796 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} +//{$D-,L-,O+,Q-,R-,Y-,S-} +unit Options; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, ComCtrls, ExtCtrls, Buttons, Registry, Mask, CheckLst, + MMSystem, Translation, RegexHelper, FileCtrl, StrUtils, ShellAPI, ShlObj, + Vcl.Samples.Spin; + +type + TOptionsForm = class(TForm) + btnOK: TButton; + btnCancel: TButton; + OpenDialog: TOpenDialog; + GroupBox15: TGroupBox; + btnBrowseSound: TSpeedButton; + btnPlay: TSpeedButton; + Label44: TLabel; + txtSoundFile: TEdit; + chkPlaysound: TCheckBox; + Tabs: TPageControl; + GeneralPage: TTabSheet; + SpeedButton1: TSpeedButton; + pnlJPEGQuality: TPanel; + chkConfirmDel: TCheckBox; + chkOldPaletteFormat: TCheckBox; + chkConfirmExit: TCheckBox; + chkConfirmStopRender: TCheckBox; + cbUseTemplate: TCheckBox; + cbMissingPlugin: TCheckBox; + cbEmbedThumbs: TCheckBox; + pnlMultithreading: TPanel; + cbNrTheads: TComboBox; + pnlPNGTransparency: TPanel; + grpGuidelines: TGroupBox; + cbGL: TCheckBox; + pnlCenterLine: TPanel; + shCenterLine: TShape; + pnlThirdsLine: TPanel; + shThirdsLine: TShape; + pnlGRLine: TPanel; + shGRLine: TShape; + pnlCenter: TPanel; + pnlThirds: TPanel; + pnlGoldenRatio: TPanel; + Panel46: TPanel; + txtLanguageFile: TComboBox; + cbPNGTransparency: TComboBox; + txtJPEGquality: TComboBox; + EditorPage: TTabSheet; + GroupBox1: TGroupBox; + chkUseXFormColor: TCheckBox; + chkHelpers: TCheckBox; + GroupBox21: TGroupBox; + chkAxisLock: TCheckBox; + chkExtendedEdit: TCheckBox; + chkXaosRebuild: TCheckBox; + grpEditorColors: TGroupBox; + pnlBackground: TPanel; + pnlReferenceC: TPanel; + pnlHelpers: TPanel; + pnlGrid: TPanel; + pnlBackColor: TPanel; + shBackground: TShape; + pnlReference: TPanel; + shRef: TShape; + pnlHelpersColor: TPanel; + shHelpers: TShape; + pnlGridColor1: TPanel; + shGC1: TShape; + pnlGridColor2: TPanel; + shGC2: TShape; + chkEnableEditorPreview: TCheckBox; + Panel48: TPanel; + tbEPTransparency: TTrackBar; + DisplayPage: TTabSheet; + GroupBox2: TGroupBox; + pnlLowQ: TPanel; + pnlMediumQ: TPanel; + pnlHighQ: TPanel; + txtHighQuality: TEdit; + txtMediumQuality: TEdit; + txtLowQuality: TEdit; + grpRendering: TGroupBox; + pnlDensity: TPanel; + pnlGamma: TPanel; + pnlBright: TPanel; + pnlVibrancy: TPanel; + pnlRelGamma: TPanel; + pnlOSample: TPanel; + pnlFilter: TPanel; + txtGammaThreshold: TEdit; + txtFilterRadius: TEdit; + txtOversample: TEdit; + txtVibrancy: TEdit; + txtBrightness: TEdit; + txtGamma: TEdit; + txtSampleDensity: TEdit; + GroupBox20: TGroupBox; + Label48: TLabel; + chkShowTransparency: TCheckBox; + chkExtendMainPreview: TCheckBox; + pnlExtension: TPanel; + cbExtendPercent: TComboBox; + chkUseSmallThumbs: TCheckBox; + RandomPage: TTabSheet; + gpNumberOfTransforms: TGroupBox; + udMinXforms: TUpDown; + udMaxXForms: TUpDown; + Panel15: TPanel; + Panel16: TPanel; + txtMaxXforms: TEdit; + txtMinXForms: TEdit; + gpFlameTitlePrefix: TGroupBox; + udBatchSize: TUpDown; + chkKeepBackground: TCheckBox; + Panel11: TPanel; + Panel12: TPanel; + txtBatchSize: TEdit; + txtRandomPrefix: TEdit; + gpMutationTransforms: TGroupBox; + udMinMutate: TUpDown; + udMaxMutate: TUpDown; + Panel13: TPanel; + Panel14: TPanel; + txtMaxMutate: TEdit; + txtMinMutate: TEdit; + gpForcedSymmetry: TGroupBox; + udSymOrder: TUpDown; + udSymNVars: TUpDown; + Panel17: TPanel; + Panel18: TPanel; + Panel19: TPanel; + txtSymNVars: TEdit; + txtSymOrder: TEdit; + cmbSymType: TComboBox; + grpGradient: TRadioGroup; + GroupBox16: TGroupBox; + btnGradientsFile: TSpeedButton; + txtGradientsFile: TEdit; + VariationsPage: TTabSheet; + btnSetAll: TButton; + btnClearAll: TButton; + clbVarEnabled: TCheckListBox; + GradientPage: TTabSheet; + GroupBox13: TGroupBox; + Panel28: TPanel; + Panel29: TPanel; + txtTryLength: TEdit; + txtNumtries: TEdit; + GroupBox17: TGroupBox; + udMinHue: TUpDown; + Panel20: TPanel; + Panel21: TPanel; + udMaxHue: TUpDown; + txtMaxHue: TEdit; + txtMinHue: TEdit; + GroupBox18: TGroupBox; + Panel22: TPanel; + Panel23: TPanel; + udMinSat: TUpDown; + txtMinSat: TEdit; + udmaxSat: TUpDown; + txtMaxSat: TEdit; + GroupBox22: TGroupBox; + Panel24: TPanel; + Panel25: TPanel; + udMinLum: TUpDown; + txtMinLum: TEdit; + udMaxLum: TUpDown; + txtMaxLum: TEdit; + GroupBox23: TGroupBox; + Panel26: TPanel; + Panel27: TPanel; + udMinNodes: TUpDown; + txtMinNodes: TEdit; + udMaxNodes: TUpDown; + txtMaxNodes: TEdit; + UPRPage: TTabSheet; + chkAdjustDensity: TCheckBox; + GroupBox11: TGroupBox; + Panel37: TPanel; + Panel38: TPanel; + txtUPRHeight: TEdit; + txtUPRWidth: TEdit; + GroupBox9: TGroupBox; + Panel34: TPanel; + Panel35: TPanel; + Panel36: TPanel; + txtUPROversample: TEdit; + txtUPRFilterRadius: TEdit; + txtFIterDensity: TEdit; + GroupBox4: TGroupBox; + Panel30: TPanel; + Panel31: TPanel; + txtFCFile: TEdit; + txtFCIdent: TEdit; + GroupBox5: TGroupBox; + Panel32: TPanel; + Panel33: TPanel; + txtFFFile: TEdit; + txtFFIdent: TEdit; + PathsPage: TTabSheet; + btnDefGradient: TSpeedButton; + btnSmooth: TSpeedButton; + SpeedButton2: TSpeedButton; + btnRenderer: TSpeedButton; + btnHelp: TSpeedButton; + Label49: TLabel; + btnFindDefaultSaveFile: TSpeedButton; + chkRememberLastOpen: TCheckBox; + Panel39: TPanel; + txtDefParameterFile: TEdit; + Panel40: TPanel; + txtDefSmoothFile: TEdit; + Panel41: TPanel; + Panel42: TPanel; + Panel43: TPanel; + txtLibrary: TEdit; + txtRenderer: TEdit; + txtHelp: TEdit; + cbEnableAutosave: TCheckBox; + Panel44: TPanel; + txtDefaultSaveFile: TEdit; + Panel45: TPanel; + cbFreq: TComboBox; + GroupBox3: TGroupBox; + btnChaotica: TSpeedButton; + Panel47: TPanel; + cbC64: TCheckBox; + txtChaotica: TEdit; + Panel49: TPanel; + btnPluginPath: TSpeedButton; + Panel50: TPanel; + txtPluginFolder: TEdit; + pnlReflection: TPanel; + pnlReflectionC: TPanel; + shReflection: TShape; + GroupBox7: TGroupBox; + pnSTile: TPanel; + pnRTile: TPanel; + pnHexTile: TPanel; + txtHexTile: TEdit; + txtRTile: TEdit; + txtSTile: TEdit; + pnlFuse: TPanel; + txtFuse: TSpinEdit; + chkEngLayout: TCheckBox; + chkConfirmClearScript: TCheckBox; + pnlScreenShot: TPanel; + btnSShotPath: TSpeedButton; + txtSShotFolder: TEdit; + rgRotationMode: TRadioGroup; + rgZoomingMode: TRadioGroup; + chkShowRenderStats: TCheckBox; + btnDefScript: TSpeedButton; + pnlScriptFile: TPanel; + txtDefScript: TEdit; + chkAutoSaveXML: TCheckBox; + rgColorBlend: TRadioGroup; + chkEqualStripes: TCheckBox; + pnlContrast: TPanel; + txtContrast: TEdit; + chkRandomTemplates: TCheckBox; + chkResetCoefs: TCheckBox; + chkApplyFlatten: TCheckBox; + pnlRandBackground: TPanel; + pnlRandBackColor: TPanel; + shRandBackColor: TShape; + chkResetLinear: TCheckBox; + btnInvert: TButton; + chkShowAllXforms: TCheckBox; + VarsPages: TPageControl; + tabRandomVars: TTabSheet; + tabFavouriteVars: TTabSheet; + clbVarFavourite: TCheckListBox; + rgEnumMode: TRadioGroup; + chkShowRenderImage: TCheckBox; + procedure chkEnableEditorPreviewClick(Sender: TObject); + procedure btnChaoticaClick(Sender: TObject); + procedure SpeedButton1Click(Sender: TObject); + procedure btnCancelClick(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure btnOKClick(Sender: TObject); + procedure btnDefGradientClick(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure btnSmoothClick(Sender: TObject); + procedure cmbSymTypeChange(Sender: TObject); + procedure btnSetAllClick(Sender: TObject); + procedure btnClearAllClick(Sender: TObject); + procedure txtMinNodesChange(Sender: TObject); + procedure txtMaxNodesChange(Sender: TObject); + procedure txtMaxHueChange(Sender: TObject); + procedure txtMaxSatChange(Sender: TObject); + procedure txtMaxLumChange(Sender: TObject); + procedure txtMinHueChange(Sender: TObject); + procedure txtMinSatChange(Sender: TObject); + procedure txtMinLumChange(Sender: TObject); + procedure txtMinXFormsChange(Sender: TObject); + procedure txtMaxXformsChange(Sender: TObject); + procedure txtMinMutateChange(Sender: TObject); + procedure txtMaxMutateChange(Sender: TObject); + procedure btnRendererClick(Sender: TObject); + procedure SpeedButton2Click(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure pnlBackColorClick(Sender: TObject); + procedure pnlReferenceClick(Sender: TObject); + procedure pnlGridColor1Click(Sender: TObject); + procedure pnlGridColor2Click(Sender: TObject); + procedure pnlHelpersColorClick(Sender: TObject); + procedure btnBrowseSoundClick(Sender: TObject); + procedure pnlCenterLineClick(Sender: TObject); + procedure pnlThirdsLineClick(Sender: TObject); + procedure pnlGRLineClick(Sender: TObject); + procedure btnPlayClick(Sender: TObject); + procedure btnGradientsFileClick(Sender: TObject); + procedure shCenterLineMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); + procedure shThirdsLineMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); + procedure shGRLineMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); + procedure UpdateShapeColors; + procedure shBackgroundMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure shGC1MouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure shGC2MouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure shRefMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure shHelpersMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure chkRememberLastOpenClick(Sender: TObject); + procedure btnFindDefaultSaveFileClick(Sender: TObject); + procedure cbEnableAutosaveClick(Sender: TObject); + procedure btnHelpClick(Sender: TObject); + procedure cbGLClick(Sender: TObject); + procedure btnPluginPathClick(Sender: TObject); + procedure shReflectionMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure pnlReflectionCClick(Sender: TObject); + procedure RenderPanelsDblClick(Sender: TObject); + procedure GradientPanelsDblClick(Sender: TObject); + procedure NumFieldKeyPress(Sender: TObject; var Key: Char); + procedure NumFloatKeyPress(Sender: TObject; var Key: Char); + procedure TilePanelDblClick(Sender: TObject); + procedure btnSShotPathClick(Sender: TObject); + procedure btnDefScriptClick(Sender: TObject); + procedure DefaultPathsDblCick(Sender: TObject); + procedure pnlRandBackColorClick(Sender: TObject); + procedure shRandBackColorMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure chkKeepBackgroundClick(Sender: TObject); + procedure btnInvertClick(Sender: TObject); + + private + { Private declarations } + public + { Public declarations } + end; + +var + OptionsForm: TOptionsForm; + +implementation + +{$R *.DFM} + +uses + Main, Global, Editor, ControlPoint, XFormMan, Adjust, FormRender; + +procedure TOptionsForm.btnCancelClick(Sender: TObject); +begin + Close; +end; + +procedure TOptionsForm.UpdateShapeColors; +begin + shBackground.Brush.Color := pnlBackColor.Color; + shGC1.Brush.Color := pnlGridColor1.Color; + shGC2.Brush.Color := pnlGridColor2.Color; + shRef.Brush.Color := pnlReference.Color; + shReflection.Brush.Color := pnlReflectionC.Color; // AV + shHelpers.Brush.Color := pnlHelpersColor.Color; + shCenterLine.Brush.Color := pnlCenterLine.Color; + shThirdsLine.Brush.Color := pnlThirdsLine.Color; + shGRLine.Brush.Color := pnlGRLine.Color; + shRandBackColor.Brush.Color := pnlRandBackColor.Color; // AV +end; + +procedure TOptionsForm.FormShow(Sender: TObject); +var + Registry: TRegistry; + i, j: integer; + s1, s2: string; +begin + { Read position from registry } + Registry := TRegistry.Create; + try + Registry.RootKey := HKEY_CURRENT_USER; + if Registry.OpenKey('Software\' + APP_NAME + '\Forms\Options', False) then + begin + if Registry.ValueExists('Left') then + OptionsForm.Left := Registry.ReadInteger('Left'); + if Registry.ValueExists('Top') then + OptionsForm.Top := Registry.ReadInteger('Top'); + end; + Registry.CloseKey; + finally + Registry.Free; + end; + + { General tab } + txtDefParameterFile.Text := DefFlameFile; + txtDefSmoothFile.Text := defSmoothPaletteFile; + txtNumtries.text := IntToStr(Numtries); + txtTryLength.text := IntToStr(Trylength); + udBatchSize.Position := BatchSize; +// chkResize.checked := ResizeOnLoad; + + if NrTreads <= 1 then + cbNrTheads.ItemIndex := 0 // AV: MT off + else if (NrTreads <= UseNrThreads) then + cbNrTheads.ItemIndex := NrTreads - 1 // AV: MT on + else + cbNrTheads.ItemIndex := UseNrThreads - 1; // AV: incorrect MT value + (* begin // AV: what if we'd have 100 threads? :) + //cbNrTheads.text := intTostr(NrTreads); + // Hack + cbNrTheads.ItemIndex := 0; + case NrTreads of + 2: cbNrTheads.ItemIndex := 1; + 3: cbNrTheads.ItemIndex := 2; + 4: cbNrTheads.ItemIndex := 3; + 5: cbNrTheads.ItemIndex := 4; + 6: cbNrTheads.ItemIndex := 5; + 7: cbNrTheads.ItemIndex := 6; + 8: cbNrTheads.ItemIndex := 7; + 9: cbNrTheads.ItemIndex := 8; + 10: cbNrTheads.ItemIndex := 9; + 11: cbNrTheads.ItemIndex := 10; + 12: cbNrTheads.ItemIndex := 11; + end; + end; *) + + chkConfirmDel.Checked := ConfirmDelete; + chkOldPaletteFormat.Checked := OldPaletteFormat; + chkConfirmExit.Checked := ConfirmExit; + chkConfirmStopRender.Checked := ConfirmStopRender; + chkConfirmClearScript.Checked := ConfirmClearScript; // AV + chkRememberLastOpen.Checked := RememberLastOpenFile; + chkUseSmallThumbs.Checked := UseSmallThumbnails; + cbUseTemplate.Checked := AlwaysCreateBlankFlame; + cbMissingPlugin.Checked := WarnOnMissingPlugin; + cbEmbedThumbs.Checked := EmbedThumbnails; + chkEngLayout.Checked := SetEngLayout; // AV + chkAutoSaveXML.Checked := AutoSaveXML; // AV + chkEqualStripes.Checked := EqualStripes; + chkRandomTemplates.Checked := RandomizeTemplates; + chkApplyFlatten.Checked := ApplyFlatten; + //cbSinglePrecision.Checked := SingleBuffer; + + rgRotationMode.ItemIndex := MainForm_RotationMode; + if PreserveQuality then + rgZoomingMode.ItemIndex := 0 + else + rgZoomingMode.ItemIndex := 1; + rgEnumMode.ItemIndex := FlameEnumMode; // AV + + txtJPEGQuality.text := IntToStr(JPEGQuality); + + chkPlaySound.Checked := PlaySoundOnRenderComplete; + txtSoundFile.Text := RenderCompleteSoundFile; + + //cbInternalBitsPerSample.ItemIndex := InternalBitsPerSample; + + { Editor } + chkUseXFormColor.checked := UseTransformColors; + chkHelpers.Checked := HelpersEnabled; + chkExtendedEdit.Checked := ExtEditEnabled; + chkAxisLock.Checked := TransformAxisLock; + chkXaosRebuild.Checked := RebuildXaosLinks; + chkShowAllXforms.Checked := ShowAllXforms; + chkEnableEditorPreview.Checked := EnableEditorPreview; + tbEPTransparency.Position := EditorPreviewTransparency; + chkEnableEditorPreviewClick(self); + chkResetCoefs.Checked := AllowResetCoefs; + chkResetLinear.Checked := AllowResetLinear; + + { Display tab } + txtSampleDensity.Text := FloatToStr(defSampleDensity); + txtGamma.Text := FloatToStr(defGamma); + txtBrightness.Text := FloatToStr(defBrightness); + txtContrast.Text := FloatToStr(defContrast); // AV + txtVibrancy.Text := FloatToStr(defVibrancy); + txtOversample.Text := IntToStr(defOversample); + txtFilterRadius.Text := FloatToStr(defFilterRadius); + txtGammaThreshold.Text := FloatToStr(defGammaThreshold); + txtFuse.Value := Fuse; // AV + + txtLowQuality.Text := FloatToStr(prevLowQuality); + txtMediumQuality.Text := FloatToStr(prevMediumQuality); + txtHighQuality.Text := FloatToStr(prevHighQuality); + + txtHexTile.Text := FloatToStr(HexTR); // AV + txtSTile.Text := FloatToStr(Round6(SquareTR)); // AV + txtRTile.Text := FloatToStr(RhombTR); // AV + + pnlBackColor.Color := TColor(EditorBkgColor); + pnlGridColor1.Color := GridColor1; + pnlGridColor2.Color := GridColor2; + pnlReference.color := TColor(ReferenceTriangleColor); + pnlReflectionC.Color := TColor(FlipColor); // AV + pnlHelpersColor.Color := TColor(HelpersColor); // AV + + cbPNGTransparency.ItemIndex := PNGTransparency; + chkShowTransparency.Checked := ShowTransparency; + cbExtendPercent.Text := FloatToStr((MainPreviewScale - 1) / 0.02); + chkExtendMainPreview.Checked := ExtendMainPreview; + + chkShowRenderStats.Checked := ShowRenderStats; + chkShowRenderImage.Checked := ShowRenderImage; // AV + + { Random tab } + udMinXforms.Position := randMinTransforms; + udMaxXforms.Position := randMaxTransforms; + udMinMutate.Position := mutantMinTransforms; + udMaxMutate.Position := mutantMaxTransforms; + txtRandomPrefix.text := RandomPrefix; + chkKeepbackground.Checked := KeepBackground; + cmbSymType.ItemIndex := SymmetryType; + if (SymmetryType = 0) or (SymmetryType = 1) then + begin + txtSymOrder.enabled := false; + txtSymNVars.enabled := false; + end; + udSymOrder.Position := SymmetryOrder; + udSymNVars.Position := SymmetryNVars; + + pnlRandBackColor.Color := TColor(RandBackColor); // AV + chkKeepBackgroundClick(nil); // AV + + { Variations tab } + for i := 0 to NRVAR -1 do + begin + clbVarEnabled.Checked[i] := Variations[i]; + clbVarFavourite.Checked[i] := FavouriteVariations[i]; // AV + end; + + { Gradient tab } + grpGradient.ItemIndex := randGradient; + txtGradientsFile.Text := randGradientFile; + udMinNodes.Position := MinNodes; + udMaxNodes.Position := MaxNodes; + udMinHue.Position := MinHue; + udMinSat.Position := MinSat; + udMinLum.Position := MinLum; + udMaxHue.Position := MaxHue; + udMaxSat.Position := MaxSat; + udMaxLum.Position := MaxLum; + rgColorBlend.ItemIndex := randColorBlend; + + { UPR tab } + txtFIterDensity.text := IntToStr(UPRSampleDensity); + txtUPRFilterRadius.text := FloatToStr(UPRFilterRadius); + txtUPROversample.text := IntToStr(UPROversample); + txtFCIdent.text := UPRColoringIdent; + txtFCFile.text := UPRColoringFile; + txtFFIdent.text := UPRFormulaIdent; + txtFFFile.text := UPRFormulaFile; + txtUPRWidth.text := IntToStr(UPRWidth); + txtUPRHeight.text := IntToStr(UPRHeight); + chkAdjustDensity.checked := UPRAdjustDensity; + + txtRenderer.Text := flam3Path; + + txtHelp.Text := HelpPath; + txtLibrary.text := defLibrary; + txtDefScript.Text := defScriptFile; // AV + + cbEnableAutosave.Checked := AutoSaveEnabled; + txtDefaultSaveFile.Text := AutoSavePath; + cbFreq.ItemIndex := AutoSaveFreq; + + cbEnableAutosaveClick(nil); + + pnlCenterLine.Color := TColor(LineCenterColor); + pnlThirdsLine.Color := TColor(LineThirdsColor); + pnlGRLine.Color := TColor(LineGRColor); + cbGL.Checked := EnableGuides; + cbGLClick(nil); + txtChaotica.Text := ChaoticaPath; + + {$ifdef Apo7X64} + cbc64.Checked := true; + {$else} + cbC64.Checked := UseX64IfPossible; + {$endif} + + txtPluginFolder.Text := PluginPath; + txtSShotFolder.Text := ScreenShotPath; + + UpdateShapeColors; + + j := -1; + txtLanguageFile.Items.Clear; + for i := 0 to AvailableLanguages.Count-1 do begin + if AvailableLanguages.Strings[i] = '' then begin + txtLanguageFile.Items.Add('Default (English)'); + end else begin + LanguageInfo(AvailableLanguages.Strings[i], s1, s2); + if (s2 <> '') then s1 := s2 + ' (' + s1 + ')'; + txtLanguageFile.Items.Add(s1); + end; + if (lowercase(AvailableLanguages.Strings[i]) = lowercase(languagefile)) then + j := i; + + end; + txtLanguageFile.ItemIndex := j; +end; + +procedure TOptionsForm.GradientPanelsDblClick(Sender: TObject); +begin // AV: restore defaults + case TPanel(Sender).Tag of + 0: txtMinHue.Text := '0'; + 1: txtMaxHue.Text := '600'; + 2: txtMinSat.Text := '0'; + 3: txtMaxSat.Text := '100'; + 4: txtMinLum.Text := '1'; + 5: txtMaxLum.Text := '100'; + 6: txtMinNodes.Text := '2'; + 7: txtMaxNodes.Text := '10'; + 8: txtNumTries.Text := '10'; + 9: txtTryLength.Text := '100000'; + end; +end; + +procedure TOptionsForm.NumFieldKeyPress(Sender: TObject; var Key: Char); +begin + if not CharinSet(Key,['0'..'9', #8, #13]) + then Key:= #0; +end; + +procedure TOptionsForm.NumFloatKeyPress(Sender: TObject; var Key: Char); +begin + if (Key = ',') then Key := FormatSettings.DecimalSeparator; + if not CharinSet(Key,['0'..'9', #8, #13, FormatSettings.DecimalSeparator]) + then Key:= #0; +end; + +procedure TOptionsForm.btnOKClick(Sender: TObject); +var + vars: boolean; + i: integer; + warn: boolean; +begin + + { Variations tab } + { Get option values from controls. Disallow bad values } + vars := false; + for i := 0 to NRVAR-1 do begin + Variations[i] := clbVarEnabled.Checked[i]; + vars := vars or Variations[i]; + FavouriteVariations[i] := clbVarFavourite.Checked[i]; // AV + end; + if vars = false then + Variations[0] := true; + + warn := (LanguageFile <> AvailableLanguages[txtLanguageFile.ItemIndex]) + { or (UseSmallThumbnails <> chkUseSmallThumbs.Checked)}; // AV: fixed + + { General tab } + JPEGQuality := StrToInt(txtJPEGQuality.text); + Numtries := StrToInt(txtNumtries.text); + if NumTries < 1 then Numtries := 1; + Trylength := StrToInt(txtTrylength.text); + if Trylength < 100 then trylength := 100; + if JPEGQuality > 100 then JPEGQuality := 100; + if JPEGQuality < 1 then JPEGQuality := 100; + BatchSize := udBatchSize.Position; + if BatchSize < 1 then BatchSize := 1; + if BatchSize > 300 then BatchSize := 300; + + PNGTransparency := cbPNGTransparency.ItemIndex; + ShowTransparency := chkShowTransparency.Checked; + + // NrTreads := StrToIntDef(cbNrTheads.text, 0); // AV: why? user cannot change this text! + NrTreads := cbNrTheads.ItemIndex + 1; // AV + + ConfirmDelete := chkConfirmDel.Checked; + OldPaletteFormat := chkOldPaletteFormat.Checked; + ConfirmExit := chkConfirmExit.Checked; + ConfirmStopRender := chkConfirmStopRender.Checked; + RememberLastOpenFile := chkRememberLastOpen.Checked; + UseSmallThumbnails := chkUseSmallThumbs.Checked; + AlwaysCreateBlankFlame := cbUseTemplate.Checked; + EmbedThumbnails := cbEmbedThumbs.Checked; + WarnOnMissingPlugin := cbMissingPlugin.Checked; + SetEngLayout := chkEngLayout.Checked; // AV + ConfirmClearScript := chkConfirmClearScript.Checked; // AV + AutoSaveXML := chkAutoSaveXML.Checked; // AV + EqualStripes := chkEqualStripes.Checked; // AV + RandomizeTemplates := chkRandomTemplates.Checked; + ApplyFlatten := chkApplyFlatten.Checked; + LanguageFile := AvailableLanguages.Strings[txtLanguageFile.ItemIndex]; + //SingleBuffer := cbSinglePrecision.Checked; + + MainForm_RotationMode := rgRotationMode.ItemIndex; + PreserveQuality := (rgZoomingMode.ItemIndex = 0); + FlameEnumMode := rgEnumMode.ItemIndex; // AV + + //InternalBitsPerSample := cbInternalBitsPerSample.ItemIndex; + LineCenterColor := pnlCenterLine.Color; + LineThirdsColor := pnlThirdsLine.Color; + LineGRColor := pnlGRLine.Color; + EnableGuides := cbGL.Checked; + + // Editor + UseTransformColors := chkUseXFormColor.checked; + HelpersEnabled := chkHelpers.Checked; + ShowAllXforms := chkShowAllXforms.Checked; + + ExtEditEnabled := chkExtendedEdit.Checked; + TransformAxisLock := chkAxisLock.Checked; + RebuildXaosLinks := chkXaosRebuild.Checked; + EnableEditorPreview := chkEnableEditorPreview.Checked; + EditorPreviewTransparency := tbEPTransparency.Position; + AllowResetCoefs := chkResetCoefs.Checked; + AllowResetLinear := chkResetLinear.Checked; + + { Display tab } + try + defSampleDensity := StrToFloat(txtSampleDensity.Text); + if defSampleDensity > 100 then defSampleDensity := 100; + if defSampleDensity <= 0 then defSampleDensity := 0.1; + except + defSampleDensity := 5; + end; + try + defGamma := StrToFloat(txtGamma.Text); + if defGamma < 0.1 then defGamma := 0.1; + except + defGamma := 4; + end; + try + defBrightness := StrToFloat(txtBrightness.Text); + if defBrightness < 0.1 then defBrightness := 0.1; + except + defBrightness := 4; + end; + try // AV + defContrast := StrToFloat(txtContrast.Text); + if defContrast < 0.1 then defContrast := 0.1; + if defContrast > 10 then defContrast := 10; + except + defContrast := 1; + end; + try + defVibrancy := StrToFloat(txtVibrancy.Text); + if defVibrancy < 0 then defVibrancy := 0.1; + except + defVibrancy := 1; + end; + try + defFilterRadius := StrToFloat(txtFilterRadius.Text); + if defFilterRadius <= 0 then defFilterRadius := 0.1; + except + defFilterRadius := 0.2; + end; + try + defGammaThreshold := StrToFloat(txtGammaThreshold.Text); + if defGammaThreshold < 0 then + except + defGammaThreshold := 0.01; + end; + defOversample := StrToInt(txtOversample.Text); + if defOversample > 4 then defOversample := 4; + if defOversample < 1 then defOversample := 1; + try + prevLowQuality := StrToFloat(txtLowQuality.Text); + if prevLowQuality > 100 then prevLowQuality := 100; + if prevLowQuality < 0.01 then + except + prevLowQuality := 0.1; + end; + try + prevMediumQuality := StrToFloat(txtMediumQuality.Text); + if prevMediumQuality > 1000 then prevMediumQuality := 1000; + if prevMediumQuality < 0.01 then prevMediumQuality := 0.01; + except + prevMediumQuality := 1; + end; + try + prevHighQuality := StrToFloat(txtHighQuality.Text); + if prevHighQuality > 10000 then prevHighQuality := 10000; + if prevHighQuality < 0.01 then prevHighQuality := 0.01; + except + prevHighQuality := 5; + end; + + Fuse := txtFuse.Value; // AV + + try + HexTR := StrToFloat(txtHexTile.Text); // AV + if HexTR < 0.1 then HexTR := 0.1; + except + HexTR := 1; + end; + try + SquareTR := StrToFloat(txtSTile.Text); // AV + if SquareTR < 0.1 then SquareTR := 0.1; + except + SquareTR := 1; + end; + try + RhombTR := StrToFloat(txtRTile.Text); // AV + if RhombTR < 0.1 then RhombTR := 0.1; + except + RhombTR := 1; + end; + + MainPreviewScale := 1 + 0.02 * StrToFloatDef(cbExtendPercent.Text, 0); + if MainPreviewScale < 1 then MainPreviewScale := 1 + else if MainPreviewScale > 5 then MainPreviewScale := 5; + ExtendMainPreview := chkExtendMainPreview.Checked; + + ShowRenderStats := chkShowRenderStats.Checked; + ShowRenderImage := chkShowRenderImage.Checked; // AV + + { Random tab } + randMinTransforms := udMinXforms.Position; + randMaxTransforms := udMaxXforms.Position; + mutantMinTransforms := udMinMutate.Position; + mutantMaxTransforms := udMaxMutate.Position; + RandomPrefix := txtRandomPrefix.text; + SymmetryType := cmbSymType.ItemIndex; + SymmetryOrder := udSymOrder.Position; + SymmetryNVars := udSymNVars.Position; + KeepBackground := chkKeepbackground.Checked; + + {Gradient tab } + randGradient := grpGradient.ItemIndex; + randGradientFile := txtGradientsFile.Text; + MinNodes := udMinNodes.Position; + MaxNodes := udMaxNodes.Position; + MinHue := udMinHue.Position; + MinSat := udMinSat.Position; + MinLum := udMinLum.Position; + MaxHue := udMaxHue.Position; + MaxSat := udMaxSat.Position; + MaxLum := udMaxLum.Position; + randColorBlend := rgColorBlend.ItemIndex; + + { UPR options } + UPRSampleDensity := StrToInt(txtFIterDensity.text); + UPRFilterRadius := StrToFloat(txtUPRFilterRadius.text); + UPROversample := StrToInt(txtUPROversample.text); + UPRColoringIdent := txtFCIdent.text; + UPRColoringFile := txtFCFile.text; + UPRFormulaIdent := txtFFIdent.text; + UPRFormulaFile := txtFFFile.text; + UPRAdjustDensity := chkAdjustDensity.checked; + UPRWidth := StrToInt(txtUPRWidth.text); + UPRHeight := StrToInt(txtUPRHeight.text); + + flam3Path := txtRenderer.text; + + {Paths} + defLibrary := txtLibrary.text; + // if (not RememberLastOpenFile) then // AV: fixed + defFlameFile := txtDefParameterFile.Text; + defSmoothPaletteFile := txtDefSmoothFile.Text; + PlaySoundOnRenderComplete := chkPlaySound.Checked; + RenderCompleteSoundFile := txtSoundFile.Text; + HelpPath := txtHelp.Text; + ChaoticaPath := txtChaotica.text; + ScreenShotPath := txtSShotFolder.Text; // AV + if (RightStr(ScreenShotPath, 1) <> '\') and (ScreenShotPath <> '') then + ScreenShotPath := ScreenShotPath + '\'; + defScriptFile := txtDefScript.Text; // AV + + UseX64IfPossible := cbC64.Checked; + + PluginPath := txtPluginFolder.Text; + if (PluginPath = '') or (not DirectoryExists(PluginPath)) then + PluginPath := ExtractFilePath(Application.ExeName); // AV + if (RightStr(PluginPath, 1) <> '\') and (PluginPath <> '') then + PluginPath := PluginPath + '\'; + + AutoSaveEnabled := cbEnableAutosave.Checked; + AutoSavePath := txtDefaultSaveFile.Text; + AutoSaveFreq := cbFreq.ItemIndex; // AV: + + MainForm.mnuExportFLame.Enabled := FileExists(flam3Path); + MainForm.mnuExportChaotica.Enabled := FileExists(chaoticaPath + '\chaotica.exe'); + + if (warn) then + Application.MessageBox(PChar(TextByKey('options-restartnotice')), PChar('Apophysis'), MB_ICONWARNING); + + Close; +end; + +procedure TOptionsForm.btnDefGradientClick(Sender: TObject); +var + fn:string; +begin + OpenDialog.Filter := TextByKey('common-filter-flamefiles') + '|*.flame|' + TextBykey('common-filter-allfiles') + '|*.*'; + OpenDialog.FileName := ''; + if OpenSaveFileDialog(OptionsForm, '.flame', OpenDialog.Filter, OpenDialog.InitialDir, TextByKey('common-browse'), fn, true, false, false, true) then + //if OpenDialog.Execute then + begin + txtDefParameterFile.text := fn; + end; +end; + +procedure TOptionsForm.btnDefScriptClick(Sender: TObject); +var + fn:string; +begin + OpenDialog.Filter := TextByKey('common-filter-scriptfiles') + '|*.aposcript;*.asc|' + TextBykey('common-filter-allfiles') + '|*.*';; + if DirectoryExists(ScriptPath) then + OpenDialog.InitialDir := ScriptPath + '\' + else + OpenDialog.InitialDir := ExtractFilePath(Application.ExeName); + OpenDialog.FileName := ''; + if OpenSaveFileDialog(OptionsForm, '.asc', OpenDialog.Filter, OpenDialog.InitialDir, TextByKey('common-browse'), fn, true, false, false, true) then + txtDefScript.Text := fn; +end; + +procedure TOptionsForm.FormClose(Sender: TObject; var Action: TCloseAction); +var + Registry: TRegistry; +begin + { Write position to registry } + Registry := TRegistry.Create; + try + Registry.RootKey := HKEY_CURRENT_USER; + if Registry.OpenKey('\Software\' + APP_NAME + '\Forms\Options', True) then + begin + Registry.WriteInteger('Top', OptionsForm.Top); + Registry.WriteInteger('Left', OptionsForm.Left); + end; + finally + Registry.Free; + end; + +end; + +procedure TOptionsForm.btnSmoothClick(Sender: TObject); +var + fn:string; +begin + OpenDialog.Filter := TextByKey('common-filter-gradientfiles') + '|*.gradient;*.ugr|' + TextBykey('common-filter-allfiles') + '|*.*'; + OpenDialog.InitialDir := ExtractFilePath(defSmoothPaletteFile); + OpenDialog.FileName := ''; + OpenDialog.DefaultExt := 'ugr'; + if OpenSaveFileDialog(OptionsForm, OpenDialog.DefaultExt, OpenDialog.Filter, OpenDialog.InitialDir, TextByKey('common-browse'), fn, true, false, false, true) then + //if OpenDialog.Execute then + begin + txtDefSmoothFile.text := fn; + end; +end; + +procedure TOptionsForm.btnSShotPathClick(Sender: TObject); +var sspath: string; +begin + sspath := ScreenShotPath; + if SelectDirectory(TextByKey('options-tab-environment-screenshotshint'), '', + sspath, [sdNewFolder, sdShowEdit, sdNewUI, sdValidateDir], Self) then + txtSShotFolder.Text := sspath + '\'; +end; + +procedure TOptionsForm.cmbSymTypeChange(Sender: TObject); +begin + if (cmbSymType.ItemIndex = 0) or (cmbSymType.ItemIndex = 1) then + begin + txtSymOrder.enabled := false; + txtSymNVars.enabled := false; + end else + begin + txtSymOrder.enabled := true; + txtSymNVars.enabled := true; + end; +end; + +procedure TOptionsForm.DefaultPathsDblCick(Sender: TObject); +begin // AV: reset paths + case TPanel(Sender).Tag of + 0: txtDefParameterFile.Text := ''; + 1: txtDefSmoothFile.Text := AppPath + 'Gradients\SmoothPalette.ugr'; + 2: txtLibrary.Text := AppPath + 'Functions.asc'; + 3: txtRenderer.Text := GetEnvVarValue('PROGRAMFILES') + '\flam3-3.0.1\flam3-render.exe'; + 4: txtHelp.Text := AppPath + 'Apophysis AV.chm'; + 5: begin + txtPluginFolder.Text := AppPath + 'Plugins\'; + if FileExists(AppPath + 'ApoPluginSrc.dat') then + DeleteFile(AppPath + 'ApoPluginSrc.dat'); // delete old string + end; + 6: txtSShotFolder.Text := AppPath + 'ScreenShots\'; + 7: txtDefScript.Text := ''; + 8: txtDefaultSaveFile.Text := AppPath + 'autosave.flame'; + end; +end; + +procedure TOptionsForm.btnSetAllClick(Sender: TObject); +var + i: integer; +begin + if VarsPages.ActivePageIndex = 0 then // AV + for i := 0 to NRVAR - 1 do clbVarEnabled.Checked[i] := True + //clbVarEnabled.CheckAll(cbChecked) + else + for i := 0 to NRVAR - 1 do clbVarFavourite.Checked[i] := True; + //clbVarFavourite.CheckAll(cbChecked); +end; + +procedure TOptionsForm.btnClearAllClick(Sender: TObject); +var + i: integer; +begin + if VarsPages.ActivePageIndex = 0 then // AV + for i := 0 to NRVAR - 1 do clbVarEnabled.Checked[i] := False + //clbVarEnabled.CheckAll(cbUnchecked) + else + for i := 0 to NRVAR - 1 do clbVarFavourite.Checked[i] := False; + //clbVarFavourite.CheckAll(cbUnchecked); +end; + +procedure TOptionsForm.txtMinNodesChange(Sender: TObject); +begin + if StrToInt(txtMinNodes.Text) > udMaxNodes.position then + udMaxNodes.Position := StrToInt(txtMinNodes.Text); +end; + +procedure TOptionsForm.txtMaxNodesChange(Sender: TObject); +begin + if StrToInt(txtMaxNodes.Text) < udMinNodes.position then + udMinNodes.Position := StrToInt(txtMaxNodes.Text); +end; + +procedure TOptionsForm.txtMaxHueChange(Sender: TObject); +begin + if StrToInt(txtMaxHue.Text) < udMinHue.position then + udMinHue.Position := StrToInt(txtMaxHue.Text); +end; + +procedure TOptionsForm.txtMaxSatChange(Sender: TObject); +begin + if StrToInt(txtMaxSat.Text) < udMinSat.position then + udMinSat.Position := StrToInt(txtMaxSat.Text); +end; + +procedure TOptionsForm.txtMaxLumChange(Sender: TObject); +begin + if StrToInt(txtMaxLum.Text) < udMinLum.position then + udMinLum.Position := StrToInt(txtMaxLum.Text); +end; + +procedure TOptionsForm.txtMinHueChange(Sender: TObject); +begin + if StrToInt(txtMinHue.Text) > udMaxHue.position then + udMaxHue.Position := StrToInt(txtMinHue.Text); +end; + +procedure TOptionsForm.txtMinSatChange(Sender: TObject); +begin + if StrToInt(txtMinSat.Text) > udMaxSat.position then + udMaxSat.Position := StrToInt(txtMinSat.Text); +end; + +procedure TOptionsForm.txtMinLumChange(Sender: TObject); +begin + if StrToInt(txtMinLum.Text) > udMaxLum.position then + udMaxLum.Position := StrToInt(txtMinLum.Text); +end; + +procedure TOptionsForm.txtMinXFormsChange(Sender: TObject); +begin + if StrToInt(txtMinXForms.Text) > udMaxXForms.position then + udMaxXFOrms.Position := StrToInt(txtMinXForms.Text); +end; + +procedure TOptionsForm.txtMaxXformsChange(Sender: TObject); +begin + if StrToInt(txtMaxXForms.Text) < udMinXForms.position then + udMinXForms.Position := StrToInt(txtMaxXforms.Text); +end; + +procedure TOptionsForm.txtMinMutateChange(Sender: TObject); +begin + if StrToInt(txtMinMutate.Text) > udMaxMutate.position then + udMaxMutate.Position := StrToInt(txtMinMutate.Text); +end; + +procedure TOptionsForm.txtMaxMutateChange(Sender: TObject); +begin + if StrToInt(txtMaxMutate.Text) < udMinMutate.position then + udMinMutate.Position := StrToInt(txtMaxMutate.Text); +end; + +procedure TOptionsForm.btnRendererClick(Sender: TObject); +var + fn:string; +begin + OpenDialog.Filter := TextBykey('common-filter-allfiles') + '|*.*'; + OpenDialog.InitialDir := ExtractFilePath(flam3Path); + OpenDialog.FileName := ''; + if OpenSaveFileDialog(OptionsForm, '', OpenDialog.Filter, OpenDialog.InitialDir, TextByKey('common-browse'), fn, true, false, false, true) then + //if OpenDialog.Execute then + begin + txtRenderer.text := fn; + end; + +end; + +procedure TOptionsForm.SpeedButton2Click(Sender: TObject); +var + fn:string; +begin + OpenDialog.Filter := TextByKey('common-filter-scriptfiles') + '|*.aposcript;*.asc|' + TextBykey('common-filter-allfiles') + '|*.*';; + OpenDialog.InitialDir := ExtractFilePath(defLibrary); + OpenDialog.FileName := ''; + if OpenSaveFileDialog(OptionsForm, '.asc', OpenDialog.Filter, OpenDialog.InitialDir, TextByKey('common-browse'), fn, true, false, false, true) then + //if OpenDialog.Execute then + begin + txtLibrary.text := fn; + end; +end; + +procedure TOptionsForm.TilePanelDblClick(Sender: TObject); +begin + case TPanel(Sender).Tag of + 0: txtSTile.Text := '1.414214'; + 1: txtRTile.Text := '1'; + 2: txtHexTile.Text := '2'; + end; +end; + +procedure TOptionsForm.FormCreate(Sender: TObject); +var + i: integer; +begin + // AV: to use only actual number of cores in the drop-down list + try + for i := 2 to GetCpuCount do + cbNrTheads.Items.Add(IntToStr(i)); + except + cbNrTheads.Items.Clear; + for i := 1 to 12 do + cbNrTheads.Items.Add(IntToStr(i)); + end; + UseNrThreads := cbNrTheads.Items.Count; + + btnOK.Caption := TextByKey('common-ok'); + btnCancel.Caption := TextByKey('common-cancel'); + pnlLowQ.Caption := TextByKey('common-lowquality'); + pnlMediumQ.Caption := TextByKey('common-mediumquality'); + pnlHighQ.Caption := TextByKey('common-highquality'); + btnDefGradient.Hint := TextByKey('common-browse'); + btnSmooth.Hint := btnDefGradient.Hint; + SpeedButton2.Hint := btnDefGradient.Hint; + btnRenderer.Hint := btnDefGradient.Hint; + btnHelp.Hint := btnDefGradient.Hint; + btnPluginPath.Hint := btnDefGradient.Hint; + btnSShotPath.Hint := btnDefGradient.Hint; + btnChaotica.Hint := btnDefGradient.Hint; + btnFindDefaultSaveFile.Hint := btnDefGradient.Hint; + btnBrowseSound.Hint := btnDefGradient.Hint; + btnDefScript.Hint := btnDefGradient.Hint; + Panel37.Caption := TextByKey('common-width'); + Panel38.Caption := TextByKey('common-height'); + Panel31.Caption := TextByKey('common-filename'); + Panel33.Caption := TextByKey('common-filename'); + Panel44.Caption := TextByKey('common-filename'); + pnlFilter.Caption := TextByKey('common-filterradius'); + Panel35.Caption := TextByKey('common-filterradius'); + pnlDensity.Caption := TextByKey('common-density'); + Panel34.Caption := TextByKey('common-density'); + pnlOSample.Caption := TextByKey('common-oversample'); + Panel36.Caption := TextByKey('common-oversample'); + pnlGamma.Caption := TextByKey('common-gamma'); + pnlBright.Caption := TextByKey('common-brightness'); + pnlVibrancy.Caption := TextByKey('common-vibrancy'); + pnlContrast.Caption := TextByKey('common-contrast'); // AV + pnlRelGamma.Caption := TextByKey('common-gammathreshold'); + cbPNGTransparency.Items[1] := TextByKey('common-enabled'); + cbPNGTransparency.Items[0] := TextByKey('common-disabled'); + Panel13.Caption := TextByKey('common-minimum'); + Panel15.Caption := TextByKey('common-minimum'); + Panel21.Caption := TextByKey('common-minimum'); + Panel22.Caption := TextByKey('common-minimum'); + Panel25.Caption := TextByKey('common-minimum'); + Panel26.Caption := TextByKey('common-minimum'); + Panel14.Caption := TextByKey('common-maximum'); + Panel16.Caption := TextByKey('common-maximum'); + Panel20.Caption := TextByKey('common-maximum'); + Panel23.Caption := TextByKey('common-maximum'); + Panel24.Caption := TextByKey('common-maximum'); + Panel27.Caption := TextByKey('common-maximum'); + Label49.Caption := TextByKey('common-minutes'); + Panel47.Caption := TextByKey('common-filename'); + Panel50.Caption := TextByKey('options-tab-general-pluginpath'); + //Panel49.Caption := TextByKey('common-filename') + ' (x64)'; + Panel48.Caption := TextByKey('options-tab-editor-previewtransparency'); + pnlScreenShot.Caption := TextByKey('options-tab-environment-screenshots'); + pnlScriptFile.Caption := TextByKey('options-tab-environment-defaultscript'); + cbC64.Caption := TextByKey('options-tab-environment-usex64chaotica'); + chkEnableEditorPreview.Caption := TextByKey('options-tab-editor-enablepreview'); + chkAutoSaveXML.Caption := TextByKey('options-tab-general-autosavepasted'); + self.Caption := TextByKey('options-title'); + GeneralPage.Caption := TextByKey('options-tab-general-title'); + Panel46.Caption := TextByKey('options-tab-general-language'); + pnlMultithreading.Caption := TextByKey('options-tab-general-multithreading'); + cbNrTheads.Items[0] := TextByKey('options-tab-general-multithreading-off'); + //pnlBufferDepth.Caption := TextByKey('options-tab-general-bufferdepth'); + pnlJPEGQuality.Caption := TextByKey('options-tab-general-jpegquality'); + pnlPNGTransparency.Caption := TextByKey('options-tab-general-pngtransparency'); + chkShowRenderStats.Caption := TextByKey('options-tab-general-showextendedstatistics'); + chkShowRenderImage.Caption := TextByKey('options-tab-general-showrenderimage'); + chkConfirmDel.Caption := TextByKey('options-tab-general-confirmdelete'); + chkConfirmExit.Caption := TextByKey('options-tab-general-confirmexit'); + chkconfirmStopRender.Caption := TextByKey('options-tab-general-confirmrenderstop'); + chkConfirmClearScript.Caption := TextByKey('options-tab-general-confirmclearscript'); + chkOldPaletteFormat.Caption := TextByKey('options-tab-general-oldgradientformat'); + cbUseTemplate.Caption := TextByKey('options-tab-general-alwaysblankflame'); + chkEqualStripes.Caption := TextByKey('options-tab-gradient-equalstripes'); + cbMissingplugin.Caption := TextByKey('options-tab-general-enablemissingpluginswarning'); + cbEmbedThumbs.Caption := TextByKey('options-tab-general-enablethumbnailembedding'); + chkEngLayout.Caption := TextByKey('options-tab-general-setenglayout'); + chkRandomTemplates.Caption := TextByKey('options-tab-general-templaterandcolor'); + chkApplyFlatten.Caption := TextByKey('options-tab-general-autoflatten'); + rgRotationMode.Caption := TextByKey('options-tab-general-rotatemode'); + rgRotationMode.Items[0] := TextByKey('options-tab-general-rotateimage'); + rgRotationMode.Items[1] := TextByKey('options-tab-general-rotateframe'); + rgZoomingMode.Caption := TextByKey('options-tab-general-zoommode'); + rgZoomingMode.Items[0] := TextByKey('options-tab-general-preservequality'); + rgZoomingMode.Items[1] := TextByKey('options-tab-general-preservespeed'); + rgEnumMode.Caption := TextByKey('options-tab-general-enummode'); + rgEnumMode.Items[0] := TextByKey('options-tab-general-enum0'); + rgEnumMode.Items[1] := TextByKey('options-tab-general-enum1'); + grpGuidelines.Caption := TextByKey('options-tab-general-guides'); + cbGl.Caption := TextByKey('options-tab-general-enableguides'); + pnlCenter.Caption := TextByKey('options-tab-general-guidecentercolor'); + pnlThirds.Caption := TextByKey('options-tab-general-guidethirdscolor'); + pnlGoldenRatio.Caption := TextByKey('options-tab-general-guidegoldenratiocolor'); + EditorPage.Caption := TextByKey('options-tab-editor-title'); + GroupBox1.Caption := TextByKey('options-tab-editor-editorgraph'); + GroupBox21.Caption := TextByKey('options-tab-editor-editordefaults'); + chkUseXFormColor.Caption := TextByKey('options-tab-editor-usetransformcolor'); + chkHelpers.Caption := TextByKey('options-tab-editor-helperlines'); + chkShowAllXForms.Caption := TextByKey('options-tab-editor-alwaysshowbothtransformtypes'); + chkResetCoefs.Caption := TextByKey('options-tab-editor-resetcoefs'); // AV + chkResetLinear.Caption := TextByKey('options-tab-editor-resetlinear'); // AV + pnlBackground.Caption := TextByKey('options-tab-editor-backgroundcolor'); + pnlGrid.Caption := TextByKey('options-tab-editor-gridcolors'); + pnlReferenceC.Caption := TextByKey('options-tab-editor-referencecolor'); + pnlHelpers.Caption := TextByKey('options-tab-editor-helpercolors'); + pnlReflection.Caption := TextByKey('editor-tab-triangle-reflection'); + chkExtendedEdit.Caption := TextByKey('options-tab-editor-extendededit'); + chkAxisLock.Caption := TextByKey('options-tab-editor-locktransformaxes'); + chkXaosRebuild.Caption := TextByKey('options-tab-editor-rebuildxaoslinks'); + DisplayPage.Caption := TextByKey('options-tab-display-title'); + grpRendering.Caption := TextByKey('options-tab-display-rendering'); + GroupBox2.Caption := TextByKey('options-tab-display-previewdensity'); + GroupBox20.Caption := TextByKey('options-tab-display-mainpreview'); + chkExtendMainPreview.Caption := TextByKey('options-tab-display-extendpreviewbuffer'); + pnlExtension.Caption := TextByKey('options-tab-display-extenspreviewbufferlabel'); + chkShowTransparency.Caption := TextByKey('options-tab-display-showtransparency'); + chkUseSmallThumbs.Caption := TextByKey('options-tab-display-usesmallthumbs'); + RandomPage.Caption := TextByKey('options-tab-random-title'); + gpNumberOfTransforms.Caption := TextByKey('options-tab-random-numberoftransforms'); + gpMutationTransforms.Caption := TextByKey('options-tab-random-mutationtransforms'); + gpFlameTitlePrefix.Caption := TextByKey('options-tab-random-randombatch'); + gpForcedSymmetry.Caption := TextByKey('options-tab-random-forcedsymmetry'); + Panel11.Caption := TextByKey('options-tab-random-batchsize'); + Panel12.Caption := TextByKey('options-tab-random-titleprefix'); + chkKeepBackground.Caption := TextByKey('options-tab-random-keepbackground'); + Panel17.Caption := TextByKey('options-tab-random-symtype'); + Panel18.Caption := TextByKey('options-tab-random-symorder'); + Panel19.Caption := TextByKey('options-tab-random-symlimit'); + cmbSymType.Items[0] := TextByKey('options-tab-random-type-none'); + cmbSymType.Items[1] := TextByKey('options-tab-random-type-bilateral'); + cmbSymType.Items[2] := TextByKey('options-tab-random-type-rotational'); + cmbSymType.Items[3] := TextByKey('options-tab-random-type-dihedral'); + grpGradient.Caption := TextByKey('options-tab-random-onrandom'); + grpGradient.Items[0] := TextByKey('options-tab-random-userandom'); + grpGradient.Items[1] := TextByKey('options-tab-random-usedefault'); + grpGradient.Items[2] := TextByKey('options-tab-random-usecurrent'); + grpGradient.Items[3] := TextByKey('options-tab-random-randomcalculated'); + grpGradient.Items[4] := TextByKey('options-tab-random-randomfromfile'); + rgColorBlend.Caption := TextByKey('options-tab-gradient-colorblend'); + rgColorBlend.Items[0] := TextByKey('options-tab-gradient-rgbblend'); + rgColorBlend.Items[1] := TextByKey('options-tab-gradient-hsvblend'); + rgColorBlend.Items[2] := TextByKey('options-tab-gradient-noblend'); + GroupBox16.Caption := TextByKey('options-tab-random-filetouse'); + VariationsPage.Caption := TextByKey('options-tab-variations-title'); + tabRandomVars.Caption := TextByKey('options-tab-variations-random'); // AV + tabFavouriteVars.Caption := TextByKey('options-tab-variations-faves'); // AV + btnSetAll.Caption := TextByKey('options-tab-variations-setall'); + btnClearAll.Caption := TextByKey('options-tab-variations-clearall'); + btnInvert.Caption := TextByKey('options-tab-variations-invert'); + GradientPage.Caption := TextByKey('options-tab-gradient-title'); + GroupBox23.Caption := TextByKey('options-tab-gradient-numberofnodes'); + GroupBox13.Caption := TextByKey('options-tab-gradient-smoothpalette'); + GroupBox17.Caption := TextByKey('options-tab-gradient-huebetween'); + GroupBox18.Caption := TextByKey('options-tab-gradient-satbetween'); + GroupBox22.Caption := TextByKey('options-tab-gradient-lumbetween'); + Panel28.Caption := TextByKey('options-tab-gradient-numtries'); + Panel29.Caption := TextByKey('options-tab-gradient-trylength'); + UPRPage.Caption := TextByKey('options-tab-upr-title'); + GroupBox9.Caption := TextByKey('options-tab-upr-paramdefaults'); + GroupBox4.Caption := TextByKey('options-tab-upr-coloralgorithm'); + GroupBox11.Caption := TextByKey('options-tab-upr-uprsize'); + GroupBox5.Caption := TextByKey('options-tab-upr-formula'); + Panel30.Caption := TextByKey('options-tab-upr-identifier'); + Panel32.Caption := TextByKey('options-tab-upr-identifier'); + chkAdjustDensity.Caption := TextByKey('options-tab-upr-adjustdensity'); + PathsPage.Caption := TextByKey('options-tab-environment-title'); + Panel39.Caption := TextByKey('options-tab-environment-defaultparams'); + Panel40.Caption := TextByKey('options-tab-environment-smoothpalette'); + Panel41.Caption := TextByKey('options-tab-environment-functionlib'); + //Panel42.Caption := TextByKey('options-tab-environment-exportrenderer'); + Panel43.Caption := TextByKey('options-tab-environment-helpfile'); + chkRememberLastOpen.Caption := TextByKey('options-tab-environment-rememberlastopen'); + cbEnableAutosave.Caption := TextByKey('options-tab-environment-autosave'); + panel45.Caption := TextByKey('options-tab-environment-savefrequency'); + //cbSinglePrecision.Caption := TextByKey('options-tab-general-singleprecision'); + grpEditorColors.Caption := TextByKey('editor-tab-color-title'); + GroupBox15.Caption := TextByKey('options-tab-general-onrendercomplete'); + chkPlaySound.Caption := TextByKey('options-tab-general-playsound'); + btnPlay.Hint := TextByKey('options-tab-general-playhint'); + Label44.Caption := TextByKey('options-tab-general-soundfile'); + pnlFuse.Caption := TextByKey('options-tab-display-fuse'); + pnHexTile.Caption := TextByKey('main-menu-flame-hextile'); + pnRTile.Caption := TextByKey('main-menu-flame-rhombustile'); + pnSTile.Caption := TextByKey('main-menu-flame-squaretile'); + GroupBox7.Caption := TextByKey('options-tab-display-tileradius'); + pnlRandBackground.Caption := TextByKey('options-tab-editor-backgroundcolor'); + + for i:= 0 to NRVAR - 1 do begin + clbVarEnabled.Items.Add(varnames(i)); + clbVarFavourite.Items.Add(varnames(i)); // AV + end; + + if not CheckX64 then // AV + begin + cbc64.Enabled := false; + UseX64IfPossible := false; + end; + + Tabs.ActivePageIndex := 0; // AV + VarsPages.ActivePageIndex := 0; // AV +end; + +procedure TOptionsForm.pnlCenterLineClick(Sender: TObject); +begin + if (not cbGL.Checked) then exit; + AdjustForm.ColorDialog.Color := pnlCenterLine.Color; + if AdjustForm.ColorDialog.Execute then + begin + pnlCenterLine.Color := AdjustForm.ColorDialog.Color; + LineCenterColor := Integer(pnlCenterLine.color); + UpdateShapeColors; + end; +end; + +procedure TOptionsForm.pnlThirdsLineClick(Sender: TObject); +begin + if (not cbGL.Checked) then exit; + AdjustForm.ColorDialog.Color := pnlThirdsLine.Color; + if AdjustForm.ColorDialog.Execute then + begin + pnlThirdsLine.Color := AdjustForm.ColorDialog.Color; + LineThirdsColor := Integer(pnlThirdsLine.color); + UpdateShapeColors; + end; +end; + +procedure TOptionsForm.RenderPanelsDblClick(Sender: TObject); +begin // AV: reset values + case TPanel(Sender).Tag of + 0: txtSampleDensity.Text := '5'; + 1: txtGamma.Text := '4'; + 2: txtBrightness.Text := '4'; + 3: txtVibrancy.Text := '1'; + 4: txtGammaThreshold.Text := '0.01'; + 5: txtOversample.Text := '1'; + 6: txtFilterRadius.Text := '0.2'; + 7: txtFuse.Value := 15; + 8: txtLowQuality.Text := '0.1'; + 9: txtMediumQuality.Text := '1'; + 10: txtHighQuality.Text := '5'; + 11: txtContrast.Text := '1'; + end; +end; + +procedure TOptionsForm.pnlGRLineClick(Sender: TObject); +begin + if (not cbGL.Checked) then exit; + AdjustForm.ColorDialog.Color := pnlGRLine.Color; + if AdjustForm.ColorDialog.Execute then + begin + pnlGRLine.Color := AdjustForm.ColorDialog.Color; + LineGRColor := Integer(pnlGRLine.color); + UpdateShapeColors; + end; +end; + +procedure TOptionsForm.pnlBackColorClick(Sender: TObject); +begin + AdjustForm.ColorDialog.Color := pnlBackColor.Color; + if AdjustForm.ColorDialog.Execute then + begin + pnlBackColor.Color := AdjustForm.ColorDialog.Color; + EditorBkgColor := Integer(pnlBackColor.color); + UpdateShapeColors; + end; +end; + +procedure TOptionsForm.pnlRandBackColorClick(Sender: TObject); +begin + AdjustForm.ColorDialog.Color := pnlRandBackColor.Color; + if AdjustForm.ColorDialog.Execute then + begin + pnlRandBackColor.Color := AdjustForm.ColorDialog.Color; + RandBackColor := Integer(pnlRandBackColor.color); + UpdateShapeColors; + end; +end; + +procedure TOptionsForm.pnlReferenceClick(Sender: TObject); +begin + AdjustForm.ColorDialog.Color := pnlReference.Color; + if AdjustForm.ColorDialog.Execute then + begin + pnlReference.Color := AdjustForm.ColorDialog.Color; + ReferenceTriangleColor := Integer(pnlReference.color); + UpdateShapeColors; + end; +end; + +procedure TOptionsForm.pnlReflectionCClick(Sender: TObject); +begin + AdjustForm.ColorDialog.Color := pnlReflectionC.Color; + if AdjustForm.ColorDialog.Execute then + begin + pnlReflectionC.Color := AdjustForm.ColorDialog.Color; + FlipColor := Integer(pnlReflectionC.Color); + UpdateShapeColors; + end; +end; + +procedure TOptionsForm.pnlGridColor1Click(Sender: TObject); +begin + AdjustForm.ColorDialog.Color := pnlGridColor1.Color; + if AdjustForm.ColorDialog.Execute then + begin + pnlGridColor1.Color := AdjustForm.ColorDialog.Color; + GridColor1 := Integer(pnlGridColor1.color); + UpdateShapeColors; + end; +end; + +procedure TOptionsForm.pnlGridColor2Click(Sender: TObject); +begin + AdjustForm.ColorDialog.Color := pnlGridColor2.Color; + if AdjustForm.ColorDialog.Execute then + begin + pnlGridColor2.Color := AdjustForm.ColorDialog.Color; + GridColor2 := Integer(pnlGridColor2.color); + UpdateShapeColors; + end; +end; + +procedure TOptionsForm.pnlHelpersColorClick(Sender: TObject); +begin + AdjustForm.ColorDialog.Color := pnlHelpersColor.Color; + if AdjustForm.ColorDialog.Execute then + begin + pnlHelpersColor.Color := AdjustForm.ColorDialog.Color; + HelpersColor := Integer(pnlHelpersColor.color); + UpdateShapeColors; + end; +end; + +procedure TOptionsForm.btnBrowseSoundClick(Sender: TObject); +var + fn:string; +begin + if RenderCompleteSoundFile = '' then // AV + OpenDialog.InitialDir := GetEnvironmentVariable('WINDIR') + '\Media\' + else + OpenDialog.InitialDir := ExtractFilePath(RenderCompleteSoundFile); + OpenDialog.Filter := 'Waveform files (*.wav)|*.wav'; + OpenDialog.FileName := ''; + if OpenSaveFileDialog(OptionsForm, '.wav', OpenDialog.Filter, OpenDialog.InitialDir, + TextByKey('common-openwav'), fn, true, false, false, true) then + begin + txtSoundFile.text := fn; + end; +end; + +procedure TOptionsForm.btnPlayClick(Sender: TObject); +begin + if txtSoundFile.text <> '' then + sndPlaySound(PChar(txtSoundFile.text), SND_FILENAME or SND_ASYNC) + else + sndPlaySound(pchar(SND_ALIAS_SYSTEMASTERISK), SND_ALIAS_ID or SND_NOSTOP or SND_ASYNC); +end; + +procedure TOptionsForm.btnPluginPathClick(Sender: TObject); +var + TitleName : string; + lpItemID : PItemIDList; + BrowseInfo : TBrowseInfo; + DisplayName : array[0..MAX_PATH] of char; + TempPath : array[0..MAX_PATH] of char; +begin + FillChar(BrowseInfo, sizeof(TBrowseInfo), #0); + BrowseInfo.hwndOwner := self.Handle; + BrowseInfo.pszDisplayName := @DisplayName; + TitleName := TextByKey('options-selectplugins'); + BrowseInfo.lpszTitle := PChar(TitleName); + BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS; + lpItemID := SHBrowseForFolder(BrowseInfo); + if lpItemId <> nil then begin + SHGetPathFromIDList(lpItemID, TempPath); + txtPluginFolder.Text := TempPath; + GlobalFreePtr(lpItemID); + end; +end; + +procedure TOptionsForm.btnGradientsFileClick(Sender: TObject); +var + fn:string; +begin + OpenDialog.Filter := TextByKey('common-filter-gradientfiles') + '|*.gradient;*.ugr|' + TextBykey('common-filter-allfiles') + '|*.*'; + OpenDialog.InitialDir := ExtractFilePath(randGradientFile); + OpenDialog.FileName := ''; + if OpenSaveFileDialog(OptionsForm, '.ugr', OpenDialog.Filter, OpenDialog.InitialDir, TextByKey('common-browse'), fn, true, false, false, true) then + //if OpenDialog.Execute then + begin + txtGradientsFile.text := fn; + end; +end; + +procedure TOptionsForm.shBackgroundMouseUp(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + pnlBackColorClick(Sender); +end; + +procedure TOptionsForm.shCenterLineMouseUp(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + pnlCenterLineClick(Sender); +end; + +procedure TOptionsForm.shThirdsLineMouseUp(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + pnlThirdsLineClick(Sender); +end; + +procedure TOptionsForm.shGRLineMouseUp(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + pnlGRLineClick(Sender); +end; + +procedure TOptionsForm.shGC1MouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + pnlGridColor1Click(Sender); +end; + +procedure TOptionsForm.shGC2MouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + pnlGridColor2Click(Sender); +end; + +procedure TOptionsForm.shRandBackColorMouseUp(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + pnlRandBackColorClick(Sender); +end; + +procedure TOptionsForm.shReflectionMouseUp(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + pnlReflectionCClick(Sender); +end; + +procedure TOptionsForm.shRefMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + pnlReferenceClick(Sender); +end; + +procedure TOptionsForm.shHelpersMouseUp(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + pnlHelpersColorClick(Sender); +end; + +procedure TOptionsForm.chkRememberLastOpenClick(Sender: TObject); +begin + if chkRememberLastOpen.Checked then begin + txtDefParameterFile.Enabled := false; + txtDefParameterFile.Text := ''; //LastOpenFile; + btnDefGradient.Enabled := false; + end else begin + txtDefParameterFile.Enabled := true; + btnDefGradient.Enabled := true; + end; + + Panel39.Enabled := txtDefParameterFile.Enabled; + + if (Panel39.Enabled) then Panel39.Font.Color := clWindowText + else Panel39.Font.Color := clGrayText; +end; + +procedure TOptionsForm.btnFindDefaultSaveFileClick(Sender: TObject); +var fn:string; +begin + OpenDialog.Filter := TextByKey('common-filter-flamefiles') + '|*.flame|' + TextBykey('common-filter-allfiles') + '|*.*'; + OpenDialog.FileName := ''; + if OpenSaveFileDialog(OptionsForm, '.flame', OpenDialog.Filter, OpenDialog.InitialDir, TextByKey('common-browse'), fn, false, false, false, false) then + //if OpenDialog.Execute then + begin + txtDefaultSaveFile.text := fn; + end; +end; + +procedure TOptionsForm.cbEnableAutosaveClick(Sender: TObject); +begin + Panel44.Enabled := cbEnableAutoSave.Checked; + Panel45.Enabled := cbEnableAutoSave.Checked; + Label49.Enabled := cbEnableAutoSave.Checked; + if (Panel44.Enabled) then Panel44.Font.Color := clWindowText + else Panel44.Font.Color := clGrayText; + if (Panel45.Enabled) then Panel45.Font.Color := clWindowText + else Panel45.Font.Color := clGrayText; + txtDefaultSaveFile.Enabled := cbEnableAutoSave.Checked; + btnFindDefaultSaveFile.Enabled := cbEnableAutoSave.Checked; + cbFreq.Enabled := cbEnableAutoSave.Checked; +end; + +procedure TOptionsForm.btnHelpClick(Sender: TObject); +var + fn:string; +begin + OpenDialog.Filter := TextBykey('common-filter-allfiles') + '|*.*'; + OpenDialog.InitialDir := ExtractFilePath(helpPath); + OpenDialog.FileName := ''; + if OpenSaveFileDialog(OptionsForm, '', OpenDialog.Filter, OpenDialog.InitialDir, TextByKey('common-browse'), fn, true, false, false, true) then + //if OpenDialog.Execute then + begin + txtHelp.text := fn; + end; +end; + +procedure TOptionsForm.btnInvertClick(Sender: TObject); +var + i: integer; +begin + if VarsPages.ActivePageIndex = 0 then // AV + for i := 0 to NRVAR - 1 do + clbVarEnabled.Checked[i] := not clbVarEnabled.Checked[i] + else // AV + for i := 0 to NRVAR - 1 do + clbVarFavourite.Checked[i] := not clbVarFavourite.Checked[i]; +end; + +procedure TOptionsForm.cbGLClick(Sender: TObject); +begin + pnlCenter.Enabled := cbGL.Checked; + pnlThirds.Enabled := cbGL.Checked; + pnlGoldenRatio.Enabled := cbGL.Checked; + + if (pnlCenter.Enabled) then pnlCenter.Font.Color := clWindowText + else pnlCenter.Font.Color := clGrayText; + + if (pnlThirds.Enabled) then pnlThirds.Font.Color := clWindowText + else pnlThirds.Font.Color := clGrayText; + + if (pnlGoldenRatio.Enabled) then pnlGoldenRatio.Font.Color := clWindowText + else pnlGoldenRatio.Font.Color := clGrayText; +end; + +procedure TOptionsForm.SpeedButton1Click(Sender: TObject); +var fn, fn2, s1, s2:string; i : integer; +begin + OpenDialog.Filter := 'Extensible Markup Language Files (*.xml)|*.xml'; + OpenDialog.InitialDir := ExtractFilePath(helpPath); + OpenDialog.FileName := ''; + if OpenSaveFileDialog(OptionsForm, '', OpenDialog.Filter, OpenDialog.InitialDir, TextByKey('common-browse'), fn, true, false, false, true) then + //if OpenDialog.Execute then + begin + fn2 := ExtractFilePath(Application.ExeName) + 'Languages\' + ExtractFileName(fn); + LanguageInfo(fn, s1, s2); + if s1 <> '' then begin + if not DirectoryExists(ExtractFilePath(Application.ExeName) + 'Languages\') then + CreateDirectory(PChar(ExtractFilePath(Application.ExeName) + 'Languages\'), nil); + if (lowercase(ExtractFilePath(fn)) <> lowercase(ExtractFilePath(Application.ExeName) + 'Languages\')) then + CopyFile(PChar(fn), PChar(fn2), False); + AvailableLanguages.Add(fn2); + i := AvailableLanguages.Count - 1; + if (s2 <> '') then + s1 := s2 + ' (' + s1 + ')'; + txtLanguageFile.Items.Add(s1); + txtLanguageFile.ItemIndex := txtLanguageFile.Items.Count - 1; + end else begin + Application.MessageBox(PChar(TextByKey('common-invalidformat')), PChar('Apophysis'), MB_ICONERROR); + end; + end; +end; + +procedure TOptionsForm.btnChaoticaClick(Sender: TObject); +var fn: string; +begin + + // new b. 1550 + fn := ChaoticaPath; + if SelectDirectory(fn, [sdAllowCreate, sdPerformCreate, sdPrompt], 0) then + begin + txtChaotica.Text := fn; + if not FileExists(fn + '\chaotica.exe') then + begin + MessageBox(0, + PCHAR('Could not find "' + fn + '\chaotica.exe" - invalid Chaotica 0.45+ path'), + PCHAR('Apophysis AV'), MB_ICONHAND or MB_OK); + txtChaotica.Text := ChaoticaPath; + fn := ChaoticaPath; + end; + end; + {OpenDialog.Filter := TextBykey('common-filter-allfiles') + '|*.*'; + if sender = TSpeedButton(btnChaotica) then + OpenDialog.InitialDir := ExtractFilePath(ChaoticaPath) + else + OpenDialog.InitialDir := ExtractFilePath(ChaoticaPath64); + OpenDialog.FileName := ''; + if OpenSaveFileDialog(OptionsForm, '', OpenDialog.Filter, OpenDialog.InitialDir, TextByKey('common-browse'), fn, true, false, false, true) then + //if OpenDialog.Execute then + begin + if sender = TSpeedButton(btnChaotica) then txtChaotica.text := fn + else txtChaotica64.text := fn; + end; } +end; + +procedure TOptionsForm.chkEnableEditorPreviewClick(Sender: TObject); +begin + Panel48.Enabled := chkEnableEditorPreview.Checked; + if chkEnableEditorPreview.Checked then + Panel48.Font.Color := clWindowText + else Panel48.Font.Color := clGrayText; + tbEPTransparency.Enabled := chkEnableEditorPreview.Checked; +end; + +procedure TOptionsForm.chkKeepBackgroundClick(Sender: TObject); +begin + pnlRandBackGround.Enabled := not chkKeepBackground.Checked; + pnlRandBackColor.Enabled := not chkKeepBackground.Checked; + + if (pnlRandBackGround.Enabled) then + pnlRandBackGround.Font.Color := clWindowText + else + pnlRandBackGround.Font.Color := clGrayText; +end; + +end. + diff --git a/Forms/Preview.dfm b/Forms/Preview.dfm new file mode 100644 index 0000000..96a8311 --- /dev/null +++ b/Forms/Preview.dfm @@ -0,0 +1,66 @@ +object PreviewForm: TPreviewForm + Left = 541 + Top = 357 + BorderIcons = [biSystemMenu, biMinimize] + BorderStyle = bsSizeToolWin + Caption = 'Preview' + ClientHeight = 147 + ClientWidth = 196 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + PopupMenu = PreviewPopup + Scaled = False + OnClose = FormClose + OnCreate = FormCreate + OnDestroy = FormDestroy + OnKeyPress = FormKeyPress + PixelsPerInch = 96 + TextHeight = 13 + object BackPanel: TPanel + Left = 0 + Top = 0 + Width = 196 + Height = 147 + Align = alClient + BevelInner = bvLowered + BevelOuter = bvLowered + Color = clBlack + TabOrder = 0 + object Image: TImage + Left = 2 + Top = 2 + Width = 192 + Height = 143 + Align = alClient + AutoSize = True + Stretch = True + ExplicitWidth = 200 + ExplicitHeight = 153 + end + end + object PreviewPopup: TPopupMenu + Left = 72 + Top = 40 + object MakeScreenShot: TMenuItem + Caption = 'Make a screenshot of the window' + ShortCut = 16471 + OnClick = MakeScreenShotClick + end + object KeepFrame: TMenuItem + AutoCheck = True + Caption = 'Keep the window frame' + end + object N1: TMenuItem + Caption = '-' + end + object PreviewPause: TMenuItem + Caption = 'Pause the preview' + OnClick = PreviewPauseClick + end + end +end diff --git a/Forms/Preview.pas b/Forms/Preview.pas new file mode 100644 index 0000000..2f1b3d1 --- /dev/null +++ b/Forms/Preview.pas @@ -0,0 +1,151 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} +unit Preview; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + ExtCtrls, ControlPoint, RenderingInterface, Translation, Vcl.Menus, + Vcl.Imaging.PNGimage; + +type + TPreviewForm = class(TForm) + BackPanel: TPanel; + Image: TImage; + PreviewPopup: TPopupMenu; + MakeScreenShot: TMenuItem; + KeepFrame: TMenuItem; + N1: TMenuItem; + PreviewPause: TMenuItem; + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure FormKeyPress(Sender: TObject; var Key: Char); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure MakeScreenShotClick(Sender: TObject); // AV + procedure PreviewPauseClick(Sender: TObject); // AV + private + public + cp: TControlPoint; + Render: TRenderer; + procedure DrawFlame; + end; + +var + PreviewForm: TPreviewForm; + +implementation + +uses Main, Global, ScriptForm; + +{$R *.DFM} + +procedure TPreviewForm.DrawFlame; +begin + Render.Stop; + // AV: this is already done by cp.AdjustScale + { + cp.width := Image.width; + cp.Height := Image.Height; + } + Render.SetCP(cp); + Render.Render; + Image.Picture.Bitmap.Assign(Render.GetImage); + Application.ProcessMessages; +end; + + +procedure TPreviewForm.FormCreate(Sender: TObject); +begin + self.Caption := TextByKey('preview-title'); + MakeScreenShot.Caption := TextByKey('main-menu-screenshot'); + KeepFrame.Caption := TextByKey('preview-keepframe'); + cp := TControlPoint.Create; + Render := TRenderer.Create; + PreviewPause.Caption := TextByKey('preview-pause'); +end; + +procedure TPreviewForm.FormDestroy(Sender: TObject); +begin + Render.Free; + cp.Free; +end; + +procedure TPreviewForm.FormKeyPress(Sender: TObject; var Key: Char); +begin + if ScriptEditor.btnPause.Down then ScriptEditor.btnPause.Click; // AV + ScriptEditor.Stopped := True; +end; + +procedure TPreviewForm.MakeScreenShotClick(Sender: TObject); +var + s: string; + pic: TPNGObject; +begin + if not DirectoryExists(ScreenShotPath) then + begin + CreateDir(AppPath + 'ScreenShots\'); + ScreenShotPath := AppPath + 'ScreenShots\'; + end; + s := ScreenShotPath + 'Apophysis Animation Preview' + FormatDateTime(' (MM-dd-yyyy hh-mm-ss)', Now) + '.bmp'; + try + if KeepFrame.Checked then + GetFormScreenShot(s) + else + begin + try + pic := TPNGObject.Create; + try + pic.Assign(Image.Picture.Bitmap); + if cp.name = '' then cp.name := RemoveExt(s); + pic.AddtEXt('ApoFlame', AnsiString(Trim(MainForm.RetrieveXML(cp)))); + s := ChangeFileExt(s, '.png'); + pic.SaveToFile(s); + finally + pic.Free; + end; + except + Image.Picture.Bitmap.SaveToFile(s); + end; + end; + Application.MessageBox(PChar(Format(TextByKey('common-screenshot-saved'), + [ExtractFileName(s), ExtractFilePath(s)])), PChar('Apophysis AV'), MB_ICONINFORMATION); + except + Application.MessageBox(PChar(TextByKey('common-screenshot-error')), PChar('Apophysis AV'), MB_ICONERROR); + end; +end; + +procedure TPreviewForm.PreviewPauseClick(Sender: TObject); +begin + ScriptEditor.btnPause.Click; +end; + +procedure TPreviewForm.FormClose(Sender: TObject; var Action: TCloseAction); +begin + if ScriptEditor.btnPause.Down then ScriptEditor.btnPause.Click; // AV + ScriptEditor.Stopped := True; +end; + +end. + diff --git a/Forms/Save.dfm b/Forms/Save.dfm new file mode 100644 index 0000000..93f012d --- /dev/null +++ b/Forms/Save.dfm @@ -0,0 +1,153 @@ +object SaveForm: TSaveForm + Left = 434 + Top = 432 + BorderStyle = bsDialog + Caption = 'Save Parameters' + ClientHeight = 153 + ClientWidth = 517 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -14 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poOwnerFormCenter + OnCreate = FormCreate + OnShow = FormShow + DesignSize = ( + 517 + 153) + PixelsPerInch = 120 + TextHeight = 16 + object btnDefGradient: TSpeedButton + Left = 480 + Top = 9 + Width = 30 + Height = 29 + Hint = 'Browse...' + Anchors = [akTop, akRight] + Flat = True + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -15 + Font.Name = 'Arial' + Font.Style = [fsBold] + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF75848F66808F + 607987576E7B4E626F4456613948522E3A43252E351B222914191E0E12160E13 + 18FF00FFFF00FFFF00FF77879289A1AB6AB2D4008FCD008FCD008FCD048CC708 + 88BE0F82B4157CA91B779F1F7296224B5C87A2ABFF00FFFF00FF7A8A957EBED3 + 8AA4AE7EDCFF5FCFFF55CBFF4CC4FA41BCF537B3F02EAAEB24A0E5138CD42367 + 805E696DFF00FFFF00FF7D8E9879D2EC8BA4AD89C2CE71D8FF65D3FF5CCEFF51 + C9FE49C1FA3FB9F534B0EE29A8E91085CD224B5B98B2BAFF00FF80919C81D7EF + 7DC5E08CA6B080DDFE68D3FF67D4FF62D1FF58CDFF4EC7FC46BEF73BB6F231AC + EC2569817A95A1FF00FF83959F89DCF18CE2FF8DA8B18CBAC774D8FF67D4FF67 + D4FF67D4FF5FD0FF54CDFF4BC5FC41BBF72EA2DB51677498B2BA869AA392E1F2 + 98E8FD80C4DE8EA7B081DEFD84E0FF84E0FF84E0FF84E0FF81DFFF7BDDFF74D8 + FF6BD6FF56A9D18F9BA4889CA59AE6F39FEBFB98E8FE8BACB98BACB98AAAB788 + A6B386A3AF839FAA819AA67F95A17C919D7A8E99798B957788938BA0A8A0EAF6 + A6EEF99FEBFB98E8FE7ADAFF67D4FF67D4FF67D4FF67D4FF67D4FF67D4FF7788 + 93FF00FFFF00FFFF00FF8EA2ABA7EEF6ABF0F7A6EEF99FEBFB98E8FD71D4FB89 + 9EA78699A382949F7E909A7A8C97778893FF00FFFF00FFFF00FF8FA4ACA0D2DA + ABF0F7ABF0F7A6EEF99FEBFB8DA1AAB5CBD0FF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFBDCED48FA4AC8FA4AC8FA4AC8FA4AC8FA4ACB5CBD0FF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF} + ParentFont = False + ParentShowHint = False + ShowHint = True + OnClick = btnDefGradientClick + end + object btnSave: TButton + Left = 310 + Top = 116 + Width = 93 + Height = 30 + Anchors = [akRight, akBottom] + Caption = '&Save' + Default = True + TabOrder = 2 + OnClick = btnSaveClick + end + object btnCancel: TButton + Left = 410 + Top = 116 + Width = 92 + Height = 30 + Anchors = [akRight, akBottom] + Caption = 'Cancel' + TabOrder = 3 + OnClick = btnCancelClick + end + object pnlTarget: TPanel + Left = 10 + Top = 10 + Width = 124 + Height = 26 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Destination' + ParentShowHint = False + ShowHint = True + TabOrder = 4 + OnDblClick = pnlTargetDblClick + end + object pnlName: TPanel + Left = 10 + Top = 39 + Width = 124 + Height = 26 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Name' + ParentShowHint = False + ShowHint = True + TabOrder = 5 + end + object txtFilename: TEdit + Left = 128 + Top = 10 + Width = 353 + Height = 24 + Anchors = [akLeft, akTop, akRight] + TabOrder = 0 + Text = 'txtFilename' + end + object txtTitle: TEdit + Left = 128 + Top = 39 + Width = 383 + Height = 24 + Anchors = [akLeft, akTop, akRight] + TabOrder = 1 + Text = 'txtTitle' + end + object optUseOldFormat: TRadioButton + Left = 10 + Top = 79 + Width = 304 + Height = 21 + Anchors = [akLeft, akTop, akRight] + Caption = 'Use classic flame format' + Checked = True + TabOrder = 6 + TabStop = True + end + object optUseNewFormat: TRadioButton + Left = 10 + Top = 101 + Width = 304 + Height = 21 + Anchors = [akLeft, akTop, akRight] + Caption = 'Use new flame format' + Enabled = False + TabOrder = 7 + end +end diff --git a/Forms/Save.pas b/Forms/Save.pas new file mode 100644 index 0000000..4d5fcdb --- /dev/null +++ b/Forms/Save.pas @@ -0,0 +1,243 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} +unit Save; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, Buttons, ExtCtrls, Translation; + +type + ESaveType = (stSaveParameters, stSaveAllParameters, stSaveGradient, stExportUPR, stSaveTemplate); + TSaveForm = class(TForm) + txtFilename: TEdit; + txtTitle: TEdit; + btnSave: TButton; + btnCancel: TButton; + btnDefGradient: TSpeedButton; + pnlTarget: TPanel; + pnlName: TPanel; + optUseOldFormat: TRadioButton; + optUseNewFormat: TRadioButton; + procedure FormCreate(Sender: TObject); + procedure btnSaveClick(Sender: TObject); + procedure btnCancelClick(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure btnDefGradientClick(Sender: TObject); + procedure pnlTargetDblClick(Sender: TObject); + private + public + Title: string; + Filename: string; + SaveType : ESaveType; + end; + +var + SaveForm: TSaveForm; + +implementation + +uses Main, Global, cmap; + +{$R *.DFM} + +function EntryExists(En, Fl: string): boolean; +{ Searches for existing identifier in parameter files } +var + FStrings: TStringList; + i: integer; +begin + Result := False; + if FileExists(Fl) then + begin + FStrings := TStringList.Create; + try + FStrings.LoadFromFile(Fl); + for i := 0 to FStrings.Count - 1 do + if Pos(LowerCase(En) + ' {', Lowercase(FStrings[i])) = 1 then + Result := True; + finally + FStrings.Free; + end + end + else + Result := False; +end; + +function SaveTypeTextKey(st : ESaveType) : string; +begin + case st of + stSaveParameters: Result := 'save-type-parameters'; + stSaveAllParameters: Result := 'save-type-allparameters'; + stSaveGradient: Result := 'save-type-gradient'; + stExportUPR: Result := 'save-type-exportupr'; + stSaveTemplate: Result := 'save-type-template'; + end; +end; + +function SaveDefaultExt(st : ESaveType) : string; +begin + case st of + stSaveParameters: Result := 'flame'; + stSaveAllParameters: Result := 'flame'; + stSaveGradient: Result := 'gradient'; + stExportUPR: Result := 'upr'; + stSaveTemplate: Result := 'template'; + end; +end; + +function SaveFilter(st : ESaveType): string; +begin + case st of + stSaveParameters: Result := Format('%s|*.flame;*.xml|%s|*.*', + [TextByKey('common-filter-flamefiles'), TextByKey('common-filter-allfiles')]); + stSaveAllParameters: Result := Format('%s|*.flame;*.xml|%s|*.*', + [TextByKey('common-filter-flamefiles'), TextByKey('common-filter-allfiles')]); + stSaveGradient: Result := Format('%s|*.gradient;*.ugr|%s|*.*', + [TextByKey('common-filter-gradientfiles'), TextByKey('common-filter-allfiles')]); + stExportUPR: Result := Format('%s|*.upr|%s|*.*', + [TextByKey('common-filter-uprfiles'), TextByKey('common-filter-allfiles')]); + stSaveTemplate: Result := Format('%s|*.template;*.flame', + [TextByKey('common-filter-templatefiles')]); + end; + +end; + +procedure TSaveForm.btnSaveClick(Sender: TObject); +var + t, f: string; + check, onestr: boolean; +begin + t := Trim(txtTitle.Text); + f := Trim(txtFilename.Text); + + if ((t = '') and txtTitle.Enabled) then + begin + Application.MessageBox(PChar(TextByKey('save-status-notitle')), 'Apophysis', 48); + Exit; + end; + if f = '' then + begin + Application.MessageBox(PChar(TextByKey('save-status-invalidfilename')), 'Apophysis', 48); + Exit; + end; + if ExtractFileExt(f) = '' then + begin + Application.MessageBox(PChar(TextByKey('save-status-invalidfilename')), 'Apophysis', 48); + Exit; + end; + + if (SaveType = stSaveParameters) or (SaveType = stSaveTemplate) then // AV + begin + check := XMLEntryExists(t, f); + onestr := false; + end + else if SaveType = stSaveAllParameters then + begin + onestr := true; + check := FileExists(f); + end + else + begin + onestr := false; + t := CleanIdentifier(t); + check := EntryExists(t, f); + end; + + if check then begin if onestr then begin + if Application.MessageBox(PChar(Format(TextByKey('save-status-alreadyexists2'), [f])), + 'Apophysis', 52) = ID_NO then exit; + end else begin + if Application.MessageBox(PChar(Format(TextByKey('save-status-alreadyexists'), [t, f])), + 'Apophysis', 52) = ID_NO then exit; + end end; + + if (t = '*') then t := ''; + Title := t; + Filename := f; + ModalResult := mrOK; +end; + +procedure TSaveForm.btnCancelClick(Sender: TObject); +begin + ModalResult := mrCancel; +end; + +procedure TSaveForm.FormShow(Sender: TObject); +begin + txtFilename.Text := Filename; + txtTitle.Text := Title; + //btnSave.SetFocus; + self.Caption := TextByKey(SaveTypeTextKey(SaveType)); + {if (SaveType = stSaveParameters) or (SaveType = stSaveAllParameters) then + self.Height := 160 + else self.Height := 120; } + if (SaveType = stSaveGradient) then // AV + pnlName.Caption := TextByKey('save-namepal') + else pnlName.Caption := TextByKey('save-name'); + + if (SaveType = stSaveAllParameters) then txtTitle.Text := ''; + txtTitle.Enabled := (SaveType <> stSaveAllParameters); + if (not txtTitle.Enabled) then pnlName.Font.Color := clGrayText + else pnlName.Font.Color := clWindowText; + + optUseOldFormat.Visible := (SaveType = stSaveParameters) or (SaveType = stSaveAllParameters); + optUseNewFormat.Visible := (SaveType = stSaveParameters) or (SaveType = stSaveAllParameters); + + txtFileName.ReadOnly := (SaveType = stSaveTemplate); // AV +end; + +procedure TSaveForm.pnlTargetDblClick(Sender: TObject); +begin + if (SaveType = stSaveParameters) then // AV + txtFileName.Text := OpenFile; +end; + +procedure TSaveForm.btnDefGradientClick(Sender: TObject); +var + fn:string; +begin + if OpenSaveFileDialog(self, SaveDefaultExt(SaveType), SaveFilter(SaveType), + ExtractFilePath(txtFilename.Text), TextByKey('common-browse'), fn, false, + false, false, false) then + if (SaveType <> stSaveTemplate) then + txtFileName.Text := fn + else + txtFileName.Text := AppPath + 'Templates\' + ExtractFileName(fn); // AV +end; + +procedure TSaveForm.FormCreate(Sender: TObject); +begin + btnCancel.Caption := TextByKey('common-cancel'); + btnSave.Caption := TextByKey('common-ok'); + btnDefGradient.Hint := TextByKey('common-browse'); + pnlTarget.Caption := TextByKey('common-destination'); + //pnlName.Caption := TextByKey('save-name'); + optUseOldFormat.Caption := TextByKey('save-oldformat'); + optUseNewFormat.Caption := TextByKey('save-newformat'); +end; + +end. + diff --git a/Forms/SavePreset.dfm b/Forms/SavePreset.dfm new file mode 100644 index 0000000..5f28a48 --- /dev/null +++ b/Forms/SavePreset.dfm @@ -0,0 +1,63 @@ +object SavePresetForm: TSavePresetForm + Left = 295 + Top = 331 + BorderStyle = bsDialog + Caption = 'Save Preset' + ClientHeight = 66 + ClientWidth = 349 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + OnCreate = FormCreate + DesignSize = ( + 349 + 66) + PixelsPerInch = 96 + TextHeight = 13 + object Button1: TButton + Left = 190 + Top = 37 + Width = 75 + Height = 25 + Anchors = [akRight, akBottom] + Caption = 'OK' + Default = True + ModalResult = 1 + TabOrder = 1 + OnClick = Button1Click + end + object Button2: TButton + Left = 270 + Top = 37 + Width = 75 + Height = 25 + Anchors = [akRight, akBottom] + Caption = 'Cancel' + ModalResult = 2 + TabOrder = 2 + end + object pnlName: TPanel + Left = 8 + Top = 8 + Width = 101 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Name' + ParentShowHint = False + ShowHint = True + TabOrder = 3 + end + object txtPresetName: TEdit + Left = 104 + Top = 8 + Width = 239 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 0 + end +end diff --git a/Forms/SavePreset.pas b/Forms/SavePreset.pas new file mode 100644 index 0000000..85a3095 --- /dev/null +++ b/Forms/SavePreset.pas @@ -0,0 +1,70 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} +unit SavePreset; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, ExtCtrls, Translation; + +type + TSavePresetForm = class(TForm) + txtPresetName: TEdit; + Button1: TButton; + Button2: TButton; + pnlName: TPanel; + procedure FormCreate(Sender: TObject); + procedure Button1Click(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + SavePresetForm: TSavePresetForm; + +implementation + +{$R *.DFM} + +procedure TSavePresetForm.Button1Click(Sender: TObject); +begin + if txtPresetName.Text = '' then + begin + Application.MessageBox(PChar(TextByKey('savepreset-notitle')), 'Apophysis', 48); + Exit; + end; +end; + +procedure TSavePresetForm.FormCreate(Sender: TObject); +begin + self.Caption := TextBykey('savepreset-title'); + button1.Caption := TextByKey('common-ok'); + button2.Caption := TextByKey('common-cancel'); + pnlName.Caption := TextByKey('savepreset-name'); +end; + +end. diff --git a/Forms/ScriptForm.dfm b/Forms/ScriptForm.dfm new file mode 100644 index 0000000..9a7c5c9 --- /dev/null +++ b/Forms/ScriptForm.dfm @@ -0,0 +1,1482 @@ +object ScriptEditor: TScriptEditor + Left = 312 + Top = 383 + Caption = 'Script Editor' + ClientHeight = 485 + ClientWidth = 583 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Icon.Data = { + 0000010001001010000001002000680400001600000028000000100000002000 + 0000010020000000000040040000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000006349 + 35146349352E927A69FF8C7563FF87705EFF6349352E7F6654FF7A624FFF755D + 4AFF6349352E6E5441FF6A513EFF674E3AFF6349352E00000000000000006349 + 352EAE9888FFEFE3DDFFF2E7E1FFEDDFD7FF836B59FFB79B8BFFDBBDADFFD9B7 + A6FF725946FFAE8B77FFD0A692FFCC9E87FF654B38FF6349352E00000000B7A2 + 93FFFBF8F7FFF9F4F2FFF7F0ECFFF4EBE6FFF1E5DFFF7F6754FF7A624FFF765D + 4AFF735946FF6E5542FF6B523EFF674E3AFF654B38FF634935FF00000000B7A2 + 93FFFDFCFBFFFBF9F7FFFAF5F2FFF7EFEDFFF4EAE6FFF2E5DFFFDDDCD7FFDFD7 + CEFFDECDC0FFDEC5B6FFDEBFACFFDBBAA6FFD8B5A3FF634935FF00000000B7A2 + 93FFFFFFFFFFB47F65FFB47F64FFEDDDD5FFB37E63FFF4EBE6FFF1E5DFFFEFDF + D7FFEBD9D1FFE8D3C9FFE5CDC1FFE1C6B9FFD6B3A1FF634A35FF00000000B9A4 + 95FFFFFFFFFFFFFFFFFFFDFCFCFFFCF9F7FFFAF4F2FFF6F0ECFFF4EBE5FFF2E5 + DFFFEEDFD8FFEBD9D0FFE8D3C8FFE5CCC1FFDBBDADFF634A36FF00000000BDA7 + 98FFFFFFFFFF968E88FFEEDED7FF968E87FFEDDDD6FF968D86FF958C85FFF4EB + E6FFF2E5DFFFEFDFD8FFECD9D0FFE8D3C9FFE0C7BAFF634A35FF00000000C1AB + 9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFCFCFFFBF8F7FFFAF4F2FFF7F0 + ECFFF4EAE6FFF1E5DFFFEEDFD7FFEBD9D0FFE6D1C6FF634A35FF00000000C5AF + A0FFFFFFFFFFB48065FFB48065FF968E88FFC2B0A3FF968E87FF968E86FFF9F4 + F2FFF7EFECFFF4EBE6FFF2E5DFFFEFDFD8FFEADBD1FF634936FF00000000C8B2 + A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFCFCFFFCF8 + F7FFF9F5F2FFF7F0ECFFF4EBE6FFF1E5DFFFEEE2DAFF644A36FF00000000C9B4 + A5FFFFFFFFFFFFFFFFFF66A365FF66A365FF66A365FFC0B4ADFF66A365FF66A3 + 65FF66A264FFFAF5F2FFF7F0ECFFF4EBE6FFEEE2DAFF644A36FF00000000C8B2 + A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFEFCFBFFFBF9F7FFFAF4F2FFF7F0EDFFF3EAE4FF644A36FF00000000C8B2 + A3FFCAB4A5FFCBB5A6FFCAB4A5FFC9B3A4FFC7B2A3FFC6B0A1FFC3AE9FFFC1AC + 9DFFBFAA9BFFBDA899FFBBA697FFB9A495FFB8A394FFB7A293FF000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + 0000FFFF00000003000000010000000100000001000000010000000100000001 + 0000000100000001000000010000000100000001000000010000FFFF0000} + OldCreateOrder = False + OnClose = FormClose + OnCreate = FormCreate + OnDestroy = FormDestroy + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object Splitter1: TSplitter + Left = 0 + Top = 373 + Width = 583 + Height = 4 + Cursor = crVSplit + Align = alBottom + end + object ToolBar: TToolBar + Left = 560 + Top = 0 + Width = 23 + Height = 373 + Align = alRight + AutoSize = True + Caption = 'ToolBar' + Images = MainForm.Buttons + ParentShowHint = False + ShowHint = True + TabOrder = 0 + object btnNew: TToolButton + Left = 0 + Top = 0 + Hint = 'New' + Caption = 'btnNew' + ImageIndex = 0 + Wrap = True + OnClick = btnNewClick + end + object btnOpen: TToolButton + Left = 0 + Top = 22 + Hint = 'Open' + Caption = 'btnOpen' + ImageIndex = 1 + Wrap = True + OnClick = btnOpenClick + end + object btnSave: TToolButton + Left = 0 + Top = 44 + Hint = 'Save' + Caption = 'btnSave' + ImageIndex = 2 + Wrap = True + OnClick = btnSaveClick + end + object btnFavorite: TToolButton + Left = 0 + Top = 66 + Caption = 'Add to favorites' + ImageIndex = 20 + Wrap = True + OnClick = btnFavoriteClick + end + object btnRun: TToolButton + Left = 0 + Top = 88 + Hint = 'Run' + Caption = 'btnRun' + ImageIndex = 43 + Wrap = True + OnClick = btnRunClick + end + object btnStop: TToolButton + Left = 0 + Top = 110 + Hint = 'Stop' + Caption = 'btnStop' + Enabled = False + ImageIndex = 36 + Wrap = True + OnClick = btnStopClick + end + object btnBreak: TToolButton + Left = 0 + Top = 132 + Hint = 'Break' + Enabled = False + ImageIndex = 37 + Wrap = True + OnClick = btnBreakClick + end + object btnPause: TToolButton + Left = 0 + Top = 154 + Hint = 'Pause' + Caption = 'Pause' + Enabled = False + ImageIndex = 47 + Wrap = True + OnClick = btnPauseClick + end + object CodeButton: TToolButton + Left = 0 + Top = 176 + Hint = 'Show code blocks | Show or hide a panel with code templates' + Caption = 'Code Button' + ImageIndex = 45 + OnClick = CodeButtonClick + end + end + object StatusBar: TStatusBar + Left = 0 + Top = 466 + Width = 583 + Height = 19 + Hint = 'Press for automathic code completition ' + Anchors = [akLeft, akRight] + Panels = <> + SimplePanel = True + SimpleText = 'Press for automathic code completition ' + end + object BackPanel: TPanel + Left = 123 + Top = 0 + Width = 437 + Height = 373 + Align = alClient + AutoSize = True + BevelInner = bvLowered + BevelOuter = bvLowered + Caption = 'BackPanel' + TabOrder = 2 + object Editor: TScrMemo + Left = 2 + Top = 2 + Width = 433 + Height = 369 + Cursor = crIBeam + PopupMenu = PopupMenu + ActiveLineSettings.ShowActiveLine = False + ActiveLineSettings.ShowActiveLineIndicator = False + ActiveLineSettings.ActiveLineTextColor = clWhite + Align = alClient + AutoCompletion.Delay = 300 + AutoCompletion.Font.Charset = DEFAULT_CHARSET + AutoCompletion.Font.Color = clWindowText + AutoCompletion.Font.Height = -11 + AutoCompletion.Font.Name = 'MS Sans Serif' + AutoCompletion.Font.Style = [] + AutoCompletion.ColorProp = clGreen + AutoCompletion.Height = 120 + AutoCompletion.StartToken = '.' + AutoCompletion.Width = 400 + AutoCorrect.Active = True + AutoCorrect.OldValue.Strings = ( + 'GammaTreshold' + 'bedin' + 'linear3D' + 'gammatreshold' + 'gammaTreshold' + 'fan') + AutoCorrect.NewValue.Strings = ( + 'GammaThreshold' + 'begin' + 'linear' + 'GammaThreshold' + 'GammaThreshold' + 'fan2') + AutoHintParameterPosition = hpBelowCode + BlockColor = clGradientActiveCaption + BookmarkGlyph.Data = { + 36050000424D3605000000000000360400002800000010000000100000000100 + 0800000000000001000000000000000000000001000000000000000000000000 + 80000080000000808000800000008000800080800000C0C0C000C0DCC000F0CA + A6000020400000206000002080000020A0000020C0000020E000004000000040 + 20000040400000406000004080000040A0000040C0000040E000006000000060 + 20000060400000606000006080000060A0000060C0000060E000008000000080 + 20000080400000806000008080000080A0000080C0000080E00000A0000000A0 + 200000A0400000A0600000A0800000A0A00000A0C00000A0E00000C0000000C0 + 200000C0400000C0600000C0800000C0A00000C0C00000C0E00000E0000000E0 + 200000E0400000E0600000E0800000E0A00000E0C00000E0E000400000004000 + 20004000400040006000400080004000A0004000C0004000E000402000004020 + 20004020400040206000402080004020A0004020C0004020E000404000004040 + 20004040400040406000404080004040A0004040C0004040E000406000004060 + 20004060400040606000406080004060A0004060C0004060E000408000004080 + 20004080400040806000408080004080A0004080C0004080E00040A0000040A0 + 200040A0400040A0600040A0800040A0A00040A0C00040A0E00040C0000040C0 + 200040C0400040C0600040C0800040C0A00040C0C00040C0E00040E0000040E0 + 200040E0400040E0600040E0800040E0A00040E0C00040E0E000800000008000 + 20008000400080006000800080008000A0008000C0008000E000802000008020 + 20008020400080206000802080008020A0008020C0008020E000804000008040 + 20008040400080406000804080008040A0008040C0008040E000806000008060 + 20008060400080606000806080008060A0008060C0008060E000808000008080 + 20008080400080806000808080008080A0008080C0008080E00080A0000080A0 + 200080A0400080A0600080A0800080A0A00080A0C00080A0E00080C0000080C0 + 200080C0400080C0600080C0800080C0A00080C0C00080C0E00080E0000080E0 + 200080E0400080E0600080E0800080E0A00080E0C00080E0E000C0000000C000 + 2000C0004000C0006000C0008000C000A000C000C000C000E000C0200000C020 + 2000C0204000C0206000C0208000C020A000C020C000C020E000C0400000C040 + 2000C0404000C0406000C0408000C040A000C040C000C040E000C0600000C060 + 2000C0604000C0606000C0608000C060A000C060C000C060E000C0800000C080 + 2000C0804000C0806000C0808000C080A000C080C000C080E000C0A00000C0A0 + 2000C0A04000C0A06000C0A08000C0A0A000C0A0C000C0A0E000C0C00000C0C0 + 2000C0C04000C0C06000C0C08000C0C0A000F0FBFF00A4A0A000808080000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00FDFD25252525 + 2525252525252525FDFDFD2E25FFFFFFFFFFFFFFFFFFFF25FDFDFD2525252525 + 2525252525252525FDFD9A9AB7B7B7B7B7B7B7B7B7B72525FDFDFD25B7B7B7B7 + B7B7B7B7B7B72525FDFD9A9AB7B7B7B7B7B7B7B7B7B72525FDFDFD25BFB7BFBF + B7B7B7B7B7B72525FDFD9A9ABFBFBFB7BFBFB7B7B7B72525FDFDFD25BFBFBFBF + BFB7BFBFB7B72525FDFD9A9ABFBFBFB7BFBFBFB7BFB72525FDFDFD25BFBFBFBF + BFBFBFBFBFB72525FDFD9A9ABFBFBFBFBFB7BFBFB7B72525FDFDFD25BFBFBFBF + BFBFBFBFBFB72525FDFD9A9ABFBFBFBFBFBFBFBFBFB725FDFDFDFD2525252525 + 25252525252525FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD} + BorderColor = 16765615 + BorderStyle = bsNone + ClipboardFormats = [cfText, cfRTF] + CodeFolding.Enabled = True + CodeFolding.LineColor = clTeal + CodeFolding.ExpandGlyph.Data = { + 06050000424D060500000000000036040000280000000D0000000D0000000100 + 080000000000D000000000000000000000000001000000000000000000000000 + 80000080000000808000800000008000800080800000C0C0C000C0DCC000F0CA + A6000020400000206000002080000020A0000020C0000020E000004000000040 + 20000040400000406000004080000040A0000040C0000040E000006000000060 + 20000060400000606000006080000060A0000060C0000060E000008000000080 + 20000080400000806000008080000080A0000080C0000080E00000A0000000A0 + 200000A0400000A0600000A0800000A0A00000A0C00000A0E00000C0000000C0 + 200000C0400000C0600000C0800000C0A00000C0C00000C0E00000E0000000E0 + 200000E0400000E0600000E0800000E0A00000E0C00000E0E000400000004000 + 20004000400040006000400080004000A0004000C0004000E000402000004020 + 20004020400040206000402080004020A0004020C0004020E000404000004040 + 20004040400040406000404080004040A0004040C0004040E000406000004060 + 20004060400040606000406080004060A0004060C0004060E000408000004080 + 20004080400040806000408080004080A0004080C0004080E00040A0000040A0 + 200040A0400040A0600040A0800040A0A00040A0C00040A0E00040C0000040C0 + 200040C0400040C0600040C0800040C0A00040C0C00040C0E00040E0000040E0 + 200040E0400040E0600040E0800040E0A00040E0C00040E0E000800000008000 + 20008000400080006000800080008000A0008000C0008000E000802000008020 + 20008020400080206000802080008020A0008020C0008020E000804000008040 + 20008040400080406000804080008040A0008040C0008040E000806000008060 + 20008060400080606000806080008060A0008060C0008060E000808000008080 + 20008080400080806000808080008080A0008080C0008080E00080A0000080A0 + 200080A0400080A0600080A0800080A0A00080A0C00080A0E00080C0000080C0 + 200080C0400080C0600080C0800080C0A00080C0C00080C0E00080E0000080E0 + 200080E0400080E0600080E0800080E0A00080E0C00080E0E000C0000000C000 + 2000C0004000C0006000C0008000C000A000C000C000C000E000C0200000C020 + 2000C0204000C0206000C0208000C020A000C020C000C020E000C0400000C040 + 2000C0404000C0406000C0408000C040A000C040C000C040E000C0600000C060 + 2000C0604000C0606000C0608000C060A000C060C000C060E000C0800000C080 + 2000C0804000C0806000C0808000C080A000C080C000C080E000C0A00000C0A0 + 2000C0A04000C0A06000C0A08000C0A0A000C0A0C000C0A0E000C0C00000C0C0 + 2000C0C04000C0C06000C0C08000C0C0A000F0FBFF00A4A0A000808080000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00FFF608080808 + 0808080808F6FF000000F64049494949494949494940F60000000849F6F6F6F6 + FFF6F6F6F649F60000000849F6FFFF074907FFFFF649080000000849F6FFFF07 + 0007FFFFF649080000000849F60707F740F70707F649080000000849FF490040 + 40400049FF49080000000849F60707F740F70707F649080000000849F6FFFF07 + 0007FFFFF649080000000849F6FFFF074907FFFFF649080000000849F6F6F6F6 + F6F6F6F6F64908000000F64049494949494949494940F6000000FFF6F6F6F6F6 + F6F6F6F6F6F6FF000000} + CodeFolding.CollapsedGlyph.Data = { + 06050000424D060500000000000036040000280000000D0000000D0000000100 + 080000000000D000000000000000000000000001000000000000000000000000 + 80000080000000808000800000008000800080800000C0C0C000C0DCC000F0CA + A6000020400000206000002080000020A0000020C0000020E000004000000040 + 20000040400000406000004080000040A0000040C0000040E000006000000060 + 20000060400000606000006080000060A0000060C0000060E000008000000080 + 20000080400000806000008080000080A0000080C0000080E00000A0000000A0 + 200000A0400000A0600000A0800000A0A00000A0C00000A0E00000C0000000C0 + 200000C0400000C0600000C0800000C0A00000C0C00000C0E00000E0000000E0 + 200000E0400000E0600000E0800000E0A00000E0C00000E0E000400000004000 + 20004000400040006000400080004000A0004000C0004000E000402000004020 + 20004020400040206000402080004020A0004020C0004020E000404000004040 + 20004040400040406000404080004040A0004040C0004040E000406000004060 + 20004060400040606000406080004060A0004060C0004060E000408000004080 + 20004080400040806000408080004080A0004080C0004080E00040A0000040A0 + 200040A0400040A0600040A0800040A0A00040A0C00040A0E00040C0000040C0 + 200040C0400040C0600040C0800040C0A00040C0C00040C0E00040E0000040E0 + 200040E0400040E0600040E0800040E0A00040E0C00040E0E000800000008000 + 20008000400080006000800080008000A0008000C0008000E000802000008020 + 20008020400080206000802080008020A0008020C0008020E000804000008040 + 20008040400080406000804080008040A0008040C0008040E000806000008060 + 20008060400080606000806080008060A0008060C0008060E000808000008080 + 20008080400080806000808080008080A0008080C0008080E00080A0000080A0 + 200080A0400080A0600080A0800080A0A00080A0C00080A0E00080C0000080C0 + 200080C0400080C0600080C0800080C0A00080C0C00080C0E00080E0000080E0 + 200080E0400080E0600080E0800080E0A00080E0C00080E0E000C0000000C000 + 2000C0004000C0006000C0008000C000A000C000C000C000E000C0200000C020 + 2000C0204000C0206000C0208000C020A000C020C000C020E000C0400000C040 + 2000C0404000C0406000C0408000C040A000C040C000C040E000C0600000C060 + 2000C0604000C0606000C0608000C060A000C060C000C060E000C0800000C080 + 2000C0804000C0806000C0808000C080A000C080C000C080E000C0A00000C0A0 + 2000C0A04000C0A06000C0A08000C0A0A000C0A0C000C0A0E000C0C00000C0C0 + 2000C0C04000C0C06000C0C08000C0C0A000F0FBFF00A4A0A000808080000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00FFF608080808 + 0808080808F6FF000000F64049494949494949494940F60000000849F6F6F6F6 + F6F6F6F6F649F60000000849F6FFFFFFFFFFFFFFF649080000000849F6FFFFFF + FFFFFFFFF649080000000849F607070707070707F649080000000849FF490000 + 00000049FF49080000000849F607070707070707F649080000000849F6FFFFFF + FFFFFFFFF649080000000849F6FFFFFFFFFFFFFFF649080000000849F6F6F6F6 + F6F6F6F6F64908000000F64049494949494949494940F6000000FFF6F6F6F6F6 + F6F6F6F6F6F6FF000000} + Ctl3D = False + DelErase = True + EnhancedHomeKey = False + Gutter.Font.Charset = DEFAULT_CHARSET + Gutter.Font.Color = clWindowText + Gutter.Font.Height = -13 + Gutter.Font.Name = 'Courier New' + Gutter.Font.Style = [] + Gutter.BorderColor = 16765615 + Gutter.GutterColor = 14722429 + Gutter.GutterColorTo = 16572875 + Gutter.ModifiedColorBkg = clGreen + Gutter.ModifiedColor = clBlue + Gutter.ShowModified = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -13 + Font.Name = 'COURIER NEW' + Font.Style = [] + HiddenCaret = False + Lines.Strings = ( + '') + MarkerList.UseDefaultMarkerImageIndex = False + MarkerList.DefaultMarkerImageIndex = -1 + MarkerList.ImageTransparentColor = 33554432 + OleDropTarget = [] + PrintOptions.MarginLeft = 0 + PrintOptions.MarginRight = 0 + PrintOptions.MarginTop = 0 + PrintOptions.MarginBottom = 0 + PrintOptions.PageNr = False + PrintOptions.PrintLineNumbers = False + RightMarginColor = 14869218 + ScrollHint = False + SelColor = clWhite + SelBkColor = clHighlight + ShowRightMargin = True + SmartTabs = False + SyntaxStyles = Styler + TabOrder = 0 + TabStop = True + TrimTrailingSpaces = False + UILanguage.ScrollHint = 'Row' + UILanguage.Undo = 'Undo' + UILanguage.Redo = 'Redo' + UILanguage.Copy = 'Copy' + UILanguage.Cut = 'Cut' + UILanguage.Paste = 'Paste' + UILanguage.Delete = 'Delete' + UILanguage.SelectAll = 'Select All' + UrlAware = False + UrlStyle.TextColor = clBlue + UrlStyle.BkColor = clWhite + UrlStyle.Style = [fsUnderline] + UseStyler = True + Version = '3.7.6.0' + WordWrap = wwNone + OnDragOver = EditorDragOver + OnDragDrop = EditorDragDrop + OnGetAutoCompletionList = EditorGetAutoCompletionList + OnChange = EditorChange + end + end + object Console: TMemo + Left = 0 + Top = 377 + Width = 583 + Height = 89 + Align = alBottom + Constraints.MinHeight = 20 + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 3 + end + object Panel1: TPanel + Left = 0 + Top = 0 + Width = 123 + Height = 373 + Hint = 'Select a block and drag it into the Script editor' + Align = alLeft + AutoSize = True + Caption = 'Panel1' + ParentShowHint = False + ShowHint = True + TabOrder = 4 + Visible = False + object ScrCodeList1: TScrCodeList + Left = 1 + Top = 1 + Width = 121 + Height = 371 + ParentCustomHint = False + SyntaxStyles = Styler + Align = alLeft + CodeBlocks = < + item + Code.Strings = ( + 'with Transform do' + 'begin' + 'end;') + end + item + Code.Strings = ( + 'with Flame do ' + 'begin' + ' // 3D-rotation' + ' Pitch := ; // around X-axis' + ' Yaw := ; // around Z-axis' + ' Roll := ; // around Y-axis' + ' Z := ; // camera height' + ' Perspective := ;' + 'end;') + end + item + Code.Strings = ( + 'for i:=0 to N do' + 'begin' + 'end;') + end + item + Code.Strings = ( + 'if () then begin' + ' // instructions' + 'end else begin' + '' + 'end;') + end + item + Code.Strings = ( + 'case () of' + ' : ; // n1: action1;' + ' : ; // n2: action2;' + 'else // action' + 'end;') + end + item + Code.Strings = ( + 'while () do begin' + ' // instructions' + 'end;') + end + item + Code.Strings = ( + 'try' + 'except' + 'end;') + end + item + Code.Strings = ( + 'repeat' + ' // instructions' + 'until ();') + end + item + Code.Strings = ( + 'function Fn(): variant;' + 'begin' + ' Result := ;' + 'end;') + end + item + Code.Strings = ( + 'procedure Pr();' + 'begin' + 'end;') + end + item + Code.Strings = ( + 'if not ' + 'InputQuery('#39' '#39', '#39' '#39', )' + 'then Exit;') + end + item + Code.Strings = ( + 'if () then' + ' // action' + 'else if () then ' + ' // action' + 'else ;') + end + item + Caption = 'Task Dialog' + Code.Strings = ( + 'try' + 'tdlg := TTaskDialog.Create(nil);' + 'tdlg.Title := '#39'User'#39#39's Dialog'#39';' + 'tdlg.Caption := '#39'Apophysis'#39'; ' + 'tdlg.Flags := [tfUseHiconMain]; ' + 'tdlg.CustomMainIcon := Apophysis.Icon; ' + + '// tdlg.CustomMainIcon := Screen.ActiveForm.Icon; ' + + ' ' + 'tdlg.Text := '#39'A question for the user: '#39';' + + 'tdlg.RadioButtons.Add.Caption := '#39'First variant'#39'; ' + + ' ' + 'tdlg.RadioButtons.Add.Caption := '#39'Second variant'#39';' + 'tdlg.CommonButtons := [tcbOK, tcbCancel]; ' + 'tdlg.Execute;' + 'if tdlg.ModalResult = mrCancel then ' + 'begin' + '{ instructions for the Cancel button } ' + 'end else { instructions for the OK button } ' + ' case tdlg.RadioButton.ID of ' + ' 0: begin' + ' { instructions for the 1-st variant } ' + ' end; ' + ' 1: begin' + ' { instructions for the 2-nd variant } ' + ' end;' + ' end; // end case' + 'tdlg.Free;' + 'except' + 'MessageDlg('#39'This dialog type is not supported.'#39', mtError, 4, 0);' + 'exit;' + 'end; ') + end + item + Caption = 'Dialog with Links' + Code.Strings = ( + 'try' + 'tdlg := TTaskDialog.Create(nil);' + 'tdlg.Title := '#39'User'#39#39's Dialog'#39';' + 'tdlg.Caption := '#39'Apophysis'#39'; ' + 'tdlg.Flags := [tfUseCommandLinks, tfExpandFooterArea];' + 'tdlg.MainIcon := tdiInformation; ' + '// tdlg.MainIcon := tdiShield;' + 'tdlg.ExpandedText := '#39'Additional text'#39'; ' + 'tdlg.ExpandButtonCaption := '#39'More...'#39'; ' + 'tdlg.Text := '#39'Text message or a question'#39';' + 'btn := tdlg.Buttons.Add;' + 'btn.Caption := '#39'1'#39';' + 'btn.CommandLinkHint:= '#39'First variant'#39';' + 'btn := tdlg.Buttons.Add;' + 'btn.Caption := '#39'2'#39';' + 'btn.CommandLinkHint:= '#39'Another variant'#39';' + 'tdlg.CommonButtons := [tcbCancel]; ' + 'tdlg.Execute;' + 'case tdlg.ModalResult of ' + ' 100: begin' + ' { instructions for the 1-st button } ' + ' end; ' + ' 101: begin' + ' { instructions for the 2-nd button } ' + ' end;' + ' mrCancel: begin' + + ' { instructions for the Cancel button } ' + + ' ' + ' end;' + 'end;' + 'tdlg.Free;' + 'except' + 'MessageDlg('#39'This dialog type is not supported.'#39', mtError, 4, 0);' + 'exit;' + 'end; ') + end> + CodeBlockColor = clWhite + CodeBlockColorTo = clMoneyGreen + CodeBlockSelectColor = clSkyBlue + CodeBlockSelectColorTo = clHotLight + CodeBlockCaptionColor = 8238973 + CodeBorderColor = clHighlight + CodeBorderSelectColor = clBlue + CodeBorderWidth = 2 + CodeIndent = 1 + DragMode = dmAutomatic + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + IntegralHeight = True + ItemHeight = 48 + ItemStyle = isVariableHeight + ParentFont = False + ParentShowHint = False + PopupMenu = CodeBlockPopup + ShowHint = False + TabOrder = 0 + UseStyler = True + Version = '3.1.0.2' + OnContextPopup = ScrCodeList1ContextPopup + OnDragDrop = ScrCodeList1DragDrop + OnDragOver = ScrCodeList1DragOver + OnBlockDblClick = ScrCodeList1BlockDblClick + OnBlockRightClick = ScrCodeList1BlockRightClick + end + end + object MainOpenDialog: TOpenDialog + DefaultExt = 'asc' + Filter = 'Apophysis Script Files (*.asc)|*.asc|Text files (*.txt)|*.txt' + Options = [ofHideReadOnly, ofFileMustExist, ofEnableSizing] + Left = 290 + Top = 239 + end + object MainSaveDialog: TSaveDialog + DefaultExt = 'asc' + Filter = 'Apophysis Script Files (*.asc)|*.asc|Text files (*.txt)|*.txt' + Options = [ofOverwritePrompt, ofHideReadOnly, ofEnableSizing] + Left = 280 + Top = 56 + end + object PopupMenu: TPopupMenu + Images = MainForm.Buttons + Left = 360 + Top = 56 + object mnuUndo: TMenuItem + Caption = 'Undo' + ImageIndex = 4 + OnClick = mnuUndoClick + end + object mnuRedo: TMenuItem + Caption = 'Redo' + ImageIndex = 5 + OnClick = mnuRedoClick + end + object N1: TMenuItem + Caption = '-' + end + object mnuCut: TMenuItem + Caption = 'Cut' + ImageIndex = 6 + ShortCut = 16472 + OnClick = mnuCutClick + end + object mnuCopy: TMenuItem + Caption = 'Copy' + ImageIndex = 7 + ShortCut = 16451 + OnClick = mnuCopyClick + end + object mnuPaste: TMenuItem + Caption = 'Paste' + ImageIndex = 8 + ShortCut = 16470 + OnClick = mnuPasteClick + end + object N2: TMenuItem + Caption = '-' + end + object FindReplace: TMenuItem + Caption = 'Find and replace' + ImageIndex = 39 + OnClick = FindReplaceClick + end + object N4: TMenuItem + Caption = '-' + end + object CommentOut: TMenuItem + Caption = 'Comment out the selection by...' + object N5: TMenuItem + Caption = '{ ... }' + OnClick = SurroundByClick + end + object N6: TMenuItem + Caption = '(* ... *)' + OnClick = SurroundByClick + end + object N7: TMenuItem + Caption = '// ...' + OnClick = SurroundByClick + end + end + object SurroundBlock: TMenuItem + Caption = 'Surround the selection by...' + object BeginEnd1: TMenuItem + Caption = 'begin ... end' + OnClick = SurroundByClick + end + object TryExcept1: TMenuItem + Caption = 'try ... except' + OnClick = SurroundByClick + end + end + object N3: TMenuItem + Caption = '-' + end + object ShowCodeHints: TMenuItem + AutoCheck = True + Caption = 'Show hints for code blocks' + OnClick = ShowCodeHintsClick + end + object AddFromClipboard: TMenuItem + Caption = 'Add code blocks from clipboard' + OnClick = AddFromClipboardClick + end + object N8: TMenuItem + Caption = '-' + end + object CollapseBlocks: TMenuItem + Caption = 'Collapse all blocks of code' + OnClick = CollapseBlocksClick + end + object ExpandBlocks: TMenuItem + Caption = 'Expand all blocks of code' + OnClick = ExpandBlocksClick + end + end + object Scripter: TatPascalScripter + SourceCode.Strings = ( + '') + SaveCompiledCode = False + OnCompileError = ScripterCompileError + OnRuntimeError = ScripterRuntimeError + ShortBooleanEval = True + LibOptions.SearchPath.Strings = ( + '$(APPDIR)\Scripts' + '$(APPDIR)' + '$(CURDIR)') + LibOptions.SourceFileExt = '.asc' + LibOptions.CompiledFileExt = '.pcu' + LibOptions.FormFileExt = '.afm' + LibOptions.UseScriptFiles = True + CallExecHookEvent = False + Left = 480 + Top = 200 + end + object OpenDialog: TOpenDialog + DefaultExt = 'flame' + Filter = + 'Flame files (*.flame)|*.flame|Apophysis 1.0 parameters (*.apo;*.' + + 'fla)|*.apo;*.fla|All files (*.*)|*.*' + Options = [ofHideReadOnly, ofFileMustExist, ofEnableSizing] + Left = 283 + Top = 173 + end + object SaveDialog: TSaveDialog + DefaultExt = 'flame' + Filter = 'Flame files (*.flame)|*.flame' + Options = [ofOverwritePrompt, ofHideReadOnly, ofPathMustExist, ofEnableSizing] + Left = 278 + Top = 111 + end + object Styler: TScrPascalMemoStyler + AutoBlockEnd = True + BlockStart = 'begin,try,case,class,record' + BlockEnd = 'end' + LineComment = '//' + MultiCommentLeft = '{' + MultiCommentRight = '}' + CommentStyle.TextColor = clNavy + CommentStyle.BkColor = clWhite + CommentStyle.Style = [fsItalic] + NumberStyle.TextColor = clFuchsia + NumberStyle.BkColor = clWhite + NumberStyle.Style = [fsBold] + HighlightStyle.TextColor = clWhite + HighlightStyle.BkColor = 3487231 + HighlightStyle.Style = [fsBold] + AllStyles = < + item + KeyWords.Strings = ( + 'absolute' + 'abstract' + 'and' + 'array' + 'as' + 'asm' + 'assembler' + 'automated' + 'begin' + 'break' + 'case' + 'cdecl' + 'class' + 'class' + 'const' + 'constructor' + 'continue' + 'default' + 'deprecated' + 'destructor' + 'dispid' + 'dispinterface' + 'div' + 'do' + 'downto' + 'dynamic' + 'else' + 'end' + 'except' + 'exports' + 'external' + 'far' + 'file' + 'finalise' + 'finally' + 'for' + 'forward' + 'function' + 'if' + 'implementation' + 'in' + 'inherited' + 'initialise' + 'inline' + 'interface' + 'is' + 'label' + 'library' + 'message' + 'mod' + 'near' + 'nil' + 'not' + 'object' + 'of' + 'or' + 'out' + 'overload' + 'override' + 'packed' + 'pascal' + 'platform' + 'private' + 'procedure' + 'program' + 'program' + 'property' + 'protected' + 'public' + 'published' + 'raise' + 'record' + 'register' + 'reintroduce' + 'repeat' + 'resourcestring' + 'safecall' + 'set' + 'shl' + 'shr' + 'stdcall' + 'step' + 'stored' + 'string' + 'then' + 'threadvar' + 'to' + 'try' + 'type' + 'unit' + 'until' + 'uses' + 'var' + 'virtual' + 'while' + 'with' + 'xor') + Font.Charset = DEFAULT_CHARSET + Font.Color = clGreen + Font.Height = -11 + Font.Name = 'Courier New' + Font.Style = [fsBold] + BGColor = clWhite + StyleType = stKeyword + BracketStart = #0 + BracketEnd = #0 + Info = 'Pascal Standard Default' + end + item + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlue + Font.Height = -11 + Font.Name = 'Courier New' + Font.Style = [] + BGColor = clWhite + StyleType = stBracket + BracketStart = #39 + BracketEnd = #39 + Info = 'Simple Quote' + end + item + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlue + Font.Height = -11 + Font.Name = 'Courier New' + Font.Style = [] + BGColor = clWhite + StyleType = stBracket + BracketStart = '"' + BracketEnd = '"' + Info = 'Double Quote' + end + item + Font.Charset = DEFAULT_CHARSET + Font.Color = clRed + Font.Height = -11 + Font.Name = 'Courier New' + Font.Style = [] + BGColor = clWhite + StyleType = stSymbol + BracketStart = #0 + BracketEnd = #0 + Symbols = ' ,;:.(){}[]=+-*/^%<>#'#13#10 + Info = 'Symbols Delimiters' + end + item + CommentLeft = '(*' + CommentRight = '*)' + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -11 + Font.Name = 'Courier New' + Font.Style = [fsItalic] + BGColor = clWhite + StyleType = stComment + BracketStart = #0 + BracketEnd = #0 + end> + AutoCompletion.Strings = ( + 'procedure ShowMessage(TextMessage: string)' + 'function MessageDlg(Msg: string, DlgType, Buttons, 0): integer' + + 'function MessageBox(0, Prompt, Caption, DlgStyle: integer): inte' + + 'ger' + 'function InputBox(Caption, Prompt, Value: variant): variant' + + 'function InputQuery(Caption, Prompt, var Value: variant): boolea' + + 'n' + 'procedure Interpret(script: string)' + 'procedure RotateFlame(Degrees: double)' + 'procedure RotateReference(Degrees: double)' + 'procedure StoreFlame(index: integer)' + 'procedure GetFlame(FlameNumber: integer)' + 'procedure LoadFlame(FlameNumber: integer)' + 'var UpdateFlame: boolean' + 'var ActiveTransform: integer' + 'procedure SetActiveTransform(index: integer)' + 'var SelectedTransform: integer' + 'function Transforms: integer' + 'function FileCount: integer' + 'procedure AddTransform' + 'procedure DeleteTransform' + 'function DeleteFile(filename: string): boolean' + 'procedure CopyTransform' + 'procedure Clear' + 'procedure Preview' + 'procedure Render' + 'procedure Beep' + 'procedure MessageBeep(sound_type: integer)' + 'procedure Print(data: variant)' + 'procedure AddSymmetry(symmetry_type: integer)' + + 'procedure Morph(Flame1_Num: integer, Flame2_Num: integer, Speed:' + + ' double, interp_type: integer = 3)' + 'procedure SetRenderBounds' + 'procedure SetFlameFile(FlameFile_name: string)' + 'procedure ListFile(FlameFile_name: string)' + 'procedure SaveFlame(FlameFile_name: string)' + 'function GetFileName: string' + 'procedure ShowStatus(TextMessage: string)' + 'procedure RandomFlame(randomness_type: integer)' + 'procedure RandomGradient' + 'procedure PresetGradient(gradient_number: integer)' + 'procedure SaveGradient(Title: string, FileName: string)' + 'procedure SetVariation(var_index)' + 'const ProgramVersionString' + 'function VariationIndex(var_name: string): integer' + 'function VariationName(var_index: integer): string' + 'function VariableIndex(param_name: string): integer' + 'function VariableName(param_index: integer): string' + 'procedure CalculateScale' + 'procedure CalculateBounds' + 'procedure CalculateColors' + 'procedure CalculateWeights' + 'procedure CalculateColorSpeed' + 'procedure RandomizeColorSpeed' + 'procedure RandomizeColors' + 'procedure RandomizeWeights' + 'procedure NormalizeWeights' + 'procedure EqualizeWeights' + 'procedure NormalizeVars' + 'function GetSaveFileName: string' + 'function ExtractFilePath(full_filename: string): string' + 'function ExtractFileName(full_filename: string): string' + 'function ExtractFileExt(filename: string): string' + + 'function CopyFile(Source: string, Destination: string, keep_exis' + + 'ting: boolean = false): boolean' + + 'function RenameFile(Source: string, Destination: string): boolea' + + 'n' + 'procedure DeleteFile(full_filename: string)' + 'function FileExists(full_filename: string): boolean' + 'var CurrentFile: readonly' + 'function CreateDir(folder_name: string)' + 'class TStringList' + 'constructor Create' + + 'function Copy(source: string, start_pos, length: integer): strin' + + 'g' + 'class Renderer' + 'property Filename: string' + 'property Width: integer' + 'property Height: integer' + 'property MaxMemory: integer' + 'property EmbedParameters: boolean' + 'class Flame' + 'property Gamma: double' + 'property GammaThreshold: double' + 'property Brightness: double' + 'property Vibrancy: double' + 'property Contrast: double' + 'property Time: double' + 'property Zoom: double' + 'property Width: integer' + 'property Height: integer' + 'property PreviewWidth: integer' + 'property PreviewHeight: integer'#9' ' + 'property Angle: double' + 'property Pitch: double' + 'property Yaw: double' + 'property Roll: double' + 'property Perspective: double' + 'property SampleDensity: double' + 'property Quality: double' + 'property Oversample: double' + 'property FilterRadius: double' + 'property Scale: double' + 'property Hue: double' + 'property Gradient[][]: integer' + 'property Background[]: integer' + 'property Name: string' + 'property Batches: integer' + 'property FinalXformEnabled: boolean' + 'var LimitVibrancy: boolean' + 'var DateCode: readonly' + 'procedure DecodeDate(date, year, month, day)' + 'procedure DecodeTime(time, hour, minute, sec, millisec)' + 'function Now: TDateTime' + 'procedure Exit' + 'var Stopped: boolean' + 'class Transform' + 'property coefs[][]: double' + 'property post[][]: double' + 'property Color: double' + 'property VarColor: double' + 'property Opacity: double' + 'property PlotMode: integer' + 'property Weight: double' + 'property Symmetry: double' + 'property ColorSpeed: double' + 'property Chaos[]: double' + 'procedure RotatePXOrigin(Degrees: double)' + 'procedure RotatePX(Degrees: double)' + 'procedure ScalePX(Factor: double)' + 'procedure Scale(Factor: double)' + 'procedure Translate(X: double, Y: double)' + 'procedure Rotate(Degrees: double)' + + 'procedure Multiply(a00: double, a10: double, a01: double, a11: d' + + 'ouble)' + 'procedure TranslatePX(X: double, Y: double)' + + 'procedure MultiplyPX(a00: double, a10: double, a01: double, a11:' + + ' double)' + 'procedure FlipHoriz' + 'procedure FlipPXHoriz' + 'procedure FlipVert' + 'procedure FlipPXVert' + 'procedure RotateOrigin(Degrees: double)' + 'property Variation[]: double' + 'property Variable[]: double' + 'property postXformEnabled: boolean' + 'method SwapCoefs' + 'class Options' + 'property JPEGQuality: integer' + 'property BatchSize: integer' + 'var BatchIndex: integer' + 'property ParameterFile: string' + 'property Multithreading: integer' + 'property SmoothPaletteFile' + 'property NumTries' + 'property TryLength' + 'property ConfirmDelete' + 'property Transparency: integer' + 'property PreviewLowQuality' + 'property PreviewMediumQuality' + 'property PreviewHighQuality' + 'property MinTransforms: integer' + 'property MaxTransforms: integer' + 'property MutateMinTransforms: integer' + 'property MutateMaxTransforms: integer' + 'property RandomPrefix' + 'property KeepBackground: integer' + 'property SymmetryType: integer' + 'property SymmetryOrder: integer' + 'property Variations[]: boolean' + 'property GradientOnRandom: integer' + 'property GradientFileOnRandom: string' + 'property MinNodes: integer' + 'property MaxNodes: integer' + 'property MinHue: integer' + 'property MaxHue: integer' + 'property MinSaturation: integer' + 'property MaxSaturation: integer' + 'property MinLuminance: integer' + 'property MaxLuminance: integer' + 'property UPRSampleDensity' + 'property UPRFilterRadius' + 'property UPROversample' + 'property UPRAdjustDensity: boolean' + 'property UPRColoringIdent: string' + 'property UPRColoringFile: string' + 'property UPRFormulaFile: string' + 'property UPRFormulaIdent: string' + 'property UPRWidth: integer' + 'property UPRHeight: integer' + 'property ExportRenderer: string' + 'property EvenGradientStripes: boolean' + 'property ColorBlending: integer' + 'class Pivot' + 'property Mode: integer' + 'procedure Set(X: double, Y: double)' + 'procedure Reset' + 'keyword for' + 'keyword begin' + 'keyword end' + 'keyword and' + 'keyword repeat' + 'keyword until' + 'keyword while' + 'keyword with' + 'keyword case' + 'keyword try' + 'keyword except' + 'keyword finally' + 'keyword downto' + 'keyword step' + 'keyword procedure' + 'keyword function' + 'const True' + 'const False' + 'keyword div' + 'keyword mod' + 'keyword uses' + 'unit System' + 'unit Dialogs' + 'unit Windows' + 'function random: double' + + 'function RandomRange(startnum: integer, lastnum: integer): integ' + + 'er' + 'function Round(value: double): integer' + 'function Trunc(value: double): integer' + 'function abs(value: double): double' + 'function sqrt(value: double): double' + 'function Int(value: double): double' + 'function DegToRad(Degrees: double): double' + 'function RadToDeg(Radians: double): double' + 'function VarToStr(value: variant): string' + 'function IntToStr(num: integer): string' + 'function FloatToStr(num: double): string' + 'function StrToInt(num: variant): integer' + 'function StrToFloat(num: variant): double' + 'function Length(str: string): integer' + 'function Trim(str: string): string' + 'function AnsiLowerCase(str: string): string' + 'function AnsiUpperCase(str: string): string' + 'function Pos(substr: string, str: string): integer' + 'function Copy(str: string, index: integer, len: integer): string' + 'procedure Delete(str: string, index: integer, len: integer)' + 'function Format(settings: string,[values]): string' + + 'function FormatDateTime(settings: string, date: TDateTime): stri' + + 'ng' + + 'function VarArrayCreate([array_indexes: integer], data_type): ar' + + 'ray' + 'function hypot(X: double, Y: double): double' + 'function ArcTan2(Y: double, X: double): double' + 'function ArcSin(X: double): double' + 'function ArcCos(X: double): double' + 'procedure Dec(num: integer)' + 'procedure Inc(num: integer)' + 'function Odd(num: integer): boolean' + 'function StringOfChar(symbol: char, count: integer): string' + 'function GetEnvironmentVariable(sys_const: string): string;' + 'const PI' + 'const NVARS' + 'const NumVariables' + 'const NXFORMS' + 'const INSTALLPATH' + 'const SYM_NONE' + 'const SYM_BILATERAL' + 'const SYM_ROTATIONAL' + 'const SYM_DIHEDRAL' + 'const NMAPS' + 'const V_RANDOM = -1' + 'const V_LINEAR = 0' + 'unit Classes' + 'unit Forms' + 'const mrOK' + 'const mrCancel' + 'const mrYes' + 'const mrNo' + 'const mrRetry' + 'const mrClose' + 'object Apophysis : TApplication' + 'method SwapVariations(var1_name, var2_name: string)' + 'method SortVariationsByName' + 'method SortVariationsByIndex' + 'method PrintVariationsOrder' + 'method CopyVariationsOrder(transform_index: integer)' + 'method SetVariationOrder(var_name, index: integer)' + 'function GetVariationOrder(var_name: string): integer' + 'class TTaskDialog' + 'const tcbClose' + 'const tcbRetry' + 'const tcbNo' + 'const tcbYes' + 'const tcbOK' + 'const tcbCancel' + 'const tdiNone' + 'const tdiWarning' + 'const tdiError' + 'const tdiInformation' + 'const tdiShield' + 'const mtWarning' + 'const mtError' + 'const mtInformation' + 'const mtConfirmation' + 'const mtCustom' + 'const tfUseCommandLinks' + 'const tfVerificationFlagChecked' + 'const tfUseHiconMain' + 'const tfExpandFooterArea' + 'const tfExpandedByDefault' + 'const tfAllowDialogCancellation' + 'const tfUseHiconFooter' + 'const tfNoDefaultRadioButton' + 'const tfCanBeMinimized' + 'const tfShowProgressBar' + 'const tfShowMarqueeProgressBar' + 'const tfCallbackTimer' + 'const tfPositionRelativeToWindow' + 'const pbsNormal' + 'const pbsError' + 'const pbsPaused' + 'const BLEND_RGB' + 'const BLEND_HSV' + 'const BLEND_NONE') + HintParameter.TextColor = clBlack + HintParameter.BkColor = clInfoBk + HintParameter.HintCharStart = '(' + HintParameter.HintCharEnd = ')' + HintParameter.HintCharDelimiter = ';' + HintParameter.HintClassDelimiter = '.' + HintParameter.HintCharWriteDelimiter = ',' + HintParameter.Parameters.Strings = ( + 'ShowMessage(TextMessage: string);' + + 'MessageDlg(const Msg: string; DlgType: TMsgDlgType; Buttons: TMs' + + 'gDlgButtons; HelpCtx: Longint): Integer;' + + 'InputQuery(const Caption: string, const Prompt: string, var Valu' + + 'e: variant): boolean' + + 'InputBox(const Caption: string, const Prompt: string, const Defa' + + 'ultValue: variant): variant' + 'DeleteFile(const filename: string);' + 'RotateFlame(Degress: double)' + 'RotateReference(Degress: double)' + 'Rotate(Degrees: double)' + 'RotatePX(Degrees: double)' + 'RotateOrigin(Degrees: double)' + 'RotatePXOrigin(Degrees: double)' + 'Multiply(a00: double, a10: double, a01: double, a11: double)' + 'MultiplyPX(a00: double, a10: double, a01: double, a11: double)' + 'StoreFlame(FlameNumber: integer)' + 'GetFlame(FlameNumber: integer)' + 'LoadFlame(FlameNumber: integer)' + 'Scale(Factor: double)' + 'ScalePX(Factor: double)' + 'Translate(X: double, Y: double)' + 'TranslatePX(X: double, Y: double)' + 'SetActiveTransform(TransformNumber: integer)' + 'Print(data: variant)' + 'RandomRange(startnum: integer, lastnum: integer): integer' + 'Round(value: double): integer' + 'Trunc(value: double): integer' + 'abs(value: double): double' + 'sqrt(value: double): double' + 'Int(value: double): double' + 'DegToRad(Degrees: double): double' + 'RadToDeg(Radians: double): double' + 'VarToStr(value: variant): string' + 'IntToStr(num: integer): string' + 'FloatToStr(num: double): string' + 'StrToInt(num: variant): integer' + 'StrToFloat(num: variant): double' + 'sin(Radians: double)' + 'sin(Radians: double)' + 'ArcTan2(Y: double, X: double)' + 'hypot(X: double, Y: double)' + 'power(number: double, num_power: double)' + 'FormatDateTime(format_settings: string, date: TDateTime): string' + 'Format(format_settings: string,[values: variant_array]): string' + + 'DecodeDate(date: TDateTime, year: integer, month: integer, day: ' + + 'integer)' + + 'DecodeTime(time: TDateTime, hour: integer, minute: integer, seco' + + 'nd: integer, millisecond: integer)' + + 'VarArrayCreate([array_low_index: integer, array_high_index: inte' + + 'ger ], data_type: integer)' + 'AddSymmetry(symmetry_type: integer)' + + 'Morph(Flame1_Number: integer, Flame2_Number: integer, Speed: dou' + + 'ble, interp_type: integer = 3)' + 'SetFlameFile(const filename: string)' + 'ListFile(const filename: string)' + 'SaveFlame(const filename: string)' + 'ShowStatus(TextMessage: string)' + 'RandomFlame(randomness_type: integer)' + 'SaveGradient(Title: string, FileName: string)' + 'SetVariation(Number: integer)' + 'VariationIndex(var_name: string): integer' + 'VariationName(var_index: integer): string' + + 'CopyFile(Source: string, Destination: string, keep_existing: boo' + + 'lean = false)' + 'LoadFromFile(full_filename: string)' + 'SaveToFile(full_filename: string)' + 'Add(text: string): integer' + 'IndexOf(text_string: string): integer' + 'Delete(string_index: integer)' + 'MessageBox(0, Prompt, Caption, DlgStyle: integer): integer' + 'InputBox(Caption, Prompt, Value: variant): variant' + 'Copy(source: string, start_pos, length: integer): string') + HexIdentifier = '$' + Description = 'Pascal' + Filter = 'Pascal Files (*.pas,*.dpr,*.dpk,*.inc)|*.pas;*.dpr;*.dpk;*.inc' + DefaultExtension = '.pas' + StylerName = 'Pascal' + Extensions = 'pas;dpr;dpk;inc' + RegionDefinitions = < + item + Identifier = 'procedure' + RegionStart = 'begin' + RegionEnd = 'end' + RegionType = rtClosed + ShowComments = False + end + item + Identifier = 'constructor' + RegionStart = 'begin' + RegionEnd = 'end' + RegionType = rtClosed + ShowComments = False + end + item + Identifier = 'destructor' + RegionStart = 'begin' + RegionEnd = 'end' + RegionType = rtClosed + ShowComments = False + end + item + Identifier = 'interface' + RegionStart = 'interface' + RegionType = rtOpen + ShowComments = False + end + item + Identifier = 'unit' + RegionStart = 'unit' + RegionType = rtFile + ShowComments = False + end + item + Identifier = 'implementation' + RegionStart = 'implementation' + RegionType = rtOpen + ShowComments = False + end + item + Identifier = 'case' + RegionStart = 'case' + RegionEnd = 'end' + RegionType = rtIgnore + ShowComments = False + end + item + Identifier = 'try' + RegionStart = 'try' + RegionEnd = 'end' + RegionType = rtIgnore + ShowComments = False + end + item + Identifier = 'function' + RegionStart = 'begin' + RegionEnd = 'end' + RegionType = rtClosed + ShowComments = False + end + item + Identifier = '{$region' + RegionStart = '{$region' + RegionEnd = '{$endregion' + RegionType = rtClosed + ShowComments = False + end> + Left = 472 + Top = 264 + end + object ScrMemoFindReplaceDialog1: TScrMemoFindReplaceDialog + AutoHighlight = True + NotFoundMessage = 'Text not found' + AdvMemo = Editor + Options = [frDown] + Left = 283 + Top = 8 + end + object CodeBlockPopup: TPopupMenu + Left = 376 + Top = 112 + object mnuDeleteBlock: TMenuItem + Caption = 'Delete' + OnClick = mnuDeleteBlockClick + end + object Editcaption1: TMenuItem + Caption = 'Edit caption...' + OnClick = Editcaption1Click + end + end +end diff --git a/Forms/ScriptForm.pas b/Forms/ScriptForm.pas new file mode 100644 index 0000000..becf428 --- /dev/null +++ b/Forms/ScriptForm.pas @@ -0,0 +1,5913 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} +unit ScriptForm; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + ExtCtrls, StdCtrls, ControlPoint, Buttons, ComCtrls, ToolWin, Menus, + XFormMan, XForm, GradientHlpr, cmap,LibXmlParser, LibXmlComps, Math, Translation, + atScript, atPascal, ScripterInit, ScrMemo, Scrmps, ScrCodeList; + +const + NCPS = 10; // AV: max number of flames for animation + scriptFavsFilename = 'scriptsAV.fav'; + +type + TOptions = class + public + end; + TFlame = class + public + end; + TScriptRender = class + public + MaxMemory, Width, Height: integer; + Filename: string; + EmbedParameters: boolean; // AV: to write flame params into PNG + end; + TPivot = class + public + end; + TScriptEditor = class(TForm) + MainOpenDialog: TOpenDialog; + MainSaveDialog: TSaveDialog; + ToolBar: TToolBar; + btnOpen: TToolButton; + btnSave: TToolButton; + btnRun: TToolButton; + StatusBar: TStatusBar; + btnNew: TToolButton; + PopupMenu: TPopupMenu; + mnuCut: TMenuItem; + mnuCopy: TMenuItem; + mnuPaste: TMenuItem; + mnuUndo: TMenuItem; + N1: TMenuItem; + BackPanel: TPanel; + Editor: TScrMemo; + Scripter: TatPascalScripter; + Splitter1: TSplitter; + Console: TMemo; + btnStop: TToolButton; + btnBreak: TToolButton; + OpenDialog: TOpenDialog; + SaveDialog: TSaveDialog; + Styler: TScrPascalMemoStyler; + Panel1: TPanel; + ScrCodeList1: TScrCodeList; + CodeButton: TToolButton; + btnPause: TToolButton; + ScrMemoFindReplaceDialog1: TScrMemoFindReplaceDialog; + FindReplace: TMenuItem; + N2: TMenuItem; + ShowCodeHints: TMenuItem; + N3: TMenuItem; + CommentOut: TMenuItem; + N4: TMenuItem; + N5: TMenuItem; + N6: TMenuItem; + SurroundBlock: TMenuItem; + N7: TMenuItem; + BeginEnd1: TMenuItem; + TryExcept1: TMenuItem; + mnuRedo: TMenuItem; + AddFromClipboard: TMenuItem; + CodeBlockPopup: TPopupMenu; + mnuDeleteBlock: TMenuItem; + Editcaption1: TMenuItem; + btnFavorite: TToolButton; + N8: TMenuItem; + CollapseBlocks: TMenuItem; + ExpandBlocks: TMenuItem; + procedure F2SXMLStartTag(Sender: TObject; TagName: string; + Attributes: TAttrList); + procedure F2SXMLEndTag(Sender: TObject; TagName: string); + procedure F2SXMLEmptyTag(Sender: TObject; TagName: string; + Attributes: TAttrList); + procedure F2SXMLContent(Sender: TObject; Content: string); + // procedure FormShortCut(var Msg: TWMKey; var Handled: Boolean); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure btnOpenClick(Sender: TObject); + procedure btnSaveClick(Sender: TObject); + procedure btnRunClick(Sender: TObject); + procedure btnNewClick(Sender: TObject); + procedure mnuCutClick(Sender: TObject); + procedure mnuCopyClick(Sender: TObject); + procedure mnuPasteClick(Sender: TObject); + procedure mnuUndoClick(Sender: TObject); + procedure EditorChange(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure ScripterCompileError(Sender: TObject; var msg: string; row, + col: Integer; var ShowException: Boolean); + procedure btnStopClick(Sender: TObject); + procedure btnBreakClick(Sender: TObject); + procedure btnFavoriteClick(Sender: TObject); + procedure EditorGetAutoCompletionList(Sender: TObject; AToken: string; + AList: TStringList); + procedure ScrCodeList1DragDrop(Sender, Source: TObject; X, Y: Integer); + procedure ScrCodeList1DragOver(Sender, Source: TObject; X, Y: Integer; + State: TDragState; var Accept: Boolean); + procedure EditorDragDrop(Sender, Source: TObject; X, Y: Integer); + procedure EditorDragOver(Sender, Source: TObject; X, Y: Integer; + State: TDragState; var Accept: Boolean); + procedure CodeButtonClick(Sender: TObject); + procedure btnPauseClick(Sender: TObject); + procedure ScripterRuntimeError(Sender: TObject; var msg: string; row, + col: Integer; var ShowException: Boolean); + procedure FindReplaceClick(Sender: TObject); + procedure ShowCodeHintsClick(Sender: TObject); + procedure SurroundByClick(Sender: TObject); + procedure mnuRedoClick(Sender: TObject); + procedure ScrCodeList1BlockDblClick(Sender: TObject; + ACodeBlock: TCodeBlock); + procedure AddFromClipboardClick(Sender: TObject); + procedure mnuDeleteBlockClick(Sender: TObject); + procedure ScrCodeList1BlockRightClick(Sender: TObject; + ACodeBlock: TCodeBlock); + procedure ScrCodeList1ContextPopup(Sender: TObject; MousePos: TPoint; + var Handled: Boolean); + procedure Editcaption1Click(Sender: TObject); + procedure CollapseBlocksClick(Sender: TObject); + procedure ExpandBlocksClick(Sender: TObject); + public + cp: TControlPoint; + Stopped: boolean; + cmap: TColorMap; + Flame: TFlame; + Options: TOptions; + Pivot: TPivot; + Renderer: TScriptRender; + Another: TScriptRender; + AddedXForms : integer; + chaosLines : TStringList; + procedure LoadRunAndClear(scriptFile:string); + procedure LoadScriptFile(filename:string); + procedure ScriptFromFlame(flameXML:string); + procedure UpdateFlame; + procedure PrepareScripter; + procedure OpenScript; + procedure RunScript; + procedure AdjustScripterColors; + + { Flame interface } + procedure SetFlameNameProc(AMachine: TatVirtualMachine); + procedure GetFlameNameProc(AMachine: TatVirtualMachine); + procedure SetFlameHueProc(AMachine: TatVirtualMachine); + procedure GetFlameHueProc(AMachine: TatVirtualMachine); + procedure GetFlameGammaProc(AMachine: TatVirtualMachine); + procedure SetFlameGammaProc(AMachine: TatVirtualMachine); + procedure GetFlameGammaThresholdProc(AMachine: TatVirtualMachine); + procedure SetFlameGammaThresholdProc(AMachine: TatVirtualMachine); + procedure GetFlameBrightnessProc(AMachine: TatVirtualMachine); + procedure SetFlameBrightnessProc(AMachine: TatVirtualMachine); + procedure GetFlameVibrancyProc(AMachine: TatVirtualMachine); + procedure SetFlameVibrancyProc(AMachine: TatVirtualMachine); + procedure GetFlameContrastProc(AMachine: TatVirtualMachine); + procedure SetFlameContrastProc(AMachine: TatVirtualMachine); + procedure GetFlameTimeProc(AMachine: TatVirtualMachine); + procedure SetFlameTimeProc(AMachine: TatVirtualMachine); + procedure GetFlameDensityProc(AMachine: TatVirtualMachine); + procedure SetFlameDensityProc(AMachine: TatVirtualMachine); + procedure GetFlameOversampleProc(AMachine: TatVirtualMachine); + procedure SetFlameOversampleProc(AMachine: TatVirtualMachine); + procedure GetFlameFilterRadiusProc(AMachine: TatVirtualMachine); + procedure SetFlameFilterRadiusProc(AMachine: TatVirtualMachine); + procedure GetFlameWidthProc(AMachine: TatVirtualMachine); + procedure SetFlameWidthProc(AMachine: TatVirtualMachine); + procedure GetFlameHeightProc(AMachine: TatVirtualMachine); + procedure SetFlameHeightProc(AMachine: TatVirtualMachine); + procedure GetFlameZoomProc(AMachine: TatVirtualMachine); + procedure SetFlameZoomProc(AMachine: TatVirtualMachine); + procedure GetFlameXProc(AMachine: TatVirtualMachine); + procedure SetFlameXProc(AMachine: TatVirtualMachine); + procedure GetFlameYProc(AMachine: TatVirtualMachine); + procedure SetFlameYProc(AMachine: TatVirtualMachine); + procedure GetFlamePixelsPerUnitProc(AMachine: TatVirtualMachine); + procedure SetFlamePixelsPerUnitProc(AMachine: TatVirtualMachine); + procedure GetFlamePaletteProc(AMachine: TatVirtualMachine); + procedure SetFlamePaletteProc(AMachine: TatVirtualMachine); + procedure GetFlameBackgroundProc(AMachine: TatVirtualMachine); + procedure SetFlameBackgroundProc(AMachine: TatVirtualMachine); + // procedure SetFlameNickProc(AMachine: TatVirtualMachine); + // procedure GetFlameNickProc(AMachine: TatVirtualMachine); + // procedure SetFlameURLProc(AMachine: TatVirtualMachine); + // procedure GetFlameURLProc(AMachine: TatVirtualMachine); + procedure SetFlameBatchesProc(AMachine: TatVirtualMachine); + procedure GetFlameBatchesProc(AMachine: TatVirtualMachine); + procedure GetFlameFinalxformEnabledProc(AMachine: TatVirtualMachine); + procedure SetFlameFinalxformEnabledProc(AMachine: TatVirtualMachine); + procedure GetFlameSoloXformProc(AMachine: TatVirtualMachine); + procedure SetFlameSoloXformProc(AMachine: TatVirtualMachine); + procedure GetFlameAngleProc(AMachine: TatVirtualMachine); + procedure SetFlameAngleProc(AMachine: TatVirtualMachine); + procedure GetFlamePitchProc(AMachine: TatVirtualMachine); + procedure SetFlamePitchProc(AMachine: TatVirtualMachine); + procedure GetFlameRollProc(AMachine: TatVirtualMachine); + procedure SetFlameRollProc(AMachine: TatVirtualMachine); + procedure GetFlameYawProc(AMachine: TatVirtualMachine); + procedure SetFlameYawProc(AMachine: TatVirtualMachine); + procedure GetFlameCamZposProc(AMachine: TatVirtualMachine); + procedure SetFlameCamZposProc(AMachine: TatVirtualMachine); + procedure GetFlamePerspectiveProc(AMachine: TatVirtualMachine); + procedure SetFlamePerspectiveProc(AMachine: TatVirtualMachine); + procedure GetFlameDOFProc(AMachine: TatVirtualMachine); + procedure SetFlameDOFProc(AMachine: TatVirtualMachine); + + procedure GetPreviewHeightProc(AMachine: TatVirtualMachine); + procedure SetPreviewHeightProc(AMachine: TatVirtualMachine); + procedure GetPreviewWidthProc(AMachine: TatVirtualMachine); + procedure SetPreviewWidthProc(AMachine: TatVirtualMachine); + + + { Transform interface } + procedure GetTransformAProc(AMachine: TatVirtualMachine); + procedure SetTransformAProc(AMachine: TatVirtualMachine); + procedure GetTransformBProc(AMachine: TatVirtualMachine); + procedure SetTransformBProc(AMachine: TatVirtualMachine); + procedure GetTransformCProc(AMachine: TatVirtualMachine); + procedure SetTransformCProc(AMachine: TatVirtualMachine); + procedure GetTransformDProc(AMachine: TatVirtualMachine); + procedure SetTransformDProc(AMachine: TatVirtualMachine); + procedure GetTransformEProc(AMachine: TatVirtualMachine); + procedure SetTransformEProc(AMachine: TatVirtualMachine); + procedure GetTransformFProc(AMachine: TatVirtualMachine); + procedure SetTransformFProc(AMachine: TatVirtualMachine); + procedure GetTransformVarProc(AMachine: TatVirtualMachine); + procedure SetTransformVarProc(AMachine: TatVirtualMachine); + procedure GetTransformVariProc(AMachine: TatVirtualMachine); + procedure SetTransformVariProc(AMachine: TatVirtualMachine); + + procedure GetTransformChaosProc(AMachine: TatVirtualMachine); + procedure SetTransformChaosProc(AMachine: TatVirtualMachine); + procedure GetTransformPlotModeProc(AMachine: TatVirtualMachine); + procedure SetTransformPlotModeProc(AMachine: TatVirtualMachine); + procedure GetTransformOpacityProc(AMachine: TatVirtualMachine); + procedure SetTransformOpacityProc(AMachine: TatVirtualMachine); + + procedure GetTransformColorProc(AMachine: TatVirtualMachine); + procedure SetTransformColorProc(AMachine: TatVirtualMachine); + procedure GetTransformVarColorProc(AMachine: TatVirtualMachine); + procedure SetTransformVarColorProc(AMachine: TatVirtualMachine); + procedure GetTransformWeightProc(AMachine: TatVirtualMachine); + procedure SetTransformWeightProc(AMachine: TatVirtualMachine); + procedure GetTransformSymProc(AMachine: TatVirtualMachine); + procedure SetTransformSymProc(AMachine: TatVirtualMachine); + + // AV: something new + procedure GetTransformNameProc(AMachine: TatVirtualMachine); + procedure SetTransformNameProc(AMachine: TatVirtualMachine); + procedure TransformSwapCoefsProc(AMachine: TatVirtualMachine); + procedure TransformResetVariables(AMachine: TatVirtualMachine); + // AV: variation order editing + procedure TransformMoveVarProc(AMachine: TatVirtualMachine); + procedure TransformExchangeVarsProc(AMachine: TatVirtualMachine); + procedure TransformCopyVarOrderProc(AMachine: TatVirtualMachine); + procedure TransformSortVarsProc(AMachine: TatVirtualMachine); + procedure TransformDefaultVarOrderProc(AMachine: TatVirtualMachine); + procedure TransformGetVarOrderProc(AMachine: TatVirtualMachine); + procedure TransformDisplayVarsProc(AMachine: TatVirtualMachine); + + procedure GetTransformVariationProc(AMachine: TatVirtualMachine); + procedure SetTransformVariationProc(AMachine: TatVirtualMachine); + procedure GetTransformVariableProc(AMachine: TatVirtualMachine); + procedure SetTransformVariableProc(AMachine: TatVirtualMachine); + + procedure GetTransformCoefsProc(AMachine: TatVirtualMachine); + procedure SetTransformCoefsProc(AMachine: TatVirtualMachine); + procedure GetTransformPostCoefsProc(AMachine: TatVirtualMachine); + procedure SetTransformPostCoefsProc(AMachine: TatVirtualMachine); + + procedure TransformClearProc(AMachine: TatVirtualMachine); + procedure TransformRotateProc(AMachine: TatVirtualMachine); + procedure TransformScaleProc(AMachine: TatVirtualMachine); + procedure TransformRotateOriginProc(AMachine: TatVirtualMachine); + + // AV: added reflections + procedure TransformFlipHorizProc(AMachine: TatVirtualMachine); + procedure TransformFlipVertProc(AMachine: TatVirtualMachine); + // AV: post-affine transformations + procedure TransformRotatePXOriginProc(AMachine: TatVirtualMachine); + procedure TransformRotatePXProc(AMachine: TatVirtualMachine); + procedure TransformFlipPXHorizProc(AMachine: TatVirtualMachine); + procedure TransformFlipPXVertProc(AMachine: TatVirtualMachine); + procedure TransformScalePXProc(AMachine: TatVirtualMachine); + procedure GetTransformPostxformEnabledProc(AMachine: TatVirtualMachine); + procedure SetTransformPostxformEnabledProc(AMachine: TatVirtualMachine); + + { Render interface } + procedure GetRenderFilenameProc(AMachine: TatVirtualMachine); + procedure SetRenderFilenameProc(AMachine: TatVirtualMachine); + procedure GetRenderWidthProc(AMachine: TatVirtualMachine); + procedure SetRenderWidthProc(AMachine: TatVirtualMachine); + procedure GetRenderHeightProc(AMachine: TatVirtualMachine); + procedure SetRenderHeightProc(AMachine: TatVirtualMachine); + procedure GetRenderMaxMemoryProc(AMachine: TatVirtualMachine); + procedure SetRenderMaxMemoryProc(AMachine: TatVirtualMachine); + procedure GetRenderEmbedParams(AMachine: TatVirtualMachine); // AV + procedure SetRenderEmbedParams(AMachine: TatVirtualMachine); // AV + procedure FillFileList; + + { Options interface } + procedure GetJPEGQuality(AMachine: TatVirtualMachine); + procedure SetJPEGQuality(AMachine: TatVirtualMachine); + procedure GetMultithreading(AMachine: TatVirtualMachine); + procedure SetMultithreading(AMachine: TatVirtualMachine); + procedure GetBatchSize(AMachine: TatVirtualMachine); + procedure SetBatchSize(AMachine: TatVirtualMachine); + procedure GetParameterFile(AMachine: TatVirtualMachine); + procedure SetParameterFile(AMachine: TatVirtualMachine); + procedure GetSmoothPaletteFile(AMachine: TatVirtualMachine); + procedure SetSmoothPaletteFile(AMachine: TatVirtualMachine); + procedure GetNumTries(AMachine: TatVirtualMachine); + procedure SetNumTries(AMachine: TatVirtualMachine); + procedure GetTryLength(AMachine: TatVirtualMachine); + procedure SetTryLength(AMachine: TatVirtualMachine); + procedure GetConfirmDelete(AMachine: TatVirtualMachine); + procedure SetConfirmDelete(AMachine: TatVirtualMachine); + // procedure GetFixedReference(AMachine: TatVirtualMachine); + // procedure SetFixedReference(AMachine: TatVirtualMachine); + procedure GetSampleDensity(AMachine: TatVirtualMachine); + procedure SetSampleDensity(AMachine: TatVirtualMachine); + procedure GetGamma(AMachine: TatVirtualMachine); + procedure SetGamma(AMachine: TatVirtualMachine); + procedure GetGammaThreshold(AMachine: TatVirtualMachine); + procedure SetGammaThreshold(AMachine: TatVirtualMachine); + procedure GetRandomGradientFile(AMachine: TatVirtualMachine); + procedure SetRandomGradientFile(AMachine: TatVirtualMachine); + procedure GetBrightness(AMachine: TatVirtualMachine); + procedure SetBrightness(AMachine: TatVirtualMachine); + procedure GetContrast(AMachine: TatVirtualMachine); + procedure SetContrast(AMachine: TatVirtualMachine); + procedure GetVibrancy(AMachine: TatVirtualMachine); + procedure SetVibrancy(AMachine: TatVirtualMachine); + procedure GetOversample(AMachine: TatVirtualMachine); + procedure SetOversample(AMachine: TatVirtualMachine); + procedure GetFilterRadius(AMachine: TatVirtualMachine); + procedure SetFilterRadius(AMachine: TatVirtualMachine); + procedure GetTransparency(AMachine: TatVirtualMachine); + procedure SetTransparency(AMachine: TatVirtualMachine); + procedure GetLowQuality(AMachine: TatVirtualMachine); + procedure SetLowQuality(AMachine: TatVirtualMachine); + procedure GetMediumQuality(AMachine: TatVirtualMachine); + procedure SetMediumQuality(AMachine: TatVirtualMachine); + procedure GetHighQuality(AMachine: TatVirtualMachine); + procedure SetHighQuality(AMachine: TatVirtualMachine); + procedure GetMinTransforms(AMachine: TatVirtualMachine); + procedure SetMinTransforms(AMachine: TatVirtualMachine); + procedure GetMaxTransforms(AMachine: TatVirtualMachine); + procedure SetMaxTransforms(AMachine: TatVirtualMachine); + procedure GetMutateMinTransforms(AMachine: TatVirtualMachine); + procedure SetMutateMinTransforms(AMachine: TatVirtualMachine); + procedure GetMutateMaxTransforms(AMachine: TatVirtualMachine); + procedure SetMutateMaxTransforms(AMachine: TatVirtualMachine); + procedure GetPrefix(AMachine: TatVirtualMachine); + procedure SetPrefix(AMachine: TatVirtualMachine); + procedure GetKeepBackground(AMachine: TatVirtualMachine); + procedure SetKeepBackground(AMachine: TatVirtualMachine); + procedure GetSymmetryType(AMachine: TatVirtualMachine); + procedure SetSymmetryType(AMachine: TatVirtualMachine); + procedure GetSymmetryOrder(AMachine: TatVirtualMachine); + procedure SetSymmetryOrder(AMachine: TatVirtualMachine); + procedure GetVariations(AMachine: TatVirtualMachine); + procedure SetVariations(AMachine: TatVirtualMachine); + procedure GetRandomGradient(AMachine: TatVirtualMachine); + procedure SetRandomGradient(AMachine: TatVirtualMachine); + // AV: new gradient options + procedure GetGradientBlending(AMachine: TatVirtualMachine); + procedure SetGradientBlending(AMachine: TatVirtualMachine); + procedure GetEqualGradient(AMachine: TatVirtualMachine); + procedure SetEqualGradient(AMachine: TatVirtualMachine); + procedure GetMinNodes(AMachine: TatVirtualMachine); + procedure SetMinNodes(AMachine: TatVirtualMachine); + procedure GetMaxNodes(AMachine: TatVirtualMachine); + procedure SetMaxNodes(AMachine: TatVirtualMachine); + procedure GetMinHue(AMachine: TatVirtualMachine); + procedure SetMinHue(AMachine: TatVirtualMachine); + procedure GetMaxHue(AMachine: TatVirtualMachine); + procedure SetMaxHue(AMachine: TatVirtualMachine); + procedure GetMinSat(AMachine: TatVirtualMachine); + procedure SetMinSat(AMachine: TatVirtualMachine); + procedure GetMaxSat(AMachine: TatVirtualMachine); + procedure SetMaxSat(AMachine: TatVirtualMachine); + procedure GetMinLum(AMachine: TatVirtualMachine); + procedure SetMinLum(AMachine: TatVirtualMachine); + procedure GetMaxLum(AMachine: TatVirtualMachine); + procedure SetMaxLum(AMachine: TatVirtualMachine); + procedure GetUPRSampleDensity(AMachine: TatVirtualMachine); + procedure SetUPRSampleDensity(AMachine: TatVirtualMachine); + procedure GetUPROversample(AMachine: TatVirtualMachine); + procedure SetUPROversample(AMachine: TatVirtualMachine); + procedure GetUPRFilterRadius(AMachine: TatVirtualMachine); + procedure SetUPRFilterRadius(AMachine: TatVirtualMachine); + procedure GetUPRColoringIdent(AMachine: TatVirtualMachine); + procedure SetUPRColoringIdent(AMachine: TatVirtualMachine); + procedure GetUPRColoringFile(AMachine: TatVirtualMachine); + procedure SetUPRColoringFile(AMachine: TatVirtualMachine); + procedure GetUPRFormulaIdent(AMachine: TatVirtualMachine); + procedure SetUPRFormulaIdent(AMachine: TatVirtualMachine); + procedure GetUPRFormulaFile(AMachine: TatVirtualMachine); + procedure SetUPRFormulaFile(AMachine: TatVirtualMachine); + procedure GetUPRAdjustDensity(AMachine: TatVirtualMachine); + procedure SetUPRAdjustDensity(AMachine: TatVirtualMachine); + procedure GetUPRWidth(AMachine: TatVirtualMachine); + procedure SetUPRWidth(AMachine: TatVirtualMachine); + procedure GetUPRHeight(AMachine: TatVirtualMachine); + procedure SetUPRHeight(AMachine: TatVirtualMachine); + procedure GetExportPath(AMachine: TatVirtualMachine); + procedure SetExportPath(AMachine: TatVirtualMachine); + + { Pivot interface } + procedure GetPivotModeProc(AMachine: TatVirtualMachine); + procedure SetPivotModeProc(AMachine: TatVirtualMachine); + procedure GetPivotXProc(AMachine: TatVirtualMachine); + procedure SetPivotXProc(AMachine: TatVirtualMachine); + procedure GetPivotYProc(AMachine: TatVirtualMachine); + procedure SetPivotYProc(AMachine: TatVirtualMachine); + procedure SetPivotProc(AMachine: TatVirtualMachine); + procedure ResetPivotProc(AMachine: TatVirtualMachine); + + // AV: moved here from TOperationLibrary + procedure CopyFileProc(AMachine: TatVirtualMachine); + end; + TTransform = class + public + { Transform class only serves as an + interface to active transform } + end; + + // TMatrix = array[0..2, 0..2] of double; // AV: we already have such a type + +var + ScriptEditor: TScriptEditor; + LastParseError: string; + NumTransforms: integer; // Keeps track of number of xforms in flame. + ActiveTransform: integer; // Operations affect this transform. + LastError: string; + color: double; + cps: array[0..NCPS - 1] of TControlPoint; + Transform: TTransform; + Stopped, ResetLocation, UpdateIt: Boolean; + ParamFile: string; + FileList: TStringList; + ErrorOutOfRange, RTError, DTError: string; // AV + +implementation + +uses Main, Editor, Adjust, Global, Mutate, Registry, Preview, LoadTracker, + ScriptRender, ap_math, ap_classes, ap_sysutils, ap_Dialogs, + SavePreset, ap_windows, ap_FileCtrl, ap_Forms(*, bmdll32*); + +{$R *.DFM} + +//const +// ErrorOutOfRange = 'Transform out of range!'; + +type + TOperationLibrary = class(TatScripterLibrary) + protected + procedure RotateFlameProc(AMachine: TatVirtualMachine); + procedure RotateReferenceProc(AMachine: TatVirtualMachine); + procedure RotateProc(AMachine: TatVirtualMachine); + procedure ScaleProc(AMachine: TatVirtualMachine); + procedure MulProc(AMachine: TatVirtualMachine); + procedure TranslateProc(AMachine: TatVirtualMachine); + // AV: added for completeness + procedure MulPXProc(AMachine: TatVirtualMachine); + procedure TranslatePXProc(AMachine: TatVirtualMachine); + + procedure GetActiveTransformProc(AMachine: TatVirtualMachine); + procedure SetActiveTransformProc(AMachine: TatVirtualMachine); + procedure GetSelectedTransformProc(AMachine: TatVirtualMachine); // AV + procedure SetSelectedTransformProc(AMachine: TatVirtualMachine); // AV + procedure TransformsProc(AMachine: TatVirtualMachine); + procedure FileCountProc(AMachine: TatVirtualMachine); + procedure AddTransformProc(AMachine: TatVirtualMachine); + procedure DeleteTransformProc(AMachine: TatVirtualMachine); + procedure CopyTransformProc(AMachine: TatVirtualMachine); + procedure ClearProc(AMachine: TatVirtualMachine); + procedure PreviewProc(AMachine: TatVirtualMachine); + procedure Print(AMachine: TatVirtualMachine); + procedure MorphProc(AMachine: TatVirtualMachine); + procedure RenderProc(AMachine: TatVirtualMachine); + procedure AddSymmetryProc(AMachine: TatVirtualMachine); + procedure StoreFlameProc(AMachine: TatVirtualMachine); + procedure GetFlameProc(AMachine: TatVirtualMachine); + procedure LoadFlameProc(AMachine: TatVirtualMachine); + procedure SetRenderBounds(AMachine: TatVirtualMachine); + procedure GetFileName(AMachine: TatVirtualMachine); + procedure ListFileProc(AMachine: TatVirtualMachine); + procedure SetParamFileProc(AMachine: TatVirtualMachine); + procedure SaveFlameProc(AMachine: TatVirtualMachine); + procedure ShowStatusProc(AMachine: TatVirtualMachine); + procedure RandomFlame(AMachine: TatVirtualMachine); + procedure RandomGradientProc(AMachine: TatVirtualMachine); + procedure PresetGradientProc(AMachine: TatVirtualMachine); // AV + procedure SaveGradientProc(AMachine: TatVirtualMachine); + procedure GetVariation(AMachine: TatVirtualMachine); + procedure SetVariation(AMachine: TatVirtualMachine); + + procedure VariationIndexProc(AMachine: TatVirtualMachine); + procedure VariationNameProc(AMachine: TatVirtualMachine); + procedure VariableIndexProc(AMachine: TatVirtualMachine); + procedure VariableNameProc(AMachine: TatVirtualMachine); + + procedure CalculateScale(AMachine: TatVirtualMachine); + procedure NormalizeVars(AMachine: TatVirtualMachine); + procedure CalculateBounds(AMachine: TatVirtualMachine); + procedure GetSaveFileName(AMachine: TatVirtualMachine); + // procedure CopyFileProc(AMachine: TatVirtualMachine); + procedure GetCurrentFile(AMachine: TatVirtualMachine); + + // AV: added Flame Menu items + procedure CalculateColors(AMachine: TatVirtualMachine); + procedure CalculateWeights(AMachine: TatVirtualMachine); + procedure RandomizeColors(AMachine: TatVirtualMachine); + procedure RandomizeColorSpeed(AMachine: TatVirtualMachine); + procedure CalculateColorSpeed(AMachine: TatVirtualMachine); + procedure RandomizeWeights(AMachine: TatVirtualMachine); + procedure NormalizeWeights(AMachine: TatVirtualMachine); + procedure EqualizeWeights(AMachine: TatVirtualMachine); + + procedure Init; override; + end; + +procedure TScriptEditor.ScriptFromFlame(flameXML: string); +var + i : integer; + xml : TXmlScanner; +begin + // Clear & Set caption to "New Script" + btnNewClick(btnNew); + + chaosLines := TStringList.Create; + xml := TXmlScanner.Create(nil); + xml.Normalize := True; + xml.OnContent := F2SXMLContent; // AV: temporary unused + xml.OnEmptyTag := F2SXMLEmptyTag; + xml.OnEndTag := F2SXMLEndTag; + xml.OnStartTag := F2SXMLStartTag; + xml.LoadFromBuffer(TCharType(TStringType(flameXML))); // AV: changed from ANSI + xml.Execute; + xml.Destroy; + + // use chaosLines... + for i := 0 to chaosLines.Count - 1 do + Editor.Lines.Add(chaosLines.Strings[i]); + chaosLines.Destroy; +end; + +{ ************************ Options interface ********************************* } + +procedure TScriptEditor.GetJPEGQuality(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(JPEGQuality); +end; + +procedure TScriptEditor.SetJPEGQuality(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if (v > 0) and (v <= 100) then JPEGQuality := v; + end; +end; + +procedure TScriptEditor.GetBatchSize(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(BatchSize); +end; + +procedure TScriptEditor.SetBatchSize(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if (v >= 10) and (v <= 100) then BatchSize := v; + end; +end; + +procedure TScriptEditor.GetParameterFile(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(defFlameFile); +end; + +procedure TScriptEditor.SetParameterFile(AMachine: TatVirtualMachine); +var s: string; + i: integer; +begin + with AMachine do + begin + s := GetInputArgAsString(0); + if (s = '') or FileExists(s) then + defFlameFile := s + else begin + LastError := 'SetFlameFile: ' + TextByKey('common-noparamfile'); + i := LineNumberFromInstruction(AMachine.CurrentInstruction); + Editor.ActiveLine := i; // AV + Editor.ActiveLineSettings.ShowActiveLine := true; // AV + AMachine.Halt; + end; + end; +end; + +procedure TScriptEditor.GetRandomGradientFile(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(randGradientFile); +end; + +procedure TScriptEditor.SetRandomGradientFile(AMachine: TatVirtualMachine); +begin + with AMachine do + randGradientFile := GetInputArgAsString(0); +end; + +procedure TScriptEditor.GetSmoothPaletteFile(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(defSmoothPaletteFile); +end; + +procedure TScriptEditor.SetSmoothPaletteFile(AMachine: TatVirtualMachine); +begin + with AMachine do + defSmoothPaletteFile := GetInputArgAsString(0); +end; + +procedure TScriptEditor.GetNumTries(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(NumTries); +end; + +procedure TScriptEditor.SetNumTries(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if (v > 0) and (v <= 100) then NumTries := v; + end; +end; + +procedure TScriptEditor.GetTryLength(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(TryLength); +end; + +procedure TScriptEditor.SetTryLength(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if (v >= 100) and (v <= 1000000) then TryLength := v; + end; +end; + +procedure TScriptEditor.GetConfirmDelete(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(ConfirmDelete); +end; + +procedure TScriptEditor.SetConfirmDelete(AMachine: TatVirtualMachine); +begin + with AMachine do + ConfirmDelete := GetInputArgAsBoolean(0); +end; + +procedure TScriptEditor.GetContrast(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(defContrast); +end; + +procedure TScriptEditor.SetContrast(AMachine: TatVirtualMachine); +var + v: double; +begin + with AMachine do + begin + v := GetInputArgAsFloat(0); + if (v >= 0.1) and (v <= 10) then defContrast := v; + end; +end; + +(* + procedure TScriptEditor.GetFixedReference(AMachine: TatVirtualMachine); + begin + with AMachine do + ReturnOutPutArg(true); //ReferenceMode = 0); + end; + + procedure TScriptEditor.SetFixedReference(AMachine: TatVirtualMachine); + begin + // with AMachine do + // if GetInputArgAsBoolean(0) then ReferenceMode := 0 + // else ReferenceMode := 1; + end; +*) + +procedure TScriptEditor.GetSampleDensity(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(defSampleDensity); +end; + +procedure TScriptEditor.SetSampleDensity(AMachine: TatVirtualMachine); +var + v: double; +begin + with AMachine do + begin + v := GetInputArgAsFloat(0); + if (v >= 0.1) and (v <= 100) then defSampleDensity := v; + end; +end; + +procedure TScriptEditor.GetGamma(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(defGamma); +end; + +procedure TScriptEditor.SetGamma(AMachine: TatVirtualMachine); +var + v: double; +begin + with AMachine do + begin + v := GetInputArgAsFloat(0); + if (v >= 0.1) and (v <= 100) then defGamma := v; + end; +end; + +procedure TScriptEditor.GetGammaThreshold(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(defGammaThreshold); +end; + +procedure TScriptEditor.SetGammaThreshold(AMachine: TatVirtualMachine); +var + v: double; +begin + with AMachine do + begin + v := GetInputArgAsFloat(0); + if (v > 0) then defGammaThreshold := v; + end; +end; + +procedure TScriptEditor.SetGradientBlending(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if (v >= 0) and (v < 3) then randColorBlend := v; + end; +end; + +procedure TScriptEditor.GetGradientBlending(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(randColorBlend); +end; + +procedure TScriptEditor.GetBrightness(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(defBrightness); +end; + +procedure TScriptEditor.SetBrightness(AMachine: TatVirtualMachine); +var + v: double; +begin + with AMachine do + begin + v := GetInputArgAsFloat(0); + if (v >= 0.1) and (v <= 100) then defBrightness := v; + end; +end; + +procedure TScriptEditor.GetVibrancy(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(defVibrancy); +end; + +procedure TScriptEditor.SetVibrancy(AMachine: TatVirtualMachine); +var + v: double; +begin + with AMachine do + begin + v := GetInputArgAsFloat(0); + if (v >= 0) and (v <= 100) then defVibrancy := v; + end; +end; + +procedure TScriptEditor.ShowCodeHintsClick(Sender: TObject); +begin + ScrCodeList1.ShowHint := ShowCodeHints.Checked; + Panel1.ShowHint := not ShowCodeHints.Checked; +end; + +procedure TScriptEditor.GetOversample(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(defOversample); +end; + +procedure TScriptEditor.SetOversample(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if (v >= 1) and (v <= 4) then defOversample := v; + end; +end; + +procedure TScriptEditor.GetFilterRadius(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(defFilterRadius); +end; + +procedure TScriptEditor.SetFilterRadius(AMachine: TatVirtualMachine); +var + v: double; +begin + with AMachine do + begin + v := GetInputArgAsFloat(0); + if (v >= 0.1) then defFilterRadius := v; + end; +end; + +procedure TScriptEditor.GetTransparency(AMachine: TatVirtualMachine); +begin + AMachine.ReturnOutPutArg(PNGTransparency); +end; + +procedure TScriptEditor.SetTransparency(AMachine: TatVirtualMachine); +var + v: double; +begin + if AMachine.GetInputArgAsInteger(0) = 0 then + PNGTransparency := 0 + else + PNGTransparency := 1; +end; + +procedure TScriptEditor.GetLowQuality(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(prevLowQuality); +end; + +procedure TScriptEditor.SetLowQuality(AMachine: TatVirtualMachine); +var + v: double; +begin + with AMachine do + begin + v := GetInputArgAsFloat(0); + if (v >= 0.01) and (v <= 100) then prevLowQuality := v; + end; +end; + +procedure TScriptEditor.GetMediumQuality(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(prevMediumQuality); +end; + +procedure TScriptEditor.SetMediumQuality(AMachine: TatVirtualMachine); +var + v: double; +begin + with AMachine do + begin + v := GetInputArgAsFloat(0); + if (v >= 0.01) and (v <= 100) then prevMediumQuality := v; + end; +end; + +procedure TScriptEditor.GetHighQuality(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(prevHighQuality); +end; + +procedure TScriptEditor.SetHighQuality(AMachine: TatVirtualMachine); +var + v: double; +begin + with AMachine do + begin + v := GetInputArgAsFloat(0); + if (v >= 0.01) and (v <= 100) then prevHighQuality := v; + end; +end; + +procedure TScriptEditor.GetMinTransforms(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(randMinTransforms); +end; + +procedure TScriptEditor.SetMinTransforms(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if (v >= 2) and (v <= NXFORMS) and (v <= randMaxTransforms) then + randMinTransforms := v; + end; +end; + +procedure TScriptEditor.GetMaxTransforms(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(randMaxTransforms); +end; + +procedure TScriptEditor.SetMaxTransforms(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if (v >= 2) and (v <= NXFORMS) and (v >= randMinTransforms) then + randMaxTransforms := v; + end; +end; + +procedure TScriptEditor.GetMutateMinTransforms(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(mutantMinTransforms); +end; + +procedure TScriptEditor.SetMutateMinTransforms(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if (v >= 2) and (v <= NXFORMS) and (v <= mutantMaxTransforms) then + mutantMinTransforms := v; + end; +end; + +procedure TScriptEditor.GetMutateMaxTransforms(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(mutantMaxTransforms); +end; + +procedure TScriptEditor.SetMutateMaxTransforms(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if (v >= 2) and (v <= NXFORMS) and (v >= mutantMinTransforms) then + mutantMaxTransforms := v; + end; +end; + +procedure TScriptEditor.GetMultithreading(AMachine: TatVirtualMachine); +var v: integer; +begin + AMachine.ReturnOutputArg(NrTreads); +end; + +procedure TScriptEditor.SetMultithreading(AMachine: TatVirtualMachine); +var v: integer; +begin + v := AMachine.GetInputArgAsInteger(0); + if (v > 0) and (v <= UseNrThreads) then // AV: changed max MT value + NrTreads := v + else begin + LastError := 'Options.Multithreading: ' + TextByKey('script-status-varoutofrange'); + v := LineNumberFromInstruction(AMachine.CurrentInstruction); + Editor.ActiveLine := v; // AV + Editor.ActiveLineSettings.ShowActiveLine := true; // AV + AMachine.Halt; + end; +end; + +procedure TScriptEditor.GetPrefix(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(RandomPrefix); +end; + +procedure TScriptEditor.SetPrefix(AMachine: TatVirtualMachine); +begin + with AMachine do + RandomPrefix := GetInputArgAsString(0); +end; + +procedure TScriptEditor.GetKeepBackground(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(KeepBackground); +end; + +procedure TScriptEditor.SetKeepBackground(AMachine: TatVirtualMachine); +begin + with AMachine do + KeepBackground := GetInputArgAsBoolean(0); +end; + +procedure TScriptEditor.GetSymmetryType(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(SymmetryType); +end; + +procedure TScriptEditor.SetSymmetryType(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if (v >= 0) and (v <= 3) then SymmetryType := v; + end; +end; + +procedure TScriptEditor.GetSymmetryOrder(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(SymmetryOrder); +end; + +procedure TScriptEditor.SetSymmetryOrder(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if (v >= 2) and (v <= 2000) then SymmetryOrder := v; + end; +end; + +procedure TScriptEditor.GetVariations(AMachine: TatVirtualMachine); +var + I: Integer; +begin + with AMachine do + begin + i := GetArrayIndex(0); + if (i >= 0) and (i < NRVAR) then + ReturnOutPutArg(Variations[i]); + end; +end; + +procedure TScriptEditor.SetVariations(AMachine: TatVirtualMachine); +var + v: boolean; + i, vars: integer; +begin + with AMachine do + begin + v := GetInputArgAsBoolean(0); + i := GetArrayIndex(0); + if (i >= 0) and (i < NRVAR) then + begin + Variations[i] := v; + end; + end; +end; + +procedure TScriptEditor.GetRandomGradient(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(randGradient); +end; + +procedure TScriptEditor.SetRandomGradient(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if (v >= 0) and (v <= 4) then randGradient := v; // AV: fixed - was max=3 + end; +end; + +procedure TScriptEditor.GetMinNodes(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(MinNodes); +end; + +procedure TScriptEditor.SetMinNodes(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if (v >= 2) and (v <= 64) and (v <= MaxNodes) then MinNodes := v; + end; +end; + +procedure TScriptEditor.GetMaxNodes(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(MaxNodes); +end; + +procedure TScriptEditor.SetMaxNodes(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if (v >= 2) and (v <= 64) and (v >= MinNodes) then MaxNodes := v; + end; +end; + +procedure TScriptEditor.GetMinHue(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(MinHue); +end; + +procedure TScriptEditor.SetMinHue(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if (v >= 0) and (v <= 600) and (v <= MaxHue) then MinHue := v; + end; +end; + +procedure TScriptEditor.GetMaxHue(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(MaxHue); +end; + +procedure TScriptEditor.SetMaxHue(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if (v >= 0) and (v <= 600) and (v >= MinHue) then MaxHue := v; + end; +end; + + +procedure TScriptEditor.GetMinSat(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(MinSat); +end; + +procedure TScriptEditor.SetMinSat(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if (v >= 0) and (v <= 100) and (v <= MaxSat) then MinSat := v; + end; +end; + +procedure TScriptEditor.GetMaxSat(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(MaxSat); +end; + +procedure TScriptEditor.SetMaxSat(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if (v >= 0) and (v <= 100) and (v >= MinSat) then MaxSat := v; + end; +end; + +procedure TScriptEditor.GetMinLum(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(MinLum); +end; + +procedure TScriptEditor.SetMinLum(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if (v >= 0) and (v <= 100) and (v <= MaxLum) then MinLum := v; + end; +end; + +procedure TScriptEditor.GetMaxLum(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(MaxLum); +end; + +procedure TScriptEditor.SetMaxLum(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if (v >= 0) and (v <= 100) and (v >= MinLum) then MaxLum := v; + end; +end; + +procedure TScriptEditor.GetUPRSampleDensity(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(UPRSampleDensity); +end; + +procedure TScriptEditor.SetUPRSampleDensity(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if (v > 0) then UPRSampleDensity := v; + end; +end; + +procedure TScriptEditor.GetUPROversample(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(UPROversample); +end; + +procedure TScriptEditor.SetUPROversample(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if (v > 0) then UPROversample := v; + end; +end; + +procedure TScriptEditor.GetUPRFilterRadius(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(UPRFilterRadius); +end; + +procedure TScriptEditor.SetUPRFilterRadius(AMachine: TatVirtualMachine); +var + v: double; +begin + with AMachine do + begin + v := GetInputArgAsFloat(0); + if (v > 0) then UPRFilterRadius := v; + end; +end; + +procedure TScriptEditor.GetUPRColoringIdent(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(UPRColoringIdent); +end; + +procedure TScriptEditor.SetUPRColoringIdent(AMachine: TatVirtualMachine); +begin + with AMachine do + UPRColoringIdent := GetInputArgAsString(0); +end; + +procedure TScriptEditor.GetUPRColoringFile(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(UPRColoringFile); +end; + +procedure TScriptEditor.SetUPRColoringFile(AMachine: TatVirtualMachine); +begin + with AMachine do + UPRColoringFile := GetInputArgAsString(0); +end; + +procedure TScriptEditor.GetUPRFormulaFile(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(UPRFormulaFile); +end; + +procedure TScriptEditor.SetUPRFormulaFile(AMachine: TatVirtualMachine); +begin + with AMachine do + UPRFormulaFile := GetInputArgAsString(0); +end; + +procedure TScriptEditor.GetUPRFormulaIdent(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(UPRFormulaIdent); +end; + +procedure TScriptEditor.SetUPRFormulaIdent(AMachine: TatVirtualMachine); +begin + with AMachine do + UPRFormulaIdent := GetInputArgAsString(0); +end; + +procedure TScriptEditor.GetUPRAdjustDensity(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(UPRAdjustDensity); +end; + +procedure TScriptEditor.SetUPRAdjustDensity(AMachine: TatVirtualMachine); +begin + with AMachine do + UPRAdjustDensity := GetInputArgAsBoolean(0); +end; + +procedure TScriptEditor.GetUPRWidth(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(UPRWidth); +end; + +procedure TScriptEditor.SetUPRWidth(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if (v > 0) then UPRWidth := v; + end; +end; + +procedure TScriptEditor.GetUPRHeight(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(UPRHeight); +end; + +procedure TScriptEditor.SetUPRHeight(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if (v > 0) then UPRHeight := v; + end; +end; + +procedure TScriptEditor.GetEqualGradient(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(EqualStripes); +end; + +procedure TScriptEditor.SetEqualGradient(AMachine: TatVirtualMachine); +begin + with AMachine do + EqualStripes := GetInputArgAsBoolean(0); +end; + +procedure TScriptEditor.GetExportPath(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(flam3Path); +end; + +procedure TScriptEditor.SetExportPath(AMachine: TatVirtualMachine); +begin + with AMachine do + flam3Path := GetInputArgAsString(0); +end; + +{ ***************************** Operation Library **************************** } + +procedure TOperationLibrary.Init; +begin + Scripter.DefineMethod('RotateFlame', 1, tkNone, nil, RotateFlameProc); + Scripter.DefineMethod('RotateReference', 1, tkNone, nil, RotateReferenceProc); + Scripter.DefineMethod('Rotate', 1, tkNone, nil, RotateProc); + Scripter.DefineMethod('Multiply', 4, tkNone, nil, MulProc); + Scripter.DefineMethod('StoreFlame', 1, tkNone, nil, StoreFlameProc); + Scripter.DefineMethod('GetFlame', 1, tkNone, nil, GetFlameProc); + Scripter.DefineMethod('LoadFlame', 1, tkNone, nil, LoadFlameProc); + Scripter.DefineMethod('Scale', 1, tkNone, nil, ScaleProc); + Scripter.DefineMethod('Translate', 2, tkNone, nil, TranslateProc); + + Scripter.DefineMethod('MultiplyPX', 4, tkNone, nil, MulPXProc); + Scripter.DefineMethod('TranslatePX', 2, tkNone, nil, TranslatePXProc); + + Scripter.DefineProp('SelectedTransform', tkInteger, + GetSelectedTransformProc, SetSelectedTransformProc); // AV + Scripter.DefineProp('ActiveTransform', tkInteger, + GetActiveTransformProc, SetActiveTransformProc); + Scripter.DefineMethod('SetActiveTransform', 1, tkInteger, nil, SetActiveTransformProc); + Scripter.DefineMethod('Transforms', 0, tkInteger, nil, TransformsProc); + Scripter.DefineMethod('FileCount', 0, tkInteger, nil, FileCountProc); + Scripter.DefineMethod('AddTransform', 0, tkNone, nil, AddTransformProc); + Scripter.DefineMethod('DeleteTransform', 0, tkNone, nil, DeleteTransformProc); + Scripter.DefineMethod('CopyTransform', 0, tkNone, nil, CopyTransformProc); + Scripter.DefineMethod('Clear', 0, tkNone, nil, ClearProc); + Scripter.DefineMethod('Preview', 0, tkNone, nil, PreviewProc); + Scripter.DefineMethod('Render', 0, tkNone, nil, RenderProc); + Scripter.DefineMethod('Print', 1, tkNone, nil, Print); + Scripter.DefineMethod('AddSymmetry', 1, tkNone, nil, AddSymmetryProc); + Scripter.DefineMethod('Morph', 4, tkNone, nil, MorphProc, false, 1); + Scripter.DefineMethod('SetRenderBounds', 0, tkNone, nil, SetRenderBounds); + Scripter.DefineMethod('SetFlameFile', 1, tkNone, nil, SetParamFileProc); + Scripter.DefineMethod('ListFile', 1, tkNone, nil, ListFileProc); + Scripter.DefineMethod('SaveFlame', 1, tkNone, nil, SaveFlameProc); + Scripter.DefineMethod('GetFileName', 0, tkString, nil, GetFileName); + Scripter.DefineMethod('ShowStatus', 1, tkNone, nil, ShowStatusProc); + Scripter.DefineMethod('RandomFlame', 1, tkNone, nil, RandomFlame); + Scripter.DefineMethod('RandomGradient', 0, tkNone, nil, RandomGradientProc); + Scripter.DefineMethod('PresetGradient', 1, tkNone, nil, PresetGradientProc); // AV + Scripter.DefineMethod('SaveGradient', 2, tkNone, nil, SaveGradientProc); + Scripter.DefineMethod('Variation', 0, tkInteger, nil, GetVariation); // AV: ? + Scripter.DefineMethod('SetVariation', 1, tkInteger, nil, SetVariation); // AV: fixed + + Scripter.AddConstant('ProgramVersionString', AppVersionString); + Scripter.DefineMethod('VariationIndex', 1, tkInteger, nil, VariationIndexProc); + Scripter.DefineMethod('VariationName', 1, tkString, nil, VariationNameProc); + Scripter.DefineMethod('VariableIndex', 1, tkInteger, nil, VariableIndexProc); + Scripter.DefineMethod('VariableName', 1, tkString, nil, VariableNameProc); + + Scripter.DefineMethod('CalculateScale', 0, tkNone, nil, CalculateScale); + Scripter.DefineMethod('CalculateBounds', 0, tkNone, nil, CalculateBounds); + Scripter.DefineMethod('NormalizeVars', 0, tkNone, nil, NormalizeVars); + Scripter.DefineMethod('GetSaveFileName', 0, tkString, nil, GetSaveFileName); + // Scripter.DefineMethod('CopyFile', 2, tkString, nil, CopyFileProc); + + Scripter.DefineMethod('CalculateColors', 0, tkNone, nil, CalculateColors); + Scripter.DefineMethod('CalculateColorSpeed', 0, tkNone, nil, CalculateColorSpeed); + Scripter.DefineMethod('CalculateWeights', 0, tkNone, nil, CalculateWeights); + Scripter.DefineMethod('NormalizeWeights', 0, tkNone, nil, NormalizeWeights); + Scripter.DefineMethod('RandomizeColors', 0, tkNone, nil, RandomizeColors); + Scripter.DefineMethod('RandomizeColorSpeed', 0, tkNone, nil, RandomizeColorSpeed); + Scripter.DefineMethod('RandomizeWeights', 0, tkNone, nil, RandomizeWeights); + Scripter.DefineMethod('EqualizeWeights', 0, tkNone, nil, EqualizeWeights); + + Scripter.DefineProp('CurrentFile', tkString, GetCurrentFile, nil); + + //Scripter.DefineMethod('BM_Open', 1, tkInteger, nil, BM_OpenProc); + //Scripter.DefineMethod('BM_DllCFunc', 2, tkInteger, nil, BM_DllCFuncProc); +end; + +procedure TOperationLibrary.RandomFlame(AMachine: TatVirtualMachine); +var + i: integer; +begin + try + i := AMachine.GetInputArgAsInteger(0); + MainForm.RandomizeCP(ScriptEditor.cp, i); + for i := 0 to NXFORMS - 1 do + if ScriptEditor.cp.xform[i].density = 0 then break; + NumTransforms := i; + except on E: EMathError do + end; +end; + +procedure TOperationLibrary.RandomGradientProc(AMachine: TatVirtualMachine); +begin + ScriptEditor.cp.cmap := GradientHelper.RandomGradient; +end; + +procedure TOperationLibrary.PresetGradientProc(AMachine: TatVirtualMachine); +var i: integer; +begin + i := AMachine.GetInputArgAsInteger(0); + if (i >= -1) and (i < NRCMAPS) then + GetCMap(i, 1, ScriptEditor.cp.cmap); +end; + +procedure TOperationLibrary.CalculateScale(AMachine: TatVirtualMachine); +var + x, y: double; +begin + x := ScriptEditor.cp.center[0]; + y := ScriptEditor.cp.center[1]; + ScriptEditor.cp.CalcBoundBox; + ScriptEditor.cp.center[0] := x; + ScriptEditor.cp.center[1] := y; +end; + +procedure TOperationLibrary.CalculateBounds(AMachine: TatVirtualMachine); +begin + ScriptEditor.cp.CalcBoundBox; +end; + +procedure TOperationLibrary.CalculateColors(AMachine: TatVirtualMachine); +var i: integer; +begin + for i := 0 to NumTransforms-1 do + ScriptEditor.cp.xform[i].color := i / (NumTransforms-1); +end; + +procedure TOperationLibrary.CalculateWeights(AMachine: TatVirtualMachine); +begin + ScriptEditor.cp.CalculateWeights; +end; + +procedure TOperationLibrary.RandomizeColors(AMachine: TatVirtualMachine); +var i: integer; +begin + for i := 0 to NumTransforms-1 do + ScriptEditor.cp.xform[i].color := random; +end; + +procedure TOperationLibrary.RandomizeColorSpeed(AMachine: TatVirtualMachine); +var i: integer; +begin + for i := 0 to NumTransforms-1 do + ScriptEditor.cp.xform[i].symmetry := 2 * random - 1; +end; + +procedure TOperationLibrary.CalculateColorSpeed(AMachine: TatVirtualMachine); +begin + ScriptEditor.cp.CalculateColorSpeed; +end; + +procedure TOperationLibrary.RandomizeWeights(AMachine: TatVirtualMachine); +begin + ScriptEditor.cp.RandomizeWeights; +end; + +procedure TOperationLibrary.NormalizeWeights(AMachine: TatVirtualMachine); +begin + ScriptEditor.cp.NormalizeProbabilities; +end; + +procedure TOperationLibrary.EqualizeWeights(AMachine: TatVirtualMachine); +begin + ScriptEditor.cp.EqualizeWeights; +end; + +procedure TOperationLibrary.SetRenderBounds(AMachine: TatVirtualMachine); +begin + ScriptRenderForm.SetRenderBounds; +end; + +procedure TOperationLibrary.SetSelectedTransformProc(AMachine: TatVirtualMachine); +var + i: integer; +begin + try + with AMachine do + i := GetInputArgAsInteger(0); + if (i >= 0) and (i < EditForm.cbTransforms.Items.Count) then + EditForm.SelectedTriangle := i + else raise EFormatInvalid.Create('SelectedTransform: ' + ErrorOutOfRange); + except on E: EFormatInvalid do + begin + Application.ProcessMessages; + LastError := E.Message; + ScriptEditor.Editor.ActiveLine := + LineNumberFromInstruction(AMachine.CurrentInstruction); // AV + ScriptEditor.Editor.ActiveLineSettings.ShowActiveLine := true; // AV + Scripter.Halt; + end; + end; +end; + +procedure TOperationLibrary.GetFileName(AMachine: TatVirtualMachine); +begin + if ScriptEditor.OpenDialog.Execute then + with AMachine do + ReturnOutputArg(ScriptEditor.OpenDialog.Filename) + else + begin + LastError := 'GetFileName: ' + TextByKey('save-status-invalidfilename'); + ScriptEditor.Editor.ActiveLine := + LineNumberFromInstruction(AMachine.CurrentInstruction); // AV + ScriptEditor.Editor.ActiveLineSettings.ShowActiveLine := true; // AV + AMachine.Halt; + end; +end; + +procedure TOperationLibrary.GetSaveFileName(AMachine: TatVirtualMachine); +begin + if ScriptEditor.SaveDialog.Execute then + with AMachine do + ReturnOutputArg(ScriptEditor.SaveDialog.Filename) + else + begin + LastError := 'GetSaveFileName: ' + TextByKey('save-status-invalidfilename'); + ScriptEditor.Editor.ActiveLine := + LineNumberFromInstruction(AMachine.CurrentInstruction); // AV + ScriptEditor.Editor.ActiveLineSettings.ShowActiveLine := true; // AV + AMachine.Halt; + end; +end; + +procedure TOperationLibrary.GetSelectedTransformProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutputArg(EditForm.SelectedTriangle); +end; + +(* +procedure TOperationLibrary.CopyFileProc(AMachine: TatVirtualMachine); +var + src, dest: string; + FileList: TStringList; +begin +{ // AV: this doesn't work with Unicode strings and conflicts with Windows.CopyFile + src := AMachine.GetInputArgAsString(0); + dest := AMachine.GetInputArgAsString(1); + FileList := TStringList.Create; + try + if FileExists(src) then + begin + FileList.LoadFromFile(src); + try + FileList.SaveToFile(dest); + except + LastError := 'CopyFile: ' + TextByKey('common-genericcopyfailure'); + AMachine.Halt; + end; + end + else + begin + LastError := 'CopyFile: ' + TextByKey('common-genericcopyfailure'); + AMachine.Halt; + end; + finally + FileList.free; + end; +end; + *) + +procedure TOperationLibrary.SetParamFileProc(AMachine: TatVirtualMachine); +var + filen: string; +begin + filen := AMachine.GetInputArgAsString(0); + if FileExists(filen) then + begin + ParamFile := filen; + ScriptEditor.FillFileList; + end + else + begin + LastError := 'SetFlameFile: ' + TextByKey('common-noparamfile'); + AMachine.RuntimeError(LastError); // AV + AMachine.Halt; + if LoadForm.CheckBox1.Checked then LoadForm.Show; // AV + end; +end; + +procedure TOperationLibrary.RotateProc(AMachine: TatVirtualMachine); +begin + try + if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then raise EFormatInvalid.Create(ErrorOutOfRange); + with AMachine do + ScriptEditor.cp.xform[ActiveTransform].Rotate(GetInputArgAsFloat(0)); + except on E: EFormatInvalid do + begin + // ScriptEditor.Console.Lines.Add('Rotate: ' + E.message); + LastError := 'Rotate: ' + E.Message; + Application.ProcessMessages; + end; + end; +end; + + +procedure TOperationLibrary.MulPXProc(AMachine: TatVirtualMachine); +var k, m, l, n, pa, pb, pc, pd: double; +begin + try + if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then raise EFormatInvalid.Create(ErrorOutOfRange); + with AMachine do + begin + k := GetInputArgAsFloat(0); + m := GetInputArgAsFloat(1); + l := GetInputArgAsFloat(2); + n := GetInputArgAsFloat(3); + end; + with ScriptEditor.cp.xform[ActiveTransform] do begin + pa := p[0,0]; + pb := -p[1,0]; + pc := -p[0,1]; + pd := p[1,1]; + p[0,0] := pa * k + pc * l; + p[0,1] := -(pa * m + pc * n); + p[1,0] := -(pb * k + pd * l); + p[1,1] := pb * m + pd * n; + end; + except on E: EFormatInvalid do + begin + // ScriptEditor.Console.Lines.Add('MultiplyPX: ' + E.message); + LastError := 'MultiplyPX: ' + E.Message; + Application.ProcessMessages; + end; + end; +end; + +procedure TOperationLibrary.MulProc(AMachine: TatVirtualMachine); +var k, m, l, n, ca, cb, cc, cd: double; +begin + if ScriptEditor.cp.xform[ActiveTransform].postXswap then + begin + MulPXProc(AMachine); + Exit; + end; + try + if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then raise EFormatInvalid.Create(ErrorOutOfRange); + with AMachine do + // ScriptEditor.cp.xform[ActiveTransform].Multiply(GetInputArgAsFloat(0), GetInputArgAsFloat(1), GetInputArgAsFloat(2), GetInputArgAsFloat(3)); + begin + k := GetInputArgAsFloat(0); + m := GetInputArgAsFloat(1); + l := GetInputArgAsFloat(2); + n := GetInputArgAsFloat(3); + end; + with ScriptEditor.cp.xform[ActiveTransform] do begin + ca := c[0,0]; + cb := -c[1,0]; + cc := -c[0,1]; + cd := c[1,1]; + c[0,0] := ca * k + cc * l; + c[0,1] := -(ca * m + cc * n); + c[1,0] := -(cb * k + cd * l); + c[1,1] := cb * m + cd * n; + end; + except on E: EFormatInvalid do + begin + // ScriptEditor.Console.Lines.Add('Multiply: ' + E.message); + LastError := 'Multiply: ' + E.Message; + Application.ProcessMessages; + end; + end; +end; + +procedure TOperationLibrary.Print(AMachine: TatVirtualMachine); +begin + ScriptEditor.Console.Lines.Add(AMachine.GetInputArg(0)); + Application.ProcessMessages; +end; + +procedure TOperationLibrary.ShowStatusProc(AMachine: TatVirtualMachine); +begin + MainForm.StatusBar.Panels[0].Text := AMachine.GetInputArg(0); + Application.ProcessMessages; +end; + + +procedure TOperationLibrary.SaveFlameProc(AMachine: TatVirtualMachine); +var + filename: string; +begin + with AMachine do + begin + filename := GetInputArgAsString(0); + (*if (LowerCase(ExtractFileExt(filename)) = '.apo') or + (LowerCase(ExtractFileExt(filename)) = '.fla') then + MainForm.SaveFlame(ScriptEditor.cp, ScriptEditor.cp.name, filename) + else *) + MainForm.SaveXMLFlame(ScriptEditor.cp, ScriptEditor.cp.name, filename) + end; +end; + +procedure TOperationLibrary.SaveGradientProc(AMachine: TatVirtualMachine); +var + gradstr: TStringList; +begin + gradstr := TStringList.Create; + try + gradstr.add(CleanIdentifier(AMachine.GetInputArgAsString(1)) + ' {'); + gradstr.add(MainForm.GradientFromPalette(ScriptEditor.cp.cmap, AMachine.GetInputArgAsString(1))); + gradstr.add('}'); + MainForm.SaveGradient(gradstr.text, AMachine.GetInputArgAsString(1), AMachine.GetInputArgAsString(0)) + finally + gradstr.free + end; +end; + +procedure TOperationLibrary.ListFileProc(AMachine: TatVirtualMachine); +var + flafile: string; + i: integer; +begin + flafile := AMachine.GetInputArgAsString(0); + if FileExists(flafile) then + begin + OpenFile := flafile; + MainForm.Caption := AppVersionString + ' - ' + OpenFile; + (*if (LowerCase(ExtractFileExt(flafile)) = '.apo') or + (LowerCase(ExtractFileExt(flafile)) = '.undo') then + begin + ListIFS(OpenFile, 1); + OpenFileType := ftFla + end + else + begin*) + ListXML(OpenFile, 1); + OpenFileType := ftXML; + //end; + MainForm.SetFocus; + end + else + begin + try + LastError := 'ListFile: ' + Format(TextByKey('common-genericopenfailure'), [Flafile]); + except + LastError := 'Cannot list file: ' + Flafile; + end; + i := LineNumberFromInstruction(AMachine.CurrentInstruction); + ScriptEditor.Editor.ActiveLine := i; // AV + ScriptEditor.Editor.ActiveLineSettings.ShowActiveLine := true; // AV + AMachine.Halt; + end; +end; + +procedure TOperationLibrary.StoreFlameProc(AMachine: TatVirtualMachine); +var + v: integer; +begin + v := AMachine.GetInputArgAsInteger(0); + if (v >= 0) and (v < NCPS) then + begin + cps[v].copy(ScriptEditor.cp); + cps[v].cmap := ScriptEditor.cp.cmap; + end + else begin + LastError := 'StoreFlame(' + IntToStr(v) + '): ' + TextByKey('script-status-varoutofrange'); + ScriptEditor.Editor.ActiveLine := + LineNumberFromInstruction(AMachine.CurrentInstruction); // AV + ScriptEditor.Editor.ActiveLineSettings.ShowActiveLine := true; // AV + AMachine.Halt; + end; +end; + +procedure TOperationLibrary.GetFlameProc(AMachine: TatVirtualMachine); +var + i, v: integer; +begin + v := AMachine.GetInputArgAsInteger(0); + if (v >= 0) and (v < NCPS) then + begin + ScriptEditor.cp.copy(cps[v]); + ScriptEditor.cp.cmap := cps[v].cmap; + + for i := 0 to NXFORMS - 1 do + if ScriptEditor.cp.xform[i].density = 0 then break; + NumTransforms := i; + end + else begin + LastError := 'GetFlame(' + IntToStr(v) + '): ' + TextByKey('script-status-varoutofrange'); + ScriptEditor.Editor.ActiveLine := + LineNumberFromInstruction(AMachine.CurrentInstruction); // AV + ScriptEditor.Editor.ActiveLineSettings.ShowActiveLine := true; // AV + AMachine.Halt; + end; +end; + +procedure LoadXMLFlame(index: integer); +var + FStrings: TStringList; + IFSStrings: TStringList; + EntryStrings, Tokens: TStringList; + i: integer; +begin + FStrings := TStringList.Create; + IFSStrings := TStringList.Create; + Tokens := TStringList.Create; + EntryStrings := TStringList.Create; + try + FStrings.LoadFromFile(ParamFile); + + for i := 0 to FStrings.count - 1 do + begin + if Pos('', FStrings[i]) <> 0; + MainForm.ParseXML(ScriptEditor.Cp, IFSStrings.Text, true); + for i := 0 to NXFORMS - 1 do + if ScriptEditor.cp.xform[i].density = 0 then break; + NumTransforms := i; +// FlameName := FileList[index]; + finally + IFSStrings.Free; + FStrings.Free; + Tokens.free; + EntryStrings.free; + end; +end; + +procedure LoadFlame(index: integer); +var + FStrings: TStringList; + IFSStrings: TStringList; + EntryStrings, Tokens: TStringList; + SavedPal: Boolean; + i, j: integer; + FlameString, s: string; + Palette: TcolorMap; +// x, y: double; +begin + SavedPal := false; + FStrings := TStringList.Create; + IFSStrings := TStringList.Create; + Tokens := TStringList.Create; + EntryStrings := TStringList.Create; + try + FStrings.LoadFromFile(ParamFile); + for i := 0 to FStrings.count - 1 do + if Pos(FileList[index] + ' ', Trim(FStrings[i])) = 1 then + break; + IFSStrings.Add(FStrings[i]); + repeat + inc(i); + IFSStrings.Add(FStrings[i]); + until Pos('}', FStrings[i]) <> 0; + ScriptEditor.cp.Clear; // initialize control point for new flame; + ScriptEditor.cp.background[0] := 0; + ScriptEditor.cp.background[1] := 0; + ScriptEditor.cp.background[2] := 0; + ScriptEditor.cp.sample_density := defSampleDensity; + ScriptEditor.cp.spatial_oversample := defOversample; + ScriptEditor.cp.spatial_filter_radius := defFilterRadius; + for i := 0 to FStrings.count - 1 do + begin + if Pos(Lowercase(FileList[index]) + ' ', Trim(Lowercase(FStrings[i]))) = 1 then + break; + end; + inc(i); + while (Pos('}', FStrings[i]) = 0) and (Pos('palette:', FStrings[i]) = 0) do + begin + EntryStrings.Add(FStrings[i]); + inc(i); + end; + if Pos('palette:', FStrings[i]) = 1 then + begin + SavedPal := True; + inc(i); + for j := 0 to 255 do begin + s := FStrings[i]; + GetTokens(s, Tokens); + Palette[j][0] := StrToInt(Tokens[0]); + Palette[j][1] := StrToInt(Tokens[1]); + Palette[j][2] := StrToInt(Tokens[2]); + inc(i); + end; + end; + FlameString := EntryStrings.Text; + ScriptEditor.cp.ParseString(FlameString); + for i := 0 to NXFORMS - 1 do + if ScriptEditor.cp.xform[i].density = 0 then break; + NumTransforms := i; + if SavedPal then ScriptEditor.cp.cmap := Palette; + ScriptEditor.cp.name := FileList[index]; + finally + IFSStrings.Free; + FStrings.Free; + Tokens.free; + EntryStrings.free; + end; +end; + +procedure TOperationLibrary.LoadFlameProc(AMachine: TatVirtualMachine); +var + i: integer; +begin + i := AMachine.GetInputArgAsInteger(0); + if (i >= 0) and (i < FileList.count) then + begin + (*if (LowerCase(ExtractFileExt(ParamFile)) = '.undo') or + (LowerCase(ExtractFileExt(ParamFile)) = '.apo') then + LoadFlame(i) + else*) + LoadXMLFlame(i); ; + end; +end; + +procedure TOperationLibrary.RotateFlameProc(AMachine: TatVirtualMachine); +var + Triangles: TTriangles; + i: integer; + r: double; + tx: TXForm; +begin + tx := TXForm.Create; + tx.Assign(scripteditor.cp.xform[NumTransforms]); + ScriptEditor.cp.TrianglesFromCp(Triangles); + r := AMachine.GetInputArgAsFloat(0) * pi / 180; + for i := -1 to NumTransforms - 1 do + begin + Triangles[i] := RotateTriangle(Triangles[i], r); + end; + ScriptEditor.cp.GetFromTriangles(Triangles, NumTransforms); + scripteditor.cp.xform[NumTransforms].Assign(tx); + tx.Free; +end; + +procedure TOperationLibrary.AddSymmetryProc(AMachine: TatVirtualMachine); +var + i: integer; + tx: TXForm; +begin + tx := TXForm.Create; + tx.Assign(scripteditor.cp.xform[NumTransforms]); + + ScriptEditor.cp.NormalizeProbabilities; // AV + add_symmetry_to_control_point(ScriptEditor.cp, AMachine.GetInputArgAsInteger(0)); + for i := 0 to NXFORMS - 1 do + if ScriptEditor.cp.xform[i].density = 0 then break; + NumTransforms := i; + scripteditor.cp.xform[i].Assign(tx); + tx.Free; +end; + +procedure TOperationLibrary.RotateReferenceProc(AMachine: TatVirtualMachine); +var + Triangles: TTriangles; + r: double; + tx: TXForm; +begin + tx := TXForm.Create; + tx.Assign(scripteditor.cp.xform[NumTransforms]); + ScriptEditor.cp.TrianglesFromCp(Triangles); + r := AMachine.GetInputArgAsFloat(0) * pi / 180; + Triangles[-1] := RotateTriangle(Triangles[-1], r); + ScriptEditor.cp.GetFromTriangles(Triangles, NumTransforms); + scripteditor.cp.xform[NumTransforms].Assign(tx); + tx.Free; +end; + +procedure TOperationLibrary.ScaleProc(AMachine: TatVirtualMachine); +begin + try + if (ActiveTransform < 0) or (ActiveTransform >= ScriptEditor.cp.NumXForms) then raise EFormatInvalid.Create(ErrorOutOfRange); + with AMachine do + ScriptEditor.cp.xform[ActiveTransform].Scale(GetInputArgAsFloat(0)); + except on E: EFormatInvalid do + begin + //ScriptEditor.Console.Lines.Add('Scale: ' + E.message); + Application.ProcessMessages; + LastError := 'Scale: ' + E.Message; + end; + end; +end; + +procedure TOperationLibrary.GetActiveTransformProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutputArg(ActiveTransform); +end; + +procedure TOperationLibrary.GetCurrentFile(AMachine: TatVirtualMachine); +begin +with AMachine do + ReturnOutputArg(OpenFile); +end; + +procedure TOperationLibrary.TransformsProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutputArg(NumTransforms); +end; + +procedure TOperationLibrary.GetVariation(AMachine: TatVirtualMachine); +var + i, n: integer; +begin + with AMachine do + begin + // AV: something was wrong here, I rewrote it... + { i := integer(Variation); + if (i >= NRVAR) or (i < 0) then + i := -1; } + i := 0; + if MainForm.mnuVRandom.Checked then i := -1 + else + for n := 0 to NRVAR - 1 do + if MainForm.VarMenus[n].Checked then + begin + i := n; + break; + end; + ReturnOutputArg(i); + end +end; + +procedure TOperationLibrary.SetVariation(AMachine: TatVirtualMachine); +var + i: integer; +begin + with AMachine do + begin + i := GetInputArgAsInteger(0); + if (i < 0) or (i >= NRVAR) then + i := NRVAR; + if i = NRVAR then + begin + MainForm.mnuVRandom.Checked := True; + // AV: outdated type... + Variation := vRandom; + // AV: only one variation type can be active + for i := 0 to NRVAR - 1 do + MainForm.VarMenus[i].Checked := False; + MainForm.mnuBuiltinVars.Checked := False; + MainForm.mnuPluginVars.Checked := False; + end else + begin + MainForm.VarMenus[i].Checked := True; + MainForm.mnuVRandom.Checked := False; + Variation := TVariation(i); + if (i >= NumBuiltinVars) then + begin + for i := 0 to NumBuiltinVars-1 do + MainForm.VarMenus[i].Checked := False; // AV: fixme + MainForm.mnuBuiltinVars.Checked := False; + MainForm.mnuPluginVars.Checked := True; + end + else begin + for i := NumBuiltinVars to NrVar - 1 do + MainForm.VarMenus[i].Checked := False; // AV: fixme + MainForm.mnuBuiltinVars.Checked := True; + MainForm.mnuPluginVars.Checked := False; + end; + end; + end +end; + +procedure TOperationLibrary.VariationIndexProc(AMachine: TatVirtualMachine); +var + i: integer; + str: string; +begin + with AMachine do begin + str := LowerCase(GetInputArgAsString(0)); + i := NRVAR-1; + while (i >= 0) and (LowerCase(varnames(i)) <> str) do Dec(i); + ReturnOutputArg(i); + end; +end; + +procedure TOperationLibrary.VariationNameProc(AMachine: TatVirtualMachine); +var + i: integer; + str: string; +begin + with AMachine do begin + i := GetInputArgAsInteger(0); + if (i >= 0) and (i < NRVAR) then + ReturnOutputArg(varnames(i)) + else + ReturnOutputArg(''); + end; +end; + +procedure TOperationLibrary.VariableIndexProc(AMachine: TatVirtualMachine); +var + i: integer; + str: string; +begin + with AMachine do begin + str := LowerCase(GetInputArgAsString(0)); + i := GetNrVariableNames-1; + while (i >= 0) and (LowerCase(GetVariableNameAt(i)) <> str) do Dec(i); + ReturnOutputArg(i); + end; +end; + +procedure TOperationLibrary.VariableNameProc(AMachine: TatVirtualMachine); +var + i: integer; + str: string; +begin + with AMachine do begin + i := GetInputArgAsInteger(0); + if (i >= 0) and (i < GetNrVariableNames) then + ReturnOutputArg(GetVariableNameAt(i)) + else + ReturnOutputArg(''); + end; +end; + +procedure TOperationLibrary.FileCountProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutputArg(FileList.Count); +end; + +procedure TOperationLibrary.ClearProc(AMachine: TatVirtualMachine); +var + i: integer; +begin + NumTransforms := 0; + ActiveTransform := -1; +{ + for i := 0 to NXFORMS - 1 do + ScriptEditor.cp.xform[i].density := 0; +} + ScriptEditor.cp.Clear; + ScriptEditor.cp.xform[0].symmetry := 1; + + with ScriptEditor.cp do + begin // AV: added 3D-camera resetting for new flames + cameraPitch := 0; + cameraYaw := 0; + cameraRoll := 0; + cameraPersp := 0; + cameraZPos := 0; + cameraDOF := 0; + end; +end; + +procedure TOperationLibrary.MorphProc(AMachine: TatVirtualMachine); +var + a, b, i: integer; + v: double; +begin + with AMachine do + begin + a := GetInputArgAsInteger(0); + b := GetInputArgAsInteger(1); + v := GetInputArgAsFloat(2); + if (a >= 0) and (a < NCPS) and (b >= 0) and (b < NCPS) then + begin // AV: added interpolation type, with default value "linear / HSV" + case InputArgCount of + 3: ScriptEditor.cp.InterpolateAll(cps[a], cps[b], v, 3); + 4: ScriptEditor.cp.InterpolateAll(cps[a], cps[b], v, GetInputArgAsInteger(3)); + else Exit; + end; + for i := 0 to NXFORMS - 1 do + if ScriptEditor.cp.xform[i].density = 0 then break; + NumTransforms := i; + end + else begin + LastError := Format('Morph(%d, %d, %g): ', [a, b, v]) + + TextByKey('script-status-varoutofrange'); + RuntimeError(LastError); + Scripter.Halt; + if LoadForm.CheckBox1.Checked then LoadForm.Show; // AV: show errors + end; + end; +end; + +procedure TOperationLibrary.PreviewProc(AMachine: TatVirtualMachine); +begin + if NumTransforms > 0 then + begin + //AMachine.Paused := True; // AV: it doesn't let to pause the animation + PreviewForm.cp.Copy(ScriptEditor.cp); + PreviewForm.cp.AdjustScale(PreviewForm.Image.Width, PreviewForm.Image.Height); + PreviewForm.Show; + PreviewForm.DrawFlame; + //AMachine.Paused := False; // AV: it doesn't let to pause the animation + Application.ProcessMessages; + end + else AMachine.Halt; +end; + +procedure TOperationLibrary.RenderProc(AMachine: TatVirtualMachine); +begin + if NumTransforms > 0 then + begin + ScriptRenderForm.cp.Copy(ScriptEditor.cp); + try + ScriptRenderForm.Caption := Format(ScriptRenderForm.Hint, + [ExtractFileName(ScriptEditor.Renderer.Filename)]); // AV + except + ScriptRenderForm.Caption := TextByKey('common-trace-rendering-oneslice'); + end; + ScriptRenderForm.Show; + ScriptRenderForm.Render; + end + else AMachine.Halt; +end; + +procedure TOperationLibrary.SetActiveTransformProc(AMachine: TatVirtualMachine); +var + i: integer; +begin + try + with AMachine do + i := GetInputArgAsInteger(0); + if (i >= 0) and (i < NXFORMS) then + ActiveTransform := i + else raise EFormatInvalid.Create('SetActiveTransform: ' + ErrorOutOfRange); + except on E: EFormatInvalid do + begin + Application.ProcessMessages; + LastError := E.Message; + Scripter.Halt; + end; + end; +end; + +procedure TOperationLibrary.AddTransformProc(AMachine: TatVirtualMachine); +var + i: integer; +begin + try + if NumTransforms < NXFORMS then + begin + ActiveTransform := NumTransforms; + inc(NumTransforms); + scriptEditor.cp.xform[NumTransforms].Assign(scriptEditor.cp.xform[ActiveTransform]); + scriptEditor.cp.xform[ActiveTransform].Clear; + ScriptEditor.cp.xform[ActiveTransform].density := 0.5; + end + else raise EFormatInvalid.Create('AddTransform: ' + TextByKey('script-status-toomanytransforms')); + except on E: EFormatInvalid do + begin + Application.ProcessMessages; + LastError := E.Message; + Scripter.Halt; + end; + end; +end; + +procedure TOperationLibrary.DeleteTransformProc(AMachine: TatVirtualMachine); +var + i, j: integer; +begin + try + // I'm not sure, but *maybe* this will help scripts not to screw up finalXform + if ActiveTransform = NumTransforms then + // final xform - just clear it + begin + scriptEditor.cp.xform[NumTransforms].Clear; + scriptEditor.cp.xform[NumTransforms].symmetry := 1; + scriptEditor.cp.finalXformEnabled := false; + exit; + end; + if NumTransforms <= 1 then exit; + + // delete xform from all probability tables + for i := 0 to NumTransforms-1 do + with scriptEditor.cp.xform[i] do begin + for j := ActiveTransform to NumTransforms-1 do + modWeights[j] := modWeights[j+1]; + modWeights[NumTransforms-1] := 1; + end; + // + + with scriptEditor.cp do begin + if ActiveTransform = (NumTransforms - 1) then + Dec(ActiveTransform) + else begin + for i := ActiveTransform to NumTransforms - 2 do + xform[i].Assign(xform[i + 1]); + end; + Dec(NumTransforms); + xform[NumTransforms].Assign(xform[NumTransforms+1]); + xform[NumTransforms+1].Clear; + end; + except + Application.ProcessMessages; + LastError := 'DeleteTransform: Oops!'; + i := LineNumberFromInstruction(AMachine.CurrentInstruction); // AV + ScriptEditor.Editor.ActiveLine := i; + ScriptEditor.Editor.ActiveLineSettings.ShowActiveLine := true; // AV + Scripter.Halt; + end; +end; + + +procedure TOperationLibrary.CopyTransformProc(AMachine: TatVirtualMachine); +var + old, i: integer; +begin + try + if NumTransforms < NXFORMS then + with ScriptEditor.cp do + begin + old := ActiveTransform; + ActiveTransform := NumTransforms; + inc(NumTransforms); + xform[NumTransforms].Assign(xform[ActiveTransform]); // final xform + xform[ActiveTransform].Assign(xform[old]); + + for i := 0 to NumTransforms-1 do + xform[i].modWeights[ActiveTransform] := xform[i].modWeights[old]; + xform[ActiveTransform].modWeights[ActiveTransform] := xform[old].modWeights[old]; + end + else raise EFormatInvalid.Create(TextByKey('script-status-toomanytransforms')); + except on E: EFormatInvalid do + begin + Application.ProcessMessages; + LastError := 'CopyTransform: ' + E.Message; + Scripter.Halt; + end; + end; +end; + +procedure TOperationLibrary.TranslateProc(AMachine: TatVirtualMachine); +var x, y: double; +begin + if ScriptEditor.cp.xform[ActiveTransform].postXswap then + begin + TranslatePXProc(AMachine); + Exit; + end; + try + if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then // was: NXFORMS-1 + raise EFormatInvalid.Create(ErrorOutOfRange); + with AMachine do + // AV: matrix multiplication must not affect the translation + // ScriptEditor.cp.xform[ActiveTransform].Translate(GetInputArgAsFloat(0), GetInputArgAsFloat(1)); + begin + x := GetInputArgAsFloat(0); + y := -1 * GetInputArgAsFloat(1); + end; + with ScriptEditor.cp.xform[ActiveTransform] do begin + c[2,0] := c[2,0] + x; + c[2,1] := c[2,1] + y; + end; + except on E: EFormatInvalid do + begin + Application.ProcessMessages; + LastError := 'Translate: ' + E.Message; + Scripter.Halt; + end; + end; +end; + +procedure TOperationLibrary.TranslatePXProc(AMachine: TatVirtualMachine); +var x, y: double; +begin + try + if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then + raise EFormatInvalid.Create(ErrorOutOfRange); + with AMachine do + begin + x := GetInputArgAsFloat(0); + y := -1 * GetInputArgAsFloat(1); + end; + with ScriptEditor.cp.xform[ActiveTransform] do begin + p[2,0] := p[2,0] + x; + p[2,1] := p[2,1] + y; + end; + except on E: EFormatInvalid do + begin + Application.ProcessMessages; + LastError := 'TranslatePX:' + E.Message; + Scripter.Halt; + end; + end; +end; + +procedure TOperationLibrary.NormalizeVars(AMachine: TatVirtualMachine); +begin + NormalizeVariations(ScriptEditor.cp); +end; + +{ ************************************* Form ********************************* } + +procedure TScriptEditor.FormCreate(Sender: TObject); +var + i: integer; +begin + self.Caption := TextByKey('script-title'); + btnBreak.Hint := TextByKey('script-break'); + btnNew.Hint := TextByKey('script-new'); + btnOpen.Hint := TextByKey('script-open'); + btnSave.Hint := TextByKey('script-save'); + btnRun.Hint := TextByKey('script-run'); + btnStop.Hint := TextByKey('script-stop'); + btnFavorite.Hint := TextByKey('script-faves'); + CodeButton.Hint := TextByKey('script-codeblocks'); + btnPause.Hint := TextByKey('script-pause'); + ShowCodeHints.Caption := TextByKey('script-codeblockhints'); + Panel1.Hint := TextByKey('script-codeblockhint'); + mnuUndo.Caption := TextByKey('common-undo'); + mnuRedo.Caption := TextByKey('common-redo'); + mnuCut.Caption := TextByKey('common-cut'); + mnuCopy.Caption := TextByKey('common-copy'); + mnuPaste.Caption := TextByKey('common-paste'); + mnuDeleteBlock.Caption := TextByKey('common-delete'); + EditCaption1.Caption := TextByKey('common-rename'); + FindReplace.Caption := TextByKey('script-findreplace'); + SurroundBlock.Caption := TextByKey('script-surround'); + CommentOut.Caption := TextByKey('script-commentout'); + CollapseBlocks.Caption := TextByKey('script-collapsecode'); + ExpandBlocks.Caption := TextByKey('script-expandcode'); + AddFromClipboard.Caption := TextByKey('script-clipboardview'); + ScrMemoFindReplaceDialog1.NotFoundMessage := TextByKey('script-textnotfound'); + StatusBar.Hint := TextByKey('script-status-default'); + StatusBar.SimpleText := StatusBar.Hint; + + // AV: changed to variable + ErrorOutOfRange := TextByKey('script-status-outofrange'); + RTError := #13#10 + TextByKey('script-runtimeerror') + #13#10 + + StringOfChar('=', length(TextByKey('script-runtimeerror'))) + #13#10; + DTError := #13#10 + TextByKey('script-compileerror') + #13#10 + + StringOfChar('=', length(TextByKey('script-compileerror'))) + #13#10; + + // AV: added language translation here: + SaveDialog.Filter := TextByKey('common-filter-flamefiles') + '|*.flame;*rand;*.template|' + + TextByKey('common-filter-allfiles') + '|*.*'; + OpenDialog.Filter := TextByKey('common-filter-flamefiles') + '|*.flame;*rand;*.template|' + + TextByKey('common-filter-scriptfiles') + '|*.asc;*aposcript|' + + TextByKey('common-filter-allfiles') + '|*.*'; + + Transform := TTransform.create; + FileList := TStringList.Create; + Flame := TFlame.Create; + Options := TOptions.Create; + Pivot := TPivot.Create; + Renderer := TScriptRender.create; + Another := TScriptRender.create; + cp := TControlPoint.create; + for i := 0 to 9 do + cps[i] := TControlPoint.create; + ScriptEditor.PrepareScripter; + + if (defScriptFile <> '') then // AV + try + if FileExists(defScriptFile) then begin + LoadScriptFile(defScriptFile); + Script := defScriptFile; + end; + except + Editor.Lines.Clear; + end; + + AdjustScripterColors; // AV: change scripter font ang background for dark themes +end; + +procedure TScriptEditor.FormDestroy(Sender: TObject); +var + i: integer; +begin + FileList.Free; + Renderer.Free; + Another.Free; + for i := 0 to 9 do + cps[i].free; + cp.free; + Flame.Free; + Transform.Free; + Options.Free; + Pivot.Free; +end; + +procedure TScriptEditor.FormShow(Sender: TObject); +var + Registry: TRegistry; +begin + Registry := TRegistry.Create; + try + Registry.RootKey := HKEY_CURRENT_USER; + if Registry.OpenKey('Software\' + APP_NAME + '\Forms\Script', False) then + begin + { Size and position } + if Registry.ValueExists('Left') then + ScriptEditor.Left := Registry.ReadInteger('Left'); + if Registry.ValueExists('Top') then + ScriptEditor.Top := Registry.ReadInteger('Top'); + if Registry.ValueExists('Width') then + ScriptEditor.Width := Registry.ReadInteger('Width'); + if Registry.ValueExists('Height') then + ScriptEditor.Height := Registry.ReadInteger('Height'); + if Registry.ValueExists('PreviewFrame') then // AV + PreviewForm.KeepFrame.Checked := Registry.ReadBool('PreviewFrame'); + end; + Registry.CloseKey; + finally + Registry.Free; + end; + + mnuUndo.Enabled := Editor.CanUndo; // AV + mnuRedo.Enabled := Editor.CanRedo; // AV +end; + +procedure TScriptEditor.FormClose(Sender: TObject; + var Action: TCloseAction); +var + Registry: TRegistry; +begin + { Write position to registry } + Registry := TRegistry.Create; + try + Registry.RootKey := HKEY_CURRENT_USER; + { Defaults } + if Registry.OpenKey('\Software\' + APP_NAME + '\Forms\Script', True) then + begin + { Size and position } + if ScriptEditor.WindowState <> wsMaximized then begin + Registry.WriteInteger('Top', ScriptEditor.Top); + Registry.WriteInteger('Left', ScriptEditor.Left); + Registry.WriteInteger('Width', ScriptEditor.Width); + Registry.WriteInteger('Height', ScriptEditor.Height); + Registry.WriteBool('PreviewFrame', PreviewForm.KeepFrame.Checked); // AV + end; + end; + finally + Registry.Free; + end; +end; +{ ************************ Flame interface *********************************** } + +{ The TFlame class is used only as an interface. The control point parameters + are read and set directly. Parameter ranges aren't limited but values not + in the correct range are ignored. } + +procedure TScriptEditor.GetFlameGammaThresholdProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(cp.gammaThreshRelative); +end; + +procedure TScriptEditor.SetFlameGammaThresholdProc(AMachine: TatVirtualMachine); +var + v: double; +begin + with AMachine do + begin + v := GetInputArgAsFloat(0); + if (v > 0) then cp.gammaThreshRelative := v; + end; +end; + +procedure TScriptEditor.GetFlameGammaProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(cp.Gamma); +end; + +procedure TScriptEditor.SetFlameGammaProc(AMachine: TatVirtualMachine); +var + v: double; +begin + with AMachine do + begin + v := GetInputArgAsFloat(0); + if (v > 0) and (v <= 5) then cp.Gamma := v; // AV: added max check + end; +end; + +procedure TScriptEditor.GetFlameBrightnessProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(cp.Brightness); +end; + +procedure TScriptEditor.SetFlameBrightnessProc(AMachine: TatVirtualMachine); +var + v: double; +begin + with AMachine do + begin + v := GetInputArgAsFloat(0); + if (v > 0) and (v <= 100) then cp.Brightness := v; // AV: added max check + end; +end; + +procedure TScriptEditor.GetFlameVibrancyProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(cp.Vibrancy); +end; + +procedure TScriptEditor.SetFlameVibrancyProc(AMachine: TatVirtualMachine); +var + v: double; +begin + with AMachine do + begin + v := GetInputArgAsFloat(0); + if (v > 0) and (v <= 30) then cp.Vibrancy := v; // AV: added max check + end; +end; + +procedure TScriptEditor.GetFlameContrastProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(cp.Contrast); // AV +end; + +procedure TScriptEditor.SetFlameContrastProc(AMachine: TatVirtualMachine); +var + v: double; +begin + with AMachine do + begin + v := GetInputArgAsFloat(0); + if (v >= 0.1) and (v <= 10) then cp.Contrast := v; // AV + end; +end; + +procedure TScriptEditor.GetFlameTimeProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(cp.Time); +end; + +procedure TScriptEditor.SetFlameTimeProc(AMachine: TatVirtualMachine); +var + v: double; +begin + with AMachine do + begin + v := GetInputArgAsFloat(0); + if (v >= 0) then cp.Time := v; + end; +end; + +procedure TScriptEditor.GetPreviewHeightProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(PreviewForm.ClientHeight); +end; + +procedure TScriptEditor.SetPreviewHeightProc(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if (v >= 100) and (v <= Screen.Height - 34) then + PreviewForm.ClientHeight:= v; + end; +end; + +procedure TScriptEditor.GetPreviewWidthProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(PreviewForm.ClientWidth); +end; + +procedure TScriptEditor.SetPreviewWidthProc(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if (v >= 100) and (v <= Screen.Width - 16) then + PreviewForm.ClientWidth:= v; + end; +end; + +procedure TScriptEditor.GetFlameZoomProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(cp.Zoom); +end; + +procedure TScriptEditor.SetFlameZoomProc(AMachine: TatVirtualMachine); +var + v: double; +begin + with AMachine do + begin + v := GetInputArgAsFloat(0); + if (v >= -3) and (v <= 3) then cp.Zoom := v; // AV: added check + end; +end; + +procedure TScriptEditor.GetFlameXProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(cp.center[0]); +end; + +procedure TScriptEditor.SetFlameXProc(AMachine: TatVirtualMachine); +begin + with AMachine do + cp.center[0] := GetInputArgAsFloat(0); +end; + +procedure TScriptEditor.GetFlameYProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(cp.center[1]); +end; + +procedure TScriptEditor.SetFlameYProc(AMachine: TatVirtualMachine); +begin + with AMachine do + cp.center[1] := GetInputArgAsFloat(0); +end; + +procedure TScriptEditor.GetFlameDensityProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(cp.sample_density); +end; + +procedure TScriptEditor.SetFlameDensityProc(AMachine: TatVirtualMachine); +var + v: double; +begin + with AMachine do + begin + v := GetInputArgAsFloat(0); + if v >= 0 then cp.sample_density := v; + end; +end; + +procedure TScriptEditor.GetFlameOversampleProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(cp.spatial_oversample); +end; + +procedure TScriptEditor.SetFlameOversampleProc(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + { Range = 1 to 4 ... (document this) } + if (v >= 1) and (v <= 4) then cp.spatial_oversample := v; + end; +end; + +procedure TScriptEditor.GetFlameFilterRadiusProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(cp.spatial_filter_radius); +end; + +procedure TScriptEditor.SetFlameFilterRadiusProc(AMachine: TatVirtualMachine); +var + v: double; +begin + with AMachine do + begin + v := GetInputArgAsFloat(0); + if v >= 0 then cp.spatial_filter_radius := v; + end; +end; + +procedure TScriptEditor.GetFlameFinalxformEnabledProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(cp.finalXformEnabled); +end; + +procedure TScriptEditor.SetFlameFinalxformEnabledProc(AMachine: TatVirtualMachine); +begin + with AMachine do + cp.finalXformEnabled := (GetInputArgAsInteger(0) <> 0); +end; + +procedure TScriptEditor.GetFlameSoloXformProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(cp.soloXform); +end; + +procedure TScriptEditor.SetFlameSoloXformProc(AMachine: TatVirtualMachine); +begin + with AMachine do + cp.soloXform := GetInputArgAsInteger(0); + if (cp.soloXform < 0) or (cp.soloXform >= NumTransforms) then + cp.soloXform := -1; +end; + +procedure TScriptEditor.GetFlameWidthProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(cp.width); +end; + +procedure TScriptEditor.SetFlameWidthProc(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if v >= 1 then cp.width := v; + end; +end; + +procedure TScriptEditor.GetFlameHeightProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(cp.height); +end; + +procedure TScriptEditor.SetFlameHeightProc(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if v >= 1 then cp.height := v; + end; +end; + +procedure TScriptEditor.GetFlamePixelsPerUnitProc(AMachine: TatVirtualMachine); +begin + with AMachine do +// ReturnOutPutArg(cp.pixels_per_unit); + ReturnOutPutArg(100 * cp.pixels_per_unit/cp.Width); +end; + +procedure TScriptEditor.SetFlamePixelsPerUnitProc(AMachine: TatVirtualMachine); +begin + with AMachine do +// cp.pixels_per_unit := GetInputArgAsInteger(0); <<--- hmm, ppu isn't integer :-\ + cp.pixels_per_unit := GetInputArgAsFloat(0) * cp.Width / 100.0; +end; + +procedure TScriptEditor.GetFlamePaletteProc(AMachine: TatVirtualMachine); +begin + with AMachine do // AV: was Integer(GetArrayIndex()) + ReturnOutPutArg(cp.cmap[GetArrayIndexAsInteger(0), GetArrayIndexAsInteger(1)]); +end; + +procedure TScriptEditor.SetFlamePaletteProc(AMachine: TatVirtualMachine); +var + i0, i1, v: integer; +begin + with AMachine do + begin + i0 := GetArrayIndexAsInteger(0); // AV: was GetArrayIndex(0) + i1 := GetArrayIndexAsInteger(1); // AV: was GetArrayIndex(1) + v := GetInputArgAsInteger(0); + if (i0 >= 0) and (i0 <= 255) and (i1 >= 0) and (i1 <= 2) and + (v >= 0) and (v < 256) then + cp.cmap[i0, i1] := v + else begin + LastError := 'Flame.Gradient[' + IntToStr(i0) + ', ' + IntToStr(i1) + ']: ' + + TextByKey('script-status-varoutofrange'); + Editor.ActiveLine := LineNumberFromInstruction(AMachine.CurrentInstruction); // AV + Editor.ActiveLineSettings.ShowActiveLine := true; // AV + Scripter.Halt; + end; + end; +end; + +procedure TScriptEditor.GetFlameBackgroundProc(AMachine: TatVirtualMachine); +begin + with AMachine do // AV: was Integer(GetArrayIndex(0)) + ReturnOutPutArg(cp.background[GetArrayIndexAsInteger(0)]); +end; + +procedure TScriptEditor.SetFlameBackgroundProc(AMachine: TatVirtualMachine); +var + i, v: integer; +begin + with AMachine do + begin + i := GetArrayIndexAsInteger(0); // AV: was GetArrayIndex(0) + v := GetInputArgAsInteger(0); + if (i >= 0) and (i <= 2) and (v >= 0) and (v < 256) then + cp.Background[i] := v + else begin + LastError := 'Flame.Background[' + IntToStr(i) + ']: ' + + TextByKey('script-status-varoutofrange'); + Editor.ActiveLine := LineNumberFromInstruction(AMachine.CurrentInstruction); // AV + Editor.ActiveLineSettings.ShowActiveLine := true; // AV + Scripter.Halt; + end; + end; +end; + +procedure TScriptEditor.SetFlameNameProc(AMachine: TatVirtualMachine); +begin + cp.name := AMachine.GetInputArgAsString(0); +end; + +procedure TScriptEditor.GetFlameNameProc(AMachine: TatVirtualMachine); +begin + AMachine.ReturnOutPutArg(cp.name); +end; + +(* +procedure TScriptEditor.SetFlameNickProc(AMachine: TatVirtualMachine); +begin + cp.nick := AMachine.GetInputArgAsString(0); +end; + +procedure TScriptEditor.GetFlameURLProc(AMachine: TatVirtualMachine); +begin + AMachine.ReturnOutPutArg(cp.url); +end; + +procedure TScriptEditor.SetFlameURLProc(AMachine: TatVirtualMachine); +begin + cp.url := AMachine.GetInputArgAsString(0); +end; + +procedure TScriptEditor.GetFlameNickProc(AMachine: TatVirtualMachine); +begin + AMachine.ReturnOutPutArg(cp.nick); +end; +*) + +procedure TScriptEditor.SetFlameHueProc(AMachine: TatVirtualMachine); +var + n: double; + //i: byte; + //h, s, v: real; +begin + n := AMachine.GetInputArgAsFloat(0); + if (n >= 0) and (n <= 1) then + begin + cp.hue_rotation := n; + {if (n = 0) or (n = 1) then exit; + for i := 0 to 255 do + begin + RGBToHSV(cp.cmap[i][0], cp.cmap[i][1], cp.cmap[i][2], h, s, v); + h := Round(360 + h + (n * 360)) mod 360; + HSVToRGB(h, s, v, cp.cmap[i][0], cp.cmap[i][1], cp.cmap[i][2]); + end; } + end; +end; + +procedure TScriptEditor.GetFlameHueProc(AMachine: TatVirtualMachine); +begin + AMachine.ReturnOutPutArg(cp.hue_rotation); +end; + +procedure TScriptEditor.GetFlameBatchesProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(cp.nbatches); +end; + +procedure TScriptEditor.SetFlameBatchesProc(AMachine: TatVirtualMachine); +begin + with AMachine do + cp.nbatches := GetInputArgAsInteger(0); +end; + +procedure TScriptEditor.GetFlameAngleProc(AMachine: TatVirtualMachine); +var + v:double; +begin + // AV: fixed, someone forgot to translate from/to radians + v := cp.FAngle * 180 / PI; + with AMachine do + ReturnOutPutArg(v); +end; + +procedure TScriptEditor.SetFlameAngleProc(AMachine: TatVirtualMachine); +var + v:double; +begin + // AV: fixed, someone forgot to translate from/to radians + with AMachine do + v := GetInputArgAsFloat(0); + cp.FAngle := v * PI / 180; +end; + +procedure TScriptEditor.GetFlamePitchProc(AMachine: TatVirtualMachine); +var + v:double; +begin + // fix: someone forgot to translate from/to radians + v := cp.cameraPitch * 180 / PI; + with AMachine do + ReturnOutPutArg(v); +end; + +procedure TScriptEditor.SetFlamePitchProc(AMachine: TatVirtualMachine); +var + v:double; +begin + // fix: someone forgot to translate from/to radians + with AMachine do + v := GetInputArgAsFloat(0); + cp.cameraPitch := v * PI / 180; +end; + +procedure TScriptEditor.GetFlameRollProc(AMachine: TatVirtualMachine); +var + v:double; +begin + // fix: someone forgot to translate from/to radians + v := cp.cameraRoll * 180 / PI; + with AMachine do + ReturnOutPutArg(v); +end; + +procedure TScriptEditor.SetFlameRollProc(AMachine: TatVirtualMachine); +var + v:double; +begin + // fix: someone forgot to translate from/to radians + with AMachine do + v := GetInputArgAsFloat(0); + cp.cameraRoll := v * PI / 180; +end; + +procedure TScriptEditor.GetFlameYawProc(AMachine: TatVirtualMachine); +var + v:double; +begin + // fix: someone forgot to translate from/to radians + v := cp.cameraYaw * 180 / PI; + with AMachine do + ReturnOutPutArg(v); +end; + +procedure TScriptEditor.SetFlameYawProc(AMachine: TatVirtualMachine); +var + v:double; +begin + // fix: someone forgot to translate from/to radians + with AMachine do + v := GetInputArgAsFloat(0); + cp.cameraYaw := v * PI / 180; +end; + +procedure TScriptEditor.GetFlameCamZposProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(cp.cameraZpos); +end; + +procedure TScriptEditor.SetFlameCamZposProc(AMachine: TatVirtualMachine); +begin + with AMachine do + cp.cameraZpos := GetInputArgAsFloat(0); +end; + +procedure TScriptEditor.GetFlamePerspectiveProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(cp.cameraPersp); +end; + +procedure TScriptEditor.SetFlamePerspectiveProc(AMachine: TatVirtualMachine); +begin + with AMachine do + cp.cameraPersp := GetInputArgAsFloat(0); +end; + +procedure TScriptEditor.GetFlameDOFProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(cp.cameraDOF); +end; + +procedure TScriptEditor.SetFlameDOFProc(AMachine: TatVirtualMachine); +begin + with AMachine do + cp.cameraDOF := GetInputArgAsFloat(0); +end; + +{ *************************** Transform interface **************************** } + +procedure TScriptEditor.GetTransformPostxformEnabledProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(cp.xform[ActiveTransform].postXswap); +end; + +procedure TScriptEditor.SetTransformPostxformEnabledProc(AMachine: TatVirtualMachine); +begin + with AMachine do + cp.xform[ActiveTransform].postXswap := (GetInputArgAsInteger(0) <> 0); +end; +/////////////////////////////// +procedure TScriptEditor.GetTransformAProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(cp.xform[ActiveTransform].c[0, 0]); +end; + +procedure TScriptEditor.SetTransformAProc(AMachine: TatVirtualMachine); +begin + with AMachine do + cp.xform[ActiveTransform].c[0, 0] := GetInputArgAsFloat(0); +end; + +procedure TScriptEditor.GetTransformBProc(AMachine: TatVirtualMachine); +var + v: double; +begin + v := cp.xform[ActiveTransform].c[1, 0]; + with AMachine do + ReturnOutPutArg(-v); // AV: fixed the sign +end; + +procedure TScriptEditor.SetTransformBProc(AMachine: TatVirtualMachine); +var + v: double; +begin + with AMachine do + v := GetInputArgAsFloat(0); + cp.xform[ActiveTransform].c[1, 0] := -v; // AV: fixed the sign +end; + +procedure TScriptEditor.GetTransformCProc(AMachine: TatVirtualMachine); +var + v: double; +begin + v := cp.xform[ActiveTransform].c[0, 1]; + with AMachine do + ReturnOutPutArg(-v); // AV: fixed the sign +end; + +procedure TScriptEditor.SetTransformCProc(AMachine: TatVirtualMachine); +var + v: double; +begin + with AMachine do + v := GetInputArgAsFloat(0); + cp.xform[ActiveTransform].c[0, 1] := -v; // AV: fixed the sign +end; + +procedure TScriptEditor.GetTransformDProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(cp.xform[ActiveTransform].c[1, 1]); +end; + +procedure TScriptEditor.SetTransformDProc(AMachine: TatVirtualMachine); +begin + with AMachine do + cp.xform[ActiveTransform].c[1, 1] := GetInputArgAsFloat(0); +end; + +procedure TScriptEditor.GetTransformEProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(cp.xform[ActiveTransform].c[2, 0]); +end; + +procedure TScriptEditor.SetTransformEProc(AMachine: TatVirtualMachine); +begin + with AMachine do + cp.xform[ActiveTransform].c[2, 0] := GetInputArgAsFloat(0); +end; + +procedure TScriptEditor.GetTransformFProc(AMachine: TatVirtualMachine); +var + v: double; +begin + v := cp.xform[ActiveTransform].c[2, 1]; + with AMachine do + ReturnOutPutArg(-v); // AV: fixed the sign +end; + +procedure TScriptEditor.SetTransformFProc(AMachine: TatVirtualMachine); +var + v: double; +begin + with AMachine do + v := GetInputArgAsFloat(0); + cp.xform[ActiveTransform].c[2, 1] := -v; // AV: fixed the sign +end; + +procedure TScriptEditor.GetTransformColorProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(cp.xform[ActiveTransform].Color); +end; + +procedure TScriptEditor.SetTransformColorProc(AMachine: TatVirtualMachine); +var + v: double; +begin + with AMachine do + begin + v := GetInputArgAsFloat(0); + if (v >= 0) and (v <= 1) then + cp.xform[ActiveTransform].Color := v + else begin + LastError := 'Transform.Color: ' + TextByKey('script-status-varoutofrange'); + Editor.ActiveLine := LineNumberFromInstruction(AMachine.CurrentInstruction); // AV + Editor.ActiveLineSettings.ShowActiveLine := true; // AV + Scripter.Halt; + end; + end; +end; + +procedure TScriptEditor.GetTransformVarColorProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(cp.xform[ActiveTransform].pluginColor); +end; + +procedure TScriptEditor.SetTransformVarColorProc(AMachine: TatVirtualMachine); +var + v: double; +begin + with AMachine do + begin + v := GetInputArgAsFloat(0); + if (v >= 0) and (v <= 1) then + cp.xform[ActiveTransform].pluginColor := v + else begin + LastError := 'Transform.VarColor: ' + TextByKey('script-status-varoutofrange'); + Editor.ActiveLine := LineNumberFromInstruction(AMachine.CurrentInstruction); // AV + Editor.ActiveLineSettings.ShowActiveLine := true; // AV + Scripter.Halt; + end; + end; +end; + +procedure TScriptEditor.GetTransformWeightProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(cp.xform[ActiveTransform].density); +end; + +procedure TScriptEditor.SetTransformWeightProc(AMachine: TatVirtualMachine); +var + v: double; +begin + with AMachine do + begin + v := GetInputArgAsFloat(0); + if (v >= 1E-6) and (v <= MAX_WEIGHT) then // AV: was min=0 that is not allowed + cp.xform[ActiveTransform].density := v + else begin + LastError := 'Transform.Weight: ' + TextByKey('script-status-varoutofrange'); + Editor.ActiveLine := LineNumberFromInstruction(AMachine.CurrentInstruction); // AV + Editor.ActiveLineSettings.ShowActiveLine := true; // AV + Scripter.Halt; + end; + end; +end; + +procedure TScriptEditor.GetTransformSymProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(cp.xform[ActiveTransform].symmetry); +end; + +procedure TScriptEditor.SetTransformSymProc(AMachine: TatVirtualMachine); +var + v: double; + s: string; +begin + with AMachine do + begin + v := GetInputArgAsFloat(0); + if (v >= -1) and (v <= 1) then + cp.xform[ActiveTransform].symmetry := v + else begin + s := AMachine.CurrentPropertyName; + LastError := 'Transform.' + s + ': ' + TextByKey('script-status-varoutofrange'); + Editor.ActiveLine := LineNumberFromInstruction(AMachine.CurrentInstruction); // AV + Editor.ActiveLineSettings.ShowActiveLine := true; // AV + Scripter.Halt; + end; + end; +end; + +procedure TScriptEditor.GetTransformVarProc(AMachine: TatVirtualMachine); +begin + with AMachine do // AV: was GetArrayIndex(0) + ReturnOutPutArg(cp.xform[ActiveTransform].GetVariation(GetArrayIndexAsInteger(0))); +end; + +procedure TScriptEditor.SetTransformVarProc(AMachine: TatVirtualMachine); +var + v: double; + i: integer; +begin + with AMachine do + begin + v := GetInputArgAsFloat(0); + i := GetArrayIndexAsInteger(0); // AV: was GetArrayIndex(0) + if (i >= 0) and (i < NRVAR) then + cp.xform[ActiveTransform].SetVariation(i, v); + end; +end; + +procedure TScriptEditor.GetTransformVariProc(AMachine: TatVirtualMachine); +var + v: double; +begin + with AMachine do begin // AV: was GetArrayIndex(0) + cp.xform[ActiveTransform].GetVariable(GetVariableNameAt(GetArrayIndexAsInteger(0)), v); + ReturnOutPutArg(v); + end; +end; + +procedure TScriptEditor.SetTransformVariProc(AMachine: TatVirtualMachine); +var + v: double; + i: integer; +begin + with AMachine do + begin + v := GetInputArgAsFloat(0); + i := GetArrayIndexAsInteger(0); // AV: was GetArrayIndex(0) + if (i >= 0) and (i < GetNrVariableNames) then + cp.xform[ActiveTransform].SetVariable(GetVariableNameAt(i), v); + end; +end; + +procedure TScriptEditor.GetTransformChaosProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(cp.xform[ActiveTransform].modWeights[Integer(GetArrayIndex(0))]); +end; + +procedure TScriptEditor.SetTransformChaosProc(AMachine: TatVirtualMachine); +var + v: double; + i: integer; +begin + with AMachine do + begin + v := GetInputArgAsFloat(0); + i := GetArrayIndexAsInteger(0); // AV: was GetArrayIndex(0) + if (i >= 0) and (i < NumTransforms) then + cp.xform[ActiveTransform].modWeights[i] := v + else begin + LastError := 'Transform.Chaos[' + IntToStr(i) + ']: ' + + TextByKey('script-status-varoutofrange'); + i := LineNumberFromInstruction(AMachine.CurrentInstruction); // AV + Editor.ActiveLine := i; // AV + Editor.ActiveLineSettings.ShowActiveLine := true; // AV + Scripter.Halt; + end; + end; +end; + +procedure TScriptEditor.GetTransformPlotModeProc(AMachine: TatVirtualMachine); +begin + with AMachine do + if cp.xform[ActiveTransform].transOpacity=0 then + ReturnOutPutArg(1) + else + ReturnOutPutArg(0); +end; + +procedure TScriptEditor.SetTransformPlotModeProc(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if (v <> 0) then cp.xform[ActiveTransform].transOpacity := 1 + else cp.xform[ActiveTransform].transOpacity := 0; + end; +end; + +procedure TScriptEditor.GetTransformOpacityProc(AMachine: TatVirtualMachine); +begin + AMachine.ReturnOutPutArg(cp.xform[ActiveTransform].transOpacity) +end; + +procedure TScriptEditor.SetTransformOpacityProc(AMachine: TatVirtualMachine); +var + v: double; +begin + with AMachine do + begin + v := GetInputArgAsFloat(0); + if (v >= 0) and (v <= 1) then // AV: add a check + cp.xform[ActiveTransform].transOpacity := v + else begin // AV: add error handler + LastError := 'Transform.Opacity: ' + TextByKey('script-status-varoutofrange'); + Editor.ActiveLine := + LineNumberFromInstruction(AMachine.CurrentInstruction); // AV + Editor.ActiveLineSettings.ShowActiveLine := true; // AV + Scripter.Halt; + end; + end; +end; + +// -- vars as props -- + +procedure TScriptEditor.GetTransformVariationProc(AMachine: TatVirtualMachine); +var + i: integer; + v: double; +begin + if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin + // ScriptEditor.Console.Lines.Add(ErrorOutOfRange); + LastError := 'Transform.Variation[]: ' + ErrorOutOfRange; + Scripter.Halt; + exit; + end; + + with AMachine do + begin + i := 0; + while (i < NRVAR) and (Lowercase(varnames(i)) <> Lowercase(CurrentPropertyName)) do Inc(i); + if (i < NRVAR) then + ReturnOutPutArg(cp.xform[ActiveTransform].GetVariation(i)) + else begin // shouldn't happen + LastError := 'Cannot find variation at index ' + CurrentPropertyName + ' - ignoring'; + // ScriptEditor.Console.Lines.Add(LastError); + // Scripter.Halt; + end; + end; +end; + +procedure TScriptEditor.SetTransformVariationProc(AMachine: TatVirtualMachine); +var + i: integer; + v: double; +begin + if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin + // ScriptEditor.Console.Lines.Add(ErrorOutOfRange); + LastError := 'Transform.Variation[]: ' + ErrorOutOfRange; + Scripter.Halt; + exit; + end; + + with AMachine do + begin + i := 0; + while (i < NRVAR) and (lowercase(varnames(i)) <> lowercase(CurrentPropertyName)) do Inc(i); + if (i < NRVAR) then + cp.xform[ActiveTransform].SetVariation(i, GetInputArgAsFloat(0)) + else begin // shouldn't happen + LastError := 'Cannot find variation at index ' + CurrentPropertyName + ' - ignoring'; + // ScriptEditor.Console.Lines.Add(LastError); + // Scripter.Halt; + end; + end; +end; + +procedure TScriptEditor.GetTransformVariableProc(AMachine: TatVirtualMachine); +var + v: double; +begin + if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin + // ScriptEditor.Console.Lines.Add(ErrorOutOfRange); + LastError := 'Transform.Variable[]: ' + ErrorOutOfRange; + Scripter.Halt; + exit; + end; + + with AMachine do + begin + cp.xform[ActiveTransform].GetVariable(CurrentPropertyName, v); + ReturnOutPutArg(v); + end; +end; + +procedure TScriptEditor.SetTransformVariableProc(AMachine: TatVirtualMachine); +var + v: double; +begin + if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin + // ScriptEditor.Console.Lines.Add(ErrorOutOfRange); + LastError := 'Transform.Variable[]: ' + ErrorOutOfRange; + Scripter.Halt; + exit; + end; + + with AMachine do + begin + v := GetInputArgAsFloat(0); + cp.xform[ActiveTransform].SetVariable(CurrentPropertyName, v); + end +end; + +//////////// Variaton Order Utils /////////// +procedure TScriptEditor.TransformMoveVarProc(AMachine: TatVirtualMachine); +var + v: string; + i, n: integer; +begin + with AMachine do begin + v := GetInputArgAsString(0); // name + n := GetInputArgAsInteger(1); // position + end; + i := GetVariationIndex(v); + if (i >= 0) and (n >= 0) and (n < NrVar) then + begin + i := cp.xform[ActiveTransform].ifs.IndexOf(v); + cp.xform[ActiveTransform].ifs.Move(i, n); + end; +end; + +procedure TScriptEditor.TransformExchangeVarsProc(AMachine: TatVirtualMachine); +var + v, s: string; + i, n: integer; +begin + with AMachine do begin + v := GetInputArgAsString(0); + s := GetInputArgAsString(1); + end; + i := GetVariationIndex(v); + n := GetVariationIndex(s); + if (i >= 0) and (i < NrVar) and (n >= 0) and (n < NrVar) then + cp.xform[ActiveTransform].ifs.Exchange(i, n); +end; + +procedure TScriptEditor.TransformCopyVarOrderProc(AMachine: TatVirtualMachine); +var i: integer; +begin + i := AMachine.GetInputArgAsInteger(0); + if (i <> ActiveTransform) and (i >= 0) and (i <= Transforms) then + cp.xform[ActiveTransform].ifs.Assign(cp.xform[i].ifs); +end; + +procedure TScriptEditor.TransformGetVarOrderProc(AMachine: TatVirtualMachine); +var v: string; + i: integer; +begin + with AMachine do + v := GetInputArgAsString(0); + i := cp.xform[ActiveTransform].ifs.IndexOf(v); + AMachine.ReturnOutPutArg(i); +end; + +procedure TScriptEditor.TransformSortVarsProc(AMachine: TatVirtualMachine); +begin + cp.xform[ActiveTransform].ifs.Sort; + cp.xform[ActiveTransform].ifs.Sorted := False; +end; + +procedure TScriptEditor.TransformDefaultVarOrderProc(AMachine: TatVirtualMachine); +var i: integer; +begin + for i := 0 to NrVar-1 do + cp.xform[ActiveTransform].ifs.Strings[i] := Varnames(i); +end; + +procedure TScriptEditor.TransformDisplayVarsProc(AMachine: TatVirtualMachine); +var i: integer; +begin + Console.Lines.Add(''); + if ActiveTransform = Transforms then + Console.Lines.Add('Variation Order for Final Transform') + else + Console.Lines.Add('Variation Order for Transform ' + IntToStr(ActiveTransform + 1)); + Console.Lines.Add('==========================='); + for i := 0 to NrVar-1 do + Console.Lines.Add(IntToStr(i) + #32#32 + cp.xform[ActiveTransform].ifs.Strings[i]); +end; +//////////////////////////////////////////// + +procedure TScriptEditor.GetTransformNameProc(AMachine: TatVirtualMachine); +begin + if (ActiveTransform < 0) or (ActiveTransform >= Transforms) then begin + LastError := 'Transform.Name: ' + ErrorOutOfRange; + Editor.ActiveLine := LineNumberFromInstruction(AMachine.CurrentInstruction); // AV + Editor.ActiveLineSettings.ShowActiveLine := true; // AV + Scripter.Halt; + exit; + end; + + with AMachine do ReturnOutputArg(cp.xform[ActiveTransform].TransformName); +end; + +procedure TScriptEditor.SetTransformNameProc(AMachine: TatVirtualMachine); +begin + if (ActiveTransform < 0) or (ActiveTransform >= Transforms) then begin + LastError := 'Transform.Name: ' + ErrorOutOfRange; + Editor.ActiveLine := LineNumberFromInstruction(AMachine.CurrentInstruction); // AV + Editor.ActiveLineSettings.ShowActiveLine := true; // AV + Scripter.Halt; + exit; + end; + + with AMachine do + cp.xform[ActiveTransform].TransformName := GetInputArgAsString(0);; +end; + +// -- coefs & post-coefs -- + +procedure TScriptEditor.GetTransformCoefsProc(AMachine: TatVirtualMachine); +var + v: double; + i, j: integer; +begin +{ + if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin + // ScriptEditor.Console.Lines.Add(ErrorOutOfRange); + LastError := 'Transform.coefs[]: ' + ErrorOutOfRange; + Scripter.Halt; + exit; + end; +} + with AMachine do begin + i := GetArrayIndex(0); + j := GetArrayIndex(1); + if (i < 0) or (i > 2) or (j < 0) or (j > 1) then begin + LastError := 'Transform.coefs[]: ' + TextByKey('script-status-varoutofrange'); + Editor.ActiveLine := + LineNumberFromInstruction(AMachine.CurrentInstruction); // AV + Editor.ActiveLineSettings.ShowActiveLine := true; // AV + Scripter.Halt; + exit; + end; + v := cp.xform[ActiveTransform].c[i, j]; + if (i=0)and(j=0) or (i=1)and(j=1) or (i=2)and(j=0) then + ReturnOutPutArg(v) + else + ReturnOutPutArg(-v); + end; +end; + +procedure TScriptEditor.SetTransformCoefsProc(AMachine: TatVirtualMachine); +var + v: double; + i, j: integer; +begin +{ + if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin + // ScriptEditor.Console.Lines.Add(ErrorOutOfRange); + LastError := 'Transform.coefs[]: ' + ErrorOutOfRange; + Scripter.Halt; + exit; + end; +} + with AMachine do + begin + i := GetArrayIndex(0); + j := GetArrayIndex(1); + if (i < 0) or (i > 2) or (j < 0) or (j > 1) then begin + LastError := 'Transform.coefs[]: ' + TextByKey('script-status-varoutofrange'); + Editor.ActiveLine := + LineNumberFromInstruction(AMachine.CurrentInstruction); // AV + Editor.ActiveLineSettings.ShowActiveLine := true; // AV + Scripter.Halt; + exit; + end; + v := GetInputArgAsFloat(0); + if (i=0)and(j=0) or (i=1)and(j=1) or (i=2)and(j=0) then + cp.xform[ActiveTransform].c[i, j] := v + else if (i=0)and(j=1) or (i=1)and(j=0) or (i=2)and(j=1) then + cp.xform[ActiveTransform].c[i, j] := -v; + end; +end; + +procedure TScriptEditor.GetTransformPostCoefsProc(AMachine: TatVirtualMachine); +var + v: double; + i, j: integer; +begin +{ + if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin + // ScriptEditor.Console.Lines.Add(ErrorOutOfRange); + LastError := 'Transform.post[]: ' + ErrorOutOfRange; + Scripter.Halt; + exit; + end; +} + with AMachine do begin + i := GetArrayIndex(0); + j := GetArrayIndex(1); + if (i < 0) or (i > 2) or (j < 0) or (j > 1) then begin + LastError := 'Transform.post[]: ' + TextByKey('script-status-varoutofrange'); + Editor.ActiveLine := + LineNumberFromInstruction(AMachine.CurrentInstruction); // AV + Editor.ActiveLineSettings.ShowActiveLine := true; // AV + Scripter.Halt; + exit; + end; + v := cp.xform[ActiveTransform].p[i, j]; + if (i=0)and(j=0) or (i=1)and(j=1) or (i=2)and(j=0) then + ReturnOutPutArg(v) + else + ReturnOutPutArg(-v); + end; +end; + +procedure TScriptEditor.SetTransformPostCoefsProc(AMachine: TatVirtualMachine); +var + v: double; + i, j: integer; +begin +{ + if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin + // ScriptEditor.Console.Lines.Add(ErrorOutOfRange); + LastError := 'Transform.post[]: ' + ErrorOutOfRange; + Scripter.Halt; + exit; + end; +} + with AMachine do + begin + i := GetArrayIndex(0); + j := GetArrayIndex(1); + if (i < 0) or (i > 2) or (j < 0) or (j > 1) then begin + LastError := 'Transform.post[]: ' + TextByKey('script-status-varoutofrange'); + Editor.ActiveLine := + LineNumberFromInstruction(AMachine.CurrentInstruction); // AV + Editor.ActiveLineSettings.ShowActiveLine := true; // AV + Scripter.Halt; + exit; + end; + v := GetInputArgAsFloat(0); + if (i=0)and(j=0) or (i=1)and(j=1) or (i=2)and(j=0) then + cp.xform[ActiveTransform].p[i, j] := v + else if (i=0)and(j=1) or (i=1)and(j=0) or (i=2)and(j=1) then + cp.xform[ActiveTransform].p[i, j] := -v; + end; +end; + +procedure TScriptEditor.TransformSwapCoefsProc(AMachine: TatVirtualMachine); +var + i, j: integer; + t: double; +begin + with cp.xform[ActiveTransform] do + for i := 0 to 2 do + for j := 0 to 1 do + begin + t := c[i, j]; + c[i,j] := p[i, j]; + p[i, j] := t; + end; +end; + +procedure TScriptEditor.TransformResetVariables(AMachine: TatVirtualMachine); +var i: integer; +begin + for i:= 0 to GetNrVariableNames - 1 do begin + cp.xform[ActiveTransform].ResetVariable(GetVariableNameAt(i)); + end; +end; + +procedure TScriptEditor.CodeButtonClick(Sender: TObject); +begin + Panel1.Visible := not Panel1.Visible; + CodeButton.Down := Panel1.Visible; +end; + +procedure TScriptEditor.CollapseBlocksClick(Sender: TObject); +begin + Editor.CollapseAllNodes; +end; + +procedure TScriptEditor.SurroundByClick(Sender: TObject); // AV: for code auto-completition +var i, j, k, m: integer; +begin + if Sender = N5 then + Editor.Selection := ' { ' + Editor.Selection + ' } ' + else if Sender = N6 then + Editor.Selection := ' (* ' + Editor.Selection + ' *) ' + else if Sender = N7 then + with Editor do begin + if (SelStartY = SelEndY) then + InsertTextAtXY( ' // ', SelStartX, SelStartY) + else begin + mnuUndo.Enabled := True; + BeginUpdate; + if (SelStartY > SelEndY) then + begin + j := SelEndX; + k := SelEndY; + m := SelStartY; + end + else begin + j := SelStartX; + k := SelStartY; + m := SelEndY; + end; + for i := k + 1 to m do + InsertTextAtXY(' // ', 0, i); + InsertTextAtXY(' // ', j, k); + EndUpdate; + end; + end + else + with Editor do + begin + //if SelLength = 0 then exit; + mnuUndo.Enabled := True; + BeginUpdate; + if (SelEndY = Lines.Count-1) then Lines.Add(''); + if (SelStartY > SelEndY) then + begin + k := SelEndY; + m := SelStartY; + end + else begin + k := SelStartY; + m := SelEndY; + end; + BlockIndent(k, m, 4); + if Sender = BeginEnd1 then begin + InsertTextAtXY('begin'#13#10, 0, k); + InsertTextAtXY('end;'#13#10, 0, m + 2); + end + else begin // if Sender = TryExcept1 + InsertTextAtXY('try'#13#10, 0, k); + InsertTextAtXY('except'#13#10#13#10'end;'#13#10, 0, m + 2); + end; + EndUpdate; + end; +end; + +procedure TScriptEditor.TransformClearProc(AMachine: TatVirtualMachine); +begin + cp.xform[ActiveTransform].Clear; + if ActiveTransform < Transforms then + cp.xform[ActiveTransform].density := 0.5 + else + cp.xform[ActiveTransform].symmetry := 1; +end; + +procedure TScriptEditor.TransformRotateOriginProc(AMachine: TatVirtualMachine); +var + tx, ty, rad, sinr, cosr: double; +begin + + if cp.xform[ActiveTransform].postXswap then + begin + TransformRotatePXOriginProc(AMachine); + Exit; + end; + + if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin + // ScriptEditor.Console.Lines.Add(ErrorOutOfRange); + LastError := 'Transform.RotateOrigin: ' + ErrorOutOfRange; + Scripter.Halt; + exit; + end; + + rad := AMachine.GetInputArgAsFloat(0) * pi / 180; + SinCos(rad, sinr, cosr); + with EditForm.WorldPivot do + with cp.xform[ActiveTransform] do begin + tx := x + (c[2,0] - x) * cosr - (-c[2,1] - y) * sinr; + ty := y + (c[2,0] - x) * sinr + (-c[2,1] - y) * cosr; + c[2,0] := tx; + c[2,1] := -ty; + end; +end; + +procedure TScriptEditor.TransformRotatePXOriginProc(AMachine: TatVirtualMachine); +var + tx, ty, rad, sinr, cosr: double; +begin + if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin + LastError := 'Transform.RotatePXOrigin: ' + ErrorOutOfRange; + Scripter.Halt; + exit; + end; + + rad := AMachine.GetInputArgAsFloat(0) * pi / 180; + SinCos(rad, sinr, cosr); + with EditForm.WorldPivot do + with cp.xform[ActiveTransform] do begin + tx := x + (p[2,0] - x) * cosr - (-p[2,1] - y) * sinr; + ty := y + (p[2,0] - x) * sinr + (-p[2,1] - y) * cosr; + p[2,0] := tx; + p[2,1] := -ty; + end; +end; + +// AV -- pivot-aware reflections -- + +procedure TScriptEditor.TransformFlipHorizProc(AMachine: TatVirtualMachine); +begin + if cp.xform[ActiveTransform].postXswap then + begin + TransformFlipPXHorizProc(AMachine); + Exit; + end; + if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin + LastError := 'Transform.FlipHoriz: ' + ErrorOutOfRange; + Scripter.Halt; + exit; + end; + + with cp.xform[ActiveTransform] do + begin + c[0,0] := -c[0,0]; + c[1,0] := -c[1,0]; + with EditForm do + if (PivotMode = PivotWorld) then + c[2,0] := 2 * WorldPivot.x - c[2,0]; + end; +end; + +procedure TScriptEditor.TransformFlipPXHorizProc(AMachine: TatVirtualMachine); +begin + if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin + LastError := 'Transform.FlipPXHoriz: ' + ErrorOutOfRange; + Scripter.Halt; + exit; + end; + + with cp.xform[ActiveTransform] do + begin + p[0,0] := -p[0,0]; + p[1,0] := -p[1,0]; + with EditForm do + if (PivotMode = PivotWorld) then + p[2,0] := 2 * WorldPivot.x - p[2,0]; + end; +end; + +procedure TScriptEditor.TransformFlipVertProc(AMachine: TatVirtualMachine); +begin + if cp.xform[ActiveTransform].postXswap then + begin + TransformFlipPXVertProc(AMachine); + Exit; + end; + + if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin + LastError := 'Transform.FlipVert: ' + ErrorOutOfRange; + Scripter.Halt; + exit; + end; + + with cp.xform[ActiveTransform] do + begin + c[0,1] := -c[0,1]; + c[1,1] := -c[1,1]; + with EditForm do + if (PivotMode = PivotWorld) then + c[2,1] := -2 * WorldPivot.y - c[2,1]; + end; +end; + +procedure TScriptEditor.TransformFlipPXVertProc(AMachine: TatVirtualMachine); +begin + if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin + LastError := 'Transform.FlipPXVert: ' + ErrorOutOfRange; + Scripter.Halt; + exit; + end; + + with cp.xform[ActiveTransform] do + begin + p[0,1] := -p[0,1]; + p[1,1] := -p[1,1]; + with EditForm do + if (PivotMode = PivotWorld) then + p[2,1] := -2 * WorldPivot.y - p[2,1]; + end; +end; + +// -- pivot-aware rotating & scaling -- + +procedure TScriptEditor.TransformRotateProc(AMachine: TatVirtualMachine); +var + Triangles: TTriangles; + px, py: double; + + tx: TXForm; +begin + if cp.xform[ActiveTransform].postXswap then + begin + TransformRotatePXProc(AMachine); + Exit; + end; + + if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin + LastError := 'Transform.Rotate: ' + ErrorOutOfRange; + Scripter.Halt; + exit; + end; + + tx := TXForm.Create; + tx.Assign(scripteditor.cp.xform[NumTransforms]); // just in case (?) + + EditForm.ScriptGetPivot(px, py); + cp.TrianglesFromCp(Triangles); // it's ugly but it works... + Triangles[ActiveTransform] := + RotateTrianglePoint(Triangles[ActiveTransform], px, py, AMachine.GetInputArgAsFloat(0) * pi / 180); + cp.GetFromTriangles(Triangles, NumTransforms); + + cp.xform[NumTransforms].Assign(tx); + tx.Free; +end; + +procedure TScriptEditor.TransformScaleProc(AMachine: TatVirtualMachine); +var + Triangles: TTriangles; + px, py: double; + + tx: TXForm; +begin + if cp.xform[ActiveTransform].postXswap then + begin + TransformScalePXProc(AMachine); + Exit; + end; + + if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin + // ScriptEditor.Console.Lines.Add(ErrorOutOfRange); + LastError := 'Transform.Scale: ' + ErrorOutOfRange; + Scripter.Halt; + exit; + end; + + tx := TXForm.Create; + tx.Assign(scripteditor.cp.xform[NumTransforms]); // just in case (?) + + EditForm.ScriptGetPivot(px, py); + cp.TrianglesFromCp(Triangles); // it's ugly but it works... + Triangles[ActiveTransform] := + ScaleTrianglePoint(Triangles[ActiveTransform], px, py, AMachine.GetInputArgAsFloat(0)); + cp.GetFromTriangles(Triangles, NumTransforms); + + cp.xform[NumTransforms].Assign(tx); + tx.Free; +end; + +procedure TScriptEditor.TransformScalePXProc(AMachine: TatVirtualMachine); +var + i, j: integer; + s: double; +begin + if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin + // ScriptEditor.Console.Lines.Add(ErrorOutOfRange); + LastError := 'Transform.ScalePX: ' + ErrorOutOfRange; + Scripter.Halt; + exit; + end; + s := AMachine.GetInputArgAsFloat(0); + with cp.xform[ActiveTransform] do + begin + for i := 0 to 1 do + for j:= 0 to 1 do + p[i,j] := p[i,j] * s; + with EditForm do + if (PivotMode = PivotWorld) then + begin + p[2,0] := WorldPivot.x + (p[2,0]- WorldPivot.x) * s; + p[2,1] := -WorldPivot.y + (p[2,1]+ WorldPivot.y) * s; + end; + end; +end; + +procedure TScriptEditor.TransformRotatePXProc(AMachine: TatVirtualMachine); +var + v, tx, ty, tx0, tx1, ty0, ty1, sv, cv: double; +begin + try + if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then + raise EFormatInvalid.Create('Transform.RotatePX: ' + ErrorOutOfRange); + with AMachine do + v := GetInputArgAsFloat(0) * PI / 180; + SinCos(v, sv, cv); + with cp.xform[ActiveTransform] do + begin + tx0 := p[0,0] * cv - (-p[0,1] * sv); + tx1 := p[0,0] * sv + (-p[0,1] * cv); + ty0 := -p[1,0] * cv - p[1,1] * sv; + ty1 := -p[1,0] * sv + p[1,1] * cv; + p[0,0] := tx0; + p[0,1] := -tx1; + p[1,0] := -ty0; + p[1,1] := ty1; + with EditForm do + if (PivotMode = PivotWorld) then + begin + tx := WorldPivot.x + (p[2,0] - WorldPivot.x) * cv - (-p[2,1] - WorldPivot.y) * sv; + ty := WorldPivot.y + (p[2,0] - WorldPivot.x) * sv + (-p[2,1] - WorldPivot.y) * cv; + p[2,0] := tx; + p[2,1] := -ty; + end; + end; + except on E: EFormatInvalid do + begin + Application.ProcessMessages; + LastError := 'Transform.RotatePX: ' + E.Message; + Scripter.Halt; + end; + end; +end; + +{ *************************** Render interface ****************************** } + + +procedure TScriptEditor.GetRenderEmbedParams(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutputArg(TScriptRender(CurrentObject).EmbedParameters); +end; + +procedure TScriptEditor.SetRenderEmbedParams(AMachine: TatVirtualMachine); +begin + with AMachine do + TScriptRender(CurrentObject).EmbedParameters := GetInputArgAsBoolean(0); +end; + +procedure TScriptEditor.GetRenderFilenameProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(TScriptRender(CurrentObject).Filename); +end; + +procedure TScriptEditor.SetRenderFilenameProc(AMachine: TatVirtualMachine); +var rdir: string; +begin + rdir := AMachine.GetInputArgAsString(0); + if DirectoryExists(ExtractFilePath(rdir)) then + begin // AV + if ExtractFileExt(rdir) = '' then + rdir := rdir + '.jpg'; + TScriptRender(AMachine.CurrentObject).Filename := rdir; + end + else begin + LastError := 'Renderer.FileName: ' + TextByKey('render-status-pathdoesnotexist'); + AMachine.RuntimeError(LastError); // AV + AMachine.Halt; + if LoadForm.CheckBox1.Checked then LoadForm.Show; // AV + end; +end; + +procedure TScriptEditor.GetRenderWidthProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(TScriptRender(CurrentObject).Width); +end; + +procedure TScriptEditor.SetRenderWidthProc(AMachine: TatVirtualMachine); +begin + with AMachine do + TScriptRender(CurrentObject).Width := GetInputArgAsInteger(0); +end; + +procedure TScriptEditor.GetRenderHeightProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(TScriptRender(CurrentObject).Height); +end; + +procedure TScriptEditor.SetRenderHeightProc(AMachine: TatVirtualMachine); +begin + with AMachine do + TScriptRender(CurrentObject).Height := GetInputArgAsInteger(0); +end; + +procedure TScriptEditor.GetRenderMaxMemoryProc(AMachine: TatVirtualMachine); +begin + with AMachine do + ReturnOutPutArg(TScriptRender(CurrentObject).MaxMemory); +end; + +procedure TScriptEditor.SetRenderMaxMemoryProc(AMachine: TatVirtualMachine); +var + v: integer; +begin + with AMachine do + begin + v := GetInputArgAsInteger(0); + if (v >= 0) then + TScriptRender(CurrentObject).MaxMemory := v; + end; +end; + +{ **************************************************************************** } + +procedure TScriptEditor.GetPivotModeProc(AMachine: TatVirtualMachine); +begin + AMachine.ReturnOutputArg(Integer(EditForm.PivotMode)); +end; + +procedure TScriptEditor.SetPivotModeProc(AMachine: TatVirtualMachine); +var + n: integer; +begin + n := AMachine.GetInputArgAsInteger(0); + if n = 0 then + EditForm.PivotMode := pivotLocal + else + EditForm.PivotMode := pivotWorld; +end; + +procedure TScriptEditor.GetPivotXProc(AMachine: TatVirtualMachine); +begin +// EditForm.ScriptGetPivot(px, py); +// AMachine.ReturnOutputArg(px); + if EditForm.PivotMode = pivotLocal then + AMachine.ReturnOutputArg(EditForm.LocalPivot.x) + else + AMachine.ReturnOutputArg(EditForm.WorldPivot.x); +end; + +procedure TScriptEditor.SetPivotXProc(AMachine: TatVirtualMachine); +begin + if EditForm.PivotMode = pivotLocal then + EditForm.LocalPivot.x := AMachine.GetInputArgAsFloat(0) + else + EditForm.WorldPivot.x := AMachine.GetInputArgAsFloat(0); +end; + +procedure TScriptEditor.GetPivotYProc(AMachine: TatVirtualMachine); +begin +// EditForm.ScriptGetPivot(px, py); +// AMachine.ReturnOutputArg(py); + if EditForm.PivotMode = pivotLocal then + AMachine.ReturnOutputArg(EditForm.LocalPivot.y) + else + AMachine.ReturnOutputArg(EditForm.WorldPivot.y); +end; + +procedure TScriptEditor.SetPivotYProc(AMachine: TatVirtualMachine); +begin + if EditForm.PivotMode = pivotLocal then + EditForm.LocalPivot.y := AMachine.GetInputArgAsFloat(0) + else + EditForm.WorldPivot.y := AMachine.GetInputArgAsFloat(0); +end; + +procedure TScriptEditor.SetPivotProc(AMachine: TatVirtualMachine); +begin + with AMachine do begin + if EditForm.PivotMode = pivotLocal then begin + EditForm.LocalPivot.x := GetInputArgAsFloat(0); + EditForm.LocalPivot.y := GetInputArgAsFloat(1); + end + else begin + EditForm.WorldPivot.x := GetInputArgAsFloat(0); + EditForm.WorldPivot.y := GetInputArgAsFloat(1); + end; + end; +end; + +procedure TScriptEditor.ResetPivotProc(AMachine: TatVirtualMachine); +begin + try // AV: scripter crashes here when pivot = (0,0) + EditForm.btnResetPivotClick(nil); + except + end; // all the work is already done +end; + +{ ********************************* Scripter ********************************* } + +procedure TScriptEditor.PrepareScripter; +var + i: integer; +begin + Scripter.AddLibrary(TatSysUtilsLibrary); + with Scripter.defineClass(TScriptRender) do + begin + DefineProp('Filename', tkString, GetRenderFilenameProc, SetRenderFilenameProc); + DefineProp('Width', tkInteger, GetRenderWidthProc, SetRenderWidthProc); + DefineProp('Height', tkInteger, GetRenderHeightProc, SetRenderHeightProc); + DefineProp('MaxMemory', tkInteger, GetRenderMaxMemoryProc, SetRenderMaxMemoryProc); + DefineProp('EmbedParameters', tkVariant, GetRenderEmbedParams, SetRenderEmbedParams); + end; + Scripter.AddObject('Renderer', Renderer); + + { Flame interface } + with Scripter.defineClass(TFlame) do + begin + DefineProp('Gamma', tkFloat, GetFlameGammaProc, SetFlameGammaProc); + DefineProp('GammaThreshold', tkFloat, GetFlameGammaThresholdProc, SetFlameGammaThresholdProc); + DefineProp('Brightness', tkFloat, GetFlameBrightnessProc, SetFlameBrightnessProc); + DefineProp('Vibrancy', tkFloat, GetFlameVibrancyProc, SetFlameVibrancyProc); + DefineProp('Contrast', tkFloat, GetFlameContrastProc, SetFlameContrastProc); // AV + DefineProp('Time', tkFloat, GetFlameTimeProc, SetFlameTimeProc); + DefineProp('Zoom', tkFloat, GetFlameZoomProc, SetFlameZoomProc); + DefineProp('X', tkFloat, GetFlameXProc, SetFlameXProc); + DefineProp('Y', tkFloat, GetFlameYProc, SetFlameYProc); + DefineProp('Width', tkFloat, GetFlameWidthProc, SetFlameWidthProc); + DefineProp('Height', tkFloat, GetFlameHeightProc, SetFlameHeightProc); + DefineProp('SampleDensity', tkFloat, GetFlameDensityProc, SetFlameDensityProc); + DefineProp('Quality', tkFloat, GetFlameDensityProc, SetFlameDensityProc); + DefineProp('Oversample', tkInteger, GetFlameOversampleProc, SetFlameOversampleProc); + DefineProp('FilterRadius', tkFloat, GetFlameFilterRadiusProc, SetFlameFilterRadiusProc); + DefineProp('Scale', tkFloat, GetFlamePixelsPerUnitProc, SetFlamePixelsPerUnitProc); + DefineProp('Gradient', tkInteger, GetFlamePaletteProc, SetFlamePaletteProc, nil, false, 2); + DefineProp('Background', tkInteger, GetFlameBackgroundProc, SetFlameBackgroundProc, nil, false, 1); + DefineProp('Name', tkString, GetFlameNameProc, SetFlameNameProc); + // DefineProp('Nick', tkString, GetFlameNickProc, SetFlameNickProc); + // DefineProp('URL', tkString, GetFlameURLProc, SetFlameURLProc); + DefineProp('Hue', tkFloat, GetFlameHueProc, SetFlameHueProc); + DefineProp('Batches', tkInteger, GetFlameBatchesProc, SetFlameBatchesProc); + DefineProp('FinalXformEnabled', tkInteger, GetFlameFinalxformEnabledProc, SetFlameFinalxformEnabledProc); + DefineProp('Angle', tkFloat, GetFlameAngleProc, SetFlameAngleProc); + DefineProp('Pitch', tkFloat, GetFlamePitchProc, SetFlamePitchProc); + DefineProp('Yaw', tkFloat, GetFlameYawProc, SetFlameYawProc); + DefineProp('Roll', tkFloat, GetFlameRollProc, SetFlameRollProc); + DefineProp('Perspective', tkFloat, GetFlamePerspectiveProc, SetFlamePerspectiveProc); + DefineProp('Z', tkFloat, GetFlameCamZposProc, SetFlameCamZposProc); + DefineProp('DOF', tkFloat, GetFlameDOFProc, SetFlameDOFProc); + DefineProp('SoloXform', tkInteger, GetFlameSoloXformProc, SetFlameSoloXformProc); + + DefineProp('PreviewWidth', tkInteger, GetPreviewWidthProc, SetPreviewWidthProc); + DefineProp('PreviewHeight', tkInteger, GetPreviewHeightProc, SetPreviewHeightProc); + end; + Scripter.AddObject('Flame', Flame); + + { Transform interface } + with Scripter.defineClass(TTransform) do + begin + DefineProp('coefs', tkFloat, GetTransformCoefsProc, SetTransformCoefsProc, nil, false, 2); + DefineProp('post', tkFloat, GetTransformPostCoefsProc, SetTransformPostCoefsProc, nil, false, 2); + DefineProp('Color', tkFloat, GetTransformColorProc, SetTransformColorProc); + DefineProp('VarColor', tkFloat, GetTransformVarColorProc, SetTransformVarColorProc); + DefineProp('Weight', tkFloat, GetTransformWeightProc, SetTransformWeightProc); + DefineProp('Symmetry', tkFloat, GetTransformSymProc, SetTransformSymProc); + DefineProp('ColorSpeed', tkFloat, GetTransformSymProc, SetTransformSymProc); + for i:= 0 to NRVAR - 1 do begin + DefineProp(Varnames(i), tkFloat, GetTransformVariationProc, SetTransformVariationProc); + Editor.SyntaxStyles.AutoCompletion.Add('property ' + Varnames(i) + ': double'); + end; + for i:= 0 to GetNrVariableNames - 1 do begin + DefineProp(GetVariableNameAt(i), tkFloat, GetTransformVariableProc, SetTransformVariableProc); + Editor.SyntaxStyles.AutoCompletion.Add('property ' + GetVariableNameAt(i) + ': double'); + end; + Editor.SyntaxStyles.AutoCompletion.Sort; + while Editor.SyntaxStyles.AutoCompletion.Strings[0] = '' do Editor.SyntaxStyles.AutoCompletion.Delete(0); + + DefineMethod('Clear', 0, tkNone, nil, TransformClearProc); + DefineMethod('Rotate', 1, tkNone, nil, TransformRotateProc); + DefineMethod('Scale', 1, tkNone, nil, TransformScaleProc); + DefineMethod('RotateOrigin', 1, tkNone, nil, TransformRotateOriginProc); + + DefineMethod('RotatePXOrigin', 1, tkNone, nil, TransformRotatePXOriginProc); + DefineMethod('RotatePX', 1, tkNone, nil, TransformRotatePXProc); + DefineMethod('ScalePX', 1, tkNone, nil, TransformScalePXProc); + DefineMethod('FlipPXHoriz', 0, tkNone, nil, TransformFlipPXHorizProc); + DefineMethod('FlipHoriz', 0, tkNone, nil, TransformFlipHorizProc); + DefineMethod('FlipPXVert', 0, tkNone, nil, TransformFlipPXVertProc); + DefineMethod('FlipVert', 0, tkNone, nil, TransformFlipVertProc); + DefineMethod('SwapCoefs', 0, tkNone, nil, TransformSwapCoefsProc); + DefineMethod('ResetVariables', 0, tkNone, nil, TransformResetVariables); + + DefineMethod('SetVariationOrder', 2, tkNone, nil, TransformMoveVarProc); + DefineMethod('SwapVariations', 2, tkNone, nil, TransformExchangeVarsProc); + DefineMethod('SortVariationsByName', 0, tkNone, nil, TransformSortVarsProc); + DefineMethod('SortVariationsByIndex', 0, tkNone, nil, TransformDefaultVarOrderProc); + DefineMethod('GetVariationOrder', 1, tkInteger, nil, TransformGetVarOrderProc); + DefineMethod('CopyVariationsOrder', 1, tkInteger, nil, TransformCopyVarOrderProc); + DefineMethod('PrintVariationsOrder', 0, tkNone, nil, TransformDisplayVarsProc); + + DefineProp('a', tkFloat, GetTransformAProc, SetTransformAProc); + DefineProp('b', tkFloat, GetTransformBProc, SetTransformBProc); + DefineProp('c', tkFloat, GetTransformCProc, SetTransformCProc); + DefineProp('d', tkFloat, GetTransformDProc, SetTransformDProc); + DefineProp('e', tkFloat, GetTransformEProc, SetTransformEProc); + DefineProp('f', tkFloat, GetTransformFProc, SetTransformFProc); + DefineProp('Variation', tkFloat, GetTransformVarProc, SetTransformVarProc, nil, false, 1); + DefineProp('Variable', tkFloat, GetTransformVariProc, SetTransformVariProc, nil, false, 1); + DefineProp('Chaos', tkFloat, GetTransformChaosProc, SetTransformChaosProc, nil, false, 1); + DefineProp('PlotMode', tkInteger, GetTransformPlotModeProc, SetTransformPlotModeProc); + DefineProp('Opacity', tkFloat, GetTransformOpacityProc, SetTransformOpacityProc); + + DefineProp('PostXformEnabled', tkInteger, GetTransformPostxformEnabledProc, SetTransformPostxformEnabledProc); + DefineProp('Name', tkString, GetTransformNameProc, SetTransformNameProc); + end; + Scripter.AddObject('Transform', Transform); + + { Options interface } + with Scripter.defineClass(TOptions) do + begin + DefineProp('JPEGQuality', tkInteger, GetJPEGQuality, SetJPEGQuality); + DefineProp('BatchSize', tkInteger, GetBatchSize, SetBatchSize); + DefineProp('ParameterFile', tkString, GetParameterFile, SetParameterFile); + DefineProp('SmoothPaletteFile', tkString, GetSmoothPaletteFile, SetSmoothPaletteFile); + DefineProp('NumTries', tkInteger, GetNumTries, SetNumTries); + DefineProp('TryLength', tkInteger, GetTryLength, SetTryLength); + DefineProp('ConfirmDelete', tkVariant, GetConfirmDelete, SetConfirmDelete); + DefineProp('Multithreading', tkInteger, GetMultithreading, SetMultithreading); + //DefineProp('FixedReference', tkVariant, GetFixedReference, SetFixedReference); + DefineProp('SampleDensity', tkFloat, GetSampleDensity, SetSampleDensity); + DefineProp('Gamma', tkFloat, GetGamma, SetGamma); + DefineProp('GammaThreshold', tkFloat, GetGammaThreshold, SetGammaThreshold); + DefineProp('Brightness', tkFloat, GetBrightness, SetBrightness); + DefineProp('Vibrancy', tkFloat, GetVibrancy, SetVibrancy); + DefineProp('Contrast', tkFloat, GetContrast, SetContrast); // AV + DefineProp('Oversample', tkInteger, GetOversample, SetOversample); + DefineProp('FilterRadius', tkFloat, GetFilterRadius, SetFilterRadius); + DefineProp('Transparency', tkInteger, GetTransparency, SetTransparency); + DefineProp('PreviewLowQuality', tkFloat, GetLowQuality, SetLowQuality); + DefineProp('PreviewMediumQuality', tkFloat, GetMediumQuality, SetMediumQuality); + DefineProp('PreviewHighQuality', tkFloat, GetHighQuality, SetHighQuality); + DefineProp('MinTransforms', tkInteger, GetMinTransforms, SetMinTransforms); + DefineProp('MaxTransforms', tkInteger, GetMaxTransforms, SetMaxTransforms); + DefineProp('MutateMinTransforms', tkInteger, GetMutateMinTransforms, SetMutateMinTransforms); + DefineProp('MutateMaxTransforms', tkInteger, GetMutateMaxTransforms, SetMutateMaxTransforms); + DefineProp('RandomPrefix', tkString, GetPrefix, SetPrefix); + DefineProp('KeepBackground', tkInteger, GetKeepBackground, SetKeepBackground); + DefineProp('SymmetryType', tkInteger, GetSymmetryType, SetSymmetryType); + DefineProp('SymmetryOrder', tkInteger, GetSymmetryOrder, SetSymmetryOrder); + DefineProp('Variations', tkVariant, GetVariations, SetVariations, nil, false, 1); + DefineProp('GradientOnRandom', tkInteger, GetRandomGradient, SetRandomGradient); + DefineProp('GradientFileOnRandom', tkString, GetRandomGradientFile, SetRandomGradientFile); + DefineProp('ColorBlending', tkInteger, GetGradientBlending, SetGradientBlending); // AV + DefineProp('MinNodes', tkInteger, GetMinNodes, SetMinNodes); + DefineProp('MaxNodes', tkInteger, GetMaxNodes, SetMaxNodes); + DefineProp('MinHue', tkInteger, GetMinHue, SetMinHue); + DefineProp('MaxHue', tkInteger, GetMaxHue, SetMaxHue); + DefineProp('MinSaturation', tkInteger, GetMinSat, SetMinSat); + DefineProp('MaxSaturation', tkInteger, GetMaxSat, SetMaxSat); + DefineProp('MinLuminance', tkInteger, GetMinLum, SetMinLum); + DefineProp('MaxLuminance', tkInteger, GetMaxLum, SetMaxLum); + DefineProp('UPRSampleDensity', tkInteger, GetUPRSampleDensity, SetUPRSampleDensity); + DefineProp('UPRFilterRadius', tkFloat, GetUPRFilterRadius, SetUPRFilterRadius); + DefineProp('UPROversample', tkInteger, GetUPROversample, SetUPROversample); + DefineProp('UPRAdjustDensity', tkVariant, GetUPRAdjustDensity, SetUPRAdjustDensity); + DefineProp('EvenGradientStripes', tkVariant, GetEqualGradient, SetEqualGradient); + DefineProp('UPRColoringIdent', tkString, GetUPRColoringIdent, SetUPRColoringIdent); + DefineProp('UPRColoringFile', tkString, GetUPRColoringFile, SetUPRColoringFile); + DefineProp('UPRFormulaFile', tkString, GetUPRFormulaFile, SetUPRFormulaFile); + DefineProp('UPRFormulaIdent', tkString, GetUPRFormulaIdent, SetUPRFormulaIdent); + DefineProp('UPRWidth', tkInteger, GetUPRWidth, SetUPRWidth); + DefineProp('UPRHeight', tkInteger, GetUPRHeight, SetUPRHeight); + DefineProp('ExportRenderer', tkInteger, GetExportPath, SetExportPath); + end; + Scripter.AddObject('Options', Options); + + with Scripter.defineClass(TPivot) do + begin + DefineProp('Mode', tkInteger, GetPivotModeProc, SetPivotModeProc); + DefineProp('X', tkFloat, GetPivotXProc, SetPivotXProc); + DefineProp('Y', tkFloat, GetPivotYProc, SetPivotYProc); + DefineMethod('Set', 2, tkNone, nil, SetPivotProc); + DefineMethod('Reset', 0, tkNone, nil, ResetPivotProc); + end; + Scripter.AddObject('Pivot', Pivot); + + Scripter.AddComponent(OpenDialog); + Scripter.AddLibrary(TOperationLibrary); + + { Variables and constants } + Scripter.AddConstant('PI', pi); + Scripter.AddConstant('NVARS', NRVAR); + Scripter.AddConstant('NumVariables', GetNrVariableNames); + Scripter.AddConstant('NXFORMS', NXFORMS); + Scripter.AddConstant('INSTALLPATH', ExtractFilePath(Application.exename)); + Scripter.AddConstant('SYM_NONE', 0); + Scripter.AddConstant('SYM_BILATERAL', 1); + Scripter.AddConstant('SYM_ROTATIONAL', 2); + Scripter.AddConstant('SYM_DIHEDRAL', 3); // AV + Scripter.AddConstant('NMAPS', NRCMAPS); // AV + + Scripter.AddConstant('mrOK', mrOK); // AV + Scripter.AddConstant('mrCancel', mrCancel); // AV + Scripter.AddConstant('mrNo', mrNo); // AV + Scripter.AddConstant('mrYes', mrYes); // AV + Scripter.AddConstant('mrRetry', mrRetry); // AV + Scripter.AddConstant('mrClose', mrClose); // AV + Scripter.AddConstant('mrAbort', mrAbort); // AV + + Scripter.AddConstant('BLEND_RGB', 0); // AV + Scripter.AddConstant('BLEND_HSV', 1); // AV + Scripter.AddConstant('BLEND_NONE', 2); // AV + + { Variables } + // AV: they are already defined in TOperationLibrary + // Scripter.AddVariable('SelectedTransform', EditForm.SelectedTriangle); + // Scripter.AddVariable('ActiveTransform', ActiveTransform); + Scripter.AddVariable('UpdateFlame', UpdateIt); + Scripter.AddVariable('ResetLocation', ResetLocation); + Scripter.AddVariable('BatchIndex', RandomIndex); + Scripter.AddVariable('DateCode', RandomDate); + Scripter.AddVariable('Stopped', Stopped); + Scripter.AddVariable('ShowProgress', ShowProgress); + Scripter.AddVariable('LimitVibrancy', LimitVibrancy); + // Scripter.AddVariable('CurrentFile', OpenFile); // AV: added handlers + // Scripter.AddVariable('Compatibility', Compatibility); // obsolete + + { Variations } + Scripter.AddConstant('V_LINEAR', 0); + Scripter.AddConstant('V_RANDOM', -1); + + // Scripter.AddLibrary(TatWindowsLibrary); + // Scripter.AddLibrary(TatFormsLibrary); + Scripter.AddLibrary(TatMathLibrary); + Scripter.AddLibrary(TatDialogsLibrary); + Scripter.AddLibrary(TatSysUtilsLibrary); + Scripter.AddLibrary(TatFileCtrlLibrary); + Scripter.AddLibrary(TatClassesLibrary); + { Nonsense - it's the only way to get the last real + library to work! } + Scripter.AddObject('Not_Any_Thing_Useful', Another); + Scripter.AddObject('IglooFunkyRubber', Another); + Scripter.AddObject('Scrumptious', Another); + // Scripter.AddObject('Darn it', Another); + Scripter.AddObject('Apophysis', Application); // AV :-) + + // AV: user must not be able to use them! + Scripter.SystemLibrary.MethodByName('Scripter').Free; + Scripter.SystemLibrary.MethodByName('Machine').Free; + // AV: moved into main library to let user choose which CopyFile must be called + Scripter.SystemLibrary.DefineMethod('CopyFile', 3, tkVariant, nil, CopyFileProc, false, 1); + + RegisterClasses([TButton, TLabel, TEdit, TComboBox]); // AV: to load external Delphi forms +end; + +{ ************************* Buttons ***************************************** } + +procedure TScriptEditor.btnNewClick(Sender: TObject); +var + c: boolean; +begin + if ConfirmClearScript then + begin + if Editor.LinesModified then // AV: if script changes not saved yet + c := (Application.MessageBox(PChar(TextByKey('script-confirmclear')), 'Apophysis', 52) = IDYES) + else + c := True; + end + else c := True; + if c then begin + Editor.Lines.Clear; + Caption := TextByKey('script-title'); //'New Script'; + Script := ''; + if Scripter.Running then btnBreak.Click; // AV: stop the previous script + StatusBar.SimpleText := StatusBar.Hint; // AV + end; +end; + +procedure TScriptEditor.LoadScriptFile(filename:string); +var + s: string; + fn:string; +begin + Editor.Lines.LoadFromFile(filename); + s := ExtractFileName(filename); + s := Copy(s, 0, length(s) - Length(ExtractFileExt(s))); + MainForm.mnuRun.Caption := Format(TextByKey('main-menu-script-run2'), [s]); + Caption := s; +end; + +procedure TScriptEditor.OpenScript; +var + s: string; + fn:string; +begin + MainOpenDialog.InitialDir := ScriptPath; + MainOpenDialog.Filename := ''; + MainOpenDialog.Filter := Format('%s|*.aposcript;*.asc|%s|*.*', [TextByKey('common-filter-scriptfiles'), TextByKey('common-filter-allfiles')]); + if OpenSaveFileDialog(ScriptEditor, '.aposcript', MainOpenDialog.Filter, MainOpenDialog.InitialDir, TextByKey('common-browse'), fn, true, false, false, true) then +// if MainOpenDialog.execute then + begin + MainOpenDialog.FileName := fn; + Script := MainOpenDialog.Filename; + Editor.Lines.LoadFromFile(MainOpenDialog.Filename); + s := ExtractFileName(MainOpenDialog.Filename); + s := Copy(s, 0, length(s) - Length(ExtractFileExt(s))); + MainForm.mnuRun.Caption := Format(TextByKey('main-menu-script-run2'), [s]); + Caption := s; + ScriptPath := ExtractFileDir(MainOpenDialog.Filename); + end; +end; + +procedure TScriptEditor.btnOpenClick(Sender: TObject); +begin + OpenScript; +end; + +procedure TScriptEditor.btnPauseClick(Sender: TObject); +begin + if Scripter.Running then + Scripter.Paused := not Scripter.Paused + else Scripter.Paused := False; + btnPause.Down := Scripter.Paused; + if btnPause.Down then begin + StatusBar.SimpleText := TextByKey('script-status-paused'); + PreviewForm.PreviewPause.Caption := TextbyKey('preview-resume'); + end else begin + if Scripter.Running then + StatusBar.SimpleText := TextByKey('script-status-executing') + else + StatusBar.SimpleText := StatusBar.Hint; + PreviewForm.PreviewPause.Caption := TextbyKey('preview-pause'); + end; +end; + +procedure TScriptEditor.btnSaveClick(Sender: TObject); +var fn : string; +begin + if Script = '' then fn := '' + else fn := ChangeFileExt(ExtractFileName(Script), '.aposcript'); + if OpenSaveFileDialog(ScriptEditor, '.aposcript', + Format('%s|*.aposcript;*.asc|%s|*.*', + [TextByKey('common-filter-scriptfiles'), + TextByKey('common-filter-allfiles')]), + ScriptPath, TextByKey('common-browse'), fn, + false, true, false, false) then + //if MainSaveDialog.Execute then + begin + MainOpenDialog.FileName := fn; + Script := fn; + Editor.Lines.SaveToFile(fn); + Caption := ExtractFileName(fn); + ScriptPath := ExtractFileDir(fn); + if ScriptPath = AppPath + 'Scripts' then + MainForm.GetScripts; // AV: refreshing the menu + end; +end; + +procedure TScriptEditor.FillFileList; +var + i, p: integer; + ext, Title: string; + FStrings: TStringList; +begin + FStrings := TStringList.Create; + FStrings.LoadFromFile(ParamFile); + try + FileList.Clear; + + ext := LowerCase(ExtractFileExt(ParamFile)); + (*if (ext = '.fla') or (ext = '.apo') then + begin + + // Get names from .fla or .apo file + if (Pos('{', FStrings.Text) <> 0) then + for i := 0 to FStrings.Count - 1 do + begin + p := Pos('{', FStrings[i]); + if (p <> 0) then + begin + Title := Trim(Copy(FStrings[i], 1, p - 1)); + if Title <> '' then + begin { Otherwise bad format } + FileList.Add(Trim(Copy(FStrings[i], 1, p - 1))); + end; + end; + end; + + end + else + + begin *) + // Get names from .flame file + if (Pos(' 0) then + begin + for i := 0 to FStrings.Count - 1 do + begin + p := Pos(' 0) then + begin + pname := ''; + MainForm.ListXMLScanner.LoadFromBuffer(PANSICHAR(AnsiString(FSTrings[i]))); + MainForm.ListXMLScanner.Execute; + if Trim(pname) = '' then + Title := '*untitled ' + ptime + else + FileList.Add(pname); + end; + end; + + end; + //end; + finally + FStrings.Free; + end; +end; + +procedure TScriptEditor.CopyFileProc(AMachine: TatVirtualMachine); +var + src, dest: string; + v: boolean; // AV +begin +// AV: original method doesn't work properly and conflicts with Windows.CopyFile + with AMachine do + begin + src := GetInputArgAsString(0); + dest := GetInputArgAsString(1); + if FileExists(src) and DirectoryExists(ExtractFilePath(dest)) then + try + case InputArgCount of + 2: begin + v := Windows.CopyFile(PChar(src), PChar(dest), false); // rewrite + ReturnOutputArg(v); + end; + 3: begin + v := GetInputArgAsBoolean(2); + v := Windows.CopyFile(PChar(src), PChar(dest), v); + ReturnOutputArg(v); + end; + end; + except + LastError := 'CopyFile: ' + TextByKey('common-genericcopyfailure'); + RuntimeError(LastError); // AV + Halt; + if LoadForm.CheckBox1.Checked then LoadForm.Show; // AV + end + else begin + if not FileExists(src) then + LastError := 'CopyFile: ' + TextByKey('common-noparamfile') + else + LastError := 'CopyFile: ' + TextByKey('render-status-pathdoesnotexist'); + RuntimeError(LastError); // AV + Halt; + if LoadForm.CheckBox1.Checked then LoadForm.Show; // AV + end; + end; +end; + +procedure TScriptEditor.FindReplaceClick(Sender: TObject); +begin + ScrMemoFindReplaceDialog1.Execute; +end; + +procedure TScriptEditor.RunScript; +var + lib: TStringList; + favs, defs: boolean; // current status of submenus +begin + btnRun.Enabled := False; + btnBreak.Enabled := True; + btnPause.Enabled := True; + MainForm.btnRunScript.Enabled := False; + MainForm.mnuRun.Enabled := False; + favs := (MainForm.FavouriteScripts1.Count > 0); + defs := (MainForm.Directory1.Count > 0); + MainForm.FavouriteScripts1.Enabled := False; + // MainForm.DisableFavorites; + MainForm.Directory1.Enabled := False; + + ParamFile := OpenFile; + FillFileList; + { Set defaults } + { Set render defaults } + Renderer.Width := 320; + Renderer.Height := 240; + Renderer.EmbedParameters := False; // AV + Stopped := False; + UpdateIt := True; + ResetLocation := False; + Console.Clear; + LastError := ''; + ActiveTransform := EditForm.SelectedTriangle; + NumTransforms := Transforms; + cp.copy(MainCp); + cmap := MainCp.cmap; + Application.ProcessMessages; + Randomize; + StatusBar.SimpleText := TextByKey('script-status-executing'); + // what in the sweet loving sake of jesus is this fuck? + // AV: this is really strange... + if Pos('stopped', Lowercase(Editor.Lines.text)) <> 0 then + begin + btnStop.Enabled := True; + MainForm.mnuStop.Enabled := True; + MainForm.btnStopScript.Enabled := True; + end; + with Scripter do + begin + SourceCode.Assign(Editor.Lines); + if FileExists(defLibrary) then + begin + lib := TStringList.Create; + try + Lib.LoadFromFile(defLibrary); + with Scripts.Add do + begin + SourceCode := lib; + SelfRegisterAsLibrary('Functions'); + end; + finally + lib.free; + end; + end; + //Compile; + Execute; + end; + if (NumTransforms < 1) and UpdateIt then + begin + Console.Lines.Add(TextByKey('script-status-notransforms')); + ScriptRenderForm.Close; + btnRun.Enabled := True; + btnStop.Enabled := False; + MainForm.btnRunScript.Enabled := True; + MainForm.btnStopScript.Enabled := False; + MainForm.mnuRun.Enabled := True; + MainForm.mnuStop.Enabled := False; + btnBreak.Enabled := False; + btnPause.Enabled := False; + StatusBar.SimpleText := StatusBar.Hint; + // AV: to continue work with these scripts + MainForm.FavouriteScripts1.Enabled := favs; + MainForm.Directory1.Enabled := defs; + Exit; + end + else + if (LastError = '') and UpdateIt then + begin + MainForm.UpdateUndo; + MainCp.Copy(cp); + UpdateFlame; + if ResetLocation then MainForm.ResetLocation; + end + else + begin + Console.Lines.Add(LastError); + end; + ScriptRenderForm.Close; + btnRun.Enabled := True; + btnStop.Enabled := False; + MainForm.btnRunScript.Enabled := True; + MainForm.btnStopScript.Enabled := False; + MainForm.mnuRun.Enabled := True; + MainForm.mnuStop.Enabled := False; + btnBreak.Enabled := False; + btnPause.Enabled := False; + // restore the status of submenus + MainForm.FavouriteScripts1.Enabled := favs; + MainForm.Directory1.Enabled := defs; + StatusBar.SimpleText := StatusBar.Hint; +end; + +procedure TScriptEditor.btnRunClick(Sender: TObject); +begin + RunScript; +end; + +{ ****************************** Update flame ******************************* } + +procedure TScriptEditor.UpdateFlame; +begin + MainForm.StopThread; + MainForm.UpdateUndo; + MainCp.Copy(cp); +// MainCp.name := FlameName; + Transforms := MainCp.TrianglesFromCP(MainTriangles); + MainCp.AdjustScale(MainForm.Image.Width, MainForm.Image.Height); + if ResetLocation then MainCp.CalcBoundBox else + begin; + MainCp.Zoom := cp.zoom; + MainCp.center[0] := cp.center[0]; + MainCp.center[1] := cp.center[1]; + end; + MainCp.cmap := cp.cmap; + MainForm.RedrawTimer.enabled := true; + if EditForm.Visible then EditForm.UpdateDisplay; + if AdjustForm.Visible then AdjustForm.UpdateDisplay; + if MutateForm.Visible then MutateForm.UpdateDisplay; +end; + +(* +procedure copyxform(var dest: Txform; const source: TXform); +var + i: integer; +begin + dest.c[0, 0] := source.c[0, 0]; + dest.c[0, 1] := source.c[0, 1]; + dest.c[1, 0] := source.c[1, 0]; + dest.c[1, 1] := source.c[1, 1]; + dest.c[2, 0] := source.c[2, 0]; + dest.c[2, 1] := source.c[2, 1]; + dest.color := source.color; +// hmm, why no symmetry here? // dest.symmetry := source.symmetry; + dest.density := source.density; + for i := 0 to NRVAR - 1 do + dest.SetVariation(i, source.GetVariation(i)); +end; +*) + +{ ************************ Editor Popup menu ********************************* } + +procedure TScriptEditor.mnuCutClick(Sender: TObject); +begin + if Editor.CanCut then Editor.CutToClipboard; +end; + +procedure TScriptEditor.mnuDeleteBlockClick(Sender: TObject); +begin + with ScrCodeList1 do + if ItemIndex >= 0 then + CodeBlocks.Delete(ItemIndex); +end; + +procedure TScriptEditor.mnuCopyClick(Sender: TObject); +begin + if Editor.CanCopy then Editor.CopyToClipboard; +end; + +procedure TScriptEditor.mnuPasteClick(Sender: TObject); +begin + if Editor.CanPaste then Editor.PasteFromClipboard; +end; + +procedure TScriptEditor.mnuRedoClick(Sender: TObject); +begin + if Editor.CanRedo then Editor.Redo; +end; + +procedure TScriptEditor.mnuUndoClick(Sender: TObject); +begin + if Editor.CanUndo then Editor.Undo; +end; + +procedure TScriptEditor.EditCaption1Click(Sender: TObject); +var + scap: string; // empty string by default +begin + if ScrCodeList1.ItemIndex < 0 then exit; + scap := ScrCodeList1.CodeBlocks[ScrCodeList1.ItemIndex].Caption; + if not InputQuery(TextByKey('script-codeblock'), + TextByKey('script-codeblockrename'), scap) then exit; + ScrCodeList1.CodeBlocks[ScrCodeList1.ItemIndex].Caption := scap; +end; + +procedure TScriptEditor.EditorChange(Sender: TObject); +begin + // Editor.activeLine := -1; // <<== AV: it's the source of bugs... + Editor.ActiveLineSettings.ShowActiveLine := false; + {if not Editor.CanUndo then mnuUndo.Enabled := false + else mnuUndo.Enabled := true; } + // AV: optimized + mnuUndo.Enabled := Editor.CanUndo; + mnuRedo.Enabled := Editor.CanRedo; +end; + +{********** AV: let's make it more interactive! ************ } + +procedure TScriptEditor.EditorDragDrop(Sender, Source: TObject; X, Y: Integer); +begin + if (source is TScrCodeList) then + Editor.DropText(X, Y, ScrCodeList1.CodeBlocks[ScrCodeList1.itemindex].Code.Text); +end; + +procedure TScriptEditor.EditorDragOver(Sender, Source: TObject; X, Y: Integer; + State: TDragState; var Accept: Boolean); +begin + Accept := true; // AV: so you can drag and drop any text inside the Scripter! +end; + +procedure TScriptEditor.EditorGetAutoCompletionList(Sender: TObject; + AToken: string; AList: TStringList); // AV: so the scripter will resemble a real IDE +var i: integer; +begin + if (LowerCase(AToken) = 'transform.') then + begin + ALIst.AddObject('property coefs[][]: array of double', TObject(ttProp)); + ALIst.AddObject('property post[][]: array of double', TObject(ttProp)); + ALIst.AddObject('property A: double', TObject(ttProp)); + ALIst.AddObject('property B: double', TObject(ttProp)); + ALIst.AddObject('property C: double', TObject(ttProp)); + ALIst.AddObject('property D: double', TObject(ttProp)); + ALIst.AddObject('property E: double', TObject(ttProp)); + ALIst.AddObject('property F: double', TObject(ttProp)); + ALIst.AddObject('property Color: double', TObject(ttProp)); + ALIst.AddObject('property VarColor: double', TObject(ttProp)); + ALIst.AddObject('property Opacity: double', TObject(ttProp)); + ALIst.AddObject('property PlotMode: integer', TObject(ttProp)); + ALIst.AddObject('property Weight: double', TObject(ttProp)); + ALIst.AddObject('property Symmetry: double', TObject(ttProp)); + ALIst.AddObject('property ColorSpeed: double', TObject(ttProp)); + ALIst.AddObject('property Chaos[]: array of double', TObject(ttProp)); + ALIst.AddObject('property Name: string', TObject(ttProp)); + ALIst.AddObject('procedure Clear', TObject(ttMethod)); + ALIst.AddObject('method Rotate(Degrees: double)', TObject(ttMethod)); + ALIst.AddObject('method RotatePXOrigin(Degrees: double)', TObject(ttMethod)); + ALIst.AddObject('method RotatePX(Degrees: double)', TObject(ttMethod)); + ALIst.AddObject('method ScalePX(Factor: double)', TObject(ttMethod)); + ALIst.AddObject('method FlipHoriz', TObject(ttMethod)); + ALIst.AddObject('method FlipPXHoriz', TObject(ttMethod)); + ALIst.AddObject('method FlipVert', TObject(ttMethod)); + ALIst.AddObject('method FlipPXVert', TObject(ttMethod)); + ALIst.AddObject('method Scale(Factor: double)', TObject(ttMethod)); + ALIst.AddObject('method RotateOrigin(Degrees: double)', TObject(ttMethod)); + ALIst.AddObject('property Variation[]: array of double', TObject(ttProp)); + ALIst.AddObject('property Variable[]: array of double', TObject(ttProp)); + ALIst.AddObject('property postXformEnabled: boolean', TObject(ttProp)); + ALIst.AddObject('method SwapCoefs', TObject(ttMethod)); + ALIst.AddObject('method ResetVariables', TObject(ttMethod)); + ALIst.AddObject('method SwapVariations(var1_name, var2_name: string)', TObject(ttMethod)); + ALIst.AddObject('method SortVariationsByName', TObject(ttMethod)); + ALIst.AddObject('method SortVariationsByIndex', TObject(ttMethod)); + ALIst.AddObject('method PrintVariationsOrder', TObject(ttMethod)); + ALIst.AddObject('method SetVariationOrder(var_name, index: integer)', TObject(ttMethod)); + ALIst.AddObject('method CopyVariationsOrder(transform_index: integer)', TObject(ttMethod)); + ALIst.AddObject('function GetVariationOrder(var_name: string): integer', TObject(ttMethod)); + + for i:= 0 to NRVAR - 1 do + ALIst.AddObject('property ' + varnames(i) + ': double', TObject(ttProp)); + for i:= 0 to GetNrVariableNames - 1 do begin + ALIst.AddObject('property ' + GetVariableNameAt(i) + ': double', TObject(ttProp)); + end; + end; + if (LowerCase(AToken) = 'flame.') then + begin + ALIst.AddObject('property Gamma: double', TObject(ttProp)); + ALIst.AddObject('property GammaThreshold: double', TObject(ttProp)); + ALIst.AddObject('property Brightness: double', TObject(ttProp)); + ALIst.AddObject('property Vibrancy: double', TObject(ttProp)); + ALIst.AddObject('property Contrast: double', TObject(ttProp)); + ALIst.AddObject('property Scale: double', TObject(ttProp)); + ALIst.AddObject('property Width: integer', TObject(ttProp)); + ALIst.AddObject('property Weight: integer', TObject(ttProp)); + ALIst.AddObject('property PreviewWidth: integer', TObject(ttProp)); + ALIst.AddObject('property PreviewHeight: integer', TObject(ttProp)); + ALIst.AddObject('property Zoom: double', TObject(ttProp)); + ALIst.AddObject('property Angle: double', TObject(ttProp)); + ALIst.AddObject('property Pitch: double', TObject(ttProp)); + ALIst.AddObject('property Yaw: double', TObject(ttProp)); + ALIst.AddObject('property Roll: double', TObject(ttProp)); + ALIst.AddObject('property Perspective: double', TObject(ttProp)); + ALIst.AddObject('property Z: double', TObject(ttProp)); + ALIst.AddObject('property X: double', TObject(ttProp)); + ALIst.AddObject('property Y: double', TObject(ttProp)); + ALIst.AddObject('property DOF: double', TObject(ttProp)); + ALIst.AddObject('property Name: string', TObject(ttProp)); + ALIst.AddObject('property SampleDensity: double', TObject(ttProp)); + ALIst.AddObject('property Quality: double', TObject(ttProp)); + ALIst.AddObject('property Time: double', TObject(ttProp)); + ALIst.AddObject('property Hue: double', TObject(ttProp)); + ALIst.AddObject('property Oversample: integer', TObject(ttProp)); + ALIst.AddObject('property FilterRadius: double', TObject(ttProp)); + ALIst.AddObject('property FinalXformEnabled: boolean', TObject(ttProp)); + ALIst.AddObject('property Background[]: array of integer', TObject(ttProp)); + ALIst.AddObject('property Gradient[][]: array of integer', TObject(ttProp)); + end; + if (LowerCase(AToken) = 'pivot.') then + begin + ALIst.AddObject('property X: double', TObject(ttProp)); + ALIst.AddObject('property Y: double', TObject(ttProp)); + ALIst.AddObject('property Mode: integer', TObject(ttProp)); + ALIst.AddObject('procedure Set( X: double, Y: double)', TObject(ttMethod)); + ALIst.AddObject('procedure Reset', TObject(ttMethod)); + end; + if (LowerCase(AToken) = 'renderer.') then + begin + ALIst.AddObject('property Filename: string', TObject(ttProp)); + ALIst.AddObject('property Width: integer', TObject(ttProp)); + ALIst.AddObject('property Height: integer', TObject(ttProp)); + ALIst.AddObject('property MaxMemory: integer', TObject(ttProp)); + ALIst.AddObject('property EmbedParameters: boolean', TObject(ttProp)); + end; + if (LowerCase(AToken) = 'options.') then + begin + ALIst.AddObject('property JPEGQuality: integer', TObject(ttProp)); + ALIst.AddObject('property BatchSize: integer', TObject(ttProp)); + ALIst.AddObject('property ParameterFile: string', TObject(ttProp)); + ALIst.AddObject('property SmoothPaletteFile: string', TObject(ttProp)); + ALIst.AddObject('property NumTries: integer', TObject(ttProp)); + ALIst.AddObject('property TryLength: integer', TObject(ttProp)); + ALIst.AddObject('property ConfirmDelete: boolean', TObject(ttProp)); + ALIst.AddObject('property Transparency: integer', TObject(ttProp)); + ALIst.AddObject('property Multithreading: integer', TObject(ttProp)); + ALIst.AddObject('property Gamma: double', TObject(ttProp)); + ALIst.AddObject('property GammaThreshold: double', TObject(ttProp)); + ALIst.AddObject('property Brightness: double', TObject(ttProp)); + ALIst.AddObject('property Vibrancy: double', TObject(ttProp)); + ALIst.AddObject('property Contrast: double', TObject(ttProp)); + ALIst.AddObject('property PreviewLowQuality: double', TObject(ttProp)); + ALIst.AddObject('property PreviewMediumQuality: double', TObject(ttProp)); + ALIst.AddObject('property PreviewHighQuality: double', TObject(ttProp)); + ALIst.AddObject('property Variations[]: array of boolean', TObject(ttProp)); + ALIst.AddObject('property MinTransforms: integer', TObject(ttProp)); + ALIst.AddObject('property MutateMinTransforms: integer', TObject(ttProp)); + ALIst.AddObject('property MaxTransforms: integer', TObject(ttProp)); + ALIst.AddObject('property MutateMaxTransforms: integer', TObject(ttProp)); + ALIst.AddObject('property RandomPrefix: string', TObject(ttProp)); + ALIst.AddObject('property KeepBackground: integer', TObject(ttProp)); + ALIst.AddObject('property SymmetryType: integer', TObject(ttProp)); + ALIst.AddObject('property SymmetryOrder: integer', TObject(ttProp)); + ALIst.AddObject('property MinNodes: integer', TObject(ttProp)); + ALIst.AddObject('property MaxNodes: integer', TObject(ttProp)); + ALIst.AddObject('property MaxSaturation: integer', TObject(ttProp)); + ALIst.AddObject('property MinSaturation: integer', TObject(ttProp)); + ALIst.AddObject('property MaxLuminance: integer', TObject(ttProp)); + ALIst.AddObject('property MinLuminance: integer', TObject(ttProp)); + ALIst.AddObject('property GradientOnRandom: integer', TObject(ttProp)); + ALIst.AddObject('property GradientFileOnRandom: string', TObject(ttProp)); + ALIst.AddObject('property ColorBlending: integer', TObject(ttProp)); + ALIst.AddObject('property EvenGradientStripes: boolean', TObject(ttProp)); + ALIst.AddObject('property ExportRenderer: string', TObject(ttProp)); + end; + if pos('tstringlist', LowerCase(AToken))> 0 then + ALIst.AddObject('constructor Create', TObject(ttMethod)); + + // AV: easter eggs ;-) + if ((pos('apo', LowerCase(AToken))> 0) or (pos('ifs', LowerCase(AToken))> 0)) then + begin + AList.Clear; + ALIst.AddObject('procedure LoadFromFile(full_filename: string)', TObject(ttProc)); + ALIst.AddObject('procedure SaveToFile(full_filename: string)', TObject(ttProc)); + ALIst.AddObject('function Add(text: string): integer', TObject(ttFunc)); + ALIst.AddObject('function AddPair(Name, Value: string): TStrings', TObject(ttFunc)); + ALIst.AddObject('function IndexOfName(Name: string): integer', TObject(ttFunc)); + ALIst.AddObject('property KeyNames[index: integer]: string', TObject(ttProp)); + ALIst.AddObject('property Names[index: integer]: string', TObject(ttProp)); + ALIst.AddObject('property Values[Name: string]: string', TObject(ttProp)); + ALIst.AddObject('property ValueFromIndex[index: integer]: string', TObject(ttProp)); + ALIst.AddObject('function IndexOf(text_str: string): integer', TObject(ttFunc)); + ALIst.AddObject('property Count: integer', TObject(ttProp)); + ALIst.AddObject('procedure Insert(index: integer, str: string)', TObject(ttProc)); + ALIst.AddObject('procedure Delete(str_index: integer)', TObject(ttProc)); + ALIst.AddObject('procedure Move(CurIndex, NewIndex: integer)', TObject(ttProc)); + ALIst.AddObject('property Strings[]: array of string', TObject(ttProp)); + ALIst.AddObject('property NameValueSeparator: char', TObject(ttProp)); + ALIst.AddObject('property CommaText: string', TObject(ttProp)); + ALIst.AddObject('property Text: string', TObject(ttProp)); + ALIst.AddObject('destructor Free', TObject(ttMethod)); + ALIst.AddObject('procedure Clear', TObject(ttProc)); + ALIst.AddObject('procedure Sort', TObject(ttProc)); + ALIst.AddObject('property Sorted: boolean', TObject(ttProp)); + ALIst.AddObject('procedure Assign(sourse: TStrings)', TObject(ttProc)); + ALIst.AddObject('procedure AddStrings(strings: TStrings)', TObject(ttProc)); + end; + + if (LowerCase(AToken) = 'apophysis.') or (LowerCase(AToken) = 'application.') then + begin + AList.Clear; + ALIst.AddObject('function MessageBox(Promt, Caption: string, DlgStyle: integer = 0): integer;', + TObject(ttFunc)); + ALIst.AddObject('property Icon', TObject(ttProp)); + ALIst.AddObject('property Title', TObject(ttProp)); + ALIst.AddObject('property ExeName', TObject(ttProp)); + ALIst.AddObject('procedure ProcessMessages', TObject(ttMethod)); + end; + + if pos('ttaskdialog', LowerCase(AToken))> 0 then + ALIst.AddObject('constructor Create(nil)', TObject(ttMethod)); + + if (pos('tdlg', LowerCase(AToken))> 0) then + begin + AList.Clear; + ALIst.AddObject('destructor Destroy', TObject(ttMethod)); + ALIst.AddObject('property Title: string', TObject(ttProp)); + ALIst.AddObject('property Caption: string', TObject(ttProp)); + ALIst.AddObject('property MainIcon', TObject(ttProp)); + ALIst.AddObject('property CustomMainIcon', TObject(ttProp)); + ALIst.AddObject('property ExpandedText: string', TObject(ttProp)); + ALIst.AddObject('property ExpandButtonCaption: string', TObject(ttProp)); + ALIst.AddObject('property Text: string', TObject(ttProp)); + ALIst.AddObject('property VerificationText: string', TObject(ttProp)); + ALIst.AddObject('property CommonButtons: [set]', TObject(ttProp)); + ALIst.AddObject('property DefaultButton', TObject(ttProp)); + ALIst.AddObject('method Execute', TObject(ttMethod)); + ALIst.AddObject('property ModalResult: integer', TObject(ttProp)); + ALIst.AddObject('property Buttons', TObject(ttProp)); + ALIst.AddObject('property RadioButtons', TObject(ttProp)); + ALIst.AddObject('property Button', TObject(ttProp)); + ALIst.AddObject('property RadioButton', TObject(ttProp)); + ALIst.AddObject('property Flags: [set]', TObject(ttProp)); + ALIst.AddObject('property FooterText: string', TObject(ttProp)); + ALIst.AddObject('property FooterIcon', TObject(ttProp)); + ALIst.AddObject('property CustomFooterIcon', TObject(ttProp)); + ALIst.AddObject('property ProgressBar', TObject(ttProp)); + ALIst.AddObject('property OnVerificationClicked: procedure', TObject(ttProp)); + end; + if (pos('buttons.', LowerCase(AToken))> 0) then + begin + AList.Clear; + ALIst.AddObject('method Add', TObject(ttMethod)); + ALIst.AddObject('method Delete(i)', TObject(ttMethod)); + if (pos('radiobuttons.', LowerCase(AToken))> 0) then + ALIst.AddObject('property Items[i]', TObject(ttProp)); + end; + if (pos('radiobutton.', LowerCase(AToken))> 0) then + begin + AList.Clear; + ALIst.AddObject('property ID: integer', TObject(ttProp)); + ALIst.AddObject('property Index: integer', TObject(ttProp)); + end; + if (pos('btn', LowerCase(AToken))> 0) or (pos('.button.', LowerCase(AToken))> 0) then + begin + AList.Clear; + ALIst.AddObject('property Caption: string', TObject(ttProp)); + ALIst.AddObject('property CommandLinkHint: string', TObject(ttProp)); + ALIst.AddObject('property ModalResult: integer', TObject(ttProp)); + end; + if (pos('progressbar.', LowerCase(AToken))> 0) then + begin + AList.Clear; + ALIst.AddObject('property Min: integer', TObject(ttProp)); + ALIst.AddObject('property Max: integer', TObject(ttProp)); + ALIst.AddObject('property Position: integer', TObject(ttProp)); + ALIst.AddObject('property MarqueeSpeed: integer', TObject(ttProp)); + ALIst.AddObject('property State: integer', TObject(ttProp)); + end; + + if (AList.Count > 1) then AList.Sorted := True; +end; + +procedure TScriptEditor.ExpandBlocksClick(Sender: TObject); +begin + Editor.ExpandAllNodes; +end; + +{ ****************************** } + +procedure TScriptEditor.ScrCodeList1BlockDblClick(Sender: TObject; + ACodeBlock: TCodeBlock); +begin + with Editor do + DropText(CurX, CurY, ScrCodeList1.CodeBlocks[ScrCodeList1.itemindex].Code.Text); +end; + +procedure TScriptEditor.ScrCodeList1BlockRightClick(Sender: TObject; + ACodeBlock: TCodeBlock); +begin + ScrCodeList1.ItemIndex := ACodeBlock.Index; +end; + +procedure TScriptEditor.ScrCodeList1ContextPopup(Sender: TObject; + MousePos: TPoint; var Handled: Boolean); +begin + if (ScrCodeList1.Items.Count > 1) then + mnuDeleteBlock.Enabled := True + else + mnuDeleteBlock.Enabled := False; +end; + +procedure TScriptEditor.ScrCodeList1DragDrop(Sender, Source: TObject; X, + Y: Integer); +begin + ScrCodeList1.CodeBlocks.Add(Editor.Selection); +end; + +procedure TScriptEditor.ScrCodeList1DragOver(Sender, Source: TObject; X, + Y: Integer; State: TDragState; var Accept: Boolean); +begin + Accept := (source is TScrMemo); +end; + +procedure TScriptEditor.ScripterCompileError(Sender: TObject; + var msg: string; row, col: Integer; var ShowException: Boolean); +var ps: integer; +begin + btnRun.Enabled := True; + btnStop.Enabled := False; + btnBreak.Enabled := False; + btnPause.Enabled := False; + MainForm.btnRunScript.Enabled := True; + MainForm.btnStopScript.Enabled := False; + MainForm.mnuRun.Enabled := True; + MainForm.mnuStop.Enabled := False; + { AV: in previous Apo versions, + user cannot load a Script + after simple syntax error - it's not normally... } + if (MainForm.FavouriteScripts1.Count > 0) then + MainForm.FavouriteScripts1.Enabled := True; // AV + if (MainForm.Directory1.Count > 0) then + MainForm.Directory1.Enabled := True; // AV + + StatusBar.SimpleText := TextByKey('script-status-compileerror'); // AV + + Editor.ActiveLine := row - 1; + Editor.ActiveLineSettings.ShowActiveLine := True; + if LanguageFile <> '' then // AV: if we need to translate from/to English + begin + if pos('Unknown ident', msg) > 0 then + msg := StringReplace(msg, 'Unknown identifier or variable is not declared', + TextByKey('script-status-noidentifier'), []) + else if pos('Syntax err', msg) > 0 then + msg := StringReplace(msg, 'Syntax error', + TextByKey('script-status-syntaxerror'), []) + else if pos('Unknown member id', msg) > 0 then + msg := StringReplace(msg, 'Unknown member identifier', + TextByKey('script-status-noclassmember'), []) + else if pos('Unknown method or rout', msg) > 0 then + msg := StringReplace(msg, 'Unknown method or routine', + TextByKey('script-status-unknownmethod'), []) + else if pos('value to const', msg) > 0 then + msg := StringReplace(msg, 'Cannot assign a value to constant', + TextByKey('script-status-constassign'), []) + else if pos('Too many param', msg) > 0 then + begin + msg := StringReplace(msg, 'Too many parameters for method', + TextByKey('script-status-toomanyparams'), []); + ps := pos('#', TextByKey('script-status-expectparams')); + if (ps <> 0) then begin + msg := StringReplace(msg, 'Expected ', Copy(TextByKey('script-status-expectparams'), 1, ps - 1), []); + msg := StringReplace(msg, ' parameters', Copy(TextByKey('script-status-expectparams'), ps + 1, + length(TextByKey('script-status-expectparams')) - ps), []); + end; + end + else if pos('Not enough act', msg) > 0 then + begin + msg := StringReplace(msg, 'Not enough actual parameters for method', + TextByKey('script-status-notenoughparams'), []); + ps := pos('#', TextByKey('script-status-expectparams')); + if (ps <> 0) then begin + msg := StringReplace(msg, 'Expected ', Copy(TextByKey('script-status-expectparams'), 1, ps - 1), []); + msg := StringReplace(msg, ' parameters', Copy(TextByKey('script-status-expectparams'), ps + 1, + length(TextByKey('script-status-expectparams')) - ps), []); + end; + end + else if (pos('Method ', msg) > 0) and (pos('expects vari', msg) > 0) then + begin + ps := pos('#', TextByKey('script-status-expectvar')); + if (ps <> 0) then begin + msg := StringReplace(msg, 'Method ', Copy(TextByKey('script-status-expectvar'), 1, ps - 1), []); + msg := StringReplace(msg, ' expects variable reference', Copy(TextByKey('script-status-expectvar'), ps + 1, + length(TextByKey('script-status-expectvar')) - ps), []); + end; + end + else if pos('Assign to meth', msg) > 0 then + begin + ps := pos('#', TextByKey('script-status-notassign')); + if (ps <> 0) then begin + msg := StringReplace(msg, 'Assign to method ', Copy(TextByKey('script-status-notassign'), 1, ps - 1), []); + msg := StringReplace(msg, ' is not allowed', Copy(TextByKey('script-status-notassign'), ps + 1, + length(TextByKey('script-status-notassign')) - ps), []); + end; + end + else if pos('called as a me', msg) > 0 then + begin + ps := pos('#', TextByKey('script-status-propnotfunc')); + if (ps <> 0) then begin + msg := StringReplace(msg, 'Property ', Copy(TextByKey('script-status-propnotfunc'), 1, ps - 1), []); + msg := StringReplace(msg, ' cannot be called as a method', Copy(TextByKey('script-status-propnotfunc'), ps + 1, + length(TextByKey('script-status-propnotfunc')) - ps), []); + end; + end; + end; + Console.Lines.Add(TextByKey('script-line') + #32 + IntToStr(row) + ' : '+ msg); + LoadForm.Output.Text := LoadForm.Output.Text + DTError + TextByKey('script-line') + ': '#39 + + Editor.Lines[row-1] + #39', '+ TextByKey('script-position') + + ': '+ IntToStr(col) + #13#10 + msg + #13#10; // AV + ScriptRenderForm.Close; + ShowException := true; + Application.ProcessMessages; + if LoadForm.CheckBox1.Checked then LoadForm.Show; // AV +end; + +procedure TScriptEditor.ScripterRuntimeError(Sender: TObject; var msg: string; + row, col: Integer; var ShowException: Boolean); // AV +begin + btnRun.Enabled := True; + btnStop.Enabled := False; + btnBreak.Enabled := False; + btnPause.Enabled := False; + MainForm.btnRunScript.Enabled := True; + MainForm.btnStopScript.Enabled := False; + MainForm.mnuRun.Enabled := True; + MainForm.mnuStop.Enabled := False; + StatusBar.SimpleText := TextByKey('script-status-runtimeerror'); // AV + { AV: in previous Apo versions, + user cannot continue work in Script editor + after runtime error - it's not normally... } + if (MainForm.FavouriteScripts1.Count > 0) then + MainForm.FavouriteScripts1.Enabled := True; // AV + if (MainForm.Directory1.Count > 0) then + MainForm.Directory1.Enabled := True; // AV + + Editor.ActiveLine := row - 1; + Editor.ActiveLineSettings.ShowActiveLine := True; + if LanguageFile <> '' then + { AV: We don't need to translate from-to English } + begin + if pos('not an array', msg) > 0 then + msg := StringReplace(msg, 'Variable is not an array', + TextByKey('script-status-varnotarray'), []) + else if pos('find form f', msg) > 0 then + msg := StringReplace(msg, 'Cannot find form file', + TextByKey('script-status-noformfile'), []); + end; + LoadForm.Output.Text := LoadForm.Output.Text + RTError + TextByKey('script-line') + ': '#39 + + Editor.Lines[row-1] + #39', '+ TextByKey('script-position') + + ': '+ IntToStr(col) + #13#10 + msg + #13#10; + ScriptRenderForm.Close; + ShowException := true; + Application.ProcessMessages; + if LoadForm.CheckBox1.Checked then LoadForm.Show; // AV +end; + +procedure TScriptEditor.btnStopClick(Sender: TObject); +begin + Console.Lines.Add(TextByKey('script-status-stopped')); // AV + if btnPause.Down then btnPause.Click; // AV + Stopped := True; +end; + +procedure TScriptEditor.AddFromClipboardClick(Sender: TObject); +begin + AddFromClipboard.Checked := not AddFromClipboard.Checked; + ScrCodeList1.ClipboardView := AddFromClipboard.Checked; +end; + +procedure TScriptEditor.AdjustScripterColors; // AV +var + i: integer; + BackColor: TColor; +begin + BackColor := Editor.BkColor; + with Styler do // default + begin + for i := 0 to AllStyles.Count-1 do + AllStyles[i].BGColor := BackColor; + CommentStyle.BkColor := BackColor; + NumberStyle.BkColor := BackColor; + NumberStyle.TextColor := clFuchsia; + end; + Editor.BlockColor := MidColor; + Editor.Gutter.GutterColor := BrightColor; + Editor.Gutter.GutterColorTo := MidColor; + Editor.Gutter.GutterColorTo := MidColor; + Editor.Gutter.Font.Color := TextColor; + ScrCodeList1.Font.Color := Editor.Font.Color; + + if IsDarkTheme then // AV: adaptating the scripter to dark themes + begin + with Styler do + begin + AllStyles[0].Font.Color := clLime; + AllStyles[4].Font.Color := clAqua; + CommentStyle.TextColor := clAqua; + end; + with Editor.AutoCompletion do begin + Font.Color := clWhite; + ColorFunc := $00C6C600; // turquoise + ColorProc := $00C6C600; + ColorMethod := $00C6C600; + ColorProp := $0020B9FB; // orange + ColorIdentifier := $00E901BA; // violet + ColorVar := clSkyBlue; + end; + end + else + begin + with Styler do // default + begin + AllStyles[0].Font.Color := clGreen; + AllStyles[4].Font.Color := clNavy; + CommentStyle.TextColor := clNavy; + + if (CurrentStyle = 'Calypso SLE') or + (CurrentStyle = 'Emerald') or (CurrentStyle = 'Coral') then + NumberStyle.TextColor := $009F009F; + end; + with Editor.AutoCompletion do begin + Font.Color := TextColor; + ColorFunc := clNavy; + ColorProc := clNavy; + ColorMethod := clNavy; + ColorProp := clGreen; + ColorIdentifier := clTeal; + ColorVar := clBlue; + end; + end; +end; + +procedure TScriptEditor.btnBreakClick(Sender: TObject); +begin + LastError := TextByKey('script-status-break'); + if btnPause.Down then btnPause.Click; // AV + Scripter.Halt; + btnPause.Enabled := False; + StatusBar.SimpleText := StatusBar.Hint; +end; + +procedure TScriptEditor.btnFavoriteClick(Sender: TObject); +// AV: rewrite and bring back to life a very old method +var + i: integer; + there: boolean; +begin + if Trim(Editor.Lines.Text)= '' then exit; + there := False; + for i := 0 to Favorites.Count - 1 do + if Lowercase(Script) = LowerCase(Favorites[i]) then begin + There := true; + break; + end; + if there then begin + Application.MessageBox(PChar(Format(TextByKey('common-favscriptexists'), + [ExtractFileName(Script)])), PChar('Apophysis AV'), MB_ICONWARNING); + exit; + end; + + if (Script = '') or Editor.LinesModified then btnSave.Click; + if Script <> '' then begin + Favorites.Add(Script); + Favorites.SaveToFile(AppPath + scriptFavsFilename); + MainForm.GetScripts; + Application.MessageBox(PChar(Format(TextByKey('common-favscriptadded'), + [ExtractFileName(Script)])), PChar('Apophysis AV'), MB_ICONINFORMATION); + end; +end; + +{ // AV: now it's deprecated +procedure TScriptEditor.FormShortCut(var Msg: TWMKey; var Handled: Boolean); +begin + if GetKeyState(VK_CONTROL) >= 0 then + Exit; + + if Msg.CharCode = Ord('C') then begin + Editor.CopyToClipBoard; + Handled := True; + end; + + if Msg.CharCode = Ord('V') then begin + Editor.PasteFromClipBoard; + Handled := True; + end; + + if Msg.CharCode = Ord('X') then begin + Editor.CutToClipBoard; + Handled := True; + end; +end; +} + +procedure TScriptEditor.F2SXMLContent(Sender: TObject; Content: string); +begin + // todo: palette +end; + +procedure TScriptEditor.F2SXMLEmptyTag(Sender: TObject; TagName: string; + Attributes: TAttrList); +var + i,n: integer; + v,w: TStringType; + d, floatcolor: double; + Tokens: TStringList; +begin + + Tokens := TStringList.Create; + try + if (TagName = 'xform') or (TagName = 'finalxform') then + Editor.Lines.Add(''); + if TagName = 'finalxform' then begin + Editor.Lines.Add('{ Final Transform }'); + Editor.Lines.Add('Flame.FinalXformEnabled := True;'); + Editor.Lines.Add('SetActiveTransform(transforms);'); + end else begin + w := TStringType('{ Transform ' + IntToStr(AddedXForms + 1)); + v := Attributes.Value('name'); + if (v <> '') then w := w + ' (' + v + ')'; + w := w + ' }'; + Editor.Lines.Add(String(w)); + Editor.Lines.Add('AddTransform;'); + end; + Editor.Lines.Add('with Transform do begin'); + //Editor.Lines.Add(' for i := 0 to NXFORMS do Chaos[i] := 1;'); + + v := Attributes.Value('var_order'); + if v <> '' then begin + GetTokens(String(v), tokens); + n := -1; + for i := 0 to Tokens.Count-1 do + if (GetVariationIndex(Tokens[i]) >= 0) then begin + inc(n); + Editor.Lines.Add(Format(' SetVariationOrder(''%s'', %d);', [Tokens[i], n])); + end; + end; + + v := Attributes.Value(TStringType(varnames(0))); + if v = '' then + Editor.Lines.Add(' Variation[0] := 0; // linear'); + + for i := 0 to NRVAR - 1 do + begin + v := Attributes.Value(TStringType(varnames(i))); + if v <> '' then + //Editor.Lines.Add(' ' + varnames(i) + ' := ' + String(v) + ';'); + Editor.Lines.Add(Format(' %s := %.6g;', [varnames(i), StrToFloat(String(v))])); + end; + + for i := 0 to GetNrVariableNames - 1 do begin + v := Attributes.Value(TStringType(GetVariableNameAt(i))); + if v <> '' then begin + Editor.Lines.Add(' ' + GetVariableNameAt(i) + ' := ' + String(v) + ';'); + end; + end; + + v := Attributes.Value('weight'); + if (v <> '') and (TagName = 'xform') then + Editor.Lines.Add(Format(' Weight := %.6g;', [StrToFloat(String(v))])); + v := Attributes.Value('color'); + if (v <> '') then Editor.Lines.Add(' Color := ' + String(v) + ';'); + v := Attributes.Value('var_color'); + if (v <> '') then Editor.Lines.Add(' VarColor := ' + String(v) + ';'); + v := Attributes.Value('symmetry'); + if (v <> '') and (TagName = 'xform') then Editor.Lines.Add(' Symmetry := ' + String(v) + ';'); + v := Attributes.Value('opacity'); + if v <> '' then begin + Editor.Lines.Add(' Opacity := ' + String(v) + ';'); + end; + + v := Attributes.Value('coefs'); + if (v <> '') then begin + GetTokens(String(v), tokens); + Editor.Lines.Add(Format(' coefs[0,0] := %.6g; // a', [StrToFloat(Tokens[0])])); + Editor.Lines.Add(Format(' coefs[1,0] := %.6g; // b', [StrToFloat(Tokens[2]) * (-1)])); + Editor.Lines.Add(Format(' coefs[0,1] := %.6g; // c', [StrToFloat(Tokens[1]) * (-1)])); + Editor.Lines.Add(Format(' coefs[1,1] := %.6g; // d', [StrToFloat(Tokens[3])])); + Editor.Lines.Add(Format(' coefs[2,0] := %.6g; // e', [StrToFloat(Tokens[4])])); + Editor.Lines.Add(Format(' coefs[2,1] := %.6g; // f', [StrToFloat(Tokens[5]) * (-1)])); + end; + + v := Attributes.Value('post'); + if v <> '' then begin + GetTokens(String(v), tokens); + Editor.Lines.Add(Format(' post[0,0] := %.6g;', [StrToFloat(Tokens[0])])); + Editor.Lines.Add(Format(' post[0,1] := %.6g;', [StrToFloat(Tokens[1]) * (-1)])); + Editor.Lines.Add(Format(' post[1,0] := %.6g;', [StrToFloat(Tokens[2]) * (-1)])); + Editor.Lines.Add(Format(' post[1,1] := %.6g;', [StrToFloat(Tokens[3])])); + Editor.Lines.Add(Format(' post[2,0] := %.6g;', [StrToFloat(Tokens[4])])); + Editor.Lines.Add(Format(' post[2,1] := %.6g;', [StrToFloat(Tokens[5]) * (-1)])); + end; + + + v := Attributes.Value('chaos'); + if v <> '' then begin + chaosLines.Add(''); + chaosLines.Add('{ Weight modifiers for transform ' + IntToStr(AddedXForms + 1) + ' }'); + chaosLines.Add('SetActiveTransform(' + IntToStr(AddedXForms) + ');'); + chaosLines.Add('with Transform do begin'); + GetTokens(String(v), tokens); + for i := 0 to Tokens.Count-1 do + chaosLines.Add(' chaos[' + IntToStr(i) + '] := ' + Tokens[i] + ';') ; + chaosLines.Add('end;'); + end; + + Editor.Lines.Add('end;'); + AddedXForms := AddedXForms + 1; + finally + Tokens.free; + end; +end; + +procedure TScriptEditor.F2SXMLEndTag(Sender: TObject; TagName: string); +begin +// +end; + +procedure TScriptEditor.F2SXMLStartTag(Sender: TObject; TagName: string; + Attributes: TAttrList); +var + Tokens: TStringList; + v: TStringType; + f, b: double; +begin + Tokens := TStringList.Create; + try + + if TagName='flame' then + begin + AddedXForms := 0; + Editor.Lines.Add('{ Flame }'); + Editor.Lines.Add('Clear;'); + // Editor.Lines.Add('if (pos(''7x'', LowerCase(ProgramVersionString)) > 0) then'); + // Editor.Lines.Add(' AngleTransform := 180 / PI else AngleTransform := 1;'); + Editor.Lines.Add('with Flame do begin'); + + v := Attributes.Value(TStringType('size')); + if (v <> '') then begin + GetTokens(String(v), tokens); + + Editor.Lines.Add(' Width := ' + Tokens[0] + ';'); + Editor.Lines.Add(' Height := ' + Tokens[1] + ';'); + + f := 100 / StrToFloat(Tokens[0]); + end else f := 0; + b := 0; + + v := Attributes.Value(TStringType('brightness')); + if (v <> '') then begin + Editor.Lines.Add(' Brightness := ' + String(v) + ';'); + b := StrToFloat(String(v)); + end; + v := Attributes.Value(TStringType('gamma')); + if (v <> '') then Editor.Lines.Add(' Gamma := ' + String(v) + ';'); + v := Attributes.Value(TStringType('vibrancy')); + if (v <> '') then Editor.Lines.Add(' Vibrancy := ' + String(v) + ';'); + v := Attributes.Value(TStringType('contrast')); + if (v <> '') then Editor.Lines.Add(' Contrast := ' + String(v) + ';'); + v := Attributes.Value(TStringType('gamma_threshold')); + if (v <> '') then begin + if b <> 0 then b := StrToFloat(String(v)) / b; + Editor.Lines.Add(' GammaThreshold := ' + FloatToStr(b) + ';'); + end; + + v := Attributes.Value(TStringType('zoom')); + if (v <> '') then Editor.Lines.Add(' Zoom := ' + String(v) + ';'); + v := Attributes.Value(TStringType('scale')); + if (v <> '') then Editor.Lines.Add(Format(' Scale := %.6g;', [StrToFloat(String(v)) * f])); + v := Attributes.Value(TStringType('angle')); + if (v <> '') then + // Editor.Lines.Add(' Angle := ' + FloatToStr(StrToFloat(String(v))* 180 / PI) + '; '); + Editor.Lines.Add(Format(' Angle := %.6g; // Flame rotation', [StrToFloat(String(v)) * 180 / PI])); + + // 3d + v := Attributes.Value(TStringType('cam_pitch')); + if (v <> '') then + Editor.Lines.Add(Format(' Pitch := %.6g;', [StrToFloat(String(v)) * 180 / PI])); + v := Attributes.Value(TStringType('cam_roll')); // AV + if (v <> '') then + Editor.Lines.Add(Format(' Roll := %.6g;', [StrToFloat(String(v)) * 180 / PI])); + v := Attributes.Value(TStringType('cam_yaw')); + if (v <> '') then + Editor.Lines.Add(Format(' Yaw := %.6g;', [StrToFloat(String(v)) * 180 / PI])); + v := Attributes.Value(TStringType('cam_perspective')); + if (v <> '') then Editor.Lines.Add(' Perspective := ' + String(v) + ';'); + v := Attributes.Value(TStringType('cam_zpos')); + if (v <> '') then Editor.Lines.Add(' Z := ' + String(v) + ';'); + v := Attributes.Value(TStringType('cam_dof')); + if (v <> '') then Editor.Lines.Add(' DOF := ' + String(v) + ';'); + + try + v := Attributes.Value(TStringType('center')); + if (v <> '') then begin + GetTokens(String(v), tokens); + Editor.Lines.Add(' X := ' + Tokens[0] + ';'); + Editor.Lines.Add(' Y := ' + Tokens[1] + ';'); + end; + except + Editor.Lines.Add(' X := 0;'); + Editor.Lines.Add(' Y := 0;'); + end; + + try + v := Attributes.Value(TStringType('background')); + if (v <> '') then begin + GetTokens(String(v), tokens); + + Editor.Lines.Add(Format(' Background[0] := %g; // red component', [Int(StrToFloat(Tokens[0]) * 255)])); + Editor.Lines.Add(Format(' Background[1] := %g; // green component', [Int(StrToFloat(Tokens[1]) * 255)])); + Editor.Lines.Add(Format(' Background[2] := %g; // blue component', [Int(StrToFloat(Tokens[2]) * 255)])); + + end; + except + Editor.Lines.Add(' Background[0] := 0; // red component'); + Editor.Lines.Add(' Background[1] := 0; // green component'); + Editor.Lines.Add(' Background[2] := 0; // blue component'); + end; + + v := Attributes.Value(TStringType('soloxform')); + if (v <> '') then Editor.Lines.Add('SoloXform := ' + String(v) + ';'); + + Editor.Lines.Add('end;'); + end; + finally + Tokens.free; + end; +end; + +procedure TScriptEditor.LoadRunAndClear(scriptFile:string); +begin + LoadScriptFile(scriptFile); + RunScript; + btnNewClick(btnNew); +end; + +end. + + diff --git a/Forms/ScriptRender.dfm b/Forms/ScriptRender.dfm new file mode 100644 index 0000000..59066bd --- /dev/null +++ b/Forms/ScriptRender.dfm @@ -0,0 +1,40 @@ +object ScriptRenderForm: TScriptRenderForm + Left = 390 + Top = 391 + BorderStyle = bsDialog + Caption = 'ScriptRenderForm' + ClientHeight = 58 + ClientWidth = 285 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + OnCreate = FormCreate + OnDestroy = FormDestroy + DesignSize = ( + 285 + 58) + PixelsPerInch = 96 + TextHeight = 13 + object btnCancel: TButton + Left = 96 + Top = 28 + Width = 95 + Height = 25 + Anchors = [akLeft, akRight, akBottom] + Caption = '&Cancel' + TabOrder = 0 + OnClick = btnCancelClick + end + object ProgressBar: TProgressBar + Left = 8 + Top = 8 + Width = 271 + Height = 13 + Anchors = [akLeft, akTop, akRight] + TabOrder = 1 + end +end diff --git a/Forms/ScriptRender.pas b/Forms/ScriptRender.pas new file mode 100644 index 0000000..ea971ff --- /dev/null +++ b/Forms/ScriptRender.pas @@ -0,0 +1,178 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} +unit ScriptRender; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + ComCtrls, StdCtrls, RenderThread, cmap, ControlPoint, Translation; + +type + TScriptRenderForm = class(TForm) + btnCancel: TButton; + ProgressBar: TProgressBar; + procedure FormDestroy(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure btnCancelClick(Sender: TObject); + private +// PixelsPerUnit: double; + StartTime: TDateTime; + Remainder: TDateTime; + + procedure HandleThreadCompletion(var Message: TMessage); + message WM_THREAD_COMPLETE; + procedure HandleThreadTermination(var Message: TMessage); + message WM_THREAD_TERMINATE; + public + Renderer: TRenderThread; + ColorMap: TColorMap; + cp: TControlPoint; + Filename: string; + ImageWidth, ImageHeight, Oversample: Integer; + zoom, Sample_Density, Brightness, Gamma, Vibrancy, Filter_Radius: double; + center: array[0..1] of double; + procedure OnProgress(prog: double); + procedure Render; + procedure SetRenderBounds; + end; + +var + ScriptRenderForm: TScriptRenderForm; + Cancelled: boolean; + +implementation + +uses Global, Math, FormRender, ScriptForm, Main; +{$R *.DFM} + +procedure TScriptRenderForm.SetRenderBounds; +begin + cp.copy(ScriptEditor.cp); + cp.AdjustScale(ScriptEditor.Renderer.Width, ScriptEditor.Renderer.Height); + // --?-- cp.CalcBoundBox; + cp.center[0] := ScriptEditor.cp.center[0]; + cp.center[1] := ScriptEditor.cp.center[1]; + cp.zoom := ScriptEditor.cp.zoom; +end; + +procedure TScriptRenderForm.Render; +begin + assert(not Assigned(Renderer)); + Renderer := TRenderThread.Create; + + Cancelled := False; + ScriptEditor.Scripter.Paused := True; + StartTime := Now; + Remainder := 1; + cp.copy(ScriptEditor.cp); + Filename := ScriptEditor.Renderer.Filename; + + cp.AdjustScale(ScriptEditor.Renderer.Width, ScriptEditor.Renderer.Height); + + //cp.Transparency := (PNGTransparency <> 0) and (UpperCase(ExtractFileExt(ScriptEditor.Renderer.FileName)) = '.PNG'); + if (UpperCase(ExtractFileExt(ScriptEditor.Renderer.FileName)) = '.PNG') then + begin // AV: added new property + cp.Transparency := (PNGTransparency <> 0); + if ScriptEditor.Renderer.EmbedParameters then + Renderer.EmbedText(Trim(MainForm.RetrieveXML(cp))); // AV + end + else + cp.Transparency := False; // AV + + Renderer.OnProgress := OnProgress; + Renderer.SetCP(cp); + if (ScriptEditor.Renderer.MaxMemory > 0) then + Renderer.MaxMem := ScriptEditor.Renderer.MaxMemory; + Renderer.TargetHandle := Handle; + renderPath := ExtractFilePath(ScriptEditor.Renderer.Filename); + Renderer.Priority := tpLower; + + Renderer.NrThreads := NrTreads; // AV: now works fine + Renderer.Resume; + +// Renderer.SaveImage(FileName); +// ScriptEditor.Scripter.Paused := False; +end; + +procedure TScriptRenderForm.OnProgress(prog: double); +var + Elapsed: TDateTime; +begin + prog := (Renderer.Slice + Prog) / Renderer.NrSlices; + ProgressBar.Position := round(100 * prog); + Elapsed := Now - StartTime; + // if prog > 0 then Remainder := Elapsed * (1/prog - 1); + //Application.ProcessMessages; +end; + +procedure TScriptRenderForm.FormDestroy(Sender: TObject); +begin + cp.free; + assert(not Assigned(Renderer)); //if Assigned(Renderer) then Renderer.free; +end; + +procedure TScriptRenderForm.FormCreate(Sender: TObject); +begin + //Renderer := TRenderThread.Create; + self.Hint := TextByKey('script-rendering'); + btnCancel.Caption := TextByKey('common-cancel'); + cp := TControlPoint.Create; +end; + +procedure TScriptRenderForm.btnCancelClick(Sender: TObject); +begin + ScriptEditor.Scripter.Halt; + Cancelled := True; +// Renderer.Stop; + if Assigned(Renderer) then begin + Renderer.Terminate; + Renderer.WaitFor; + Renderer.Free; + Renderer := nil; + end; + LastError := TextByKey('script-status-cancelrender'); +end; + +procedure TScriptRenderForm.HandleThreadCompletion(var Message: TMessage); +begin + Renderer.SaveImage(FileName); + + Renderer.Free; + Renderer := nil; + + ScriptEditor.Scripter.Paused := False; +end; + +procedure TScriptRenderForm.HandleThreadTermination(var Message: TMessage); +begin + if Assigned(Renderer) then + begin + Renderer.Free; + Renderer := nil; + end; +end; + +end. + diff --git a/Forms/SplashForm.dfm b/Forms/SplashForm.dfm new file mode 100644 index 0000000..8b71384 --- /dev/null +++ b/Forms/SplashForm.dfm @@ -0,0 +1,3638 @@ +object SplashWindow: TSplashWindow + Left = 0 + Top = 0 + BorderIcons = [] + BorderStyle = bsNone + Caption = 'Apophysis AV' + ClientHeight = 400 + ClientWidth = 400 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clSkyBlue + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + OnCreate = FormCreate + OnHide = FormHide + OnShow = FormShow + DesignSize = ( + 400 + 400) + PixelsPerInch = 96 + TextHeight = 13 + object BackgroundImage: TImage + Left = 0 + Top = 0 + Width = 400 + Height = 400 + Align = alClient + Picture.Data = { + 0A544A504547496D616765E8BD0100FFD8FFE000104A46494600010101006000 + 600000FFDB004300020101020101020202020202020203050303030303060404 + 0305070607070706070708090B0908080A0807070A0D0A0A0B0C0C0C0C07090E + 0F0D0C0E0B0C0C0CFFDB004301020202030303060303060C0807080C0C0C0C0C + 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C + 0C0C0C0C0C0C0C0C0C0C0C0C0CFFC00011080190019003012200021101031101 + FFC4001F0000010501010101010100000000000000000102030405060708090A + 0BFFC400B5100002010303020403050504040000017D01020300041105122131 + 410613516107227114328191A1082342B1C11552D1F02433627282090A161718 + 191A25262728292A3435363738393A434445464748494A535455565758595A63 + 6465666768696A737475767778797A838485868788898A92939495969798999A + A2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6 + D7D8D9DAE1E2E3E4E5E6E7E8E9EAF1F2F3F4F5F6F7F8F9FAFFC4001F01000301 + 01010101010101010000000000000102030405060708090A0BFFC400B5110002 + 0102040403040705040400010277000102031104052131061241510761711322 + 328108144291A1B1C109233352F0156272D10A162434E125F11718191A262728 + 292A35363738393A434445464748494A535455565758595A636465666768696A + 737475767778797A82838485868788898A92939495969798999AA2A3A4A5A6A7 + A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE2E3 + E4E5E6E7E8E9EAF2F3F4F5F6F7F8F9FAFFDA000C03010002110311003F00FC20 + B84781E458D73279859D8B67E5F439E4720FD78CD457122DD5CB43F7D5B8CF99 + B4B7427249E000319C1E9EB5B5AE69F3C42E9DFCA6F2F1BFCA0AA55970082BD5 + 70CFC8C63D31915CE5EDA49692336F25594A641EDE87DB81C7618AE7A7696A77 + D68CA1A5896E2DC245B54BAB95040917E60A4160C31C01820FE5D79223FECFDD + 651E59186338DDCF5C8E3AF3BBDB9E3823912D25BABC11C5E631E592307E7DDD + 801D7278FAFA678ABC341D4B4F9F71B3D422946595A58580247DE232BED8FC0E + 7D2B4DBA9928B96A96851B4D39A0BA8DA36DB346CA42EE1B8B6EE38EDCE3D7A7 + D33A5F6E84B471C92425616507CB88B062370264C8C1EDC82701B8CF350CDAA4 + 90996666DCCCBB1918165CB75EBF423D3F320759F0AAD341D77C551C7ACAB456 + 6B3079E3585BE40BB0920A80A07DE073DB1D33918D6A9C90751A6EDDB73A70B8 + 7F6B51528349B7D5D918B2687191BB7FDA0E4B3649553825036DC03B7771C7CD + 8C13C9C1ADA97850C1147242A6E21D81DA43198C2EE3C6077C9C819383B874E7 + 1FA5BF04FE25FECB7F0DBC276DF6FF0007DD5C6A50907ED11F8676E65E00DB30 + 71B7D89719C16EC48F0BFF00828BF8D3C13E36D3239BC1BE11B8D1AC6372239E + 7921B67C8728764625727F8810383E613D706BE172DE35AD8ACC160FEA752116 + DFBF2B25FF0007E47E899A700D0C265F3C5FD729CE5149F2C6EDFDFF00E697C8 + F8CDFCB5840CEE8D80605412A4F248C1E9C9C7AE013F57492796CDB583F99C82 + E0E24048048E99CE3A9C743D0F4B5A7E9535F5AE233F68DA5330AF2D92D8181D + B918E9EDDC131369ACD1E46DB891632648D493C6482D91C0DB907193827D338F + BEE647E69CAD2B92F857C4579E0BD556FAC5DA199485C2C8479CB9CF38CE7054 + 647AE3B8CD7D8DABFC35D1FF006BAFD9793C47A6D9DBC7E28F0F48F6F79042C7 + F79B9C3C448C8DCA374B1823F857A815F17C966D0745DD1B370ECA03750738EB + EDC1E4F42718AF73FD8EFF00685BCF819F117ED126E9349BB6B74BE8589F2FCA + 8D9640EA3A029B41247F0C84818F94FCE71260ABD5A2B178276AD4DDD7F79758 + BF557B79D8FA8E14CC30F46BCB058F57A15572BEBCADED25E8D2BDBA5CF1EBCD + 0A4D02F3C990CF0DD5A96122B9DB2425796523AAB6EC8E7A9E38C731BCDF666D + AC4CACC071211C103918EEB9CE071D7B702BF43BFE0B6BFB1A68DE14F1FE87F1 + 0FE1EAC72785FC71A747A9B243208E02F2C9332AA2A8EA40CF270A5C103926BF + 3E3C4E9E64924D1A4918BADAFE648436CDB84C65472060E4F27807009E4E19E2 + 0A19D6029E3E8AB732D53DE2D3B38BF34EE639E64F5729C5CF0D3D52D53D55D3 + D9DBF0F523F0578826F0B78AACF558E46DD6D729B8E3F84F0C33DB2B91EB8FC6 + BD67C4BE269AEF4F4B7B886158ED259B4E69C45E73B87769095E48C38381D770 + C70836E7C6D6E24B894A7EEE4698A420B1C0382300E71C6081B8F1FCEBD4347D + 5A3BBF07D9DE4B0AAEA10C5F66126D1CBC4AAA927DD6562230A5893C05E01C73 + E8E614A2E51A8D5DAD3FAFC4C729AD2E4A94632B27AFF9FCF6FB8D6F84F750DA + 6B725935E4703423E78E390798A18E65C60855F9B6F00E0827395000FA1BE328 + 92E6CCDD44374DA8BC3326622A07991C2C548CF519605063033D9588F996D66B + 8D375680476F66ED1E09CC4C7019308FB42EEF9989F9307017A64AE3E97D4356 + 32F837C3AA022C96F02C3242B2868A4500E376CE3FE5A2704E4156C67835F0BC + 494DAC4D1C42D77EDEBF9A3F4EE11A9196071184968D59ADFD3F04CF36F1C699 + 1EA1E22D22D561D90991C4913261B02E03676E14972ABC93F30E83248AF23F17 + E8F31D49A490B7977D3FDAE58C4CFE67C858A065249239215F77439040C06FA2 + BC516AB6B3DAB41F346904B70EE30705B634A1491B8960338C0EBC0F94578DFC + 4A9EE6F46912ACCBE4BDADBED6DA249A776693694DE0296CA6405F9484460790 + 2BD2C87152764B6FF877F7FF0091E0F1260631BB7DFF00C97DC716FA61BBD063 + D416D1566BF54B78E4936471C07E66908078390A063014AB91C1232FF06595AC + D1DC4F71710CD1E9D0F9AEAC9FBB31C59631E39FBC48000C025886CF41BFE25F + 0BFDAFC1BA198E63B67375A87911E3721698C3C9DE154A98F38233819E0E56A8 + B5BC3A5F82B5AF38B5D5D6A0D15BDAC00167F263FDE48F9DBB5391185C31EAD8 + 03AD7D1C6B7342C9EEEDF8DBFE09F36B0CA1515D74BFADE37FBEEFD75303C136 + B26B9A8C77126E922F341795E35708C43E4B6E239CFCC307042B75DA056AF8F7 + 56974EF10D9DAC71AADD7D922BA370AA4E565C491BB6319063954F1CE64079C2 + 91ADAAE9F67A1787A1D1ADCC774F6970C75436F20896245DBE6B296E03975D99 + 0481E5A60E5FE5E4FC637B7BAAF886FB56D5B75BEA3AA4EED290AB9591DC3B14 + 09F32A84E8A7B740381574E4AA54E7E9ADBBFF005FF00E7ADCD4A93A49EBA5DF + 4D3757F5B2FBFB1D0783B54D42D4C702BCDE49655484166799C050395E19791C + E012BC7CA318EA34AFF8486FAD15C0B886658BF7617E5639D8F83D0F403865E7 + 8E71F7B9BF0BE99A8247132D9991AE77894C6C438D80331CA85C9F994F5C6146 + 48CE4E947AF2CF793DBB59CC56C44AAE61BB38DD9EA5890782F8CE0E085C1000 + 15C3888B9CDF25AE252AD4631724EDF99AF26ABE20B06980FB55C2C2AA2411CB + 2360E323049DD9E9CEDDDCFA30AA5FF0B2751D2F4D852E167858802599E63015 + 66C1081BEF0C01CE7A90012738ABFE1BF0C5AF8D3598E3B159A1B50AA5BCC652 + 5034815B60070182903AE3701DF247A2F8EFF619F17782FF0067AFF8585F6B7F + EC3903B12AACAC84C9E5040A3EE46586709C6D6C8DB8C579388CC70586A90A58 + A9A8CA4D249E8DB7B2F53D9C16538CC5D19D6C353728C536DD95ADD5FA69D0F2 + C93E315DE9DA8AC6B2482405B73F9AD0AB066CFEED589C6428F94E00231C0241 + BBFF000BDE7B87F29A4BE01D58C6ED287922C70065909C1F94723A9C1CE0678B + 8743FED2BE8FCCFB2DB5D6EDEE56401647009648F2704E492DCE412003D56BA4 + F01FC2DB8F186A0B0A99FCB918AF98EEAA8A43007B704100ED1803628EBC2FAD + 5A8E1A11E6A8780BDA56A8A9D3D6ECD88FE2E3FD9DE35BC8E23361DE368D76A9 + E9D14ECE1B3CB00410411F282793D675F5D4AE2DEE9ADE3B7B8D82E1154B496B + B30BF36DC1217EEB609CF1DC727E86FD9B7F621B1F8FDF1222D1E1D436EA171A + 44AF1093F7AD1CF6ED868CF0A171CE323382010304578BFED5DFB33F883F65FF + 008B371E1BD4A15918422681B7EDF3C6E92342339DA0BAB1DA76E14003208CF9 + 59767596D6C73C0529FEF5479ACF476EEBB9EC661C2F9850C14730A914E9B76B + A69DBB5ED76BD763C9BC4372E933C7743CE3E423154F984608C107EEED230461 + 8023A702A841A5DD6A65A592499BCC5C0690ECF2DB680092C3013A0CE40F9063 + 3802AC7883CC1A8BC8D6F2A61B6CAA9264F99C02778E73B9B0475038EC6BA1F8 + 63A42EA96573F68687E45DC483B5A30B97CAAA9C03B72413C71D194107EBE551 + 53A7CE7CA61E83AD57D99C9BC924C44DB5A6B5E08F972C8A5B68DDD7AE4AF507 + EEE49C54525A47696D32AAEC2101933860327E5524753D33D395E9C73EBFA2FE + CB1E24D574DBDBAD36CD751B8B68639E4B7B64DECF04C23646CF039F98AAE1B9 + 1FC58CD797788BC38DA4EAD776D1EE59E3768E55707127CA0EEF9BB67710C703 + 382303EEE787C7D0AF270A524DADEDD3B5FF0043AB159562B0D0552BC1A52DAE + B7F4EFB197FD9B345242ACDE4E02B02D80A7D1812403DF1FE3C99DCCEE3CB6E5 + F76762924A13F2E39CEEC15031F3672DC8A4D425BEB27F2DB72B4036E00C819C + 023A1072300E320AE4739AD2D1C7DB6C9A35FF005DBC6C850EE76F9154F53CE4 + F41D86EEA4A8AEA94ACAE70C2379595CA1697137DA4CB1C2F23403E7F2598707 + A7239C0EFC8EBD413505BEAAA272D32C5701D3615907C8072371DA7391CE3038 + C93CF39BFE23D3523BFDF02E15DDA38118E7CCE59411F313C63032727008F4AC + E430DECB6F1EE923F39B0E42EE018819239C1C95E48031EFC5546CD5C24DC5F2 + 0CBED37CE7F3AD7CC911B0EC447B7CA3D4E40C8032DC7CC7819E3A0A522EE0B2 + 166C91B48CF238E339EDCFE55A57965FD8572A774AB25BBEDC81B77630739EDC + 9E38E98CE39024296B7476DC2F965890E547523FBA7279C9CF403B67BD5465D4 + C6514DD968CC6555858FDFE18038C7E348C1D431DADB5B9200C05FF3FE156756 + D324D31C1FBF0CA4949369F9BB60E790477079FD0D576B9923DA3E65651D7BFA + 7F2C552EE8CE51B3B31389373B7F16785C2F27A71E9F4A1247B59D5959A39108 + 3C71B48E869B22EC651C9E33EDF853A791A7019BAE3AE7AE2A89F326BEBB8EE6 + 42C2355DC172A0F43DF1C7E43B0E2AAF2188E87DE81F2153807BD2B8E17A118E + A2807AEA2F94CAECBB5B729C631D0D186019B80C32083F974FC6A6B596349195 + 99763AE0FCBD081C7E19EA4738CD45B1640DB77160381D7BFF0085016D0F57F1 + 118356B497CC326DDE1CE46D5018296CEE19C0DCA327E63B871C62B97FB05BFD + B2E11A25678C7EE37103632B65BE66DA0AE036324B162B80726BA0F10594B15B + C4B1346A642BFBC07C98D09EFB98924EE24027246D041C938E635362FBA46691 + 6E0FDD07E52A4A8F9401C0E7B76CF4CE6BC9C2EDA3D0FAACC396F751D57F5BB2 + E69FE27B8D32D9A3B6D4AEAD3E4198ECF7C0D21C6412CA416C13C6EFA76155D7 + 4C9B553BAEAF2F23DCE3E76F31C2023A1CE5BE6E31D73951FC5F2E5DD5FB1B43 + 0FDA24F2D09C2938E4F19E3F1E49239C0F5A4B7BCBDB06090CF2C6BB46D11394 + DA1B1FA90A0E335D8A0D2D0F1DD6527696DFD799B5278366D3FC891755B4B846 + 512BAA79919872C0F49117E6FC319E327915A1A2F8DE6B0B3FB3DEE93A2EA567 + 70EB3B096D992604310A59E1DAC73CE412D820E0291C66E91E2FD51A593C92B7 + 52338256E238E60CD961FC61B2DF39191CE1B1CF4ABD6DAFCDAE4AAD716D6AB1 + F97B49B60D0A8239DCDB39620162090704AF7245632BBD27668EAA3CA9A749B5 + EBAAFC6E9FA6A759E08F8810DFB892E26B3B4664CA7DAE1B89565C003AA79AF9 + 01891B8007E525B8159DE3FD0356D675085AE229AD5A58F30C72AF12A90D8319 + 6EAA581C31233F36E26A0D0BC11A96BB7B1E99A4AC935FC814B5ADC20F325523 + 7A80F8236E327248504F7C8C7D25E16FF825D7C76D63C05F6C87C1AC2DDE559D + 333DB34D0A0EE245FDE2E46189DDF39386404027C0CC336CB72E9A9E22B429B9 + 6DCD24BEEB9F5797E558ECC283A7EC2734B7714ED7ECFA5FCB4F467C83E26F09 + EA9E17BFF2EFADE4B19A5C488B2B08FCE8D9B2AC4838DA41182091820838ADA4 + BB8F5E36A2F124F3371F3258D55A620820300189CEE4CF0013F3750C0577FF00 + 12EC752F0E6A727847C5F0C9637DA583039B79D5D51978CB424EC1F2EE198C27 + 079DD935E7373E169B4B976C32437D0CCDF2ED6C6D0C7E420704FCD9E08C6E03 + 390483EBE1F171AF4E336D6BAA69E8D3EA99E366193CB0B524A8A6E29D9A92F7 + A2D746BCB66EC89FC55E09BCF025C42B7914CDA4DFC4268DE1C95F2B80C76B02 + 3701B8E33C647CDEBBD37C3C36FA1DADFDADD35E5A2B9DCECB87B77380372965 + E392095390517A6335E85FB35FC40D0743D62C3C17F14A396E7C25A949FBBD4A + DA4CCDA434A0913ABE39551B0ED0C70327041207AE7C63FD90B5DFD9FECAFACD + AC1750F0FEA9FBFD3B5385524B7B872598185F182ACA42946031F2118F9057CF + E3388BEAD898612BFBB37AC5FD99AEB67FCCB771F9EA8F5F07C33F58C34B1941 + 73456925F6A9CAD7D7FBAF5B3F2E8C3E00FED2926ABF0E2D3E19F8F96E2EBC37 + 25AA59E9125DC7E63DBA48584438FBD95958F27E5C005406DA7E47F18F8624D0 + F53B9D2E7669F6B48E42292AAEACF8E48076EC66381C93CB2A926BDA3C57A15C + 59780D9963F2B56B12C166446761170E303AB1037862B9E5979E99E47C49A79F + 117C3CD1A595766A1A4426DAE659D42C7392C6552C4B0C2EDDE8C47DE2D80CC1 + 98D6792D1A385AF52BD05CB1A92F792D94B57CC979F5F337CF2B57C5E1A961B1 + 0F9A54A2F95BDDC6E97237E5676ECAE78FDB42D285B58E18CDC1962657240652 + 01C8C91C0E5783C6467A035D87857E7D3B5285A4BA60163B9553195659110294 + 073950158B2E3391129C8E8398BCD2A38F5992196E9EE3CC601660328DF3E7E6 + 240600F3C9C11807A1C0EA347BABCD2BFB3EFAE1FCF8F4994B4B1BA03B90E178 + 2BC876F9873F3060092030AFADACEF1B23E3309EED4BBEFF00D7E1A9D2D846D7 + 5A5DADCC125D5C5F5C06561E616FB3C98577C827A06CED209298C804E36FB268 + 5AEC9ACFC37B38F75BB85565865CF12104A7CE482C132B18DD83F7C027EE91E6 + 765E0F53ABC9A6ACDBBED589EDE5953EE91BC3B2EE504E407DD8C85E8B95E6BB + 2F0C5E4CBE0FF266F2638ADDA4B860AB208D924F2A239C93C9519C16CB10E339 + 0A47C666DC95631B6AD3BEBE77FF00863F45C8E55284A5D138D9DBC9ABFF009F + 73AED424D33C4DF0F74FB8F312163A7C98C3C8ACCD23CAB975C17246E191C6D5 + 5CEDF946DF3AF89FE1B9A3BCB58DB4FB5B8BA9B4D8ED520DCA2650B000300FCC + DB865C1CE0231E80F1DEE87A2DCEB3F0EACF4F4B568F5AD46D9890C81A19A59C + 7EECC2577E33E6448412DFBC57C7DFC1EFBC7BF0027F1CF8F2DB58FB45D5FF00 + 876C74C6D5AD2E4C2E1AC2086636B0C12A480FCA2748AD98331E32E071C7CF50 + CC2960AB72CE5A5E5F86C95BFE1DD9D9743E9F139662330C3AA908EA942EF6D5 + D96B73E6AF8A7E159BC31A069BA3FDAAD6FAF2E63B7457B2DFB206302379071B + 54152C4B2852377392739EE7E377C156F83DE09D0F4BFEC99A1BC93CC906B52C + FB85F196D6D244488336D0B014B870C98690DD0C83F267E98F897F06F45D13E2 + 65BF8A34DB3D3E6BFD2FC21378B48D3AD849A79BC867B9F36E0B8C7EEA3D91BA + AE0F984C6814ABB0AABA9EB9E1AF8B49F0D7C03A0C1A2DA6ADE13D62F6FB51B9 + D62EA1D42CF4F49E3896395A75FDD4CAB301B460C5CC6B20D84839478AAA5654 + 2A508370BC9CFCB47BF92692F36FB96B84E9D09E229559AF6894630E8ECB96FB + D9BDF5B6D6BEC99E49FB30FEC757DF1D7C4363E0CBA58F4AD63C572C7ABBDCAC + 5865B58AD0DCC308553F2A6251238C9243C4AC124504FCEDE25D12EB4CF120B1 + BA79BED504ECA332844651331DACC9D30B1B31627801002A2BD5BC15FF000500 + F127C12F8CBE26F127836E0EAD632DECF0D84FA8068FF76CAE81DF39DB24A195 + CAB3280411D8D78AEB1A9DDF8AB52BCD5561B3896691E68FCB29F69753E64D92 + 305B009E480320AF25457D4E5586CD638DAB5716D2A528C5C527AA96BCDE6B4E + 55F23E3736C56515707468E5E9BA89B52D1EAAFA3BECD3D5AB6AAEEE7E837FC1 + 30F49F01EAFE36D5E4F105C68F368A746BA810CEF1F9935D6C89DA26FE16DA3C + C191DB2000179F877E28CB69A178C2FA1896CCB35CDCC4F3183E5BB05D8B3A82 + BB3664060492A46C04000679396CB52D0AFD2F66BCBFB5B585480B03EC604965 + 29F2ED392A1881D55594608201C4B8B992FAF21BEBF79A59242AC43E15A76076 + E572B83F313D7905483B6964FC30F099857C77B6735514572F44E37FBDBBEBE8 + 8CF3FE2CFADE068E09D1E574DBD6FA34EDAA5656FC743D0BE1F7C5D7F06431C4 + CD1C9A7CF3B4B20998C6CAA5D30AADDB2BCFCA4EDDD8C8385AFB66CFFE0A37E1 + 3D77F622D7FE15C9632C1BC4F6BA7897673BC4842820F1B0B30E9FC0307B9FCF + DD17C291EB5AA8F32EA18AD6DE34FDE0903B162101D9B400EA42F5009C86E48E + 4DAB78BED77AD059C6D78EECDE4456BBA4565C07CED56C06539C01D77B03467D + C2997669384EBA7CD4E4A69A76B34F46CE0CA78AB33CB69CA9D1519464B96CD5 + FA5B45BF537B53D1047601ACECA69A6B6C079558372176FC8CA413B941CAF42C + CBCF016B220F126A1E1EFF004AB559A3B989C4D29D98DA980D85D981804B9006 + 081B8AE09615A7199B446FB36E8ECE68862513862CAC5F19661B880A00049E57 + 6F524E6A1D70DBEAB62CAB77A6C902B2CD1AC24A85C753C13B01461F77F8B20B + 7233ED53B7C353DE47CFDABB95EDCAD7C9FE87A9FECCBFB755E7ECFF00E32B3D + 72E2C59B54D1668E6175E761648F7026165E8892465B69CED24212DC607AAFFC + 1477F6B5F00FED93E1AD03C55A6DBCB0EBB6112FDAE2961224B84DBB1D182FCA + 4E2346041651B4918DC6BE45D37C0DAB78C266B5D3B43BD964937B130DB929C7 + CAA0000EE38E48C924B0CE3923475EFD9B3C61A6DA7F694DE0FD7ED54848096B + 695485604646506E620107920753D4B57CF6278772659AD2CCF9FD9D785D2B4A + D74FECB57DBB763EB72FCF33AAB95D4C02A3ED29C95AFC8DB8EA9DD34BA3B6FB + E8715E25B9D3E7D596EA20DE6347FEB199BE72142A9C13919C365738FEEB3004 + 1EA3E1EF8A6D7E1DF89B6EE8648D6E432A93E5DB86539501F39E439DC32BD073 + 915CF6ADE15D474CB810CF14CE632CC77479F98282065815270D8C72176FD772 + 6A7E1DB8B2B16696EB6FDA22CC2D14BF3B81862BB48F3382D9C631C8C7072BF6 + 328D3AB4FD9B774D58F8FA4EB50ADED231B493BEBD0FB9BFE09A3F1C341D07E3 + 2D85F493473785E48E5D275489C4866B7B779408A47E08628086F94FC8072705 + 4D677FC1717F623B3F835F15EC3C79E1786187C3FE29FDD4CD12E2282EB2C401 + B7F89B6BE3191FBBE73BC67E1AF097C40D57C0BADFDB2C669ED6691C4537952E + FF003538CA9072A41C9CFBFA57D14BFF000527D5BE2D7ECFD2F803C78E750B08 + 770B7BA6667B8F2C1DCA8ED9DC4AB04E411B9500E4E6BF3CC570A66180E20A59 + E65B2E6A6D725485F5717D5746E2F5F43EFF000BC559766792CF28CC9B84D26E + 0ED78F32B35E71BEB7E966FADADF38CFAA4B721A498FD9E7842302C142B263E4 + C0C7A36723390FEE6AD7863C2B75E21D5648F4B63FDAB06E9042B20DEE31FF00 + 2CF39258F180327F1A6F8865B3D5EF5D8C8AB2383E6286DAA76B7CAC30A3EF2E + 5CB6D5196CE724838F696DFD9FADEC91A44856450EA25DAE841E48DC0739071D + 0FD38AFD3ACDC7DDD1FDE7E66E51535ED3DE5E4EC7756092149B49BA5B8B4D5E + DF719A0757FF0059904EE5D8486DAB9CB642AA755E03737E2BF0D4D0790D35BA + 42B30678662CA8A790086E0018DBB79C0049CE062AD6B1E216F1788A1BCB88EE + 350F2C470DCCD80F22F3C48E4852C339DC72495C6E3F2EDD6D3B5C6F127848D8 + EB8249A5BAC4705C3A3B490B619B71207218953C0E464962735CCB9E1697DEBF + CBC8EB7ECEA5E1E5A3FD1F99C0C5AA49653B19A256CC84B44E0ECEEBB4F391C6 + E1C9040E86B52D34483506F2E19249AE18B8C4A028230480AFCF272FE8015239 + 271587A8DAC8AAADB15500C3323EE5623B939EBCE31C7AF7A7585DAC6CBE6B16 + 85410D1925449C67181D391D7D706BBDC6EAE8F214ECED246B5FF862EAD19310 + 8DACC8861138676DCBB9369C73C71C0EA3E95CFDCDB790F8C9F7E3A1F435D359 + 5C4F1DA48DB5644584AB79A02908EF83905B00658303C0070C304126ADB18EFE + F516E17C98E40B04A6320E08DC0305C8CE300119C1E7905B226326B7349534EC + 918861611EEDADE5AB10083B8020679EDFFEB3D6A2C945CEE5F9BE6E80E304FF + 009C568EA7E1F9AC2FEE2DCB67ECAFE5C854975033F78103EEF7CF1D6AB69D03 + 25E46AC8DFBC23394CE46EE71DFB638FA56CA5A5CE6941A7664689B60594F964 + 12460F723F0E9C8FC8D176B1F98CD1C788D892B939E0E71F97F4A9F52D3A5B19 + B6798AAAC72AA1FD40FC3F3C1F6A8A22D3C689EC71918C9E78FCF1D7B9ED9269 + 6FA83D34642A92065501BE6391C75EDFE3448BB7701F32A9C640EBFE7148E433 + 60617D4FA9A425906DF5E6A8CCF4CD4A78CC92346ED69E6294D92267CC1C0280 + F1DB041E71F2F23AD63DD69533796B24AAAAA3685693FD51231C8E4A60B01CF3 + 8C6323045ED42FE3B98A592CE591CB44A591BEF1180A49E01E72070703A67818 + C56B9DD13472470F98ADB49C70482738E0939F5C9E47A9AF368C5A5A1F518CC4 + 29BD7506D3AD52DC159A1DB921548CB221E85B90A7390719CF0D9000A996F808 + 7CA4119994BB1F2A24276804F6049C60939E718240F98D55B575BD7F9A3332C4 + 9CC61F0CA460000E091D73F81C67147D8E6BE68D36DAA49B8E106C8D70C0EDC9 + 27D41CE7A0FC2B7E5FE638635249FEECD6B6F1DEAC6C9615BE92CD1632A61887 + EEDF3C6E39520672A32383C74C53BFB5586A0B75777524D38606576C37DDCE7D + C292586546719AA3A6E872DF23B35D476C5570472FF3E07A0200E0927D33E840 + DAFF00846ECACAD9267F11692CEBBBCD8A28AE9988C6376EF25976F5C90C4647 + 201158CA504ECBF23AA9C6AB5CD37F7BB7E6CE83C13F19EC740D5BCED5B49B9B + EBE6388EFED751C797F3000E1E397CCC0E31BC02B91C1C63E84F017C79F11789 + 6DA38743F106B9AD5F3B4BBB46B3D4AEE378C85626411AAAC4514E48542C02AF + CC02EE07E71F08685A6F89B568EDE6D4B4C48B60092BA3ED62BF2A2B29191BC8 + 41D39539E00C57D05FB387ECA9E1D9923BCF1E78A7C41E0DB68E5F3EC10E9025 + 794797CCD047232BED50B8DEA9C32ED3F3614FC8F11C32F85275B131775D3965 + 2FB924DFDC7DF70AE23349545470F34E2F5F8A31B35D6FB37DAF7BF43CE7C61E + 13D4BC5162DE25D53C397FAB471A4D0EA3AAD9DD2FD9D6795775B972B1ED84C6 + 76A32C9FEB5636C18F3BD767C01A2B788A38ADB4FF0009F87B48855D2E19F512 + D218E3672CB3169A4C7959213780158468B966791A4F68FDA1FE1E2FC09BB9B5 + 1F871E2FF1878EEE35464D4357B6BBD2DADDA386768F133152648BCC32C28197 + 69632019F9B0DE55A97C14D4FC752B2DC68F3F879AE0CA9B75778ECBC9986E0E + 6392E1E37DBE606520962AC1BEF30AE0C1E694B15845520F961D1BE64D79384A + CFD3A5B63E9A9E5753098D7CF0756564E51F775BEB7E6516F5EA9EB7DEEF51DA + 87ECE569AFC434ED2F5CF0DEADA9C7E58834CD3750713CD2EE553E589F0AD230 + 2A31016626350131C9FD2AFF00824DDC43F15FF643F117C19F8916BE659E8D22 + DF592EA081AFB4886587680AC7E5785711B02A48E0F5CAB37C0BF0174CB1F0C7 + 8DF4FF0005FC5AD06DEEBC1FAA47BB4FD5E28DBED1A3C8C85F7C727FCB4B6660 + 032B72BBF7280C39FD22D53F651D73F668B586EF41D623D59AEFC3FF00DA369A + 96EDF6F716E88E375ACBB8BDC46AAD0B3C7282F1C523126454263FCC7C46C62C + 4E1A194D59DA726A74A7A5AF1EB192D9AFB516935DDAD4FABC972CCBEB57789A + 6BD8CDE8E17774D59ECD6EBA3E66A49B5CAB5B7E5C7EDC027F83DF17756F0FC2 + AF6B3786AEDADE096DC956BE80B48633E60CF27E66EBB8AAB6E21715E13A2EBC + 7C39ADF98A1752D16F0B712C6551F7FDE8C8397F9979EFCB6572724FAF7C70B0 + D635A8EE2D7C5107D975CD3E7B88248A780ADC23B8FB98607E56DACBB5F0CBB4 + FCA7803C6C5B34575750C88F706E1CC320556636F27DE546DDC332BF6C9C84E7 + 3D47ECDC3F4D47010A552D2924949AD9BD355EBBFF0048FC5B8865525984AA46 + EA2DDD26B55FDD6BF07E972E7832CF47D73C59742EEDFED091ACEE4BCA618E18 + B66564121551F781E9B7963E82AB47A54310BFF3BCBFB3CBE595D9857C989CC6 + 0A8450DC800600243F1C93892F7429ADAD2058BECEB744889E53297FB5472464 + AB7CA33CA92029E70BCE09615ADAC4516A776B1D9DAA59C9E579A96D117912D5 + 94AE0A3A1DBB8BABB670305C0EA457AD2A894AE9E8FF000B7F9FFC39E453C3CA + 51B496A9FA5EFF00E5FF000C769E0665D5F47D12F976CB790ABD8DCBBBB8DB10 + 05728392C497FBE49C82E33DEBD6BE0E7851A78BC49A05BDE59DB6A9AA4113C5 + 6D248375D461F98E1560D9983221527231E6A67E650DE7FF00087459E6D1ED6E + D1ADD1751B331BE642161BA5DA4A9E0EE0FE5EECE4633283DABE9EF861E199B5 + 5D46D75E86F175092E349D888F68D717168D6E62754D8F80DB21B799A360CA57 + CB44CAEE2A7F35E24CC7D8F3422F4E9EA9DD27A5ADBAE87EC3C1F93AC43855A9 + 1BA8A4E5FE1B5A4D75DACF6767BE899A9F05BC1B633FFC20FE1BD42F2E048DA9 + 692FA58D4629BEC96315DC24BB8938036CB72D70D090BB3C920804865BDA05A6 + A5E24F871A7D9EADF2CDAF68F73E19F0CA4E4A4897B73BECE72DFBB1B9A3920B + 8588150FBE4897FD6B6EAF5BF879F01ECFE227823C6F6F3ADAE95E2EF0978226 + D52DA18D4092F223777372278CEEC3045BB75E0E36DCC2C4FC81CEFEBBF07EF7 + F684F821FB2BC3A5E9775A7F8963065D60DAC6E194416F0DDB5C63921A68FCB9 + 58B73E633F182057E595B3CC3FB6E6A8EDEF2BB76F77DC94EEBA72CAD6BF9B4F + 57A7DC621C9496122F4E57076D15959C5CBAA696CD6CD6F73C33C4BF0D3FE105 + F88D7FE07D42F9ECFF00E16EBC36CF7B2BAC66013AA1B78CFF0000F2EF9CC930 + 4015961DBF2090EDF12FDBCFE1AEAFF027EC7A086D4ED75EF1169D6D1EB89B8B + 5C335B17B53013B89C3B4424000054BAED242853FA19F1F7F639F157ED87F1FB + C4DF1016CE1B7D2FC23E1E8ED6D9377EE66D626B60D2301803F72ED248426E21 + 9631F3600AE3FE317ECA1AC78B3E2B78CBF68AF1A2C67C31E1231DB784ACAED3 + 68F11DEC2BE45B5C347D4C71CC6E252490A7E43CAEEAE9C9F8E70946A52AB52A + 26ED79416AE551D9420BBB7EEDFA2E5BBB59B3C9CC3030AD879D28A5194E518D + F997341349DB7D6FCD27B5ECAFB5CFC88F897E0C9BC23BF47BA86C6C354B35FF + 004B516E545A5C385722498E08755DC36FF0F19C9C0ABBF04FE19CDE3BD2B58F + 175EBB59F85340585750D44A2B99262001046486CC8C18F0BC00070A42E3DFBC + 3FFB2A5BFED35F1CFC3BE1AD2E69163D7F56B8BBD4B5AD42166B6B78FE469656 + 5049DB1AA019006F63C056562B43FE0A31F143C3373369FF000BFE16B4C7E13F + 8327DB0DC496496E7C4FA82FEEE6BE270412599C2FCC70A18610600FD9297113 + C454A596E1D37524B9A726B4846F6BFF008A4D3504F54AEDEDAFE5788C8FEAD5 + 6AE2EB27C91D211D7DF974575A5A374E56DEDA1F2778A62F36F679E27F262B99 + 0C62CD6E5B11E49DA09DC46E5642D8048CE3A9245751F027F674F10FED0DF10A + 3F0B784F4F9354D461CB4A608CBC368A10EEDD80A72486048C01F30E76823AEF + D913F620F177ED99F1C23F07F85FECBA5D85AC6B3EADAF5CC4CB63A2DA008AF3 + C81390E5951123CB49239C01D4A7E977C65BEF80BFF04E7F81D67F0AFE1878A3 + C43AEEBB7512C5E257D0EDE2875EF104A729BAE6ED91D6CE22E40489448F8040 + 4571E61CF8B38E2196D486559747DAE2AA2BA4936A11FE7A8D6CADB276BBDDA5 + A9E3F0EF0DBC7E23DB632F1A29B4DD9EAFF95349A4DFF925D5AF827E24FC2FF8 + 77F02A09345BA9A4F166B36045B5C436370B1DB24836AB2CF767059B2AA19200 + 9852B8994E41F3E77F14F89EC9AD74743A0E96D2622D3349B016914C8BFDE203 + 49361470F23BB8058B1E08AF77F895A5EA1E1236B78BE1BD07C076B7E50C22DA + 132EA02256CB3C9753079F9F9CE10AAB6EDB843B6A8FC0EF02EB9F1E62BA5F0A + EB1E1DF0A786747411EA9E25F136AB06990B0DAD20489E520BB8652C40562776 + EDA0633C785CE1C309F59AAF992D5CA6D349FA24D277D128F337B5D9F718FE1F + A74F11EC657A6ADA4631E5935BEADBBDAD66DCAC96F6479FFC22FD813C67F11C + CF6BA1699ABEAD343B85D490C40DAC4C5F03748C15372EE0594B1395C923201E + EBC5BFB07F88BE1369374BAD43A3E98CB08F36EDB54B69E562E3E72E8B26482F + C8DC0E492181C6FAA5F19BC37E11F862DA7DA69FF1113C64D09185B2667B38DB + 396086550CE18331DC33D8E064D7CDD7D1C37DAF4C2CE4B368EFB885D9D20552 + 7612A46000D83BCA97C0F5272077E0A599E64FDB46BA8D3DECE94937AF9CA3FF + 00A4BF99C99853C9B28E5A4F0DCF3B7FCFD5A5D5D3BC632FD3E57D3A2D7CDF59 + F8A2648750B2BC2B024B12C4AE924926CE7E5072B97D99D9C10A9C1C926C691F + B6378E3E190B7FECDF186BFA7DC4C195C4173BE143B94F2BC2300BC60818C0E3 + 3CD79E6B2D736B235C416F73F67651FBDE6313165DA1B732E4138200E461B1F3 + 02D591A5C3F6ABC492FAE92D597251E485B71906318C637364E0E7046320E719 + FB0FECBC3D68258A8A9AF38A7F86A8F81AB9E6328D46F0539536DF493565A75B + ADBD4F7D97F6EEBDF1FE971D9FC42F0AF853C4D14BC36A5696BF62BE8D882B9D + F01085BEF1C6DE010739073CB6A1ADF83B5DD5FED9A3FDA6D2386532456CE616 + 6818A91C1406370487C8C1C2AE42E0D792C8ABA7DEA85FB5B2CA42AEE410B38C + E321793D791CF4C81D4E2CDB6B725B6E9943B4672199785667E31BB862429201 + C6496627B8314720C2D0BBC2A704FA26F97FF01D97C9235ADC658FC54553C7B8 + D5B7DA94539FFE06AD26BD5BF235FC47E1CB6B5BC759CDB95DE88198EC914F21 + 31B4326D2BF32E07DDC1E0609E5754D0869F0ACCB711DD5BB1FF00964FF3A039 + C654F38393CFD3A6413B77DAC1D3A58E248D1AD5A1127921DA312272C09CE41C + 1EF9E0818E40C558EE434CB2279E8155DE36810348231CE78C2F4F94923A1030 + 3BFAD4B9A28F9BAF2A53934A36FEBF1FEB631EE74D6B59247762F1630DB43000 + 9E9F7803DC1C9F7A9ECECBEDB0AE579EB1AC8E7A6707240CE36FD0739E3807B5 + D3BC3F0F8DC182CE355D489540A02AC739C9CFCF900BFCA000301B819DC497E5 + AFAD7FB2EDA485A6F261050DCC0F857DC1D89503A6410DC1E3907038AA8D6527 + CBD5057C0BA515516B17D7CFFE07628DADAB4691FDA3CB8D59DE37695B2533FC + 24632318E08EE4E0F5C6A5D5F2EA506DDF70DF3ABDBBCA4330E0650125491903 + 1803A10318E67D2EE66B5D40F9CE9E5B80CF98079678FBD838CFDD7F4EDD0F15 + 9DAA4126833BA499DEA72CB21FC8F1D41E79C76183CD5735DEBB98C29D969B11 + 5E4F26A68FF6A959D6663B582E70C09EA077E7FC3AE465EA36AF6173245CBAE1 + 589CF073D0FEBF866B6EFE38E4759D6366B6500B67059170A1B9C7FB4B83D395 + C73C53FC59043246B209966F2D86F9301588650CABB7B1033C8C82727249AA8D + 477B13530EACDA6655AEA78824593866DBB5CAEE5700818F5E06E391C9356AD0 + B40595D97C947DEE8D1EEDA3E656CEDCE095C1F438C823033936EB182ABE62AE + E1B496070B9CF248CF4EBC558875566668D632B1B3398C8CB3A038E878DD8C63 + 078E4F4CE6B468E58D4B3D4DA91FFB6B488668E48DA4B783CAB8600E648C12AB + BB69C9D8801E8381CF45CE4EBBA6CBA2DC346DB65507EF8F981EE083D0865DAC + 3A8208ABDA16A0BA5EA323C6ACD6AF206765556654C1C81D46ED8CDCE78C67B6 + 6ABEA90ECD5D6C659A310AB790F26E76C286C06F9802001838C0E3B0E9511BA9 + 58DA4D4A3AEFFD7E65868D75BD1D36B45F6A8C64FCFB8C8723180060640C7201 + E1467AD73728C39C723DAAD38FB049246CABB9728719CF51C83D3FCF4A734909 + B3586351E66F6DCC32778C0DA3F307EB9ED5715639EA4AFBEE51EBD29C780436 + 7767B8A723A842A7D476A595BCF390AABEC0FF0089AD0CBA1D6FD924F326F397 + 16BF784D21F90E032A93820F2738CF5F9B1D0E61B575B268E52637F94AB796C0 + F18DB93C646771C1001E9C8CF1207B8D6ADFED578649E6DA02C9B3E5DAB80BB3 + 046EC640E08C0500020556B75B8CB35BBB431F9843499F9739CAA67A330CF73D + C74519AE3B3D99EC4AAA6F996C45711B5BC4F347E6346CD80C832A8DD586EC1C + 738C607233CF632E9E63606393742AC39631EE78D8A8078DC383D3F1E7900D4B + 6B671DC6F92420F9D16F0B26E6DEC72C18741DC8C76DF91B8E01E8B44F07DC38 + DDB7ECAACDBA36E1A4C16E1940FDE7523E618E841181F2952AC62BDE1D0C3CAA + 4AF15A18561299E430C31FDA2054F3A28CC6E1A263FC4BB4EEE0A8EA48E7A671 + 5D1E9DE03D606AB35AC9A7DECD34927C91A593CE242DF29CB0E195700E09C640 + 3D724F63A2F866CE566B5592EA6452102AC7BD9803B8AB0C31CFDE5DAC0023E6 + C805ABB1B5F8791DC24D70DA4DE4826431CCA26755452724617695077E0332F1 + 90C30338F0F159BC69E88FA4C0E46EA2BB77D7FAEE79EBFC3FBCF0EB470DFE8B + 35A4703150268258448CB81BF95049230485C1181D0935D77C2BF04788347F1F + 68F368F69049AA6BB281611A08E68678C86C33A3068B77CB92B22371FC2A704F + 4169FB3BB4965717CBA44924321DBE747732F00AE18A0650A4EFC7CA4EDE40E3 + 15D0785740D5F4086F9B49D5352D2E1B17F3278A1D7278D132C1555A39700B01 + C280B9E10AFDDDC3C5C4E6D1A909284937B6BB7CECD9F5185C95519C1CE2D6B7 + D1D9FCB449FF005A1EAFAC7ECDEFE18F0227887C6BE0DF04DF691636A4EACF65 + E3287CF9558044B88A386512432AEF398C318A42400918F95BCFFC1B610E87A8 + 1BDF86FE15D17C48B2813AADDC136A17F6E7AAF9D02B2C4DB4E70CA986F30EF0 + C482BEBBF023E1AF88BC7BE15D21A482CE3B4F31350D1E63E285D1D6E278D9D4 + CE222C1A57E1944B008CA6C006E2ACA1FA0E8973A778CE7B7F877A1F8D75EB9D + 31C33E89AD6B57DA858CA40D9B6DAE2DBCB8FCA263DA0B05384203B05D87E0F0 + F9A497B4C3D5A8A525D136A097F79393B7ABB2D93D123F498E0FD9D4A789A709 + 538BFB5A7B4BDAFA691BFE6F74D5DA3A2FD92BC657DFB5278CEDFC0FE235F0CD + BEBCB3EDFF00847F5CF0D5AD9DAEA41B29BADE58922921982B0C472974393F33 + 1F92BE9EFDBA2D7C7DF03BF655F0CF839AC7529ECF47D7E2B2B3D512647B9D22 + E97023F32474C48AA59518BC6BB925F9BE56463E67F0DFE25EAFF12FE20699A0 + FC6CF01E8BE07B791560D3F597F0FE34D8C30E545E23F996D2FA199A54621785 + 2303E9BFF8285E8FF11FC37268A249B4DD7B49874992C359BF3E5DC2DCDAED29 + 13DEDA1015D24124891DCAB2AC64C996456764FCBB3DC77367F86A4E30E4BB92 + 8DD38DD2DE33564EF7B5B74EC9B7748FA4C3E3BF7B4A9D5945B6DEB28C94EE92 + 49F64D5F5D3ADD5D6DF95FF173C4571FB4378A566D6347B6D2759B08058DDFD9 + E1F252ED0208A395180DAAC812361C004B1197DD83E63E22FD9EF517B26D43CB + 5B36855412007255812A4156272CB8207A9CF23247AF5C4BE11F10DDEA77162B + 3D9C9613C718B3BB1F34A0B1561B4E7023054704F0DC8FBB5ECDF09FC136F2FD + 99AF6DE09AC6F156291422CF1BC7D881C8C8C7420FCA00391C57E975788A795D + 34A9C5C63D13E9B68BF4FB8F5A9F86B86E21854C452AD1725D93BBB69D158FCF + 7D47C3E2DE69B48BE175E62B3369CED1233EE0C18C4146376F071B4F3B873C35 + 55D340B7BCB1BA8D9A0335C1DA0C642C29952A482A4804F63CE0640CE51BEC2F + DB27F62D5F04EBF2CDA64361F65B510B24F6F1F9914D114F303670402DF74923 + EF765E0D78BFC46F85935C49F6EB1D3ED6CE3D3ED55679A25599A610901DE685 + 98F93349B54927E467662990F91F6796714613194615212D24B5BF47E9E7DB5B + 5BD4FC4B36E09C7602BCA0D3972D9A693F7A3BDD7A7776D1F9245BF8736771E2 + EBB863D3F499AE6D6DC34B2436E88D30508CD21418C4AEAAAEE039C92801EA4B + 7D83FB2CFC30BAF14EA8DA6E98D776B737174B756CF14A49B95608AB2C5218F7 + 3446E37201BC6C6B94249DA6BE67FD9EF496BED0F5382E12DACCC8A86CB5208D + BACA6899AE08731FCCCCFBC65B1B82AF43B307E88FD89F47F154B6DA3DAF87EF + 2EACBC53A6DAEFD2A6476F2D6750AD6D1823236C8D8058A856202F25C01F9E71 + A623F715630928F2F7DB557BBF467E95C1B4674A9BACEE9B8369F44EEBDD9764 + D1F6E7C07F0341F19F44D27C79790C7E18934DF86B7BA06BEAA86081E6B32209 + 9D5011B374293653F876B8EDCFAA37ED17E17F853E36D261F0C68B17F6069FA2 + 4702EA25B98A1469F722AA92773ADADBA678077900838CF0FF00127E291F0FF8 + 2FC310E991CF617DAB4EDABCD0AC222B699757C898B2918FDDBB3F0A7E52E57D + 08F91BED0740D5F425D46F2EAE2E2E34EB88BCB506381E59E67F294C436A98D8 + 2B74C062983BB1B47F3EE0727966CE75F12DA82BA8C75692BBF3D6CAD6BE9676 + B6E7AB97F0F2CC249E2EFECF58A8A6F6BB576F797471E895D3573D47E20FFC14 + AB5BF08FC00F1BDBDE5FE929AC5AAB699A3471C224B68EEE6679EE2ED59B05BC + B4689371C9CEFE407C57C17F1C3FE0A51E3DF8A0D0787754F116A5A9693E1DB1 + 95963B9458A327A34A2345011B6AA469F303C9F997EFD7AA78FF00E1DDDC7F08 + F559246B8B7BAB193646863DDBCBAAB2E1B1C9050303FF004CC019200AF8A7C4 + D0AC1A3C91DBB2CC2EAEC318248FCC919958042CDB4968CEE24280C018570B86 + C57EF9C0DC3192BE7AAA9465252DECB46D747D34FCCF03C4AC2E2725C7BA184B + 42FEF3E5B6AFBADBE2D1F7D5AEACEDBC7BF1E356F0569D7B226B17965AB78A2D + 9EDA5F2D8C72E9B62CA1C5B46C23561232E095560A40525640428F11F0EF8475 + EF8BFE3F86C74FB378E4910ABCAB948B4F552387DA081B518020124B38C00491 + 5DAF8AFC0BFDAB1AC97106BD75A8DB0FB3EA534E8CB325CAE234458D72DE66F3 + B09C6419010B80D8F4BF0FF86AFB4B31E996ACB717D72EB1490DBA1914160C42 + EEDC774519978233B999CE554328FD3A188C3E5D41BA315CF2BDDB565A7A744A + D64FA5BB9F98CB038ACD717155E52F671B689B6F5D5FCDBDDAEB7EA91EB3F0E7 + E24EA5F0D3E0D69BF0BFE15CF73A4DC6A83CDD635B82355BAB99D9719F30636B + 053B14F0150154C0CB3745E18F0C7857F657F0E4DE20F1032EBBAC5BB1FB2AC8 + D833DC0566DC0B13C7CCC0B91D59860019AE97E0F7C3BD37E10F8126B8665B9D + 426329BFD4625E448DF318611C31FBAA3B2E3192475F9BFF00683F1EB78AFC43 + 0ED6493C976081A65921B51C315208CFCDB7891B904B007AE7F2AC2D2FED3C65 + 4C3D16D5272BD492F8AA3F37BDBA25D1743F74C67B1E1DCBE38AAD14F13CB682 + FB3495BA2D9CBAB7BB7D4E13E3078FF56F8D3F1066D5B584BABCB898161676D2 + 95B5B140A4024AFEF015F9DF0A091C6186DAF4DD1FE2F7C25F87FF00052C741F + 0D7C38F1078E3C5CD12C777AEEA77B15AD84170773C91DB5A2EE3B118604934F + 92467CB00B579DF877C2DFDBFA47D9E3B1322C85A59F4EF2C46B3E4E144CDC28 + 8D14293B98E327E78C002B3756D09AC21925BC669631208EDEE2181DADA59C46 + A5D2DE3755DEE498009381B012770DAC7F45A983C257843097718536AD18C9C5 + 69A2BF2B4DAF2BD9F5E6E9F8BC71D8A962658C4EF39EF26937E77BAFC1ECFA2E + BE77E29D54E9DAA4DA85BC30E9B0659D521665321FBA42A2E7774DDCE178EA0E + 41E66F2E95F495FB1DAC76B04312ACE225DEB70CA3971B8B2965738CF4030172 + 300741E24916DB4FDBA8346CDB372ED65DFD416CE48EC33BD48CF0406DB458D8 + 6A7ACE90B258697A85BDAC974CA27F27ED52615403E5A6634C67E5DC5893B9BE + EE4AD7DA50928D34DFDEDE9FF04F91C6538C2A4A327AB57E5B26D79F68F4FE91 + C1AC0B1CD7093431DC4ABB14C51C6CA0A02BF779DD9381DB9279E00359F73657 + 2F76FF00BC9A79A4DDF6732C78DB1825413938008C8C0C8C8C64F7E9AFF4FBDD + 1EE55EE24BAB18DA385195A631B8CA9249543FDE018E481F77F0AF6BE1D8B585 + 0B73790D9C3BBFD75CA4DB9CF21DC60139C942460E3BE3014FB11A914B9BA7DE + 7C8D5A739CB91E8EFE9F7FFC13020B8B94BDF2E36B82AA0467C893CC590AAE73 + 91818E871E8B9246322196681A76566B868F1B9774780EBD4E4923E80E3A6781 + 9C0D9F12F8452CBCC75BB8EFA485E343E5C4E8A8B90BC87505486F94AE010411 + CF5ACBD293789BE6FF004C8DB6819D84FCC9F748231863DF8C63D0E368CD4A3C + C8E49529467C92FEBEE18599648580F2D4818642133F3AE304E47DE5CF520609 + 1D0D422D4583EEB912C724670B1852B9208DD923D39E41EABF4A79BCFBCC57CC + 62DE5E013B4AF20AFD39C8C7A1073D4B4E9FFDA533ADBCD1A8854878FCD2A0F2 + 000371CE08DA33DBBF02AD799949A7B6A5987536B5BE65FB3F9B23ED91A50C63 + 69141DD9076820E72370E491DF241F41BD861F8BBE1CB8D696323C63E1DB7173 + AADBA80ABAADA2939B94C9CB4F12946948FBC87CC2B98E576F37860BA8A50BFB + FDCC198B742A9B7191B8827E5208E9EFED6FC1BE2AD53E1A78F74FD73492CB71 + A6CDF68883212B38C90C92293F346D86475390C0B039C9CF36228392E6A5F1AD + BCFC9F93DBEE7D0F4B038D549BA55F5A72F89755DA4BFBD1BDD77D56CD9D76A9 + A2FF0061DBE9BAEC36EB7BA1EA00C0FB613E592AAB98A4CAEE564F95B2776176 + 95E41355BE22F84E7FB2B5FC71B8B652D2ABE3F7A223F7723A8C723E62070460 + 1C67B6F8B5A3C5E187B3B9F0FC0F3F833C796CBAAD9DB9DF29806E21EDD828FF + 00596F30788B13B9810C78635CFF0081E592F34B4D1F5A86492D6712DA79DE41 + F2E12C15636078C80771F973D49C93803CDA38994E9C7111DBF1B766BF993BA7 + E87A78FC0AA35E5849EFDD6D7D2CD3FE592B497933CC6DEFE0B227E449143315 + 1D5B07201041E1C6723F84633835B2B62B7104D66D234C971E5B4122480F0300 + 02339C67036F38CF19C0CE26A3A3DCC1AC7D9DBCCC47214DD2218F85661B8E78 + 1F75B3CF556FAD6FF82755846A496B248D0EFD8F2CA32CC07DD3B76E0E407603 + B85C8E7A37B552DCBCD13E730F773E4975D3F4394BCB29ACD9331C8BBD43AEE5 + EA3AE7DC7BFA536CD1AE0B46ACDF3005BA9527DFF3EBFE35DA78BB47B2D5CB43 + 6B71343716419561998B000052A80B615403BC0E4E72BD73C7171623983168DB + 71C95C718EF9E9F95553A8A71B98D6A2E9CEDD07DADDB46447E67951EE52780C + 037F7BF31D476CFAE0EAF880AC69B657DD2208D0EC6070AAA703B7523D38FA11 + 9C6965DB70AC01640FB94B0E48EBC8391EE7AFE22AEBCBE75AFCCEC42807693F + 331EA4E39C83EA7D7A76AA6B52232D2C36F97CDD5265DFE7AC2EC88EA400D827 + 9EBD09E7BD514658A76F97E40490A5B3F4FAFF005F6A92EE4C5D48CA3EEB11BB + 3F87D307D3F5A6A40F3453346CDB23C17EBCE4E07F938AA5A10EF26428446DC8 + DD4E8CE4B6EC743DBDA9D0C6B2363E666E303D4FA77A119776EC2B0507861F5C + 7D6A893B42FA6E94BBAD55351BB781904B3C412141FDE48D73BB03764B63B71E + B1CF6F242E1EFA777796312AA970546705B82081861CE464FA1C9A34EB3B8D44 + 7EFE5096F112A2EAED0EC8F674C6EE491BB9550480D9C0C56FF84BC1D71E35F1 + 25B58E91637125F497021474899CCA038612275C613E625C303DB24907CFA952 + 34D3949E8B77FD6C8F7A951751A8C15DBD92EAFF0057F32878674CBCD6E4B158 + 225B7F32460EF18263444C67956E32BB812083F272706BD83C11F04AEA0FB3A4 + D7524F1B1599F7EEF2892360063DC3E65C820B923079C0622BDB7E067EC64B69 + A6DC6BDE2287EC9656BE58B8D8C11EE261BD4051CE4B101B68CEDCB71C151D2C + 3A1697A0799A86AB736FA36970A192DE38A1225F2880BB123C8118397CB3328C + 02327E62FF009BE69C694EAD4950C1EB6D1DB5BBECBBB3F56C93C3FAD4A8C713 + 8DD39B549E9A2EAFB2F5EBA1C1F853C0525AD843F63B75B78E3CBBEC431AED25 + 792FC3AEE51D49238C92CDCB7636FF0006F5CD13488E5B96B58ED9CAB35C33B2 + E470A5433601E83F889385FA1C2F17FED63A7F8774C9E1F0DDAE936770BBFC9B + A96159AE47CA17CC5DCA555B395263443904063815E3FF00107E357893C75753 + 4D336A16D1ED1306D4AECCD2331DDBB6B4920930B8C000918563C9009F230F97 + E678C7CF24A9C7FBDABFEBFA67B588CC326C02E48B7567FDDD12F9EA7A87C42F + 0D69FA6362E35855B852F0AAABBAAC6A9FEB1186DDA738CED0DD50900679E175 + 9D02D747D4FF00D16F96DE5B576746B3990950EAC01DC1D76F50013C7DD01725 + 42F0B3DC25AEA42E26D4DADE77C15BC24CF3DD020E7647850FC00B8C0ED953C5 + 5CD1E75D3EE63DB67AC6A690DBE10C53C51386002850A0B800EE7201E305C8CF + 247D261F2B9D08A4EA5FE563E5F159B431336D52515EAD9F407C2DB15B8F135A + CB71F10FC3FAA5BDE43BE7BCD50FDA3EC99432340CB385999F90A7ECD818180F + 8DB8F739F42F0FD8E91A449A1787743D6E4B87F320B8B4F0FCF657BA52EE509E + 49696E526DEC18A24F1C8CCCCFE5804115F236856F025E5B48BA2DCCB6B85880 + B8B8F91D40DE2360AAAD92C181C80DDF7026BD63E1CFC5ED1FE1C457B75FF08C + AB8D4A2F2A38C5F490D80899373A18DD8175230BB647E09191919AF8CCEF2FAC + E5ED294A4EDD172A4F7DDAB5BFE06DBDFEEF21C6D1F67ECEA4631EAA4DCDB5E8 + BF2EC7DD9F0664F8C5A8E9FF006CD43E33786EFB44D35C452F85BC4B732F8721 + 55042B44AA62B76327F0E4C320257E604F03DC3F6A1F00F867E20FC0BF0CEBF2 + DCF8B7C22FE1FDF60F636D3C3730DB995576A2C90AB1F2D9C602C24AB6FD9240 + C315F0EFC33F1C7867E2CF8B11359D15B5592EE3334165AA22DDA4916C53BE11 + F685551C190ED91708E0E1C8DA3EB8FD9A7F6B2D37C1DAFAF853C0FF000F3C6D + 67E1996164D4AD6C35A1AA5BCC1B8DF1DACEC0440EDE0C1212C73C13B947E1FC + 4785C552C4C71546369D3D6C9422B95EE9BD9B7AD9F236DF5EFF004F5F035E31 + 857C2FBD152BDE2DC53D1F326DDD36F5B595D6CECAEDFE79F8ABE0E7D962961D + 66E34892D6D2FAE2DD75ED3C069ED5C0FF005171086574F94BAA80A361738C80 + 00EC3E077C3EBCD1EC6032F93F61B85D9282C81613862AC09DD85C9507A6E2E3 + 382A76FD75FB607EC756B6106A1AE422C7501AE3302D71A25D69173A7B37DD13 + C007DD0140F994A3796841EF58BF02BE1669BE288A1B36DD24F09FB2DC2DBBB3 + FDA18654B8DB14AA721BE4CAE01006028247D06238C28E372DF6907EAADB3F4E + 9F72F2491FA070AD4A5420F33A4DF2455D357BDFB3BA4ECBCCE4A4F867A8F88E + C22D2E45B759ADC9B778AEE16024CB3EFC1C153B4EC04641073C1AE3BC71FB32 + 5EF87355B7BD7D3ACE1BD9C9B1D42216E1AD5ADC22411C6D264B888A170501C0 + 31C4D8F9415FB30F82749F0BE90DF6ABBB5B65BE80DCAD943A5ADCC36D74A3FD + 1AED23919FC967CA248A8EC8720F28548EE3C49E24FF0085BDA3E9D6BA7C9E0B + BED4A589DDE79F418A3BCF35199044084237B15C840776D75E1FE623E068715D + 4A32BD2F875BE8F5D35ECBF5BA3A71DC6DED6709CE829D2BBBC9A7171D3752E5 + 764F5BABF45AB4EC7E59E89F059F42B3D26E7CCB6B7FF847E6756D3A4806DD51 + E4B8C484B72182C2426D7E8A9C6DDEC0FA47C07F12EAFE0CD7F4DB1D07536B0F + 125A4B2C565A8D8B30F3E3DCA5554B0DDB77FCFB5C0FB88700E2BD2BE24F81A1 + F0FF00C4BB8D1EFECFEC2D70EAE228C06FB2CC7E5213B32E4E01CE307A86C9AE + 07E3BFC313F0D75AD2EEED585D5A22A98DF7EF12AE3383C023A153C0C00338E9 + 5F612CDFFB422A957DE49B5B5BAFDFBBDFBF91F6B95E4794D4E5A38756F6D1D1 + 3B38CB45FAA3E88F8FAF73E31D5F4DD266323C9A869B12BA4B00F32D4AB83750 + 10C70B22CC84A818E5976E0579BEBDF09EDBC333248B64CD35BE5217690321F9 + B2307186054C72ED1C8273D189AF6EF09F8FDBE3A68D67E261637526A66D6E66 + FDF72351DB26F8B9E8362E232060EE467CF071D469FF0007F5A7F89B0E8FE201 + 7B36A48ED188163566CDC18A26922C0DA36468CC011822355E80B57E7D87CDA7 + 825F5695972DEEAFD6FAFCB5D5FA9F9FD0CE16591587C4454654D3E68DD5DB8B + 7AAB2DAF6D74B5EEEDAA5F20FEDF57D147F01F49D2F4BB7B7FB665A5BA970706 + E460FCC4E000372F4C746008DF81F9E37FE0CBCBDF19FF0063FDA34F69ED76DB + 0BA8ADC496EEA199DDD1CEE42B231DC0855DCE3241DAB5FAE3FF000544F82D0F + C3ED7D5F4A5C69FA94B16AAB22484433C8AC143C5820B48ECD9DA58ED743B976 + 81257C15E1DF84163E00FF008486F3568B4BF106A13DDC36D6B6562B22892E1A + 584792B2B20C6C463975014162C19F383FB2F87D9D53C3658E31DDBBA4F7BB76 + EBDBEED0F99CE72259DD0C2E6B876E50A89BD6F7497BD24F7D799B497A74393F + 82BFB384D3EBCB7B34D16E855A349E53E6DBDB3E76891B6A95FDDA02CAE47DE9 + 5401C1CFAA786FE0A49A6DDDBDE5A4CDA5CF7245A308A0F3858DB928BE544A5C + 192EF2CC5A31B5913863F36D1F50FECB9FB26DA2D8E8B79771C967A4B5CDD40C + 8913192E12CE069198A2B12E7CD920DB924B97B61D8E7D96F3F67B8FC21A62BC + 5A6EAC2F6CF4B5D36CD618CFDA753D56F5CB4D6D037F76146633DC303B4C9222 + 9423E5F9FCF3C4252C54A9735FA5B44BAAB6BA3D6DE9BF73A2385C9F2951C336 + DD5BEB6E926E51DEDAB524AEFECA777B2B7C1DF162FAF13C1763A3F86EC6E6EB + 5386D9AE1A1B545792C61308FF0049B96285436048C4EE3B0B6E382AAABE093F + C3FB5D7EFE68B4DB8B8BCB3B0052E2FE2CDC4DAB5CC8AFBE38623D99B72911BF + 0837B83E62A1FD3CF8B9FB346869A1F8DA368F43D7740F02AC765AA35BB8B7D3 + 20B865DC7CD98C89E6C9F2A46DB86D32382C162041F8EFE3EFC4DF85FACCDE21 + B5B5F1B1B8B8D27C3E52C62D39DE3D3D26908F2AC2CCC6116674DCAD23F300F3 + 5CC68E4230F7B857881CE1C987A72F36937BDAD7D2FD6EAF6D2EF5763C6CF7EA + B98D4559D656D1252F76DEEF35B5D3E171BEF2D79568B5E37F676F0F683A678E + F4DB1F107D9F495D48FDA34FB28EE18CCF18645539E36E463258807690A70188 + FD10F17FFC1233C2BFB4178023B83229736DBAD60D534C31C6B9E7E49A2C4982 + 4E49133024E76F2C0FE5FF00843F669D5D3C0371F152E2F34BBCD265D521D3CC + 334CC9713BC81B66D20966DB12139CE55150752057D09F023F6A8F8DBFB36FC3 + 39FC59E07D53C496FE10D3963FB6C136E9ED215919510B237DC52DF28C6E0C47 + 2E30D8F7336C3BAD5556C1E2F96517CBD2DCFDBDEBBBEB6F3E87E5D9A6071D46 + A350A3A35CD7567EEEF76E3AADEF6D2DB58F28FDA97FE0918DF00FC4171752C3 + 347A7445984D0C8352855D8B60F9836C8A14B7FCB4424286C13B9837CBDF11FC + 13A6EABA8C5A5D9F893C457D716EBE523F9C2DF4D8D0EF1E5463CB8CA2673F2B + 8CEDEC37007F483C75FF00053D9BF6AEF06C963E33F0037F6846AC5B54D2ADDA + 09BCCC600658FE565032482173824B118AF82FC6112DDFC42116830C77B35E0F + B47CD6D133A468EC30A4AFCCCC182AED619C1C6460D7DB6438ACC6CE38F9DE70 + 5BAB25EAEF76BE4F53E4FF00963ECFDDA8F7B36DBBF47A5F5B6E9B5DCF25D63E + 064B0EAD7179F63F125BC7244466CAD9A6390AC7786247CACC324E5793C1C8C1 + 86EEE3C25A642D0DAE977DA45CDD40D1C93CF78B23C401524FCA7E5241C04C47 + CB15CF24D7AD5D6B3E24F00E836FE738F39984F6D047A1AABC71CAC814BAC6A8 + CC38271312E463E5CF0D86FF000FB55F1769AFA858CF26B532BB4B3DB5ADC624 + CB2E76985A3765600E7057A638CE33F49473494D278897BB7B26A4D27EBA5BEF + 3B2B645085FEAD16A56BB528A6D5FB6AFCF6B1E17E22D7A1FED36DD7F7EB3676 + 492DC4EABE780482A19467B0019865739C0E4D66D968EBADDEDEC73496767249 + FE949717B78C23909C9382AB8624856CB1190B93BBB7A869FE38F0F69B1DE0F1 + 0687A8C9756D1AC5FE973931C2DBBE64C44235662093F3F0A7A7A0CFB8F1E787 + EDACD5A3B3D26EA10658DD4D9BA6E4E33B3E41B582ED1B8AB30C00181208FA48 + E2AA5B9614DFAE96F91F25532FA0E5CD52AAF4B6BF3D6E8F32D6FC2ADE1DBDB9 + DD2E9F36E63229B76678979E047201DF3C72411D7A026BDA4ABBB132ECB8404C + A218C46C14F24E7A118031C7F11F415D46B5069BE2088B698DF6391B7C6B1485 + 5248D17031E61DAACA4939C8DC49032791587AAACB63B7CEBC5BEB78D15A3263 + 6788A86C858DB19DBC72A0A80777F779F4A954725696E78B88A0A13F73E1E9D9 + 940799FE8F1EE6F32589C346243F316421085038E38C633C7270C3162D6D23BB + B14C7EE5A37658E464070E32C158804EE39033CF3B43000835A5A54DE4A32C76 + F1CD22B662FF004767653B99B2A15893C8009EA3774A745A8DAA32DD2ADE4316 + FDFBA3FDF795315CB001BEEB61461873C2F230714EA3E8850A0BED497CEEBB1D + E7836E478E3E01EB1E1DBA81A5BAF0B4EFAE6961988790290979087CFDD68BC9 + 7217BC39E0F2380B7F17DD69DA242B24F73B6DE4F36DE34B831A972A46EC0E71 + C05DB95E33C0E71EB3E18F0B0F0E5BC3E24B399F52D0EE246826950B38B7F303 + 8684ED278913CCC6EDD9DAEA0EE526BC8755D33ECBA8DFE9EB132C91CA56D59C + 1591F0C085CA1DADF29C76032BC8078F2B01284AAD450F86FCDE8DE925E5AEBF + 367D3674AAAC361E53F8E31706FBC559C1B6B7D1B8AF28A5D08F58D6B5093478 + EE1A65B82B23C6C0805A1C025786048E3CC23939E3D2B2F49F11C0FA94734D69 + 6B188C96223057276919DBCAE3A13C7F0F7EF3493335A5DDBCD2B27DA8E0EE1E + 5E590820301851F7BBF03AFA63260B96B4915D3CB0CA70704E33DBBF07DC6063 + F1AF66115CB63E3AA54929293FC4E835416ECEDE5ABC71C885D768DACE30C33F + 29C1EBBB271C47CE4F5A36F69BAEA1871032B33A9688EE570C005C85F463DF90 + 319E82ABC3AD32DE4CD323C824DC46F73B94E1B6FCD9191F367038240EBD0C77 + 175FD9B793496D3491A3B131127E66504ED39F6C0FCE9C62D6839D48CAD21D67 + 6E57568E3942C924DB1064799F79719E3391C8F7FCB9B3ADDA45A36A2D6D1867 + B3BA2B245873B48C95C9C7DEFE2E47A679151EB53FDAF55BEBC8E15F23ED3BF7 + 22FCB19624A8E41C743C671C1ED835A3A9B47AE6936AB0491892CA0641E6024E + 4296387E9CED6233CE4903801A9BBDD3263156715BF439BBC90CB296FBC8AAAB + 9E790001D4F3DBE9E9C628B09E4892548CE3CE411B8C6778DC180C7D403F8512 + DBAC778D1993283BF1C719FF00EB547E5ED9543160A719F5C569D0E7D7A11838 + F5FC29EEED2C5F757E53924000F6FF000FD691C6C6214823DE88D8E3CBFE1638 + 2073544DBB9DDE92B79E23D4104B12BAACCBC0C88F24B148931F2A83938E7710 + 1B073D3EEAFD967E04689F093C131F893581E5DE5E3C96D6972A72444A332483 + 1B4A92C0000E091B4655871F39FC09F0ADAE8DE29B217D1C11DC69B120C101FC + 9919B680DB8E7790AE570015C1EE715DBFC5EF8E3AD7C6FF001468FE17F0AE9D + A85DDC5E05B2B5B4D3B3BAE328738D8A4FDF6FBCA4E770C95C90DF99F13CB139 + 84D6070EF9296F395ECADBFE27ECDC234F09965296618B8F3D56ED08DAEEFB6D + AFE0B73D1FF684FDB22D6736FA7F87CC8BA468F881556232F9921552EFB49EBD + 31B8100A1DA09C15F18F09D87C41FDA53537B7F0DE81AA788216CBC92FD96573 + FBD5C60C992D1A291F7C371B1471F367EB0FD8B7FE0957E0FF001BF8B96DFE2F + F89352D67C4D6AC218FC05E1F84FFC4B59CAB2AEA57BE598ADD9B729FB3C7BE4 + 738FB800AF49FDB2FF006F2F82FF00F04E4F0A4BE08F00C7A4FC40F1C42593FB + 12C2216BE1BD0652300DDB432BB5D48300185652D904492A10D19F8AC3E7184C + 2578E53C3D86788AFBF334D412FE672D2EBAF35D45F46F43E8730A95F17CD8FE + 23ACE8D2E908AF79DB4B456C92DB56D5FADEE8F8F27FD8FF0052F86DE09BCF14 + 78BAE9F4F82D9D965B86B80D0973B8321B871B013C70BBD81500608C8F17D5FE + 2CE83E1697503A4F9DAA23B792BF290AEB86C2B48DC3704FCAB195C60EE239AC + 8F8B9FB4E78D3F6A7F197F6D78EF5AD4358B8D82385182C767A7C608063B7B68 + D522853A7CB1A8072D9E726B8CBDB1B5D2805485BECEDB19829E653D473D4001 + B2318ED9CE457EA396E57888C2F99CD4A6FA4748AF24DEAFD74F43E0331CD28C + E1CF95C1420B4BCB59B7DEC925F9FA9B371E39BDBDBD95A2B6B5D2ED705A47D8 + CC599402480FBC6FCE73B154FCC73819C4BA56BFA8DFDEFDB5B50BCBC955CC11 + 2AB6C120E46780C4F40318EAEBC9E86BF83BE18EBDE3591218B4DD4AFD848142 + 40A4480ED3C8E73918F4201073D49ADED13C31A87C38D4A391AE560BA8D15915 + A45936A1E08239DAA1766E2475DBC12315E9CE5423EE41AE6EDFD6A79346962E + 6D549A7CBDFF00AB263F40D75A1D4E168FE68A42600B7570E10A9C3142ABB0FF + 00B5D73938FE118F51F0AF8C26589964B6D22C0C85BC86B68A46919C3A118672 + CE08248209380EB8C018AF28D32EEEFC55AC1923F2DBE458E54B54957080A329 + F906D5666C13C0C15C919249DF432DB2D92CF716EB0DC9213ECD730F9B149B40 + 4DE01DEBCA90BB87F7876E3CAC7E1A35172BB5CF7F2CC4BA579C6EF5FEBD3D0F + 6FF86DE395D76D1B4EFED68F4BD623C0B592F6EE60130ACC523DD22C386C72B2 + 0624FAB0E3DDFE0349FD9F3DACDA86B30DE59D8C6B7969AB59E9B1DFD9DBAE57 + E6923954055432AA9631E18CC4E7E704FCEDE07FD9DBC45E20F12AD9B4DA6C8D + 2240867BCBA864D3D9E4479922FB40E9230CFC8AA48224F95BE6AFAC3E16FC1F + 923F1958D9EB17525DEA1A7D98B4B8B8B0D537ADE8DD946336D21648D42AF20E + E555CE433D7E4BC5B5B074E0E0AA2D55F64DAF46D7E1AF9DFA7EF1C0383C6E2A + AA954A2ED15ADDD97CD5EDF95CF67F87BFB5EDC7C39F88EDAD47E38F11DE5BEA + 92225DCB0BA4D1DDC38F923304D1F94A555502808011D081BB3EF163F107E1DF + 8CB578F5FD0354BED0351D4364D6F6CF6B0C96B72F81E65B4A6DDC88199F0409 + 084DBCA9505B6F86F873F660D7BC51B67BA8ECE2DDD6595E1D9C0544030DB914 + 285F97040DA700F7E1FF00681F843ABFC10F08C9AF4175672D9DBBF94AF6F721 + C9917002FC98C31383B0E38071B80E7F13AD97E5F8DAEA187A9CB51FBBA5B5BE + C9A4ADF83D34D0FD9F159264588926B12A8D651E57C96E5924B67A59BD3AF4BA + 56DD7E93FC0FF1678775589B45F18683FD8FAA6B00AC42FEDD1413C9FDD15F95 + A2DA410072BC8CB751E55FB56FECD6DF0BFC590DF787EFA6B76C9BE8ADA26631 + 5EE5D3A03CC6C0B6027CF8DA0E4E4E3E3BF801FF00052AF1478C75EB1D23C65A + 6DFF0088343D06DD6EAE248E1593CC810AE77B312E9903CB69233BB6BC6BB7E4 + 20FD6DE10F8C3E16F89FA1497FE1CD46E752D3CC6B35ACB7F3798D6C88E04A8C + 8E85B7C2D9F970F947464DEEB2475F2F8CE17CCF26C57B4947DD7BA5EF475765 + BEDA6B6D5DB5F4FC8F0786C465B98FD770956F095F9A2AF2A6FA2B7359C747B5 + 9F93BA76F0FF0083FF001F254F186AD078FAD449A0FEF229264B1FB55FF9E40C + A97259A276500FA9DD803209AF2FFDACF53D73E20FC37D266F08E91A8DF785D6 + 49956F9AD9F779BE6485D3636D7428DBE3D8E148D98232C009FF006B6F0BC16F + 7D36ADA59BC86D669A317B2C1771335DA96C42E194EC247984025B054A91D015 + EA7F63CF8C5A57C1FF00106ADA4EBDE3BF10490EACACE64455BAB29D0C6CDE76 + D93FD5E78F30BBC408DC73800D7DE51C0C30F059AE129F34F4FDDD9DB4566D24 + B757BDDF4DD6BA7DC6678EF655155C2C5C2564F4765D6CE292BA934DA7A3BBEC + 7A07FC137FC7BAE6B3F09F4FD3F5DB75D234EF07CCD2B5A5DE23BA78E7900DC0 + C83E58DFED11000303BC3E46E5403DEBF683FDA0F4FD27E3443E21D2EFA17B7D + 2E78EDEE267DC32925B2B4981C2E4364F4192DDC1AF9CBE14F89747D07E3BEA9 + A858F8AA3BEB0F125BC2B2D8C3279F712428E258E62C84C614B479DC086C85C0 + 3BF213E3578AEC348D22DED6D5EF2F2DEEAE23791265E6F1D972548C0C1E5102 + E4F5079DD5F1F996570C566DEDD41C79D6C9592E6B392D7CD33CDFEC2A58ACD1 + E33177778BBBB249A9DB9DBE976EEF7FB5F77A27ED9BAD43F1C3E24F87ADFC3D + 0DC4DA25E1FB7C4C583AAB3A2AB00572833E567F11EBCF89FC25F00CDE37F8D5 + 24D3AC3A8368B731CB7CD3C8FE447E75C471B3B6DC80598C685D401B427002E6 + B4A3F8FB7DA77ECF0BAD59689A4FF67F875DB4E8A783FD1A489A4890BC972817 + 9917748B92C461010B92BB7B2FD853C2BAA78C7C2BAA6B5A7F93A85DF882DDEE + 4E94A402C1591A377948C27227E464AA827A900F47256CBF0134FDD8C7DC5AF5 + 6EEEF6BF47F79F4585C4D2CAF249D08B8A5452841B776F9A4EF2725B5E3D5DAD + 2DFBBF4C97E3BD8FC3A135BE82F63A54774D2DE0952366688CCC599171D36170 + 502F27CA8739DA48D387FE0A316FE0F92E0F892256D2EC9B66A9E41F3A5788C2 + 447696A4146DC4ED673BB1B8B658E087C8F859F03BC49E3BB3BCD4359D3ED747 + D2BC373226AA55FCC8EE937F1E50230ACAA5C64F193818DA49F8C7FE0A5BF1C7 + 4ED6FE216ADA6787ECD34FF0DDF5DC851B11CBFDA862FDDF5C96C15653F28C60 + 80B9C330E1C8B86F099A63161270E67BB95F6D774FBB576ADEA7C3E2B2DC92AA + AB4E74FDA4E0B592927693B72A725D5A6E4B7B25756D8F72FDA23F6ACF861FB5 + 5FC25B3D2FC309AD59DB2DCB451F84218E3B7D1E4BAC7EEE531AEC96FA443B48 + 40C910C3332121C9F81BE38FC23B3F82374D79E35F1868DABF8A3CA022F0F787 + 42DF49A7FCACBB2EEE231E4405548CC1089186D00A4648279B8EEBC4175E1D92 + CBC3DA834126A37327F6C5C58C6A61656D80465F28CAAAA0803014B8750AFC96 + EF7F669F809A0E9573FDA1AC68BFF0B09A30AF159EA05ADF444901E03A46FBEE + 02F40BB9548382848AFDC728CA70DC3B424E159BA777EEE8E6FCB99D924FEF6A + CF993563E7564B8CC7C2183CB283E68DDDE4FDD6DEDBBBCADDDDF5F89F53C47E + 167C3CF1A7ED13A8EA0BE17D0750D5AC6D9CBDF5C5819859C2A1480669FEE87C + 02143306CEDF92BD1BC37F18BC4DF073C07ACF812E3C556F71E1DD76489F54B1 + 37F673B996290156088ED247F3AE7711CED24E7927E8EFDA17F6ACD6BC4BE12B + 3F0DEAD36822C6DD92DF4FF0B787BC3F6567A4E98C0B1DDB5A338639E429DF80 + 070735E63E2FF09E9BFB3EE9BA6CDAF59D8DBF88EED5649B47FEC7B4BA86DC1C + CBB669A3B9DDBB6AB123C98C2F1C10327D4A7C472C625F59C3C7964FDC86B26D + AD79B99A5AA693BA8D93EACF36A7014A92F618EC5B85657E6E595D249D92D2CA + D7DD37BBD93B1CDFECF1FB4E78DBF673F8B1A2DEF83E2B5D7A15BC8E6FECEBAB + 1926B798A920922319076E7AED1818DBC7CBCFFC4ED4350B3F8C7A878D3FE10D + 8BC2775757F2EA765A64B148D1C2F23990825B0AD1AEE65518DC4151C9535CF7 + 8CBE2B5C789EF9751B8D374881ACE722DAD20805ACE13E75F9D43F6242ED2B90 + 6373B7B0E52E7E24EB16B14BE4F887506B7BBDBE659ADC7EEDD885DC9B59884F + 9439C8EDD48E48F769E593A95FEB2A9C633947965BEAAF7B36B4D2FBB8DF757D + CF2BD9E5F808469BAF526A2EF16946F1F452D6DCD77653EB73D4FF00684FDBDB + C39F1F7E02E8BE15F1B7C3AB8B4F1C7865A68F48F15699308259E12CED2D85C2 + 7CECF11E1906F6647DA07CAC50FCF117C41D71F43B7B3FED4BE7B04BFF00B425 + 8EA416592CC32ABB18571B53054B65141CA8003743A3E2CF16307F324F9EE265 + 4C421705C4728E71905B014119DA4004E3F82B9FB2F881649763FB5B4F67B7B7 + 7016EAC176CF002158870C4099576A6E0DE593D7CC01B0DF4D93E4F430987F67 + 87A5EEDDBB733924DEFCAA5B2BF44D2EC7C96618E55F13273AF66EEEED59BBBB + B72716ECF7F2D757D49BE25EA70C7E2192EB5AB5690DC3826E2EA167B6781738 + 24F3824B7384054041C741871FC1FB1F1A5A36A3A5F8834ED3E2863793C81249 + 29640704463019B1C90305B939240CD7B06ABADE87E23F0F69B27D86D756F07D + F40B05F2CF23CF05ACCC41C421505C5BB1CE7CA72C1724AB95E4F8778834A1E0 + B8639BC20E4A2DC3EC334A4DC49C804238554DDFBC50703710010769DA7D7CB2 + BCEA47923784969D1C7D1DF67DD5BAAB5D1E4F1061DE1E7FBD4A506AF6575277 + D5495ADCD177D1A76D1954582F83F53B5FB55FDD6937D1AB18F534883BCC724F + CE8BF33296383BFE7001E08C838FE37F175D346AB13596EB895A4966B32B13DC + 00C4C7BCA80A40451821719DD9F9C354773E3ABED4E38F65D2B46B3090400295 + 90A2805C82A3EF6031DC7960DCE49356BC05A3FF00C24B757964DAA69F65791C + 27C9594FD9E09B07E650CC0AB1DB9EB8DC072C39C7D1A8F22F6B5BA6E7C5CA7E + D1FB0C3DED2E9FF02F6FC2EFAF432E2D43EDDACC712AAC724C5099D6D7CB6859 + CFCD8111024FBC4AEEC75C646DE7B2F87FE026D6EC67D3EF0476B6FAA5B3CB61 + 751DB3347F695191133E3E53BD768C0C6E74F98266B8DD5FC017FA2EAAAAB262 + 4318776FB4AEE81371EB82372855032A4839E09E0574DE0E9F5AF0F064B79BEC + F34789166910C824909C0673CE73B84678F99467A02498A97353FDD495FF00AF + 537C061EA42AFF00B45395BD1DBF4FE91E95FB3D6AA752965F0CDC58DC5C47AB + B36957B650BED5B847F9950161859098C6D7C82AC6266FB855BC9FE366892780 + BC77F678AFA6BD68E24B88AEFECC2049D54BAA4853EF479429B973957DEA4647 + 1E81FF00099E9B70575AB1B38AD7528E6612A5BC6D1A4F16DF9CB46DC2B364FD + C2B192F9083E6CF25FB4E6BD278B750D1F5492669EF2FE4B99EEE47209695E45 + 7981E705FCF6998AE005DFC0C74F272F8CD639CED6535AA7DD7F5F3F91EC6692 + 82CB5D372BB859C5AFE5BD92F55ADFB74DF5E4B55F0EFF00C24F689A8D9B7993 + BA196EE350431932EC580C1F94AA93D78E7B75E7751B692CBF73342F1CD22066 + C8F957E63EFF002F6F4C1CF183CE9F86B5996C14BAE2DDE389A349411BC31DE3 + 3FDE180C727D9477E67F1078A1F5DB62B7B32EF8CC6E93A47960433703DB1237 + 19E88B8E0003E8A3CF1972F43E5251A5528BA8B497E072F701635540CAF951C0 + E7677C73D3279E3FFAD4F07F7324775E66F857FD1D7AA962C339F6C6791DC0F5 + 3565F4C92349001B842E517E5C9254AF7C772FD323AFB56DDAF8516CF41B1D5E + E235BAB08EE9609A349086C1F981C9036E78E4FCA43A1E4E4D6D2A918EE70D3A + 329B76E8AEFD0E79A710E9F347B5FF007854A1C0E8376723B1E40E3D0F5AAD6C + A30A015791BEE00B920E46339E3A67D6A67B981E25DD1B34DBC86DE30A8BF2E3 + 1CF6C30E7A0ED9E8E8268ED45D308C4924D1ED899460236E5248FC0118E98635 + A18EEEE3751B511431C855775C297540FBBCB0199483CF1D3A1E71CF42330166 + 2732659906D0A47E03FCFB62AE3903438432C71E5DF0F9DD23B7EECE08FE1001 + 3838E727AF510DC1F2E2119DABF451DB23391EFE99A943B6F6209A16912364DC + DFC39E32C7AF1DCF6FF38A4F2F7C8AD1990A8192D8E73FE48ABCF692369024F2 + E358F2006C72C719FCF1DBDF3CF5ACF917E70ABF2F4CFA0AA8B14E36D4FA29A1 + 93C4FACEA4B6B7969A5D8DD317BED564603ECA132A7F779F9860003E607048CE + 06D1EA9F037E296ABA56AABE13F84F15D68DA96B523595FF008861880D63524F + BA55256024B5B7C73E5A156382CCE15715F3E78975D5D6754BAB2F3A64B792ED + AE2E848ECAACD9E541EA768DBD3939EA7B7A8EADE328FE0769573E0ED356D63F + 11EACA63F14DC81B63D3222415D26324FC8C4AE6E4E4313B6DC9091CC25F87CC + 303ED292A4D5DBDA2F6564AF297F35BA27A5EDA5DDD7EAD96E29C2ABAD2768AD + 1CBABBEBCB1E91BEADB5AEFADAC7AFFC77FDB7F43FD93FE195C7C3AF82735BEA + 3E24D4A26B4D7BC6692B7CA65DC64834F3C000E7125CE41930E1556224C9F0FB + 69D717771E74D2ACF7F31FDEF9B3249CE401962705B1D4139180793D34354D56 + 4BCD5247DDF69DD94818284F200C9F917E5C6371ED81B4F6E4508B4FB8D6F529 + ACE3DAC148679656C2B01B739391C6727182C48C75E9EA64993E1F2EA4D53F8A + 5ACE4F793F37A69D92B24B448F97CFB32AD8FC473CBE18E918A5A45764969F33 + 5BE1DFC3AD4FC6FE20B6D374FF00B1C72DE6466E6E638E18F839798961B540CF + CCD8FBDDB06BED5F85137ECD3FB0FC1249E22F0F47FB4478FB88E0B6B6D427B2 + D074773D448FE5E2E1C328CE3230790BCD7C876BA8DDF85B4DD534DD3F5011BA + 6D5927B226377C6E254BFDE38CAA90170320127A3637867C26FAF5D1F2DA3165 + 6A9999D634DDDC67921482DC004F24800375AE7CDB2D7984792B5594292DD45B + 8B97AC95A497945AF5E876603111C1C3D9D2A6A5565F69FD9B7F2A4D6BE6DF92 + 47D85F147E34F883F6AB486EBC590CD63A3ACF1A69BA568D20B5B2D3959818C2 + E03C87EEAF2EA58E090718C725FB40FEC21F10BC07616BACC9E10D59743D5214 + 78754BDB6B8DA5492C3F7B32C68CFB739038247CB8C01577F661FDA0DBF671D5 + 997C03E1BD1AFBC5F624467C4BE29B537F7766EA1711D9DAEF36D16C240DF289 + 482EA0019DA7EEAF879FB4F789BF6C4D0E1F08FC7DF895E11B7D16FA6C37F6FC + 91497F7AE26055AD2CADD0CAAB8E04862D9B8654A8C357E71996638EC92AC160 + A945508EEB5E6B778C127F8BBBEA91FA9E5F93C73AA4EA62A7ABB5E6DBF8BA45 + 5A2DC9F925A5AD1BE87E59C7F0ABC4D75AF490CD6BA806B746411344EE6DCC8C + 4A027070DB9FAE0F39FBB9C8FA0FE0FF00FC13BE3D663B7B8D76FEDF46219634 + 6BA4754466EB24A155C918C0DA012483D36835EF9F1EFF00645BEF82FE3E92FB + C2FF00D8FA9782F496DB63AFC532DBC7A892CA7EE48DBBCF52E0111A82573907 + E72DC5587ED113788BFE3DE1B6874B8E5FB389A44631C722EE1B4676AB16DA00 + 381C139E84D72E65C599863A8C67965946DAB5BAF2B6E9F96E7E9DC1FE1BF0F6 + 17F7B9CCF9EFF0AB3D5DAEF46AEADDA4959EEB467A27C1CFD9C34DF0CC8FA7E9 + F2477D129D91492E2EA18141DCC637731B2F232005C396CB023705FBBBE19FEC + F36DE1FF00863278934F8F4AD675392153169F6594B4D3E2D9F34D29276C6A16 + 32553209018F0A303C57F63CD661D5EE6C61863D36F163B96749A2516BB5C0C0 + 70489B68E392D030EB9DA016AFBEAF7F6735F8B76FA65AC3AB4963A5B584535F + 5F0995AF6FA621885919361668C13B4B1200DC40E5B3FCE5C65C418978A8D1C4 + 36AEDDDEBADAD7BAB7DC7B3C75C4985CAA74B01844A851DDB4B78AE8F9526EF6 + 5B34FA6C7C8FF145BC3BE04D634FBEBBF10C5AC58E9F3336A36BA3ABC2658936 + B2AFCFB80DD9DB95C6776000793E53FB44FC7CF87BE2BF01C2BA5F86E5D2E3F1 + 44EF75AB4371A9CB6B0C1B1A56548A6F29DA49BCB72A0EDC162C494C0C7D9BF1 + 87FE09C9F0EF45B431CBA94D26A1AA8FB318EE65790DD3153B7CC48F68319E49 + 010F55C608C9F88FF6CDFD82F47F06EA1A84505DCD6B1E997521F9E53F658155 + 7E4DEF2BF92ACC48F923918AE54302CC71D5C2D8BCA2B62210A9527CEBC9A56F + FB75AEBD55F5D3A939571164D99D08D2C3D49CEA24F9799FB352F58A4E3249EC + DD9AB2D4DBF83FF19BE0BEA7F06BC41629E15B1F87BE1786692FAF6FAF6F45C5 + E6AC3CB27C84469163450CACB9690A648C29DD83E5BF0B7C63E1EF1DDE7FC237 + F0BEE348D4B4D82FA4BED5E38AE7CA793781B20F2E50A92A0556DC485E836ED2 + A31F29FC6C975BF0C95B3BCB65B4834A91228EEE3B1845CE5DA4086470063732 + 90016F995700E3ADCD1759D6345BF8BC457DE2FBDB6D5EF4A4770F657DF67984 + 2888DE50E57AAFDD084E48C603633FAC53E10A54E8CEAD1AADBA8EE936E4AFD1 + BBDDCBBDEEADA2B5B438B035AA52AFEC7A46CDDDECF5D9B6AD776D354E3B58FA + A75DF853E3CD5BC1B3C7A87867588F4B8E1FB30BE96D4C71CC3771995D31FEAC + 2AA92148033B09700F92784BE0EEBBE15FB45F1D5E1D1FC476EEE9308E7F385C + 46E595B7942559B71F9979C042480700FBC782BF6CFD0ADBE1C5AC5E26F1A78D + 678F5A985B59DC5C1B6366E638C6E867DD1C7E5AE1BF76C260C41DC71838E07E + 247C3CD3FE20F88EDADAD574BF0A6C889B2BA1726EA6298768F1E48C314063CE + D2546D5C1DBB5479796E231B479A8E2A2A116F749D9DB7BF35AFE6AC7D04A9AC + 557BD6B4E706924AF6B696DBAF63D9FE06F80ECFC41F0E745D0E48F4FF00074F + 124373A35E42934D67721B27C9967DAAA0EEE4AB060771DBC9D8B97F1A7C2FE2 + 8F0FF8A6D7EC7A7866D2564BA79D9F7DBF9B1C7952029F9711A055C0C018600B + 01987E1B7C71D43E1349E1FF000CE9704D716F3CB268BAB437B0899B54825442 + 97106EE19525259906D64E195D58135DDF8BE3D43C6B67F6CD1E1D3EDEE2CEE7 + EC9A8037CB1AC6AD95DD22B3615951FA82C01C1CE0B11F278955E8639D49D9C2 + 576AFB5DE9EAAFD9B6AEF7E875C6A545565466DC60ACBD1E9E5A2765A26FCADB + 2D4F879E256D4FE065A58DE69F1D9EB179671CD1EAC6D1AD6364766D9095466D + EF19560C481B41CE4E481DA7857E2D6ABF0AAF9BC3FA5D8D9C1A2BD9DB2CF749 + 20792408B931C4B8214BCDB86E604A87C6785DB693E1DD95BF833ECFA6C966D6 + 96E4A4E2375410DEDAE5A6DC30085772CA180E4C6F919CE7CCFC3BE18BEF18FC + 426D16D566B7BA9B3E40950885D83282F2B03800E36E70146F2D935F1D5A387C + 4CEAB92B4536DA77D1F7FEB4470E1E8E071746A7B6B4A9A726D4AFDD7BDBFD94 + B6D96F6D4FA7BE327ED25A7EA5FB2C69FE0DF0BBAB6A9AC69EABAD5CF94E3FB3 + 5170D2B4AAA43339CE026464B819E707F3EFC39FB375BF8B3C6F27D874FD52EE + 679D23FED1BAB854167B433B11214DA372F9923E490801237E2BDDF4FF0017F8 + FBC59AF5E783E286F2782EE15B313DE6EF37018E16695036D50B1B740011C9C9 + 205767F06E4B7F1278ADBC3FE11D3EE356D52D6ECC6D6D2DB4900B765419DACC + 084185521DD0121464D6F81C66232CA33850D5B57D1ECBA37A2B6BA25B6F7D4C + F2DC0D1C872FAF4A108CB99BAADB95D26F69CDD9597D98A76D15EF7B9E457BFB + 036A569E08F2D34BD37ECB833BC16D3334912A1505991707E456456C03895C45 + 862081C27C48D3357F0B5BFF0061E8762F1DF2C623BB79079D3873D2110C655D + 7AAAB6F1122E49E7807EDC87F6BDF02F87B56B7D03C5120F0EEBED328B792D61 + 5244916E48E4953E745031FBBCACBE592595542E47C87FB647ED77E28D47C4EE + BA5F82ECECFC23A745B1355852FA7B3B40819DCB5D48AB6ECEEFB1E52D02B9EC + 79C9EFE1DC766B8EC4AA55E8DD6B24E4EC9F66B56A5E471E0789B3895474F194 + 7D9C1D973C55959ED6B3D74D74F7924DDB449F9B7ECFBFF04FAF197C7FBAD62D + 744DB7D74B0324A27DEB1C8406DF1991430653FF004CD641961F292BC7CE9FB4 + E7C17F147C16F1849E1FF11785B58D15AD00854CA8B6B0DDA2150CFE67DC64CE + 0B7CC70A003B4E52BE8AFD89BF689BFF00843F1CB4BD4BC13E369B50F1A788A2 + 8ED317CADF6794A3B84B4266FF00590E082A001B4BE54A92DB7EAAFDA63F6FBD + 2FF6D3FD9D35B8F5AF006A1E18F19787D41FEDDD3E14BCB0DEA71F31CF991282 + 720BEE553CEEEE3F64C2E2F1186ADCD51A6B4D1A706AEF96FAF4BE8B6BF4D4FC + 9F3AC46368E3E5469D3F69464DDA506A4D6977A27AE8F5BF5F248FC8DD7FC3F6 + B15F43FE956ACAAFB5E58E5F3A39082A03174F95D8061C92A01E0060D918BE32 + D3574BD35A4B684DA5D42C6292D85BE5A457232E59595D7E7538620839DA3819 + 3EF56D7773278424D6AEBC3BAB6A5A55C4DE545ACFDBAE0DC4D28F301FF56B83 + C424F0558046CE4122BCF3E227C319B4FD456EBC4D63E22F1259EA089E52E9B7 + CA1915F6F939562B20C9DCAAE22DBB72723EF0FABCBF335EDB92A69CAEDBA776 + B7496D7F27662CC32594E83AD077E6D7552564F66ED776F44D58F9C3C409A9B5 + 945A85FDBEA1259A0CCF2E1D3A37386D87EEC84A92705BCB3DCAA9C342351B9D + 3A2B3DD1AC805BC56EE0DB8908F983312485CEE56E18021701F3923D8FC7ABA5 + E8D7D2E916FE19DD77244ABE5DF19C5CA95C6C32E19E240C76302402AACE4E32 + 48E02FBC2F67E14BBB55B78F555B868E28A33232C785653B595D66679707CB3B + 63083217240E17F44C0E3233859C6DDB6D57DFF8E9E47E5D9965AE9D4F726A5B + 73774EFB6CAF7EDF79D67C1EB2B38358FB15E5DE9F656BAD39B1B8120964B3BA + 6209DAF8C9C92E981B4302780080451F8EDF03F50F82322DE5F69F0EB1E1BB99 + 16DED752B5BA0E22457015438F954E0B851328719390768CD5F84FE3FD26DB53 + BCB6D4ADE3BEB79A248A5B4B955B8B7B843B10127EFA3852C55FCC568CA80370 + C8AF6C9FE2269DAA786C784D6EAEAD34BBA67375A76AF74B3C0B984C79591634 + 1B401226369C2A28ED8AF171D88C560F18AAC53717F12E96EE9AD535F34D595C + FA9CBE384CCB2AFAA546972DF91EADA93E8D3BC795BD5A5CB67776EA781D843E + 07F14E88F0C3A65F497531F2564927792681436CE1542AB723386072401F2862 + 0F232DA3595EDC59DDF87B4F7859BED76D756ECFFBB0A4B6D24758CFCE4F2193 + 2C4361401A1F1F3E1F37C12F1335A595CC7AB6912CE7EC1ABD8C922D9DE15D8B + 221665043A8DA31F2950518616419E662F334DD4ED247569170B3DC59806DE37 + 5C28F9595CEE3B4C80950A721BAE4E7EB70718CA92AD4E4DC65AABDFD74D74F4 + 7E8CFCDB3194E159E1EB4146707676B5BB6BDD7E6B5443A8C76FE1E4F32DDBCE + 4BA42B6D3C823936AEE60CA4B12AAEB9DC0AE0F2AC0F4DD7EDED1D74F83508EE + 245DAA3CD7642FB0C6BC2B21C03CB763D7D4826B57C5DA57856DEFAD66B0D52E + 2FAF243109A36852378368C6E27959470BF310BFC41B24B30D9D7FC3D71E06D2 + 9AD956185217791627B89098A52BBF697C9C91960761C3763CE6ADE2A2D452BD + DF7D3F3338E0E71949369A5D9A76FB8C6D1FC4AFE05D6EC6F63B159A3323A6D9 + E40A04C40014856C955DE189CED6327014126B67F6B8D4F43D4AD3C3FA9787F4 + 4934B8664B9B2BA9A5624DDCA82DE532052018F1E685119E1576FF007AB88436 + FAF7990CCE3EDD7D188D1C4A7CBF37CCFE2EF8F941F4E549C60B1B7F14EC2F34 + 8F869E11D3E4BEB7BA86717DAC7D9D72D259CB35C1B771282B90ECB65130E80A + B21F5273961A0B174ABB7692BADDD9AE56FD34F3F337FAD55781AD878A4E2D27 + B26D3524B7B5D5D6FF00E470D69A918774BB6131B382DE665B3C0CF1C67D4FA6 + 074EF6AF278F56937C2CA2E151B7854F9588562CC39C01804F3DB3F4AA70F971 + 451878FF0079B86E5DB82070430E476CFB1FC8D58B4D3DB557BC93E655B50AEC + 8DD36EF8E3000EB900F233D075AF69A5BB3E6A3297C2BA96B4FBF86FB40FECB6 + FB386B8BC668E4972A22DFE580DC1C2AFCBCF5E83B0E6E7867C43245A16A1A54 + B37FA25E949802A1543A16DBF330E067DB183D8E315E55FB25D5CBBC367179B0 + B5CB407EF057F942AE79E031239CED21B9C567DA58DA4A616BA93C98E7DCCC51 + 3718C7201038C8C8C1E73C823359CA3192B3F5F99B53A9284D3EB6B7CBFA647E + 22816DEF2611ACC5727F7928C3B739C91EB8EB8F51EB55F4EB39266575DD1FCA + CE4971C807191C8EF8E3F1ADB36DFDB160B70D32B5C40EB14B273865FBA1F9C0 + 38E739C74E4F3515959AEF0A2393CC9A5DC885C28239196DC31EB8E01C739EB5 + 71A9A5BA93530D69A6B696A8A73411D83C69E4C8BE646195DCED12364F2A48FB + A7A03CF4CE412715EE564949F387CD8DDC72579DA7BF3CE7F9E6BA1BAD1E3BFB + D9266464B5B340427CAAAB1F001C024E4E464139EBC9E40C4BA959E591A3DD86 + 521998E093B7E607F0C9FF0038A519A7B15570F28479A5B74F31FF0062DBE186 + 93CC0ACF31055BA0DABDBB96C9C7A73EFC50122FD9097123C8CD85DCD95000C7 + 4EB9EDE98AEC6C3C3D347F0DD6599D61B769E47F9973905554311CF7C6D3819C + B0C9CA83CD0B58522C8693924ABE42E1B271D7E83BFE34E9D44DBF533AD41C79 + 5BEA933D47C05AA7FC20FA32F8B269A39356690FF60C6E878B96EB7582318B7C + 6506706464C06F2DC0C4B1D35B4FD23ED570AAB773317814CCCAC8546448C490 + DD79C8C73EBD4747AA4D26B3731418B85B7B38D2189A48798B96FBC00C659F71 + CF5619E46303ACF84DFB2CF8BBF6849D97C3BA2DF5C5BC28A6F2786379D2D100 + 27CC7C64F96304EEDA40049C0E4D7CE6231D470F175F112515D5BEDD174FF873 + EEB0381AB8AE5A1878B95974EEF76DFDCBA68979B3C9F56B7172B6F22F98925C + C637AC7F711FE62D8EEA0165E00EF807757D17FB307FC1353C6DFB497C2FF17F + 8AB49D5345D2F4BF05DBC379A98B9E7EC31B9D8266CAE767CACF919E15B19238 + E535FF00D9CA6F879A2ADCDD49A6DF347706DBCBB77666936ED6240C7CCADD06 + 7032AD907040F58FD963F693F881FB2CF873C6DA6E8CD6B1E9FF0010B478F45B + E8AE63DB1BC7BDDB72C785F9C79A493DF76074CD7879EE71899E05CB279C7DA2 + 6ADCDB35CCAEB5FEEDCF472FC96952C5286670D1DB4BB5D37D2CDF5B5BADAFA1 + E20DF0525F077885741BDB8659AE244964861DBBA4620305F986595B6C6C1769 + 0C70412791EE5FB7DFFC13FF00C2BFB167ED070786FC3FE2EB9F135858A44B7C + 92B2AA25EA411962BB065A20F232AB6D072A546761AF0DF1BF8EF50BAF1E5D6A + 9E64D23DC3ACA21320DA817738EC08319462401805940182730DB78BB54F11F8 + 8D757BED464D5B5281639A5925B9244206047966F99DF76E72CC7201CE412715 + 5A8E6552AD2C4FB6B41465CD1495A52925677E9CBAFDE74E129E02954943D8DF + DE4A37E9677BBBF96E95AF7D764CFA33C61FB0578C3F67DFDA0F49F00E97716B + AF78C35CB1B3792C74AB732C9637D38123E9C33F2B4A8FB51E4076215619041C + 50F861A6DF7C339DD1B47D2ECF5693549A2BDBCD5240F1466372D2872A4BBAC6 + B192E149521E40436DE394F833F1EFC65E01F88E7C550EABA949E26D6ACEF2DE + D6E4B0698C772AF0BBA6E5725DD198649C9532E49524B7D4DF077F682D3F41F0 + 678674DF13E876775A3E97A9C9E21D41A1CDB5EEB3A81591A248FCB6C9418811 + 1810230CEC02BB094FC5E655331C3414714956D17338FBADB57BD96D6D925D5B + D6C9367EB3C338BC247F7987BAE5EFE6B57AB6936B649AE54ECE5B1F4A7EC95F + B6D7FC265E196F0BFC4ED3AE3C6DE11B3BC86CED5357B2B7B3B58EF36964FB1E + 9D6F6EC65D9F332B058F015997CD385AF4AF883FF04EDF813F1326D535EB3F1E + 4DA45D69AEFA76A171AA5B472490DE492168ACF7A8686DB01991618905C28031 + B4A935E03E0BF88DF0CFC23AA68F6F1E9B791CDA1C97379AF2DBDDC2F05BC92F + 9BB2D0303BEE242546E085E246B91E665BCD136478B7F6EC987862DB41F0E5AE + 8BA1ACD3ADED9DDEAF70237B06DEEDE733B611E493CC0E0E142B336D03219BF2 + 8C465B889E21CF2A8CE8DF7B594757BB5AABB5AE8B5D1DB63DBC65383AFEDB05 + 51D16DFBC972B8BD7A2775A77B5DB6A4DB91F54E81FB1A7C2AFD9E3C4563A649 + E32D5AD524B582EA45B2D2675B7B256DE37CAEEE4203E59043666246084DBC6B + EB7FB4B7823E167F6749FDA1E28F1468B6ECD3CF345AECF049A8CBCB08E483CA + 54501B2DB04B231DCC7AE2BE79F076BD75F1B747D2F49B111EA563B55A09A23E + 6ADFBFCA046F70D248CBB463F763CB083667B57D29AFFEC63A0FC3CF87AC356D + 774CB8F151D3A4D424FED372B61A3DA460798488CA966F986141C6EC01EA7F3F + CDA51A75E34F34AB294E4ED6D2FEBA2D3F2B799F4988A181A54E87F6DE2AA559 + 4EE9421CAAEAD6724E114E295FABB2F395ADF3A5BFFC1433C4FF0013FC57E3AD + 33E18783EDDA3B3B3FB7DBC975B6392CA069113CB8E58CF9FE61567F9FED2BB8 + AAE026D1BB85FF0084C3E23FC5ED42D6CFC4515D47AE5ABC96933ADECF733DAC + EE1101927BC72A729C10FE6E3F7840395DB5FC63FB4569BFB105E78A7C1BE09D + 3FC3D6D63E26BB48356D62E6F5E7BABEB35D8D2DB5BF0B1AC0F223A19132DF79 + B0BF205F8EFE3B7C5FD53E317C5FD4352D7E693CB37D24B0C368ECF1DA22905D + 56352B1E093966D9B72BB536200ABFABE47C2F4AACA4F0F4634E165CB27794DE + 893BABDB577D3EFD4E19CA397D46DD1B49B496B6766934DDD36B4D2EF7DDD9BD + 3EE01FB1AF877C0DA25D6BDE36F13587893C6DA8394D0B41B4D260D46E6E245E + 048C91FCCCBF3A800425000003C28AF91FE37FC2DB4BEF175BF9CA6F35299BCF + D425B613F9091BA97313C6C1A48E545DC0843B5768180412707C0BF1F27D304F + A3E9B6F36B56375285B99A54904F367E408D346FB962656C85DB8076FCADB483 + D0E9B7DE25D03E21B368FACEBF63670931DC596A121BB8A171F290C501F30AAE + D3BC46A53B60F27E8B2FCBB19809CE788ADCCDABABAE5565A2492D97C9EBBBD9 + 1D54F9715151A09D5E696AD59D9EFA5B592496F7BEEB666F7C37F87C9736ADA1 + DAEB9756BA0DC45124F6B704DC432303BA37911D44624576E1994EDDE792A083 + F52FC0AF8011DEF846C7C39E25B3D1EFBC342DA38ECB5486E57FD072AFB44BB4 + 078E404331DC08C02CB9046DABF0FF00C5F78D616D63A9685A35F7D8E41BE5B7 + B98946D50A4302B193F3658E719CE072CACABF57FC5BFDA07C0FE25F1C697AAF + C3DF08FD8F4D92DA06BC96091B4F293CA85A68222582B9468F9CA004B8E9C9AF + 89E20CD7135684E4ADEEB4EDCCB99B77F793D36B6B7EEB47D3DFCC3DB61A74D6 + 1F0EE529C649CD594636B28C5DDDE2DDF4E9A3D1EA52D07F622B8D37E0CE8BA8 + EA9242FA56A2DE7E91AA5B4BBDA206408AF3632ACAC8A557393894B1DA41C74D + E22FD83A46D6AF35A6FDF69B7D047A55FE49B531DE804A078DB39DA242CCC80E + E5DB860581AD0F867E22F13FC448F46BC6BAD6750B5D2D668F4C13989E38A58A + 3332DBB6D18669034EF2673B92DC96600815F417857C29ABCD67A15BDD5DDE5D + 68322C7247A75BCE1A183CC59095EDF2444AB8273B9D401B55573F97E659B421 + 8895B9F939745A5DCED152BE8EC93BCACBCB6BDCFC8B3EE2CCE3015A5ED2BC79 + 9B93692D2CDECBAA9592D7457BBB2B6BF0FC7E06D6FE13C7756371F6EB3BAD4A + D6EEEEEE6B95C8139DBBB7AA8C306DE08EA7233CF43D05A78463F03780ED7527 + 9E1D6354D49DADEE2E121DF6B69241B48C06F99541900CF1B8E47241C7D85F16 + 3E137FC2DBB1B8B38B49167AA5AD94D6FF006C333334CCF86F2E255C108B95C9 + DB800E01615F27E95F0E752D1EC2EB499A6B7D0E28247B8963BD126E36E37952 + 81B2589F9C9CF1D39C819F36AE26751734E49B7CADB8DECEEAF6BB57BAD9ADAE + B7B5AFEF647C5B4F36C3F34DAA728B4E71D1F32D6D66AEECB4B2B3D95EC717E1 + 4F1235EFC4A8F5C6D61AC6C2D53CB8A1B3558E27467CB905506E66F97E552777 + CA0900007D8BFE0A17FB44DD7C2EF86763E1CF867690F846DFC40C26BDBF785A + 1BABB8D9026D19194F9720BB7CCD82101F9987CFFF0010B49D3750F0958B6977 + 17D199EE7ED16ECA8C5AF381B9C0070ABB98918008C63E63927D213F664F1B7C + 67F102FF00C245A3F89353D3C69D0BDB6AA47D8347F29517EE972AE380C43487 + 9CF230411EB61A2D5455A2AF14BDE8F2A6ED17A795B9B7BBDCFA4CCB03957D73 + 0B99E6334A9D2E6BC2564A56B25A68A4D3BBD5BB3BD95EF6FCF9D7FE1FF88351 + D6EF6EEEB52F38C2CF30BE47F32E2D1F9C3C48465D87CA559CF018E73B43567B + 7C39D3B576B77F1D5CF8CBC6DA7E9F32C9685B534B08D368E7323248FC904F01 + 48248C8C73FA3B77E0CF85B6FE1B934BD5BC49A3C6B6FB81B9768A4B8B220820 + EE4CCB206C6461243DB8251D7E4FF88DAD7C3BF187C48B0F0FC9E25B8D72DB50 + BA8A1924D3AC99BC925B6AE146573B70C13019092A58B002BEE324E28C46365E + CE14DC547AA8B4EDDD3B69F26BE67B50C6E4B8E8D6957C1D46A29BB49CD46497 + 5BA5AF4DF55A5B4B33C535BF0B69336857171E0CF0ADA785F47B4C5BC97771E7 + 5C3993763FD75C4885DC003E503037642E1B9C1D2BE33DEF85356BE92D759D5A + 35D42CAE3499069A1ADDB580E36BC61189122B2EFC927827A961C7D99FF0504F + F8262F88BE01786AD7C61E08BAB3F147813560934DABDBCE3CEB405020CE770F + 2CAAAE1E33B8B139C60357C15E2BF875A958EB1345E5B6ACA80CCAD144F1A958 + CA8DDBDF1BB3DC00A4827071935FA0E053945D0C549EBD24EEFA6EDDEFDD1F07 + 5337CAF1F4638DCB30707D39973696E9CBCD7D3AA69FDD666AEA3FB467883C3F + F0F756D2743F114BA7F8675CB74B0D434DB98A19AD7CA52595FCB757DA51BF79 + E60024DDB5B7139AE07E0FEA1A2D9789EE3CCD4EC606F2D96150C61BA12AB965 + 09179722799B18EC50B8DEDCEDC97AE17E245FEAC279A1B3963658A5525A39A3 + 559F8657DDB97A860386DC7A103E6E78DD1AE5BC45A9069BFD16D635CF469F7C + 83853991FAB92776481F37CC3A15FB7C0E434D61E6E0F979B576B5DF6BDB56FF + 00AD0F85C6714456312A9413DB7725B595D393925A25BA7D2C8FA034FF000FEB + 967A8CBA7E8DE2E8758B3D52E05C4969A8DBC56323A919D9205DC247420630CA + 32370CB028BE4FE3CF841E2EF067C445D4B53D1ED63D2EC66F364B868D52CDDF + EE3EF963CB3FCC76ED525812DC64B13EDDE13F87D63E39F87D1EAD7536BDE1FD + 604122D96AFA1DC457AB29518026B71B245C6C600C8DCF254B8E0F8DFC52F889 + F13FE1DE8D6D65A85C5D5F69774C6E74FD4E5B7668EF3748C04CD24832B80A47 + 96E142088E01C966C725AF5E588953A2E17F864A4B95BEEE2E2B95BB7CD755A1 + 5C5181C1D3C3C6B49D49434945C5F372F6528C9B92577BFC2F469EA79AF8ACC7 + E1CB8964B3D3EDECE2B88A3D8B61030112E54990B337992AB832290DB80CAE76 + 9C11D26ABE12B8F0DE8B0CD14664B5762CF0DCC5F68650542E36ECCE704B6E50 + 00DAD9248E7D2BE03E9563F1844FA3EA16D63A85D5A33496466959B1B887F391 + 15B80A492570428760548F947B66ABFB01F89A2F02C11EA3A5FF00A33870972B + FBD16BF36F88C73A928C410AAAAC54E30A0EE602BBF32E2AC360EB470F897CB2 + 4ECEED7BC9ECD7A7CB5EA791438271F89C1ACC29352A734F92DA59A7AAB74BBD + B47F95BE5BF875E12D1BE25E9BAD68BA8DC5D4C214FED582DEF6F7CB5B196088 + 34A54BB8F34CB0A344147CCEFE5E0B6D28DC1F89AD6D3C1FAB4377A1D9C12476 + E86658BCD33885401912B679566F94907EF2EE5642A28F1769F7BF0FFC64DA35 + D2DD69FA947388A45B85749448AC55CA86603F854005B202FCD924B562DE7883 + 51D6AFB524B79AF02C3279F1C734C2346C6F62541C29D983D393B70A1472BF63 + 84A13E775613BC2493B74D74BF9DFBFCDEE7E718DC44791529C2D522ED7DDE9A + DBE5DBE4B621D4E59B52B3B3BE47B7B1BAB399E216B247B66863136F5E360572 + ACEC03B1662362E02A103ABBFD574CD43E044F316861BC8EFA384BC6DB5A345F + BADB71CA26D0C07CE40230783B16CDBC3D07C398EE33787C416B3ACEB1DC13F6 + 3D8E30B24792BB9FF84866656618C6C1C71BA4DAC3AB59EA11332FD9267678A3 + 3FBB63B41284AF240E46092470467B9EAD2B6AD38F24BEFB74F4ECCE2973516F + 552F691EF7B5D75ECFBAE87371BC7A16B90C8D24D34859564F2BE6C608E139C9 + E002AD9C1DCA3B66BACF89BE38FED9F15247A6DBB58E9F0699696A17CFF3D5DD + 2D523965DE429FDE4C65942E320C8146702B0F4FD31AD832CD0C7E4B15F35A48 + CC80AA942CFF0021C821770217048C77E9871EBF341E65C486393CE91A430C8B + B80DC5B2307B64FB124F7E6BD374E339A9F54ADF79E651C4CA845C365277F4B7 + E3AFE83F4F8E2F13EBD1EEF2E19A669A572542C60942C3000C050E08E9C0FA71 + BFF0E7C4FA6F847C571C9A9692B71A6DF3B94697023310DCA181C61C07439232 + 0EC207522B9FD2B4CFB4491DDAACD04303033B45097F2546D5DC092324B31E03 + 0C12BC838C49AB45FDA3AD2C31B06B7D34A5B46F0FCCA154E37027B927791C02 + CC78E49AD6A538D44E12DAC7351A93A6D5487C57BAF3DBA3F9FDE33C41A2DBCF + 7D711585C4F3C7012A3CD18314619C6D2790DC2C7820E327033D6A0B5D33FB4D + D9197CC11FCCCDCF201E99EBD3A1C03CFA019E9EFAC6DFC3DE1848E3B594CB73 + 1959F331387E7682A4E32A0804718CE79C2D735717BE45BEF62BE6282C104AA4 + 64E0852B9CE3BE79C9C0C77A29D47256415B0F1A6F9A76EED7A92695A8AE9F78 + AE2399A39488642A0F972263195E012DDC1E31B78E79AB135BE665F298C5E5A7 + EF7E7DDE5A0CAB7F08EBD0761800F6AA31C1269F7476B88D972A155B01DF9E01 + 208C1CF4C8CF35BBA06926D1D67B711C9B9C7921C7DE032C379001E5416C0619 + 1B7AE4292A597BC8BC3DE4BD9CFA7E06AFC59B65D17C71AB6990AACD3DACB1DA + 8650198B22AC45D4704E4A7000006EE0018A83C25F0C6FAEF5386D5AC7ED9717 + 8C9008522122A48FC2E173B99F24703A0E48C575DE10F0E59F8F7C517B7DAA5D + BE916FA94CF2DCDD3B9516C1A4072B1A82F2C8E7E558D177BF27B175BBE24D4B + 4DF00787A6B7B3916C26BA6685E4F33FE4136CD8568B0B9325DCABFEB4A12B14 + 64C60B36F11F97F5A6AD87A7F1595FFAFEBF157F6BEA2A6DE26B3F775B7A74D3 + B6DABD3D6CEDCC7C5286D6DA0B1D0B45921BE6B6699A79EDE32F1DE4A58EE78D + B04B2A105158F195620F401FA1FC194B38EF2EBC49AB68FE19D3F28D14B3389A + 79812DB76418638E186E200E063AFCD83A87C5083C35E547A00689A289144DB4 + 61B68FEEE491DCE4B679076E40238FD5F5ABBD7653757B753DD4B8C2F9CDBCAA + E4600C8C6324F038EBC0AE8A787AEE9A8465CABBDAF2D75F45F3BFA1CD5B1D83 + 8D475250F692564A37B4124ADAB5694BE4D77B9ED96D25AF872D1AF248E3BAB9 + 9003E498C0694E010381B87CC4641EFB71DB3F45FEC33FF050CF137EC27E3A87 + 5AD212D753D32EF0BA9D9DCC224DA40203452281B08C282A410707A1208F9D7E + 1AE857DF10BC4E2CECD1646979010A74C02A323200E9F2E08001E9D6BAAF1DF8 + 6A6F0BEA1169AC2449A390C4AC390CEC71BB8EFB467E898ECC1BE2F39C161317 + 196071894D4D6A9F6FD2DDCFBDC96AD5A74D4A9FBB16EDD357D6F76AEADBA7A7 + 43D5FF00684FDA4FFE1A03E2C6A7AC58E8717872CF53BA37115969C9B6485CB6 + F7F2D7A4618FCDC602B3B11E95DD7C16FD89BC7DF1D74C9356B7B1FEC1F0DC6C + 0CDA95D966DC0127059FE666EB851D71D000587B37FC12F7FE09EBA7F8BA69BC + 5DE3265B7D06C3F7B7ACE00F3DB6E4469B860390B9E400002C72BB55FEA2FDA2 + BF690D2F548ADB45D061874AD06C5C5ADAC3126E07240F95320C8C4907939CE3 + 272541FC833EE2BA7819C72CCA21771B2BBBB51FF37EA7ECDC2F80AB8CC4B850 + 85A2BF8952DB2FE54FF0B2D3D4FCCEF8C1FB012E8A64B85BA6B896256DA64465 + 24E304FDE2598FAA0E9C670B5F3378DBC1FF00F088CB710A5BB054DD34BBB6B8 + 0D9CAE1BA118073C7560318C67ECCFDA5FF6C8D12DB53934BD1DA3D46691C5B4 + F389C496EB8237979148F398020ED42B1020280E739F9AF5AB2BCD76DDB52D52 + 58D56E2D45C307D8DB98BED8E0E8B9E32F81C6D6200CAB57E83C278ECD654154 + CC767B27A3FB8E3F11B2CE197C9472C8A55B776776EFBDFB7E7AEA91DC7EC65F + 08EE3C6FE391B9264B9909B655656E61DA88FBC73C3160A00E0B6EE76A907E81 + FDB3A7D33E099B1F0969BF619BC450D98179385DDFD9A186E58A18F711E79F99 + 9B71EB2139C80D5D7FEC31E12D3BF666FD923C45F19B5E85989D44E95A1D9480 + 4A6E248FCD548914753E76DE149C9DD8EB8AF9A7F6F0D2F5EF85BA8368BE2ABE + B78FE21788EC575EF14DBFDA019348170DBE1B663B9BF7B24614B74FDDBC78DD + BF79F0A388966D9F4A37FDD526E36EF2495FE50BD9F7934BA9E6D171C0E4AA8D + 149D4926DED7B6F657EAD6BA6CAEFA1E77AB7ED0D3698D259E8A6158E162B75B + 02F9330DDB820462731827773932364E7690952CBE323E25D56C9DD6E96CF52B + B54BC9485BCBA924797198636606460A7764100650175DCB97E85FB09FC461E3 + 7D1FC1B0F87C5D78DB5EB586EE2F0E424FDB6C95E1FB42A4D1B6D093791FBC75 + 3F71082D86276FBA7EC53FB2D45F0DBE2DC7E22F88D66F6765E1D976456F2424 + 42668DF7B88DBA305C120AE412C39C60B7D3E6D9965980A12AF06A528ABA49FB + D26F6B7CF67B1E5E4392E7199578D19A718CACE4FA463ABFBDA4F4DDBF9B5F76 + 7FC1303C27A6EA67C2FA63787E6B7B7B39CCB34FE47FC4C2EDC005DE6C1776CE + 0ED52544632A33F3B1FA6BE347ECC5E2FF00DA2359B8F0668FF67FB3D980758D + 62F11A393F7BB99614F989509190BB02804C7B88E467E47FD917F6BDD0747F17 + C76761A5DC6B9A86A12AC91D9476C667500003CCC9C728C06D5DBB78C1396DBF + A09E24F8E9ADD9785B52D5BC55A7378774958D9E6D1B4E31BEA1772ED8BCB174 + FB8188B92018402DB701D9772AB7F26711C7174B3678DA91E5BEAAFDDBD347BE + EFFA47DB71456C76599A51AB94A8B828A8D37269DE49AF7A305AB7ABE8A3CDCA + E56B23E37F8E7FF04B3F03FC25F0C43E24BCD634FF00105F436D2B43BEF4BCA3 + 6F98865512302C0611810311F9521E40DCBF9EDFB497C09D2F47F195E695A159 + 7D9E2B065D85DE3DD01DA3CDDF290CF267195123C21460EC0700FA0FEDB9FB79 + 78C3F68FF883AFE91A85EEA5756FA7D82D8E9DA1DABBC569008240892CB1C5F2 + 3485848776CC46429080E14791F85754D427F03C975E26D7ADEC248EE4436F6D + 670C7773B29DEAA0EEDD820AB31766DCC41C96AFD9B8572FCD705858E2B1D5F9 + E6EDEEBBF5D55ACBA6B7B2B79D8E8C3C2AE29BC2E7751CE6F99B94631F76DA34 + E4F915FCEFAFA9E6FA359C769ACD840967A4D9468CAE25F306F6FB8C0B6DDC58 + 0CF7272189DC38C7BD7C22B397C37731C9696BA55C4AD36F58E5B389ED212BF2 + 81B5B95CF38041CEE2304E4D5FD02DAC7C67A47DA7568B485BBD3E58A4DF6C20 + 3E4A48AC59A4DBB15583ED201669097E49CE2BEADFD89FF676F07FC56BAD4342 + D6BE2068BE1BD724B763A5C7ABE943EC334878647B80EA55A319C2F073DFB1F5 + 732CDDE25AA0A2949E9ACB46F7F89D92F9D8FAAC8F2DC3E5186A998E26AFEEE3 + 6F860E4D2BDB58A4DE96D5DAC96B7691D27ED17F10BE1EFC5AF0CF80F58F01E9 + 56FE1BF16DE295D7F44B67FF00897C57288804900DA77C72B923A82BE58C8E94 + FF00D917F676F1A7ED39E24864B6B0FED2D2E3B965D47508756B681ACD8A3A2C + ED1390EECA92165CA9DC70727041F38D5BF67ED6B47D7F564D5AF3C376B0E8F7 + F35ACF2DCDD3869D564310B8851372955E18EDC10B938200AFAB3E13F85BC3FF + 00003F673D6AE3C35E3CD0BC47F113C437296B1DF59C3B2DEDA02C6561186286 + 6930189665203312475CFE719A66142AD59D49F2DF44ED250DB4693B3D5AD6D1 + 4F5D6CD5D9EB7106330F93E471C065151D4A9524A1094D4A7CBCF26DB94E3CB6 + 8C53566DDED15A49E87B15CFED23E03F80F3436BF0FF0047D13C41E24B1BB8D3 + 5B920FB4420CE0BC2268A260638C3B34A0146E11880ACAC0D7A87C37F8F9E31D + 4AE5535AF0C87B18EF25977C76A4622D9989C610052F92A4E171B8B1214951E1 + 5FB1FF008126D73556F135C3CB71ABCCFF00628EE8D885B359810F2CC5142F12 + 0770181E0330E7AD7DB9E15D26C7C2567676A42EC9623B9DD8B336090002FD00 + 03A76E99AF9FCA711986331338E1F12B0F4E16E6934945CA4E30578A494AFA29 + 4A4AF257BDDEFF00CB3C6F2CB30155E0FD93AD56DEF549CA4E57B74D9251D797 + 45DAD649BC2D63C3BA7DDE9B69A8D9ADAD8C37D23BDC146759E794F3B43AE372 + E14649E19540F7AF943F690B3B2B3D675BD666D6235B655021494957B69885C6 + E5F99C3103807EEF639C57D5FF00127C6D0F83B4496CA2FB419AEDF25ADD7708 + 43111A9238DC0330CE08C1DB9C0E6BE0BFDA2FE2AFDA753974B31E8F7135C191 + F55BFB6B958E192443C05DB9018E431CFCC77118E09AF378930F4678D853A2A2 + AA72A75143E18CDAB4ACB6574936ADA49F2F477E8F0BF0389C4635CE37E5DBA5 + F96F77BF92B6F7D95ACF4F19F12FF6A5BEB1A7C7A2B347677FB1DE696DA469A1 + 0E1897480862432AB306DA7A00AA4E456E7FC14B3F6ADD43E356AFA5F86F46D4 + 3C4D63E1CB046B386192292CD6F264C297742AA09246154A9C056385CD76DFB2 + FE9D1FC0BF116B3E2EF8B5650FF66DB5AB47A7696D14ECBAACA7732379A1FECE + 6158FCC53BF00B32E324807C4FE287EDC9A5F8CEDEFB47B5F857E17F0FE9619E + 453035C3491A919E1D9CAA2AB1F970A5705481838AF5701869457B6A32536B47 + 18B6AEBBB6E3CAEDD15FEE3FA4F2CA7F5ECF69D7A584FAC470AB4AAA508C39AA + 2576B9B5938D92BC745777B33E67D62E75CF0F5ACCEBAA491DD79C0CB1CBA79B + 88E750400ADB9860800E5718393919C05E4E3B2B84BA6BDB5F173DBBD99DF1D8 + D86951582290FB82B6D7507009C9C6E3BB8C12DBBDFF00E297ED51A278DB528E + EA1F07EA5A6DD5C7936F7005F41711DE4983FBCC948F242927688F202925DF15 + DEFEDB7FF04FB7F83BF043C37F10FC0ECFE24F0BF896DD21BD940569B46BB3BB + CC49154E197CCF313AFC8CB8C125597F40C9E58B941D4AB4791AB5F48BFBDDB6 + F34EE7BB9F67593E1DD0A799D1A94EB56725151AB26B995B9A31B371BBDD6BAA + 5B3BA4FCC349FDB1FC4907C28F1778323D7B526F0FF8874F695B4BBA613DB473 + 165C8DAE0323B364F9B11504211B49C13E05E21D7B47B6D0F4B86F3C4177AE58 + AAC91DF696D6FE4DCC53851B584B200BE492480BDB27726597779EF8EADB52B2 + BEB890B7931A4864200F337B11B813B5F39054104F009C0EC6BCBF5FF8D7A879 + B1C735E5DD9F93809390DB9C0701543601C30460439C11C9C630DF6F83C96789 + 6A7095D2B69DB4B6F66F6ECD347E478ECE32CCB94FEAF4A5073776DF2372D6ED + BE5504FE69DD697491EF1E39454F0AE8B6771E2BFEC98F5C8DDADA48FC3EB94B + 55466DB2CF6EA1659369C2ED2AAA1C8240F957C47C6BE1EB1B7F1569FA1D95ED + D79B32B31B9891A466C890A9631A86E0ED1FC672E7010A80BE83F0BFC6BE23F8 + 91E166B7BAD725B48DEDFF0073792C2C6CBCB0C424571E402A002ADCBEDDA57F + 880AD5F88DE2FBEF871E05BFB8D77C29E15D6A4B211DA5AEABA6CCB227924B1C + ACAB82A5F72A85201C17C027EE76E06A55C1D7F61A395DE89A576F66BDD57B75 + 57BE87879C6068E2F0DF5D8C9FB2B2777CD2B25AB8CA2A4DC6FBDD2B5AD66788 + F856FB57F0CDDC3E1FFED692DE469A648EE2E6DCEE8B038C239CA16C0C019C6D + E71906B55BC6127837E20C96FE2059AFAC646586EADCCE45B4F1842C15E300B3 + 6D75046082A72464815DD7C375F0AF8F618D353D4F49D1752B02AB63A8C93941 + 1866C16DEAC0BB30217E6CBE00E3209AFADFC57FF04C1B7F8F3F0E34F4D2F5CD + 2758D61A05BE824D36DD2E1A22C9F3192155429148181C16254E1940DC419CE3 + 8B32FCBF10A39827052BA6ECD6BFCCA495BF1BDF647160F85719572F588C3D58 + 4A3BC5732D97D9926FDDD6F672DD5B5DEDF06FC52F14F847C47AC5AFF64DB6A1 + F65B59DA2B2892DBEC79806CD91346AC5032603055DCC793B98B00DF717EC39F + F050D5F87FA3E85A1FC518F5ED5FC17C5B4B6C8A6D6D74CB70A104849E1803B8 + 10082AAAA773039AF09F1AFF00C12AFE25FC196B79B5AF0ECFA8E996EEAF05E5 + B965497E4008DB3A83192011920264B7CC73C71DF14FC6D3F807C29269F671FD + B61B0B854BBB3BE915660ABF7BCC58DF68D8CBBB7A6D007CC41C7CBC79AD1C9F + 88B0B0C0E1E6AB46FF001292BC6FD53DD3F5B6BA3D0E6C053C6E5AEAE37131E4 + 8C96C968DA5AD9A77BAE8E2EEBA1FADBFB79FF00C116BC0BFB547C2887C69E08 + 4F2EF66B41A9D85D4307DA669E3640E81E4C933C678208CB0E0AB6060FE107C7 + EF839AC7C24F88B369BAB5ABE9AD1A791791CBFEAA55F997702005F28AE36B02 + 42EEC001949AFAFF00F60AFF0082B77C4AFF00827578B74DB18EE16F3E1ADECA + 3FB4BC277E8D8B12DB099AD8B957B7E1B7F9790A77E36FCA597EA5FF0082A67C + 07F087FC1407E0B69FF1C3E0C0B1B9B19A34FEDCB09422C96E1B869E20B968DB + 9CC8A006603705FBC0FCDF09E2B3BE0ECC29E599BD4F6D83A9A53AADFC2FF965 + A68DF6BB57D9B3E6F15839E6F42AAADEFD58B4D4D6EFFBB35BB6FECCBAFC32D5 + A3F213C417917895E4D2F4A3269D242B34491215696751197F2CB60061F22B64 + 93F78118C96AE474FD2BCFBFB6749649649B6796632DF29DC4E490D85FA9206D + 39CE5891E8FAD697E1DF86FE25B2F0F5AD95D5CF89349D4924BEBA337976F020 + 7CA85C9259B05B2E73F805C54FFB22782A4F1BF8FEEE691636B2B0B66B99A788 + 2AAC2155A670CCC0B6E3B76F2C3048C6EEA3F7C96610C3E1278849A825757DDD + EFAF7D7468F8BC2E495B1D98D1C1269CE52E576D546D6BA7D2EB5BF4D0E1BE2D + DAB68314D0BF996CF22853146083B571BB2A71B72A5481FEC8030320F3D61612 + 4B6968FF006586658DBCD2E13E531AF0738273CA2B74C0E738190777E2A6A63C + 4FE25B8B8B4BA86F156E1EDAD258D55488F7615B254654ED381C6D2C79E84D0F + 06C9797304EB3347F66B74672625564B701D43B31E8DC361550E49917A0201F5 + 30DCD1C3A72DFA9E2E37D94B1D38C3E1D52F45FE66C78D357F0EDD782BC3F6F6 + FA3343ABC568CB7724329DD24401FDE326E3861B1481850CBBB3B4104F2BE16B + 6B1FF849A49248E5B7D25642E9BCE1D94F29C93839C29247AF04039AA5AFBCD2 + DD493BFCAD78E648CCAFE6385CE724E327AFA024863E9534ED18B768EDD0AB3F + 2BB55B681B890338070D92001CF5E4E703A29D1E5872A6F5F3EEEFF81CB52BB9 + D5552497BB6E8B5B6DF7DAECB3E2EF182EBF76C2CED843A2DBB6561C70E03120 + 938201278273939EFC01CDC3A6FF00684EA4C8ACC7E660AE0F638E00E318E73F + D466E4F693DB436FF3C7E4CF18D8C1036FC364FD0E49E99E7AF15D44DE03D1F4 + 7F0B59EA177ADD82DE6A5712C6DA5D92C92EA1610A6079B20751126E2CDB57CC + 2E4212422952FA73428C6CBE5D4C630A98AABCD3F57D17925F92473FA169EFA8 + EAF15AF98B6ED24A9B5DBD33D830048048E0606013C62BDBBE26DC785FC3FF00 + 0D7C3B226BD18D4A6320BAB07D39E0BAB7543FBB639CF99191CA9C9E53E6EA14 + F96DE7C61B7F026BDAA1F05E9634BB1BE46822935610EA3A842878DCB218C245 + 271F2B468AC81880E7963C0DCEA336A3A849757134B34D336E924725D9C93C92 + 49E7F135CD5B053C44E33937151D6DA5DE9B3D1DBE4CDA8E634F0909C2294E52 + D2EEE92B3DD6AAFF00348EF356F8EB259A5BC5A2DAAD9FD8FF00D44F2ED768D8 + 647988A000B2107058EE200017680057177BAADD6B576D2CD35C5CCD226C6777 + 67603AE073D0018C7402A17B6DC4FCADF336179C85F6E99E9F8FE5CDCB6805BC + 0D26E5F4FA1C7EA78F5C576C69D3A4BDC5A9E7CAA57C43B547A2E9D17C881CFE + EBFD634CDD64EADD7EBDFB5436F01BC46C37CDBB014F451F5F4E829ED2626F94 + F962565230FD0FBFB8CFF3A743A9794FB56DD6439E0B286273EB9073D4F1DFF0 + 15B6A72C9A6F53F5DFF621FD853E1CD8FEC890F8E7E2778F63F08AEDF3D2DB4B + B58A469C8CA859669DC00BC7FAB0802F232DD07CD7A4CBA4F8FF00F684BC9AC6 + F87FC23B6778C6DE47B68E169151B05D962F94F1903AFCCFD4E6BE78F16FC4FB + 8F11E876B1CD34979F614F250DD3F164AA0E157702028C80154282587A8C6AF8 + 13E217FC22BA743E444F13C257866C1937301B4E31C06DA7938242E47071F94D + 3E19C6D19D7C5D6AEE72AADDA364A3057D9757D3567ECF1E24C2D59C30D87A7C + B18DB56F576496EA2B47ABD5C9DFA9FA5DE25FDB1ECF49F0347A0E9F27D8747D + 160DA63593E69DD88FBFD0176600B107682000422201F1A7ED39FB785F25C2E9 + FA3C85037CF7B73093C215388A32792A73963805812BF2AB3AD78EEB5F176EAE + A0BC876E6410BC8A87EEC8D26C0324E7A076E06414F94F079E03C49771EB3AA0 + 50CCD98E12792558EC4CB1CE4F2DC9FA0C7159F0FF0000E0F0B5FEB3888F337A + EBF9B3E973AF12B12B2C595653FBB8C746D6F393BB936FF05D95FBDCF63D6EEE + 3B1BD76B38EDE1B6B8659A07886480E11838E4E003919F4E3B607AF780BE065C + F8ABF647D73C78B348DE2BB7D712DB4FD2C0F31BEC36B633DCDF5F4B1E721636 + 96D3CB3D0932025B2057856876326B9E17D3EDA0B8864B9B6B550240C1B032C0 + 641200C7CCBD8008319CF1F4A7FC134AFBFB7FC43E22F86F6B6DE66B1F116D22 + F0CC37EEAC174CB112A6A17F315240F2FCAB150CC0A9DBB87CC0B635CEA53C36 + 165529BFE1B4DFF85357EAB4B6AFCAE919E0EBC6BCE1392E5525BBB257EAAED3 + F87A5BEF3E8FF85BF18745F82C9F0FF48F115BB6A163F02F479B535B254496DE + 5BF121924BC2A49CCA03C515B82302E6EE2919B3034727E78DCFC66D5BE237ED + 19AA7C40D7D61D5FC59AC6A92EBD78F7B1AB5B7DA65937468911E1E24728A13E + EAC71E36ED18AFA1BE27CDAB7C6CF887E341A4ACD2AF8A35B8ED61853E4F36DA + 07C5B46CC000CAD3B46EC3A66D53249208EC3E107ECB5AA7ECD1E26F1F7877C7 + 5F0FFC23AC7883C45A6B69F6115D169351F0F5F190324B6F184638D8245E8015 + 910AC83907E6729C660B2BC3D4AB59A752A2BB57B3D5F34BF1936FE5E47DA669 + C1B8DCCF1746AE5B4EEAEED6D5D9349BB3E89D9B7ADAEDF53CF7F648F0C7C529 + 7C5BAC788F5EB5F1A43A6DE6967C47E21BC92C9AD6E2EF469E75596E61965DA5 + D2E6468C3C89C3831292632E95F5EF83BE237C63F0B4B6FE1DD5BE1DC9AFC2B7 + 2FA42E8F77A6C771636A7ED5144F6504418855F36E6D0492712CF35C15326DF3 + 437C57F137C7DF137C35A259C5E2BD435C8EDF4BD2E2F0CE9F0090AAA69D14C2 + 716E42E37AB4AA8C43E4B158C63E518F48F18B6B7E00FD94B44F196ABAF6B5FD + A5AD6B0608C1BE742F1C522DCDDCE5B05B092380197A3B871931E0F367783963 + 6A42A3F6769BE58A49BDBB34D6BBDFD15B6B9CFC3752A606A56A58E52BD15CD2 + 55135BED6BD9A6EEDA7DB54D6E7D85E2AFDBCDBF669F863A8DFDA68FE09F09F8 + 8AF92DB6693E18B285EEE68EE22DC5AEEF720C032E58AC6159C4808D81F0BF5D + 7FC13642F8B3E18EB5E2FD726B7D45ACA5F2ECAD5110C7E6FCCAA5507CABFDC4 + 5E31B9C9C6EAFC1EF00F89B54F186832F86E1D363BABCD425816CD0C994CEFF2 + F61C0382032E572092BD71B73FB79FB327832FBF67CF84571F0DC5EC3772EA12 + 4465915B1E6BCCAB298A33D798C92CDD555C6482735F8DF8AD9251CBF011C3C1 + AF6B297DF15CB77D6C95FAB6F7D4EAC662E3996595A1868287B4707CD6B4B963 + 25CC937AB4A2D5DB7D559DAD6F843F6BFF0008E8BF0AB57D42C34B6B3B1D6358 + BC9E496FADD23925961C192350ADD10E7767A9CE4E0609F97346F849E2AF88D2 + DB9D3B5237D1DE0FB558DD4C599120491D01DAAAC47EF239023202C5B7E3255A + BF487F6FCF82B67FF0CEFA978EAFAC5753B3D73581241291B56E42B2EF6CF1B2 + 22B1E3A8DC11F03819F89BC3FA5EA5E19F11EBDA9EB7F6B8FC37A8452DCE9FA3 + B37D9AEEEA6C29821964DF9542163578C647010000F3F61C139D2A995B9D177A + 89D9B959DDAB68BAE89ECDA565AB3EC31D2A7993A73AAE52A30D1A85D72CB693 + 96BCA9735D3D1CAEED6E871BE18F807E2BBAF17431DDDD5F2D9AB89646650BE6 + 100F51F2FCC476382508381BB35F657ECE7FB1878DBC7FE12D6751F0DE9FAFEB + 0FA7C8B0DEA697600309303E532B1511FCA3242F1D7240AF9DFC3FFB5669BE17 + D1A3B7B7825F3AE2D7ED10410169638AE03B111C6BB40F2D7CD6264C966253E6 + DA38FA97F66CF8F5F10F43BEF33C1B1EBDA4AAC68AF0DADC7D931F21CB5C2ABE + D6DA09650C39C93B78E3AB38C6633DA45E329DA1B6964DF9EB7EA7AD94D7A54B + 0D3FEC2945D6BA95EAB6E315BEAF4B689D9EE9BDAF6347F67FFD8EB5FF008A1E + 189F58BCB86D03424D86EB59D72E4A2D982769FDC9C36D241F9990212830457D + 25E2EB3F04DE7C38F87BE0FD15AEB52D23C317F34635E90ECB5D62E5961732C4 + 23DF1EE0000A1998C608DDB7EF578BFC1FF84DE3EFDABFC43A8C367AD5CDEDC5 + BC8D25C4F731B5BC56FBD8077E846D723187632308F76C5CAE7EA2F10F87E5F8 + 71F0D74EF00E876327889BC325353BAD5AD0C53DD81248C2E14438F2E10032A2 + E2491C8E480A09AFC6F36CDAA467568CEB454B4F76D6695FA369D9BBEAF4D2EA + F76D4BC3E34CFAAD5CC28C6AE254EA464DAA70BC5534E0E3CF29495E4FDE4A2A + D14D49B50D2E7A37ECE3731786DF47B5BCBCBABABE98CAA7ECA58C1096C160DB + 865D4330018E3E66C7435F405E4B6BAF69474DBE98D9CDB88B69B0CEEA7192C4 + 30E83B7500608F6F96747697517BCD3FC2FB21FECB69E6B52EA4DE4B214184B6 + E5511428625307E6527866AF58F869F1A34DF1E58345A8497567AE69B1234F6D + 24A00192E40239DEF888F4E07254D7CE6479DCF0AAAC1C6328CD3E78CD3E5947 + 7E57669A6DA4E2D5AD24B55BAFE75E29CAEAD6ACF1B1BDD6AEDBC6EEE9B56D9D + FD3E672BF123F65DF1B78A358B5874EF1542DA6DEDC5D46F89DB72C0F9083064 + 058C673950D97DA41C6307C97FE18BBC21E13F07BC7E32D53C3FE21D7B41826B + BD3B4ED36FA4B2BFBFB64471244A3277316493E6880718607BE3D1BE3A43E2AD + 0B4FB8F31FECB1B4697B1BA48935C451C45DF706CEF0E54C8C8AC46E28CA9B70 + 58FC71F1CAEB5AF17EAE185BFDBA781A7BCB3F3D5ACDF6B4BB8C51BECC48C19B + CC279064926FBAA12BEA72D78655396342549A5792727EEF3463CB25EEC5A77B + BF7AE9C5A4D36AE7E89C1385CDB1F4E34618D8D3A7D5C2294B4BBD64ACF5BF2B + B35657D7442FED3FFB7DDBFC5C4BAF0EFF00C2BBF075E782DADC1B19ED6296CA + F218CA23A37EE9F6AB286560AE8FCBAFDDCB0AF9762D0749F14E89A6DAE9BAB5 + D43AA5D6E430B8C399A56CAC7B4E37AB1C9014904B1239DC076DA9FC24D4BC45 + F0CF52F1159F8375A6D13C3663FED9BA9E445B75FB449E52A312036E3B50762A + 00EA300F05E0DF14DAFC36F8A1A0F8A16E34F75D25D6E20B7BE87CC58AE01DC8 + EE0027CC38661B41C9424AF191FA16170D3AAD39369CB5E6B2F7ADA6BD1F96DD + BA24BFA6725A796E45964E9E4EACE93F7973DD73A4D2E74DC92E64D395926934 + ECD591C4F8CBC050F84EE350D2FC4DA3B5ADC69A5A168DD3635A4E31B95BE5E3 + 6FA0278E790A71D5DD7ED57AF69FF03B5DF05E89AC3DC78735F749EE749B995A + E7CDD9B774CA8C33B805E0A0070155CEC402BD23FE0AE9F11FC2FF00B4E7C67D + 2FE227C3DB8F2AF356D1A01AE59C1223C965A8C4A437CB824B04550597875456 + 041EBF9E5E20F132F85EF9842F25D5C2C80BB00BB914FDD2579000E4E38DBCE7 + 39C57DF6072D75652A74AA7359DBC9A5EB6B27B9F9CE61C54B1784A58ACDB031 + A727AB5B5A6B469C6CA3CF16DF2BB5D277BEBA7ACF8AF541E3B115BFDA96E96E + 0C76F676E23786DEEB2AC4C536D657DCA78DC3819C807396F39F8A5E0AB5975B + BDF22E3C36BA7E92CFF688ED8B4B2EEC65957CC6DECA07791817607AF53CAF84 + 3E355CD8F8A63FDF0B80D323BDA8459A1CAFCC731BFCB9603A9209EE7A57A15E + 6A8BA9AC3AB69B671EADE442E27D32F67821BA4E719F3180670C1491C1C60824 + 84527D9583AD97D449FC36D3A2BBEFB25EBB5CF92C462F0D9DA9CA92BCEFAC6C + DBE54FA6B2724BAC55E56E9BB3C7FC2FACDE787757B7D4F47D59B4B4B792E633 + 2DAC9FBE400287F9B83B76ED0581607E41D315DB45A96B1E30F06596AAD26A17 + 8B76C04F2C3A898E550AB36E500838386DBF3F0492802AF22F78AFE2A68561E2 + F5D060D0C692B6F0AC9FBB95A68A59028F3088A463B989CE1B3BF1800E4E5BDA + 3F649F09FC37F11F891B476D7B508D844AC9A59B39A4DB3654040C480CE77329 + 52486129F7AE8CE335587C3FD72A517A2BDEDCDEEF9B5F83BEE789C3F924AB56 + A985A38A8DA3EEB5769F3BFE58C95DECEE92BDBA336BF665FD93E3FDA66D2D75 + 2B8D3F52D1347D1DCFD9EDE231DCA4F3E4B93126C1B53648A093C31CE36A908B + F4F784BE17E95F0274D9AFB4DD6358B4D4A37330861FDD195F23977DEB927BFC + BC127A64E7EA8FD9C3FE09A90783FC0562BF624B7DF10315A4F773C76F689D70 + B108B68EB9E58E3D4F5ACBFDA77E02F882FF00E126B5A4F846C74DD5B54D3E22 + 1245B1B69F79FEE89C32C91961F28120D84E3D715FCC19C71E4336C7FD5E152D + 45CAC93764937D5BBDFCCFB1C9789B27C257FAAD19A93D15495A2AFD1DB46ADD + 12B47F57F369FF0082FCE97A25E47E13F897F0B7C37E22F0EACCB6B7579A65F9 + 3770631B4C90B2B12E406607CC52541AE17F683F813FB3D7ED8310F1B7C2BF1F + 5C693E5CCD24DA0EB89E5C93FCB921666DEF1E0827E70E7271951935F13FED35 + FB23F8FBE1BEB1A5E9F73E1F92C5DC4EF776CE1D4F9CEF96DE77040A3801C01D + 17241EB57C39A25BF85FC257D6DA7EA372BE21D2EF214B6D36CAD0F211080E85 + 82C720600C6CA7E5DCCA738620FEC783E05CA30D4E9E6190D774A6F47CAF9A0D + 5ECDCA32E64979AB248F8FCA68D379956C262694A145A72518DFDE924A6928C9 + B8B6D689C6D2BB49BB36717F19BE14F88742F8A9E23BEF144D71771DD3891AE6 + E9A38CCF22B6634C0C30250B0C95E1490BB8B003D77E117ED0579FB2B788340F + 0CEB77B6F6916B16A7ED371A7CCD2476E5D617809F29B6F92D1BA868C090A30C + 046656C7D3BFB31FEC227F685F82779E34F17C36B34F25D47A2C7616511B5598 + 93F34F2A90144C06541450A437462401D1F827F614F84FA47C54D02DFC45A25C + 25BE93736F712BCBF346E80AAB45CB1DAA72338E0E17B002BA335F1032AA9096 + 071B1753D926A4A095B9946DEEEBD1F656DBB1F4990F0CE2301571988CBAA24E + 56BC66B9E692A91AAD4A3AA6DAF76D7D399D9DF55F9CDFB4EFC3F56F1C6A5AF6 + 9B636D77E75E4963218E579ED5E59211B36C8D81216E40E48FBABC81C64FC6CB + FBAFD9F3E136A7E048B58D2F5AD73C4323DB4F7BA64BBAC61D36338CC5808079 + B246CB90A01556EA1D58FEC87ED8FE3FF87F37C51BAD321D174B8BC27A03D9F8 + 774F82D618D6DE6B95855BE50C36B3905940556C24258E0B1AC5B2FF00820B7C + 17F8B1A66A3F10FC49AD49E14D2D6D2DE59A545F3E4B77F2C60389B729902BA2 + AAAAF2C0617206EC32DF17B054B0F8679D519C21A38A4B9DC9AB72A76D7DDDDD + 9357B6F63E5338E1A8E07055334C3CD53AB898F2D9C5DE1ED2CE4A2A3CCDCE51 + 6A3AA56E693BDCFC39D2BE285E782743D1E4F0FC2B0DCD8C8F334D204997CD60 + BBB2BD08C1550081C9C000E7327C44F1E5E78C6E2F6DEE59B54D5B56B80753BA + B7548CDE323FCB1613236A0EE14EE623764C68D5F5A7C77FD80754F879F15ED7 + C9F13EB1A7FC3717734035EBEB345B98FCA56750D6F98A35079C331D91804B15 + E14796D87C60F84FFB2DE888B676B0FC5AF1D6D2048B1793A358B65B3BA6C069 + F1BB0446BB1FFBE07DEFD9B09C4583C5D38E272EA6EB4E5AAE5DF577B4E4D251 + 49EAD3775D9BB1F9A62B84F198594A966D5961E8C524DCADAB514BF7708B729C + 9A7BA4FADE48F35FF866ABEB3D09B5CD7596CF4EB88729E629569642DB542B70 + 3EE8DC0A82098C803D38DF12EBDA6D8BCD6FB6DDE157CA25B0DC00CE54160DB5 + 412031C658743CE45687C5BF8DDE2EF8D5E216D4BC4533CAF37EEE3B5B4DB15B + C4A71C2A608E9C0C9E071D062B83B5D31259FEF8DC1422ABAE40047539EDCF5E + C7A7635F4D81A58870F698C92E6ED1D9795FAFAD8F91CDAB611557432DA6D47B + CFE27E76E9E4AFA04BE26BA6955ADD574F55DD83196DCE48C7DE273C8C2E0614 + 8ED50DC4CB661727336F23685DA533CF03F4C5741A2FC36BAD77C1DA96B7E743 + 0DAE926359B214B319182011A8E5B0194F61C719EDCF3693344FE66008D7E524 + 4814B639E3A1E9C8FA75AF4A13A726D45EDA3FF23C3952AF04A4D3D755E9DCA9 + 76C67999A453F74952067F5EFDF9F6A85D434BB769DAD8E01E79E6BA4F0DF84E + EBE20EB6D616AB0EE862F30EC6F92340093CFA0C939EBC75EF5937BA53584EEB + 1AF99E5929BB195623D3EB8EB5A46A46FC8B738EB519A5CEF6EFE7D46AC6203B + 4BEE655208C671EBDBFCFB53AE2E5A3B611C58775218903708F39EFEE4FF0093 + 50C3A7B5C6E92691577723E52CC4E7FF00AC4F351CBBA239E49C0F989FF3E9D3 + DAAB953612A9251D15AE4721DCA4B10589CF1803FCFB0A912CE4BC4DB1ED91B3 + B428EA7BF00F3F95464B4877328E081B801B47E43DAAD59AB29DB0B0F3245D84 + 67E5393D3D3181DFD2A9BEA73C637D1EC7AAFC26F0DD8F8E3C4D0DBDE49F67B7 + 843CAF1A6C2C591581FBC7EF1C139C77ED92D5D2FC7CF85379F09BC4F6304D66 + D1C7AC5926A304B1C6EC8D0C990920254168C80595C001B8D836904DBFF82795 + E786EC7F6B1F0C69FE318239F41D52E85ADF2963F3C2655791370071E62C6F1E + 78C0918E580C1EF3FE0A79FB465C7ED3DFB6E78CBC4362B0C3A1DB5D8D374C48 + ADFF0074D140DE5E63E07CA76E53041116CE8578F8BC462713FDB2B0B08BF67E + CDC9B7B5EF649776F5BF64BCCFD3B0787A2F2678A7F1B9F2AB5AF749377ECADA + DF4D6CB77A7CF9246B796B34DFBE96668C120A2C721C100AECC903E42BFF007C + 7715992CEA5D6D7CE78D4A6D691CEE3273C601EF8E31D49518E981B7A56A535D + 79933EF56986146C2AA80871B4F3C0C16E8738C900F35CBB44A91B4122325C2A + C8ACA58AAF560796EBD38E49EDC92057BD463AB4CF1719594611952D1BFC6D6D + 3CAFBFC8E93C17E38FB35F7D9DA4686DA40239073261700939278C6093D318C8 + 208CD7D27FB18FC6E9BE127C5BBFD5ADE0825BFBDD2350D34C6D9F3525BD8840 + 5D0E080BE5BC83391C6EC63773F2AF88B47FECDD2EC2EADE4DB0C89CFF007E27 + CB09048324E3856E84ED75CD7AFF00EC75E23D26CBE3D781CEB98FEC9875AB09 + 6E1C618DBC22745756E79531B3E01CF180318DB5E2711E02956C0D576BA71775 + DFFE1CF7384F36AD1C6D3C3D5B3D55AFD9F45D0FB0344F85FACEA9E2CF1C69B7 + FE5D9E8BF0C6F2E22D724FB5242D7134724CB1DB46A597717901E1324E7217D3 + EBEF0DFC48F87FFB047ECC2FAB6AD7505E7C4AF14D986D7358B83F689340B590 + 284B1809CE277006E3D541C74C63F3D7E2EAF88FC77FB40FC56F1259CD656B67 + E19D5EF3C537ECD3C6902CD2DE9310C961E63319B6A2A6EDC594E39C8F27F8E9 + F147C45F102F63B3D7F5092E1637694467E66F37680C318E84AB727EE86239C6 + 2BF1EC47084F379528D4ABCB4DDA534BE27A276DBADEEFA6DDB5FE92C7F1A61F + 0796BC3574ED06B9629DA33B27A4E57BFB3535AC7ED38A4F4BDFEA0F8F536B5F + 197C49A95B8B78E5B3D2E392F63B2D38ED8E258A408CD23B7CD2B92EB8007CC5 + 8632735D2FEDCBE35F0BF843E19783748B55B5D424D06CE0F0BDBD9CAB24915A + C7696F19BEB9640CBBAE2EAFE72A0B617659E093B881E77FB23FC4DD1BC5FF00 + 107E1EEAD36AB258FD8D9F42D72E248CB4CD6DF673148601B5B6CF2412322CAC + 0B2C8C24C0C9C7B7FC1DFD9DB56FDA57E322DC2DE2D9BE9E2E352D4B53B895A1 + 8749532B4B313804EC5927D8A88373BB8030CCC6B9711528652E9C310B961493 + D36D755F8DB7DDDF5DCFA2CBF071CFE9E27349575154E2A4A6F5859AD23A2B3B + 6AAC95EEEDBBBBF0BFD8C7C47A1E8FF1266D6A4D3ED6D97C2FABC4A88C81E52C + 8825918B328DCECA768C6482BC161D3D0A2FDB1FC45F117F683F14EB9A1EB571 + 7091AC8D24770D2C76D676CD8122C3B772A858E32A791B8B01DC9ACAFDA7BF67 + 34F8551F883C41E19D52EE4B59AE16F648D2D1628EE642F88FCB50DB8839C9D9 + B946D0431C063C0FC32F87CEDE32D3A6B0D4749B03E32568AF2D6CAECE70F912 + C47E4231C92769DABFBB0096C915529E5798C6A669F15E3CA93D6D64A524EFAE + BADAC7933C2E7385AF83C052A49CA376E492519A937CB64ECA295E319464AFB6 + 8DB57FDEDF830DA37C62FD80743FB7471EA9A78B5135B79D1FCA5AD642D17CA7 + 190BE577C7423A60D7E42FEDAFE18BE87E306BD75E26F0CD86836F677B1C93EA + F3B869618EE1031645550422C6E11E30AFCB00BB8FCA3F43AFFF006FDF017C0E + D497E10D9C6BA6E8BE1BD3EDF48D2EF8294B4BEBB58C6761FA8B863B8E59957B + 7DFF0039FDBA7E05E83E24F0C6A9F143C63AE45A6E871DB456FE1E8EFA531C5A + D17DB2C924A9952D185DE500F99B76403B14D7E0BC1D8CAD94E6CE789A728D3A + D774F7BDA4D35CA969777D77B755A1F1B9152C461AB62238A4A9D3C4CDCA1CDA + ABC9A6972F4B26A525A34A37D1277F95349F809E05D4350D02E9B4FF00EC7D1E + 3B58AE6D208EF13ED57113ED45BC9631965462E4AA64B3B7FCF304AA7D27FB3F + FED191FC0F9BED1A2DBE8FA9DE59C526952417B6B14F682500399664F9774A1B + 780E1B8545504AE59BE4AF09FC3F5F897A36B3AEDEF8BAC61B18D25B1D397FB3 + 96C67D5B02390C712E5A4D90A4887610CAA5D9C948C1917E85FD8FBE1F697F0A + B47B78758B8D3757920DB791186576B7791F7190CC0C64CA856271C9DAECF956 + 6038FBECEE5ECA9AACEB4A538356567A7CDEADF57EBF23EE632A788A32A35E8A + 9526AED269393D2C9462F5DD26F9B44B46CFA0BC45F1CFC4DF10BC7D3DCF862F + 7C35A0EABE269C3C16D6CCDA7867CAC72DC16C7EEB7C9840C5BCD95BEE215CB2 + 7B97ECFDF09BC49F053C35AD7893C62B0EA1AEDFCE1AE46A5771A45696EAE4B4 + E654590C971B59B6EE2146146E5CB1AE6F4AF8CDA0FC5CD46CB57F06F836E340 + BED0EFDAD9F55B8D422910C090334B33A92A998D048A8EC48419C94DD8ACB83C + 45F123F692F1469F6BFD9DACE9DE04B8BB3710EA86D5AE964850A98A78F707CE + 7702864405861C7CA430FC9B3A551E2270A538B5BCE76BBBBD6CAE93BAF257BA + 6D69667E699946BD7A2F032A74F0D4D24EA29B8FB44A3F0C6F16DBBA57B6EDDD + 592D0DFB9F106A7E13F002DAD86937DA66AFAD5DC927993DD092E24B16943307 + 990111C9B4EDC70557230182679DF8B10697F0DB4EF0EEADA3EBF0D8470B416C + 2DEE55E46BA7C4610965567DA91C9364138DC403F2902BD87E34EAF6DF0E2C3C + 3DA7683E19B8BBF105CB1B3D161B49FCA9121099B9BA9B7ED5FDD8919B326F0C + EF8382E6BE6FF8D1A72DEFC57BED4349B7BE8FC3DA38367710DF42FE641E549C + 088B1C2169402A368119C295524AD79D91F2D5ADCD2768EAEFFCDD2DABBA5DAF + D53D4CF85E4B1B5635251F67097349ECF9F5E5517CCE4D2D945BFB4A493BA31A + FBF6B4D4743B5D0F46D72F21935067B8C3BDD279CE619FCDB694C9924C1955C8 + 19DB96DB824E395FDA3FF6C0B8F8F9A559F8DE68E182CFC2FE5E9575A5D983C4 + 311919CE30DE54AC5D8EE047CA7A12AB9E23FE0A3DAF787743BDD52F344B76D4 + 35C874F8E251E7F9025B69654BF5B868970CA576889B1D5A29881962D5F36CDE + 21D4BC47E15D626D3F4E9ACED7C55A5379105C29682F67D8CB182E8AADB99B6E + 03321C90412C78FD8F21CA555C1AAF49F2AA8D7327657DF4EFB3BAF349F447EA + 595E539642853CD5D0E4A9AC92B6D195F9AC977DB64D592563E92D63FE0A1B73 + A17ECF7E25F867A95AE97E21B6F1741A76DD53CB564BD831E7042383E61478DF + 0C011871F7B35F1DFC62F0858F83E38F5DF0BCB796D6D3A2CF2DAC80CEBB8618 + 0DAE499070C4860578207DE02BC5EEBC63AB49F0FF00479AEA74FECDD6CCC504 + F1AC211E36D87748A33FF2D38527030DEA05618F89137855E358E79AE166C9B8 + 84CCB365D3259D36F2A19B248FBD9539209F9BF55C070FD4A4E2A13BA8DE36E8 + D26DB5D97BDCD6F5EC78F5F38C0E170D2A983A3CB2A8D4E524ECF99A8ABADF46 + 92D13D6C5ED43E242F88FC437505840AAB7B22DEC76E24DCF6AFD1A346621DD3 + 6B1187CB8001DCDB72D95ACEA71FF6125CBDE69B2FF6BB931DB5D26E6898676B + B4CEB85C6EFBB9392A338F940C8D7D74DF16F8B3FB534386E6CE66952E24B58A + 11B6062082D198C07FBEAA48550719C7F091BDAEE8777E34B10D26917FA4EB4C + A5A786F2CDE1B6BC58C713AB3054818E183B711F420A720FD6AC353A4E3D175E + EBD7FCD1F173C7E2B308CD54BCA51568DBB5DBBDD59DF57A3F2B2D0E07507D39 + 6E02CD14D1EA6B260A22A08994050BCE463A038DB81D70315EC1FB3D586A5F13 + 65D1FC3F0EBBAC7FA45FFD960B4BA790470398C316F31639515888D8E36AED08 + 4E48195F31D374BF0FCBA4DC5CB35E59DDD980E146E68CB8230D93C807D01C0D + A79E143687C33D36EB5FF10C96F6373AA5D48A0DCCB242CD1EC50AA54B05C854 + 072493C77E3935BE37F7B4251574E3D5AD9F97FC39F3F97D1C650C5C3D954F8D + DBDD96B6FEF69BFCADE47E8E7C11FF0082445E7C71D4FF00B5B41F105C2DE585 + B44634BD84DE599C47F3CB1CCED6EB108C8857060464DEC3636DF9BE88FD933F + E0977E1AFD93BC716FE30D6BC5773AF6A1A4CE2E21BCB1F0EDDC96AF211F2B46 + 65DC9F20561E6391C28C0F994D7CC3FF0004F3F889F1C3C4BABCD0F83FC4563A + 85F030C51DBD9C2B088571E4840FF27CFB1882CCCED8DCC083B9ABF553E0F788 + FC6FE0FF000B0F1078FBC497D7DF67B6778A04B74B7B67970005CA85F33BED0A + 36617767A67F98F8DB3ECCF0D39E0B15894E1256B46EA4D76DAF6D75DCFACE22 + FED2C0D3555D683551690D1D6F7959FD99DAF6D1DE3A37E8784FEDBFFB40FC4D + F15782EED7C1F796B73E1E784A4EDF6D86DDA2CF0AF732C2AFF655248C6F743D + 33B4648FCA8F8AFF00113E20FC11B99163F16F8C23D66EC1BD4B7495ED74E8D0 + 83E4CD1A46D9916563C4C400C08EA72C3EE5FDA8FF006BDF85E9F1A6EBC4971A + FDBF847C59A3B244B6D69A74E5B544DB8952E14908B048320ABA9DCAE3A82C6B + CC7E33F86BC2F7DA04FF00F08EF8834192FF004559FC4FA16913E9F26A26DF4F + 75696E7CB46841D8ABFBEC63CBC4733121BE693D7E0BA14F014214EA616CA76B + A941EBFF006F34EE969AAF3B9ED50C3D2C1E590A2BF73285AEE31D632767EFF2 + BB396C949E8FDEF7538D9FCC3ABFC4EF1778C7C51A5E9BAA6AFA4DC47E28B433 + 6FD69EE65F286D7258BA390DF72400B7CDBB0A029183F4F7877F66DF07FC1DF0 + 2783F50D4B50D36D67F1269A9358EAAF6EEED7AEA5BCFDD322901A3719C49923 + 042E7045678D2EE1BE18697278D0783B4FD16E90DC5A5C5BC31E8B0DCCD28015 + F18116F460771587790A00C9271E7F3FED27F0F53CED1EDFC51ABC3A1E8BAA34 + 125AEA16925C68F1C730F2CB99D543061B76B6C8B908194E3083D9C77B5C7C15 + 2CB938C217E6505A4B74B54B75A68D5BBF75FA560F15428B8E2B198AE4AAF652 + B594145FBB17AF2B735797BBCB14DAF7743BAF06FC69D2F5BF0C6A7E15D1FC61 + 6DAEF87B54B91FDA1676FBB74AB1013195380C4A28DCD85CED19ED5E6E7F6A4F + 10FC3EB9D52EB58F166A1E2FD1B53DD6B1ADBDBA5C369F06465B61612A155DBB + 3024466F94360161E57F1B9AE3C39AFD9E8B79A247E15D1A671796B7EBAF4DFD + 8F3DBB81B674B9B69A517116D03125BE59880001B803E53AB7C50D03FE17D59E + 9BA7F86F44D7EC75BB98A1696FE4BA8ED679E4556132049237E0C8E54BE1886C + B479241FA7C9F83684A32938B9464AED3507A2B7DA5A26FCB5D2CEE7E7B9D71F + 54AAE1552846575EF24FDE9356BDADEF6896AF5B24D6C8F668BF696B5D53E285 + B78A35F6BCF33C33728A2D229375A952DBA2931C248015CB8C866291B82CDBC5 + 7A547FF0554F11FC6B173A2E8EC2E23FED5373A7C373712C16A6EE791D448F1C + 6C0B2A2B85CBB29201F953A0F95749D76E92EBC61AA6ADA6E8B7775A1C0B35A5 + 9CB6E8C88F2234C1A21B766162567030142E38C300791B4D764D420B56D2EE92 + CF5A55FED08E25B4836CA6460AC55D860B295183EEC7381B8FBD5B83F2EC4BE6 + 9D25785945BD631D39B65D35D5EDAF91E2D6E30AD4EAF356519DD4B78DA57BB8 + 269DF492B2695EFA5AF6763F7F3E1A7EC4BE07F8DFFB23CFE1DF8B1E26D2EFA4 + 758E0D46EA09E08ED6D0F9684C08D3291C123279C30C039071F859FF00053AFD + 843C3FFB1A7ED097DA0F8575DB0F1368375BAE74ED46C66431905BE68DD58931 + B46700B798C84F4009D83A2D1BF6CBF1EE8FE08D2F4F566D5164BE10EA3717F1 + EEB7B352554AA30E22651B896E40273C65AB13E347EDD7AA584B63E1CD67C1DA + 6F8D13C2F77751C675B5BAB790457110C26F867DCEFC93967900E3CB63C3578D + C01C239FE438FA95235FDAD2A8E4DD34D45794926D25AD925749A773E3B8AE79 + 4E2633AF8BC54A726A328DE9E94DCAD2704D5E4EDEF5ED68A69E8ED73E7DF08F + 8A0781EC756D36F6FE1BAB2D621FB35C402CC5C7927801D4928A8C324AB89370 + 20E47CCC2B9BF107886D61B61F65B39230C5807B9B96964E801DA02AA818CE01 + 07008F4AFA1AD3F6C1F833AD787A28B54FD9C6CEDF64423377A7788262140079 + 549A22C0647199091CF24120F9EFC49F1AFC25F15DD48DA2786F54D00BA8F2E0 + B9951914838243260E7A938E4E01E4F15FB3E0F30C43AAD56C24E1DDDE9B4FFF + 00019BFC51F9A62B2DC34A829D0C7539764D548CB5D74E685B7DACCF274F105C + 245F655B8BA6B50BB990C9B5656009FBA3A9E4609C8CF7E84576D0AE2FA0F3B2 + AB19F9D80CF0C7F0C03D793C607E7BDAEF876DECDC1844C903C6C54E432B9C1C + 61D72AD9DBCF236E71D72473B0CB2189409E6127040FE120024F3EBD063A73D6 + BE860EEAF0D0F9AA8A9C1F2E22EFD1FA7FC02DE9B7D7BE19D3EEE2B4B831C378 + 822B8553B7CD1F37CA5BAE304823A104839158B13BDC3F96DE57248DF2B6D03F + FD59ABB14ACFBB2B23F1B8A91BBEA7B7E7F4AB1A6E8A7C4B7B15BD9C07701BC8 + 56C46AB924B313F75400724F000C9AD22ED772FBCE4AD4D4DA8D1F922C7837C3 + 11788750916FEF16C74FB34DF75388F72C63181C01824F4E7B9E32702A4F1D5D + 68FA8986DB47B75B78600104F330F32618E3785C853C0EA4924927072045E37D + 521445B2B0DEF670C859E7C61AEE6390CFEA07180A4F03D4E4D6046EDE791B64 + DD272549C920FB63AE39CFBE7DE8A71727ED1BF45D3D599E2251A57A1049F77D + FC9792FC77D88538C28042E70DEB8CFF0085588912DA2661347BC9C2EC66DCBE + BD47F5FCE8D36391EE963126DDDC65BD3F8860F1D3B1EBD3BD7412786F43B1D3 + 95A6D5249E76207911C52273DF2ECB83C8E0FA03C66B59492767F81CB4E9B92B + F6EEEDFF000E68EA76EB0EB49AC693E72B5C21B88D97E4314830CE839E76E719 + 246E56071C80566F12FF006E6911DC490CBB92310A8DA76B90AAA1813F77E520 + 6D0480589C74AEABE16D85BF8C34F9345F2628DAFCC6D6AEEEB1C0B70495504B + 02A19F76C66F95537649C8CAF2FABE87FD8D7B7F62C023C6B24851D9D1E36DEA + 0838390C3D1CFA02091CF9B1A9073F672DE3F91F47CB5634956A6FDD96EBB4AF + FAFE4FC89A331EA1A24932AC81E0FDD04E49DAD927239E857078E3F0151DAABE + B96A86DD8CD798509002584FB5700213925BA80A460F6C9C0ACB6BD8E2685556 + 3B65CB8298664C7AF5273CE3F993CE264B15D31E39A175FB3DF1DF1AAB7CCADF + 36F049E060A83D0F0CA723A55285969F21D7AEA76F68B4B59DBA3E8C4B5BB651 + 24D70B246AB2E0071B95CE3073D4123A11D70FD87077FC3BA95AD9DED94D1C86 + 36B7911D0F0AAE73C7CC464633C81F364FE70DC78A61D734ABA866850C970C0B + B460326FCF0C41C83819F99707E72092B851E8FF00B3FF00FC13EFE397ED671D + 8DD7C3BF84BF103C67A76ADA88D2FF00B634DD0AE24D392E58A82935D951043B + 378DED2B2228625CAAE08A8D2956F7527E9FD7999FD63EA6D4A324D77F3DF7F2 + 5BF4DCEA7E26EB8DA469DA4F8A23916487C696665B9B7CA6C926867744CE0F2C + 9B777CDD77E3001CD6D7ECBFFB23F8CBFE0A0FF18F44F86DE05B28F50F106A52 + EF99A57096B6D6DBC79D7170F83B521243B617241215198AAB7D55FF0010EEFE + D7BA8FECB1A7F876E7E1098F59F0CF89E5BAB2B6FF0084BB4766BDB3BEB4513B + 826F0C69F67974FB71B4B06637C5977056F2FF00593FE0DDCFF824B6B1FF0004 + DFFD9BB50D6BE246916765F187C69214D4D52E62BB6D22C226220B35963668C9 + 63995CC6C558B2024F9631E664B93AE76EBA69536F7D3995ED14BFEDDB5DAD96 + 97BA47A39F7154AAD1E5A6EEE492B5EEA2F7937E4DDDA5D5BB6CDB3A0FD89BFE + 087DFB35FF00C1327E167F6F78A2CBC3BE2AD7AC962B9D5BC5DE33117D8EDA60 + C9B5E0827636F68AB27FAB7F9A61BF6999F35F6F782FC55A7F8E3C27A76B1A4B + 4CFA66A5025C5AB496D25B3346C32A7CB9155D723040650715F9CBFF000553FD + 8E7F68AFF828EFEDABF0EFC0D16813681FB32784755B1D4B5BD43FB5EC95BC41 + 286DF34BE4ACE672224CC31C6F1280CCF265B2A13EE4FDAC65F1968BFB3178BA + 1F869A0DD6B7E31934C6B1D1AC6CAF6DEC658E49311095259DD22430AB1946E6 + 19F2F0324815EC4B1338D2AB8954F48DD28A4D4A5CAAFB5B66DDA3A3BEAEF7BA + 5F33528C6A7B1A13ADCD3934DB725C9152D357D1ADE5B72A5B5ACCFC5DFF0082 + 81FED03E0BFDA5BF69CF1F6A9E0D78A4B3D3F5B9B47B844850C734B0110CB28F + E168E678FCD073C8656EAE73C0788BF6044F82FE14B5F17693AB68B278896DE4 + 92EF4EB6B779D2D5A5549B0EE1B11CEB1AA90BE85320679F1AB8F871E30FD88B + E296B5E05F8D1E1ABCF0CF89116C2E9ED2DE6B736BA85BCBE76271321746DC50 + 02226C6E470CCADB80FBA3E03FEC33FB472F867C45F6EF8732D8786FC41A85BD + FE83736F776FF699F7B18889A1698BC2AD1884EF915422825B0381FCB39C6479 + E51C4569E5D0949295E6A317252E67AC6C93B6ADD95AFA5BA1FDC797F1764BFD + 8996E06789843D9DACE7CA9BE54B95A9B77565ADE376DD9DD27AFC37FB38FECC + 371FB447ED93E13B7D4F5B934CD3FC65731DDEB2BFDA8B2496B621C7DA231861 + E449B5768661B955E30707703F4B7FC1463E34683FB74F8A97C3F67AA59F8674 + 8F0191169BA6EA1018618AD4BAC5E614236867DA8A8082CBE5BE061431F59FDB + 83FE096575FB2A7C1ED6FC7FE0FD275AD2359B88C3788354BB9A19AC6DD0EE47 + 9D56D8B4B0AA248E4B80495545C135F9CDF08B49B9F896B6F69A05C78B3E24EA + 5A1DF436FA759E956B2DE97B8F30BC4A58A19A53B8F99B628F6C619F1B01C3B8 + E031399E2E9E32B46A529D04A3084A9B8CA2E5BBE57D24AD18B76BA575D51F1B + 4A794567FDA381719D3B4D734E6ADCD76E4D2BFC528A4DA8C5B496BA4AE7B3F8 + EBE1EF89F5AF1CDE78B24D41B50BEF1044FE1F92DADEF63B585ED07EE164B3C8 + 668E23B630C6350BBD2423218D7A3783FE197C44D0BE2B4367E20459174D36ED + 74B14D1A196EA4B75842A8CF9877A46AE060011C6A4A290375FF00863FF0488F + DACA5F0AEAD7D0FC3BB4D0350F127953D96A91EA763FDA7A52131B7EED6E2E16 + 4B73B5E418023914228DA8CA0D793EB3E13F889F072FAE2CAFFE1EF8A2DF5859 + ACFCBD167D365864B3923B76887C877CAE4B490CF9254CD24818F9A222474E6D + 90E61429AA389B455B957341C6FB6CDB4B45A6977A6BD2FD5C3F9FE02BCE4F05 + 28B51D65CB252B6BBB49E8B47DBE25B58FD20F8707E0BE8FE05FF8477C59E20F + B3DE5E5C0B4B5845B5CDCA5FBBC692AB08E2C322B98C798B32857C2E3682A077 + 9E0BFDA0F47FD9BBE01D8DD5CD8D9E9B6B7B7E6CAC816226D52500A99C963F33 + 48EA48191BBE73C05247CB3FF04C7FD913C75F1975E97E224B1C9AA5F68B23C3 + 1A931C56BA7DCC31A44AA1988F32EA3006010C81972EEA7E53F56787FF00627F + 8ACBF19AC35AD4EFA4B8D23478C5AE9D0CBA4D8CB6F636BB0A3C291FDACB47BC + 24664745691CAA28668F721FCA730E07CCB10E34B0F87AB3A6936E71854B4DEA + 9A52517156765CDD93F53E43892793D3C4CF0F8CC5733BA9D48CE695A4AFEE45 + 4637BBBC6EDDFAF2A5BBE7FF0067DF124DFB51FC531E28D7ADDEDF4782EFC9B2 + 517077DC3A6F91230C08FDCAB6328A0E595379E76D7BD681F0B7C397FE2DD2FC + 1B0DAD9CDFDA2F26A9A85ABC71B2FD963903C8EF1920ED791922070701F1D171 + 5CEF8AB58F86FF0002ED1754B8D3F42B1D5ECD440F1DA462D76B83F32AA31DB1 + 05258E09F97730CE4927D1BF625F0936A7E1DD53E225ECCD75A878E3C916CC71 + B2DB4EB70CB6F1461780A4B4B2E40049979E831BF84FC1F0CEF8B697347FD9B0 + EBDA495B46E36518B6F7F79A6D3DD5F4B1F11C4F9A3961E598D08CA8D1494694 + 35B7374B3BBBF2ABC9CBAB495B5D3E75FF0082FD7C498FC1FF00B32F86BC25A2 + E9FA64DE24F10EA5E5D834D1295D36D92231CAEA369232244501793CF0718AFC + FBF805E19B3F147C13F125E68F6F0DC6BDE171677B7DE0E9F2B65AD402D65578 + 06EDA76B47BBEE9CAB3C657271BBF4ABF6B9FD8CBC5FFB427C52F1178C354D3E + E1ACEC6D9B4DD1ACE0B849648ED9158799E5AB65FCC7632955FDE0002805B15F + 963E29F18B7ECD9E34F14788E6D2DAF2D6D6DEF63B9BDB7B82F189E360043B17 + E68995CC8047212FB53E63BB2D5FA871A63F1D8FCD6BA8D09D29732E47284A1C + EA2D47ED25CCA496EAED5F4DAC7EADE1AD6C052E1D8E0F0D8852A91B4AA6CE31 + 726E4D5FA597BB269A574DA7D4F8C7F6A0B1B2D712CE0F0CC826D345BC9E45B0 + 8D95EDDCCB23B24C1C8CCACBB4C8470587191903C0747F15C36DE21B39F52864 + 92D14859A251F3C898F99C70016CEEFF006867BE727EAFB5FF0082607ED09ACF + ECCDA97C6C8BE13EB16FF0B6F3487D78DEC9A85A2C91D82E5FED02D9A417663D + A4B8710E0A01201B30D5E71FB2DFEC11F157FE0A0DE32F1145F077C0371E346D + 0123BBBF5FB5DB58DBDA9900508D713BC51890BEE609BC330572AA36367F63CA + F2BAD422F075212724AFB7BD677BDFE77D7C99F19C45C4185C47FB5E1EAC5414 + 9C6D7BC559AD3A77DB7D6D638AF0F493C7ACBE8F04B71E5DDCB1CB6FA8E9D906 + 64C8DB83FC513A6004382180CE315F787C2BFD87F4DD4FE1F43E2EF8B7E24D4A + E921B78E646BBD6CC390146D4CF24ED1F7422FCBD88E95F137C63D0B54FD907E + 296AFF000DFC7DE18D6FC3BE28F0CDCA4173A44F2452340EE88FFBB21B6B2BE5 + 5D5A3668E40C0A939F9BF57BC51FF06E9787B43FF8262F883E2C78F7C55E36D2 + 3E2868FE0BBAF15BE8D6E6DFFB2F4C68AD8DCAD94D13C66696458D3CA76F3D54 + 3162170086F1F37E1DCC730A0EB61EA3A54E0AF29249C9AB5ED1774F54BD3EF4 + 4E078EB09974A387A9EFCEA34A293692D56AD2D346D59EFAE87C51F16FC33F03 + FC6D6771268BA16BD7F74C44820B3BA78A19106774A77B06DA318CB6065BE55E + 06347F623D1EC5FE29A695E07F86FA978CA191A2B8BBD3B41D26E35F9D34E8E7 + 093BCEE913B347207557C302031553B65746F2FF00D9E9553424D5AD6E3C4D35 + 9ADE476C9222431432AB0F90FD8E448A39D848D1A3225C303B88236905BF733F + E08416F7DE0CF82DAC4961E1DBAD6B45BC68A1935DB3820844F73134CCE9BDA5 + 8C5CAA09402F1C0A118940D2803CAF0F0981A52ACF2BC54EACA9B4EED73CDAB2 + EAA2A56E9AB5F9DCFAFCF388AAE07012CF150A6EA68968A37BBD7DE766DDAFA2 + 6DDEDF3F957E097C36F8F1F193F699F1278EB51F0C5DF87743F0EEA9247A7E85 + 7366B66BE1F8849BEDFF00D0805977F96E08468CB303C9615F4A7C44F865F127 + E33C9710EA5E3259E6B7B769AC6DECAE117CD9325706289E364607F876B48318 + 38239F6DF1F7ED59F0CFE2AFC4D5B1D3F4E4F10788A6096DF67B9842ADB2A10C + 5E6127C8850B0C8C6F1819E00354BF6DAFF827B780F5DF815E28F1A5D5DDC785 + F54F0CE8D3EAAB716BB20B5B510466562EAA037DD4605838C673CE307F0CFF00 + 577159E66F899E5B053A1858BB4F9547DC8DF97496AE5349B5B5ECDFAF854F8C + 270C5612866749611C928C1BA5CF2576B5D64A566DD9B495E3B26D3BFE56FED3 + 3FF04B2FECFD0F5882C3C49A6DD6ADA6DEF9DAA448F22DCDA60BFCF2453AC721 + 8448E0F98030C01FDE52D8FE08FF00827C69BE0BD0F459B5EF8DBE15D3FC49E1 + B7179A4C3A2E8AB7FA934CAEAF1219638CB8024D8A198C806EE9F28AEF2D7F68 + BB5FDA64343A5EB1A9EA1F117E1F594ABA4DCDEDA4A97DE26B1119DB13830344 + DF29656695D43C4D861F2B35733FB2D41F0A35AF8ABAB6A1AB7F697DA2FA0906 + A3E1895C4773A7C91C6F296B5BC42F1CCA72628E16955E528DB8A07515F570C7 + 66B87C2495594BDCD6DCB172BBD2DAEC9AEAD25D1BB9FA6C7034256A755B94EC + F9BD9C53BA86BEEAB72B52B68ED1693945D9C5DF63E35F8823F0E7C25BAF01F8 + AFE227C3CD5B4BFB4092479A5BCBF486E970F23C77115BCB89A55386F2596312 + 9F98798095F91FC63F0B63F15E977B79E0B6F04EB7676B379329B2D491750B27 + 900E1A0B98C5C48A491F342920070A18312B5E9DFB5DFEC63717BF13752D4BC3 + DAC6BDE3CD134F78174A82186396755B9567F282DB86893CAC0575521D1CE18E + EFBBE01A37ECF3F1C753F135F37867E0FF00C50D62682DA5C59E9BE15D4AE8C6 + CEBE5098C71C6E5D50312A5DB1BF0092722BEB384B2EA53A77C155BCE5AB8DAC + 9B7E4ACDBB2DED656EA8F95F113190708F3C1415D4B9D24A6D492E67651F7356 + 959B76EAEF76739F13AF6EBE21E8F69A3EA5757979A3E9EF2992F27B8695AE2E + D0FCD2C7E6ED31AA6D8D563501596221816FBBCDF8F7E0DF8DBE1DAF81ED6E34 + 16D7ADF52923B9F09DE5840D770F8922497CB8E3B664C93345248166B760AE8C + E03A8CA6DFB23E1A7FC1107F6BDF18E9BA16A5AF7C11F136ADE1DB8B612C3667 + C6BA5689AAD8C522EECC46794BDB4C4365A2B881FE62C1D41AFD0BFF008233FF + 00C10F7C5DFB28FC7AD43C55F111B50B8F03697245AEF847C37E2336336A5A36 + B6D1BC2F7320B29A7B56921B76310B88DD0CC5831863F292BF56CAF2AC547150 + C3568B8C2EDBF75DBADED2B6927B5A4927B2D95BF08A9C44B0B4675A351546D5 + 96AAFE4A493DAF67A79DED765CFF00825AFF00C1B71E05F84BE0CD2FC63F1F34 + E5F1DF8DEE6E1B53B6F0F5E4CEFA5684B222AAC171106D979304322B89034004 + AD184708B237E82FECADE31F845AC783F54D07E0C7FC21EBE17F086A3269D710 + 7852CE28347B4BB602796289A0516EEE0CA0C8222C55D887C3E457807FC16D34 + AFDA43E24FECD50FC3FF00D9D7C1977AE5EF8D1A7B5F12EB306B761A6C9A569E + 23C34111B99E26F36E0B6CF3103044470705D587AC7FC134BF63AB3FD82BF620 + F00FC32B758DAFF43D3965D5A6403375A84D996E5CB02777EF19954924EC4419 + E2BEEB0DCAB9E14E3CB08592D35937ADD77492B37AB6DAD92D7E2332AD3C4423 + 8AC454E6A951B765B452D35ED7BFBABB5DB6DDCFC89FF83BB3E26F87FC53F1DF + E19F85BC3ED630F8FBC1FA4DCEA3A95CC5FF001F135BCECA60B572A46E58FCB9 + 2528F9C2DCE5061DC8F58FF821F7FC1BE5E0FD4BE11683F18BF686F07E9BAE78 + 93C4502EA1A4F846EF74BA5585BBB0922B8BBB76F96699D704432064447C3067 + 388FF3E3FE0A9FFB2A7C7FF07FFC1452DFE387C7EF05DD781BC37F11BC6A069F + 772EAB69A9A456B1BA08EC9DAD269426CB342A0385DF870A1B040FE943F6B2F8 + 7FE20F89DFB20FC45F0BF80EEA1D37C4DAF784F50D37419F708A382E65B59238 + 3E6C6106E651BB1F28E7B579B80A3ECF0D531D28F3546DB4ADAC5DB9B97D7DE8 + A4ED7BA6ED767AD99632715432DA351C69DAD295EF196B66D3EC9F37324D68E2 + 9BB687CFFE1EFF0082CF7ECF7E0CFDBA745FD95F4E875ED0BC40B1A695A3CF1E + 822CFC3BE722ED8EC2DDF2ADF7576A3243F673B42AC84E01F847FE0EBCFF0082 + 49FC35B1FD9866FDA1FC0DE13D23C2BE32D0758863F12FF64DB0B483C4305E4E + 50CF3C7180AD72B712A933603BAC8E1CBED8F6FC7FFB07F827F6A2F869FB57FC + 1CF0BFC75F823F14350F0CF82BC7FA2D9E97E31D6FC2FA821F0CE35086151FDA + 2D11866B566D88BB9CA8DF18470B803F653FE0E4D6DBFF000458F8D586F2CF93 + A500D9C60FF6BD962A7DA62A796AC463629558CFE28BBC64AF069ABFBCAEA4D3 + 4F6EF2F89F2C70F85A798D3A1859B9539A8A716B58C9B7169FD995B4945AEBD1 + 6CBF971FD84BF636F15FEDBDFB61F84FE12F84526B2D53C51A8086E6E0AEF8F4 + FB64064B8B99532032C51066C646701472C057F5ADF17BE307C16FF82177FC13 + DB4FBCBDB1B9D1BE1DF8020B7D274FD3749B68E4BFD52E257C6D8D19A3592E25 + 7324AECCCB93E63B11C9AF8C7FE0D4FF00F825DB7ECC3FB375E7C74F1858EDF1 + EFC5AB7034BF357F79A7E865C491E0FADCB8598E46762C3EE2BF337FE0EA0FF8 + 29F4FF00B69FED9CFF000CFC33752C9F0EFE0ECD2E9F11507C9D53553F2DDDD7 + 6DCA857C88C9C82124753B65CD7B38CAB2A14E18487C72D64FB5B7FF00C053B6 + BB4E4EE9A47914692AF5675DDFD9C2EA2BD76DB4F79AE9F65369DDEBF48FFC16 + B7FE0B57F0E7FE0ADDFB235B7C33F857E09D42555BDB5F116A3E21F14359407C + 3D146D18CDBAC134FB666F39A393CC68D910B054903978FF001C742F00CD1DD4 + D6FF006CD1E14883457125DDC80A84617F81B736083C441B3804063B48E1349B + BBAF0CEA29756722ADC461880143A83D3956C860719C1CE7F315EAFF000EB56F + 0D7C5A0DA4DF5A3E93E21BA458A168232F14EEA46C540580472A1B2AFB8617E5 + 21B0A7C0C4C6AD173AB7BC64EEECB55A2577E564BF33ECF27784AEA187B7B3A8 + AF6BB7696ADA49F4776717AC6836BA434D1ADFC77B0AA1FDF42A4A2F5C84DFB5 + B049C60A820E4F15C95EDAADE4CBF2E70D85F982201DB2DD304E718C7F41E95E + 25F82573637FB4EA7A3E9E230E1A3BEBC6B7962C28243C4CA25DD82B82130DEA + 7A5725ADE87A4E8DB95B5E875268810BF63B690C65F20804C814E39271B41C64 + 1E781D985C4C64BDD7CDF27FA6879D9B65B5694B96A45452EED2FCDDCE762764 + 5544CAB4BF2B9032BB4F1CFBFD3D477AAFF6E9514ED1B94B676E3E438C1E9F95 + 5BBFBF8C906DD5A48CB166331DCCDCF7239E9B7D0641EBD6AAC57370ECCC0AFC + C70C3E500E73D7B77C7B6457A313E7AA3B3B5FEE35B45D7BFB3248DD7E6824F9 + 2442BBF27E9D7A6475CF2D8EF5EE5AD689FF000BEBC1579E3BD26307C43E1B85 + 53C6760A034D736EC44516B985E70CC521B9EE9318E52C7ED0C53E7DB08CADC6 + F51E71E5519940518EF93FD7FF00AD5DAFC19F8A9AF7C18F88DA4F89B4268FED + D6AC51ADE4816E2DEE21911A396DA68581592096132249191B5918A918C1AF37 + 30C2CA71F6947E35B5F67DD3F27DFA3B3D6D67EA65B8EF66F92AEB076BF95B67 + F2BEDD536BA999342B77A7487CC41796E4BA9E91C8411D3DC0C1C0EBCF39E2A1 + D16F64BAB1FECDBCDAD1CC4C88A390AC14761D0951F8607BD7AB7ED0DF0B744B + ED03FE163FC395963F05EAF32AEA7A3492B4B79E0BBC66E6DA42D977B667DDE4 + 4E7248011C991097F60FF82067C0AD13F693FF0082BEFC0DF0E789ACE1BED29B + 579F569E13FEAEE5EC2C6EAFA24718C32F9B6884AE704718EB4F2DAD4B1718B6 + DC537677DE2FAA6BBAFB9E8D369A675671ED70777CB7928DD5B69ADD34FCFEFE + 8D269A3F5ABFE0831FF06D17857E1CFC3DD1FE2EFED13E1FB6F1378AB5EB44B9 + D23C15AA4024D3741B770763DEC0D95B8B9646CF952031C5BC82AD2731FAC7FC + 1467FE0EAAF833FB0E7C47BAF87FF0F7C2D79F183C49E1EB85B3D55EC7514D2F + 43D30A8915E04BAF2E669668D910148E1F2B0E479A191907B37FC1C75FB60788 + BF632FF8255F8D75BF08DD5C69FE24F13DCDBF866CEF60768E6B15B92C66951D + 4828E208E50AC082ACC08E40AFE4FF00C1BAFC77771A7DAE9FE1CD2F56D56E67 + 8E0B70B1CF35C4F2310AAA22DE159D99B0176B7240C1CD746231552AD67430D1 + B462D2B2DDC9A565F735776BB6F4B5ACFCBC0E0E97B3557193D5DDABDEC95F5B + 5B6D6F65A256D6F7B9FD28FF00C10BBFE0B2DFB45FFC1577E3D6B16FE21F0BFC + 29D17E1BF846C0DC6B77BA5697A825EFDA65DCB6B6B1BC97B246198869198A37 + C9130C296561EFFF00F05CDFF82B843FF04A0FD9AB4CD5B458741D57E2478BB5 + 05B3F0EE97AB24B25ABC51957BBB89562747289190A30EA4C9347D406AECBFE0 + 92FF00B15D9FFC1367F605D07C3FE225F0FE93E246B57D7FC657B6B0C369691D + DBAEF94165555F2E08C2C7BDBA888B1FBC6BF9C0FF0082C27EDFBA7FFC150BF6 + CFF1578F1B50BE87C2BE1F2DA27856D0B334706990B7170632061A772D2BE4A9 + 5122AE5BCBC9CF34AEE87261A2FDE5F135AECF5D7CDFBABBA4DAD50B0F4E1889 + 4F154D7B8BE14D5AFDB4F4BC9A77E91EC7F433FF00043AFDBB7E2DFF00C146BF + 654D4BE267C50D03C19E1EB7BBD665D3F408F40B5BAB7FB5DBC002CB3C8279E6 + EB29645DADFF002C9B3D463E41FF0082E8FF00C1C83F113FE09CBFB695BFC25F + 84FE1BF879E22934FD1AD6E75A9FC416777752417D725DE38144175005516FE4 + B92D924CC3A62BED0FF8211FC48F87DE3EFF0082597C21B5F87BA9697796DE1D + D0A0D3759B5B5995A5D375455DD771CC992D1BB4CCF200D82C92230CAB027E73 + FF00828CFF00C1B9FF00B3BFC59F1E7C46FDA0FE237C58F8A1E17D5AE566D62F + B50BAD634B8B47D3D973E502B2596FF293F7712A8943955450FB8EE3D59C29D0 + 9FB9F0534DB77DF9636FBA5ACBE4BB9CD93CE8D577ACAEE6D24ADB5E57FBE2BD + DDB5BDFA58FCF1FD8DFE37FC45FF0082EE7FC159FC1F67F10ACF4BB8D3F4EB83 + ABEBF1E9C92C561676165E5332450C8D2F948F22C30121F2ED2A9766216BF677 + FE0AFBFF000504D53F616F83BE1DB6F07C56B79F103C71A8B5A69169222C927D + 9A05125D4B1A370F22AB4688B86CBCC9856E95F287FC1A79FB1F37813F668F16 + 7C6ED734AFB1F883E256A32E9BA54926D67FEC9B599CEE1FC4BE65CB4A194939 + 16D11AFB4BF6A2FF0082787C19FF008291789BC31E31F115F5F6B49E1969B4D5 + 9343D5D3EC9A84515C9171672B2872A04D1491C9E4B4726432337CA02F9D8ECA + EB52CBD60F03EE4E6D4A72BBBA7369C9DF7BA564D68EFCD677B1F4D4F3AC255C + E957CCBDFC3D1BC631515AA845A51B68BE256ECD2575AB676FFB20F8E75AFDA1 + FF00624F04EBBE3FD2E35D63C55E1C8E5D5ED2EAD822DC799190C6488A80BE62 + 618A6D006F2300715E7DFB06FF00C1377C01FB2EF8A35EF88F69E1BD1ECFC65E + 332270D0D8C70AE816AEAACD696C14B796ACFB99F6B7CC768FBA8A0797FF00C1 + 64FF00E0A87E0BFD8A3F67CD77E1CF85758D2EE7E296ADA5358D8E85A74F1F9F + A05A3222B5CCA8A7F7216290794A7058B29552AAE46CFF00C112BFE0A3BE1DFD + B4FF00654D0742D53C59A0DFFC52F0CDB4969ACE991DCEDBB9A28A42A972B148 + 16465F2CC6AEC1480F9C9F9949F3A34E9D5CFF00EB3464AF4E94A1AF572927FF + 0092A8D9D9FDB92FE6B4E230B8C8E4F3C55B9615AA737224F48C6ED4BB28F334 + 969BA8BED7F20F84BFF05F1F107C69FF0082B158FC19D2FC0BA0D8FC2FD4277D + 374FD56F2F5FFB6B5A9369297F6CAA4C46D9B1B84782C625794C8A47935ADFF0 + 72637FC215FB3C7C3AF1959EB379A2EA9A778A4E9A1A1799A39E29EC6E9BE78A + 3652ECB24318460432195B6B2EF24FBC7C0DFF008256FECE7FB06FC57D77E316 + 89A0693E19D42D6CE7924D5352B88A3B4D060605AE24495C298C14E1A495D885 + 07900B6EF96758FDB3BFE1EDFF00F0565F06FC37F8653E91AF7C0CF843E66B1E + 2DD5A5B2B7B98F58BA01C2AC1E7C6C4C5B923B7F323C164B99CEED8CA58C660E + AE332EA597E339655A724DED68A4D36FAEC949A696AE4A29591EA6558AC26173 + 9FED5CB632587A116DB7BC9F2CB4ED795D46D7D6CE5ADEE7DADFB037C241FB27 + FEC33E13D3F5BB8BBFB658E91FDADAC4D7912C570B2BA79B2091474741853924 + E53924F3563F64EFDA1353F8DBE30F13477935E5C59DAC16F35B32E9A61B11BA + 49C318662A0C8A4AECC312C0C0C4852707D23E2569DA0FC45D3EEBC11A86B0B6 + 7A96B562F7515BDB5E245A8A4514918373121C922395A2F98AB206640C086C17 + 68DE1EF0F7C14F0CDE4D125AD84323B5DDEDCB2C713DDCC47CD2C8542A976C64 + 9C01D4F1CD72E6585C651CDB0F8B8D55472FC3D39732E6B294ACE294B4B72C12 + 4D3BEF7EA782F31A389C3E2278A8BA98AAD24D3B6DAA936B46FDEBB564D595B7 + 4CF87BFE0A4FFB0EF88FF69DFDB03C3ABE18BDB14D2EFEDECA2F12C62E89BBB0 + 8DA668C5CAC38C1431A9CF3C98B91B49AFB9756D574AF837E04B1B7861F26CAC + 628B4FB1B6890B121536A46AAA33C2AF6ECA6BC47F658D7BC37F16BF697F1C78 + A9EEBC377BE2CB5B78EDE16D36F1E4922D3E46F963906E292ED30A0F3506DC92 + 07535E73FB54FEDDBE1EF1A7C7B4F863E1DF145BDBC7A4DDDADBEB1AAD85E107 + 4F9649963994B2FCAC23470AD86F9646C1C796CA7F3FFED9780E1FC567396DA3 + 571B564A8B692B294DC63397946F29B6D5B549AEFF00738CC0E699CE230BC3D2 + 4E50C2534E5A356528C5BEAF992D145A49B5B2B9F61F82F5DB8F11F866DEFAEA + DD6D659B79D81B70DA18856FF81280DDFAF53D6BF2DBE387ECC1F0E7F6C3FDB3 + AEBC336B7967237C6213EAC93D83F96F2E96B204BF49071F7E35F3109527CC70 + 727048FD4AD73C316BE23F065D68DE75C5BD9DF59B59F996F262448D9366518E + 70769E0F3EB5F15F833E1EFC0FFF00827B7FC1433C296BAB7C50B93E28F1B784 + A7D0344D3BC47A85BB7F65451DCDB18218D912310ACF8648FCDF9A5781D55DDC + 915F659B70EE33158DCB2955AB7A341DE7376E6A938C6F156FEF4A3795BF99D9 + 6975E0F096751C050C754C3397B69C1A8C5276E5DDB6D5EDCBA4B5B6916AFA8E + FF0083813F6BBB3FD8A7FE0983E2BB1D2DACED35DF88107FC211A0DB65516317 + 31324CE0646163B659704701CC63B8A9BFE0829FB1FDA7EC17FF0004C0F0BC9A + D456BA76BDE2EB66F19F88E72A13C9F3E30F1239C023CAB5588303901C484706 + BD6BF6D9FF008262FC2DFF008283F8EBE1DEB1F13ADF5AD62CFE1BDCDD5D59E8 + B15E0874DD4DE71103F6A40A6470A6252046F1E72CAFBD495AF9B3FE0E7EFDB4 + 24FD92BFE097BAFF0087745B88EDFC4BF16A43E12B354237C164F1B35F4DB704 + EC16EA62247DD37287238AFB3A952787857C44B59D4718C7C92D93FF0014DF33 + EC96EFA7CA5354EBD3C3E0A95D463CD29FAEDA7F860B6D9B7B5D1F913FB0C7C4 + 8F0AFF00C1627FE0E628FC6DE38D4AC2CBC33A97882EB5DD234BBD710FF6B45A + 742A9A5D96D6243C8560B79244E4388A40076AFE9464F8D9F0EFE24FC58F137C + 216D7F41D63C5DA6E8B1DFEBBE1BF304B3C16173BA35332740AE382A79DAE848 + 01D0B7F387FF0006F9FF00C1BD7F0B7FE0AA1F00BC61E3DF891E3EF17693368D + AE7F635A68BE15BBB3B7BAB555852469EE5A7827CAC9E61545089FEA9CEE6CED + 5FD93FF82797FC112FF678FF00822CEADE31F891E1DF107890DC5DE946DB51F1 + 078D75AB410E8DA7AB896501E286DE28E36648D9DE50C4794B8651B81F4BD842 + 8E1E9E16AE908C5B7D79B9A374DF4D7DDE6FEEADAE7973AF3AD5E78885F99C92 + 4B6E5E5766975D3DE4B677B6F1491F8C5FF0538FF82716B9FB0EFF00C14D74AF + 861E0D5B8BEF0CF8D96DAE3C0F6AB733095EDA7B878C69E5B9679239F7A6E663 + 959226382E40FE8525BFB1FF0082797EC042E2FA5FED15F86DE16066703E6D4E + F12219C0E3E69AE0F0A31CC8001D057E70AFFC1447E06FFC141FFE0E1EF8591D + 978834B9BC27F09F45BFB1D0359BA9523B1F126BF2B0544B767601914BE21703 + F79344366E0D196FD5FF008CDF05F4BF8E5E1EB3D2F57B8BE86D2CAF52F825B9 + 8F134888EA81C488EACAACE1C0C7DF443DB07E5BEA55A865756AE5F152AD3525 + 06DDB44DC61EF3BD9FDA7DFDD6CFB8CC33C96231185C2666E5EC69F2CA6BBB69 + 7368BADAE93FB2E52563E20FF827A7C14D2343F8A56BF6AF115D6A377AA4D3EB + 1ABBDDDA1B7B7D42E66DB2456D1390033AC9F696755621D00C8209AFBE2FEF34 + 5F18BEADE1DB892CF506FB3795A8D8B112621995976C8BE8EBBB83D457C13FB3 + 5FFC1243C1FAD78DFC6F0DD7C51F1678B3C23E1BD7C5AE8F650DE5BB18D96DE2 + 69C5CC82229215919A102354DA60704EECAA7DB1E07F859E13FD9FB46BC9F4E8 + EC743D2E38116567F2ADE0823418059805FCDC9C76C64E7E0380726CE327A1F5 + 6AB469CA8D49CA752AB9ABB8F2D925149AD1A5AB972A8DD5AFA9F41E2566397E + 618F8E2B0F899D4ADCB1F77D9F228B6D492BE8DBB3B59415AC9293495FF2BFF6 + 96FF00821E7C33F82BF17350F136ACB7DA8F822C6E7FB592D237375736D116F9 + 55A238DCA982BBC960026E6030734BC2FF001A75DF899E07D7ED7E077C1DD193 + 41F05EF4B7B43A558AC8B232922FE48515239DB6A318A3450199B2CCFC8AF51F + DBFF00F6F1F843F1E7E26DF68FFDA1E28D323F06DA91A7F8C747DCF6B713B92A + D0848C34B2C7BF0018D09728DB580CB0E2FF00662F861E3ED1ECF49D6750D5FC + 3FE17D1758636BA7DD5E698BA4F882FA28EDD37DD4FF00649585A848E1DE2369 + 2598BCAE262C6404FE1DC5915F5FAD1A755D4A7CFCB4A32727169BBA5149FBFD + AF7BDACFADCFD8B27C5558E5547119E534F136BC5548C9476BDDA83BCE528277 + BD9C5E8E2ACDCB8BFD80FF00E0971E3AFF00828DFC46D63C71F1E6F7C5165F0B + F4FBF6B7B6F0FCF7A239BC4132129711489192208D5D02968997F8D1307322FD + A9FB657FC14B3E0AFF00C1207C0DA5FC3DF0BF82750D7BC491DB99349F017817 + 4A4DD6AB26F659AE4A0D96D1C92E72E43CAE5D9C47261C8FABFC6FE2287E10FC + 23D6B586DB243E1BD2AE2F9CCBC093C989A462DB47F115249033C935FCB47ED6 + DFB5678DFE2B45AC59FC42F887E28D7ACFC4DA8C37F7B0C56D30B75824BA98C8 + 2049A68CB607946389822B8F2F2CAB0C58FE989D459150A195E5F4E2A6D2E769 + 35E575A3BEB7B27B24FABB9F94E16854E31C6E2735CC24E1429B7C905F0A6EF2 + 5156B5925BB493D56C958FD1BFD9E7FE0E22FDA43F6CAFDB6F40F867E09F827E + 1DF0B69FE22BAFB14D1EB5A3EA7A85C786DA3561712DCDCA4D6F1C91A14673FB + 985973E5E1997737EB2FED35FB40691FB2BFC00F157C40D7A3B9B9B0F0BE9D25 + EB5B5A465EE2FA455F920897BBC8FB5067805B2480091F9BFF00F06C17FC13CA + 6F82DF06759F8DBE28D26FB4BF1178F0B58E8765751BC3F62D32361BA65864CB + 234F2A12092731C7195C0720FA5FEDA5FF00053DF0E597FC141BC3DF0726FF00 + 842B5CF06E970F93AF3BEAA64D4EDF5991D3C98E0B68D183BC2846E5DE24C4F2 + 9DA04596E8E2ACFABE47904F17CBED2BD9B8C568DE97B6BFCA937EAF95EB63E6 + 69E494331CEFEA581A77A54BE2E5D1CB95DA566DEEDDA0AFD75EA627FC11E3FE + 0AC9F1D7FE0A31FB42EB9A0F89FC3BF0D746F0AF83EC5EE75B974ED36FA1BD12 + 4A40B3890C977222B37CECE194F111008278F58FF82E07FC14F75CFF008262FE + CE7A0EB9E0FB1F0CEA9E34F14EAE34ED36D35D8A796D1D421DE7643246ECDBDA + 10006030CC7B5765FF0004DEF873A5FC3EB9F88576FE14D07C1BAFF8A3575BB5 + B5B049637BBB18A18D6391FCD446661349704ED5D8BE628EA6B0FF00E0A3BFF0 + 45FF00873FF0540F887E19F10FC40F187C4ED2FF00E112B27B4D3F4DD0351B3B + 7B146790BBCEC935ACAC653F2A93BB1B5146DFBD9DB21CD6AE6F90E171B8492E + 6A918CA4D34EDAF34A375A5D7C0FB7C8E5CDE9E5986CFEAC5D3E5A11F863BBF8 + 52576B4BDFDE6D68DAB2B5CFE77BFE0A9FFF00056FF8E1FF00053F83C1DA3FC4 + 4B5F0C687A4F87637D4E1D0B45B192CED65B9CC919B97F3E59A56658CE01F33C + BDB9C282C777DB3FF049BFF83A6AFBE0278334DF847F1E3C27E23F145AF8574D + 30E97E27D25A26D59A3454F26CEEADA674491957CC027132B6C488323B1794FE + 7FFF00C143BF649B7F87DFF0501F1D785FE14EA137C44F09E872C567A5EAD134 + 77934F0A5AA7988D2420248C8C6546650013192029C81F38F8B344D7BC3DF1AD + 2E356D0750D2EE2DEE945DDADDD9C96B2471E46F0E8D865F94630DC60F1C035D + 596E68DC24A138B738F33574DF374EBD365E5A6DA1E8E759252E58C952928A9A + 51D1ABC1FA6D7DE4B5B3DFDE573FA16F1EFF00C1D57F0F7E3C78C7C09F0FBE15 + F807C631EA5E3AF1369DA2EA1A9F8B22B4B5B6D26D66BC82396448E09E7F3A43 + 1B48A03346118ABFCF8D87F4CBF6BFFD963C3DFB69FC04D4BE1C78B3CC6F0DEB + 77BA7DC6A30A286FB5C36B7D05DB4073D165F23CB63D42B9239C57F203FB2FFC + 3AF10783FF006A5F01EB379A3DE3695E17F1969D77A8CFE50C5BC76F7B1F98C3 + 907E4E41DA0E3383815FD9D789BC57A6782FC2DA86B9AB6A167A6E8FA55AC97B + 797B73288EDED608D4BBCAEE78545505893C00335EF61AB52A98555A524ED26D + BBAB24941ABF92777AEFADF43E1F1D83AF86C5AA5C8E3A2B68EEDDDDDAEFD169 + B69DF5F85BFE0E08FF0082975BFF00C132FF0060BBBB3F0A5D43A7FC48F1F452 + 787BC216D6C0249A7A88F13DEA2290556DE2202150712C908C6338FE50078135 + CD4F4E5BA9B4FD76458C6F37096AE5501E58963C679E793EFDB1F75FFC165FFE + 0A0BAD7EDB9FB65DE7C43B5BEBFD3FC3335A7D93C0D2A3B45F63B08A471D08CC + 73C92A486420F0E4264A2827E0AD5F57BFD4B5D92EAEAF2F2F6E26752B24D397 + 959771E18939E4F7FAF35E2613153C54E589FE6DAFBD937656E8F76EFADDB5D0 + FA7C465B4B2FA50C356BB9593695AD76AE9DF5BE964ADA595D6AD99A35458645 + 8E458E6E3E666F9829C74C607E5CF07F0A923BD91E392449211F4EA7B1191DF6 + 920F51CE3BF25C69CFA5DE3C72F98975093E647246CAEB8C1C953F88A7DE58FD + 8A0FB55BC40C7700A962CAC7390C3839E38EFD771E4E2BD3F72E78F18D55A35B + 6E7B0FC13F17683F1A6C60F02FC42BA874DBE90793E1AF14DCB858EC26C90B67 + 7CE7EF5A48F8C4BD606393FBA2FB7CC3E287C38D63E13F8E75BF0BF89B4EBDD2 + F5CD1EEDEDAEAD263E5985D08243863C8DA78E41C3A1C91C5548618F55D2E36F + F9785203445BEFAED1C83D30463AF4C7D0D7B636A30FED49F0C6CBC3F732347F + 10BC1BA528D06F8FFACF1368D0AAC874C76FE2B8B5405ED8E096811E0C9F2ED9 + 1BC9D7075FDAC7F852F89748BFE65FDD7F696DF6B4B4AFED623DA6370D184ECE + 715EECBAC95BE17DDAFB2DBBEBCAF78DBE7A92C6181F74ACACDB8AF07AF3C96E + A327391CF453D320D30AF9B6A1F6798918FDE2AAFF000F193951EFD4F4E73D71 + 4ED4AD65D3E25467659641F7837DE8C81819CF4E4F033D47D0476F6D2CB75B41 + 2D242CC764877062081839E0F38CFE3ED5EFF99F2BCAD3E5B0EB6B2B8D42D919 + 9D961E634F35B6A83C160B938E32BDFB8FC37344D0B4B8EF3CCD475F8E05539D + B696CF71329040DABCAAE7B6436DDA0F3F773CED92488DBB633328392C9BB200 + 38C67E847F8F4AB514A3CA08CB210CFB94EEC1C90769C9E79F97D01C7B711522 + DE89DBEEFD6E6D87A908BBB8DDF9DFF468F5BF87DF13743F035FB2E8B71AFC6B + 730FD96EE7B9489A1BA8DB21A19ADB2CB2C6C17A19063008E457D37FF04ABF89 + 3E1DFD8FFF00E0A1BF08FE35594D1AF85B40D565875AB18C48DF63B7BCB59ECE + E258C9FBEF1473BC8611B890802348785F8A744B0D3E4B88E3BB9ADE3EACCCA5 + 9B23191F281F37391C91D07CC7209E9A4D53C3FE1D82D4699FDAED23324B35CD + C32C676A851B963524282F9182EDBB1DB823C88D3F618855E95DBBABA7AA924F + 67FD5D743EC2388A78CC14B0B8C4946CD2717CB28B7A7BBBFCD75EB7B23FB0FF + 00F828E7EC33E13FF82AC7EC49ABFC3ABDD716C2CFC451DBEABA0F88AC916F06 + 9F729892DEEE350CA258D9495203AEF8E56019490C3F3AFF00E08D1FF06ABDCF + EC5FFB46DAFC54F8E9E24F07F8CB5AF0ADD7DA3C31A1F87D279B4F82E176986F + E79678E2669636DE52111955608FE6310147E747EC45FF000719FC50FF00827E + F81B44F09F857533E2AF08E9F14AADA57896092FE289E458FE680878E5856164 + 6021495627F3598A8762D5D87ED27FF0747FED71FB40FC24BAD1F40D43E1FF00 + 82ADAEADBCDD4356F0268B790EA769048AF0B4524B7934FE41F9D584D6E15D5B + CBDB32B065AF4E8E2E9D29BC4528B8C9F7EFB27DAF6D9EF6B3B292497CAE232A + ACE3F56752338AD6F17D1ABB56DED7DD6AAF7D6CDB7F787FC1D3DFF0589D3FE0 + 87C27BAFD9C7C03ABDBDCF8DBC6100FF0084CA5B770EDA1E94C01FB23107E59A + E8100AF2560DC4A8F351ABF9DDF0EEB10E8BADAB347E5C255559411B9577024A + 9C11D882181E0E0F19ACBD73C4975E22F17DEEAFAA6A17BAB6A9A95CBDD5E5F5 + F4E66BAB9772CCCF2339DD248E496624E589249CD5A7D56DF50BB79AE638A3B5 + 92E0865898461475C0CE7BFB67AE71CD71BA2F99CE7AB96EFF0024BC96B6F36D + F53BB0F5A9A82A70D395E89F57D5B7E7A5D76B2BB48EDBE217C17F127C3EF03C + 5E32D3ED45FF0081F52996117D6D1B4B0DAB9C1F29C9C9887A07C64A9037EDC9 + F74FF826ABC5FB46F8A359FD9D752B0B9D4340F8E32C1A7E932450866F0F6B91 + B1FB16A880E02A46772CEAA54C96EF3283B82E7CBFF66BFDA8FC45FB276BEB75 + A15F5AEA7A2EB513A6A1E1CD6AD16E34CD6A16DCB245345964941008F982E703 + B62BF57FFE0D92F815F043E37FFC145BC4DF14BC25049E17D53C2DE1F7BBB5F0 + 5DC5DC77B6F6B777121865BDB194E2530246E53CB914B426E1009640DB53CDC3 + 61EAE2B16B038F85E17E68D48FF73DF4A4B78C972E925CD17D6CF47E963BD9E1 + 70D3C560B476B4E126B472F76F17A7345DD371F8A2ACF548FD5FFDB1FE2EF877 + FE091BFF0004ADD5EF74354B5B5F875E1883C3FE1B84E419EF0C6B6B699EA726 + 42AEE79E03927A9AFE47F5BD5E7F115DB5D5E497D7D70ECD2CB7170499245958 + CAC492770EAE4F39CB06193935FB39FF000752FEDCDE1BF8F9F137C2DF017C3D + E2BD367B1F044D2EABE256866125B45AB323C305B49229F965B742E5D73C7DA7 + 070F1FCBF8A3AF4573E1CD6EF2D6786686EAD4496D388F69F2A48E4C15C649DA + 31B4740477F97036AB8AFAE636A556EEF65F7BBBF9C9BDB46944E8CAB02F0797 + 41CB693D7ABE964FD12BEBAEAF53A8F0DDDDCE85ABC722CDB3CC40E8F1B8238F + 97AE380CA48C139276AE060E3D37C24743F13F8C2C66D73C40DE07B7D424DFA3 + 78BA2B495A3D3AEA3C011DE7D941B84F2F691F68863964FB8EC85242EBE59E18 + B1F3ECA59A76863B5B3787CF50373BC6CF8054676FCA42100007E76E76938F46 + F827F15BFE155F86BC55A0F89BC2D1F8CFC1179095D5AC635916785E065F2F52 + B19C2916F790AB004B031CB139495581565F0F1F46E9CA1AC969A593F95F4BF6 + 4F47B3B2775F64AB4E786E5846CB57AABE9D6F74F4D1ED67A3B35D7A2FDA0FC5 + 5F152EF538ECBC75E3CBEF899A7F4B1D4A7F112F8974FBC5E3FD4DF49248E372 + FCDB19D645C85645C003F77BFE0D78FD93DBE0DFEC3B7DF10F52D1F4DD2B56F8 + A1A8BDC5AADB452A30D36DD9A380B798EC72EFE7370172BE59C1C035F857FB3F + F87B4DF1F7C48D17C3DA2DED8DBE93E2575B7975BBBB3821B4D36C99CF9B7B32 + B0D91B451972ECC4B2367963B73FD367EDB7F1EFC27FF04EFF00D85CE9BA3DEA + E8B71068F1F873C236764913DD2B08D204961898AAB081089589217E5009CB28 + 3D99255A397E02BE36B454541595972B7D5FBAB693D22BBDDAB1F0B9B623158D + AF4B2CA0DA5369778B49AB59FF002A7EF34B4564EF6DFF0033BF6E9FF828A7C3 + EF8CFF00F051BD5E2D79748FEC3F0A6AD0F86ACF55BA862BA8ED2CE0320BA995 + A457585CDC12CADE5B02ABC83F29AB9FB53788BC75E03874B874BF8ECDE199BC + 4F66469D73633EFB3D5493263ECF791A0B9D3F1115E3CBC994ED41B0865F99BE + 057EC9DF0F7C2D773789B50BCF1EDDDC4825B701343B6736B2AA099BECD9B965 + C98F713218C796464E4B051E91E2BD7BF66DD67C331EB1AD78F357BB8ED6691C + F87EC26315C5AB2855CDC3CF22BC8E430CB4408F9C01C28AFE75CDFD962B3458 + CA1CD51DDB9FB9CD793D744F45ABEB74BA58FEB0A39253C0E5B4B0B8B872A8AE + 449414A2EDF0DE524F964D2E69349C64AFADDC59C6F89FF63A3F1BBC0D7DE2BB + 49AF342F885E1A9D4F8C6D6EAF65D5BED0892EC6D40CF25E34EC0385690AC2A9 + 9C382AB9AFAABFE09A7FB3F5BAF897EC7A7F8921D534B59639AE8B4090BEAED9 + 2EC176C60BC4A0FCA6472CBD463383E61FB2E7ED8FF0AAE75D87C44975A8685A + 9787C882DEED641399ED8AB225B5E44FB16E23F2C6D1206DD82108D8014FA47C + 2BE2DF831A7EBD6FE25F0CF85F54D0F52D5A497CEFEC4D425B19205639599626 + 2F0C6A41CEC5720F3B576F27E5F8BB1F98D4C34F095F9A2BA5E3A2EB6EF64B6D + 5B5F7331CC256C255A185A739B9C7DDA892924F46D3BC92B68DA9A7CFADA4AE9 + 49FBC78E3FE09FF7DFB5578AE5D3B5AD5A4D0FC0EB72D35CDA5B1592EF52DCDB + 99FCC2BF2649DAA5B255400000AB5DB6B9FB1D7ECA7FB137C3EFED1D7BE1C781 + EDF4F8A71752EA1AA787CEBB762544C99D99A39A44C08C7CC02A03B40C12A2BC + 9FE017FC14D3C19F0C7F693D37C15E2E5D4B498FC604DAE9FAE6A97B3342251B + 3CB8D96576F251CE54B8214B95EC7757A77FC141BFE096B1FEDE5F143C23AFFF + 00C2C5D63C136BA35A4BA66AF6B61A4DADD4FAAD9C8C494867946EB5721E4566 + DB223065CC676E4FECDE11E493A1C254F11975384F11524D49D457518A76D93B + DB952764D3F7AFAD923F03CFB1D99E1B1D4729CFF11530F848C79A2A9AB735D6 + EF95BBC9BD2F2BB5A6891E83FB1A786BE00F8CFC3CDF12BE09F833C0BA5DB6B6 + B2D81D7346F09268B717F1AC80BA1730452C91EF5073CA12B919C5781FED79FF + 000518FD837C69F12B52F07FC66BAF877E36F147806EAE2C1B4FF10780EE35C7 + D3EE03AA4D0C0F259C8858BA286113104A0CFDDE3D7FF6A2F8FBE13FD817F670 + B5F08F856E347D33C489A51D3BC27A3BCAA644211912E1E3CEE78D1816638F9D + 8632092C3F10FC7BF02FE06FC0DF05DFEA9E2A853C59E33D491AE750BA93593F + 68B8767CBB3089C6773B12448F9279209EBF75C4DC77432AC4432EA51F6952DA + A8C6F66F6B5DA515BB69B6F55E670F0BF87D88CEE9D4CCE6E50A4E4D45CE4949 + A57BDDD9DECACAE95AF7EC7C21FB53FC2BF0EF8F7F69AF885AFF0080F468BC23 + E01D6359BDBBD0745BEBA10CB6367249F242546E48F0873E586F907CB960B5E7 + 565E10F2EFECEC646916E37AC278DBB19480B20C6704E48623BE18B12735E85E + 31D5FED5A8DE4DA4DA5AC7E1F9A6027B685F72956C3ED6F333B1B3BB6B3606E5 + E32319E27C4BE13B8F06F8A66B3B5BC92E2D65649E093242CD0B8CC6CC33F2BE + 18161C80723B135D384C55674D4272B69A27BE8BAEFA9EC56C96187ABCF4E9DD + 5F577D1DDF4F237BC3DE1CD43C01ACE9B243965FB4054882908EFD186DE55836 + 4823071D0E0633F71FC06F84BA9F80FE00F84FC3BE27B36FB0EB1A5CFF00E9D1 + DF7D8648E39672C54CA432B81E6CAE4306202B6002C09F95BF67DD0B47F89971 + 6D63AA7DAA185A2958CB6B179D29B9457932500058B9181D08CF626BF45B5CF0 + 3D97883F668F0B595F358E8FF11BC077163646D2190B5AEAF6AF119209E290E3 + 025510B46C0F3993054E457E63C759B5483A5877D65ABB6DA3517A74BBD7B5D5 + D1FB1707E574A8CD62A17B4AD1495DB49D9C9DBB6895F5DDEC8FB57E04FC7AF0 + A7ECC1FB3869567A3DACD24DA7DACD0E9D692AAC6632F860B2479DE18B44C598 + 96276392C32056BFC59F1D6A97BF0A741D335EB7BDB7B8BC92D44D3DE221927B + B9A3926D9B3AAB65D17073B491B54A9AFCEEFD9EFE24FF00C2D7F88BA7E89E28 + 9AF344B395A1369A9DCDB2C11E9FFBF48FCE3075656958679070EDC03D3F4B7E + 0C7C2083C51FB446ABE2BBDD7AEAEFC27E039459F8734FB82C22B3B96895657F + DE0264544DAB1BE41C9E80A803F9A389B25A795D6756BB6E6F9A6DEF76F4493D + BA9C1C4194E57955478E6DCA5EFD46DA95DBBA508C5EC9B7277BAD15E5ADA29C + 3F00FF00E09B3E1DD12C1B54F112DC5FEAD7523DE6E965F3E6677F9BCC6381F3 + 1247007CBD031182383F8C5ACF84FC2DFB5369F71E30D723F1069567047A643E + 1C1A5DFD9FD932E56DE289628F6995A68FE40A70C031FE04CFA37EDADAADF691 + 736B67E19FB74DE24BC8636B5782EA555D350F981A47C301B9872198924AF0A5 + 82D64F827E0DF8FBC35677DE2FF11CDA8789FC6565646D7404BADD731E90CF18 + 492653B7890AA80F31CC8C309B846190F0E5B9ABA6A38DAF36EABF855ED24F4B + 72E8D257DDE9A27B9F3983CC31D529ACDB1F8A4FDAA708C1C9424B9ACAF17693 + 8C7BC972BD1DAEB7FBA7C3BAE68DF1C3E18F9D198EFB47D7AD24B79D14B80CAC + 0A489921587F10C900F7E2BE0BF86BFF000446D6BC2DFB456AB777BABFC3DB3F + 877198D348B8D1B467B7F12416EBB1BC9595F70B57CF9A1A6825CB960FB13EE0 + DCF05E83E20F8277C7E23683F162EAF3FB6ED74FB61A04965E5D8CB04202BAB2 + C84A3CD86520C62395D436D6C3E4796FC64FF82EBF8FBC05E3587C3F69A0F842 + E3EDD74D1C37A96F3C73080E42388BCD941638258E595381F3751FD6981F10B8 + 7B3AA74679B5172C4C209B51B38BEBA3E649A6D7C32B5AEE2F46EFF1B94F0B67 + B849D6A7C37888CA8CACA5CC9C7965DAD382BCA3769492D6CE492695BEB7FF00 + 82837ED95E17FF0082637EC8CB79A5E96BF6D8608B43F0A685610640709B23C2 + 01858618D4B1CE14840B905857F3BBF166E2F3C517175E24D6B58B5D17C59A9D + E3DF35CC323DD6A53F992B4ACB2411C9F66F359DF0D3B755C6771DEEDF457ED2 + 1FB51AFED63E3CD4358F1C437DAF5FEA25A6D0B4BD43503240E7326025B424A9 + 9A2452AA8485DD26D6C1CA9CDF067C0BF0F7ED33F15E5D27C02F3DE789A4D525 + B6D4AC754D3E2B95BC52AB19120906D11C688CFD09DFE437C857E5E3CFB8DA78 + BAFF005DC54254E114DEAB9925BEAF55EF7DA76B5D28DFDDB9F75C2BC174726C + 34A9D4942A4DABCAF2715749BE9CB2B475DA517AB77573E8AFD8EBE2F58FED63 + FB3BDE7847E2578DCEA260D3AEACA0D5FC637E2DE5D56365FF005A5448C9318D + 95C00B203B630DF28615F3E7ED5DF0B74EF0FF0086B4FD4345D0FF00B5EDF45D + 5C58B4B65115911523290194E199A2911248D97380263C8239C6FF0082876AFF + 000FFE09FED156BF0B34226DF4CF87FA6DB584E34DBD5B4B53AC7939660ECADB + 1566255B24BE3CC521CF15EB1F03FE3CF83B5AF86ADA2FC54B8D52DEF3C84BCB + BD3EDECDD26D51A09012239B3B4A6F558DC9C9C2B700119FCA29E031197CA19C + 60A33F655A5CCA9A56B277D528F7566D5924ECB6DBF4CC8FEAB5B0F3861E7CFE + D1537C918DF95B4AED2B7C576F4E6E976E2EE97C5BF1EBE02DC7C258356B7862 + B4D634DD66F9A06D3AE1FCDBD5B7313481E2E3F75242C8AFBC1CF1F76489D91B + C1BC65E10D53C297FA7CD35F7DB348FB3ABC0F759B88ED607055300BFEEC4677 + C6C9160A346EA0F209FB87E23FC309BE3A78435EB4D1A65D26FA3B89355D318C + BB36CE3E608CC4EEC32A95CF27EAC011E23A7E870DC7C1364D496DF55BA5BA68 + 2CC5BABB4099D8465B6F28B2167C2FF175203301FAC70FF1449E1AF51A94AFCB + 25D6D25A3ED7E9F2D763C8E30F0DAAD3CC7EA9828C9AE4E7E6BDECD6AE364EFD + DBDD6BA6ED9E3FFB70F83B4CB4FDA3FC5DA6DA35D5BEA90EA523DCDBCEEB716D + 233EC6536C40263C6F6430C842FCA0AC841D8B83E33FDA73E3178DBE0EAF8275 + 8F8A3F12753F04E9E96D6B6FE1CBBF115F5C6949140418635B5793C94F2FCB05 + 5557E40A3681815DA7EDDDE0E7F0FF00C7DD5AFB5A8D63D4FC55676FAEACD072 + 18DF40B721318395CCABC8E4609E4115E6A63FF84874D5B993CBFED0899E3BB9 + 95D7FD2E2EAAE467692187CC0E430DA4FCF923F48CA31B7C052945DE2E31BFAD + 97DFAFDCCFC0388B237471D528D67FBC4DEDD7BFA3B6BE6BD0EC3C15ABDE6A7F + B24F8856DEEB7DEF83BC4165A818E68D25B7974DD451EDAE84B1C8AD13AC3730 + 58150E30AD7921192C71E07AD5DCD78AD3C765682E3925AD64E118820FC99FBF + C2901480A718190057B47C1192CB4A7F156937824587C4BE1CBBB10AC9B91FCA + F2AED1547F78CD690E08395DD9618E9E4FADF86E4D1B5692DA369ADEE9021923 + 68FEA41E304E7E620E3770B815DF95CA11AD521D5BE65E8D6BF8A7F79E3E6984 + C4BA34DB6DAB592BDED6D96ABB6CAFB15AF34ABCD72C6DCACD35E42210909C95 + 2888D8DA47451B9B8C12BB9880726B3345BADB7F358CD1F930DF47E50504010E + C52C8E7249041032460E378E735A526A97DA358DC58C2DB619A41728485558A4 + 233F2F236F1B436DE0A9008E01A8EFEE17C52D2CD1C6D1DE726609C2CA7246F4 + 18F94119054F19E471C27B69C96FF09E4D4E4934D36A6B74F67D2C632C124054 + A32C7FBC21D0B052BDB8CF0793C907B64ED1D36343F11CDA66A5A2EA70DD5D5B + DDE96C6E6196DE4292ACD149E62BA3F1B59721B83901410738CBA3B13AD7868A + C9B629D49DC517609576AF040C0CE4E41C739E78EB427D3DAE66920455924402 + 4C1016263C0DA381F2FCA31D00F5E325F3467752FE913528D4A4A3386CECD7A9 + D6FC59893C5B059F8A6C6DAC6C1754BB2D7B6F6EC21586F32A64F2F8DB1C6D80 + E83808240A721735E6FA8C0C9F28FF004A8E4E8D12B6D909F9BA1008FE2233D8 + F4EB5D0F827C426EE76D36E7CAB7B3BC4224F39CB471C84131B918CE3713BB19 + E1F1D7ABAF749375A0DEB5BAADC342C3779B2E122E41F946006DC36939C0E87B + 9155875EC17B296CB6F4E8AFE471E3B9712FEB10FB5BAFEF2DDA5E7B9CDEAD79 + 6E97734763712496AAA76B302BB8807B37A9C77EFC0CF1547CC678D4C7E58231 + 8552C30738CF3FFEAC76A5793E5DA03A85072A40CF07D7FCF23A56C7853C2175 + E35BD863B76B7F986D2D3CE90AC600DA0973DBAFCA012429C03824766915791E + 5C632A92B47AF4FF0021FE12D32EB5ED4BC963B63D8CF3B84CAC08A3966C2921 + 4020F1F873573C55AAC2F7EB63A6C8ED69663CA0CC163339C8CBB0E3696F9B83 + C81C1E7249E309ED341B21A569B76B74EC556FAE2118495D48C2039F9947CC7A + 72D839C600E5DE560C6551F3337CC42F19E7DAB08C7DA3F69D3A2FD4EF956542 + 0E8ADEFEF3FD17A75F3F23426B8921CB43E5EE382370E7AF419FC3914EB0D5E6 + B1771248D26E5F955FE6F2BFA739F6F7EB4DB697C9844D71E6ED7E4395E3BFE7 + 9C63FC9AB4F7F6F2C457C889B68DBE630F9B3D87A74FD07E143ECD5CD634E325 + CEAA72F96BFA1A1A55DD86BB15AC77B2D9C855195A49810C8DD73B94798C7900 + 027667938C5771E13FD96AF3E24EA3E4E83A8E9A64922DC12E6F55564C6780E0 + 018F5C8C75E70467CBEF249238B71B7F2F70E4B31C7392319E4E323E99EBCD6B + 787B48D43515516723DBA339844F24C2D6239C2EDF31885E4738049E3818E6B9 + B114EB38B7427CAFCD5D7E68EAC1CF0AA6A38AA5ED3D1F2BE9B5D3FC51EF03FE + 098DF1BE1D3247D2FC2DA26B8B6E8663F64F10583DC20C641589A6566C9C6155 + 4B6474ED597A4FECC9F143C0DAA347E28F00789348B0D2EEE17BA7BDD3A5584A + 9210FEF176871F777796FBBEF60A9C0AE1AF752D6BC0D0472DD788AFDA39C968 + 5ACFCE68E72490CA1C8453F370719191D7D3E93FF82727ED1BA5F877E3D69F6B + E3AF125FCBE09D7ADCE87AC1492392686CA5943B131380255F30B1640A58297C + 062581F91CCF119C617075311274EAF2A6D28C27193B6E95E7257B5EDA2D6C7D + 96594F24AF8C8C29FB6A3EB284D25D2F68A935B68AEDAEDB9C6788FE1C6B57FA + BEB778DA243059E8B1A8B7BC91A65B88F20110191D10C9F7B004C9BC28CB004E + 4735AB6836FF0013755BAD583C76B78D3486F209D8AF9B1B02C262C43F218F24 + 127046782C6BFA12D6FF0065EFD9960FD9A6FB57D175A4F106870C313A4E97EB + 752431310FE4C302EC546619C065C8272738C57E437C6DFD9BFC49F137C55ABE + B3E19F0FEB5E19D1AEF5169ACC5E168DBEC98E1CFF00CB4607616C2839050918 + C9AFCCF84FC4EA19AD7AB0E474BD9351E6968BA69AEADBDDAE87E994385E8669 + 41ACBD54938F373A9C791CE4B54E1DB9534ACF57D77478269F60BE08F847A0C9 + 75A1C8DAD6A17E8B7594122DCD923CEE58AF2DF3B49B430C0C6483CF3D26AFF0 + ABC476FF0017AD56D74DD47C3FA5EBD6D6917997B15C2C2D8863490A0C6650A3 + 729F2C31C6E4073851DB78EBE0278A3C0C66D1EE3529E4D72C552E22B43217B9 + 44503CC45898B2C321F95828182AAC43061B1F57C53F07ED7E1D5D35C78C2695 + 9B56BC4363776F24BF686906090E586C98C6E0C6D8990EF427691B40FA679D50 + 97EF69D45273E6B5AEEF7B3564F4B24B4F467653E1DC4D1A5183A4D461CBABB2 + 5A5D3F7977D7CF5EE677ECFDF0DBFE153F8EA6D2743F0A5C78D341B868D351B2 + F11D87D94CE5086F37C8512790C1B6EC0E5C009F3A956915FD1B59FD90A44BED + 46D6CFC6F7BE1FDB3C579159EAEAE6FA28264553144613F656D9C8CE2232153B + 541C2575FA97ECDBE1D9F4D78ED2F1F4992EAD610DA95AD846DF6C7CF98EE0B2 + 9F2A50C40655DAA76E70A4B13EE9F057C0FE0AF879A3DD59EB1AB5C78A343BED + 2BFB3365F5A2ACD66DE5922E62B80C42B8917EE70A41208C139FCEB3AE327097 + B7C3CDB93DD72B6E56B6B7778DFCB4E97D923F40CA7C3DC3D0A5CD9A61E52838 + AB28FAEB15E76D536FAD9356B989F0BF57FF008666F873AF7876D0F88BC49A1E + BCA0DF5A4CD0EA96D6BB32A2E6230A958A55725830938018820361B9EF851E0C + F08FC6081FC61AA6A9AD69BAD4332E93AED8D8DA496367AD5BCE1842CF124888 + 8046A607319518485B6B192694789DA7C6BF11781BC7ECBA0AF8DEC740D4ADFC + 9FB649A7B411C937EF08686E943346A7746032724A82C0AB7CB8FF0008FF0068 + 6F1449E24D5357F176B56FA840D682D750B6D6A599D7534F3508802248D2EE57 + 50C244646462A7CCEA1AE8E4788853A988A73B4E5CADBEAEFA5AC93D7BDBAD99 + 39F47071C453587728D28CDC54E3149371514DBBB4ADCAAD0B349AB59E8ADF43 + 7C26FF00825569F77E35BAD2F4FF0019C97DA841AA2C5268A6C7CB58E2E70D71 + 3823E4D85788DC060F9CF0A4FE94F853C2FE19FD89FE1BD9DF5C69BA459EB171 + 68563FF4132CD0AA6D55DB1AE0A8EA5C96186C28CF41F27FEC57AFC5F1ABC55A + 0DCDC787758B3D6B49B58A1D2B56FED08ACEFCC6A10209E45531BC4029645920 + F3571B0BE1411F587C54FDB1349FD9C1665F1D78F3417BA876C2EFFF0008FACD + 72D08EA4481D4160492ABE59E78E776F1F907186231999632397622B3A8D7D85 + 6BBF2F756BD3CFB9F17C5187AF0C4432FC3C2F06B9E508DD4A69EAACD4656875 + B4A2ACFF000FCFBFDBC7F6E2BA97C703C69A3E917FE0DF11D9DF244BAB369CB7 + 9348C2208A633728D146CC0393E480C038C101727E49F8B1FF000532F8F17B6B + 656BA5FC68F8ADA259DAAC97172961E2CD42CE66792577669424C9C9695CED50 + A4AEDEBB548FD20FDA23FE0A1FF077E36AE8E74EB8D2EDEF239898E7D434E92D + 6EEF235323B5C3C8228E288976C285768D9E506575F2C85FCABFDA9ED3C1975E + 2ABE9FC3D0D9C2B2080C460B562B3CA598BC9E67DAA644DC083F7428DA028055 + 99FF0067F0DA53A118529E1E54A71564F7D3B5EC9DBAAD5AB9CDC458E86272D8 + AFAAAA4A094796579C928EBF14AEDF92B2B2B6C8E1759D6F54F156B179E22BAF + 1A6A1AE78975BB96BEBEBFD4267B9D46F5CEDC33CD2967E7058976E32A09639A + E87C09E29B996ED6FF0049D3FC3D2EB56D6E6E5A0D52CC5CBEA0EBF348C809C3 + 6D5C3888282E39C4854B9F35B9D026D42E24B896EA09A56667782227CD94E172 + 40DB83D73C10318C8E49AE9FC1BA7E9B6B64D71F68BA8A6660FA6C236CD97DC7 + E70F9C47C71B32598A2F1C73FA7E2A94542F2777E9F8696BA3C4C97369A92C3D + 35C91EDCD75A754A4F47E9AEA959AD084EA12FC49D41F4FF00B4689A65E5D4AB + 2BC51C2208EEE420EDC6010CA0EE20310064FCAAB9024B3F8697AB3341A82E66 + 8D65719611FCDFC44B9002923DC8C8C639F96C6A3E089BC4BAEADD5CC0B677B7 + 170903DD194451B4F8C8663D159F0DF3F085B2F9C8247BDFC21D034FF1B6A127 + 873C531C63582F2464DD432C2CB72AC548C654EFDCA382CB96CE7AE0F066199C + 70D4AF0DBAA5BAF4F23DCCAF24C562712A5885AC9FBAE575CCBA68DBB3FC373C + 97C07A75BF81A1D4A6B15BA586FF004D9DA16CB2496F3B1568DB283248642783 + CA800735F50F807C73AF6BFF00053C2D6B2DBDADD8D734DFB3A5B5E010B5BC91 + 79A9198E62DB951BCC79046C76AF984023843D5FC3EFD843C403C1971E2AB9F0 + FDEDD780EDF5786C75530C852491563F388888201DCA581CFCAB84E40C57A2FC + 12FD995BC69E028FC0FA5DBCD79E2282E22BBD15ADE3293DC090193CC00B118D + AFF3AF440E01006E23F3FCF33EA156317CBCCEFBEF7566BF3B5EDDBC99FA665F + 95D1C255755D58A8415A4934942D2D53EAAC9DDDF64F5D8A7FB0AFC29BEF88BE + 23D06E7C616D6F24DE1ABE68516E1EDE47BEB584992E984672CED1A30938F989 + D9C8DD83F5B681E2ED7345BE83E14E99A846EB7170F6F6F786275B69802CBB12 + 4072AA523258E490BB81CF1B7C4FC2DFB38EA9F0B3C50FAE5AD8DE5ACBA3D85E + DEA456AE3CB4BA3B52E158A82C8E56280A127A2C47AF15EF1F01FC3BA2F8B3E2 + 15D3EB57D7971A85C29BBB3B6BCB60B1DBC6EB6FE639392AE5CB0D9C0DC637C0 + DDB4D7E3DC538AA588AD3C449DE315F0DBE195DF4F27AFA9E5F1356A3514F132 + 92AB4A11F7124A4D495F964ED7DAF777B2D1EBB1ED5F09BE1EDF6BFF001AB5AF + 12DEE8F602CECAE7FB3F4B5B7B959BFB45D0F9726A0E1DB38555F2D5092530DC + 31F9AB8DFDA2FF006A2D7BC4DAF6B5E03F0DE8D63E27B5788DADE5C426E21449 + 7700E86486404AA1CAB005198F00A8C355CF0CF8875EB5B2F10EAF6F07DA61D0 + 2D3FB3CE2716735EC4541DFF00681F7555242E4B0253729CE7E64DE1E30D27F6 + 59F84B7DAF6B5A4C32DDDD18D6DD9EE5241AC4A6256115AE0BB79480ED24A8FB + AC70C7E66FCCB0EE50AADC61CF34945453D12F7757D7AAFBD743F208D250C72A + B569AAF52D085282935695959EFCD7574F4B26DB77B45F2F987FC3326B9E3AF0 + 66A9E1BF05E956E97765E443797F7F7EB149765A4FF499816014ED0AA804602C + 6AA51061B2DF39FED1DF0CB4DF81892CDADFEE6F219162B816EB04B2B1B66695 + 5DA20FF3A1730905BE5936919DA595FD7B57F8E7AE7C5FF8AAFAC6870789B4BB + ABA2BA769DA7C51C334619F191F2A0CC4A06FF0024066998A33945011FC57F69 + 0F825E24F104BA8DAF8C4EB1A3BEACC550EA10B5ADDDC44B302CEA8EAA7C800B + 12C380AA795E187E8991DE0A0EAB719735E724EE9DFA5ADA35E5277D6C958FD4 + F87E9E6145CA8E367049AE654DB7CF29B4AF793934E37DDA564EFDAE7CE1E2FF + 001D78374BF09E87AE59DEC8DE2CB1BF96F74B864B65961D2A37BA49A6B90889 + B66B8390A7CC27928163465594FD51FF0004CD83C1FF00B31DE5E6BD0EB171E2 + 6F8ADF102F45B0FED08BC93650C85669AE443B54C50E5F903EF3140768071F3F + E99F0DFC2FE17F1A69F6BA5C10EA1A86E69ACB4FB6D423B78DD248D94477385D + FE544C485500C924AA4ECC119E2FF67FF19EB3F07BE3A5AC9A0DBCDE34D42C75 + 5F2E7D5A62AB9B4C7FA44698C2A8E485259F782C5402EAA3EEB35C22CCB2EAB8 + 5A152495AED49A5CCAF78C5BE914D26D5FDE6DE8F535CC32585683A589A5ACDF + D9BA57ECEFEF34FE1D15ADA3693B1F4AF8D3FE08DB73F14BE3AE93AF41F62F10 + E99AD6B4F35DCB7CAC1ADD5A66173700A9FDE79DBE4262607798D892006CFC69 + FB60EA3E15BBFDA77C45A759DC6AD2687A7CF7767A43C251A2CAB968F2776EF9 + E489724E0286909DD9DA7F73B4B92FFC53FB22788B51B79574ED6B50D1AE4BC9 + 0821ED6768DCFCA060AB00E02E31D01070735F807FB457C299B5ED76C7C352DC + CDA6AE977F3C515CDD586F8B554699A624382C4B00F851C1DC5B93FC3E7F85F9 + EE2F33C4CFFB4EB3B518F245796B795BAEC92B6E9B6CF98C9F39CC2B61F1AE95 + 184B9651835CAB59295D49ED1BF48B6ACACECAED1DFF00EC8BFB475A690D6B0F + 88751874BD4E191590DDA48A046318055B696903AB72C472080BC1C7AAFC7FF1 + 77C39D0748D27C0BE05D3E1D3F4AD16279351D5674DB35C4CD92EC10FCC91460 + 3AA0203333B3903F76ABF3DFED75F07B54F851A147A1A471CDE246B8B68646DB + B19645557DE790102C6141662577A8191C8ADEFD8E3E0BEB9FB427C59D4175AD + 520B8935536DA3696C6DD42DF4F712B83E51DA1648E1B486F27925382A523396 + 0E01FBAAD91E0ABDF38A351C61ABE5BE8ED6B4ACADA6AED73F5BCA78B2781C6D + 2FED98CA6E9C13F69197BADC9349D45F69C74BD9B8ABF3357499CCFEDAFF0006 + 0FC53F1DDEC3F6F97FB72CBC35A66A1B41DB0DBCAB6B6E12CE1FBDBDA2B70B09 + 099C3C7B586F8F8F957C19A601ABDBDBA9B8B98DD5639C22EE50182AE78238DC + 570070323278AFB2FC53F155BE35FC51D2EF21B786E2E34D9EF23B17B5579E49 + 6292EA69E151127CA88BE63EE2D8DED2CAC4901027BEFEC9FF00F04CAF0AFC1C + F0278CBE2478CA68ECBC2BA74D24EF2BA8324D216DD6DA6419382E4941230270 + 323D08FA0FF5BA9E4B82FAB62DB6DA8A8456EDECD7E4D79E87E659A706E1B32C + 5D3CCA72515CEE2E4936E4FDD508C20B7936DC5456DB33F3F6E3C47A0D8F85BC + 2FA6C7A2DD5BEBF6FADDDEABAC5D4CFBA6F2405482DA350A02C5E5A063C96672 + C0800296C9FF008283FC248BE15FED3BE2CD1ED51962B6BA8D1BCB660D099608 + A508CBC10479850E7073B80E876FD11F1C6D3C27E23F0BC71697E19963F186A5 + 76DABEB77E2E8BC105A82FF66B148701632104677167DD9FE1CE2BCDBFE0A13E + 1ED53C5DF1FB52F1DCD69246DF10353BCD5AC18FCD1CF6CD21420A827E624153 + B810063E53D6BE8723CE154C7D29FC2A519A69BDE578C95BCBE2B7F755CF178E + 7876584C0CA872A7AE8F4BD95A317A5FE2D5BF3D16C7C89A44D6F77753C7AB4D + 186B884957285943630AEC79F9491B0918C707B66AA0B8129924821DCD95D982 + 1CA9DB81CF03BA838E0F35ABE36F09CDA3EA8CB99248F0CEA0807664838E7EF7 + A707818E4A900E12D994555FB3945D98770D819C73F97A139CE739DA457EAD4E + 519479E3D4FE73AD42B53A9ECAA4755D777EB7F266DCF37911C0CAC2DE1B88D9 + F637237328F948DA300F0064E00619239077FE16784F52F1C7C5BF0D786F435F + 3350D52FE3B4B38DC1524C9B9379C1242A677B1040508C430E2B1ACE78EE34EB + 5907CD25ACAC91B6FDB9F98B8CFCC1B92C4657B8EA78AF4DFD8F3E3937C0DFDA + 1F42F175BDAC73DE697319A03756AB2471B052A85D4637F4CED0C32DF2920135 + E6E36A55A787A93A31BC92764F66EDA5FE67D06169529E26953AB2B45B8DFC96 + 97FEBF335FFE0A95FB265BFEC85FB50DEF85F4B212D6DED2DE321C9CC7308223 + 2072063728994B73805883F32B0AE27E1BE88BE29F0EDDDD4EB663CB8F1034A3 + 72CF36D3B8024961CBA9DBF282109E71F2EF7ED7BE3A9BE2C7C457D46FB54BED + 7B56D49E7BEBC95EE04D70925C4B24AFB9B1B776E6E4A8C61B1CA85CF13F0AB5 + CFB3F8CADE329116C7D9711E36409BC64AF0086C9C823D4920E335C3818E27FB + 22946BCB9AA462B99F76BFCCDB151A1FDB152718A50935A2D126D6B6F2BECB5E + C78E9919BF84AAE78FD7FCFE1572DB5192D9176C8D1AEDDA0827B29C8E31FDEF + FF005D43295924FDD8F2D785C3770475FC78E39A92D2D45CBB49216FDCE4903A + 1F4C76AFB195ADA9F9BD35372B4771F05CA5B2E6266690E43F185009E3F2273F + 5C54BA7CD1DC5EB497983BB2586CC724F61DCE4FD38EF50B42BE77F16EC1DCB8 + E87F3EA7BF4AAF346AAE33B73D485E982323BFBF4EDF5CD4EE6AEF1B5FEE3AEF + 1F78DF4DF12E9DA5E9FA5696B676D631ED95CFCF2DCB93F7D9863B671C703D3A + 0C6DB1584AB0CD6F2624DBFBB2F8C0FBC33C0EB923AF1CF5AA36ECD11F955957 + 8008C862339ED8F5EBEA2ADDADA186E1A4693CBFB3BFC9BDB9233DBB1C73C646 + 79ACA34E308F2AD8E9F693AB3E76B5765B2B24BFE01D743E25D187C3992CA3B5 + 65D6A3BCF385E655F7C5B47EEB691C72A581C9CE4F7C86E7EF75C55837471C26 + 4039475DC5C81D5B239C1EDC0C81D4039C948E483526486393CD2DB76E391DF1 + D33FD7F95741A5F816E35C8239269570CC542440B79436FDE7720AA0380464F2 + 01231D6B2F654E9FBCDE9BEBFD6C74C7175AB2F6715AEDA69D7F3D7E66AE89E3 + 6F106BBE15B7F0D79725ED8C773E7C1631A16904ADD70BD7E72412ABD4E5B1CF + 3EA7E0CFD83F5E7F0DAF8B3E236AB67F0D7C3AEA248A2BA8CC9AA5E26323C9B5 + 0415DD8C6656527A8040351FC30F891E1CF80774B35A58C3A878A2D11BC89AE2 + 3CC284A12368C96CFCCBC31DA548248C955E67C6FF00183C63F18FC5975AB6B1 + AD6A0B1C3BAEDE48AE0CBF26E1940011B9D895555C0CF032A012BF3D889E3AB5 + 570C1A54A9EEE6D5E4FF00C2B6D7BB4FD3A9F63848E5585C346598B9622AAD15 + 38BB455B6F6925EF69FCB1B7A9F6E7ECB1FB7E786FF675B2B1F02E81E229358F + 0C6AD6692BDF6B524F20D2272CA1D250E8BB82E429F290282708242AC4FEA77C + 39F89BFB3AF86FE0FAD9683E2FF0D78CB5DF18BC3F6BBDD3A05611A80AEB1260 + 111C4A383BDCB317CB139C2FF387A2DFEB579A84862B39ACA4489A2DB25A797F + 65563B8A8E85BBA9DC474CB15EFD97ECF96779AEDD6ABE3AF136A1A98F0F787A + 588BB213E65CDCB9E15416024D91B173B881F714801891F9471A784782CC14B1 + 71C44A93BDE56B37524DAE5BEDADEDB35FA9F7790F1962F32AB432C9C1A87373 + 7B8D4128C126DC9B526E3049BB68DBDDB76B7EBD7853F660BAF8A7FB532EAB75 + F65BAF1178BF5A8234BE4613359C0A7F79E500004C441DF736E29B46D55DCC5F + BDF8EBE1BF0FFC24F8B77BE15B7D4343BED2B41BAFB4B69F7BE5BFD9E298A3C5 + B94A9073D718186CF7E9F9B1F007F6F6F1D7833E24EA5FF08AF88FC41A7E9771 + 7A1B409EE9924BE4D3C4855514E155646882E5D46D07B00B830FC47F85BAE7C3 + DF8F375E31F10EA5E20F157856E14EA570B753BC134B244C864B695CE57CCD84 + AA4809C027E543941F075380330FAEC69E618A518C69DA1149DE4D595BA24D2D + 12BEF73F63CA7891E615D55CBA8CA787578CA0924A32937FBC6FDED2CACACBED + 6AD689FDEBF1AFE3D7807C05FB2678A34BD2F4F98EB3AC6A42FB4CB5B20D7F3B + CA23569EE5031FB99E0AE5541C8E3815F03F89BE35EAFF0010FC2FA86B775E28 + 6D2E5B79FF00B3E2B2B284BADC236EDD1B83B70FB4A1D8C76B11260AF5AF32F0 + A7ED130FC28D662B8B5B1D52E23FB43BDBA35C32FD8E36DAC221B5558310C870 + 1D483820FCB81F76F803F65BF81FFB696952E883E22C7E0DF881AD2C38B7D4E3 + 1F65B99705A3713F576524E03307F931B4819AF729E4B86E158FB5C6C2538CE5 + CCEA72F338A56524E2949A56DDEBEA8F2F03C594331C2622950C4BA5BDE1EFCE + F394572CB9E3676BC15D59A4A4DBF3F9C3F668FDADF4FF000EF8F6E34DB9F09D + 9EA1A668D6735CAA5CB1B80F1A642B391B1BCA638FBB8003E769C9AFD2CFD99F + 4FF84BFB55FC38B1D6B5AF84BE19F0F5DB307636F1CB0DC4633FF2C27D9B5948 + 20E14A31CE1B3D07C4BF14BFE0839F1BBE06788AEADCF84EF7C6DE1D6970BAC7 + 86DE3965921DA01CC67F7E15BBAA21E83079607EAEF85FE319BE0AFC394B1BAF + 155C787CC110827D266B898BB6C0176CA4A81B801825F9CE4D7C8F8858ACA31D + 4A9E2720ADCD395B584E4EDA7549B69B7D1A4CC3853FB473AC04E9622BB94A9D + 946D26EC9B7A7B89E915AA76B5DBBD8FBA346F8E7F0EFF00666F866B6BE19D22 + DF44D2ED102451B18230EC063A19831271DB3DCD7E4EFF00C1496EE5FDA0BE28 + FF00C251AA7C426B7D66FC98E2B15B06D96C001E5C71EE21430DC189033CE7A6 + 49E8FF006B7FDA3747F10785DB47F0ECDA4EB1E26BF56894A5CA86B44032CC19 + C9CC981C05C163C292D8AF86BC43AEEADAF68579A7EA91C3716FF66526EF7457 + 139B80AC0EE65FBEEB93CED27000C8E54F3F86BC0F5B0F51E672AAE33774F992 + 72B3EB695F77E577DC886072BC8A53E7A72C454A9F136DECB5E5728B7257DDBB + A5A2BA6B40D37E1FF8DBC45F142CFC87B7D43EC92A21FF004684A8C11B5D51D4 + 104AA9048C0C203BFE5607A6BB692E9EEF45D5ACD7419EF637895EE5A296CE70 + 18AAAFEF406864C9C6EDD95E46EFBC2BC765F184DA4C0B6379A95D1B84B5F2D9 + E14123C2037CC8A300E3AE421424105F93B6BD2BE1C6B505DEA565A6C375E241 + A9322C31CF64AAF17900E6446591082C177294E7218A96006E3FBAE6185AD18A + 9CAD68AD2C9ADBAF6DFC9F91E464B9D536E5462E5693D6329297C5A72AEB17E6 + A567D4F31F17FC30BDD2B552BE48B7B8CAE62824CE4AFF00116620E3A0DE0FF1 + 703915D7782A4D525531EA37D74D60193CC8DA60158E7A94E46439700942C4B3 + 0EC0D7AF6B1A2C1E22D67CCB9B6BCB6B7F33CAFB3EA28D36A363F2952E028D98 + 20A676B28076AFF08ADAF0E7C08B6F15E91F6BBAB368F6C8B17DA844E96D7632 + 14C9F30385DC6342CA7009C63E526B8AA710FB4A2A1523AF75AFDDFF000FE7B1 + EFE5FC1718D49D7A55128DF45276BAB37AA57765ABBF2EEB5B33BEFF00827C7E + CDDE1AFDB3FE36E93F0EEE2E21D12EB5DB7924B6BC86E8B2CF2DBC6EE11E1272 + 54ED6DCBC7DD620638AD0F8ABFB3558FC30F8AD79E11F1459CC9AB59DCCA024D + 1FCE823260032A798C2A609E8DE48C28C12D95F09AEF51F801E2FD07C45A4DC1 + 4D4B42BD4920994A89A09E16001C670012AA0E32194F7C9AF4FF008A3E3F1FB5 + 5FC4AF1078E356D73FB375CD5035CCD115DD0DA3C6B8112A705518ED01D4EE04 + E7920AD7C5E659953841F2F35DB7AEAECBF35AFE1A1FA7E4FC379CD2C5C71189 + 50785F669FBBEF2E74DED68D9A9293D3A495D5DB77F4CF81FF00B5478C3E1D7E + CBF27C2DD12D74D8E1B4D54EBA2FA6BD2F24511B650A881B398CBAB365B3C360 + 104657B7F813F1AB5CF05EB965AD6930A68BAD69B6F2C2D21B58EEE0CC83CB53 + 6D1E731C8E6531803AB4883072597C6BE117ECA5F10BC5834592C3C11AF6B1A1 + 6B0899D46C6D9A6B52BE7C7230691030C168F0C07CC14BFCBC60FDC1E00FD9B7 + E1F7C04F86F1EA1E2F975A6F1269B62746D7AD34A99248654943C497324418C9 + 0394DB2120E15906154F07E1B36C5494E388F69CB522BDC77E5BDAFA27B5DBE6 + E55BB7A2BBB1F3BC6988E1CCA613C250A71AB52B49DE14ED36E4FDD7CEAED24D + FBBAC6C9DB4D59D77C0EF17C77FA835C6B966BAF4D7D3CB05E2AB086DF5298C2 + 586011875F2FEF271B9ADD64C8192DDA7C40FD9C60D77415D5B47923B5BCDEB2 + CF6AB22BF9F1AC12AA4417B8C3A0392010BD7150F843F69FF85FAC6A3751D969 + 9AADADA5ED9C77ED70A8FE5CFBD7CA32142303059B2BF30665C80C4123DBEDB4 + 1B59631A9E9456E235516FB042330E0FCC18120851B46467076FA9AF84964789 + AE9D3C2CE15631E6768FBB357D799C6518CE518D97BA9CB96D7D16AFF9933ACD + B1981C6FB7546741CBA4B67E56D97DCAD65D95BE5CBD8FFE129F87F61A0D9E95 + FD976FA6AB41A85BC51B369B0C4B2F96E0C8460BB72B87DDBB69F948271485CD + EFC4D9AEAD75E86C97C1FE00BF946A1AA5B5E0821B7B6488B2997CCF93CB0A0A + B244AFB99B1B46DDCDE93F1EFC396DA76A1A9DC5C5C5ADAE9B7B681A48510BBB + B8756FF540F2432E430190DC92300D788F8334CF107C4A1E30D1F4BD76DED341 + BDD1D25D4CEA73245F60B40CAF332CBF3A870ADF3B32311F740180E7E5F2AC0C + AA62BD834E5ABD13B36DEFAABDBBBDF45BAE9F5D95D48627092C5C5A824EFCCF + 9BDDE76949A96EE56934AFA5ED7BBB5FCD3F69EFDB5FC3D79A5DAD9FC3E55F0B + 7D8EF309AA456BB1A62A55805F2B0F10E37154432384404A839AF24FDA33F6AD + F89FF1974BB29354FB55CAC61A28A69B70B99D1F225F9557112381B4C6A46E21 + 41E833D2FC4DF8BDF0B7E1BF872EAC7C0FA6CDE25BC8D8C0BE27D550DB22B64B + 1CC181E683D406F28F1F316181585F18FF006F1B1F89DF03B4DB3D53C2DE08D0 + 7C4D630C025D5F49B36FB7CAA8AAA4BBC7B62DAF9C6C39C760719AFD4B867032 + A784953A51708A77B4EEDCDA7D96D6DD5F6BDB43F70CA387A961E142783CB64E + 2A4D7B4A8E3ED209A4F9ECD3924FAA93BA5B4123E19D6BE0A78C2F7C45A8EB13 + DD5BD8ADF47718581B688615236EE6DE1817254281B4B6D660429CB09690FECA + C7C3D717906AD37883594090D836A4F2796F1B7CA27089B5E56001DC47DD6FBA + A304697C56FDAEED7C3BA943A5C715A5D5BCCE832FBE4F2A528EBBD0FDE1B509 + 56DB963961C1626B87F11FC75F0E368FF61D3F47367A7C4A82E94A07124F2295 + 590872CD2C6985E0920EC5042A6633FAD6128E6388A7186229FEEDEE969756B2 + BB4EFF002B6B6B5D6E7978C865781AF2AD4B10BDAC1DEF2F7F5BDF44D5B5D75B + F2AD74763F4E3FE09E1FB5C78C343F845E39B2F186AD1EA5AC6AB7CD00C8063B + 699D157CD0481F2794C9B540C31D84E371C759E33F847E0BF0CDAE99E2ED5B41 + 82E34BF09CD06FB99D15FCB11324CC727399E462096CFC8A7031C1AF847F62AB + A6B5D4750D51B539AF34DB79A3B8BEDE76C53CA250E19B209FEE0DAA7071D00E + 47E9E7ED746CBC2DFB047933379971E230B770A03B5C232F98F231C12B9FBCC4 + 73B9F68C718FC038B706B2FCED430CEDED649351F752D12692E964DFDFE67978 + AA0B0B88C24B0F06A58C9A8C927BA8A51BB71D2EA3AB76DDB7ADCFC49FDB87E2 + 8EA5F1D7E28F8A3C5D0B5F41A145AAC9A65BE405986DC84DCA7EF06DABC7193C + 138E2BA2FD8B3C7CFF000A3C0DE38F105F5F6CF10DBE97FD8FA36C983C9666EC + 466E6E40DC42F970AAC487209F388C92871ECDF057F61BBDD52DB5B9B52F0FF8 + 975489B5317367E17D32DE49750BDB37665134EE22658232DE56D51F33A13B36 + 9656399E3DD026F86FA4DE41A97C1FF0FE8BA7DA5B2A4C58CE24512476CB1FCC + 19B74937D8E75880FBEF7D3C8BB9151C7EFD1CD305F53595E1E29C63CA959C56 + 8ADA6AF5BDACEDDFB99D1CAF14B193C6E22A5F9559C5CB4BAD1595EFC89A5676 + B5AFE68F963E0D7C6ED4BE07DCDFEA36F63149F6EB8558603C49186395404738 + 0808C0EC3DABEAAF8C7FB5578926F825F0CBC6DE3AD175BD5FE1BDE5C491E8F6 + 106D8B481342AAF2A4A88DBDA46674CB3942CBBB048E2BCCBE377ED68BFB2CFC + 40D2F52F0CF803E1FE99E22D1E6D52FEE96F2D66D42CD135885B162E80AFCF6D + 1031210C0285907CC01DDF2278F3C69E26BCF07E8965A96A9AC7F62D95AA5E5A + D85E5DB7D96DE360A80C1093F2E4A925C67728518E067E8A1C3B4738AD0C6D5A + 4A177BB7EF3566ACADF0BF85A77D6ED1F2997F8819964F49E114FDA285F91CA0 + 9B827A37193B4A37BB574DBB68ADA9F4878DFE2B5AF8FB5BD6EEBC37E1DB2F0B + E9BACDF456D069F0C865FB17DA5DA158CB3B6FDC234B96049F9719C804574DFF + 00052AD0EF75DF0F785F54B5536FE0EF00D847E04B69410AD797D0096EF51651 + 9C9C4F72621819211460600AEB3E197EC87AC7C3FF0006FC338EEA3B1835E96D + E7F1BEA36B2348974852D627CC8368FDD430A430FCD8DB757374A0BF932D713F + 12FE32E83F19BF64DF1836ADE5AEB1E1FD76687C21A689C23DDC9AA5FDC5D5EE + A3264FCCB1C3616D6A08200D908079E38B0BECD63E9CB05EF469BB37BBF79B85 + F57FDD7ADDDA2DBB1E9F11661FDA3858E2ABEAE4924AEDD928D93B24DB7AA4EF + 67AB6DF53E58D4F4FB5D7B4192DD76DBC36313468661F36D5570C809E70386F7 + 20E4B6467CAED216D575FB5B38646863BA9C42C1B236F0402C07391823240C67 + 3C6727D3FC191B2DE44D0C6658A590EE8D8173B369DEA78192438182B9DB8C67 + 9AAFF06BF671D57C6FE33BCB78619BFB3F469F75C5DAAB08DD4E562507393BC2 + FCAA32C464F2179FD4B0F8BA386A75255A564B5D7CFF005B9F9566596E271F5B + 0F0A11E694B469744B55B59256BDFD3B9C9F86FC133EA11D948B0C863497CE2A + 40606353D00CF27EF9E38ED8F9856C8F87373A4DA8B8B7758A698EF75FBA517A + 71C8EA158E719201E95F6B7C35FD86AF355D36D6CED6C6E1AE5D54312BB9A352 + C0853DB7BF43C803A0251057927ED1FE0EB5B5F1BDBF8734D93ED1F689C412C9 + 09CC728DA524DAD8C94003007D158E0E768F9DC2F1852C6625D2C3BD16FF002E + E7AD9CF03D4C9E118627F892F79AFE54D689F54EDBA7B753E62F0E7872FB5F9A + 6924692DE08D55657766DC76B0F97010E4804019E9807BF09656B0D9788A2DB1 + F10BA3F984EE0C7703D33819C038392303B9E3F4DACFF647FD99BF66FF00D97E + F35AB8F145878FBC7CB64F39B2D3DAE2EBEC9215191CAAC298F9406701828CE4 + 702BF32D5AE6EB5BB9BE08164F33CD45765684805540248F9B70C0CE003C0F71 + EC647C494B37F6D2C3C64A10D2F25CB77E4B7B79B3E3B30C8A5974297B792752 + 4DBB2BB6926BAB493BF4B68F5B3679AED8E0DBF795F1B5B232508207AFF9FD45 + E863F2ED8724348D8CBFCBCE33EB5512CF0AC4C9B55790B9E1B8F7C75FA734EB + A9E6705FCCCAF4053001CFAE3A679EBCD7DC495F43F39A5354D737DC25C5C2C6 + D8DADBB6ED19FA71FCC5553F71B77F1678C743EDF90FD6B63C3BE02D53C592EE + B58330EFD8D732FCB12B633B7711F3360121172C402403CD7AC7C1AF80FE17D6 + E2D6AE3C41AE0F334AB4692DB659CD2DA5CDC0C7EE1DE32AEB9C360F19C2E3EF + 6473E271B470D0729BBDADA2D5EBA2D11D185CBB138C9A50495FAB765DFA9E53 + E13F0A6A1E28BDB78E1863C4F32DBC73DC3A416F1C848C2B4B2158D3B1259800 + 3A90335D949E0CF0EE85A86B76BAE6B66F2EAD60F2B4E6D1D126B2BEB80E172F + 3CAC9B21550C77A23972154615B7887E2C78E350F11DEE9FA4B6A935D687A0AB + A69F6D23B35A42A4FCC63800D91172BB9B681BB3924935C86A3732DE5C33ADCC + 8DE58C9DC7E6CE7B027A8C91D7A2D42E7AB6727CBE9BEFDFFE01D11A94F0EA50 + 4B9BCDFF0097977B9A4BAC38BE91122B786DDC989638C9CA92B85C372F918FE2 + E98208EC6ED9EA135D4D71247346D6BF302F220FDE903851EFB5549E7008CF5A + C7D1F4BBAD4AFE1B1B5D92C971110A84292A586DE09E3FBBF367A56C78B7C370 + F85ADE1B78CC5E632AFDA06FC481C290768E48C32B024F39CE7A85175392FC9D + 59387555C5D67B2F96AFA1976BA84DA56A324ACDBDADA5F28F493CB21C1E0303 + 91918C1C824F3D79EB8F89EFBC21A7E972D9CB25ADD59C82EDF649FBC9EE118E + C72A78DB1EE64567DD9264207CC7137C35F839278AF51D4A08DB4F9A4D26D26B + 8787ED2192FB63B28E37671BB68C0EA369079CD63CBAD2BD9DD5BCD67034D6F0 + B8590B092380162030EAA704A0CAE0E1400BDCE12A94EA4DD38EB6B5D7AEC745 + 2A552953E793B735EDEAAD7B7E474977F14B5FF88D717D36A375712DE6A91AC2 + C8AF869A225B11EC55C005CE70305B20FA57A87C7CF145BFC35F84FE16F05E8B + 24728B0816E6790C21DA5B89199A495815DAA4A8403F8B009070323C6FE134D2 + 59DFADE4927971C721455F3191598156C01C601116D2474041EA062F6B3E36BC + D5BC5AF0C97924566B1CAB6EDBDA3118F2F61527FDADA80292571C0E1B27C7C4 + E5B09E269A824A14EF2B746ED65F72BFDFE48FA6CB73C961B2EAF793752BA50E + 6EAA37E697FE04EDFD366F7877C0DAB3DF2EB97D7B6D0D9F86ED20B89DEF0AF9 + D7ACFBB16E159B2EEC0B291DFBE43023F573F60D5F873FF0524F867AA7C28D62 + C6DFC3BE3A11CB0687AF3B61753B58D8B246ECA089245DBB8A15657009C86DF5 + F9250589F1FC1A5DEB49223C31C50BE5B00ED320F989C8DB9F2D30463193FC7C + 7A1FECD7FB41EB9FB30FC69B5BAD0619964B0642F1F0AA5D047C072432ED42C1 + 65193CA1C90580F94E36E1DAD9B60A4B0F3E5C453F7A0D6966BA3EE9F5BAB6A7 + B5C2B9F4B2DC447D949D38546939AF79DF64EDD97557D55FB9E91FB4D7EC45E3 + 3FD82FF685BAF0BF8DB43BEB8812F23BBD0EFE4477B0D666898323862CB92CA0 + AB027A95E70B9ACDF841A878917C4D7D7FAD7DBB4AD4CCA6F7CD688AE9E0363E + 529821236DFB805F914F38E483FB89FB2DFEDA7F067FE0AADFB3243E14F88969 + E1FF001348D1AC1A8D86A90F98F6B71CA248CCBC452F52B3215C9C952A7207E7 + 0FEDA7FB047893F629F176B5A5D96A1A15FF00847227D18DCE2FA69416765490 + AE1D593393236011CF0D827F2CC97C469E3EA4B25CEE97B1C64524EE9A534B46 + E17EAF769269EE9D934BEAB27CBEA2C43E58B5C979AE5778C96AF9A2F46D2F5B + C7677776769F023FE0B99AFF00ECF76EBA2EA10B6ADA224AB0C93DA5D9B85B67 + 6E372C6BB5594AE3E50C8011C9C115DC6ADFB517C18FDB0FC22BAC6A967F6186 + E4F92F2696A6C6E27B8F99D629896E31B4B62327382339E9F966DE01D63C5FE2 + 4914DD43E5DC094CE7ECE1E4898131B1F2F18E58ED0490D91B40C835BB79A1F8 + 83F677F177D8175AB5BA59D04123C127CB77002C639962942BF964E4AE5438F9 + 320104AFA58EF0B725F68AB6024E96237BC5B49DB7D3A3F4B7A1EC653C5D8886 + 22A62EAD15CB2F764D2E595DE9AB8E8EEB7BA7DEF747AAFC60F0C5AE9579A86B + 3E0AD7B5CD4ACEE1E4B3996E482F0A30236C785C461410BDCE1BA8DC7383F077 + E1FF008ABC37A2FDB3C4FE11B9D6A5935145926FB3DBC377216DF96791810D84 + 767264192CC3E61F2E3CF7C47E31797C5B75AE595E436368F0B24B1AB3A8672C + 372B14DA7E649093C1563190C496C5745E0DF8B1AD49E265361AE4B6DA15B442 + 616A0AD925BCCA0976556940F31D431C79870B27CAA36AA0FADFECFC4C307ECA + EA4AC9B724EF65F66F1B6BFA04F3CC2D5CC562214DD27F0A8C1A716ECAF3E59D + EE9D9F4DF6B1B3F1CB57D17C53A15ADE68BA6DD32E9D6AD04B1369E963716AF8 + 650D2F92FB1E2DD95DC114363059B8AF2CF0CF8735F93529174D8EEF6C842BC4 + AE02B15276955C8DDC01938DA08C0C6DC0FA3FC0BE2FD2AD4DE4D078821D4B4B + 85195D5FC3ECB21BA9542948E40BB9D761058B078F07856E419FC37F0DB4D5D5 + 646D4B5CD2749926B48EF6DA7822FB55ADEB0600A5C4A82301B19C300DCB7B92 + BC787CE3EA54654270765B5F99BEF6B72ABFC93F33DAAD9251CD2BC3154E7693 + D25C9CB6ED74F9F44EDB37DF55B1C9FC24F1DDC7861ECE2B7B7FF8995D48AF2B + A298E5908C2865958676827704E073E816BF48FF00E09B1FB41FC3CF1A7C33F1 + 17C25F8BFA35A5A786FC413FDAF4BD6E51BA5D36F429525C900A1F9400CA36B0 + 215F8719F8E344F8156BAA785B4DD6ADA15B18754B860E2657130E5445B896FB + ACC79D8C57E61B87245517F15E97A6E6D750F10369FA9AB4B6E6D3ECF2DC6F03 + 92BF2464638FBBB8FDE07B835E0E2311CF53DBE1E3ADDDF46FC9DE3D96DAAF46 + 7D761B8730998611E0B178F8D34B95C5DA51B3D1C64A6D249F5695EED59A67AC + 691FB2B7883C79F12F5B87C3365A4CD1CF77335B4075AF28CF0061820CA1635F + 97E6F9D97B804935D67847F63AF89FE25B2B3B7D0BC17AA6B4C8A60B892281A6 + 0636660773C7947C1390436475077015E6BF0EFE37EA9E1E755B7D56E61BCD29 + D248112D1A39D00E8C8DE9F3720120EF04EE079FA1BF64AD7FC71F1EBE243683 + A0EB96C62D7048ED04B0BB5BC6C58EE63B1B84C6F7209383F281839AFCF336C5 + E6545BAB5B97D9C75FB49DBAD9EAB6DBCCFD631188C565F83AB8CC057A12A708 + A6E4D4DECBDE72E5B277567B27CD7D753E84B2D2FC4BFF0004C1F849A3CF7126 + B0FE26F16249336896FE6BC76281479AED3A6DD8FF00326D8C2905D0F278C719 + F0C3E195D7C46F88B77AB0B3D4E382FA196EAF266BB0EC4C8E64D8A7E6F9DD99 + 833637B16DC7A03591E35F19DC7897E30EA1A3EA537F6E43E1DB97B0B7D5AE20 + 91EDE630F991B0666792571B8E71E6B004678C95AF6AFD9C745D3F4BD1B4DB3B + ED62EDEE350BD578A58504789385236A9FBAC1B9E7D072781F119C664E3071A5 + CD18C9DECE57D1EB7B6914F457D15FAEC7E4B8C956CBF015330AFEF62EBABCE6 + A2D7345DDC528EEB9236D24DCBBB67D21FB3E7C09D02DF4786EADF4FB38F4386 + 0516EB2D9EDB99A36450A92AB8CEF56CFCE490D96038193ED167E1CB5F096E58 + 764766F6CC248F868E318C2AE0F18CE383C75F7359BE15996EEC6EB4D695CCCD + 007F3160D90C6416F9B3C1E4E7E563C75E324D795FC6EF1C7C40F06D9EA16F1E + 8C754B1B55575F93CC77567D85786C1FDDB06FBA324ED196009F7306B0796606 + 86630C23AB2B737B55AB5513973426EED724A1CB6D7DE5CDD53E5FE54A8F199C + 63654E756CDBDA4ED74FADDDAEEFBFF91C1FED7BF14469DA36A4D0DCE9B6F717 + 5FE816C6EAD8C7758015E4014E0B2329DC09F9725738CAD7847C32B0F0CC5F00 + FE207C44D63C45ADF84B47D419346B9BB5B0696EB528C61DA2863DAA23CE547C + 8C177F0C01DC0FA5C5FB2BFC49FDA0FC66D71AD5D6A1E1BB7D1A5F3B4FBC8A08 + 9D4DB326D589537A90E701F285B230ACC9815E11FF00050AFDA37C37E29D0A1F + 0C681E179D2CF4C889B7F1145ACF9735DB0056412C1E58DA776F0CA7694724A9 + 0C0D79193E5335FBDC5457BEDBB4B9D5F569F2B4B5E56BED495A5A3BEA8FDF78 + 3F034ABFB0C832E9F3CDCA32AD3A7285A114D34AF35CB272B2692E67169BE46D + 1F3A78C751F0269DA6DDA69BA2F893C453DBC8F3D9CDA8DB470433DB920A9915 + 2462B283B87CA1830DBCF5C771FB60F81FE07CDF0E744D7BC11E22D574FB6B9C + CD75E1DD4F4B9D6789940FF484942AABA6EC280FCE390D81814FF66BFD95A3FD + ACBC6BABE8FA6EA165A1EBD6BA60BED3EDB5464417F73B862041D2366C3B8206 + DE8A46335F367C65F18EB9E0ED7352D27549352D35AC2692CE7B6BA631CD14D1 + B1531B00197192578E84F1D463F48CA72EA8A8DF95B537A49C9DD38BD7975D37 + 57D3AFDDFBD66588C0CF171A0B1355CF0F6954A77D24A6B4E6524E0E374DA945 + 2B3BABF45CB6ADF0FF004392C2EAF23B76172B3C374C6D888649A02AE7265650 + 8B12148D4E37BB963C9E0D7955F5CE8BE11D1352BE46B9D5F528E6575D2ADEDD + 0ADBA38915F96049C1C829B7AAA31CE4D3F55F88DAC787F5ECE90DAD43CF9CCF + 1CDE5491A91B76657E70A32A7A0C81903EEE3BCF835E33B4F1978CB4D867B848 + 7CFBB165234BA87966691C1624228F31084CE5C46A010C0382735F734F0D88C2 + 43DA556E71DDA4FB74D9EFE567E67E678ACC32CC6D495357A73BB517CBCD76FA + A5CCB55BBE6E657ECECD63F83B4FF1C7C4AB6F0DE9D025C5A1BEBE7B1B6D26CE + 078E4B895822A831AF2CEA776E1C80543672303F68FC07E05D5A5F83FE1DB2F1 + 45A49E38F125C69D6B2D9E9DA7CCDFE87027962149650A6381300B96DC5C9CED + 0C42BC7E2DFB0445F077F67C8DB5A9ACF4ED375A5499B4DD423B34B89A152245 + E0C9931AA14752217110664DD86625BE88F0B7EDB7A4FC43D46CF46F87F69750 + 7876C67FED2D635F65793CF822F99E46619672DB79C92CDB76A93D6BF0DE38CE + D6615D46850E58516DA6D5936DDF75E9DEEFA9F259CD6CDEAB7469D09CA34ED2 + 9549B6BE156B296968B56F761EF37A26B77F25FEDA127C68F3FF00B3BFE128BA + F08786AD4958F42D0649151D8E49F35D49766C16CCB2B331CF24B2AE7E6FFDA5 + BF6BEF177EC8FE1DD0F4FD47C59378935EBDB49640F7A86EDF4E338469E681BE + F43337C88248CAB008B8DB8E3ED6FF00828D6ADAA6A735D45A2F957F24F6E9A9 + 797BE4104729064DCF1B79842007058858D401B982A907F13FE336B5A97C52F8 + 9DAB5FDDDF47ABDD4AA228A6B7965FB2D9C6100F2D6378D5F3C05F980F995B00 + E7757DA78718179C53854C572FB386B24924DB7B5DEFDDB77D4F67159E53C0F0 + FD2AF4E941622B5ED151BC52B2BC9A77D775AFBD2BDDB6AF7ED3C7FF00B6B784 + 7E2A78B7C3775AF7C39FECBF07786D4B47E1DD36E73FDAD73B96595E59DB1219 + 67291472CAA559218F626368079BF821AB68BF1AFF0068D6F88FF13AC9AF3C3F + A6CEDAFEA5A5C09B6CF5030465ADB488E33B8AC3F2448573C5B21F986E523CBA + CBE13DF6AD3496B0C2E89195FDF0569429F35231B00E599B25768F9893B7935F + 4FFEC55F03EC753D7EC13562D0F82F44B84BEBE4754DBA84C1948B6DDBBF792B + B6C561820648E1000DFB66612C1E59819CE8B6ACADA36DA5DA37BFBCFEF6ECF6 + 48FCE7072C6E698B8D3C4C54A2F756B733EEF6DAEF54D3D5ABEA7D4BF157E2EE + ADE13FD94FE297C5EF884F25D7C4EF8BFA7C7A6697684BB7F63E93289563B289 + 7664288C02405F99DD9CF2EC4FE6F58DCDBBE229AD5669159A695132151110C7 + 0C2318C9257E63F3657CB3907207D29FF0524FDA2DBC79AB2C2ACCB1C72082CE + CE06388DF3B376010555108404E1778936F295F207813C4EBA3DE4735C7D9638 + 58995CECC6FE7851D89DC718ED90781C8F1F82F2BAB4B013C5548DA751DED7D2 + 2924A315E514923AB882B60E9E654F02E5684524EDF2BF92BEEFE6FA9EBFF047 + F654D7FE306B962BA85EC967A3BED954C69B669B2A19BCB880505700AF98C76A + 80493C05AFD00FD9E7F64CB5D4AF2D747F0E69F147021046C01A20E7019B763F + 78ED800CB800851B411B02FCB7F027F6AAF0CE91A7C30EA37696AD2157903396 + 331C0DACC0E01C607DF6E0FCC1464D7BB6BDFF00055C83E1B7859F47F86FA65C + 5CEB37C8567D4D970630786110C8D8067973824023E5C9DFF11C54F3FCCB11F5 + 7841C62B6E915E6DF53F64C2E1F2AC8F2F8D4C9796B62249595F99A7DDFA76FC + CF66FDB93E2FF83FF627F84773E11D1E7B6B8F13DF5B3C3A95C8FDE1B542A434 + 639E588255B0780C63CE5A46AFCA16F1FF00FC241F12EE754B899191E4249F31 + FF007403739030173804B31E39CE3823A4F132F8ABF68EF897636425B8D7B5AD + 52E0430DBC3297C484FCA1A5E1739200C1EE00ECB591F1D7F66BF1E7ECC5ADFF + 006578BBC3F79A4348A2E23BA982C30DCA64709212704742B8CAE4F182377D7F + 0AE4B83CB292C24AAA75A6AEEED26FBB4B7D0FC7B88E38C97356C43752A395E7 + 257767DB4DADFF000FD0E77E3AFC5A9FC7F7325AE9B71343A7DC91E787B82D25 + F3AFDC0CC4927E6CE031E8791D6BCB352B077D1E458CF9D34BC018E7BB6F3CE4 + 1EC300773FDEC7551E90B6092DF5CC863DC798C04DC39EA39386231DF39E463B + 65EB17EC9A12BDC35C349792AB5B48577B46A768DEC7AB6410BC1E70DD735FA5 + 65F185282A54B65F8BFD4FCBB36AD275253AFDBBAD3A2F4F2FCEF73CEFC25E0E + BBF135E44CC91DB5BC8FFEBA7188E427048500166C0ECAA4AE727039AEEBE1DF + C32D1F53B59B546579B4AB17F29A4922C3C970C370B48A3391BFA9691CB2C49F + 33E18C68F1E9D7F79F1375B9636D4B4FD26C6D61796EAE563FDDDB42014C8007 + 3F2B80012773301BBEE9173C6BE36B68923B6D36D66D3749B2B6F22CE153F308 + 09CB65CF1E6C92A92EF8F9B790ABB542AFAD5AB55A8FD94746F7B6CBE7D5F6ED + ADFA27F3F430F87A31F6AFDE49BB36B56FC95DD977BEAF4B756BA6F893A969FA + 45C7D9AD7549EEB52B7B668279AD18430A7DE1E4DBF1E608401B19DCAB48DB98 + 80BC1E162F146ABE02BABEB5B59AEAD6F82F9370172AA7F7843C6518E70159F8 + 38255B91DEB2FC2E4EBFE2AB32DE5C9179F1825270862469422FBE7E653B9BD7 + 8E40226F1E6A16BA978B756BB6FDCABDF4A6DA38F8CE5D8AC441E40C70491C2B + 64EE26A68E1D41FB197BCAD77EB7D0D2BE33DB47DBAF75A765E96D7E7F9FCCE7 + 65B9512799F3799312F26E18E4F391E8429C13D79CF3C1A86CF4B6962F98CD34 + 8EBBE2058A8007033D72307DBA607A549ACD9BDADD63F76BB632C91A292C0FCC + 41047271D324F202E7DA9CDAB2D9AC31C6DE6164CB7967E5EA48C74208CB039F + 523A631EA2D55E278725C92E5AABE13B6F02349A58926B56956650D23A463E63 + 8EB82148241182075CF7EDCBDD6A8DAE7892265591BCE9BE6442589739E83EA7 + 8E4F4A2DB5786F6D2582590B27CD26F9416798EC27079EEC00DC3070CC720707 + 57C5BE06BBF86BAE24DB639ED6E6206DA561C48648D8232ED27E65CB32904804 + 21279C562A318CDF36EF6F91BD4AD3A949287C31B5FE64336ADFD8BA9B5BE9F3 + 3433C69959D0491991DD554AAE083C166E4F0C13F8B2338D7B713DB24CBF3472 + 4815995F69DC3248C003A83C7620FE205FF1059C325D2C3671EE68A20BB965CB + 6E32B21181D79C7380483CF506B67C03E15BFF00885E3ED07C3F631C5757DABE + A76D636F6F31014CB2CCA8B1972C362EE66CFCC31924904022A528D38F3BEDAF + C888D39D57ECD3F4EDA8ED2A593C3DE1F823926F29598A3C8635F98C91C65824 + 8410AEB950D821B1D78E05DF13DD4379656F7DF65996EA6738745255DB27680B + B42E09072501048E99C1189ABD9AE9DE2159A692386DA495A702464DACBE664A + 9DA0FA0C1033C03B795AEFBE1DF836D7C49F09B5CB8F2634BAD2EE2158519479 + 88086DA5F9050E7710493808C3E62A6B8F115214A2AB3EAD6DE6EC76E1E352AC + DE1D744F46FF00975FD0D3F0BF832D62F04DE5DC3AB2E87259C8C554CC609F52 + 830807911CBD30416DA4700B648195AE026D6A49759B79B76D86DE44FB400C72 + FCE373290B90467E5E8CCBDC1E6C69D7FA85D45A95BCD71349710DB2AEFBB40C + B2451BA00858E5D5A35565F94382884021137575DF0ED27B6D79B4BD474D16B7 + 113392CC03C81986E5404B64A3AFCE3072C4A11F2EE6AE6E57479E737CDD6DA6 + 8BF3675C6A4710A9D3A6B96DBBD7577ED7B2F97DE5CF869F1A3C4BF073E232EB + 1E1FD6268EEA28CCB7451A5F2A454CF9B04802812290870AC5C7CA074E9FA45E + 0DFF008298C707C2C68750D1747D4ECB52B0FB43C4D126E4C9C3C50484131E00 + 2DC9C1046D623217E0FF0089FE02D06D7C2363A959FD8F4ED51A26D2EFDC6A26 + 7F32E14B396DDB3E55F224894B38C1686560F80523A1F0EFC4D77A2E8D1C7717 + 0CAAB70F05AA3F97E46EC236E3BB2A137349BB9181C1C61ABF3EE24E1DCBB3DA + 50C455A7EF45DAFB36979AECF6D763F46E1DCF31B93549E15CB9A12F7ADBA4FA + 3B3FEB43D27E3BE8BA3E9D341E30F07E9FAA787E6BC999B092379CA0302CCAEC + 095F9815DE30006FBB9AF2EF847E3DD5342D5668756D06DFC69A5DC49232BDD5 + 9B79D6DE60CB18E7F94C8159BCC31B9319DA7382EE6B23C13F12357B2F145D2C + 6D366EAE1EC6DAD63DB3063B00112060492ABB4128772E578C9507D3FC35FB48 + BFC36F115C786753D0D6E21B8F9AE8EAD69F67BF8949051319C71F37DE255999 + 4ED04015E87D4F1584C33C2F27B6D3ACBDEB2F3DEF1E9AEA7562338C1E678D8E + 654AD8549A568C6F072EEE3AAF7B7775A6E7A5C5E1EF0AF8E7E1136ABA4FF617 + 882DFEC8249426A6B67A95BBBB1DDFE8F75BA360AE00DA98273C38E057CEDE26 + 93FB0355B51A47DA2D5658CAAC01156467DA73861BB720DAA704EC5D8700E091 + EC7E20F12F845BC6D06A174B37866DE5F2E279A288491C6A14E784466646F957 + 186010AF076E064FC47F829E1B616DAC595F5D2AEA50B09362092C8483733AA9 + 53B94603677796E149F9148561E36538A8E16A5ABB972CF55757D7B377B3B792 + 5F2DCFA2CE32D8661414F0B2846AC2C9A5251BAD2CE3A5E37EAA6EDE6F539FF8 + 61F1BFC4BE1DB886C34B92E7475B893C8BAFB0A450BCA847CCBB55016F9D80C4 + 81F20900608DBEE3E0FF00895FF08E456FA7FD925906A5CDD4D3A9BA5BC62799 + 02C9F7158E08519E793863BABCEBC0DE1CB4FECC36B1DE46B0B3160D32B8F362 + 3F261768E785DAA07272704B1DC7B587E1BDC5A4F6D34D756725C5E232243047 + E725B30E30400092719E06072181E6BCECDA584AF36941477D93BB7DF457D37F + 2B1ECF0DE5F9AD382FDF277B2BB9C524BB6B2B24F6D6D7F43F427FE09C5FB6F7 + C33BCF87B75F08BE2878456F3C13792B5CDA6B4E7CD6D3EE0FDE72CA4B42C588 + DAF137049E02F4F2CF8B3FB39F87B5AFDA47C47FD91E2F817C22B78CB637361A + 781792C784C169517744CC46C660AA3255B6B6405F10F02DB5C789A67D07C39A + 7DE6A17971379C972D6B38729C11B102A444924125CC990CD8DB904F41AC6AF7 + BFB3BDE341AAEADE1EB7D485C7993C475AB5BCB9B7773966F2607902FBE41FB9 + CE719AF84C7623112FF67A12B4BA26AF2B77D6EEDF9743EF787B84E860B1B571 + D53130A6AAC5A92538B837A6B18DDDE4B66D69D773ECED2FF638F86779E00D2E + F24F166A1AF5A98BCE8F52B9916259240A00478DE32C879DB932871B9772202B + 5E81F0FF00E3CF85FF00647BCB15F873E0DF03D9C77EA2D750D52F6E24BAD527 + 391CC214E5958942228C6011838C86AF80F40FDAE2FEC6C248F4ED6354BBB7D4 + 0BA4B756CDB2D6620921595B21FAB02C0100960483B8D7D7DFF04BAF8717BF17 + 3E28EA5776BA45C496DA3E1E5B8BCB631DBDAB380031208264C60F9431CE32CA + A39FCE31196E6D9739E22A5494B7E58DAEDDFE564F5DEDA6E92D4D73ECAE9432 + AC463334C63C4D0A6AFCBCCD464B4494ADCAAF76B96F75D5456CF374AD6FFE16 + C788B5EBDB9BE86EEE5A62C23B9B46B7368AEF9F3A53D632097240C282AC49C0 + 19F45F0CFC40D3FC13A558CF62B7DAB5E6956F0FDA249ED56386F5F231B00E41 + DDB0EDC28DAA78277570BF193C15A57C34F8A5A978761BAB29352D42EE55963B + 7F95A5C3B1FDD296CA2F7F9BA92C466BA5F06697691780757B6D7AE0FF0066C7 + 6B886E9866EE59032A938E377C9BD57200264C938E0FCBE2ECD46A2BDB4B2EBD + 9FAFEBD6E2CC6385AF85A55A3774A4A3CB1492BC5A51D2C95FAD92B77DD69F65 + 7C3BF1FB7C58F0D58C9A5D9C71CAB187D4B6C86D611E5B8DCEC777CC4B295C12 + 06D38CFF0009DAF12FC7F93C33ABB59DD5C342B7222610236E9914AC9F31CF0B + FBC1B06DE4B601C01B87C2BF0D3E3B5C7C347D32FF004B9123D0A1B3BB9628EF + 90C0230CEA5526463DD011B89EDD41185F70F0A7ED71E1DD4F4D8ECEF23B7179 + E32B75B95BE9618EF1ECC281E74453EF157CB01960DB199860B0AAA10C45297E + E6ACE8FBB252945FC5EECAC9C6293D126B56F496AD5B5FC4F3AF0EEBE1F10E74 + E97B4A4EF64BE28EAEF7BDDDD257B257D34B987FB497C6ED6BC69A0C9A6EB0C3 + ED92DBA2933DC18DECE78A6658D8AAE143CB0C9316E00758E3C2B1209F1BF027 + ECABE23F8E3F162D747F2ED34FFED59A09E7D74DCB5E2424ACAC1C18F1B9DA59 + 70439193213D08CFB569FF00B4E783FC1969E2AF115D5B8D64496775676B7913 + 96B9D31D6158B63B364AEC1300B230DE56451CE2BE66F8BBF1A64F044765AE59 + 7F695F69F242A23D4B4D105ADE5ACA7246123011C093921806C2800AB3D7D2E5 + 11AF29D2AF5A5CF2A92BD48BE6BBF85FC575AC95D6BEAD3DDFE8DC2F87C7D0C3 + 55C26028AA1A3B4DABAE6695D4637FB0D2567BFF002B7BF03F14344F167C1DF1 + 96B36E745BA8B50D1EF1AD27B8B1BE89240F1BAAE1760F9146580200180DC361 + 90FC71F19FE315FF00C42F8897367A96AFA94B7935C1092EB12CEB7077364077 + 62E038C9C49C29C67E50063D6BC7FF00B4E6A579E22924D3FC69A85CCBAB9FB5 + DE4ACB17EF588FDE0F34808C7786CB7AB0193835E71A378EFF00E162F8EBEC7E + 26974DD62D2C2559A492DAC62B8BE9109F336DBAB167646739217202A9C80179 + FD6723C0D4A09CEAC34B5D6F75F27F9268FD0336C55654A3ECE5173925194925 + CAED6BEEEEB6E8ED65DCF27F895F0CF5E1E229A6B9B76D2AD266522E5269258D + A2C36D0B32174653B5BE6DC727A9CE42F396FA15F58EAFF60D3279AF2DEE1A2B + 002CFCDC5DBC9CAAB2ED3B9B39DAA78C8CF186C7DFFE13F057C1DF0E7C058752 + F881AAC56F0EA0C20B2F0A6996D75670CDE5920CB72CC64766192C55E5003636 + C7D54F037DE13F07DB789EF3C51E01F87B0CF35E219EDAE225975995D95937C0 + 646904513C809F9436583AAF07E46F5707C5719395174E568DD2764A2DAF36EF + F35747C5E2724A55EBBF636524FDE6D495BAB515AA6B6B3B6B66617C25FD93F5 + FF00F84D26D5B5BD37517F0EE892DA58DEDF5E4B1B695A7894C6121F31DBE7DA + 255291C7E6658C6369DF93FA59FB3C691F0AFE1078017508EFB54D37C37A599D + 65835355126B73997743E5A6763A46BF2871C120B06C106BE2CF8BDAAFC5BFDB + 2BE15783BC313785F50F0BE8D06B97773749A996B67BA9EE648CA98C3319E67C + B1662164618930719CFD03E08FD843C55F0FEEED74BF1A6B1A6DBB59D9AB4D3C + 7A95AB2E9D1A8006565911B392A30159B0CB80B9AFC9F8D3111C6D08D2C5D750 + 9B6FDD83BBE58BB74D2EF7D1689ADD9DF525471184961331C52A14D36D28B4E5 + 357D74B5DB49AB68F95BB453691C3FED27E2693F689D6B5AB3D2EDAFA2B0D5E1 + 65BDB0B4B995A592CC3A30CED5605580E7CC5008C11CA823E47F007EC3B7BE30 + 7BA974BD035EBAD374FB968E59EF993EC773294DE0A468A8634629D5C100327C + C0B71FA41E17F85DF0C3E15EB96D16A5F12B4ABCF0FDD3249A844F657464D425 + 31B958E6DD98E28F76D6456491DF1CAEDEB7B43D3FE0CF8FBC39AF683A3FC586 + D366BE8D9F50967516B1E856D029436ED2B3491D9A488F92D37992B637655A3C + 8791F1256CBF0EF0F83849434D7924D69A36EC95DDBE5F3763CDCFF1B973F66B + 0F87A8E9C124A4E9D4DB6B3BC6E9A5AF5E9777BA5F10EBBFB045E24F09BDD7B4 + 7D3DFF00B37FB62FE68352823FB562365FB3C0186D7DE7C9432EE090AB361764 + 64AF23E2BF80DE2DF8277B750436F25AC1A5E9136A7711D94CD25BE896A56695 + 11D9577990C2AAE5B820DC26EDBBF78F7EFDBD7F674F14FC2DD2756D6EDEFF00 + 4487C3BE289111753FB7886C20B04ECAA92C973390AE08694C680A41B4AB0111 + F8C7C53F1E7C5FA4F863C610D8DC6A11787F59B4B617724F6AB682ED20904A80 + 22C6ADE4F9AE81727612D14AC0C81B1FA0E4D53178EA4AA53AD0A91BDACD79A4 + FE6B5D2D7DBA5CCA860F0F3A2B1941DD3EA93D2D7E6BDAFF000A5AF4BB49B4D6 + 9E13F16AE2F2F45BEAFAB59C3F65F2A5B6B58394DCC19E30CC1482583672B9C6 + 36C7F2AF03CCEEF48682D8477CB796F149265D6550BE7E4ED48D5405E5B21989 + 030AA30466BEC47FDA93C0FF001C3F690F877A97C52D1E3D0FE1EF876CADF4AB + 8B4D1ADA499EDE25FDEC8739569A79A4F31DA523286545C15455AE43F673D6BE + 10FC54FDBD23BEF1D4DA7F81FC29AE6B7F6A82D64944769A659CD2EEF272B900 + 24270B96CB372C324E7F4BC1E755F0F424EB61E4B920E6F97DEEAED18B5BCACA + EEDB5D7757FCB338C9F0F52B737B55ABD5BB68BCDAFB4FA4536AD757BEDF30E8 + D75F66D52C65B88E4479B66DDD1336FDFB8B15217B2B28CF0A4139E993ECDE2F + 4F107C38F065AEA5A9F87EE2DF47D5A66834E95CFF00A3DDBA825B1C2EEC7CDC + 3120961D0F483E38FC46F07E93FB5E78AF50D023B1B8F095BF892E6EB4EB6494 + 79496A971208A0520A955F21210D8C807A9E315EBFFB4CFF00C14BFE1EFC77FF + 00827CF857E1A47A3EA11EBDE13D6DB56B7D42E628950ACB13C72C7907E6037C + 8A368CF28C39520F56655B195AAE11D2C2B942A5B9DFF2269B5DB6764FD4F0B2 + FC642861F1105897177D93E5BA8DEF7FE6BD92E54FAEBD8F27F873F1FE0F030B + F9EE16FADAF2D479B6CF6304691A2E724A9036860645203370C54F05707D27F6 + DCFF0082B378A3F6BBF87BA6787F52F23548F478A38A1BD9A01F6F9591700CBB + 731B37BA8E49E992C6BE31B7D42EF599D5249A3554696DA34473B63C64A051C8 + 03184C1CF1EF56BC39F65B5F0ECD7570CAF788ACB12E4969198B0321E4E30030 + E0F3F2B60D7A55F8472E962618DAB4F9AA41E8FB5F4FB8F3F07C518C943D946D + 15696AD2BABDAF6F54F5EF635EEAF24D519A2FDF4925C4AAA8C991196C8390C0 + 1C7042E79601783820D63788353FF84A75FBAD3AD66927B5B6636A3CB973BD4B + 606C5000E8BB79C862C38F9B02F69E0F81FC1D2788AE8C8BAB6B4CD6BA25AA67 + CC688168E5BA04F2141062560396326398AAF7C11F09B6A9E2B56BC792DFED03 + CB8D8B8026DAA4855C64821950024E39240CAD7BDCD0A34E557A47F3EB6EF6DB + EF3E7271AB5EB4692BDE6D37E8F6BFAEFAF91CA78535B5D03C13AD342D134EB0 + 2AC4C0F2C4B00E4719C050073C1F6E31CAA6A6D2398564758833E0CAD9603AF5 + 1D09F97A1EA3A53B4EBD46F0F5F46DE6046DA8A047F7896DE7E6E7B20E3D4FB6 + 6B3AD99A399515635E0FCC0F38EE7F2F4AF6A9D3B4A4FAB7FA23E62B6239A34D + 744BF56FFE01D669B791DBCB69F63CCD711C859990FCCC546EF94050005EB93E + 9E95475BBA7B6BBBC8649367D8D9962500B2B92486C8E140C863EC4E30472336 + D55A0D5A38A495639044769671E5A12A5860E781CFE7EFC5375275683E41243B + D8C91A05E0824007AF4E0E0F3D319EF4469A4EE15714E6BB5B65D8D8B3D457C4 + 1A7BDBC31BDC5C42C6647E927272401E9D0E07239C724119373671C6A1D2EBED + 4BE4A82C01E1CAFDCE7FBBCF3DF0303B5374FB8934D9A29A20D0C980C9B8AB0C + E1B9ED81E80F6E73C0AD4D6BC1CD65E1C8F56017ECF35CB4193F73940CBB4F1E + 8E71DB0A39CD3D212B37BEC1293AB4B9ADAC56BE9D3FCB5BBD8CDD266B5B236D + 732067689DB722BEDC018DBCFD771C0EA01E41E6AE6BBAF497FA758DAC8D70F3 + 69FBA11B9B72C2A082028CF07707273FDEF6E16EE392FBC3334919996DF4F486 + 3F9811F313971D7A0724F393C8E9C0115B59AEAB64E4B430DC01962D8C4C72C4 + 9DDD3A600000CF1EF97A3F79F4328F347DC8BDD7DE4619610ED23E729C1CE636 + CB7DD18C7CB82738EE3F2EDBE13F8ED7FB6AEAEB50B8BC9A1B3D3AE65548546E + 9AE446FE4EE638215AE244662082149C60E2B83BB89619163713451AB82720FC + 8A42E782727823EA31CF7AF4FF00D91FC2179E3AF177883C33A7797E66BFA3C9 + 6B2170A310A4D05C3B1672AAA02DB96CE467183D6B9730953861A552A6C96BE9 + D7F03BF27957962E14A8BF7A4F4F37D17DE72FAD2FDA5DAEED7ECB0DBBB24011 + 98298C85E7392719C8393D08C75073DDFC36D5AEBC3B652C7716F05B432917B7 + 0EE916C0EC0A9CBF3C1539079DAAC493CF395A8F832E7C1DADBE9772C238AF23 + DD14B96562BE62969001B0ED383D483857E0FCB542CEEBF7D38696488AB07544 + 1BD8BA10CBBF273B8A90036D2491CF0335CB53931147963AC5FE5A1DF0E7C357 + 739692BEABCFAFDFFA9B3A7F8674DD53C7D710DC6A51F87DA4DE901DE5A37895 + 416889CEE8D5D1CE4BA8186C7203670BC6576F6FAC436B7F224D6FA72AAA4B34 + A4BDCC4143E01EA08EEA36E3685E181072742BAF2F548EEA39A4916166749517 + 6B5B36498E40BD368DA3E41C103A0C035B09A15F5BDEB5DDCE8E754D3A378A3F + 30EF5DACD968958A95DAD2008CA7E52E1140E58D68A9B84F9A52BAB5ADA6FE5E + BE6CE6956F694F9631B3BEFAEDE7E9DD2F5343E14FC4DB1F0C6A33D8F88ACDAF + BC3FA9A471DDC92309E6B54F90A4F082400E85480B9C323BC78E411EEFADFC31 + B09357B86D0A69E6D0E15692CE6F106C81AE50B65264779360501893CB10C19B + 0DB8A1F3487E0BDAF8BBC1ED7F0C823B2DEF23CF30F2D509619883330DCDB95F + 04860318192A08ED7E047C67BBF82DA15D787BC4DA7D9EB9E0FD42E3F74639CC + 9244E982BE5CA15F6F1D4119C615B0B8C7CBE71CD52F88C15F9E3F143BEDAAFE + F24BE6BE47DC70CF2D392C2E3ECA12D633ECFF0095BFE57DF5B3F539AF8DDF0F + 752F053A0BCBAB3D36EA7850A235D22BCAD8381BD5C02BB5B70901DBD083F2B6 + 69783256B4D617CE9ADF32451C5022EA3324D2A8677C0F2D59830DBB83280996 + 27690431EB3E376A10E81269B67A2EA3A95FE890CECBA7D85C41E5C964C5379F + 270F20D8E581C202B80808E4B9F34BFBA8B5705B49B5BA6B756CEC0A4CD30C12 + A32B824B7CE761F9873C9DC73D196CA788C2454FAF5B5BF0DD7E2BCC9CE69C70 + B8F937AB8B5A377E9DF5BFDC9F749DD1ED1E04F1AF8CFC597D359B5AADC69B98 + 9E612DAC6CB70EAAB80D30FDE066D878CFCC0E48CF27BDD3759B7B3D5236F186 + 9BA1EA704702B5B3693A8BF956B985D76B8401C2E5DD8812A30CB313960A3E64 + F0A6BD2E9A1AC91A160EA8B74EB339441852A1771E064A7EED93793C12318AF5 + 2F855730DBD8477F3986E2F2611CAF0CF0FF00AE3B187DC032E031CED2CBB80C + 81B4FCBE0E6D952826D592D928A69FADEE7D2E459E2938AD652EAE4D34BCAD6F + D773E98F0C7C54F1B785BE054BE17B8D2ECEF7C326E5AF6C6E2EE2463A089E36 + 5F32399A42F107F91DC0CAEEE70AEE49FA73F67FFD8C7C67FB5D7ECB7A26A9E0 + FD3FC2BE20D43C20F2451985FEC3ABA2B9DD210C3F773658B6149CA8C2F0715F + 9EFA7F8EEEEDAF64D8BE4CD7DFBA8E3B0B2821419DE73F326DC65769DC9B480C + 4FCA001F467EC87FF052BF89FF00B347C5984F8626D1EDF43999206D36554DB2 + 202DB437909146AD823042B0CE484380A7E1713954E8BF6D4E11E652E7BA6E3A + D9A7DF577DF6EEBA9EFE658AAF8EC3BA5819DBA72C92716DEFAD959FDEF5D192 + FED3BF03EDBC2DABDD5AEA375A97C35B37B6F2B5AB0D42194B0BB48C121D5761 + 4DEEA0E186DDAE76AE3682FF00D90BE026A5E22F12DBE9BE1FF85CBE28B3D516 + 059B529B4F9AF2ECF98C0A04267FB2C2F85671E6A29DA431E99AFA0BF6F0FF00 + 828AF84FF6C1F0CF85756D53C2367FDB1A6B1459A787CF2C083950AD98D97278 + F33760824C6AC361E63F675F8DDAD3DEC371A6C3358E9DA7DA334171BD218AC1 + 0C7164472BC4C5D9A352BBA24B750AEBB58602AFCA66B99636197C9414974F7D + AE9B3BA7CCDFAB7E5B1F59C25859E270DEF518471117A5AFCBA6D757F87BB56B + B7ADF63DB66FF8254C36FAA47E2AD3F50B3D76D7CB16E34A830DF67B84E5E266 + 859A360920E56391B2CD80B9C93E99E33F88FE29D37C0767E19F07DCDAFC33F0 + E69A2DA3096D06E8AE4A49B99E4947CC0C8DBF29956C05041C572DE14FDBBEDE + E74D91F53B1D42F268EDC47F68D3A60A9344A001102772A463FD5C6819A22CF2 + 4B202DB14791FC4DFDA7EE7C75A8C9F639B4FB7B599E381EEA6BE8E595255CBB + 22333011B939EB9012304B1666DDF8FD1A79E626BA58BD79367A68BE5A3D3BAB + BED73EA72BC8F39C5E2230CDE9C1C612BC65251E5BE977CBAC64D746E375D91D + 5FC49F8BDACEB1E36B4BAD3F4D586D6D37D9CD7A6DCC0CCCA3124EECA5880CC0 + 727E65518C8258087E2A7C4CBBF136BBA4CDA3F932430963716AF234C526F2D1 + 5A50E703600548236821F9DC706BD9BF63EF837ACFC65F074874FBC5D23C39A0 + EF912F459AC8751BBC07C012AFCF18185DCC307920E080BE53FF000805E4DE2A + D37FE29F9A6B3BC9512EEEE2FF004682D5A43F22AB107A06562091B77004038C + C51A946153D9F2A5ECD35BFE77B6BE97B6DBA3D9C2E3B2C78B9E1128A961D59E + BAD9A6D735ED14ECAF64DB4DDB4675965A368BF113C10BA1DDAC96D0C88208E7 + 8A41BECE75956600903263F2C3B2E0F04286CAB1AF2F2D67E34D7352874BD375 + 482F347BF7D5ECAE23BB4DC599D89088546D521A4F9327A119246E3D2B58DF5E + FC3CD5F52D2619D743595DAF8C96F2AC96CC2368D1A108C5F3B8AFCC760000EE + 307C53E0A7C57D46F7C45696BA868EB1DD59DB79973399648DDD91999F07F8A2 + F9C11920B020F504D7B19560E4E8D59D295D277B5F66F7BAF4D2DE83C2D3846A + D4709B6DBDB56936AEEFF868EEBAEB72FF008DED7C5507C50F155BDBADB58AC9 + 676F7D18993ECF6F756AACA26472555965523CCF9B86500853804F9E785B51D0 + F5FD62E2DBC2173A9EAD69A883FDA564A856028FE644EEA19F2DB82F0410BC82 + 396C57D21F167C79FF000967805D7429F50D6B4BD3FCFB4B9D02783179A71901 + FF005331655F2DA6019508C00DBD30C761F8B74DF13F843C0A352D552CF505D6 + 34F958CFA7C2FE4A5D4457CB2090C51F0AB26E1CAB2BB7243135F6DC3F6C5619 + AF6769C6CACBBAD3DE5A35B269FE3635A78AAB0A1FBE6A2AEEE9DEE93D3AAD5D + 93BAD747A36B57D67893F63DB0F03F81757B59BC69E137D26463E5596ABA9C33 + 6A5A14AC154B2CCCB13BDABA11B8A2B6E0176E70A6BE67BAF08F847C07ADDC47 + 737925F5E69B861145379CACE08655556551B0AB0EBB8E5721597007DC9F0FFF + 006C8D67C3DF0EADEDECFC21E1FBEB2FF5E53511FDA13DA2247BF2AEA02B150C + 7861BB7672C09217CF7E2AFC32D17F683D7ECE4D1B4BB7F075C688A355BDD474 + FB7B6B9B5259B077C5C8DEECE1940565206EDC7048FA0CA73CC6D1AD2A59826A + 0FED271E9DD2BBF2D2ED9E5D5C17EE1FB3A6A5AFB8DDF5BF457B59DF6BBB743E + 65F08FC59D73C59E3BBBBDBC9AFB5CBB0ED71C4B32868951D423146DA23505B0 + BC1E8A08CB06FBD7F647F8EBE0FD63C45F6EBE6D26EAE1A258A486484DC5C3C4 + F2891A205B6214CE1FCC65988550A1410A063BFF00C1352FA4F85CD75E07D52F + BC49E2ABB559B57D49EE3EC161A74522905582603B0054858FCC0BF30DC71589 + F01FF603D4B5AF126BD6B710DAC77DA65B349713DDCD15D4571748A484B331C8 + C4B8F9577BAAB2B9E14E6BCFCFF36C9333C34E2AA7228AB69A3E9D1D9DBB3DFA + 9C796F2D4A7530B8BA8941DDCDB6D34EF6E89B57F35B356EE7E9B780EEBE1AEB + 7F6BB4BCD73EC5E198E574B0D160B9FECFD3ED97CC7DC3CB42ABF365981CE4A6 + E3803205EBAB6F841E26D663D2F45D3746D4A2B88247BBD4C22B430C488C7799 + 5BEFAA85E4860142E720E4D7C33F0D3F66BB4F01F88E5F0E78EB54913C45A6A2 + 5D5D47A74235192190BEE6818AB6E384278CB6DDC48F97A7D09E19F19787FC15 + E01BF9921BCF0FCBF69686C05AC64EA1AD81B95249C0C288B2C80C651BCC2B18 + C96193F86E6595D3A2DC3095672BECF65AECEF7D7FADCF93CE383E961E4A581C + 555A8E56B72DD43DEDA49AB73DF7BA5E72D15CF9DFF6D5F87967AA69D7935958 + B476FB770BBD3CA5D05F9BEEABDBEE4CFCC48C3C6D965DC814127E11F11783F5 + E5D5E383445D4A44B0664B296EE13F67B26C313E5C521D9F3E49264438273D41 + 2DF567C7DF8EFF00DA7A85C4DA86A12DA7DA08B66B896316F2BEC623E5015515 + 548DA421FBD9C63680DE0BF137F6A3F067C3EB59BFB26FAF350BE650B1B5DAC4 + A508E1C911CAFC291C36E01B83C015FB4708ACD28E1D53A70E76FC9DBE7FD7C8 + FDA1E5B80C1E5B08E7F88E49455F4766D2B757F72D9BFBCF5EFD997FE0A03E2C + F87BAEFF00C223AC5C6BDAD2EB528FED4D5750922BEBBD3624C289ECE268D9A1 + 655591DD5640A3696017696AE37F6FCFD9F7E1EDD5EEB3ADF87F5EF885F133CE + 66BB6B8B874B1D1E36DAA4C92B20966BB9C96DC17CE84EEE3014367E1DF1BFED + 5775E25F1035C2DBDB8B18A6E1622C8CB1647C8465B0A48524E32768E4818AFA + 23F615FF0082BEF88BF6619AE343B4F0D68D7FA4EA52F948FA85A4DA98B39793 + FB98D9D638C03B495CB63927049AFBEADC239960A5FDA78187EF2DEF4135152D + 7BEE9AE96E9F8FE2199719E4756B54C3D18FBB276FE58CED651E76A2DB4AD7F8 + ACFAADADE2BE3DF843E2AF8A7E106F115868B79A5F80EC65317F6F5D5B9B7D1E + 35660A123BA70A923E5546C427D79DDC7CFF00E33D46CED64923B5F39DAE18A4 + D78325AE48C6155997818C9E3AB2E5812171F607ED67F1AFC4BFB5EF8B64D6BC + 6175FF0009C6A5A8CD1C1A6DAA4F88A3DC020486DA105075185183901CE470D4 + AEBFE091FAEFC21F04D9F8E3F682D72CFE13F85750C35A5AF9D1EA3AC6ADCEED + 91DA8983C78CE72C091B892B8E2BEE728CF30F83A3159849424FE1846F26FC97 + DA9B5D7DD4BC8FCB38930B89C7E27F7367296B2936A315D5D9BB24ADB5AEDAD7 + 4D8F91347B5FED2F0BAB9864B5B79A6CC93C19DCEA1433E4925782A98C6DDA4F + 3B8F23175CF105BCBA9B8D256E20B3570E8AECBE67000E7B0C1638F4249CB1CD + 7A07C65F1BF87EE2F26D2BC1DA65E69BE10D3650217BB30B5C4FB73B5E6648D4 + 3B498391938E4124601F3FBABBB511BC623584424891924C3392C700E3938F7C + 679EF835F798594A4BDA4A2D5F64FA7AF9F9743F3DC7A85397B2A5252E5D1C92 + DDADECF7B79F52B68E8F17972B3158572A8081F336093862080383938E323B57 + AAFC3AF8471F8D2E2E755D724BBD33C29A5C705D6AF7110F2E79DE566F2AD2DC + 1C837370CAEB1A648016495B2B1B1AE93F637FD897C49FB521BEF12C8D1F863C + 0FE1D3E6EA1AE5C45BED2D7716D9144A48F3AE1F6B0445C9F94B36D40F22765F + 162C2FBE25DF3F86FC0367F65F05F84C4A5EF6F270D0C66408B717F7737DC69A + 4006E27EFA811A7EEA250DE26619DD1789784A335CD1F8DF4827B2BEDCCFA2D5 + ADDAD93FA2C9F289AC23C6D48B69BB4236BB93EAEDDBBEAB4F5B9E07E35F114D + F117C64D7D70B058C3004485233E5DBE930AA858E28F71276A85DA092771049C + B658FA5783747B7F87161797D745239ADD2293CB8E2C2A049E22CAAE3218047C + E4024EE20F40064DDE95A17876392D7435B9D5ADE0665B8D5E450A6F6462C842 + 020945C0C1E416C11B803BEA0F8B9AEC36BE12B98A4825B737C5AD7ECE4AA2AC + 9BD32707E55C9439EA40C3705B92B4FDBA861E09A83D3E5E9BAF9EBDF534A315 + 867531555A735769EEAFEAB47EA9BF2D0F0FD325F26C2E5638E42CC43AB28CE4 + 282483D3238CF23F87B739AB0CE366D18E4603AFCBB339C83C7A67EBEF4CB49D + 5216C293B815639EB9E4718F51429611300AA3712DCAEE3803D7F13F97D31F5D + 6D59F9C395D25D8B1A70C457CA1269B6C24ABA310B17EF132CC31CA95F971C72 + C3E94D3A7C96F6B1DDEE0B14D23A05CFCC76046208FA30209E0E0FA51A7881AE + 312472CA8EACAA14FCC095386C7A06C363D063DE8BC492D70ADE62ADBBEDCA8E + 15B27273C7F74E39FE1F6E025DAD71C901685A7E13ECFF00395195390CAA7E87 + E61D3D2BA9D3EF6C74EF01EA5657D0379B2959AD0A01B94B47D58E0AE0831F00 + 8237E4E4AAD72D6DE62A49B184797508BB47CD920EEEFDD17A7AFA66896DDBFB + 3E1996E0CCCD2B4462C30F2C288C83E9B58B607FB9DB8A8A94D4F47DCD68D670 + 6DC7B7E65CB3D5CC5A45DD982C63BA50AC0B60021A3738032392A70781E87A83 + 6F49D291E2924B7591A192564321254C600DC0E17EEE17273C820376C8AC4B59 + 0C71F97F758F45C0C13F53D3FF00D633CD5EF0F789AEB46BEF2EDDB6A48C55F2 + 9BBCC182BF5CED24718E323A1344A2ECF94AA1562A71F69B17F5AB876B558A41 + F3424956D992172793CF1803800638F53CF4BFB383B6A5E3CB984CDE5C971A7B + 428CC9906579123881C1CAA977504AE303D3AD574D5EDFC4B66FF68016EE4DD3 + 445DF0ACE4484EE04E589E00272CDB4F7C61DF077555F0FF00C44B792E621722 + 68DE078005569216460E0360E5990614F62DF4CF162AF2C3548DB5B33D6C1454 + 71D4AA5EEAEB63D22FFE1F4DE397B832C335F6AF718DB19DAD79708FCE4AAB6E + 755520617213A9076E6B93B88164B49A6B9B73249F289D32F1F9CE84657838E0 + 80C013C7000C00B5EB1FB5031BEBBB9D72131C8B3C71DCDBC9641922BA6943B7 + DA2240408C3B3AB88F9F2C9923249535E73F10FC5D0EB1A2DAEB9F6A97529AF9 + 0C7791B4A639ADEE78FDFA1CFCDB95973BD4B7EF587F0263C1CBAB54AB4E337B + 3E9D9AE87D4E634E9519CE2BE28F5767CC9F5D7FC9DD1C559EBB633456DE736A + 1F66B4FDFF00951CCD22C08482CA158008A5F6E5B3D48FBD926B47C417FA4E9F + A025DF8796FAC56F56586EED6E1E3954E106428519E98E59411C06C8C938371A + 56FD4E493CC45B72767DA596428AD8DF824AEE0558AAFCD9E4E7A0E2C688D2B4 + D1DCB5BDF34D1C0822B8B5CB3A9552BD49185DAA39076AA83804673F413A51BA + 95DE9D2FA7CCF928E2AACA2E124B5EA959FCAC43A6DAEEBE45B6B8861B9B5019 + 4484C6B0B03CE09041DA4679273B4007B0EBBE1CDE43AD5C4AD1F9D6AD02949A + ED93FD0D4B12BBE4E9DBE5391CF4C82325BA46AF6FA2450DEDB5F36B51CE5277 + 867610CD6332300048E319036E54EE0A410182E401D56A3AE780FC6BA0C917F6 + E5DCDAA2A6C58FECF25ADBCC0B6788F3B4B6D58D724AE485E8AB5C38BACF6E57 + 67D52BDBD55B6F5FC7A7A397D149DF9D732E8DDAFE8EFBFA7E07A2E9FF000FED + EF348B7D07529A38ED6F6349F49BD91D2D842CDB9916199A448A605893E4BB44 + 1B27610C581F387F817AA785A751BA1BF10C804D3DA6524B746E07991301E5B3 + 6000ACB86DAC017E09D1F0149A8780B4C6D3ADEF3CCD1DD04B3E9F7F1EF5B990 + F3F2021E30D955C903E6CA12092007DDEA1269BA8DE25A3DE5ACEF2AA2BCB2EC + 8519B3DD4B15E70A71819E70BB8E7E7A8FD628CE7184D34F5F5E97F2F34AF7DE + F73EEEB54C2E26953FAED36A51564EFEF256D15F69A5D2E934BDD4D4524A1F09 + F84268E690CD656CB1C500FB3AB33A940242C7E6C31E42E70700EEC64822BAC3 + 730DA3DD42D2496BE5E1639E29159636237026321472FB180DE064761963DF7C + 23FD947E2A7C5BF863AA78DFC2DA7693AF68BA05C07D552CE785AEEC5194F96F + 245904C6EC242AC9B8175642148DA6F787356D4ACB52B08757F0AE93797970DB + 20B6BDB25FB423EE20664011E342BB000CC320124E071E063339A73A9254E519 + CA1A49292BC5D93D53F2D75B68EFB1EBE5793E1D53F7E538766E178BBDB77177 + 5A356495CE17C37E1CD50E820269F7534CD1B1B4B0B289A49D95176A3150000A + 7CBDA3030718E46ECFBA7C21F853A5F852FAEB50F1595686487CD8F42805F595 + E5DB10481E62DBCA9B7736374AE1538F988E6B99F899A378C3E0E7C4B974FD6F + C2DA8F807579A225A1C4C149C7072CECAEA7AE57209FF809AC3D5FC41ABE9976 + B36B7AE7896E34F9A6116E3AB186D5D71CFCFE536E3D324372B8181D47898B8E + 231F4B9A949463257F75EAF6D13575F34EEFB9F4385CEF23C04951AEE7292D3E + 1B24F4D75B3D535BC6DDBA33D53C0BE0CB3F885AB35DDC3AD8C771705A0D034C + 91B54BB917E61E512AAC7CB50D8DCE5FE5CE3839AF49F8DFE33D53E087826C57 + 5C8E1F015ADC0DD6B06A7198EF2EE35E43476B8DECBC63CC20E339C1E48F20B7 + FF00829B7C43F85BE1B87C3DF0CE4D47C2F2DDC0223AC1B99352D5AEC18C8658 + 64B8665B68C8E73146AF90395C90BCAFC2D83C0F3F88AF3C4DF1A7C49E28F176 + A9ADCBF685D36D26FED1D72FE538563737974CF1DB2E4A641F3643C3322805CF + CD54E1FC5559FD6B315FBB8FC308FBF37F2B72C7D64E7D6F6B1F4F85F10960F9 + F0D94528F2D95EAB6EF7B5BAF4BBD3952FD4769FFB405F789EEF50B65D4AEB4D + 82DDF7CF74439BABB38455003E55D8EE1942EA46D6DCE46557D43F667F00EBDF + 1F7E22697631C5FDA773710C36F13990B25A6366C9253B4873F31C65C60B33EE + C8E3DA3E13FEC1DA47ED55E04B3B7F0F5E786FC1971AA402FB47D11EE3CCB9BD + 8006C4688504F3A8214F9D36E8432864202EDAF66F87DFF04F5F197ECE1A5DBE + 93772336A02E2DF53D4AEEDC96652EC7CBB65958012CC58630A4A0CF19C391F3 + 39E7186534A8CF0F866A9D6D55A4B55A5AF7D13D77B36AFA5CF672ECC2B471D1 + A38FC5C6E9292BB76BEE95AF7D1DB5D1DFFBC7D0DAB7C674FD997E0ECFF0C3C1 + 363F6ABED06E64FB54B6ACAAB345FC4AAC76EE930CC081FDDCE4018AF3DFDA53 + F687907C0CD3556D6E3C3D7C6197EC7651ED99E494AA444339F96362262E547F + 09191B98D51D0FE1D6B33EA525D5E5E6A11C2ACF71737171186FB32F3B98B30C + 040564C90307CB6E06D19F32FDACFC493D9DC69FE0A916F619347BD69A612A91 + 713298620E141272AAD1C927CB81F3FCDF7411F8F607054F138BA7097EF1C5DD + C9DFE7E5ABF9EA7B1C3BC379756CD29434A93E6752A4EEEEEEBDE6EFA59C9E8A + CDABEEB7303E115E7C416F80D7D6F73A7EAC6F164496CAFED96292E62837049C + BC2A416882365BEFB305071B88057E097862EF5DF1279FAD4D6093471DB23CB2 + 05558C47187DE38002ED1B88EFE61C64B62BD2FE057886F3E29FC57B3F0F69EE + DA6D8DD69A2CEEA48AECC4D18236F32A91C6F75E3A1DCC0800903A7F875FB334 + DA0FC4FBFF0003DC5D4C8CBA8DAA4B78E8ACAF089D55B0FC330DCAABD06739E0 + 815EC623368D28D58C9460E5EFE8B549DAFF0097E27B58EC761F0552B2C5350A + 8A2A696ADA8B766DEFAAD1DBCFCD9E31F17FC1561E1BD7ACACAF35BBD10788AC + BEC7E5593F971EA2258D5099A62378CAB46542E1898F03692AA7CD3F694FD917 + C2FF0009F49D0AFA6F1368F7BA758DB471450C795D4910070C1A72236958740A + 50020A00C72587D23FB7F68327813E1EC967A358C5ABEBDE0BBE7D4ED5A54492 + 054D90AEC2A15481B213800B1DED18E5B047CEBF08BF691F15FED5DE04BCF05F + 8AB4DD0F50D261B7678F51B9B611C5A332A33199711ED6D84E4AB124EDDA0907 + 03E8F87F1B8E9E129E614276A5176A8AE937D9A56DECFC9EF6EC7872AD531F87 + A55DC6F7BEAD696B7BAF6F4959B8E8CCFF00D98AE74CD43C4D7DA2C7259DC5AC + 33FDAAD5DEE8279F031DE548C630460B47B0F2CC49240C7D29E2EFD92BC3BF11 + 7E164DA5C3A9A697673B1824D53ED91CD721C04293799B86444C70554B651DE4 + 50AC8D0D78CFC53FD9CF50F81AFA3DC58C3A7EB1A96A216FA49B4BB37B75B47C + 64A1C3347860C54AE5B1BD88E08DDF52FEC9FF00167C3BE29F134361E2A5B5B9 + BA8630973652B155923088A8F116620850198A162D8046338CF0F1266B579566 + 596C9B8A7B2D5E9A5ECEDEBAAF91D39D51C4D2CB218BC349D484136F913D527A + 7BAFB6AB556D9EBA33E26FDACBE157C64F82FE1E8FE1EC3A87F6B69367BEEB56 + 7B4663737AA50B297DC4928A191D0AEF62A73B54A6164FD913E22D8F857C033E + 83E28875678EE2EC5DA3473793344FB0AE77B1C12431DC5BEF75E0F35FA7BF15 + BE08B7C33D366F10783D74FBAD36E55A33A7EAC19ECA3DD827E561BA2660823C + B705711B606D53F296B5FB25786BE22EB7713DBEADA4787B5BD424F2A5D22549 + AD5EC27911B614976324B16E192BE58755391BB680FCF81E36A18EC13C36229A + 8ABDDCA3A49CBAB925B7AEDB2EC8E4E0FCFB24C54678CC6F3BD12E68DEF192B5 + EF049F25B75AC93DB9AF6BF35AE7C7DF0AD8B4874CD0E49AEDF32B4F34EC92CA + 41190A42B2B1C93DFB0CE092A3C8BE3C7C7EB89F50B69649BFB4608ED24D4A5B + 282E6192E05B4603C8016F9542A862CAE0300AC369C51E38F831A87C35F1ADD6 + 9975E28B17FB0C88D70D613F9E21DA188019C2799B5BAABA8209C85DBCD799FC + 59B7D23C357F6F7A357B6D61AD26324DAA69D6EF26A1020E0EE46610CE1704AA + 92A245DC0920E6BE9323CA7012AD19D3BCAEB4DDEFB792F2FC0FB5CDEB617038 + 5588CB65CD78DD4E526DDACBE14F5565FF000C78AFC79FDA0BC3DAEEB5FB8D3F + C4175A5DD4A925EDBEB3A8B097288E9218F62B44AEFB18F9D246CC1D540010ED + AF99F531A64F7C64FB1DC3DAB393046D77B9ADB2494573B403B71B7206D23270 + A78AF67F19F80EC7C4FA0B78AF436D452D23B958AEAE1EDD120DEC37C681810A + 80AE0EC258018C00B9CF05AE780A4B5D36DE3D3EC6FEE8B472094410C8CD6C47 + 049DA58E0B292A01249DC0105881FD1991C30D86A51A54AE9ECD37DBD7FAFC8F + E52E26A98CC657955AED38EF75AA77D3A6E707A94FB2DA1B782DA388DB0DC22F + B3993CB56233BF25BA6E396C02A0E323A08F48B9B1D306ED4ACEE6EA5C8F2D24 + 3E54306E4248D9C6DE33F28E304F5DAB9BF736DA8477566C1A5D36485CBC0863 + 11BA9194C95675624654EE030304F41CF39E31D5AE35249FFB62E3334082DA36 + 6404165FE02546412A482491B9464F401BEBA8C39D72F4EBAEBFD7CCF81AD594 + 1BA9D7A2695B4FEADB1E89F0FBF6CAD77E076AEDAA780E1D37C3B7575198DAE6 + 18D2699C05018833AB9424673B58741CE00AE07C51F15B5BF8C5AE3EA1E26D72 + FF0054BC989324979725B3F2E010CD9C05191824632060722B9CD3EC64D56468 + 6DAD66BA6C9124B041E73140464AA85EBB40C6EE075E320D743E1FF833A96ADA + 6ABCF710E9EAD2EF78EDD4DCDC386C05CA2B0451B8B7123C600638CE4035F51C + 0D0A8EBF2A537A735BDE6BD77F91CF4F34CC6BC55295E54D6BCB7B46FE9A2473 + 7E22B2864856484DBAF1B1899062224671DBAFCD8EDF875FB6BF604FF822E6A1 + F1BA3B1F187C64D52E3E19FC3BBC549F4EB1B8468F58F1229FB9E4C3B5A48616 + 07E59E58C870E0C71C809C61FECEFE20F875FB26DB5BF88E7D36C3C43E2DB79B + 16B7B7312EA29A6B212FBE1DC05BC2E0E4ABED7742321D4E48D6F8D9FF000547 + F88BF15A1B9D2F458FFE11BFB5BF9173A9F9F24DA95E92D8E6762244DEDB4111 + 9C6776EE304FC86799A6798D4F079247D9C7695695AE975E55AFC9D9BDF45B9F + 4D83C8B29A12FAD66F575D1AA505777F36F45F735E67D7DFF0506BEF827F03BE + 13E8FE19BAF1559E97A0681014D2BE1DF8651EEB55BD25064DEC8CE16CD640A3 + CC96456BB9090A150280BF04F8AFE3078B3F6BF92C7C33A26896BE11F01DA5C0 + 8ECFC2FA34496FA746C3EF3CA47CF3CA76B7EF2625BE73F747CAF4FE167ECB7A + CFC60F17AC8D0DDCD7D35C06695A765070C2491F240E7099200F5EA71B7E865F + 05787BF65EF863777B1F931DDF94D6561011B4090A85690152C4EDCE73820FCA + 31C0DBF2385A783C929470D4EA3C4629BBA6ED65296F24975BFDA95E5A3D6C7D + 861B0398E6A9E2313FB9C2C55BA26E2BECDECB4D355D5BBBB9F2FF00C5CF0ADB + FC2FD574FB3630B7D9E5F30CB3165DDE4CA83CBDD93BD9D986E56255481839C1 + 1E33E3BF1B49AD6B6B7D70B1B5AC9B5EDC0C2AC71972FB766727059B3CF71FC5 + 9AD8F8B3F13E7F1A6BBA95DC527970DECA446C57CB69631B88C038E033336063 + 96CF18047322C23D36C20FB44E56F0059551D558449824678C8CE4155E0E5BA0 + 1B4B7EBB95E0E54A946588D676D7E7AB3F27CE7328D7AD386134A77D36E9A2BF + 97F5B1C5A318A55381B948E08CF4F63FD6A477CC5B548D8C72DB7D4671C7E3FA + 9F7A8D959555BD0E7E869F0B91010A5B76F05403DC67FC7F0CD7D09F15E4242E + 22941C6E5EE08AE8B4D82D351B8B80BBA1B8921F31BCC62C8EDBCB118504F4D9 + 8183CAFA1AE7E05599555B8E796C74FF003EFEF5B1A16AD71A7DE46AB0B6D915 + A37CA1F9C77DD8E4E1BAE08E001DB1513D8D69EF67B15F4C8D1A4FB3C8BB51A4 + 4904E5798F01BD723193CE78E3AF7A76A29269DACDD5A9B75C96783CB2B828C4 + E06064F2303BFF00F5E69EDD2C7C4DE5C73A476B3153E617FBAA718DE013B5B9 + 04807E53919E3224D6F516F145EDD5E4C8B23311733F947A12AA1CF7C6588E49 + E30783D04DDDEFD2C525656EB7FC0AB269D358432212DF6691B6FEEDBFD6609C + 363F03F9E3AD57D42DCF9ACFBBF76E7EF360E3F13CF43907BFE071B5668B72D1 + BB4F096F2C8549A3DA06015C9201C37520B700F7EB54F5DF0EDD5C6A370F05AC + AD0AB16F97E62177151DCE41C601F538F6A233D6CCA9D36A37457902AAC7344D + 3AAE4A86C1DD9C67EF63A9CE78E9F8E6BA48FC47345AE5BEB0D6A55A39E391D1 + 50ED9B60DCDBBB2EE196E413C7A62B2F4496155FB3DC2EDF94920862785FBA7D + 41382300E09F4CE66304D62CDE63491C339DD230180E003D146091D7AE4647AE + 40CE567A33A28CA50F7E2F5BDFE68F7AD13C696BA6F83FFB035579A6B555FB46 + 977B1C243D899906F8D14E4885D9B790ADF248432F2F26FF0025D5348FEC9179 + 6AB79677DBA5C871703733E40CECC8DD8E4EF5DDF77392320F593D836BFF0000 + EC75652D25D786673A36AB91BA48518996DA627701B4AF9D1E4F68C1E9807CBE + 5D45B524BBBA67896E262BC4A577039009DAE0EE5EA30A7239CF18CF8B95E1D2 + 73945D9DDA6BCD3DFCAEB5F3BDFA9F59C418B8A74D4A09A9454A2D68ED2576BB + 3E57786AAE9C6D7D0D7D5A1BAD2EFBCF5926B3BA4910472A44FBE565DDFBD2E4 + F0C38CF38396E7E5AAF65E2DBBD3B585B85D4AE96480E44B1A6D903A962A158B + 0CEDDCC7B039031D319F3EB17533797717576CB1B9F97CCDAD0FF081BBDC1E07 + AFE351ADDDC47928C2699B0BBC95B8DE400A0F52320310BC71C632C063D98D3D + 2D23E5275D737342FF00D7E1F81D9DAA2F8FB509A69AFAE04D6E31BC469B272A + A79774540A4AB39CB64367A9E4D59D37E10DC1693ED3E759AC6AD2878ADC9806 + 42827CC2DE5AE3A763C310080A0717A24F6F6D334970FA842638C00B6EAAB231 + DB9C6FE7E565071C724FA026BA5D47C70BA6476F3E97A9788638ED808A217AC8 + 4AA9CEE556460446704654A8F988E36AD7254A7562F928BD3D363D2C3E230F28 + 7B4AEB54FBEAFEFEBF33BA5F877E2CF09E930DC47A8D9DC6971BA8097DE5C647 + 42D8494F001DC87A29C81D0835E89A2FC4FB6D76D5ACAF34CB7B3B9BC87CD9BC + 978350B795DD47CDB27694A36EE4B4601079180F8AF03F075C5F0D45DA5BEF27 + CC4DCF9904DBA22AD8F98316561B872A01FDE631C807B4F87BA2F8A35EB392E2 + DF54B4B2767F3B2668E4DC19B059A4E64552A140DECBC8249DCC09F0730C029C + 3F7D2575B3D57DF6BDFEEFB8FA5CAF36E495A92959EEB497DD769AFBD7CCF70F + 813FB4178A3F665F114DAE787B5292CE4D42CE4D3AE9ADAD5D62D46D5C7304CB + 8612A638C36718DFBB8C8CDBAF1FDEFC61F1FC3AF6A97503C8D6A9FBF4944227 + 263CEE318E80E3200F946D001C86C72F65F1FB54D1AFE4B3BCBEF0B492BC42CA + 716B1CB6AB3C2AB8642EAC8B8181B300931824641CAC7A56A76DAD6AAECDE29D + 2F498E19F75C4136A2095456C978B74806589C10096E87839CFCEC329A74EBCB + 135692536ADCE95DB5DB449FE07BD8ECD275B0CA8612ABB5EFCBA2F796CDB6DA + FF00C9BEF4CFBF7C71E02F8F9FB4F7C39B5D5923B4F1C58D9D8C16C6EA2B7125 + C6D846C8CCA5464480051B8850793C8C6383D2FC7BAD780FE02EA1F0B3C49E19 + D3D45F6ACFACF9B7A8DF6886631C70AA03211B910AA95DAEA49046086C575FFB + 007FC143345F815E29B38D75A86EACC6C78AED2E8E94CC719C7CD9849C11F299 + 06723E6E0E3F473C75FB4CFC1BFDACBE1B2D978921D066BCBE8CC6B078874D48 + 6E2663D364B11576C96E0C4CFEBCE6BF2FCD2BC300E385AB856A9292945C22ED + 75B3B47556EB749061F1D8EF6DED39F9AA28F2F47656B5945AB35D9C7E4CFC63 + 862F863F0DBE187886C75CF0ADE4DE34BFBDB59B48BE8646096FE5ABE70A8564 + 6679194B0901C2A024026BA8F843FB28E97E39D17C17AA5EF8F0697737577711 + 5E2A58A493450261562B48095F3EE59D5860FC9109A36775DBB2B63F6BBF80BE + 11F871F1496F74F924BDD35672F6FA342C1ED1E41828ADE680EE839CC6768382 + 090090DC8F833E215EE8175A7D8E8E745D1759546379A8C10C4F1E8D08531ED6 + 69A36677C82C2441B54A2A44858E6BDCA93AB5F0DEDB015657936DB97BC97BB6 + B2524ECBAB496AF4DF43ED327C4529D25431B4E29A5CAB9538CAF7D24FCEDB6C + D3BB7A36CFD1AFD99B4DF0EFC08F85D1F86F474D5F44D6FC61AD40FA9F89966F + ED0D6B50B4881262824F282019119420AAEF76DA094661EF1E16FDA52E166B5B + 6B2D46CE0D0EE754BC8EDA2056E4E8BA6DA6D22696562E6E352B96311452CC53 + CC57604F2DF993FB3EF8F35AF18584D75A3DE5D45A2AA4D8956F7CED4BC47894 + 2B34D3BCAED1C654A8FDCE000083CEE56DBD4FF68E5B5BB9AD57515FB2DADA3E + 9BBED2278167F300325B5B0643B59BCE9B7CD3640501549F96BF15CE7836AE33 + 1338D56A73EBBB69EAB5D5BBED657764ADA5DA7F79FEAEE5F8EA4B11525C8A6D + BF795D3E974DDF6F7527B5935F69A7F667ED0FFB4DC371E0DB8D2E392DDB50D5 + 34685A1B6B45F2E0B6BB9AED894C28CBA2410F964725C35D11D467E18F889F17 + BFB3756BCF12789F539A0FF8486F265B5516F15F6EB48C5B379AB970332B330C + 138DAACA0E3728E2BE36FED25068DA6B4B25C37DA258F01DD447BDC46B118D46 + 49F29640B1467042A3BB6E2735F3FEBBE34FF84BB5A82DE3F3174F82589DACE4 + 7925C91E52E76A8059958007182DC8E14E07DB707F87F0C3D1BCE3EEBDDDB5F4 + 5DB6FF003B1D188E20C16474BEAD95EB2DDB7BEBCBD16C95B45BDF5D6C7EACFF + 00C135FE28DA6BDF1B66BAD52DDA48B5F91849F6C9442EE59D5E158F84DB202A + E770CAEE428C114E6BE8EF8BBF15ACFC2BF1B6DF58B73677434BF3228581DA2E + E0431A3C8C5B91279ACC181195319E0005ABF3FF00FE09DF1A7C599B5E6B246B + 3D2E155BC8A611C4970AB1711B33205F9CA22F1D49666C12FCFBA69BF18352BA + D76EAFAE5ADEEB7130A4323C7865F37CE0029C05DD221527A1048C0F973F9AF1 + 364B1799D5A315AC52BAEB66BBFF0056B799EF63329A39D637FB5A8BBA74D45C + 1BD1A7749A7FDE4BCAC97A5BD5BE30F8B757F8C7E1DF148B18238DBC45A55F4F + 77A6CB21915ED44EEE1C64603AC2E5971824918232437C87F00EF21F84FF0014 + 354F0FEAF1218D4C9657CA18052A37231CE42F4C9CE4F07382715F437C32F195 + C78BFE33D8DC5ADE37D93ED06D4CE10C8209D95D9262368DCAAC1438E73B8E31 + 5F367C7A8BFB7BE22F88BC53636ABA7DC79B33DE416F9FB38732FCC55598F04A + BA90FC617800702B87B0FECDD4CBE6AD1924FD1B764BF03EAB8529D3C153C465 + 5522BD9CE9C65EEFC49DEC95F7764BCDE8AFD0F5BD3BE226A367E29B0B35D624 + BCF0CDC5C79296B2BE6D948393B979DA777CC5876FEF2F5F74B8F873E1BF8C5A + 85D5D5BE89A8F876EE4B62D205B22D059CEA02C6A8CA4ED507059B0548DC418F + A1F81EFF00E28DAE8B61A8471DDCDFDA91C32DD456D32F97FE8F0DB2CCAE467E + 570A26CE491F2119F5F6CF83BFB79F88FC21A81B7B7D735DB576B68E5B5B1FB5 + CC8D7476C4044801D8776F6653B72C148E48E77CCB87715C8AAD14D3B74D2FF2 + D9F9B6679FE5BF5A8C6A64D552AB14D6FC976DAF8B469B7E6BA5FB9F4D7867C5 + 2F6767616F71E21BED5A2BA371F61D2E0826325D49196578846D8CB7CA640A32 + 5812319DB5E57F1DBC471EA79BCD2B508C6AD1441CCF6D70AED3B6039123B486 + 5C654E7CC8D0AB646C404E789F17FED1B71E3E8B549964D536DF5C25F4D05DEE + 9235650CC254724F97229560368191C67A8AF19F8C5F181AC25926914CCB7CD3 + 4A8ED37992C5B9A43E501CB943C7CAD8660C49DD824E190F0ECDE2AEF77D34D7 + CB4D3FABFA71E0785EB6026F1D89F76D7BAB2B5DEB669249F6BD9DED76F5E58F + D51F08BF689F0EFC66B2D365F89919D5F4FD2DC4BA2EA7A9F87FEDE6DE44C8FD + E18B6BCABF283B721982900763C97ED1DFB19F8ABE2C7C619A3D27C2FE15D521 + BF824BA6D420F11DC6E9216C9578EDB5093F72A38644858ED65C60A92ADF1BF8 + 73E2AC7E0CD36F352B17D72F2C6330DC4D7FA54DE5DC6932ABA0DAF095292206 + 2A8A7E50AC48C82327F487F67AF18D9FED83F032E7C31AE78ABC1DE30B97B54D + 6745D3AFE382DEE2DA26C2B047C33A90DF7A65672AEC432C40003D4CEB29AF90 + 5458FC236A9BBA6B5B476D5455968DDDA6D27B9F9DE71888E1AA7B7C3B8C63B3 + 8BF82377F146292DDFC5AA8EEEF7DFE0EF8F3FB272E8FE2DB384E93A359DD339 + B4922BD8DA29EFF7155597CF96DCE58BB0DFE5A95223C827712DE05E2FFD9E35 + 8F0DE98D7FAA58EA16BA75F4DF668F74EB179B2AED76D90ED572C5761DC50EE0 + 08208CE3EC2F8CB7DF06FF0067376D3F58D37E247857C4D34E5237F11B2EBBA3 + 3E186E16FB5D5651F3601329653B7804115E6775E0A5F8CBA74BA86ADA7DBD96 + 8A2310D96B516937F710CF70EDB6349A68259D9770F9B64926430C26D40EA7F4 + 4C9338C5D2A31A9372F67A6AE2EF2FF0D9B4F5F3969F238B1D87C36322F9E9FE + F35EB151F2BDB64F56B45F7DAFF1BF8CFC0B0E89E2E6B5BAD06F2DEF2CCEDBA8 + EFE758DED9C6DCC5F781C9C21C38EAA5882720F0BAE786A2D2ADA36B7D2FC3F6 + 69B014712A5CB290E64701833377EA0920F1D5811F427C4EF873E09F05F895F4 + 9B8D4FC451496312C37B75736CEA6DE404928B6F3AC722EE00E374A0E013B7EE + 93E583C1FA3DEDE899AE2EAEA1B52B16D8CA798554B2AF2C300E548DC430231D + CE4FEB596668A7053F7AD6EA9EBF7FFC3F73F2ACDB2A70A8E9A51BDFA38D97DC + B5FC8E12F343778E35B7BC92FE389C95590318A2C803A48C3682123CF7FBB8E4 + 8024D3A6B8D7A41670D9DC5EFEFC2992EDD9D5C9CEC2A00F9F24EE19215C7182 + 4823D5BC3DE06F0DE9FA9BDD49246241205E5F718DC93B57FE5992DC1C14CFCD + 8C7CC307D07C19AA7853C1F6F25C5AF87DAE2E266FDE35DCC6E094EDF27CBD70 + 71BD5C92AC7B914F17C40A9C7DCA6E4FA74D7CC9C0F0CBAB24EA568C175EBA79 + 597F91E59E12FD983C41E3BBF592FA187508ED4013044482287017A938033C90 + CCE9BB209184017D3B47F829A0FC39B7FDE359DE5E5E9453E4B94814846DC848 + 0A65E8546D0A87032CDD6AD78B7E365D5F584302470C166C4C70A1030B19FBAD + 1A463CB0BDC0551BB6A0C7A79878EFE33DD785A3965499DEEC83E5BCCE21DAE4 + 022301896560CBB71C386DFC0DA45785CF9B662D464F95765A7E2B4FC8FA0E5C + 932A4E718B9BEB296BF72DFF0035E87D0BAFFC71D0BF673F0735AC30DBA7882F + E358E47FF9F5842165B75C02D8C637061C29DB8EAC3E2EFDA0FF00687D47E347 + 897CD5BA9FEC96C4346B34E3E65F3172CD919673222F0B9C0008EB93CE78FF00 + C71A86BD2792ABE7365A56F3B180098C83B0E48C6D23249C6EC1E8CD5C7CF3C6 + 229AE2FAE9A69258FCADA58B4BE5AFCBC027685271F772321B69E01AFAEE1CE1 + 1C3E025F5AA9EF557D5EBF72E9A1F11C55C6F8ACCE2B0B4FDCA31D92D36F3EAE + E17FAAAE8F37FA135C497D1A91F6B2A32C4E36F9231B908054649E0138553C1A + 568B7137CAB1FDB24254295467F998A0652400431381D72324672D917B4FD05B + 54FF004A98C3A7D8E096BA91836C42006380048D9638C0C9C1E99C929AA6AD6B + 6D6F259E9BF6BB78E31233493E7CCB93D3B12A31B5BEEF3F310598600FB452E8 + 8FCF9EAEEF4EDFD6DEA7125B8DACC5B9E3D3FCF4A985C7FA3C7198D446189CE0 + F248507F2C0207AD57FBB8FF0038A9E6665ED27DD032C7D87E98FD2BB4F1E231 + 1C43387FBAAA470BC9E95A90DD4DFD8B222DBC1E4C877193CB5DE4E38E7A8C61 + B0063BD65DBA077185E8A49E7AF5E7F0F4F6AD5D1EE123BF92031ACD1487059E + 4D9B57040C9C10074E71FA6454C8D29E8509E596E0F993348ED9196249241C9E + 7FCF357AEF508ECAFAE231B9637CE4212B8E082391923D8F4CE39A82E6E55E79 + 248F73063908D9611E4F0BDF38518EDD7DAABDDA2B5C261B77C833B474C7FF00 + 5B142D42ED1D6F86B4EB1F10A47E54DF659A3854CAAEC047B8C810E012383B90 + 9C9EEDD7202C9E37D32F34AB98E79A59A3468CBC632C55B053382401BB731C8C + 6063BF5AE42C2F8E9F7AB2C6B0C8554F12A074E98CE0F07BF51DEBB5FF0084B1 + 6F6D6DDAE9FCE8E60AAC96EEA5E2C064560BD4632495F94160A7E6CE6B9AA465 + 19A92D51DF46B42749C1E8FC8E6DFC4F344CB1F9970618CE5237943119EBDB03 + EF1EDDD8735E8DE2BB75B5D2AD75611C37315F5A02E443B959C36E900CE7E5CC + 8791D0838E4051E677DA5059223E6298648FE56550C188CF030719E06403D4F7 + E33DF7C2DF112CBE1B6D16E6466B7FB52322671F249C10A76E770DE4F1D4907A + 2739E2A36519C3A3D579335CBE7794A9CFAECFCD1D57C0CF10E9FA5DEDCE99AF + 2AD8F833C696434ABB9F2245B324868AEB3BB39825447FBB9D9B97A631E5FF00 + 10BC37A9781FC6BA8787F58B18E0D534799AD278012CAB2838C8C1E73C60A9C1 + 50A7918AED7C3B7ADA1C9ABF85758FDFC12279B69751A85169216C875F980D92 + 291BB07241047CC2AF6AB6E3E39783563963F27C6DE12896D5C6F63FDB7A6C69 + B530319925B75E095E4DB8524318989F3A94BD8622559AF7256BFF00EDB2FBBD + D97A47A26CF7EA47EB98086113FDE53BB8AEAD6F3A7DB7F7E1B5EF34AEDA4BCA + 89F20ABC66191780419381C8E465B381C0F9B8EDD4669D35CF98CA55A49258F0 + AAFBF1989571B49F60140C63A91C8C526A30CB6DB59E18D63722376527692463 + E639C8276938C8E54F1D6950FD8FF7723437131CA6C2BE61CF6233C73FF7D7D3 + 273EDEE7C9EAAFD0277377708F3155456C2891B70DD92304E39FBB93FC3CB74E + 82E1F26DA253249234864591D148DA9872BE9C370C3EEB6339CE78AAD691C53F + 97B6359373302DE661622CA7B92323018F518C0E48C028B33348AF1C3246A8A1 + C884F97E4B20C6EE87247049C77EDD4CCB5D0B8DB7674FE06F11C2DADB79D7CD + 636ECE85992C52667601951100508DC9077151D18F3C831F89B521791BC56F26 + E85544643A790B0167CB6DDAE54AE5739C9EBB860815810BB5CC3B21563F6566 + 21549665EC7200CF60370C7604739096ADE548D1EEF30C8C770503CC67EC554F + 3C0C00393F7B919C1CBD8AE6E7FC3FA46D1C43E4F67F8EBFE6751690594E5CB5 + BCB7312ED503CD5B745C0C3295DADF2E79524679C7DE56AEEFC3BE239B4CD293 + FB1F48D09A368591EF1617F2E1662537A34C17E75C600FE1383C9CE7CCD250B0 + 5A3429235C49B0A4A106D04B0F997E5CB67685ED8DB81D485E86CEEE5D5F7DA5 + 8348DA85C0F34C85CFEFD87F128206D6520924E3B8CF04D706328A9AB4B55E7B + 7CCF7B29BF33B3B5BB6EEFDBCFFA5A9A7616FA94B7A6EEF352BCBAC3068E3594 + FEE142E06EE54636E0004E093CE7927DB3E147C61D7BE1A69AB27877544D223B + ADB6B38B77692DE03BF05C43B97CF936A1273B42EEC2B2677D78DF85343BCD42 + EA150B249753CA9E5A08F72A4670D9201C96276804A85500124F45FA4BE0CFEC + 57E30F895E0AB8F156A0BE11F04F836CD0C92F8835BD7638914C797CC31B0696 + 624AE40B785813846C0193F299FE27094A9A78D9452D16B6D7CADD5F64936F6B + 3B9F6395C2ACA94A9E1A2D456EF7D7BB7D1DDAEAAD7D1E867FC43F899AA788A3 + 71783EC5326677827895AF258CE4A492A461624DE48C2904B06180FF0033B62F + C3BB69BC61A8AE97BA49EC637DB227DAB124CDB83B6D5CEE77C00086238DA4B6 + D5446E4A2D41A1BE8F4B80225BDE288D5211BAE35052380C016F959090C8768D + 841DA72457D43F07BE015A7C04F8730F883C63343A65FDEDB89A1B15947FA247 + B46049C01955DBF2A15030A73F2E57E6B38C550CB70E95BDF96908ADDBF25BE9 + F81F63C299057CCF1BCB0D29C35A927A452F3D96BDB4BF4BABB3D57452BE0AF8 + 777524D3DAC6B14662BA96373944E556188701A42808E02F25B1B41AF9B3C71F + 1657C4D7875086EE4B5F0FD8EF1667C96DB6F087264906D208270A8A0004B4A0 + 1E146EEFB56D6757FDA62EAE21D2DA1D37C23A3DA4B79717054AC28AAA19FCF9 + 7E545CAAB6EC90082464202D5F21FC66F8C1178A2F2D6C7475371A2DB118B83B + 59EEA70AA9BF6842C004C228196C12708586CF0784787E55ABCDD6F8F797F753 + D93E9CCFA2E88FAFF1038AA9617091A583FE1A568BDBDA3564DAD6FC8AEAEFAB + B1D83F88DFC79E35596EA7B3B758EDE48D0C930F2F4C11281F658E2F94CAC84B + 6E3CE4BB600E08CED2B5C377AF5D5EAC6F66EB14B2430436F298FCB7DCA919F3 + 72C7702ED92C4825C06279197F07FE1A58691BB55D6260C2CDD02C7344EDF6D9 + 0B975B74880DD2B7CB202412146EC9070A7A8D0FE16F88752D6E6D364B58CFDA + 19EE6E846822B75454673BA4462AC91A6300ED5DCE7EF719FBFC44B0D4652846 + 565149765A6F6EFA3D7FA67E4F869E36B53854941B949B7DF7D9BB6DAAD3E7B2 + B25F5EFECB5F129BC03F0271A6DC2ACD75226E8C3B393170A541C825495C83D4 + 05524F415E8D7170D77E21B6D66FE687EC979A65C6ABE5798E563586220AB283 + FC72619580EB18C6E3853C6FECF9FB316AF79FB38C9E292B79756DAAEB2D6563 + 12593EF92CEDD4C9777014E0B612311A8C8FBC3032E377D9DF0CFF0060CBAD57 + 58F09DBDD786FC9B7D5346311B9BCDCB716424B59668A062012ECABE421CE36E + F7E482057F3B711E6996E13135B10E6AEE534F6BE8AED6BDB6F54D1FD2396F12 + E1B079052A35DA8CA2AF7BEAD25AAB75B68D7DC57FD8E7C28B15EC7791CAB6FA + 4E996305D9B59E4DEFF64B9B44492450D82B8B8C6CCEEC364F1DBE6CFDB2FE36 + 6A1E30D366D45ADAC6D756D3AD66D3752896D56DCDD4D096B7986D0312799E49 + 910372AF2C99CEF515F6AF8FE0B5B7F8636FF0E7C237A758F156BDE1ED72CEDA + F180126A02DA6F323446180320E54F1B8AC7D49CD7C4FF00B52FC6A83E30DD59 + F8B8DBE971F88EFE0B6975486E638E18CCB25BDBDA4AF2B920AB26C47123020F + 9CC304C4D8F91E1597D6F34963674EE9BB2BE8EC9B49B4FA49F36AF668F1F2EC + 74B11889E2A5EE3E56A2FED452BF2BB69EECE5CCEEF64969A3B7CB3E3CF1DCFA + 57C3EB1F10693A85DDC2EB96E9A2DCDD3868E4B60080F095EBB4AA9C16382A00 + F945737F0C7E376BDAF2E8BA2C71DFDF6A9A4DC85B34B6CACCF2C4E66B7DF110 + 45CAA8136D8F87E5C2B8DDB6AAFC48D6F50B6924D02CA25B15551147E56435EA + A46F16F624B98D8C415180CE5924E79CD787EB4174AF1047B141F225CF9113ED + DAC1E20CFBD43676B6791B705140055401FD3D95E4B87AF41D39A576DB8BDF46 + 9DAF6B6C9DBA5FA9F97E71C518CC2E23DAC24ED6E59AE8F54DDB47D527B5D3B5 + 91F707ECBFFB5AE9B378A62B0D6A7B7D6AC56EDADE69239D899601CB32B73905 + 42BAB63EE900A8DC08EF3E36693A2C12DC5898FF00B434B908B8B661232EE52D + 80724901D4E148E396E0D7E735BEAB3E836DA66B16F70F34CF70D1DD2C7FBB64 + 2DB8ED11B30FBE15BEE9C2B44DD0E01F6FF03FED4327883C2D0DBDE17D41ACD0 + 13E7AEE12EE0A368C821548DB81EA4636E063E7F3AE0354F10B1981BA5D52D2C + FBA3F42E07F1894232C2E7179DD5B74D35D2F7BFF5A1D74BF0FADFECAD75A06A + 9269BAB35D1B7759A758D5ED8A10C5CB6448031C00001F77209DA07DF9FF0004 + DFF88163A0F8D25D275AF06CBA95C5BE98EF7D7B6F0F93231CED0B7303859278 + B602C97488B221210EF0A1A4FCE282C750F1EDD5BC5A0DA0D42FE309730D92FE + FBED50A82AF86DDC90DBA22B804F209E403F7BFF00C1313F684F12681A46AFAC + 5CE98B77A2F83D522D335096F3ED579E1C5273716723B0DFE596CE5242015750 + 76111BC7F2BC7186AB2C9EA467693B5ACDD9DDE8B55AFF004F7B58EAC6FD531B + 0A92C05392E65A2E6B27E8EDA6BF3F26EC9EC7ED3BF1AFC77F013E205DEABF0B + 6D74BF1FE81AB330B4B2D6741593548A3DB9C59DFC71E2E49048FF0058655C9C + AB119AF93BC73AFF008A3C67E305BBD5B475F847AF5D49189A0F10DE5D69105E + 2324A89BEE2E2E76C0A7CC60BE624686455C36E519F51FDBABE3C6A1F0D7E2EE + A5E2AF857AE7883C0379AD1696E7C3D72F2A58EBC859DBCCB39FE6825CB337EE + C37CA5B0ACE5B0BF2EEB3F1035CF8C8B0DDF8A3C0F1E82B7B14D7306B4BE1A59 + 6D9CEE5591A53708C4C6AC42995080A18038CFCDD9C1F94CA383A755C12BC526 + F69EDB38FC32F549B7BDEE7CDE676A4B965CD195959351945B5FCD35AA71775B + B5FAFA67C563A5C9E1B834BB5F05F892EAF74F8E4B15B6BEF115AEA56B6D2A44 + CA6E7EC91C3B982AE4EF05A11B007CE0A1F9CF54B8F0DF8D6D2369F4D8A1D4B7 + 319EF2DC42905CC47E6DB1C2988D10306CB92410E70546057BFF00833C15A17C + 30F057F64F88FE1AEA5E2AD7358B08EFAD355F0F6A7656716AB05BAA22BDA858 + 9F7B22FCCE21632C8CA5D83F2D5F38FC58F8EBA46AFE21791BC1FA747A346AD6 + D6FA7C8F04B22CEA8511DA75896566DCDBDF76D390C303827ECB8768CDD4951A + 309593F8B996BE8B9DCACF5D1DB6D75B1F2BC4138C6946B579C13FE5E57D7BB5 + 14B4DBBF6D0DB8F5ED1F45B59DA1D06CE459306376B96972A0FC990651C7C830 + 3A65B23B16AE3C792C91409047A7C45A201082615772B956270CBB4F3C86CFDE + DB9038F133E26B38E69997C390DF2B334622B8F3202C7702C9FBB65DCD923BE4 + 2E4F3C814753F1D2C564DF63D0F47B58ADC488E52291BC82172815DD9983AE0F + F1104103AE49FB2A790F33D6F7F37FFDB3FC8F89C4711420AD1B24BB2FF28AFC + CF48F12F8DAEF5451A74D7DA6DADB4B13BF916F331692404E4B08D4B71B540C6 + DE4640E78F3AB9F1D5A5A5A18C5C49A95C4C5A4F36462165390C39C9607E58FE + F3E4E0648E318BAE78AE6D5DBCF10D85BDB4CE6621E046C8F95095661C9C1030 + 41E993D01391A8F9A96AB0CCFCC6C5A48E356C37023195C2AE41CF3C13BBBE45 + 7BF84CB614D24F4F247C9E3B369D4936B5F377F22E6B5E277BF7B86DAB636F24 + C03C76C822330EAC47AF41EB8247726A999A4BD8998DB5BC522E36E611F2B292 + 557691800E549CE49249E85AA8DB5C25E1F265DA376D085A4DDE5800718FEEE0 + 1E339191C9EF62D205999967BA8E154F924424B321272C5075CE37719009EF8C + 01E9F2C62AC8F19CE73777ADFF00326BB7BE8C35C4DF6A9A6B91F2EECB795B54 + A9F971D00E800C018EBD049A7E8325EA35F5E4DE4E9CCF244E589679CAA670AB + FC446467180370C900E4432CF6FA6BAE2DE1BA92320092652428551C08CE57EF + EE3F370D95E07CD50DFDD4D71234D2C8D3DE483E599E4E1403C851C739C9F4C7 + 18A7AF4138F7FBAFFD5CE6B9014F6278E79AB662FB62EE8776638F730C82460E + 091DF18E7DB9EC3354970586ECEDCF38ED4F597CB6E8AC3183C5759E4A7DCB97 + 71BE9D78ACA8CABB76824633F88E33D3A1FC8D5FD3EE3CED55E45DB1C291B4D1 + 2B3B7AEE0A0E0F2189C67BFE548D6E9A97875440B235C5AAF98FB40E7040CE01 + F76E79E147A9228E9F7BF60B98E46623C971220233B581079EFD3D3AF1E9596E + 8E85A495F676669EBB0AADD492323B5BDEB2CAB2038F972C32063A704600E8A3 + D89CDBED35AD6E644CAAB2318C856DD9C1C647739FA62B7EF6DA0BB3796B0192 + 4F2434D6C5CE5844065791DD47079382060632451224B4896397CC93764A961F + 781DB8CAF507E5C67AFA138E1465A17529B664792A9758915C2AE37F18FAFEB5 + BFA088EFB42B8B7669A45B42260327E556251B03F8412C9CF7C60F6AC7D5AC56 + 231F96932A6D51F3763CE703AE0F38CFB8E719A6E957736997CB347B86DDC8A5 + 79C92A471F5CFF00FAE8926E3A114E6A12D5686C5FCEABF68B18D96E2159C949 + 555B320C11CE4EEDB8C751D8F239CBAC5AE344D476B7CB0CCA030663CA71961B + 7B614F23F849FAD3EFEE237B785E1F264698B054D9C460703EF1EEACA433633D + 3DE993F9AB65B5A48E6591847BC481442C7FDAE3D01F6DBCF1C9CB56765E0B5D + 743A2BDD67CEB18C3491C8CABE54334711321032C002338604A363183C106B2F + 49D79B43F12DBCD0DD5D5ADF595C0315C7DA7E5B728484231CAEDC9EE7393907 + A9A373ADDE5848D1BCC6168C90427CF2C7BD483C9C6E539CF53D47B9A8EE5E2F + B04B0C2DE5AC8EB2B3756DCA18104E78EE463767D79E52A6946CFA87D61B9A9A + DD7F4BFAE8765AE490F89DA5974D5B5B2692369E686083746A7665CC5C0C02BB + 898C602E463E4FBBC8AD85BDD18EDFCC7C36D0C25CEE8C9660AC3693F2851C9D + A0E580C1CEE34AD3536B299419645651B55B1966C7CAA327A018EDDD7DB235AE + BC416BA9799FDA07CD60AE56681829763FC4C0827923B6DE0E29429CA9AE55B7 + E3FF0004DABD7A75FF00792B2975EDF86DF77DC226971437B1C73C90B46EED89 + 00618C618B7C80862A39E8C30DC8F978A77D61F65B6B811CB26F52525DC9867E + C3E507E5E09183EE0FBF45E15852E2E05D5E48D359BCB860C158B0C85DCC393B + 47191C8EB919041E9B4EF8671DFC7E459EA5A6D8DC5E464C733CA3C94FBAC416 + C3370A642A4018EE3915855C64293B4FFE01D186CA6A6257EE575DAFAF96ED2D + 7A6A8F3ED3269ECE056686153E5E55648882183F014E372107FBBB7807E6C601 + 97ECD6FA7D905B58E5BA999C092258D96365DA491D49DC7079EE09E71907D03C + 7BFB2C78EBE1DE84BA8C5E1FB8D5B44689FF00E26164A97B69B0631F346481C9 + CFCD82392093D38DD33C2B71B65B966565B76545CC2776EDCADC020E1485621C + 0392C0756A9A18FC3E223ED28545257E8EFAF676D8BC4E4F8DC1D4FABE2A8CA1 + 34BED46DA7757DD79EC3ACA00772496CAD7321019DC24B1C79651C22F1D55816 + 623AE0FCC722F69C2D757BE86D5A46D36D9B10930CEB2396701B396DB80C5303 + 77CD8703E6EB5D068561A49D5D63BF5BA8DFCB1349E549B96E0327CBF2EDC8DF + BF03009DA148C96047B77C3EB2F833A2E8D6EDAEF84F52D79B7875920D7A5B20 + 09662A222A9963B8038C8C119E8A4D7939866EB0CAFECA736FF952FD5A47D1E5 + 790CB151BFB684147F9DC95FCB48B7EAFF00130FE0F7C17F07F88B5F82F3C43E + 32B8F0FE9F6D1A0171616A26B957C861B1098F6B1FBA1810492194639AF4EF8D + 3E24F873E38D161F0DFC39B0F1D6AF32BA9B9F13F8BB548AE40EF8B786155D9E + 6618067323700AE304AE4FC44FDA23E1BEADA2349A0F8174ED2E38FE7B9BAFB7 + 5D6A57D2EDD8EC774AE23070793E59200FEF5793EBDFB497F6909B4BD274A863 + 32300B6D1C4E2E24DD81F2B824B3E42ED386E429E304B7C6C70B8FC7D6589A90 + 9C795E91938A4BCDF2DEFDD272B7747DC54C565580A2A8C2A4354EFC9CEDCAFD + 35764ADA5D2E6EDAABAF5CFD9BD34EF879E2EB5FEC9D0F51F1B6BB0439B34B2B + 632B4CCABF7991725541618427193B8F0571F597ECB9FB0EEA1FB587C4FD5756 + F8C9F11345F0FDAF87E36BDBAD36CEEA3B85B5891771FB5DDA9F22D550124C68 + 5E504F210306AF91FE13786F58B889ADBC75E2ABDF0EE8313347268369332DD5 + C0180564B742027CAE373DD152BE60640F8C1CAFDB13F6FED4BE29FC3787E18F + 81E4FF008417E14E932A43710DB3796DAE3800879C8C4930390D86381966DA32 + 73F3B9B64798E658B7432F9A8CE4AD2AD6E6E48FF75B56E67D2304B5D79958F4 + 6BF1151C1651C926E11FB34D59394B4D66BDEE6492DE6EFAAD2EF5F41FF8293F + FC1443C33E30B07F83FF0001F6D8FC34D19D60BDD720B4368FE2764277086200 + B25B6E0082C7CC959773E7E545F06FD92FF67EBCFDA9FE2BE8BE0FD056DEDAE3 + 596FB34F732BB9B5D2AD4E44D71310A33B42B306E497C63F84B78ED99B5BFF00 + 2E1FB3CB35E148942C2159980DB93B492B92063918FBBB412C4D7B9E97F1E2E3 + F67AF81DAA783FC1ECD06B1E2ED83C4BAD5990EF15B88F1F608DB8F959F79761 + C3676E305ABEEA190C728CB639764CBF792FB52776DBF8AA4DFDA6B7B697768A + B23F3AC266D571F8A9E2F349B9538ABB5D74F86115B2BB7E8B77B1F487C76F88 + 7F0F6CBE2E5BF807E19DF2DE781FE1CE9EF1A6B3776A21B7BF9F216E2F76618C + 8096089BC9CAA1381C81F5A7ECC7FB49F85FF65DF853E14D264D07FE124F8C1F + 165D62D1A1B9B40CDA5698672915CC8BF31DCF333C9B79CF96E720035F8F3F09 + 6E0EA1A9C2B716F7125AACC97B7CF6EE15A78D30CB0ED8F2B1A3B2C64B1FF6B2 + 3E526BEAEFD877E32DF7C45FDB064F1B6A9169E2FED6530593C8DC5B5C240C96 + 16A832DB506446304618AFCB9071F9EF16701D2960FD8549CA74E9C5CA577673 + 92D55DAE9295E524BB25F699FA070E71254C7B8D1A9A4AA4E292D972AB377492 + 56568AD12BEBBA493FD52D13F6E3B0FED4F04FC23F0DDAC9FF0009078B75AB9D + 22499BE66B4D320B978E69955881199A48C8073F308718195221F097ED59AEFC + 74F8CBE30F0FE9E31A87C2FF0006EEB7B2806C375A8F9B0CD2C0BCE3CD68A110 + 80CB92D85CA900D7C53A17C5CD16C3F6BDB3F8C7677474FF000D6BBF6794A60F + 97A734ECB14D0C3B5B231746EE5087911AE7043286BD73F1AF5AB3F1678A3E2A + 4112D8EA9F1312FAC1DAD2E16282D1EDD3ECB7579E6A94091FDACC4CCD80328E + 47C9B49FCA6B7016162DCA14F59456B2E95252BCA2FF00C30BAF44DF53ED1C68 + BA929538C549CA4EFF0013BD9DDEEF994AD6766B6D16ADAF4AF0C7C714BBFD9A + FE03F8AECAF2E23F883E155D6E6BC0C8DFF135B580493CD21E4ED2BC1CE72D1B + B804EC15E17F14BC7B69AAE8DF67BEBCD4F4D5D5EDE5B794793248F2C96E1444 + 6E090A7E78DE3DCE149578A42BE66E1B6F6A7AC5AE99AAE97AD5BDEB1D260834 + FB6FB2345242B7AB7B62D05EC89E49D918769B52DA597E54501194C881BC57E2 + 47C547F10E87A0F89ADFCE9F50B3B802582EE2596DDD8C0A4BA44F90EA4C677A + B00A48192379C7D66539245E239A9C5DAEDDF6E56E539A8EDB2BAEEAFA1EA2C6 + 2C060E55252F79A4D27AF3464ED37BBF85FC2BA6A7997C51B6681AE218DA649E + E2096286E6D72B24722B1678CA01950EA4107AFEF46072C6BC860B89BC71796B + 1C71C7A848D38B76E42F9AF21DAAB80A76862C9D148E49E8A56BD1BE2325C6B3 + A76AF0C9E45BBBA8B9B794EE8D81FBE41C82430F9F006082AA08FE11E3F35D08 + B40371263CC1705C4913856420B0930C31E5B6E7240C8C02A724723F76C968AF + 63AEF75FD7A7EB73F05E22C57EFF00DDF85A7BF93FCFD55ED64D8ABAE4161AA5 + D4A90CD70F0B1478432986552307EF0C6E0554ED1FDDCE7082A293535322DFC6 + CAB6AD2128046AEA558B85F97EE28C0C361738C95EA4D5EF19E851E9BA3E9F79 + 6FB1AF2EAD1679CCADB967CC8795392AB96538DDC90A3D78C4BDD20E852ADA3C + D35BD9DF46B7104A479531071B645E01C905D42701BE6E463E5FA0A6A12575E9 + F76E7C9CAA548B717B7979EDFD7F99ED5F027E256A9E06D5D7C45A3EA021D634 + 5923BB89FED0521324782ACEC9903010373F2B1C038DC02FEB67EC6BFB55F867 + C13E18B2D4BC41609A6D8F8D6C1C788A4BB73147AC304610057CB18EED42797B + DDB6C913C2ACDBD416FC79FD99D6E20F8850DC796D79A7DC5C18F57B5259C5F4 + 4ACFBC862158F2549C1E57AF009AFD71FF008281F846D3C2BFB1EF867E257821 + 5AE34AD156D3CD719683C99576793740027840D192C0A91C370C0AFE0FE28D3C + 254C761F2CAF1FE33E5E65A59E9CB16FBDECD7DFBEDFB27026329CF2FAAF1927 + C9A2B79EAEE9E9AF657F8ACD2BA4CF90BF68CF89DE31FD8D3E250BEF04F88B5C + D63E127882554B5912E1A26B20AC4ADACE1702DE5547C81D19186385C47E0FE3 + 9F8B363F19F506BC68AF354D52EFEEDCEBFAD4C58C9B1B805422865524AEF765 + EC490466C687E30F0BF8905F410AF8AB4137D21B4BED2F48617D6B7FB6207CCF + 226C150D8918323C8149F956318079CD474FB7B7179FF086F86F5C92DB6B79F2 + EA52CAD0DC6EDE419802B10036C8E3900797233332295AFB4CAB2F8E1E11A55E + 3FBC8A4B9ADCB7F3959DAFDDA6EFBE9D3D5C657C4D5A33AB82C4295096F06F99 + FCBDDBFCA495B6EC759FB37695E14D4BC657563E3E9B41F86F6314ED7CF1FD8B + 51922BE8DB67EE1915D98C7185728EA564FDE1FDE1F976EC7ED38BF0B74B325E + 5A7C44D3BE296B12451C16C4477B670C698C63E61E613F736E2E115486E0F18F + 349FE22EBE7C2ABE1DD4FC3FA3496F62925CC2E6EE18AE6CC44FE5CD850C6232 + 164E54A79CC0A139539A8FC47E09B7F1FDB8BFD52D61F0EDFDC43E5DB1B48034 + 37EC37092630195042CAC1B8846D241013043576CB2E97D7162EB569456DCB17 + 171FFD25CF5EB697E07CA4B1D7C23C2E1E8467E728B8BBF7DF96EB657F75DFB9 + E63E3D874FB97B5974DB8D43CEBF8DDEF20896454B26DEE4C6BBDC96050AE189 + 18C9EA177364A7F60D809049AC6AA242AC367F6445B40CE3064F3C1DE32416C6 + 73C9E7AE8F8A3E0A789B43B26D42386C5A1F37E5FB3DF249245BB1CB4687CC18 + E3E62A0655BEF6011CA45E75BAC51CC923DC4657744E8CB2AE01036E4FA201D3 + B0391DBEE70FCB3A7FBB9DD7959FF99F99E3252A757F7B49C5F9DD796966B7DC + 8D64B5BB0CB64D334814ED63FBBF2804CE4AA9EBD41C0006D07272714246B7F3 + 5BCA13B73F2275CEDCE79C7272A1BAE0671CF65B8558EE599668D5986E2FB305 + 79E0A9E4E7BE7AE30724669D2410C9612AA911C902E54A264391918EBC7041C9 + 07EE93919AEE8AB1E3D46E7A590CFB42C7930C8ABE5A8FDDA9CBE4296EE7A060 + 338F623B665B6BC5BA8DDA58E5914280CA884E7A9209DE0E325B3D338EDD43AC + ACACD6791AE1AEB6901914AE7720C6E1BDBA103852460923A027162DC4293AF9 + 666911983B157566906E008185201E9C9EBD48E4004A5D029C7ABB1359585B94 + FDDCD25BB0604E582B3720E06482543018C13CFBFDDD0B3F08437A8973E64375 + E630CC5192AA3238DC19477233DBE618C8390DD2EE23B8B4B7F25ADD64111291 + 4D1796CE41E181C61828271B9B2483C74357F55D216CCC3B91A1B8909688BB15 + 5C076DA43E474DC4FCA0119C91835C9526D3B5EC7A7082E5BA574ADFD33CA98A + B7418A15C08D94FD4526303EB4F83E5982950777CBCE7BF1DBD3AD7AE7C91A1E + 1FBF6B5B92BE6796B70A119C9242AE73F3639C7CBCE39C7EB0EA2ABE7C8AD0B4 + 32672013C0EC4727F5EF8A8D5D57CC0EDF757E4006003903D476CFAFEB51C33F + 96EDB5770208C7518F7FC3BD4F2EB734E6D2CCBFA76B125B5E5BC89C4911CAEE + 19560739423AB2904839EB923D6B46ECC8F732AC32CCD6F2479589A62DE58009 + 2371032558E70072031E87279FB550EB22EDCB3636E4E315A1A56A5342AB1AB2 + 45233AB24AC46508C81C9E98C9E7B673D811328F546B4EA5F491A5F23C7E4B47 + 70D1A755D8DFBB3C90303919F9BD7E5ED95ACBD52C441F318F647185E0481BAF + 3EB9EB9E3A8EF83D77B43F16FD9E6956683CBFDDE008A353B5492C541C6460ED + 61B8FCA41CD45A81B3D4E28E28196075562781E512411C1C1C16CAF603392028 + C6338C9A7AA35942328DD3D4C7B1D53EC4CA8BB9B2173F28071D71CE41EB8048 + E3238E8076B7BA4AE9BA549A9DAAF9FA65C2345BB1E61B7DCFF2C4C40C29DB93 + 9202925719192785D5ADFF00B3AED82797B376536C81C7D460F3F5E95D37847C + 4EDA743710ED92E2C6E06E9AD518621765203A6480AC18A91D7908A4120666BC + 5DB9A3FF000FFF0004AC2CD29384FEFEDFE68A32688D7D00B885B75BC6AC2E03 + 31C41F3118503B72BD38DC467038AA827FECC90ED78DA27529B80DC086001C67 + 8E718248CFEB8EEB50B49B4746D4F4963A6DC302D711EDE245233E661B24A1CB + 82390763742E5464789F56D27C591C9776F671E91A94C36DCDAC60C90CAE5F39 + 8B2C590F53804E7391819033856727B69F97A9BD4C3C52BA6AFF0083F47FA3F9 + 19F63A0DADF869EC9F7A8C12B3955C9019CEE553D18740324E0A8C9E2BB7BEFD + 923C577FF0C17C5DA35AC7AB6936F1892EDE295775BE4E73D70768182D9ED5C1 + 69E5ECADE4B8B2B858A4846DC2CDB1DC938CAF7182467EE8EDF366BEF0FF0082 + 2B7ED3761A6FC66BEF87DE32F2DF47F18432B4725C403CA5B8C29914163F2A6D + 02429C28F2D86DC9007CFF0015E698ECBB2F9E61828AA9ECFDE717BB8ADEDE69 + 6ABD0FA0E17CB72FC7E36381C7370F689A8CA36D25D37EEF4B75D2DB9F008B4B + BD3352649232B26D2555C70C38231BBDB0463A8C7AD751A27C429524469AEA40 + DB56224CE47CBB703661739E14E091827383C63EDFFF0082A47EC81A27C28F89 + EDA4D9DAB5ADABC7FDA1A2EA51E65D901258DB9E78F2D894EE000838E6BE2AF1 + 97C3FB8F00DF335CC2B1C7190229F1FEB9D4315650465558E7A93964214B0190 + 643C4583CEF074F1749594D5D27DBFADD6E9A1E75C3D8BC9F112A5CD74ADEF2B + DBBEBFE6F4773AAF84FF00B4978C3E175DFDA345D7EFB4B63215530CAC61B8DA + 573BD473D80E723040E3E627D12FFF006F7D53C79A5FFC4FBC33E07D7F509149 + 59EF3458C4CCA719FDE42D1B8246C2493CE40C74AF03874C64D595ADE4492DEE + 1FCB12404068B80C72BD81C03BBE5CF201DB5F457EC8FF00B0C2FED51A9DF693 + 677696FAF5A46B34684062C8C8763A1DCDB80C019040CB202CC4FCFCB9F61725 + C2D379863A0A3CBAB925AAE9AB5676EE7B1C3B9CF11E224B2EC056934EFEEB69 + C7BE8A5749D8F33F187C528BC5ABF6E8F43D174392332857B79A6600FF001E0E + F3B48ED80141930013D6A4772F2E8CA979737CCD3481046A3CE13AE4E3AB6795 + 1B71D42B06C9C9AEA7E367EC7BE31F81B7B7FA7EA96CC6EACE792392DAD9F61F + 2CE1F8639664756420B7425739E05703A75B5DDA45247243F2AB06F25C7CC59B + 0A801233C285F9472E3693904576E06A60EB61E353053528F469DF4F577678B9 + B4B31A38A953C741C67D6EB97F2496C6AEB367A369170B0B5ADD3C8248CED94B + 0F9D50A903693FC3C60918201E0726CFFC25FAF5A4A90E91A85BE850DCB98654 + D36DFECAD9C85DB24C3F7D20DE02950F81C01C1F96E699A94FA8DFF97716EB29 + 910471B79DB63331DAD9C1C2FCAADC82012DBB8C6EC7B4F827FE09DDE21F89BF + 01A4F88DE1F9166D0A390C772B292D3242AEC8F8DD803636FCF43F26467BF066 + 59C60F0508CB1F2514DA49CB54DBD9793D342B2BCBF34C6D49432F837CAAED47 + 4765A3D747D6DA3BEA7CFF00AB6A0B622D6C74FBBBAD93216926950C3111B083 + 98B682C7E6239E4F97B88C1C8E3AF6DD9EED5FCB859AE2152AAD3E509DA1CB64 + E49CF60C0E3763208AEBFC6DF04754F046A33C77166B1FD9E758FCE598B2C641 + 1B6405464295C6000366D39F539DE16F032CF750960D27FA2F98891C91AC8926 + D2DF3F7032A3E43CF192B8C83EDE1ABD154FDAD39732EEADFA1C788C2E26557D + 8558B8BBECEEADF7EBBEFE655F086AF16893CAD2472DE3346E20569368C90BF7 + 4A725982824EE180463AE29DAC6FD4B4BB5FB548C26BA99A1B61179787DCE4E7 + 07F872140232320E4838AFBBFF006B1FD85BE1B7C31F83DF0F758F0FC325A6AD + E2DD216EE7BB8253B6C51761123A918C624518601882318C62BE2ED45ED7C273 + 6A1A8471A88E096552CA3CD6DEA195155A404827192405F9495CE0FCDE2649C4 + 985CDA9BC4E162D6AD5A4ACEE9B5DF6BAFEAE7D3673C3788CA5468D79C6517AD + E37DB77BA4EFF2F4649AD7C3EF1778474C86DEFB47D5A16D6248C5B2CD132FDB + D642426D6DD82ACC4E48C29F2D4EDE49AFB23C3FFB38C7E20D53FB07C13AA35A + 683F0F34AB2F126A1AB6A16FF675F11DD34890CB3C6D32B2FD9CCBBCA97DC81B + 702A5466A4FDA93F691F0CF8EBC35E0BD42DF4E8757F0FF80FC2DA3DA6AF6E8C + D1996E612C5A0DCA372B38254919654F388E5431F2FF00D97FE3AEBEFE2CF176 + B1AB46BAAE95E22B5B7B5F11BDF2341147662EADA1694A215628259238D52362 + 02AE318031F298AC7E679965DF5A54D529C5BD1EB7774B67D542ED5FAB5BF4FB + 4CB72FCB729CC9619D4F68A496AF5E54936F58F494ACAEBB6A7B878093C3FE27 + 4F037817596B35B390F88753934A77F3AEDAE0C570D6D3C92AE11F68410C4230 + 176C2CDB5438CC2BFB4D68FE07F88F15A9BCB8864DBAB45A85E4F1B4FA869CB7 + 5772BA89205F93CC8E5DB3308C61DA4930480B5F2F693F17FF00E136F8ABAA6A + 9AA5E6AD6FA5DAAFD9ADE58A456B858A308918CAE1412AA99E005043E000D4BE + 14F89D71AFFC4EBAF164712CDAA5C5E33C681159A41E6C6624642A372ED4404B + 60E14679F98F354E1594E539621B7171BB5D149B9376E9B4BE565BDCEBC2716D + 2A30A54B091578CDD9BEB15CAADDF75F3BBB5B567B1AF8BB564F14F886DE5934 + FB48F4FB4FB15E24B728F06A89671C90986356E0332C4E5186CC360A93B941F2 + 2D43C477C7E11D858AB7996B657F2DE2048CC72B191D54B07019D7CEE430041C + 007639DB9EC3C27A15AEBDA5A5ADA32B5AEB0D23A33C655AD642CECAAC72300B + 9047073F286EA76E2E87087F03B5BDAA15B3BA4F2915E3DC5916657F98601570 + CA172DF36E65CE3214F561634E8CDA8A57528F4B6C9ABF7BEFF77639F1DEDF11 + 4D37276E59F5BEED3B2E96BB5F7BBF5381BCF11CF3CDA4DDC9FBB6B30D6FE667 + CCB5465591A30464E482FB406C11E59CF079F31F13E8B0E95AC6A76B346CD0AF + FA559B206677898854E4F2A3CB9039C0CEF04103181D206992DAFA331ADAADF6 + D9226DCB2389C481882D21EB88C92465B25B920E2B0FC5B249ABFD86FA39EDED + DBC9FB2CE0A95468D9894248E1B7E641B4642794401C0C7E8382A4A9CAD1D9FF + 00C3FF009A3F2DCCEB7B68733D5A77FD1FE093E9F3399D435F851563FDF34119 + 05B0572A72090B8E54FC84F39F71CE6BD47C0FA7B7C43D1350D3D84F35E59DBF + DB6059E5DBB11548F9304BE046CAC0372B83F302307C9AFCAC564AD1A86F2C46 + 642E773072A49DC48046486200CE415079515D27863C47FD93ACAC8AF2431CD6 + 935B32CA4AFCF825B7285E14E0A118C6549E3008EEC65172A7FBBD1AD8F23058 + 94AA7EF754F46BC9FF0097E07AD7C27F19C9FD872EAD24AB1DE69312093ECFBC + 798AFF00BA9490B850C540270491B5D8E4E6BE98FD9E3FE0A19AF7C2EF877AD7 + 82B5B861D77E1E78C235D3AFF47BE642A1848BB950B363761432C5C6777046E2 + 57C67E227C1C7F861A0E87E31D0D12EFC2DAB5AA3BB5BC3E63404C49E7479CFC + BBDBE6CF1CEE2467047908F88967A96837DA6EA3BBC9601209228B6A4A0997CA + 675CAF4CEE5CE3D0E7F87E0B1594E033CA6E52873C2EBD62D3E9D54A2F5BAD75 + D343F418E3F17934E34AABE595AEAE938CB669EB74D3D2DBEDDD1DCFED45F025 + 3E0278CDF5FF00095E5B788FE1EEA416F744BD965DD716859F22DE4DA37AC919 + 1E5E0F040381924D7934BF1056555B2BCBCD42F21F380589EE772C630802804E + D1B42A0E0EDC2AAE405156BC35F19757F0D5B4DA5DDDD45AAE83A86D478924CA + B221F98107043056639E1BA727A9C3D5EC2CCEBD7AB6B6B71756B1A0750AE91A + A44508DF80083CBE41C67AE42935F5980C1D6A74951C63E769692DAE96D75D25 + DED64DEBA6C7CC63734A6EAFB6C0270527AC1EA937BDBBC7B2E8AC8EABC15A7D + BE91E22B3F10456EDAF69BA3B2DD3DBC3B964400FDD7F9848B82CA3CC195041C + 31AFADB55FF82987C33D57C111DBCDFB3FF86F50D52406D85E5CEA68D3798770 + 29E6942C339E9B811939EC4FC2BE14F89D75E08D6166B4B1B59A085F725B5CC6 + B3042DC64302194E3BC6C87393C0E2BA0F0EFC418F5A170B1DAB35BDE3B2FD8A + E6E58C72BE1C86628CACCC3E63B8F3B8FDEC6ECF9B9D70BE1B309C2A62E32972 + 7C2E339C3D6FCB28DCF7B25E2E784A52A784A8A9CA4EF24E0A5AAD9ABC5E9E57 + DF5B1D17C53F8CDA5FC41F1E36BB368EDA2C97570277B6BA73756D21DDFC408D + CCA5783F281D78CB301C3EA37B78F2C1796ED1B4636CDBE06CAB3740DB3B73C0 + C28C11CE4D6D78A7C0234CF2658A4B8B89AE9824F653428AB1ED752046CAEFBC + 360F0C17033EF5CA5F693ADF84E0577D36FEC56E00DB2B5BBA2C80E0153C0DC0 + 7238E0926BDCC150A10A718D17A2565777D3B5DEA7CDE6B8CC6CEACE58B576DD + DB496FDF4D3F2F312FBE20EA8B6296A3FB3D646387DBA5DBA4A5C739DCB1EEC8 + DDD49EABDAB157C457D713BACF793491C80B13BB3B88CB0EB8FE2FA5751A4F8E + ED126B76BFD47549F6643031A5C0DDCE1886DB91D39DE0E777406B3EF668755B + 4B893FD1644B7428BFE88B6EEAA7765B6C64F218F42187CC3A000D7753B276E5 + B7F5E878B5A729ABFB4BF95FFE0B3156F996E5D9B68DC368DA0104673D4704E7 + 1D7DEB47462B2CE817F894171BF03B9EFDF1CF3C0233DC0A9AE2C1608D6E218D + 4797261D85BAF9511C6DDBBBBB1E0E0803827BE6A58AEBECC136C56FF67DC55F + 808DD477CE4741C12781DB07153926B4161E328CAF2DBD0DFB79C5DB6CB930AC + 8D26CC7DDCFCA14819206769523EEE09CE46467ACD074BBAB558EDEC354B88E1 + 0CCE6376F944838FF56C4A1380D8DD8EADE82B96D16DE3D4E4666990C92272E5 + 433E79201EB8C8000383D3207503A0B0D6E5D36591AE23924567382A76C65506 + 430766040CB0E4C9CEE3824800F878AE6B5A1BFF005DCFB0C2D68A6A75758F9E + BF7F7F97C8F10BB4F2D63646CAB2F38FE13CF1D3DAA0438FAE7A548EF2148E3E + 76F2517EBD4E3D4E07E43DAA1AFA83F371EE588EA0E707AE69C83CE3F36F3853 + D07A0E29B0A79AFB76B33370B838E6A5B69DADDFCC8FE565F4E703D48A008CC5 + B18AED66EC083DFF00AD260AA7F4CD5892F166999BFD5AC849D83EEA7A01D78E + 07BF1517947CCD8A07CDEBDBB75A07E84B6576522F29B6F96D927FBC3F1F7E9F + E7356E58D1773472349B72D93FC60F7E47273D78E31F5359E57C85653B9255E0 + 8F5FAFD288A4316D72AA036406F4E9FCAA6C529BD99B16F379D1341708B25BDB + FCE818AA3AE4ED217F1E7038247BD4D338B7D4A29F4B9A568542AA098852A460 + B23018E3713CF420F38E6A9C732EB2CAB36E8E451B632A3A9206D3F860740490 + 70070301D1A4B10BE631E5B8C1E0F19C82011819193C7DEF6359F2ABEA6C9BE9 + B7E26F697AF2BBC90C96F6FBA491B6E11B0405C10DB304920800F18CB67EF1A6 + F889FF00B49D1A386DC5C9DA11D5984928C1C0018E19432FDE1C600CE09E726F + 5E2BD5779B99A66CA0450B807BE3E99C28F5519A9ECF52974BB98658E45F3106 + 18EF64500FCA3246083E98C1007A006B3F6693BA379556FDD645A76ACD14EAD2 + C8BBFAE597E6C003F8873F3004104E3927049C8DBF09EB6DA578874BD46CCA59 + 5F5BDD0B88CC793860CC53383D4738E46E0074C60E15D5DFD99B7B2C334CDD43 + 027764E7A678E87818231EF563CCFDCB4CC6E12DF0A0EE2768C9DDB403EBD703 + 1C313D072E70528DA4B47A0E9D594249A7AAD7D3CCFAC7C71FF0506BEF8B9E01 + F0FDAF8A26596FBC3372F1976955E6BC8594ABAB3E4FC848663DF20F0C095AF1 + 8F883ADC3AAE8566B25C19AD6D552082E0CDB82C39678C380480C03B8DC39CA0 + EBB79F33B89E0F21E3B89248FE55789576ECC618853804919271EA1BD6AFEB3A + DDC8DB6774F1B5B469E6342A30A9B9C37CE7AEE03038C7F08E8483E1E0387F09 + 82696123CAAEDD96DAB6F4F9B67D0E65C518CC7C5BC6CB99D92BF5D92D7E497C + F5EA56D22E67922DA9E4C52C6B94D89B5570A4957E32473DF2B93C83915EE5FB + 1DFED4DA97ECA7F1EFC3FE2EDCBE4DB0649A3CAAF98B26D665CB60732471C841 + 2B8C11D5ABC5B40B659DA4B8DC648E672AA4B82FB8EDF504FDD0D81CE37609C3 + 64F57E1FF0D7DB6F646922B7F35942470BA8497E6006E28080CA32D820E49C64 + E0E0F5E6985A18BC3CF0D888F34249A6BBA6ACCF272AC756C257862A8BB4E2D3 + 4FA68EFAF7ECFC8FBBBFE0A01FB557847F684F187873C41A1B335C4DA7C915E2 + C2EB971193E56E4E77673D081FC3D3071F26FC46D7742F103ACF1456F6F24880 + C61652BB70DC3A7D1CB8C76DBD7079C187C077C6717305C5D2A4AC666124457C + B2A8C0ECDA0AEEE5BE619C861B78E4D597C27AD4F246E2EA3090C6C57CD1B030 + 42549000DC3E50724819C7076E2BE4F21E1EC1E5587861A84DF2C34577AEF7B7 + CBF23EA33EE269E6D39559535172B5D25D925A3DFA5FE6477BAB2E9DB66B3924 + F36CE40AF0BB463CC650A02FCAA0111E14060339518E8A4FD7DFB20FEDF71FC0 + AFD92FC59F0F756B7BA99758B7B916E5959B6B387508C5723258FF000E327763 + 24F1F22DAFC3CBAB66699564921B7258F9283E6C80376C07E620E0EE3B81000C + 1CD5882CAF2D2E3C8B9D3D2E21B7F24B13032EF51F3019C6DE48C923A6324119 + CF467D9360B35C32C2E257345494BB3BC5DD7F5F2170EE6D5B2AC4BC550B7334 + E367AADD3BFDE97DC99DFF008EFC750EB5A4AC36DAA5AC366F3175F3271B594C + 6AAB8938561BA290804B0CEE277725BCEB56F0D5C7F6649037930C76F13432CD + 1CE92CCDB5C9C3176233B9B18DD83B860121456B58C90DDDCCCB7DA4DACF711F + EF9CCD132AEF039214360B0DCB9504671D4E3351DAEB56E34E58E3D1E148DE33 + FEB6766C0E9F322FDCC700E091C1C96E37756152C3C7929C5BF9AFE9FCCE1C75 + 4AD8AABEDA6FF3EFF86ACD5F88FF00B4478ABC5BA3DAE9BA85D5CB59E8968F63 + A7445D9FCD87733313B1C0451B5143F3C15271B811E5562975A71856E5961557 + F2C5A11B96221B3E56C6604639CB649C120E49C574BE2395F509151AC561B56F + DDC6665D8AA48F954F6C8439272770DB85E73591E055867F1BE95F68B496E34C + D2E6F364431B94BA55C991081861BF023DBC67761B2492DE96070F470F45C68C + 1456F656F37F7B6678EC662B175E2F15373968AEDBF2FC12D3A6DDF53A3F0769 + 13EA29AA58DCDC7D874DB79D751BA59EE326599D1C2A38C1F3162B73727006E0 + 59D7219B05F3EA0D7FE1DD43C406792DED6F2F534F8218A6006C059DF0ADCB6C + 554E327E6981206E5239CF1BF886EA4B0B8866BA3E65D5CB9B979D51A766721A + 6F914E3E6724EEE8DB060A8C65F7CB696BE18D26CE3BA59E48CBCF3AAA6C68E5 + 7215882D8C6E89130DC8CE4903032FD8B72E79756BFE0FDFE66D4B13CB4E505D + 13D6F6776F45F25D3BEACE9BC33A942F65AC46D1A2EDD26598DBC91B2F952945 + 4462171851BF3860728149E0B1AB1F06EF8699E3686CED2092E6E2091E35576F + 2D6D22F2A42ECC197203103241C90B80C302B90F0B6BD1E9FA0EA9098D663A94 + 6B03CA650CC14BAB3BE0E070811467009E9E86DF81B5B9743F105CC8BB6DECC2 + 091658555B32B26141CEE18DA25381C939E4FCAA62B61DBA7563DD69F721D1C6 + 5AA519F67AF96BFF000C7BB7C28D4FED56BA5085658963DE5B7B664887965B0C + C0E4637119DA4823191D6BA6D06C24BBB5D4A158646996DDE542936C2EC32C4E + E273F308C8057278E49C035E7BE0DF1234DA98B396491563B15C2C837873E5C6 + 36FCA063E61B30075DB864EFEA5F0AAFADF49F1034334F348D7173046CC9213E + 72B388B70C95C101C2F19F979E0F15F9EE6D095294A696BA3B7CCFD5720A90AE + A14E4F4D55FB5D58F98F5C59C78922B786191A19A7F3961553098DB7EC601541 + DBC92CC39FBABB8B7410DCE8EBA9F84A68843096DFE647B1B70B823E6445DCEC + 0966F309E5B248E3A11BDF1F34EFEC1D77CE68F76A10DC0478E34F295A58A4DA + 016C636AE0205186F98E58E79AFE1DB2B986F2E174F510B5A482FE1177306917 + 60DEDF2B2E0FCC5D4E1B38DD90770C7DD51C47361E15A3EBF77FC39F9B6230CE + 18BA9879EF7B7DFAEDF2D753C56E7525F30ED8571BB18553E5285006E1CE4F1E + A7A7AE78B9A2C62DAD9921930D80FE679807CC4155C7E2C783DB7679200B1E37 + D223F0B78AEF2DEDE3BC8EDD645782395C82B0BA87543DCB007D8F1D0F6AB64D + 169F3DB4EBE629244A3E71B970738DBC60679E4F2307D6BE8F9938A923E3A34D + AA8E32DD69FA1FA2DFF045DF8EDA1F8A7E2BAFC2DF88AB6371A26A96B77A6012 + 32B47115B79146EE4A7CC4900AF7E3D33F2FFEDDBFB385E7ECD9F1DF5AF0EA86 + 361677B3C5637CC7F7372892BC60EEE0070A8838200C927A123C7749F135C784 + B55B0BED366934EBCB79D76CF048F1E195B39E0020853D8F6CE3E6047DA9A9F8 + F2DFF6F3FD9A753FED4B8B63E3AD02E86A505C301E63C87C98DD482067EFAC87 + 1B81DAE01C0C57E6F8ACBEA6499D3CDE8BFF0067AFCB1A91E9195DDA6BC9DECC + FD130B89867D957F665593FAC5157A7DA51576E3DEF6FD0F84E3D431A4342595 + 2DD589013872D803907FD9F4C753D7A89EDBC4D3D82C77103186F123F2BCCF35 + 9BCD4F9971D491C123AE0800E01EB5BC4BA15C786757BBB3B88A486E6DDDD1C3 + 0DAC501C0C8F5E33C8E7F2AAB751A5B2A8552F1B120B9FE31C1E3A74EBD4F6F7 + CFE92B924AEB54CFCD79AA425696EB4FEBD0B37D7F3DF5D2C770D1C726E277ED + DA72093B4607CBCE78C000919C0518F79FD85FF6789BE3EF8BE6B18ACED1AE23 + 8C796F797C2DE28583EF07E557906319C1055B0477057E793009D25936F0A324 + E7EE73D88E0F51FD00AECBE197C5ED4BE1E6A6ABA1DFB69BBD151A65DDE606E4 + 960548FA6307AE306BCFCE30F88AD839D2C1C9466D68DDECBEEB33D4E1FC5617 + 0F8FA75F1F173A69EA95AEFEF4CFD12F1A7FC122B58D03C3B79A86A9E35F0DC5 + 6B2458DCF0DD3CB0A28CAA1638E07427AB0C0EBC8F88FE39E8F7DF0DBC5977A3 + D8EB4B30B3908786DB7FCECDD9C9619E4823B804E72413599E28FDA2FC63E294 + 92DEE7C6BE21F236873B2F9E3DE58B1230081B49E3033D49E7A0E0AEEE6EEFF7 + 5C0BEBEBE8DB25A47244D292724E327EF12C324B721891D40F9AE19C8F37C2B7 + 2CD3131ABD92828A5FA9F59C4FC49946269AA795E1654DDF593936DAED62399A + 7490CD2C705C6E9017F31CB2B7193F748E9C938E471D33C9A7F8823D3519FF00 + B3F4B91B61CF9B0B4A1B9C7037ED38F71C75154F51956E1E3F2E58E456764116 + 5B10AE411D7B75EE7A127AE4C4044CDF37C8DB8E3CAE8ABC1F73D377539E067B + E7EDF974B33F3DF68EFEE96C78BEEAE9956386CEDDDBE41F67B38A120160DF79 + 577139F7CE38E47151FF006C49756B8B9F38F392FBB3DF8503B1E0F27A761C55 + 791E15BA689A476877310EAA3730EC76E703E83E99EF532470B4989633B43618 + 26D6C8F404703231CFA9CE7B1765D89F693EACDCF0D6B2DA7A065762EEE19410 + 0AC23072541C707E5E78E8BCF02BBAD135EFB5791F68B759A468C3B4D17CBF26 + 0B8500727EF6480303000F7F33B07D9770C31B45B644E4C885C3103231C75E9C + 60741CF7AECF43F115BCB2CF0CB0FD9649884F359BCC0D9EA4EE054615320B64 + 100723935E76328A96B63D8C0E2E705CB7D36F5F23FFD9} + Stretch = True + end + object lblVersion: TLabel + Left = 10 + Top = 371 + Width = 145 + Height = 13 + Anchors = [akLeft, akBottom] + AutoSize = False + Color = clNone + Font.Charset = DEFAULT_CHARSET + Font.Color = clSkyBlue + Font.Height = -15 + Font.Name = 'Times New Roman' + Font.Style = [] + ParentColor = False + ParentFont = False + Transparent = True + StyleElements = [seClient, seBorder] + end + object lblInfo: TLabel + Left = 170 + Top = 370 + Width = 450 + Height = 15 + Alignment = taRightJustify + Anchors = [akLeft, akRight, akBottom] + AutoSize = False + Color = clNone + Font.Charset = DEFAULT_CHARSET + Font.Color = clSkyBlue + Font.Height = -13 + Font.Name = 'Times New Roman' + Font.Style = [] + ParentColor = False + ParentFont = False + Transparent = True + end +end diff --git a/Forms/SplashForm.pas b/Forms/SplashForm.pas new file mode 100644 index 0000000..0848c37 --- /dev/null +++ b/Forms/SplashForm.pas @@ -0,0 +1,60 @@ +unit SplashForm; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls, ExtCtrls, Global, Vcl.Imaging.jpeg; + +type + TSplashWindow = class(TForm) + + BackgroundImage: TImage; + lblVersion: TLabel; + lblInfo: TLabel; + procedure FormCreate(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure FormHide(Sender: TObject); + private + { Private declarations } + public + procedure SetInfo(info:string); + end; +const DURATION: integer = 900; +var + SplashWindow: TSplashWindow; + +implementation + +{$R *.dfm} + +procedure TSplashWindow.FormCreate(Sender: TObject); +begin + lblVersion.Caption := APP_VERSION + APP_BUILD; + // AV: for compatibility with different UI color styles: + with lblVersion do Canvas.Font := Font; + Left := (Screen.Width - Width) div 2; + Top := (Screen.Height - Height) div 2; +end; + +procedure TSplashWindow.FormHide(Sender: TObject); +begin + repeat + Application.ProcessMessages; + until CloseQuery; + AnimateWindow(Handle, DURATION, {AW_BLEND} AW_CENTER or AW_HIDE) +end; + +procedure TSplashWindow.FormShow(Sender: TObject); +begin + AnimateWindow(Handle, DURATION, {AW_BLEND} AW_CENTER); +end; + +procedure TSplashWindow.SetInfo(info: string); +begin + // AV: for compatibility with different UI color styles: + lblInfo.Repaint; + lblInfo.Canvas.TextOut(0, 0, info); +end; + +end. diff --git a/Forms/Template.dfm b/Forms/Template.dfm new file mode 100644 index 0000000..2ddf49d --- /dev/null +++ b/Forms/Template.dfm @@ -0,0 +1,110 @@ +object TemplateForm: TTemplateForm + Left = 399 + Top = 213 + BorderIcons = [biSystemMenu] + BorderStyle = bsSingle + Caption = 'New Flame' + ClientHeight = 391 + ClientWidth = 564 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + FormStyle = fsStayOnTop + Icon.Data = { + 0000010001001010000001001800680300001600000028000000100000002000 + 0000010018000000000000030000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000B7A293634935634935634935 + 6349356349356349356349356349356349356349350000000000000000000000 + 00000000B7A293FFFFFFB7A293B7A293B7A293B7A293B7A293B7A293B7A293B7 + A293634935000000000000000000000000000000B7A293FFFFFFFFFFFFFCFAF9 + F7F1EEF1E7E1ECDDD5E6D3C9E1CABDB7A2936349350000000000000000000000 + 00000000B7A293FFFFFFFFFFFFF5F5F5F1EEECECE4E0E6DBD4E1D1C9E4CFC4B7 + A293634935000000000000000000000000000000B7A293FFFFFFC1C1C1ACACAC + ABAAA9A7A4A2A39D99A09692B4A69FB7A2936349350000000000000000000000 + 00000000BAA596FFFFFFB6B6B6ECECECFFFFFFFBF8F7EEE7E49C9591E8D8D0B7 + A293634935000000000000000000000000000000BEA99AFFFFFFB6B6B6ECECEC + FFFFFFF8F7F6ACAAA7E7DEDAEEE1DAB7A2936349350000000000000000000000 + 00000000C3AE9EFFFFFFB6B6B6ECECECFCFCFCB9B9B9CCCBCAF7F1EEF1E7E1B7 + A293634935000000000000000000000000000000C8B2A3FFFFFFB5B5B5EDEDED + C1C1C1CBCBCBFEFEFEFAF7F5F5EDE9B7A2936349350000000000000000000000 + 00000000CCB6A7FFFFFFB0B0B0C7C7C7C7C7C7FFFFFFFFFFFFFDFCFBB7A293B7 + A293644A36000000000000000000000000000000D1BBABFFFFFFB6B6B6C1C1C1 + FFFFFFFFFFFFFFFFFFB7A293644A36644A36644A360000000000000000000000 + 00000000D5BFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9A495D4C5BA64 + 4A36E1D5CD000000000000000000000000000000D8C2B2FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFC0AB9C644A36E2D6CD0000000000000000000000000000 + 00000000D8C2B2D8C2B2D8C2B2D8C2B2D8C2B2D4BEAECFB9A9C9B3A4E2D6CD00 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + 0000C0070000C0070000C0070000C0070000C0070000C0070000C0070000C007 + 0000C0070000C0070000C0070000C0070000C00F0000C01F0000FFFF0000} + OldCreateOrder = False + OnCreate = FormCreate + OnDestroy = FormDestroy + OnShow = FormShow + DesignSize = ( + 564 + 391) + PixelsPerInch = 96 + TextHeight = 13 + object lblFile: TLabel + Left = 16 + Top = 364 + Width = 346 + Height = 13 + Anchors = [akLeft, akRight, akBottom] + AutoSize = False + ExplicitWidth = 329 + end + object btnCancel: TButton + Left = 464 + Top = 359 + Width = 89 + Height = 25 + Anchors = [akRight, akBottom] + Cancel = True + Caption = 'Cancel' + ModalResult = 2 + TabOrder = 1 + end + object btnOK: TButton + Left = 368 + Top = 359 + Width = 89 + Height = 25 + Anchors = [akRight, akBottom] + Caption = 'OK' + Default = True + Enabled = False + TabOrder = 2 + OnClick = btnOKClick + end + object TemplateList: TListView + Left = 8 + Top = 8 + Width = 546 + Height = 344 + Anchors = [akLeft, akTop, akRight, akBottom] + BevelInner = bvNone + BevelOuter = bvNone + BevelKind = bkTile + BorderStyle = bsNone + Color = clBtnFace + Columns = <> + ColumnClick = False + LargeImages = UsedThumbnails + TabOrder = 0 + OnChange = TemplateListChange + end + object UsedThumbnails: TImageList + Height = 128 + Masked = False + Width = 128 + Left = 40 + Top = 304 + end +end diff --git a/Forms/Template.pas b/Forms/Template.pas new file mode 100644 index 0000000..338a318 --- /dev/null +++ b/Forms/Template.pas @@ -0,0 +1,347 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit Template; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Translation, + Dialogs, StdCtrls, ComCtrls, ImgList, ControlPoint, cmap, RenderingInterface, Main, + Global, Adjust, System.ImageList; + +type + TTemplateForm = class(TForm) + TemplateList: TListView; + btnCancel: TButton; + btnOK: TButton; + UsedThumbnails: TImageList; + lblFile: TLabel; + procedure FormShow(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure TemplateListChange(Sender: TObject; Item: TListItem; + Change: TItemChange); + procedure btnOKClick(Sender: TObject); + procedure FormDestroy(Sender: TObject); + private + { Private declarations } + Files: TStringList; // AV: replaced "useless" hidded TListBox + public + { Public declarations } + end; + +var + TemplateForm: TTemplateForm; +const + blankFlameXML1 = ''; + blankFlameXML2 = ''; + blankFlameXML3 = ''; + + procedure ListTemplateByFileName(filename:string); + +implementation + +{$R *.dfm} + +function LoadUserTemplates2(mask: string): integer; +var + FindResult: integer; + SearchRec : TSearchRec; + Path : string; +begin + Path := AppPath + 'Templates\'; // AV + result := 0; + + FindResult := FindFirst(Path + Mask, faAnyFile - faDirectory, SearchRec); + while FindResult = 0 do + begin + ListTemplateByFileName(Path + SearchRec.Name); + result := result + 1; + + FindResult := FindNext(SearchRec); + end; + { free memory } + FindClose(SearchRec); +end; + +function LoadUserTemplates: integer; +begin + LoadUserTemplates2('*.flame'); + LoadUserTemplates2('*.template'); + Result := 0; // make RTL happy +end; + +function BlankXML: string; +var + i: integer; + s: string; +const + break = ' '; +begin + s := blankFlameXML1 + break + blankFlameXML2 + break + blankFlameXML3 + break; + for i := 1 to 256 do begin + s := s + '000000'; + if (i mod 32 = 0) then s := s + break; + end; + s := s + ''; + Result := s; +end; + +procedure DropBlank(); +var + flameXML: string; + cp: TControlPoint; + bm: TBitmap; + Render: TRenderer; + ListItem: TListItem; +begin + cp := TControlPoint.Create; + Render := TRenderer.Create; + bm := TBitmap.Create; + + cp.Clear; + flameXML := BlankXML; + MainForm.ParseXML(cp, PCHAR(flameXML), true); + cp.AdjustScale(TemplateForm.UsedThumbnails.Width, TemplateForm.UsedThumbnails.Height); + + // start preview + cp.Width := TemplateForm.UsedThumbnails.Width; + cp.Height := TemplateForm.UsedThumbnails.Height; + cp.spatial_oversample := 1; + cp.spatial_filter_radius := 0.1; + cp.sample_density := 0.5; //3; + try + Render.SetCP(cp); + Render.Render; + finally + BM.Assign(Render.GetImage); + cp.Free; + Render.free; + end; +// Thumbnails + TemplateForm.UsedThumbnails.Add(bm, nil); + bm.Free; // AV: fixed multiple memory leaks! + ListItem := TemplateForm.TemplateList.Items.Add; + ListItem.Caption := 'Blank Flame'; + ListItem.ImageIndex := 0; + TemplateForm.Files.Add('n/a'); + //end preview + // + Application.ProcessMessages; +end; + +procedure DropListItem(FileName: string; FlameName: string); +var + flameXML: string; + cp: TControlPoint; + bm: TBitmap; + Render: TRenderer; + ListItem: TListItem; +begin + cp := TControlPoint.Create; + Render := TRenderer.Create; + bm := TBitmap.Create; + + cp.Clear; + flameXML := LoadXMLFlameText(filename, FlameName); + MainForm.ParseXML(cp, PCHAR(flameXML), true); + cp.AdjustScale(TemplateForm.UsedThumbnails.Width, TemplateForm.UsedThumbnails.Height); + + // start preview + cp.Width := TemplateForm.UsedThumbnails.Width; + cp.Height := TemplateForm.UsedThumbnails.Height; + cp.spatial_oversample := 1; + cp.spatial_filter_radius := 0.1; + cp.sample_density := 3; + try + Render.SetCP(cp); + Render.Render; + finally + BM.Assign(Render.GetImage); + cp.Free; + Render.free; + end; +// Thumbnails + TemplateForm.UsedThumbnails.Add(bm, nil); + bm.Free; // AV: fixed multiple memory leaks! + ListItem := TemplateForm.TemplateList.Items.Add; + ListItem.Caption := FlameName; + ListItem.ImageIndex := TemplateForm.TemplateList.Items.Count - 1; + TemplateForm.Files.Add(FileName); + //end preview + // + Application.ProcessMessages; +end; + +procedure ListTemplateByFileName(filename:string); +{ List .flame file } +var + sel: integer; + i, p: integer; + Title: string; + FStrings: TStringList; +begin + sel := 0; + if not FileExists(FileName) then exit; + FStrings := TStringList.Create; + FStrings.LoadFromFile(FileName); + try + if (Pos(' 0) then + begin + for i := 0 to FStrings.Count - 1 do + begin + p := Pos(' 0) then + begin + MainForm.ListXMLScanner.LoadFromBuffer(PAnsiChar(Utf8String(FSTrings[i]))); + MainForm.ListXMLScanner.Execute; + + if Length(pname) = 0 then + Title := '*untitled ' + ptime + else + Title := Trim(pname); + if Title <> '' then + begin { Otherwise bad format } + DropListItem(FileName, Title); + end; + end; + end; + end; + finally + FStrings.Free; + end; +end; + +procedure ListTemplate; +begin + TemplateForm.TemplateList.Items.BeginUpdate; + TemplateForm.TemplateList.Items.Clear; + TemplateForm.UsedThumbnails.Clear; + // AV: fixed - someone forgot to refresh the file list + TemplateForm.Files.Clear; + // hmmm... + (*for i := 0 to TemplateForm.UsedThumbnails.Count - 1 do + begin + TemplateForm.UsedThumbnails.GetBitmap(i, bm); + bm.Free; + end; *) + + DropBlank; + + ListTemplateByFileName(AppPath + templateFileName); + LoadUserTemplates; + + TemplateForm.TemplateList.Items.EndUpdate; + TemplateForm.TemplateList.Selected := TemplateForm.TemplateList.Items[0]; +end; + +procedure TTemplateForm.FormCreate(Sender: TObject); +begin + self.Caption := TextByKey('template-title'); + btnOK.Caption := TextByKey('common-ok'); + btnCancel.Caption := TextByKey('common-cancel'); + Files := TStringList.Create; // AV +end; + +procedure TTemplateForm.FormDestroy(Sender: TObject); +begin + Files.Free; // AV +end; + +procedure TTemplateForm.TemplateListChange(Sender: TObject; + Item: TListItem; Change: TItemChange); +var + fn : string; +begin + if (TemplateList.Selected = nil) then + btnOK.Enabled := false + else begin + if (TemplateList.Selected.Index >= 0) then begin + btnOK.Enabled := true; + if (TemplateList.Selected.Index > 0) then begin + fn := ChangeFileExt(ExtractFileName(Files[TemplateList.Selected.Index]), ''); + if (LowerCase(fn) <> 'apophysisav') then + lblFile.Caption := TextByKey('template-filename') + fn + else lblFile.Caption := ''; + end else begin + lblFile.Caption := ''; + end; + end else + btnOK.Enabled := false; + end; +end; + +procedure TTemplateForm.btnOKClick(Sender: TObject); +var + flameXML: string; + fn: string; + ci: integer; + blank: boolean; +begin + fn := Files[TemplateList.Selected.Index]; + blank := (TemplateList.Selected.Index = 0); + if blank then + flameXML := BlankXML + else + flameXML := LoadXMLFlameText(fn, TemplateList.Selected.Caption); + MainForm.UpdateUndo; + MainForm.StopThread; + MainForm.InvokeLoadXML(flameXML); + Transforms := MainCp.TrianglesFromCP(MainTriangles); + MainForm.Statusbar.Panels[3].Text := MainCp.name; + {if ResizeOnLoad then} + MainForm.ResizeImage; + MainForm.RedrawTimer.Enabled := True; + Application.ProcessMessages; + MainForm.UpdateWindows; + + // AV: fixed a bug with black flames on the black background + if RandomizeTemplates or blank then // AV + if (randGradient = 3) then // AV: only if user prefer new palettes + AdjustForm.mnuRandomize.Click + else begin // AV: use preset palette + ci := Random(NRCMAPS); + GetCMap(ci, 1, MainCp.cmap); + MainCp.cmapIndex := ci; + end; + + if blank then // AV: fixed resetting values to 1 + begin + MainCp.brightness := defBrightness; + MainCp.gamma := defGamma; + MainCp.gammaThreshRelative := defGammaThreshold; + MainCp.contrast := defContrast; + MainCp.Vibrancy := defVibrancy; + Maincp.sample_density := defSampleDensity; + end; + + ModalResult := mrOK; // AV +end; + +procedure TTemplateForm.FormShow(Sender: TObject); +begin + ListTemplate; +end; + +end. diff --git a/Forms/Tracer.dfm b/Forms/Tracer.dfm new file mode 100644 index 0000000..80e13ef --- /dev/null +++ b/Forms/Tracer.dfm @@ -0,0 +1,132 @@ +object TraceForm: TTraceForm + Left = 36 + Top = 159 + Caption = 'Trace' + ClientHeight = 489 + ClientWidth = 395 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Icon.Data = { + 0000010001001010000000000800680500001600000028000000100000002000 + 0000010008000000000000010000000000000000000000010000000100000000 + 0000000080000080000000808000800000008000800080800000C0C0C000C0DC + C000F0CAA60004040400080808000C0C0C0011111100161616001C1C1C002222 + 220029292900555555004D4D4D004242420039393900807CFF005050FF009300 + D600FFECCC00C6D6EF00D6E7E70090A9AD000000330000006600000099000000 + CC00003300000033330000336600003399000033CC000033FF00006600000066 + 330000666600006699000066CC000066FF000099000000993300009966000099 + 99000099CC000099FF0000CC000000CC330000CC660000CC990000CCCC0000CC + FF0000FF660000FF990000FFCC00330000003300330033006600330099003300 + CC003300FF00333300003333330033336600333399003333CC003333FF003366 + 00003366330033666600336699003366CC003366FF0033990000339933003399 + 6600339999003399CC003399FF0033CC000033CC330033CC660033CC990033CC + CC0033CCFF0033FF330033FF660033FF990033FFCC0033FFFF00660000006600 + 330066006600660099006600CC006600FF006633000066333300663366006633 + 99006633CC006633FF00666600006666330066666600666699006666CC006699 + 00006699330066996600669999006699CC006699FF0066CC000066CC330066CC + 990066CCCC0066CCFF0066FF000066FF330066FF990066FFCC00CC00FF00FF00 + CC009999000099339900990099009900CC009900000099333300990066009933 + CC009900FF00996600009966330099336600996699009966CC009933FF009999 + 330099996600999999009999CC009999FF0099CC000099CC330066CC660099CC + 990099CCCC0099CCFF0099FF000099FF330099CC660099FF990099FFCC0099FF + FF00CC00000099003300CC006600CC009900CC00CC0099330000CC333300CC33 + 6600CC339900CC33CC00CC33FF00CC660000CC66330099666600CC669900CC66 + CC009966FF00CC990000CC993300CC996600CC999900CC99CC00CC99FF00CCCC + 0000CCCC3300CCCC6600CCCC9900CCCCCC00CCCCFF00CCFF0000CCFF330099FF + 6600CCFF9900CCFFCC00CCFFFF00CC003300FF006600FF009900CC330000FF33 + 3300FF336600FF339900FF33CC00FF33FF00FF660000FF663300CC666600FF66 + 9900FF66CC00CC66FF00FF990000FF993300FF996600FF999900FF99CC00FF99 + FF00FFCC0000FFCC3300FFCC6600FFCC9900FFCCCC00FFCCFF00FFFF3300CCFF + 6600FFFF9900FFFFCC006666FF0066FF660066FFFF00FF666600FF66FF00FFFF + 66002100A5005F5F5F00777777008686860096969600CBCBCB00B2B2B200D7D7 + D700DDDDDD00E3E3E300EAEAEA00F1F1F100F8F8F800F0FBFF00A4A0A0008080 + 80000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF000000 + 000000000000000000000000000000000000000000000000000000000000AC12 + 1212121212121212121212F70000AC000000000000000000000000120000AC00 + 0000000000000000000000120000AC00FA00FAFA00FA0000000000120000AC00 + 0000000000000000000000120000AC00FAFA00FAFAFA00FA000000120000AC00 + 0000000000000000000000120000AC00FA00FAFA00FAFA00000000120000AC00 + 0000000000000000000000120000AC000000000000000000000000120000ACAC + ACACACACACACACACACACACAC0000ACFF090909090909090909FFADFF0000ACAC + ACACACACACACACACACACACACAC0000000000000000000000000000000000FFFF + 0000000100000001000000010000000100000001000000010000000100000001 + 0000000100000001000000010000000100000001000000010000FFFF0000} + OldCreateOrder = False + OnClose = FormClose + OnCreate = FormCreate + DesignSize = ( + 395 + 489) + PixelsPerInch = 96 + TextHeight = 13 + object PageControl1: TPageControl + Left = 0 + Top = 0 + Width = 395 + Height = 489 + ActivePage = TabMain + Align = alClient + Images = MainForm.Buttons + TabOrder = 0 + object TabMain: TTabSheet + Caption = 'Main' + ImageIndex = 16 + object MainTrace: TMemo + Left = 0 + Top = 0 + Width = 387 + Height = 460 + Align = alClient + Color = clBlack + Font.Charset = DEFAULT_CHARSET + Font.Color = clLime + Font.Height = -11 + Font.Name = 'Courier New' + Font.Style = [] + ParentFont = False + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 0 + end + end + object TabFullscreen: TTabSheet + Caption = 'Fullscreen' + ImageIndex = 52 + object FullscreenTrace: TMemo + Left = 0 + Top = 0 + Width = 387 + Height = 460 + Align = alClient + Color = clBlack + Font.Charset = DEFAULT_CHARSET + Font.Color = clLime + Font.Height = -11 + Font.Name = 'Courier New' + Font.Style = [] + ParentFont = False + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 0 + end + end + end + object cbTraceLevel: TComboBox + Left = 280 + Top = 0 + Width = 121 + Height = 21 + Style = csDropDownList + Anchors = [akTop, akRight] + TabOrder = 1 + OnSelect = cbTraceLevelSelect + Items.Strings = ( + 'No trace' + 'Minimal trace' + 'Full trace') + end +end diff --git a/Forms/Tracer.pas b/Forms/Tracer.pas new file mode 100644 index 0000000..5353fef --- /dev/null +++ b/Forms/Tracer.pas @@ -0,0 +1,156 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit Tracer; + +{$define TRACEFORM_HIDDEN} + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls, ComCtrls, Translation; + +type + TTraceForm = class(TForm) + PageControl1: TPageControl; + TabMain: TTabSheet; + TabFullscreen: TTabSheet; + FullscreenTrace: TMemo; + cbTraceLevel: TComboBox; + MainTrace: TMemo; + procedure cbTraceLevelSelect(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure FormCreate(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + TraceForm: TTraceForm; + +var + TraceLevel: integer; + +const + MsgComplete = '< Received WM_THREAD_COMPLETE from RenderThread #'; + MsgTerminated = '< Received WM_THREAD_TERMINATE from RenderThread #'; + MsgNotAssigned = 'Ignoring message: RenderThread does not exist'; + MsgAnotherRunning = 'Ignoring message: another RenderThread is running'; + +implementation + +{$R *.dfm} + +uses + Registry, + Global, Main; + +procedure TTraceForm.cbTraceLevelSelect(Sender: TObject); +begin + TraceLevel := cbTraceLevel.ItemIndex; +end; + +procedure TTraceForm.FormCreate(Sender: TObject); +var + Registry: TRegistry; +begin + { Read position from registry } + Registry := TRegistry.Create; + try + Registry.RootKey := HKEY_CURRENT_USER; + if Registry.OpenKey('Software\' + APP_NAME + '\Forms\Trace', False) then + begin + if Registry.ValueExists('Top') then + self.Top := Registry.ReadInteger('Top'); + if Registry.ValueExists('Left') then + self.Left := Registry.ReadInteger('Left'); + if Registry.ValueExists('Width') then + self.Width := Registry.ReadInteger('Width'); + if Registry.ValueExists('Height') then + self.Height := Registry.ReadInteger('Height'); + +{$ifndef TRACEFORM_HIDDEN} + + if Registry.ValueExists('TraceLevel') then + TraceLevel := Registry.ReadInteger('TraceLevel') + else + TraceLevel := 0; + MainForm.tbShowTrace.Visible := true; + MainForm.tbShowTrace.Enabled := true; + MainForm.tbTraceSeparator.Visible := true; + MainForm.tbTraceSeparator.Enabled := true; + +{$else} + + TraceLevel := 0; + //MainForm.tbShowTrace.Visible := false; + //MainForm.tbShowTrace.Enabled := false; + //MainForm.tbTraceSeparator.Visible := false; + //MainForm.tbTraceSeparator.Enabled := false; + +{$endif} + + end; + Registry.CloseKey; + finally + Registry.Free; + end; + + // AV: translation added + self.Caption := TextByKey('common-trace-title'); + TabMain.Caption := TextByKey('common-trace-main'); + TabFullScreen.Caption := TextByKey('common-trace-fullscreen'); + cbTraceLevel.Items[0] := TextByKey('common-trace-notrace'); + cbTraceLevel.Items[1] := TextByKey('common-trace-minimal'); + cbTraceLevel.Items[2] := TextByKey('common-trace-fulltrace'); + cbTraceLevel.ItemIndex := TraceLevel; +end; + +procedure TTraceForm.FormClose(Sender: TObject; var Action: TCloseAction); +var + Registry: TRegistry; +begin + { Write position to registry } + Registry := TRegistry.Create; + try + Registry.RootKey := HKEY_CURRENT_USER; + if Registry.OpenKey('\Software\' + APP_NAME + '\Forms\Trace', True) then + begin + if self.WindowState <> wsMaximized then begin + Registry.WriteInteger('Top', self.Top); + Registry.WriteInteger('Left', self.Left); + Registry.WriteInteger('Width', self.Width); + Registry.WriteInteger('Height', self.Height); + + Registry.WriteInteger('TraceLevel', TraceLevel); + end; + end; + finally + Registry.Free; + end; +end; + +end. diff --git a/Forms/VarOrderForm.dfm b/Forms/VarOrderForm.dfm new file mode 100644 index 0000000..f95ca96 --- /dev/null +++ b/Forms/VarOrderForm.dfm @@ -0,0 +1,381 @@ +object VarOrder: TVarOrder + Left = 0 + Top = 0 + BorderIcons = [biSystemMenu] + BorderStyle = bsSingle + Caption = 'Variation Order' + ClientHeight = 371 + ClientWidth = 335 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Icon.Data = { + 0000010001001616000000000000100800001600000028000000160000002C00 + 000001002000000000009007000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FF66000BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF66003FFF66 + 00DFFF6B09FFFF6600E0FF66003AFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FF690601FF6906E4FFB17EFFFFC299FFFFB5 + 84FFFF6906D2FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FF731606FF7316F7FF934CFFFF751AFFFFCDACFFFF7316F5FFFF + FF004F4F4FB44F4F4FFF4F4F4FFF4F4F4FFF4F4F4FFF4F4F4FFF4F4F4FFF4F4F + 4FFF4F4F4FFF4F4F4FFF4F4F4FFF4F4F4FFF4F4F4FB4FFFFFF00FFFFFF00FFFF + FF00FF7D2657FF7D26FFFFC69FFFFFAA71FFFF7D26C1FFFFFF00636363FFFCFC + FCFFFCFCFCFFFCFCFCFFFCFCFCFFF9F9F9FFF3F3F3FFEDEDEDFFE6E6E6FFE0E0 + E0FFE0E0E0FFE0E0E0FF636363FFFFFFFF00FFFFFF00FFFFFF00FF8636E8FFA5 + 68FFFF893BFFFFCBA9FFFF8636DCFFFFFF00777777B4777777FF777777FF7777 + 77FF777777FF777777FF777777FF777777FF777777FF777777FF777777FF7777 + 77FF777777B4FFFFFF00FFFFFF00FFFFFF00FF9046C4FFB17DFFFFCCA9FFFFB4 + 81FFFF9046B1FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FF995522FF9955B4FF9955E2FF9955B0FF995519FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FF66000BFF660040FF660040FF66003DFF660006FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF660003FF6600C1FF66 + 00FFFF6600FFFF6600FFFF6600B4FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FF6B0904FF6C0AF4FFD2B3FFFFB585FFFFA3 + 65FFFF6B09BBFFFFFF004F4F4FB44F4F4FFF4F4F4FFF4F4F4FFF4F4F4FFF4F4F + 4FFF4F4F4FFF4F4F4FFF4F4F4FFF4F4F4FFF4F4F4FFF4F4F4FFF4F4F4FB4FFFF + FF00FFFFFF00FFFFFF00FF771D8BFF924AFFFFB98AFFFF7B25FFFF771D74FFFF + FF00636363FFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFF9F9F9FFF3F3F3FFEDED + EDFFE6E6E6FFE0E0E0FFE0E0E0FFE0E0E0FF636363FFFFFFFF00FFFFFF00FFFF + FF00FF8330EAFF8D41FFFF9D5BFFFFB482FFFF8330B5FFFFFF00777777B47777 + 77FF777777FF777777FF777777FF777777FF777777FF777777FF777777FF7777 + 77FF777777FF777777FF777777B4FFFFFF00FFFFFF00FFFFFF00FF8F44C0FFBD + 91FFFFC49CFFFFB07BFFFF8F4487FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF9A5717FF9A5796FF9A57B9FF9A + 577EFF9A5707FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FF660008FF660040FF660040FF66003CFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FF6600B9FF6600FFFF6600FFFF6600FFFF66008EFFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF6600CAFFA5 + 69FFFFCFAFFFFF9853FFFF66009EFFFFFF004F4F4FB44F4F4FFF4F4F4FFF4F4F + 4FFF4F4F4FFF4F4F4FFF4F4F4FFF4F4F4FFF4F4F4FFF4F4F4FFF4F4F4FFF4F4F + 4FFF4F4F4FB4FFFFFF00FFFFFF00FFFFFF00FF701151FF7011FDFFC29AFFFF70 + 11E6FF701104FFFFFF00636363FFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFF9F9 + F9FFF3F3F3FFEDEDEDFFE6E6E6FFE0E0E0FFE0E0E0FFE0E0E0FF636363FFFFFF + FF00FFFFFF00FFFFFF00FF7C24EBFF8433FFFFC59EFFFF7C24DEFFFFFF00FFFF + FF00777777B4777777FF777777FF777777FF777777FF777777FF777777FF7777 + 77FF777777FF777777FF777777FF777777FF777777B4FFFFFF00FFFFFF00FFFF + FF00FF8737BEFFAE78FFFFC7A2FFFF8737D6FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF934A0DFF93 + 4A87FF934ABDFF934A30FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00C7FFFF0083FFFF0082000E00C200 + 0E0082000F0083FFFE00C7FFFE00FFFFFF0083FFFF0082000E0086000E008200 + 0E0083FFFE00CFFFFE00FFFFFF0083FFFF0082000E00C6000E0086000F0087FF + FE00CFFFFE00} + OldCreateOrder = False + Position = poOwnerFormCenter + OnCreate = FormCreate + OnDestroy = FormDestroy + OnShow = FormShow + DesignSize = ( + 335 + 371) + PixelsPerInch = 96 + TextHeight = 13 + object btnTop: TSpeedButton + Left = 221 + Top = 25 + Width = 96 + Height = 25 + BiDiMode = bdLeftToRight + Caption = 'To Top' + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000C40E0000C40E00000000000000000000FFFFFFBF6331 + CA7544CB7238C56125DFA88DFFFFFFFFFFFFFFFFFFFFFFFFEAB99BD96215E161 + 0AE46A14E16E1FFFFFFFFFFFFFBE653CE6C1A6FFFCD6F5C283CB6220D89A7CFF + FFFFFFFFFFE2A98AD66921F77711FF8A22F3852BDE7025FFFFFFFFFFFFF2E1D9 + C06847DEAF91FFE9BDF9B064D0611AD79673DB9F7FD67032FA8325FF8B21EB7E + 26D97434F7DECEFFFFFFFFFFFFFFFFFFF6EBE6BE6842D99D7BFFDBA8FD9C42D4 + 5A0BD35B0CFC8222FF871DE5761DD47134F8E6DBFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFDF9F8C36F4BD2936DFECE96FF8722FF6F00FF8419DF6E1BD17741FBF3 + EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF8F6C7795CCD855DFD + C285FF8E2AD66413CF7E52FBF4F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFEFECC876CCB7A4DD0773BCF835EFDFBF9FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFFFEFEFFFFFFFFFFFFFEFCFBDB + AA93DBA68CFDFAF8FFFFFFFFFFFFFFFEFEFFFEFEFFFFFFFFFFFFFFFFFFCE9E86 + B56849B76745C27E60F3E6E0FFFFFFFFFFFFFFFFFFFFFFFFF7ECE6D38E67CC74 + 41CF7641DFA27CFFFFFFFFFFFFA44516DDBA92E7C392D38B53B15831EEDBD3FF + FFFFFFFFFFF3E2DBC16C3FDA5F0AEE7310EB7D25C55209FFFFFFFFFFFFD4A591 + BA7352F7F4CFFFE8ABE18D4BAF5027ECD8CEF1E1D9B8633AE4792DFF8618FB90 + 2DCF6117DEA584FFFFFFFFFFFFFFFFFFD3A497AD5A35EEDBB0FFD48BE67F2EAF + 4D1BB1562BE67F36FF861AF48625C05210DBA58AFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFD8AFA3AB5835E8D0A6FFC575EC6E0FEA6605FF8314EE7F22BA5114DCAF + 99FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0BEB4A95537E2C497FF + B760FF7E0FE9791EB4501BDFB8A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFE8D0C9AA5639DEB688E59850AE4C22E5C9BCFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEDCD6AF + 5F3BAE603AEAD4CBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} + Margin = 3 + ParentBiDiMode = False + Spacing = 10 + OnClick = btnTopClick + end + object btnMoveUp: TSpeedButton + Left = 221 + Top = 60 + Width = 96 + Height = 25 + BiDiMode = bdLeftToRight + Caption = 'Move Up' + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000C40E0000C40E00000000000000000000FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE5D36 + A23C0FA93F0BB24D17EBCEBEFFFFFFFFFFFFFFFFFFFFFFFFF8E1D2E46D1EE966 + 0EF16B0EF9822BFFFFFFFFFFFFA64A1EE4A66EE79146D06620B95F33FBF4F1FF + FFFFFFFFFFFDF7F3DC793FEA7720F89A40FA9D44F5720FFFFFFFFFFFFFA95233 + E0B18AFFDA96FEA754BF5212CD8F73FFFFFFFFFFFFDFA282D96B21FD9433FFA9 + 4CF79B43ED7420FFFFFFFFFFFFDFC0B5A14423F1CEA8FFC882F09546B14510EC + D4C7F3E0D6C76128F58C36FF7F14FA8524E06109F7C7A8FFFFFFFFFFFFFFFFFF + C0816FB87155FDE2BAFFBE72D97831B55B31BF6B43DF8346FF7A14FF7406E05F + 07E59461FFFFFFFFFFFFFFFFFFFFFFFFF8F0EDA74F32D5A992FFE5B5FDB362BC + 5417BC5013FD8323FF6D00E86302CE6625FAEBE1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFE1C4B89F4020ECD7C5FFDBA5F6A456F48B36FF8117F46902BF4A01EBC1 + A7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC38773B2684FFBF3DFFF + C987FFAC5BFD963BC65108D08A64FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFDFAF9A64D32CEA394FFF3D6FFC47BD87D38AF5228FBF5F2FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9D2C9A04226EC + DCD4F2D0A9A24016E5C8BAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFC68D7DB2674AB97559C0826FFFFEFEFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF8F6AE + 5D3CAB5634FBF7F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} + Margin = 3 + ParentBiDiMode = False + Spacing = 10 + OnClick = btnMoveUpClick + end + object btnMoveDown: TSpeedButton + Left = 221 + Top = 95 + Width = 96 + Height = 25 + BiDiMode = bdLeftToRight + Caption = 'Move Down' + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000C40E0000C40E00000000000000000000FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFEF9F6EB7F38F07D30FEF6F0FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEAA177E9 + 7522F0822CF39F6AFFFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF3D5C3DA6219F8B46FFC9036EB6008F9D1B5FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF9F6D2672EEB9C5FFF + BA73FF760BF56903EC7623FEF5EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFD9916DD77538FDD29EFF9B44FF8420FE770EEE6300F0995DFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7C4B1C15117F5CBA3FFC484F9 + 9138F8872CFF8521FB7209E85F00F7C4A1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F7EEE9BC592DE3AD88FFE3B9FEB267D66317D75F11FE963CFF821BF56C07E873 + 22FCE9DBFFFFFFFFFFFFFFFFFFFFFFFFC6816AC87B56FEF0D9FFD99EE28B46CE + 6C36D57741E6853DFF973BFF7B14ED6604EE965AFFFFFFFFFFFFFFFFFFDDBAAF + AA4923F4E6D9FFF7D1F1BF85BF521AF3DBCDF7E6DBCF6225F4A05CFF8E2FFB78 + 12E65F01F5C5A3FFFFFFFFFFFFA95131E3C6BDFFFFFFFDF2C7C16430D59479FF + FFFFFFFFFFE3A688D46E35FDA75DFF8C28F77612E76D17FFFFFFFFFFFFA74F28 + E1C4B2E3C7AACC8E61B85C36FBF5F2FFFFFFFFFFFFFDF7F4D37742E07529F382 + 28F47618E46103FFFFFFFFFFFFB0613D9D3B179D3A14A7461CECD3C6FFFFFFFF + FFFFFFFFFFFFFFFFF6E3D7CF6220D1570CD65B0BE1772FFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} + Margin = 3 + ParentBiDiMode = False + Spacing = 10 + OnClick = btnMoveDownClick + end + object btnBottom: TSpeedButton + Left = 221 + Top = 130 + Width = 96 + Height = 25 + BiDiMode = bdLeftToRight + Caption = 'To Bottom' + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000C40E0000C40E00000000000000000000FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF5D9CBE07936E57C36F7D5C0FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEECBBDD66E37F2 + C48DF79E4EE3671BF5CAB0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFE5B9A7CB6A38F2CF9CFFAE58FF770BF7801EE46A16F2BD9BFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBA999C46936F3D8A8FFBD6FF1 + 710FF16906FF7F13F98522E66B14F1B58FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + D29D8CBD683CF5E1B3FFCE87EA7F2DCB6121D06C31EE8337FF831AFB8825E76B + 12EFAA7DFFFEFEFFFFFFFFFFFFCC9985C17E5BFDFCD2FFE4A8E38B47C05E2AF5 + E3D8F9ECE5D1723CEB7B2CFF8116FF8F2CEC741AF0A979FFFFFFFFFFFFA74717 + D8B18AE1B787D0824BBD653BF3E2DAFFFFFFFFFFFFF8E9E1D67F49E46308F171 + 0DF17E23E36208FFFFFFFFFFFFDDAF97BD795FBD785ECB9177F6EBE5FFFFFFFF + FFFFFFFFFFFFFFFFFBF2EDE3A47DDF8E5BE4905AF0B790FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFCF9FFB580FFB27AFFFAF6FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF8FE9D60FF + 9D54FF953EFE9854FFF9F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFEF6F1F58F51FCA564FFBD80FF8724FF7C15FF9447FFF3E9FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF4EFED8342F7AC76FFC990FF + 821EFF6C00FF7F17FF811CFF8B37FFEEE2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F8E5DBE3773AF3B183FFD5A2FD983FF66D09FA7310FF8324FF811AFF831FFF86 + 2DFFE3D0FFFFFFFFFFFFFFFFFFF4DBCEDB7746F1C09CFFE6BAFCAE62ED7018F6 + AD7DFAB789FB8431FF8426FF841EFF8927FF852BFFDDC4FFFFFFFFFFFFD06B33 + F0C7A8FFF4CEF8BF7EE26D1EF1AF87FFFFFFFFFFFFFBBF96FA7D22FF7710FF83 + 1EFF8C2AFF7E1DFFFFFFFFFFFFCD7039D3743DD67231D86C26EFBA9BFFFFFFFF + FFFFFFFFFFFFFFFFFCCBA9FB7819FE7007FF7812FF8529FFFFFF} + Margin = 3 + ParentBiDiMode = False + Spacing = 10 + OnClick = btnBottomClick + end + object btnSort: TSpeedButton + Left = 221 + Top = 165 + Width = 96 + Height = 25 + BiDiMode = bdLeftToRight + Caption = 'Sort by name' + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000C40E0000C40E00000000000000000000FFFFFFFBFBFF + C7C7FFA7A7FFA4A4FFA4A4FFA6A6FFD5D5FFFDFDFFFFFFFFC8C8C82828289898 + 98FFFFFFFFFFFFFFFFFFFFFFFFF6F6FF6A6AFF1010FF1D1DFF3434FF3C3CFFA3 + A3FFFCFCFFF9F9F98484841717175C5C5CE4E4E4FFFFFFFFFFFFFFFFFFFCFCFF + A2A2FF1D1DFF2A2AFFA2A2FFD1D1FFE9E9FFFFFFFFD8D8D83E3E3E1010102626 + 26B0B0B0FCFCFCFFFFFFFFFFFFFFFFFFEBEBFF7373FF1616FF6F6FFFEFEFFFFF + FFFFFFFFFF9090902625261A19191F1F1F636363F3F3F3FFFFFFFFFFFFFFFFFF + FFFFFFD9D9FF4D4DFF1B1BFF9A9AFFF9F9FFFFFFFFCECDCD8988883737377070 + 70BABABAFAFAFAFFFFFFFFFFFFFEFEFFDFDFFFBFBFFF7777FF1010FF3232FFCE + CEFFFFFFFFFFFFFFD3D3D34E4E4EABABABFFFFFFFFFFFFFFFFFFFFFFFFFBFBFF + 9C9CFF3B3BFF2D2DFF2525FF2C2CFFBABAFFFFFFFFFFFFFFD4D4D4575757AFAF + AFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFFE4E4FFC6C6FFC2C2FFC2C2FFC6C6FFEE + EEFFFFFFFFFFFFFFD7D6D6626262B4B4B4FFFFFFFFFFFFFFFFFFFFFFFFFEFCFB + F6E1D1F8E4D5FFFDFBFFFFFDF9E8DAF4DDCBFDFAF7FFFFFFD9D9D96D6D6DB9B9 + B9FFFFFFFFFFFFFFFFFFFFFFFFFCF8F4DC9B67D68A4CF2DAC6F5E3D4D99259D7 + 8C4FFAEFE7FFFFFFDDDDDC797979BFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFEFCFA + E4B188CA6717D07932D27D38C96210DD9D6AFCF6F2FFFFFFE0E0DF858584C4C5 + C4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D6C0CD7024CE7228CF752DC96412EB + C4A5FFFEFEFFFFFFE3E3E2919190CACACAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F9EDE3D88F54CF752CD07730D27F3BF5E2D3FFFFFFFFFFFFE6E6E69D9D9DD0D0 + D0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFCFAE5B48CC8600CC65B05DD9D6AFC + F8F4FFFFFFFFFFFFE9E9E9A9A9A9D6D6D6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF0D4BDCF752DCC6B1DEAC3A3FFFFFFFFFFFFFFFFFFECECECB8B8B8DCDC + DCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF5EFEFD2BAEDCCB1FAF0E8FF + FFFFFFFFFFFFFFFFF9F9F9E7E7E7F3F3F3FFFFFFFFFFFFFFFFFF} + Margin = 3 + ParentShowHint = False + ParentBiDiMode = False + ShowHint = True + Spacing = 5 + OnClick = btnSortClick + end + object btnDefOrder: TSpeedButton + Left = 221 + Top = 200 + Width = 96 + Height = 25 + BiDiMode = bdLeftToRight + Caption = 'Default order' + Glyph.Data = { + 36030000424D3603000000000000360000002800000010000000100000000100 + 18000000000000030000C40E0000C40E00000000000000000000FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0864C + B0681FA65400FFFFFFA65400FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFC0874BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + B1691FFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000 + 00000000000000000000FFFFFFFFFFFFFFFFFFA65400FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0864B + B0681EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFC1864CB1691FA65400FFFFFFA65400FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + B1691FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1681EFFFFFFFFFFFFFFFFFFFFFFFF00 + 0000000000000000000000000000000000000000000000000000FFFFFFC1874B + B0681EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1691FFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} + Margin = 3 + ParentShowHint = False + ParentBiDiMode = False + ShowHint = True + Spacing = 5 + OnClick = btnDefOrderClick + end + object pnlVarList: TPanel + Left = 8 + Top = 8 + Width = 200 + Height = 320 + ShowCaption = False + TabOrder = 0 + object VarListView: TListView + Left = 1 + Top = 1 + Width = 198 + Height = 318 + Align = alClient + Columns = < + item + Width = 175 + end> + ColumnClick = False + DragMode = dmAutomatic + FullDrag = True + HideSelection = False + ReadOnly = True + SmallImages = EditForm.IconsAV + TabOrder = 0 + ViewStyle = vsReport + OnChange = VarListViewChange + OnCustomDrawItem = VarListViewCustomDrawItem + OnDragDrop = VarListViewDragDrop + OnDragOver = VarListViewDragOver + end + end + object btnOK: TButton + Left = 142 + Top = 338 + Width = 75 + Height = 25 + Anchors = [akRight, akBottom] + Caption = '&OK' + ModalResult = 1 + TabOrder = 1 + end + object btnCancel: TButton + Left = 231 + Top = 338 + Width = 75 + Height = 25 + Anchors = [akRight, akBottom] + Caption = '&Cancel' + ModalResult = 2 + TabOrder = 2 + end +end diff --git a/Forms/VarOrderForm.pas b/Forms/VarOrderForm.pas new file mode 100644 index 0000000..eba08eb --- /dev/null +++ b/Forms/VarOrderForm.pas @@ -0,0 +1,340 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit VarOrderForm; + +interface + +uses + Winapi.Windows, Winapi.Messages, System.SysUtils, StrUtils, System.Variants, + System.Classes, Vcl.Graphics, + Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Editor, Translation, Vcl.StdCtrls, + Vcl.ComCtrls, Vcl.ExtCtrls, Vcl.Buttons; + +type + TVarOrder = class(TForm) + pnlVarList: TPanel; + VarListView: TListView; + btnOK: TButton; + btnCancel: TButton; + btnTop: TSpeedButton; + btnMoveUp: TSpeedButton; + btnMoveDown: TSpeedButton; + btnBottom: TSpeedButton; + btnSort: TSpeedButton; + btnDefOrder: TSpeedButton; + procedure FormCreate(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure btnMoveUpClick(Sender: TObject); + procedure VarListViewChange(Sender: TObject; Item: TListItem; + Change: TItemChange); + procedure btnMoveDownClick(Sender: TObject); + procedure btnTopClick(Sender: TObject); + procedure btnBottomClick(Sender: TObject); + procedure btnSortClick(Sender: TObject); + procedure btnDefOrderClick(Sender: TObject); + procedure VarListViewDragDrop(Sender, Source: TObject; X, Y: Integer); + procedure VarListViewDragOver(Sender, Source: TObject; X, Y: Integer; + State: TDragState; var Accept: Boolean); + procedure VarListViewCustomDrawItem(Sender: TCustomListView; + Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); + procedure FormDestroy(Sender: TObject); + private + { Private declarations } + totVars: integer; + usedVars: TStringList; + procedure ExchangeVars(const i, j: integer); + procedure SetVarIcon(const s: string; ListItem: TListItem); + procedure ShowSelected(const i: integer); + public + { Public declarations } + Changed: boolean; + end; + +var + VarOrder: TVarOrder; + +implementation + +uses + XFormMan, Global; // to get default variation order + +{$R *.dfm} + +procedure TVarOrder.btnBottomClick(Sender: TObject); +var i: integer; +begin + if not assigned(VarListView.Selected) then + begin + Application.MessageBox(PChar(TextByKey('varorder-noselected')), + PChar('Apophysis AV'), MB_ICONWARNING); + exit; + end; + + i := VarListView.Selected.Index; + ExchangeVars(i, totVars); + ShowSelected(totVars); +end; + +procedure TVarOrder.btnDefOrderClick(Sender: TObject); +var + i, j: integer; + s, cap: string; +begin + VarListView.Items.BeginUpdate; + + if assigned(VarListView.Selected) then + cap := VarListView.Selected.Caption + else + cap := 'linear'; + j := 0; + + for i := 0 to totVars do + begin + s := Varnames(i); + VarListView.Items[i].Caption := s; + SetVarIcon(s, VarListView.Items[i]); + if s = cap then j := i; + end; + VarListView.Selected := VarListView.Items[j]; + ShowSelected(j); + + VarListView.Items.EndUpdate; + Changed := True; +end; + +procedure TVarOrder.btnMoveDownClick(Sender: TObject); +var i: integer; +begin + if not assigned(VarListView.Selected) then + begin + Application.MessageBox(PChar(TextByKey('varorder-noselected')), + PChar('Apophysis AV'), MB_ICONWARNING); + exit; + end; + + i := VarListView.Selected.Index; + ExchangeVars(i, i + 1); + ShowSelected(i + 1); +end; + +procedure TVarOrder.btnMoveUpClick(Sender: TObject); +var i: integer; +begin + if not assigned(VarListView.Selected) then + begin + Application.MessageBox(PChar(TextByKey('varorder-noselected')), + PChar('Apophysis AV'), MB_ICONWARNING); + exit; + end; + + i := VarListView.Selected.Index; + ExchangeVars(i, i - 1); + ShowSelected(i - 1); +end; + +procedure TVarOrder.btnSortClick(Sender: TObject); +begin + VarListView.Items.BeginUpdate; + VarListView.SortType := stText; + VarListView.SortType := stNone; + if not assigned(VarListView.Selected) then + VarListView.Selected := VarListView.Items[0]; + ShowSelected(VarListView.Selected.Index); + VarListView.Items.EndUpdate; + Changed := True; +end; + +procedure TVarOrder.btnTopClick(Sender: TObject); +var i: integer; +begin + if not assigned(VarListView.Selected) then + begin + Application.MessageBox(PChar(TextByKey('varorder-noselected')), + PChar('Apophysis AV'), MB_ICONWARNING); + exit; + end; + + i := VarListView.Selected.Index; + ExchangeVars(i, 0); + ShowSelected(0); +end; + +procedure TVarOrder.ExchangeVars(const i, j: integer); +var + tmpVarItem: TListItem; + n: integer; +begin + VarListView.Items.BeginUpdate; + tmpVarItem := TListItem.Create(VarListView.Items); + try + if (i < j) then + for n := i to (j - 1) do + begin + tmpVarItem.Assign(VarListView.Items.Item[n]); + VarListView.Items.Item[n] := VarListView.Items.Item[n + 1]; + VarListView.Items.Item[n + 1] := tmpVarItem; + end + else // if (i > j) then + for n := i downto (j + 1) do + begin + tmpVarItem.Assign(VarListView.Items.Item[n]); + VarListView.Items.Item[n] := VarListView.Items.Item[n - 1]; + VarListView.Items.Item[n - 1] := tmpVarItem; + end; + VarListView.Selected := VarListView.Items[j]; + Changed := True; + finally + tmpVarItem.Free; + VarListView.Items.EndUpdate; + end; +end; + +procedure TVarOrder.FormCreate(Sender: TObject); +begin + btnOK.Caption := TextByKey('common-ok'); + btnCancel.Caption := TextByKey('common-cancel'); + btnMoveUp.Caption := TextByKey('favscripts-moveup'); + btnMoveDown.Caption := TextByKey('favscripts-movedown'); + btnTop.Caption := TextByKey('varorder-totop'); + btnBottom.Caption := TextByKey('varorder-tobottom'); + btnSort.Caption := TextByKey('varorder-byname'); + btnSort.Hint := TextByKey('varorder-bynamehint'); + btnDefOrder.Caption := TextByKey('varorder-byindex'); + btnDefOrder.Hint := TextByKey('varorder-byindexhint'); + self.Caption := TextByKey('varorder-title'); + usedVars := TStringList.Create; +end; + +procedure TVarOrder.FormDestroy(Sender: TObject); +begin + usedVars.Free; +end; + +procedure TVarOrder.FormShow(Sender: TObject); +var + ListItem: TListItem; + i, SelTX: integer; + s: string; +begin + Changed := False; + SelTX := EditForm.cbTransforms.ItemIndex; + if SelTX < EditForm.cp.NumXForms then + begin + s := TextByKey('editor-common-transform') + ' ' + IntToStr(SelTX + 1); + //if (EditForm.txtName.Text <> '') then + // s := s + ' - ' + EditForm.txtName.Text; + end else + s := TextByKey('editor-common-transform') + ' ' + + TextByKey('editor-common-finalxformlistitem'); + VarListView.Column[0].Caption := s; + totVars := NrVar - 1; + VarListView.Items.BeginUpdate; + VarListView.Items.Clear; + usedVars.Clear; + for i := 0 to totVars do + begin + ListItem := VarListView.Items.Add; + s := EditForm.cp.xform[SelTX].ifs[i]; + ListItem.Caption := s; + SetVarIcon(s, ListItem); + ListItem.Indent := 1; + if EditForm.cp.xform[SelTX].GetVariation(i) <> 0 then + usedVars.Add(Varnames(i)); + end; + VarListView.Items.EndUpdate; + VarListView.Selected := VarListView.Items[0]; +end; + +procedure TVarOrder.SetVarIcon(const s: string; ListItem: TListItem); +begin + if (LeftStr(s, 4) = 'pre_') or (s = 'flatten') then + ListItem.ImageIndex := 7 // red + else if LeftStr(s, 5) = 'post_' then + ListItem.ImageIndex := 4 // blue + else if (s = 'trianglecrop') or (s = 'projective') + or (s = 'affine3D') or (s = 'spherecrop') then + ListItem.ImageIndex := 6 // violet + else + ListItem.ImageIndex := 5 // blue; +end; + +procedure TVarOrder.ShowSelected(const i: integer); +begin + try + VarListView.Items[i].MakeVisible(false); + finally + VarListView.SetFocus; + end; +end; + +procedure TVarOrder.VarListViewChange(Sender: TObject; Item: TListItem; + Change: TItemChange); +begin + if (Item.Index = totVars) or (Item.Index < 0) then + begin + btnMoveDown.Enabled := False; + btnBottom.Enabled := False; + end else begin + btnMoveDown.Enabled := True; + btnBottom.Enabled := True; + end; + if (Item.Index <= 0) then + begin + btnMoveUp.Enabled := False; + btnTop.Enabled := False; + end else begin + btnMoveUp.Enabled := True; + btnTop.Enabled := True; + end; +end; + +procedure TVarOrder.VarListViewCustomDrawItem(Sender: TCustomListView; + Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); +var + vRect: TRect; +begin + DefaultDraw := True; + if (usedVars.Count = 0) then exit; + vRect := Item.DisplayRect(drLabel); + if usedVars.IndexOf(Item.Caption) >= 0 then + with VarListView.Canvas do + begin + if (CurrentStyle = 'Windows') then + Brush.Color := $0002B076 + else + Brush.Color := BrightColor; + FillRect(vRect); + if (CurrentStyle = 'Auric') then // make the text more visible + Font.Color := WinColor + else + Font.Color := TextColor; + TextOut(vRect.Left + 2, vRect.Top + 2, Item.Caption); + end; +end; + +procedure TVarOrder.VarListViewDragDrop(Sender, Source: TObject; X, Y: Integer); +var + i, j: integer; +begin + if not assigned(VarListView.Selected) then exit; + + if Source = VarListView then + begin + try + i := VarListView.Selected.Index; + j := VarListView.GetItemAt(X,Y).Index; + if (j >= 0) and (i >= 0) and (i <> j) then + ExchangeVars(i, j); + except + Beep; + end; + end; +end; + +procedure TVarOrder.VarListViewDragOver(Sender, Source: TObject; X, Y: Integer; + State: TDragState; var Accept: Boolean); +begin + Accept := (Source = VarListView); +end; + +end. diff --git a/Forms/formPostProcess.dfm b/Forms/formPostProcess.dfm new file mode 100644 index 0000000..6dcef9a --- /dev/null +++ b/Forms/formPostProcess.dfm @@ -0,0 +1,279 @@ +object frmPostProcess: TfrmPostProcess + Left = 421 + Top = 359 + Caption = 'Post Render' + ClientHeight = 537 + ClientWidth = 693 + Color = clBtnFace + Constraints.MinHeight = 200 + Constraints.MinWidth = 700 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + OldCreateOrder = False + OnClose = FormClose + OnCreate = FormCreate + OnDestroy = FormDestroy + OnShow = FormShow + DesignSize = ( + 693 + 537) + PixelsPerInch = 96 + TextHeight = 13 + object Panel1: TPanel + Left = 0 + Top = 0 + Width = 693 + Height = 81 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + DesignSize = ( + 693 + 81) + object pnlFilter: TPanel + Left = 8 + Top = 32 + Width = 110 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Filter Radius' + TabOrder = 11 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + end + object pnlVibrancy: TPanel + Left = 337 + Top = 32 + Width = 95 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Vibrancy' + TabOrder = 10 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + end + object pnlBrightness: TPanel + Left = 180 + Top = 32 + Width = 95 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Brightness' + TabOrder = 8 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + end + object pnlContrast: TPanel + Left = 337 + Top = 8 + Width = 95 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Contrast' + TabOrder = 9 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + end + object pnlGamma: TPanel + Left = 180 + Top = 8 + Width = 95 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Gamma' + TabOrder = 7 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + end + object ProgressBar1: TProgressBar + Left = 8 + Top = 61 + Width = 682 + Height = 20 + Anchors = [akLeft, akRight, akBottom] + TabOrder = 15 + end + object txtFilterRadius: TEdit + Left = 117 + Top = 32 + Width = 57 + Height = 21 + TabOrder = 2 + OnKeyPress = EditKeyPress + end + object txtGamma: TEdit + Left = 274 + Top = 8 + Width = 57 + Height = 21 + TabOrder = 3 + OnKeyPress = EditKeyPress + end + object txtVibrancy: TEdit + Left = 431 + Top = 32 + Width = 57 + Height = 21 + TabOrder = 6 + OnKeyPress = EditKeyPress + end + object txtContrast: TEdit + Left = 431 + Top = 8 + Width = 57 + Height = 21 + TabOrder = 5 + OnKeyPress = EditKeyPress + end + object txtBrightness: TEdit + Left = 274 + Top = 32 + Width = 57 + Height = 21 + TabOrder = 4 + OnKeyPress = EditKeyPress + end + object pnlBackground: TPanel + Left = 495 + Top = 8 + Width = 100 + Height = 21 + Cursor = crArrow + BevelOuter = bvLowered + Caption = 'Background' + TabOrder = 12 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + end + object pnlBackColor: TPanel + Left = 600 + Top = 8 + Width = 57 + Height = 21 + Cursor = crHandPoint + BevelInner = bvRaised + BevelOuter = bvLowered + BorderStyle = bsSingle + TabOrder = 0 + OnClick = pnlBackColorClick + object shBack: TShape + Left = 2 + Top = 2 + Width = 49 + Height = 13 + Align = alClient + Brush.Color = clBlack + Pen.Color = clWindow + Pen.Style = psClear + Pen.Width = 0 + OnMouseUp = shBackMouseUp + ExplicitLeft = 0 + end + end + object btnApply: TButton + Left = 535 + Top = 32 + Width = 97 + Height = 25 + Anchors = [akTop, akRight] + Caption = '&Apply' + Default = True + TabOrder = 13 + OnClick = btnApplyClick + end + object pnlRelGamma: TPanel + Left = 8 + Top = 8 + Width = 110 + Height = 21 + Cursor = crHandPoint + BevelOuter = bvLowered + Caption = 'Gamma Threshold' + TabOrder = 14 + OnDblClick = DragPanelDblClick + OnMouseDown = DragPanelMouseDown + OnMouseMove = DragPanelMouseMove + OnMouseUp = DragPanelMouseUp + end + object txtRelGamma: TEdit + Left = 117 + Top = 8 + Width = 57 + Height = 21 + TabOrder = 1 + OnKeyPress = EditKeyPress + end + end + object ScrollBox1: TScrollBox + Left = 8 + Top = 88 + Width = 689 + Height = 417 + Align = alCustom + Anchors = [akLeft, akTop, akRight, akBottom] + BevelInner = bvNone + BevelKind = bkSoft + BorderStyle = bsNone + Color = clAppWorkSpace + ParentColor = False + TabOrder = 1 + object Image: TImage + Left = 0 + Top = 0 + Width = 687 + Height = 415 + Align = alClient + AutoSize = True + Center = True + Proportional = True + Stretch = True + end + end + object btnSave: TButton + Left = 588 + Top = 510 + Width = 97 + Height = 25 + Anchors = [akRight, akBottom] + Caption = '&Save' + TabOrder = 2 + OnClick = btnSaveClick + end + object chkFitToWindow: TCheckBox + Left = 8 + Top = 512 + Width = 490 + Height = 17 + Anchors = [akLeft, akRight, akBottom] + Caption = 'Fit to window' + Checked = True + State = cbChecked + TabOrder = 3 + Visible = False + OnClick = chkFitToWindowClick + end + object ColorDialog: TColorDialog + Left = 612 + Top = 76 + end +end diff --git a/Forms/formPostProcess.pas b/Forms/formPostProcess.pas new file mode 100644 index 0000000..6f7d6ed --- /dev/null +++ b/Forms/formPostProcess.pas @@ -0,0 +1,568 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit formPostProcess; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, ExtCtrls, RenderingInterface, controlpoint, StdCtrls, ComCtrls, + Translation; + +type + TfrmPostProcess = class(TForm) + Panel1: TPanel; + ScrollBox1: TScrollBox; + Image: TImage; + pnlBackColor: TPanel; + ColorDialog: TColorDialog; + ProgressBar1: TProgressBar; + txtFilterRadius: TEdit; + txtGamma: TEdit; + txtVibrancy: TEdit; + txtContrast: TEdit; + txtBrightness: TEdit; + pnlGamma: TPanel; + pnlBrightness: TPanel; + pnlContrast: TPanel; + pnlVibrancy: TPanel; + pnlFilter: TPanel; + shBack: TShape; + pnlBackground: TPanel; + btnSave: TButton; + chkFitToWindow: TCheckBox; + btnApply: TButton; + pnlRelGamma: TPanel; + txtRelGamma: TEdit; + procedure chkFitToWindowClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure btnSaveClick(Sender: TObject); + procedure btnApplyClick(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure pnlBackColorClick(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure FormShow(Sender: TObject); + + procedure DragPanelMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure DragPanelMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure DragPanelMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure DragPanelDblClick(Sender: TObject); + procedure shBackMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure EditKeyPress(Sender: TObject; var Key: Char); + private + { Private declarations } + FRenderer: TBaseRenderer; + FCP: TControlPoint; + FImagename: string; + + pnlDragMode, pnlDragged, pnlMM: boolean; + pnlDragPos, pnlDragOld: integer; + pnlDragValue: double; + mousepos: TPoint; + + BkgColor: TColor; + Filter, + Gamma, Brightness, RelGamma, + Contrast, Vibrancy: double; + + ImCount: shortint; // AV: the number of saved images + NewName: string; // AV + + procedure UpdateFlame; + procedure SetDefaultValues; + + procedure OnProgress(prog: double); + + public + cp : TControlPoint; + + procedure SetRenderer(Renderer: TBaseRenderer); + procedure SetControlPoint(CP: TControlPoint); + procedure SetImageName(imagename: string); + end; + +var + frmPostProcess: TfrmPostProcess; + +implementation + +uses + Registry, Global, Main; + +{$R *.dfm} + +{ TfrmPostProcess } + +/////////////////////////////////////////////////////////////////////////////// +procedure TfrmPostProcess.SetRenderer(Renderer: TBaseRenderer); +begin + if assigned(FRenderer) then + FRenderer.Free; + + FRenderer := Renderer; + Frenderer.OnProgress := OnProgress; + Image.Picture.Graphic := FRenderer.GetImage; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TfrmPostProcess.FormShow(Sender: TObject); +var + Registry: TRegistry; +begin + { Read posution from registry } + Registry := TRegistry.Create; + try + Registry.RootKey := HKEY_CURRENT_USER; + if Registry.OpenKey('Software\' + APP_NAME + '\Forms\PostProcess', False) then begin + if Registry.ValueExists('Left') then + Left := Registry.ReadInteger('Left'); + if Registry.ValueExists('Top') then + Top := Registry.ReadInteger('Top'); + //if Registry.ValueExists('Width') then + //Width := Registry.ReadInteger('Width'); + //if Registry.ValueExists('Height') then + // Height := Registry.ReadInteger('Height'); + end; + Registry.CloseKey; + finally + Registry.Free; + end; + + ImCount := -1; // AV: reset the counter +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TfrmPostProcess.FormClose(Sender: TObject; var Action: TCloseAction); +var + Registry: TRegistry; +begin + { Write position to registry } + Registry := TRegistry.Create; + try + Registry.RootKey := HKEY_CURRENT_USER; + if Registry.OpenKey('\Software\' + APP_NAME + '\Forms\PostProcess', True) then + begin + Registry.WriteInteger('Top', Top); + Registry.WriteInteger('Left', Left); + // Registry.WriteInteger('Width', Width); + // Registry.WriteInteger('Height', Height); + end; + finally + Registry.Free; + end; + + FRenderer.Free; // weirdness!!! :-/ + FRenderer := nil; + Image.Picture.Graphic := nil; + FCP.Free; + FCP := nil; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TfrmPostProcess.SetDefaultValues; +begin + BkgColor := RGB(Fcp.background[0], Fcp.background[1], Fcp.background[2]); + pnlBackColor.Color := BkgColor; + shBack.Brush.Color := BkgColor; + Filter := FCP.spatial_filter_radius; + txtFilterRadius.Text := FloatTostr(Filter); + Gamma := FCP.gamma; + txtGamma.Text := FloatTostr(Gamma); + RelGamma := FCP.gammaThreshRelative; // AV + txtRelGamma.Text := FloatTostr(RelGamma); // AV + Vibrancy := FCP.vibrancy; + txtVibrancy.Text := FloatTostr(Vibrancy); + Contrast := FCP.contrast; + txtContrast.Text := FloatTostr(Contrast); + Brightness := FCP.brightness; + txtBrightness.Text := FloatTostr(brightness); +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TfrmPostProcess.SetControlPoint(CP: TControlPoint); +begin + if assigned(FCP) then + FCP.Free; + + FCP := cp.Clone; + SetDefaultValues; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TfrmPostProcess.pnlBackColorClick(Sender: TObject); +var + col: Longint; +begin + ColorDialog.Color := shBack.Brush.Color; + if ColorDialog.Execute then begin + pnlBackColor.Color := ColorDialog.Color; + shBack.Brush.Color := ColorDialog.Color; + col := ColorToRGB(ColorDialog.Color); + Fcp.background[0] := col and 255; + Fcp.background[1] := (col shr 8) and 255; + Fcp.background[2] := (col shr 16) and 255; + UpdateFlame; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TfrmPostProcess.UpdateFlame; +begin + Screen.Cursor := crHourGlass; + FRenderer.UpdateImage(FCP); + Image.Picture.Graphic := FRenderer.GetImage; + Screen.Cursor := crDefault; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TfrmPostProcess.FormDestroy(Sender: TObject); +begin + if assigned(FRenderer) then + FRenderer.Free; + + if assigned(FCP) then + FCP.Free; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TfrmPostProcess.OnProgress(prog: double); +begin + ProgressBar1.Position := round(100 * prog); +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TfrmPostProcess.btnApplyClick(Sender: TObject); +var + temp, tempg: double; +begin + TryStrToFloat(txtFilterRadius.Text, FCP.spatial_filter_radius); + if FCP.spatial_filter_radius > 2 then begin + FCP.spatial_filter_radius := 2; + txtFilterRadius.Text := '2'; + end else if FCP.spatial_filter_radius < 0 then begin + FCP.spatial_filter_radius := 0.01; + txtFilterRadius.Text := FloatTostr(0.01); + end; + + TryStrToFloat(txtGamma.Text, FCP.gamma); + if FCP.gamma > 10 then begin + FCP.gamma := 10; + txtGamma.Text := '10'; + end else if FCP.gamma < 0.01 then begin + FCP.gamma := 0.01; + txtGamma.Text := FloatTostr(0.01); + end; + + // AV + if TryStrToFloat(txtRelGamma.Text, tempg) then FCP.gammathreshrelative := tempg; + if FCP.gammathreshrelative < 0 then begin + FCP.gammathreshrelative := 0; + txtRelGamma.Text := '0'; + end; + + TryStrToFloat(txtVibrancy.Text, FCP.vibrancy); + if FCP.vibrancy > 30 then begin // AV: maximum was 10, + FCP.vibrancy := 30; // but Apo allows to use higher values + txtVibrancy.Text := '30'; // AV + end else if FCP.vibrancy < 0.01 then begin + FCP.vibrancy := 0.01; + txtVibrancy.Text := FloatTostr(0.01); + end; + + TryStrToFloat(txtContrast.Text, FCP.contrast); + if FCP.contrast > 10 then begin + FCP.contrast := 10; + txtContrast.Text := '10'; + end else if FCP.contrast < 0.01 then begin + FCP.contrast := 0.01; + txtContrast.Text := FloatTostr(0.01); + end; + + if TryStrToFloat(txtBrightness.Text, temp) then FCP.brightness := temp; + //TryStrToFloat(txtBrightness.Text, FCP.brightness); + if FCP.brightness > 100 then begin + FCP.brightness := 100; + txtBrightness.Text := '100'; + end else if FCP.brightness < 0.01 then begin + FCP.brightness := 0.01; + txtBrightness.Text := FloatTostr(0.01); + end; + + UpdateFlame; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TfrmPostProcess.btnSaveClick(Sender: TObject); +begin + inc(ImCount); + if ImCount = 0 then + FRenderer.SaveImage(FImagename) + else begin // AV: enumerating different versions of the image + NewName := FImagename; + Insert(' (' + IntToStr(ImCount) + ')', NewName, length(NewName) - 3); + FRenderer.SaveImage(NewName); + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TfrmPostProcess.SetImageName(imagename: string); +begin + FImagename := imagename; +end; + +// ----------------------------------------------------------------------------- + +procedure TfrmPostProcess.DragPanelMouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + if Button <> mbLeft then exit; + + if (Sender = pnlFilter) then + pnlDragValue := fcp.spatial_filter_radius * 10 + else if (Sender = pnlGamma) then + pnlDragValue := fcp.gamma + else if (Sender = pnlRelGamma) then // AV + pnlDragValue := fcp.gammaThreshRelative * 10 + else if (Sender = pnlBrightness) then + pnlDragValue := fcp.brightness + else if (Sender = pnlContrast) then + pnlDragValue := fcp.contrast + else if (Sender = pnlVibrancy) then + pnlDragValue := fcp.vibrancy + else exit;//assert(false); + + pnlDragMode := true; + pnlDragPos := 0; + pnlDragOld := x; + pnlMM := false; + SetCaptureControl(TControl(Sender)); + Screen.Cursor := crHSplit; + GetCursorPos(mousepos); // hmmm + pnlDragged := false; +end; + +procedure TfrmPostProcess.DragPanelMouseMove(Sender: TObject; Shift: TShiftState; + X, Y: Integer); +var + v: double; + pEdit: ^TEdit; + enableDrag : boolean; +begin + if pnlMM then // hack: to skip MouseMove event + begin + pnlMM:=false; + end + else + if pnlDragMode and (x <> pnlDragOld) then + begin + Inc(pnlDragPos, x - pnlDragOld); + + if GetKeyState(VK_MENU) < 0 then v := 100000 + else if GetKeyState(VK_CONTROL) < 0 then v := 10000 + else if GetKeyState(VK_SHIFT) < 0 then v := 100 + else v := 1000; + + v := Round6(pnlDragValue + pnlDragPos / v); + + SetCursorPos(MousePos.x, MousePos.y); // hmmm + pnlMM:=true; + + enableDrag := true; + if (Sender = pnlFilter) then + begin + v := v / 10; + if v > 2 then v := 2 + else if v < 0.01 then v := 0.01; + fcp.spatial_filter_radius := v; + pEdit := @txtFilterRadius; + end + else if (Sender = pnlGamma) then + begin + if v > 10 then v := 10 + else if v < 0.01 then v := 0.01; + fcp.gamma := v; + pEdit := @txtGamma; + end + else if (Sender = pnlRelGamma) then + begin + v := v * 0.1; + if v < 0 then v := 0; + fcp.gammaThreshRelative := v; + pEdit := @txtRelGamma; + end + else if (Sender = pnlBrightness) then + begin + if v > 100 then v := 100 + else if v < 0.01 then v := 0.01; + fcp.brightness := v; + pEdit := @txtBrightness; + end + else if (Sender = pnlContrast) then + begin + if v > 10 then v := 10 + else if v < 0.01 then v := 0.01; + fcp.contrast := v; + pEdit := @txtContrast; + end + else if (Sender = pnlVibrancy) then + begin + if v > 30 then v := 30 // AV: was 10, but higher values are allowed + else if v < 0.01 then v := 0.01; + fcp.vibrancy := v; + pEdit := @txtVibrancy; + end else exit; + + if enableDrag then begin + pEdit^.Text := FloatToStr(v); + //pEdit.Refresh; + pnlDragged := True; + // TODO: image preview (?) + //DrawPreview; + end; + end; +end; + +procedure TfrmPostProcess.DragPanelMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + if Button <> mbLeft then exit; + + if pnlDragMode then + begin + SetCaptureControl(nil); + pnlDragMode := false; + Screen.Cursor := crDefault; + + if pnlDragged then + begin + //UpdateFlame; + pnlDragged := False; + end; + end; +end; + +procedure TfrmPostProcess.EditKeyPress(Sender: TObject; var Key: Char); +begin // AV + if (Key = ',') then Key := '.'; //FormatSettings.DecimalSeparator; + if not CharinSet(Key,['0'..'9', #8, #13, '.']) + then Key:= #0; +end; + +procedure TfrmPostProcess.DragPanelDblClick(Sender: TObject); +var + pValue: ^double; + pDefaultValue: ^double; + pEdit: ^TEdit; +begin + if (Sender = pnlFilter) then + begin + pValue := @fcp.spatial_filter_radius; + pDefaultValue := @Filter; + pEdit := @txtFilterRadius; + end + else if (Sender = pnlGamma) then + begin + pValue := @fcp.gamma; + pDefaultValue := @Gamma; + pEdit := @txtGamma; + end + else if (Sender = pnlRelGamma) then + begin + // AV: because it's a property, not a field + if fcp.gammaThreshRelative = RelGamma then exit; + fcp.gammaThreshRelative := RelGamma; + txtRelGamma.Text := FloatToStr(fcp.gammaThreshRelative); + exit; + end + else if (Sender = pnlBrightness) then + begin + if fcp.brightness = Brightness then exit; + fcp.brightness := Brightness; + txtBrightness.Text := FloatToStr(fcp.brightness); + exit; + end + else if (Sender = pnlContrast) then + begin + pValue := @fcp.contrast; + pDefaultValue := @Contrast; + pEdit := @txtContrast + end + else if (Sender = pnlVibrancy) then + begin + pValue := @fcp.vibrancy; + pDefaultValue := @Vibrancy; + pEdit := @txtVibrancy; + end + else exit; //assert(false); + + if pValue^ = pDefaultValue^ then exit; + pValue^ := pDefaultValue^; + pEdit^.Text := FloatToStr(pValue^); + //UpdateFlame; +end; + +procedure TfrmPostProcess.shBackMouseUp(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + pnlBackColorClick(sender); +end; + +procedure TfrmPostProcess.FormCreate(Sender: TObject); +begin + btnApply.Caption := TextByKey('common-apply'); + pnlFilter.Caption := TextByKey('common-filterradius'); + pnlGamma.Caption := TextByKey('common-gamma'); + pnlRelGamma.Caption := TextByKey('common-gammathreshold'); + pnlBrightness.Caption := TextByKey('common-brightness'); + pnlContrast.Caption := TextByKey('common-contrast'); + pnlVibrancy.Caption := TextByKey('common-vibrancy'); + pnlBackground.Caption := TextByKey('common-background'); + pnlFilter.Hint := TextByKey('common-dragpanelhint'); + pnlGamma.Hint := TextByKey('common-dragpanelhint'); + pnlBrightness.Hint := TextByKey('common-dragpanelhint'); + pnlVibrancy.Hint := TextByKey('common-dragpanelhint'); + pnlContrast.Hint := TextByKey('common-dragpanelhint'); + pnlRelGamma.Hint := TextByKey('common-dragpanelhint'); + self.Caption := TextByKey('postprocess-title'); + btnSave.Caption := TextByKey('postprocess-save'); + chkFitToWindow.Caption := TextByKey('postprocess-fittowindow'); +end; + +procedure TfrmPostProcess.chkFitToWindowClick(Sender: TObject); +begin + {if (chkFitToWindow.Checked) then begin + Image.Stretch := true; + Image.Align := alClient; + end else begin + Image.Stretch := false; + Image.Align := alNone; + end; } +end; + +end. diff --git a/HARLOWSI.TTF b/HARLOWSI.TTF new file mode 100644 index 0000000..3c59ef9 Binary files /dev/null and b/HARLOWSI.TTF differ diff --git a/Licence.txt b/Licence.txt new file mode 100644 index 0000000..e72bfdd --- /dev/null +++ b/Licence.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 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 . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file diff --git a/Rendering/BucketFillerThread.pas b/Rendering/BucketFillerThread.pas new file mode 100644 index 0000000..308a177 --- /dev/null +++ b/Rendering/BucketFillerThread.pas @@ -0,0 +1,109 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit BucketFillerThread; + +interface + +uses + Classes, Windows, ControlPoint, RenderingInterface, XForm; + +type + TBucketFillerThread = class(TThread) + + private + fcp: TControlPoint; + points: TPointsArray; + + public + nrbatches: integer; + batchcounter: Pinteger; + + ColorMap: TColorMapArray; + CriticalSection: TRTLCriticalSection; + + AddPointsProc: procedure (const points: TPointsArray) of object; + + constructor Create(cp: TControlPoint); + destructor Destroy; override; + + procedure Execute; override; + + end; + +implementation + +//uses SysUtils, FormRender; + +/////////////////////////////////////////////////////////////////////////////// +constructor TBucketFillerThread.Create(cp: TControlPoint); +begin + inherited Create(True); + //Self.FreeOnTerminate := True; + + Fcp := cp.Clone; + + SetLength(Points, SUB_BATCH_SIZE); + + fcp.Prepare; +end; + +/////////////////////////////////////////////////////////////////////////////// +destructor TBucketFillerThread.Destroy; +begin + FCP.Free; + + inherited; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TBucketFillerThread.Execute; +var + bc: integer; +begin + inherited; + //RenderForm.Output.Lines.Add(' . . . > Filler thread #' + IntToStr(ThreadID) + ' Started'); + + bc := 0; + while (not Terminated) and (bc < Nrbatches) do begin + fcp.iterateXYC(SUB_BATCH_SIZE, points); + + try + EnterCriticalSection(CriticalSection); + + AddPointsProc(Points); + + Inc(batchcounter^); + bc := batchcounter^ + finally + LeaveCriticalSection(CriticalSection); + end; + end; + //RenderForm.Output.Lines.Add(' . . . > Filler thread #' + IntToStr(ThreadID) + ' Finished'); +end; + +/////////////////////////////////////////////////////////////////////////////// + +{ -- RENDER THREAD MUST *NOT* KNOW ANYTHING ABOUT BUCKETS!!! -- } + +end. diff --git a/Rendering/ImageMaker.pas b/Rendering/ImageMaker.pas new file mode 100644 index 0000000..edd0285 --- /dev/null +++ b/Rendering/ImageMaker.pas @@ -0,0 +1,860 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit ImageMaker; + +interface + +uses + Windows, Graphics, ControlPoint, RenderingCommon, PngImage, Bezier; + +type TPalette = record + logpal : TLogPalette; + colors: array[0..255] of TPaletteEntry; + end; + +type + TImageMaker = class + private + FOversample: Integer; + FFilterSize: Integer; + FFilter: array of array of double; + FParameters : String; + + FBitmap: TBitmap; + FAlphaBitmap: TBitmap; + AlphaPalette: TPalette; + FTransparentImage: TBitmap; + + comp_max_radius, comp_min_radius : double; + num_de_filters_d, num_de_filters : double; + de_max_ind, de_count_limit : double; + de_cutoff_val : double; + de_row_size, de_half_size, de_kernel_index : double; + de_filter_coefs, de_filter_widths : array of double; + + FCP: TControlPoint; + + FBucketHeight: integer; + FBucketWidth: integer; + FBuckets: TBucketArray; + FOnProgress: TOnProgress; + FGetBucket: function(x, y: integer): TBucket of object; + FCommentStr: string; // AV: for xml-params embedding + function GetBucket(x, y: integer): TBucket; + function SafeGetBucket(x, y: integer): TBucket; + + procedure CreateFilter; + procedure InitDE; + procedure NormalizeFilter; + + public + constructor Create; + destructor Destroy; override; + + function GetImage: TBitmap; + procedure GetImageAndDelete(target:tBitmap); + function GetTransparentImage: TPNGObject; + + procedure SetCP(CP: TControlPoint); + procedure Init; + procedure SetBucketData(const Buckets: pointer; BucketWidth, BucketHeight: integer; bits: integer); + + function GetFilterSize: Integer; + + procedure CreateImage(YOffset: integer = 0); + procedure SaveImage(FileName: String); + + procedure GetBucketStats(var Stats: TBucketStats); + function EmbedText(CommentStr: String): boolean; //AV + + property OnProgress: TOnProgress +// read FOnProgress + write FOnProgress; + end; + +implementation + +uses + Math, SysUtils, JPEG, Global, Types; + +{ TImageMaker } + +type + TRGB = packed Record + blue: byte; + green: byte; + red: byte; + end; + + PByteArray = ^TByteArray; + TByteArray = array[0..0] of byte; +// PLongintArray = ^TLongintArray; +// TLongintArray = array[0..0] of Longint; + PRGBArray = ^TRGBArray; + TRGBArray = array[0..0] of TRGB; + +/////////////////////////////////////////////////////////////////////////////// +constructor TImageMaker.Create; +var + i: integer; +begin + AlphaPalette.logpal.palVersion := $300; + AlphaPalette.logpal.palNumEntries := 256; + for i := 0 to 255 do + with AlphaPalette.logpal.palPalEntry[i] do begin + peRed := i; + peGreen := i; + peBlue := i; + end; + FCommentStr := ''; // AV +end; + +/////////////////////////////////////////////////////////////////////////////// +destructor TImageMaker.Destroy; +begin + if assigned(FBitmap) then + FBitmap.Free; + + if assigned(FAlphaBitmap) then + FAlphaBitmap.Free; + + if assigned(FTransparentImage) then + FTransparentImage.Free; + + inherited; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TImageMaker.CreateFilter; +var + i, j: integer; + fw: integer; + adjust: double; + ii, jj: double; +begin + + FOversample := fcp.spatial_oversample; + fw := Trunc(2.0 * FILTER_CUTOFF * FOversample * fcp.spatial_filter_radius); + FFilterSize := fw + 1; + + // make sure it has same parity as oversample + if odd(FFilterSize + FOversample) then + inc(FFilterSize); + + if (fw > 0.0) then + adjust := (1.0 * FILTER_CUTOFF * FFilterSize) / fw + else + adjust := 1.0; + + setLength(FFilter, FFilterSize, FFilterSize); + if fcp.enable_de and false then InitDE; + + for i := 0 to FFilterSize - 1 do begin + for j := 0 to FFilterSize - 1 do begin + ii := ((2.0 * i + 1.0)/ FFilterSize - 1.0) * adjust; + jj := ((2.0 * j + 1.0)/ FFilterSize - 1.0) * adjust; + + FFilter[i, j] := exp(-2.0 * (ii * ii + jj * jj)); + end; + end; + + Normalizefilter; +end; + +procedure TImageMaker.InitDE; +var + e, em, ec : double; + filtloop : integer; + + de_filt_sum, de_filt_d, de_filt_h : double; + adjloop, sfx : double; + dej,dek, filter_coef_idx : integer; + sl : integer; +begin + de_filt_sum := 0; + + if (fcp.estimator < 0.0) then + e := 0 + else + e := fcp.estimator; + + if (fcp.estimator_min < 0.0) then + em := 0 + else + em := fcp.estimator_min; + + if (fcp.estimator_curve < 0.0) then + ec := 0 + else + ec := fcp.estimator_curve; + + if (e <= 0) then exit; + + comp_max_radius := e*Foversample + 1; + comp_min_radius := em*Foversample + 1; + + num_de_filters_d := power(comp_max_radius/comp_min_radius, (1.0/ec)); + num_de_filters := ceil(num_de_filters_d); + + if (num_de_filters>100) then begin + de_max_ind := ceil(100 + power(num_de_filters - 100, ec)) + 1; + de_count_limit := power(de_max_ind - 100, 1.0/ec) + 100; + end else begin + de_max_ind := num_de_filters; + de_count_limit := de_max_ind; + end; + + de_row_size := 2*ceil(comp_max_radius)-1; + de_half_size := (de_row_size-1)/2; + de_kernel_index := (de_half_size+1)*(2+de_half_size)/2; + + sl := Trunc(de_max_ind * de_kernel_index); + //assert(sl >= 0); + if (sl < 0) then sl := 0; + setLength(de_filter_coefs, sl); + + sl := Trunc(de_max_ind); + //assert(sl >= 0); + if (sl < 0) then sl := 0; + setLength(de_filter_widths, sl); + + de_cutoff_val := 0; + for filtloop := 0 to trunc(de_max_ind)-1 do begin + if (filtloop < 100) then + de_filt_h := (comp_max_radius / power(filtloop+1, ec)) + else begin + adjloop := power(filtloop - 100, (1/ec))+100; + de_filt_h := (comp_max_radius / power(adjloop+1, ec)) + end; + + if (de_filt_h <= comp_min_radius) then begin + de_filt_h := comp_min_radius; + de_cutoff_val := filtloop; + end; + + de_filter_widths[filtloop] := de_filt_h; + + for dej := -trunc(de_half_size) to trunc(de_half_size) do + for dek := -trunc(de_half_size) to trunc(de_half_size) do begin + de_filt_d := sqrt(dej * dej + dek * dek) / de_filt_h; + if (de_filt_d <= 1.0) then begin + sfx := 1.8 * de_filt_d; + de_filt_sum := de_filt_sum + (exp(-2.0*sfx*sfx)*0.7978845608); + end; // -X- ^^^ sqrt(2/PI) + end; + + filter_coef_idx := filtloop * trunc(de_kernel_index); + + for dej := 0 to trunc(de_half_size) do + for dek := 0 to dej-1 do begin + de_filt_d := sqrt(dej * dej + dek * dek) / de_filt_h; + if (de_filt_d>1.0) then begin + // -X- TODO fix... + if (filter_coef_idx >= 0) and (filter_coef_idx < Trunc(de_max_ind * de_kernel_index)) then + de_filter_coefs[filter_coef_idx] := 0 + end else begin + sfx := 1.8 * de_filt_d; + if (filter_coef_idx >= 0) and (filter_coef_idx < Trunc(de_max_ind * de_kernel_index)) then + de_filter_coefs[filter_coef_idx] := (exp(-2.0*sfx*sfx)*0.7978845608) / de_filt_sum; + end; + Inc(filter_coef_idx); + end; + + if (de_cutoff_val > 0) then break; + end; + + if (de_cutoff_val=0) then + de_cutoff_val := num_de_filters-1; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TImageMaker.NormalizeFilter; +var + i, j: integer; + t: double; +begin + t := 0; + for i := 0 to FFilterSize - 1 do + for j := 0 to FFilterSize - 1 do + t := t + FFilter[i, j]; + + for i := 0 to FFilterSize - 1 do + for j := 0 to FFilterSize - 1 do + FFilter[i, j] := FFilter[i, j] / t; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TImageMaker.GetFilterSize: Integer; +begin + Result := FFiltersize; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TImageMaker.GetImage: TBitmap; +begin +// if ShowTransparency then +// Result := GetTransparentImage +// else + Result := FBitmap; +end; + +procedure TImageMaker.GetImageAndDelete(target:tBitmap); +begin + assert(false); + //target.Assign(FBitmap); + //FBitmap.Free; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TImageMaker.Init; +begin + if not Assigned(FBitmap) then + FBitmap := TBitmap.Create; + + FBitmap.PixelFormat := pf24bit; + + FBitmap.Width := Fcp.Width; + FBitmap.Height := Fcp.Height; + + if not Assigned(FAlphaBitmap) then + FAlphaBitmap := TBitmap.Create; + + FAlphaBitmap.PixelFormat := pf8bit; + FAlphaBitmap.Width := Fcp.Width; + FAlphaBitmap.Height := Fcp.Height; + + CreateFilter; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TImageMaker.SetBucketData(const Buckets: pointer; BucketWidth, BucketHeight: integer; bits: integer); +begin + FBuckets := TBucketArray(Buckets); + + FBucketWidth := BucketWidth; + FBucketHeight := BucketHeight; + + FGetBucket := GetBucket; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TImageMaker.SetCP(CP: TControlPoint); +begin + Fcp := CP; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TImageMaker.CreateImage(YOffset: integer); +var + gamma: double; + i, j: integer; + alpha: double; + ri, gi, bi: Integer; + ai, ia: integer; + bgtot, zero_BG: TRGB; + ls: double; + ii, jj: integer; + fp: array[0..3] of double; + Row: PRGBArray; + AlphaRow: PbyteArray; + vib, notvib: Integer; + bgi: array[0..2] of Integer; +// bucketpos: Integer; + filterValue: double; +// filterpos: Integer; + lsa: array[0..1024] of double; + csa: array[0..3] of array[0..256] of double; + sample_density: extended; + gutter_width: integer; + k1, k2: double; + area: double; + frac, funcval: double; + f_select : double; + f_select_int, f_coef_idx : integer; + arr_filt_width : integer; + c : array of double; + ss : integer; + scf:boolean; + scfact : double; + acc : integer; + avg, fac: double; + curvesSet: boolean; + + GetBucket: function(x, y: integer): TBucket of object; + bucket: TBucket; + bx, by: integer; + label zero_alpha; +begin + SetLength(c, 4); + + if fcp.gamma = 0 then + gamma := fcp.gamma + else + gamma := 1 / fcp.gamma; + vib := round(fcp.vibrancy * 256.0); + notvib := 256 - vib; + + if fcp.gamma_threshold <> 0 then + funcval := power(fcp.gamma_threshold, gamma - 1) { / fcp.gamma_threshold; } + else funcval := 0; + + bgi[0] := round(fcp.background[0]); + bgi[1] := round(fcp.background[1]); + bgi[2] := round(fcp.background[2]); + bgtot.red := bgi[0]; + bgtot.green := bgi[1]; + bgtot.blue := bgi[2]; + zero_BG.red := 0; + zero_BG.green := 0; + zero_BG.blue := 0; + + curvesSet := true; + for i := 0 to 3 do + curvesSet := curvesSet and ( + ((fcp.curvePoints[i][0].x = 0) and (fcp.curvePoints[i][0].y = 0)) and + ((fcp.curvePoints[i][1].x = 0) and (fcp.curvePoints[i][1].y = 0)) and + ((fcp.curvePoints[i][2].x = 1) and (fcp.curvePoints[i][2].y = 1)) and + ((fcp.curvePoints[i][3].x = 1) and (fcp.curvePoints[i][3].y = 1)) + ); + curvesSet := not curvesSet; + + gutter_width := FBucketwidth - FOversample * fcp.Width; +// gutter_width := 2 * ((25 - Foversample) div 2); + if(FFilterSize <= gutter_width div 2) then // filter too big when 'post-processing' ? + GetBucket := FGetBucket + else + GetBucket := SafeGetBucket; + + FBitmap.PixelFormat := pf24bit; + + sample_density := fcp.actual_density * sqr( power(2, fcp.zoom) ); + if sample_density = 0 then sample_density := 0.001; + k1 := (fcp.Contrast * BRIGHT_ADJUST * fcp.brightness * 268 * PREFILTER_WHITE) / 256.0; + area := FBitmap.Width * FBitmap.Height / (fcp.ppux * fcp.ppuy); + k2 := (FOversample * FOversample) / (fcp.Contrast * area * fcp.White_level * sample_density); + + csa[0][0] := 0; csa[1][0] := 0; csa[2][0] := 0; csa[3][0] := 0; + for i := 0 to 1024 do begin + if i = 0 then lsa[0] := 0 + else lsa[i] := (k1 * log10(1 + fcp.White_level * i * k2)) / (fcp.White_level * i); + + if i <= 256 then begin + csa[0][i] := BezierFunc(i / 256.0, fcp.curvePoints[0], fcp.curveWeights[0]) * 256; + csa[1][i] := BezierFunc(i / 256.0, fcp.curvePoints[1], fcp.curveWeights[1]) * 256; + csa[2][i] := BezierFunc(i / 256.0, fcp.curvePoints[2], fcp.curveWeights[2]) * 256; + csa[3][i] := BezierFunc(i / 256.0, fcp.curvePoints[3], fcp.curveWeights[3]) * 256; + end; + end; + + ls := 0; + ai := 0; + + ss := Trunc(floor(FOversample / 2)); + scf := (trunc(FOversample) mod 2 = 0); + scfact := power(FOversample/(FOversample+1), 2); + + //bucketpos := 0; + by := 0; + for i := 0 to fcp.Height - 1 do begin + bx := 0; + + if (i and $3f = 0) and assigned(FOnProgress) then FOnProgress(i / fcp.Height); + + AlphaRow := PByteArray(FAlphaBitmap.scanline[YOffset + i]); + Row := PRGBArray(FBitmap.scanline[YOffset + i]); + for j := 0 to fcp.Width - 1 do begin + if FFilterSize > 1 then begin + fp[0] := 0; + fp[1] := 0; + fp[2] := 0; + fp[3] := 0; + + for ii := 0 to FFilterSize - 1 do begin + for jj := 0 to FFilterSize - 1 do begin + filterValue := FFilter[ii, jj]; + + bucket := GetBucket(bx + jj, by + ii); + if bucket.count < 1024 then + ls := lsa[Round(bucket.Count)] + else + ls := (k1 * log10(1 + fcp.White_level * bucket.count * k2)) / (fcp.White_level * bucket.count); + + fp[0] := fp[0] + filterValue * ls * bucket.Red; + fp[1] := fp[1] + filterValue * ls * bucket.Green; + fp[2] := fp[2] + filterValue * ls * bucket.Blue; + fp[3] := fp[3] + filterValue * ls * bucket.Count; + end; + end; + + fp[0] := fp[0] / PREFILTER_WHITE; + fp[1] := fp[1] / PREFILTER_WHITE; + fp[2] := fp[2] / PREFILTER_WHITE; + fp[3] := fcp.white_level * fp[3] / PREFILTER_WHITE; + end else begin + bucket := GetBucket(bx, by); + if bucket.count < 1024 then + ls := lsa[Round(bucket.count)] / PREFILTER_WHITE + else + ls := (k1 * log10(1 + fcp.White_level * bucket.count * k2)) / (fcp.White_level * bucket.count) / PREFILTER_WHITE; + + fp[0] := ls * bucket.Red; + fp[1] := ls * bucket.Green; + fp[2] := ls * bucket.Blue; + fp[3] := ls * bucket.Count * fcp.white_level; + end; + + if (num_de_filters > 0) and (fp[3] > 0) then begin + f_select := 0; + for ii := -ss to trunc(ss) + 1 do + for jj := -ss to trunc(ss) + 1 do begin + bucket := SafeGetBucket(bx + jj, by + ii); + f_select := f_select + (bucket.Count / 255.0); + end; + if (scf) then f_select := f_select * scfact; + + if (f_select > de_count_limit) then + f_select_int := trunc(de_cutoff_val) + else if (f_select <= 100) then + f_select_int := trunc(ceil(f_select)) - 1 + else + f_select_int := 100 + trunc(floor(power(f_select - 100, fcp.estimator_curve))); + + if (f_select_int >= de_cutoff_val) then + f_select_int := trunc(de_cutoff_val); + + f_coef_idx := trunc(f_select_int*de_kernel_index); + if (f_select_int >= 0) and (f_select_int < length(de_filter_widths)) then + arr_filt_width := trunc(floor(de_filter_widths[length(de_filter_widths) - 1 - f_select_int])) + else + arr_filt_width := 1; + + fp[0] := 0; + fp[1] := 0; + fp[2] := 0; + fp[3] := 0; + acc := 1; + + for jj := 0 to arr_filt_width do + for ii := 0 to arr_filt_width do begin + bucket := SafeGetBucket(bx+ii, by+jj); + + if (f_coef_idx < 0) or (f_coef_idx >= length(de_filter_coefs)) then continue; + if (de_filter_coefs[f_coef_idx]= 0) then begin + Inc(f_coef_idx); + continue; + end; + + if bucket.count < 1024 then + ls := lsa[Round(bucket.Count)] + else if bucket.count = 0 then + ls := 0 + else + ls := (k1 * log10(1 + fcp.White_level * bucket.count * k2)) / (fcp.White_level * bucket.count); + + fp[0] := fp[0] + bucket.Red * ls * de_filter_coefs[f_coef_idx]; + fp[1] := fp[1] + bucket.Green * ls * de_filter_coefs[f_coef_idx]; + fp[2] := fp[2] + bucket.Blue * ls * de_filter_coefs[f_coef_idx]; + fp[3] := fp[3] + bucket.Count * ls * de_filter_coefs[f_coef_idx]; + + Inc(acc); + Inc(f_coef_idx); + end; + + fp[0] := fp[0] * acc / PREFILTER_WHITE; + fp[1] := fp[1] * acc / PREFILTER_WHITE; + fp[2] := fp[2] * acc / PREFILTER_WHITE; + fp[3] := fcp.white_level * acc * fp[3] / PREFILTER_WHITE; + end; + + Inc(bx, FOversample); + + if fcp.Transparency then begin // -------------------------- Transparency + // gamma linearization + if (fp[3] > 0.0) then begin + if fp[3] <= fcp.gamma_threshold then begin + frac := fp[3] / fcp.gamma_threshold; + alpha := (1 - frac) * fp[3] * funcval + frac * power(fp[3], gamma); + end + else + alpha := power(fp[3], gamma); + + ls := vib * alpha / fp[3]; + ai := round(alpha * 256); + if (ai <= 0) then goto zero_alpha // ignore all if alpha = 0 + else if (ai > 255) then ai := 255; + //ia := 255 - ai; + end + else begin +zero_alpha: + Row[j] := zero_BG; + AlphaRow[j] := 0; + continue; + end; + + if (notvib > 0) then begin + ri := Round(ls * fp[0] + notvib * power(fp[0], gamma)); + gi := Round(ls * fp[1] + notvib * power(fp[1], gamma)); + bi := Round(ls * fp[2] + notvib * power(fp[2], gamma)); + end + else begin + ri := Round(ls * fp[0]); + gi := Round(ls * fp[1]); + bi := Round(ls * fp[2]); + end; + + // ignoring BG color in transparent renders.. + if (ri >= 0) and (ri <= 256) and (curvesSet) then ri := Round(csa[1][Round(csa[0][ri])]); + if (gi >= 0) and (gi <= 256) and (curvesSet) then gi := Round(csa[2][Round(csa[0][gi])]); + if (bi >= 0) and (bi <= 256) and (curvesSet) then bi := Round(csa[3][Round(csa[0][bi])]); + + ri := (ri * 255) div ai; // ai > 0 ! + if (ri < 0) then ri := 0 + else if (ri > 255) then ri := 255; + + gi := (gi * 255) div ai; + if (gi < 0) then gi := 0 + else if (gi > 255) then gi := 255; + + bi := (bi * 255) div ai; + if (bi < 0) then bi := 0 + else if (bi > 255) then bi := 255; + + Row[j].red := ri; + Row[j].green := gi; + Row[j].blue := bi; + AlphaRow[j] := ai; + end + else begin // ------------------------------------------- No transparency + if (fp[3] > 0.0) then begin + // gamma linearization + if fp[3] <= fcp.gamma_threshold then begin + frac := fp[3] / fcp.gamma_threshold; + alpha := (1 - frac) * fp[3] * funcval + frac * power(fp[3], gamma); + end + else + alpha := power(fp[3], gamma); + + ls := vib * alpha / fp[3]; + ai := round(alpha * 256); + if (ai < 0) then ai := 0 + else if (ai > 255) then ai := 255; + ia := 255 - ai; + end + else begin + // no intensity so simply set the BG; + Row[j] := bgtot; + continue; + end; + + if (notvib > 0) then begin + ri := Round(ls * fp[0] + notvib * power(fp[0], gamma)); + gi := Round(ls * fp[1] + notvib * power(fp[1], gamma)); + bi := Round(ls * fp[2] + notvib * power(fp[2], gamma)); + end + else begin + ri := Round(ls * fp[0]); + gi := Round(ls * fp[1]); + bi := Round(ls * fp[2]); + end; + + if (ri >= 0) and (ri <= 256) and (curvesSet) then ri := Round(csa[1][Round(csa[0][ri])]); + if (gi >= 0) and (gi <= 256) and (curvesSet) then gi := Round(csa[2][Round(csa[0][gi])]); + if (bi >= 0) and (bi <= 256) and (curvesSet) then bi := Round(csa[3][Round(csa[0][bi])]); + + ri := ri + (ia * bgi[0]) shr 8; + if (ri < 0) then ri := 0 + else if (ri > 255) then ri := 255; + + gi := gi + (ia * bgi[1]) shr 8; + if (gi < 0) then gi := 0 + else if (gi > 255) then gi := 255; + + bi := bi + (ia * bgi[2]) shr 8; + if (bi < 0) then bi := 0 + else if (bi > 255) then bi := 255; + + Row[j].red := ri; + Row[j].green := gi; + Row[j].blue := bi; + AlphaRow[j] := ai;//? + end + end; + + //Inc(bucketpos, gutter_width); + //Inc(bucketpos, (FOversample - 1) * FBucketWidth); + Inc(by, FOversample); + end; + + FBitmap.PixelFormat := pf24bit; + + if assigned(FOnProgress) then FOnProgress(1); +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TImageMaker.SaveImage(FileName: String); +var + i,row: integer; + PngObject: TPngObject; + rowbm, rowpng: PByteArray; + JPEGImage: TJPEGImage; + PNGerror: boolean; + label BMPhack; +begin + if UpperCase(ExtractFileExt(FileName)) = '.PNG' then begin + pngError := false; + + PngObject := TPngObject.Create; + try + PngObject.Assign(FBitmap); + if fcp.Transparency then // PNGTransparency <> 0 + begin + PngObject.CreateAlpha; + for i:= 0 to FAlphaBitmap.Height - 1 do begin + rowbm := PByteArray(FAlphaBitmap.scanline[i]); + rowpng := PByteArray(PngObject.AlphaScanline[i]); + for row := 0 to FAlphaBitmap.Width -1 do begin + rowpng[row] := rowbm[row]; + end; + end; + end; + //else Exception.CreateFmt('Unexpected value of PNGTransparency [%d]', [PNGTransparency]) + if FCommentStr <> '' then + PngObject.AddtEXt('ApoFlame', AnsiString(FCommentStr)); // AV + + PngObject.SaveToFile(FileName); + except + pngError := true; + end; + PngObject.Free; + + if pngError then begin + FileName := ChangeFileExt(FileName, '.bmp'); + goto BMPHack; + end; + + end else if UpperCase(ExtractFileExt(FileName)) = '.JPG' then begin + JPEGImage := TJPEGImage.Create; + JPEGImage.Assign(FBitmap); + JPEGImage.CompressionQuality := JPEGQuality; + JPEGImage.SaveToFile(FileName); + JPEGImage.Free; + +// with TLinearBitmap.Create do +// try +// Assign(Renderer.GetImage); +// JPEGLoader.Default.Quality := JPEGQuality; +// SaveToFile(RenderForm.FileName); +// finally +// Free; +// end; + end else begin // bitmap +BMPHack: + FBitmap.SaveToFile(FileName); + if fcp.Transparency then begin + FAlphaBitmap.Palette := CreatePalette(AlphaPalette.logpal); + FileName := ChangeFileExt(FileName, '_alpha.bmp'); + FAlphaBitmap.SaveToFile(FileName); + end; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TImageMaker.EmbedText(CommentStr: String): boolean; //AV +begin + FCommentStr := CommentStr; + Result := false; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TImageMaker.GetTransparentImage: TPngObject; +var + x, y: integer; + i, row: integer; + rowbm, rowpng: PByteArray; +begin + Result := TPngObject.Create; + Result.Assign(FBitmap); + + if ((fcp <> nil) and fcp.Transparency) then begin + Result.CreateAlpha; + for i:= 0 to FAlphaBitmap.Height - 1 do begin + rowbm := PByteArray(FAlphaBitmap.scanline[i]); + rowpng := PByteArray(Result.AlphaScanline[i]); + for row := 0 to FAlphaBitmap.Width - 1 do begin + rowpng[row] := rowbm[row]; + end; + end; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// + +function TImageMaker.GetBucket(x, y: integer): TBucket; +begin + with FBuckets[y][x] do begin + Result.Red := Red; + Result.Green := Green; + Result.Blue := Blue; + Result.Count := Count; + end; +end; + +function TImageMaker.SafeGetBucket(x, y: integer): TBucket; +begin + if x < 0 then x := 0 + else if x >= FBucketWidth then x := FBucketWidth-1; + if y < 0 then y := 0 + else if y >= FBucketHeight then y := FBucketHeight-1; + Result := FGetBucket(x, y); +end; + +/////////////////////////////////////////////////////////////////////////////// + +procedure TImageMaker.GetBucketStats(var Stats: TBucketStats); +var + bucketpos: integer; + x, y: integer; + b: TBucket; +begin + with Stats do begin + MaxR := 0; + MaxG := 0; + MaxB := 0; + MaxA := 0; + TotalA := 0; + + for y := 0 to FBucketHeight - 1 do + for x := 0 to FBucketWidth - 1 do begin + b := FGetBucket(x, y); + MaxR := max(MaxR, b.Red); + MaxG := max(MaxG, b.Green); + MaxB := max(MaxB, b.Blue); + MaxA := max(MaxA, b.Count); + TotalA := TotalA + b.Count + end; + end; +end; + +end. diff --git a/Rendering/RenderThread.pas b/Rendering/RenderThread.pas new file mode 100644 index 0000000..8d5871c --- /dev/null +++ b/Rendering/RenderThread.pas @@ -0,0 +1,386 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} +unit RenderThread; + +interface + +uses + Classes, Windows, Messages, Graphics, + ControlPoint, RenderingInterface, + Global, RenderingCommon, PngImage, + RenderingImplementation; + + //Disabled: + + //Render64, Render64MT, + //Render48, Render48MT, + //Render32f, Render32fMT; + +const + WM_THREAD_COMPLETE = WM_APP + 5437; + WM_THREAD_TERMINATE = WM_APP + 5438; + +type + TRenderThread = class(TThread) + private + FRenderer: TBaseRenderer; + + FOnProgress: TOnProgress; + FCP: TControlPoint; + FMaxMem: int64; + FNrThreads: Integer; + FBitsPerSample: integer; + FMinDensity: double; + FOutput: TStrings; + FExportBuffer: boolean; + FCommentStr: String; // AV + + procedure CreateRenderer; + function GetNrSlices: integer; + function GetSlice: integer; + procedure SetBitsPerSample(const bits: Integer); + + function GetExportBuffer: boolean; + procedure SetExportBuffer(value: boolean); + + procedure Trace(const str: string); + + public + TargetHandle: HWND; + WaitForMore, More: boolean; + + constructor Create; + destructor Destroy; override; + + procedure SetCP(CP: TControlPoint); + function GetImage: TBitmap; + function GetTransparentImage: TPngObject; + procedure SaveImage(const FileName: String); + + procedure Execute; override; + function GetRenderer: TBaseRenderer; + + procedure Terminate; + procedure Suspend; + procedure Resume; + procedure BreakRender; + procedure HibernateRender(filePath: string); + procedure ResumeFromHibernation(filePath: string); + function EmbedText(CommentStr: String): boolean; //AV + function DoSnapshot: boolean; // AV: to make mid-render snapshots + +// procedure GetBucketStats(var Stats: TBucketStats); + procedure ShowBigStats; + procedure ShowSmallStats; + + property OnProgress: TOnProgress +// read FOnProgress + write FOnProgress; + + property Slice: integer + read GetSlice; + property NrSlices: integer + read GetNrSlices; + property MaxMem: int64 + read FMaxMem + write FMaxMem; +// property compatibility: Integer read Fcompatibility write Fcompatibility; + property NrThreads: Integer + read FNrThreads + write FNrThreads; + property BitsPerSample: Integer + read FBitsPerSample + write SetBitsPerSample; + property Output: TStrings + write FOutput; + property MinDensity: double + write FMinDensity; + property ExportBuffer: boolean + read GetExportBuffer + write SetExportBuffer; + end; + +implementation + +uses + Math, SysUtils,Tracer; +{ TRenderThread } + +/////////////////////////////////////////////////////////////////////////////// +destructor TRenderThread.Destroy; +begin + if assigned(FRenderer) then + FRenderer.Free; + FRenderer := nil; + + if assigned(FCP) then FCP.Free; + + inherited; +end; + +function TRenderThread.DoSnapshot: boolean; // AV +begin + Result := false; + if assigned(FRenderer) then + Result := FRenderer.DoSnapshot; +end; + +function TRenderThread.GetExportBuffer: boolean; +begin + if assigned(FRenderer) then + Result := FRenderer.ExportBuffer + else Result := FExportBuffer; +end; + +procedure TRenderThread.SetExportBuffer(value: boolean); +begin + if assigned(FRenderer) then + FRenderer.ExportBuffer := value; + FExportBuffer := value; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TRenderThread.GetImage: TBitmap; +begin + Result := nil; + if assigned(FRenderer) then + Result := FRenderer.GetImage; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TRenderThread.GetTransparentImage: TPngObject; +begin + Result := nil; + if assigned(FRenderer) then + Result := FRenderer.GetTransparentImage; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TRenderThread.SetCP(CP: TControlPoint); +begin + + FCP := CP.Clone; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TRenderThread.Create; +begin + MaxMem := 0; + // BitsPerSample := InternalBitsPerSample; // AV: now unused + FreeOnTerminate := false; + WaitForMore := false; + + inherited Create(True); // Create Suspended; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TRenderThread.CreateRenderer; +begin + if assigned(FRenderer) then begin + Trace('Destroying previous renderer (?)'); + FRenderer.Free; + end; + Trace('Creating renderer'); + + if NrThreads <= 1 then begin + if MaxMem = 0 then begin + FRenderer := TRenderWorkerST.Create; + end else begin + FRenderer := TRenderWorkerST_MM.Create; + FRenderer.MaxMem := MaxMem; + end; + end + else begin + if MaxMem = 0 then begin + FRenderer := TRenderWorkerMT.Create; + end else begin + FRenderer := TRenderWorkerMT_MM.Create; + FRenderer.MaxMem := MaxMem; + end; + FRenderer.NumThreads := NrThreads; + end; + + FRenderer.ExportBuffer := FExportbuffer; + FRenderer.SetCP(FCP); + FRenderer.MinDensity := FMinDensity; + FRenderer.OnProgress := FOnProgress; + FRenderer.Output := FOutput; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TRenderThread.Execute; +label RenderMore; +begin + CreateRenderer; + +RenderMore: + assert(assigned(FRenderer)); + + Trace('Rendering'); + FRenderer.Render; + + if Terminated or FRenderer.Failed then begin + Trace('Sending WM_THREAD_TERMINATE'); + PostMessage(TargetHandle, WM_THREAD_TERMINATE, 0, ThreadID); + Trace('Terminated'); + exit; + end + else begin + Trace('Sending WM_THREAD_COMPLETE'); + PostMessage(TargetHandle, WM_THREAD_COMPLETE, 0, ThreadID); + end; + + if WaitForMore and (FRenderer <> nil) then begin + FRenderer.RenderMore := true; + + Trace('Waiting for more'); + inherited Suspend; + + if WaitForMore then goto RenderMore; + end; + + Trace('Finished'); +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TRenderThread.Terminate; +begin + try + if assigned(FRenderer) then + FRenderer.Stop; + except on EAccessViolation do + // nothing + end; + + WaitForMore := false; + + inherited Terminate; +end; + +procedure TRenderThread.Suspend; +begin + if assigned(FRenderer) then FRenderer.Pause; + + inherited; +end; + +procedure TRenderThread.Resume; +begin + if assigned(FRenderer) then FRenderer.UnPause; + + inherited; +end; + +procedure TRenderThread.BreakRender; +begin + if assigned(FRenderer) then + FRenderer.BreakRender; +end; + +procedure TRenderThread.HibernateRender(filePath: string); +begin + if assigned(FRenderer) then + FRenderer.Hibernate(filePath); +end; + +procedure TRenderThread.ResumeFromHibernation(filePath: string); +begin + if assigned(FRenderer) then + FRenderer.Stop; + FRenderer.Resume(filePath); + FRenderer.UnPause; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TRenderThread.GetNrSlices: integer; +begin + if assigned(FRenderer) then + Result := FRenderer.NrSlices + else + Result := 1; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TRenderThread.GetSlice: integer; +begin + if assigned(FRenderer) then + Result := FRenderer.Slice + else + Result := 1; +end; + +////////////////////////////////////////////////////////////////////////////// +function TRenderThread.GetRenderer: TBaseRenderer; +begin + Result := FRenderer; + FRenderer := nil; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TRenderThread.SetBitsPerSample(const bits: Integer); +begin + if FRenderer = nil then FBitsPerSample := bits + else assert(false); +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TRenderThread.SaveImage(const FileName: String); +begin + if assigned(FRenderer) then + begin + if FCommentStr <> '' then + FRenderer.EmbedText(FCommentStr); + FRenderer.SaveImage(FileName); + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TRenderThread.EmbedText(CommentStr: String): boolean; // AV: for parameters embedding +begin + Result := False; + FCommentStr := CommentStr; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TRenderThread.Trace(const str: string); +begin + if assigned(FOutput) and (TraceLevel >= 2) then + FOutput.Add('. . > RenderThread #' + IntToStr(ThreadID) + ': ' + str); +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TRenderThread.ShowBigStats; +begin + if assigned(FRenderer) then + FRenderer.ShowBigStats; +end; + +procedure TRenderThread.ShowSmallStats; +begin + if assigned(FRenderer) then + FRenderer.ShowSmallStats; +end; +/////////////////////////////////////////////////////////////////////////////// + +end. diff --git a/Rendering/RenderingCommon.pas b/Rendering/RenderingCommon.pas new file mode 100644 index 0000000..5522c03 --- /dev/null +++ b/Rendering/RenderingCommon.pas @@ -0,0 +1,71 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + ``Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} +unit RenderingCommon; + +interface +type + TOnFinish = procedure of object; + TOnProgress = procedure(prog: double) of object; + + {$ifdef Apo7X64} + TBucket = Record + Red, + Green, + Blue, + Count: Double; + end; + {$else} + TBucket = Record + Red, + Green, + Blue, + Count: Single; + end; + {$endif} + PBucket = ^TBucket; + TBucketArray = array of array of TBucket; + // TZBuffer = array of array of double; + + TBucketStats = record + MaxR, MaxG, MaxB, MaxA, + TotalA: double; + end; + +procedure TrimWorkingSet; + +implementation +uses Windows; + +procedure TrimWorkingSet; +var + hProcess: THandle; +begin + hProcess := OpenProcess(PROCESS_SET_QUOTA, false, GetCurrentProcessId); + + try SetProcessWorkingSetSize(hProcess, $FFFFFFFF, $FFFFFFFF); + finally CloseHandle(hProcess); + end; +end; + +end. diff --git a/Rendering/RenderingImplementation.pas b/Rendering/RenderingImplementation.pas new file mode 100644 index 0000000..65d7659 --- /dev/null +++ b/Rendering/RenderingImplementation.pas @@ -0,0 +1,792 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} +unit RenderingImplementation; + +{$ifdef Apo7X64} +{$else} + {$define _ASM_} +{$endif} + +interface + +uses +{$ifndef _ASM_} +{$else} +AsmRandom, +{$endif} + Windows, Classes, Forms, Graphics, Global, + RenderingInterface, Xform, Math, Translation, + Binary, RenderingCommon, ControlPoint, Sysutils, + BucketFillerThread; + +type + TBatchProc = procedure of object; + TRenderWorkerST = class(TBaseRenderer) + + protected + PropTable: array[0..PROP_TABLE_SIZE] of TXform; + finalXform: TXform; + UseFinalXform: boolean; + + procedure Prepare; override; + procedure SetPixels; override; + + protected + procedure IterateBatch; + procedure IterateBatchAngle; + procedure IterateBatchFX; + procedure IterateBatchAngleFX; +end; + +type + TRenderWorkerMT = class(TBaseRenderer) + + protected + batchcounter: Integer; + WorkingThreads: array of TBucketFillerThread; + CriticalSection: TRTLCriticalSection; + + function NewThread: TBucketFillerThread; + procedure Prepare; override; + procedure SetPixels; override; + + protected + procedure AddPointsToBuckets(const points: TPointsArray); + procedure AddPointsToBucketsAngle(const points: TPointsArray); + + public + procedure Stop; override; + procedure BreakRender; override; + + procedure Pause; override; + procedure UnPause; override; + procedure SetThreadPriority(p: TThreadPriority); override; // AV +end; + +type + TRenderWorkerST_MM = class(TRenderWorkerST) + protected + procedure CalcBufferSize; override; + public + procedure Render; override; + +end; + +type + TRenderWorkerMT_MM = class(TRenderWorkerMT) + protected + procedure CalcBufferSize; override; + public + procedure Render; override; +end; + +// ---------------------------------------------------------------------------- + +implementation + +//////////////////////////////////////////////////////////////////////////////// +// PREPARE +//////////////////////////////////////////////////////////////////////////////// +procedure TRenderWorkerST.Prepare; +var + i, n: Integer; + propsum: double; + LoopValue: double; + j: integer; + TotValue: double; +begin + totValue := 0; + n := fcp.NumXforms; + assert(n > 0); + + finalXform := fcp.xform[n]; + finalXform.Prepare; + useFinalXform := fcp.FinalXformEnabled and fcp.HasFinalXform; + + fcp.Prepare; +end; + +procedure TRenderWorkerMT.Prepare; +begin + fcp.Prepare; +end; + +//////////////////////////////////////////////////////////////////////////////// +// SETPIXELS +//////////////////////////////////////////////////////////////////////////////// +procedure TRenderWorkerST.SetPixels; +var + i: integer; + nsamples: int64; + IterateBatchProc: procedure of object; +begin + if FNumSlices > 1 then + TimeTrace(Format(TextByKey('common-trace-rendering-multipleslices'), [FSlice + 1, FNumSlices])) + else + TimeTrace(TextByKey('common-trace-rendering-oneslice')); + + Randomize; + + if FCP.FAngle = 0 then begin + if UseFinalXform then + IterateBatchProc := IterateBatchFX + else + IterateBatchProc := IterateBatch; + end + else begin + if UseFinalXform then + IterateBatchProc := IterateBatchAngleFX + else + IterateBatchProc := IterateBatchAngle; + end; + + NSamples := Round(sample_density * NrSlices * bucketSize / (oversample * oversample)); + FNumBatches := Round(nsamples / (fcp.nbatches * SUB_BATCH_SIZE)); + if FNumBatches = 0 then FNumBatches := 1; + + FMinBatches := Round(FNumBatches * FMinDensity / fcp.sample_density); + if FMinBatches = 0 then FMinBatches := 1; + + for i := 0 to FNumBatches-1 do + begin + if FStop <> 0 then begin + { AV: moved below to update running quality estimate for mid-render snapshots + fcp.actual_density := fcp.actual_density + fcp.sample_density * i / FNumBatches; + } + FNumBatches := i; + exit; + end; + + if ((i and $1F) = 0) then Progress(i / FNumBatches); + + IterateBatchProc; + // AV: update running quality estimate (for mid-render snapshots) + fcp.actual_density := fcp.actual_density + fcp.sample_density / FNumBatches; // AV + + Inc(FBatch); + end; + + fcp.actual_density := {fcp.actual_density +} fcp.sample_density; // AV + + Progress(1); +end; + +procedure TRenderWorkerMT.SetPixels; +var + i: integer; + nSamples: Int64; + bc : integer; +begin + if FNumSlices > 1 then + TimeTrace(Format(TextByKey('common-trace-rendering-multipleslices'), [FSlice + 1, FNumSlices])) + else + TimeTrace(TextByKey('common-trace-rendering-oneslice')); + + nSamples := Round(sample_density * NrSlices * BucketSize / (oversample * oversample)); + FNumBatches := Round(nSamples / (fcp.nbatches * SUB_BATCH_SIZE)); + if FNumBatches = 0 then FNumBatches := 1; + FMinBatches := Round(FNumBatches * FMinDensity / fcp.sample_density); + if FMinBatches = 0 then FMinBatches := 1; // AV + + batchcounter := 1; + Randomize; + + InitializeCriticalSection(CriticalSection); + + SetLength(WorkingThreads, NumThreads); + for i := 0 to NumThreads - 1 do + WorkingThreads[i] := NewThread; + + for i := 0 to NumThreads - 1 do + WorkingThreads[i].Resume; + + bc := 1; + while (FStop = 0) and (bc <= FNumBatches) do begin + sleep(250); + try + EnterCriticalSection(CriticalSection); + + Progress(batchcounter / FNumBatches); + if (bc < batchcounter) then + begin + // AV: update running quality estimate for mid-render snapshots + fcp.actual_density := fcp.actual_density + + fcp.sample_density * (BatchCounter - bc) / FNumBatches; // actual quality of incomplete render + bc := batchcounter; + end; + finally + LeaveCriticalSection(CriticalSection); + end; + end; + + for i := 0 to High(WorkingThreads) do begin + WorkingThreads[i].Terminate; + WorkingThreads[i].WaitFor; + WorkingThreads[i].Free; + end; + SetLength(WorkingThreads, 0); + + // AV: running quality estimate is updated above; tidy up remaining counts + fcp.actual_density := fcp.actual_density + + fcp.sample_density * (BatchCounter - bc + 1) / FNumBatches; // AV: actual quality of incomplete render + // fcp.sample_density * BatchCounter / FNumBatches; // actual quality of incomplete render + FNumBatches := BatchCounter; + + DeleteCriticalSection(CriticalSection); + Progress(1); +end; + +//////////////////////////////////////////////////////////////////////////////// +// MM OVERRIDES +//////////////////////////////////////////////////////////////////////////////// +procedure TRenderWorkerST_MM.CalcBufferSize; +begin + CalcBufferSizeMM; +end; + +procedure TRenderWorkerST_MM.Render; +begin + RenderMM; +end; + +procedure TRenderWorkerMT_MM.CalcBufferSize; +begin + CalcBufferSizeMM; +end; + +procedure TRenderWorkerMT_MM.Render; +begin + RenderMM; +end; + +//////////////////////////////////////////////////////////////////////////////// +// BATCH ITERATION +//////////////////////////////////////////////////////////////////////////////// +procedure TRenderWorkerST.IterateBatch; +var + i: integer; + px, py: double; + Bucket: PBucket; + // ZBufPos: PDouble; + MapColor: PColorMapColor; + + ix, iy: integer; + BmpColor: TColor; + + p, q: TCPPoint; + xf: TXForm; +begin +{$ifndef _ASM_} + p.x := 2 * random - 1; + p.y := 2 * random - 1; + // AV: fixed - Apo renderer crashes if z-value is not initialized + p.z := 0; // AV + p.c := random; +{$else} +asm + fld1 + call AsmRandExt + fadd st, st + fsub st, st(1) + fstp qword ptr [p.x] + call AsmRandExt + fadd st, st + fsubrp st(1), st + fstp qword ptr [p.y] + call AsmRandExt + fstp qword ptr [p.c] + fldz // AV + fstp qword ptr [p.z] // AV +end; +{$endif} + + try + xf := fcp.xform[0]; + for i := 0 to FUSE do begin + xf := xf.PropTable[Random(PROP_TABLE_SIZE)]; + xf.NextPoint(p); + end; + + for i := 0 to SUB_BATCH_SIZE-1 do begin + xf := xf.PropTable[Random(PROP_TABLE_SIZE)]; + xf.NextPoint(p); + + // if random >= xf.transOpacity then continue; + if (xf.transOpacity = 0) then continue // AV + else if ((xf.transOpacity < 1) and (random > xf.transOpacity)) then continue; + + q := p; + fcp.ProjectionFunc(@q); // 3d hack + + px := q.x - camX0; + if (px < 0) or (px > camW) then continue; + py := q.y - camY0; + if (py < 0) or (py > camH) then continue; + + Bucket := @buckets[Round(bhs * py)][Round(bws * px)]; + MapColor := @ColorMap[Round(p.c * 255)]; + + {$ifdef ENABLEZBUF} + ZBufPos := @zbuffer[Round(bhs * py)][Round(bws * px)]; + if (q.z < ZBufPos^) then + begin + ZBufPos^ := q.z; + Bucket.Red := Bucket.Red + MapColor.Red; + Bucket.Green := Bucket.Green + MapColor.Green; + Bucket.Blue := Bucket.Blue + MapColor.Blue; + Bucket.Count := Bucket.Count + 1; + end; + {$else} + with Bucket^ do begin + Red := Red + MapColor.Red; + Green := Green + MapColor.Green; + Blue := Blue + MapColor.Blue; + Count := Count + 1; + end; + {$endif} + end; + + except + on EMathError do begin + exit; + end; + end; +end; + +procedure TRenderWorkerST.IterateBatchAngle; +var + i: integer; + px, py: double; + Bucket: PBucket; + MapColor: PColorMapColor; +// ZBufPos: PDouble; + ix, iy: integer; + BmpColor: TColor; + + p, q: TCPPoint; + xf: TXForm; +begin +{$ifndef _ASM_} + p.x := 2 * random - 1; + p.y := 2 * random - 1; + p.z := 0; // AV: fixed - Apo renderer crashes if z-value is not initialized + p.c := random; +{$else} +asm + fld1 + call AsmRandExt + fadd st, st + fsub st, st(1) + fstp qword ptr [p.x] + call AsmRandExt + fadd st, st + fsubrp st(1), st + fstp qword ptr [p.y] + call AsmRandExt + fstp qword ptr [p.c] + fldz // AV + fstp qword ptr [p.z] // AV +end; +{$endif} + + try + xf := fcp.xform[0]; + for i := 0 to FUSE do begin + xf := xf.PropTable[Random(PROP_TABLE_SIZE)]; + xf.NextPoint(p); + end; + + for i := 0 to SUB_BATCH_SIZE-1 do begin + xf := xf.PropTable[Random(PROP_TABLE_SIZE)]; + xf.NextPoint(p); + + // if random >= xf.transOpacity then continue; + if (xf.transOpacity = 0) then continue // AV + else if ((xf.transOpacity < 1) and (random > xf.transOpacity)) then continue; + + q := p; + fcp.ProjectionFunc(@q); + + px := q.x * cosa + q.y * sina + rcX; + if (px < 0) or (px > camW) then continue; + py := q.y * cosa - q.x * sina + rcY; + if (py < 0) or (py > camH) then continue; + + Bucket := @buckets[Round(bhs * py)][Round(bws * px)]; + MapColor := @ColorMap[Round(p.c * 255)]; + + {$ifdef ENABLEZBUF} + ZBufPos := @zbuffer[Round(bhs * py)][Round(bws * px)]; + if (q.z < ZBufPos^) then + begin + ZBufPos^ := q.z; + Bucket.Red := Bucket.Red + MapColor.Red; + Bucket.Green := Bucket.Green + MapColor.Green; + Bucket.Blue := Bucket.Blue + MapColor.Blue; + Bucket.Count := Bucket.Count + 1; + end; + {$else} + with Bucket^ do begin + Red := Red + MapColor.Red; + Green := Green + MapColor.Green; + Blue := Blue + MapColor.Blue; + Count := Count + 1; + end; + {$endif} + end; + + except + on EMathError do begin + exit; + end; + end; +end; + +procedure TRenderWorkerST.IterateBatchFX; +var + i: integer; + px, py: double; + Bucket: PBucket; + MapColor: PColorMapColor; +// ZbufPos: PDouble; + ix, iy: integer; + BmpColor: TColor; + + p, q: TCPPoint; + xf: TXForm; +begin +{$ifndef _ASM_} + p.x := 2 * random - 1; + p.y := 2 * random - 1; + p.z := 0; // AV: fixed - Apo renderer crashes if z-value is not initialized + p.c := random; +{$else} +asm + fld1 + call AsmRandExt + fadd st, st + fsub st, st(1) + fstp qword ptr [p.x] + call AsmRandExt + fadd st, st + fsubrp st(1), st + fstp qword ptr [p.y] + call AsmRandExt + fstp qword ptr [p.c] + fldz // AV + fstp qword ptr [p.z] // AV +end; +{$endif} + + try + xf := fcp.xform[0]; + for i := 0 to FUSE do begin + xf := xf.PropTable[Random(PROP_TABLE_SIZE)]; + xf.NextPoint(p); + end; + + for i := 0 to SUB_BATCH_SIZE-1 do begin + xf := xf.PropTable[Random(PROP_TABLE_SIZE)]; + xf.NextPoint(p); + + if (xf.transOpacity = 0) then continue // AV + else if ((xf.transOpacity < 1) and (random > xf.transOpacity)) then continue; + + finalXform.NextPointTo(p, q); + fcp.ProjectionFunc(@q); + + px := q.x - camX0; + if (px < 0) or (px > camW) then continue; + py := q.y - camY0; + if (py < 0) or (py > camH) then continue; + + Bucket := @buckets[Round(bhs * py)][Round(bws * px)]; + MapColor := @ColorMap[Round(q.c * 255)]; + + {$ifdef ENABLEZBUF} + ZBufPos := @zbuffer[Round(bhs * py)][Round(bws * px)]; + if (q.z < ZBufPos^) then + begin + ZBufPos^ := q.z; + Bucket.Red := Bucket.Red + MapColor.Red; + Bucket.Green := Bucket.Green + MapColor.Green; + Bucket.Blue := Bucket.Blue + MapColor.Blue; + Bucket.Count := Bucket.Count + 1; + end; + {$else} + with Bucket^ do begin + Red := Red + MapColor.Red; + Green := Green + MapColor.Green; + Blue := Blue + MapColor.Blue; + Count := Count + 1; + end; + {$endif} + end; + + except + on EMathError do begin + exit; + end; + end; +end; + +procedure TRenderWorkerST.IterateBatchAngleFX; +var + i: integer; + px, py: double; + Bucket: PBucket; + MapColor: PColorMapColor; +// ZBufPos: PDouble; + ix, iy: integer; + BmpColor: TColor; + + p, q: TCPPoint; + xf: TXForm; +begin +{$ifndef _ASM_} + p.x := 2 * random - 1; + p.y := 2 * random - 1; + p.z := 0; // AV: fixed - Apo renderer crashes if z-value is not initialized + p.c := random; +{$else} +asm + fld1 + call AsmRandExt + fadd st, st + fsub st, st(1) + fstp qword ptr [p.x] + call AsmRandExt + fadd st, st + fsubrp st(1), st + fstp qword ptr [p.y] + call AsmRandExt + fstp qword ptr [p.c] + fldz // AV + fstp qword ptr [p.z] // AV +end; +{$endif} + + try + xf := fcp.xform[0]; + for i := 0 to FUSE do begin + xf := xf.PropTable[Random(PROP_TABLE_SIZE)]; + xf.NextPoint(p); + end; + + for i := 0 to SUB_BATCH_SIZE-1 do begin + xf := xf.PropTable[Random(PROP_TABLE_SIZE)]; + xf.NextPoint(p); + + if (xf.transOpacity = 0) then continue // AV + else if ((xf.transOpacity < 1) and (random > xf.transOpacity)) then continue; + + finalXform.NextPointTo(p, q); + fcp.ProjectionFunc(@q); + + px := q.x * cosa + q.y * sina + rcX; + if (px < 0) or (px > camW) then continue; + py := q.y * cosa - q.x * sina + rcY; + if (py < 0) or (py > camH) then continue; + + Bucket := @buckets[Round(bhs * py)][Round(bws * px)]; + MapColor := @ColorMap[Round(q.c * 255)]; + + {$ifdef ENABLEZBUF} + ZBufPos := @zbuffer[Round(bhs * py)][Round(bws * px)]; + if (q.z < ZBufPos^) then + begin + ZBufPos^ := q.z; + Bucket.Red := Bucket.Red + MapColor.Red; + Bucket.Green := Bucket.Green + MapColor.Green; + Bucket.Blue := Bucket.Blue + MapColor.Blue; + Bucket.Count := Bucket.Count + 1; + end; + {$else} + with Bucket^ do begin + Red := Red + MapColor.Red; + Green := Green + MapColor.Green; + Blue := Blue + MapColor.Blue; + Count := Count + 1; + end; + {$endif} + end; + + except + on EMathError do begin + exit; + end; + end; +end; + +procedure TRenderWorkerMT.AddPointsToBuckets(const points: TPointsArray); +var + i: integer; + px, py: double; + Bucket: PBucket; + // ZBufPos: PDouble; + MapColor: PColorMapColor; +begin + for i := SUB_BATCH_SIZE - 1 downto 0 do begin + + px := points[i].x - camX0; + if (px < 0) or (px > camW) then continue; + py := points[i].y - camY0; + if (py < 0) or (py > camH) then continue; + + Bucket := @buckets[Round(bhs * py)][Round(bws * px)]; + MapColor := @ColorMap[Round(points[i].c * 255)]; + + {$ifdef ENABLEZBUF} + ZBufPos := @zbuffer[Round(bhs * py)][Round(bws * px)]; + if (points[i].z < ZBufPos^) then + begin + ZBufPos^ := points[i].z; + Bucket.Red := Bucket.Red + MapColor.Red; + Bucket.Green := Bucket.Green + MapColor.Green; + Bucket.Blue := Bucket.Blue + MapColor.Blue; + Bucket.Count := Bucket.Count + 1; + end; + {$else} + with Bucket^ do begin + Red := Red + MapColor.Red; + Green := Green + MapColor.Green; + Blue := Blue + MapColor.Blue; + Count := Count + 1; + end; + {$endif} + end; +end; + +procedure TRenderWorkerMT.AddPointsToBucketsAngle(const points: TPointsArray); +var + i: integer; + px, py: double; + Bucket: PBucket; + MapColor: PColorMapColor; + //ZBufPos: PDouble; +begin + for i := SUB_BATCH_SIZE - 1 downto 0 do begin + + px := points[i].x * cosa + points[i].y * sina + rcX; + if (px < 0) or (px > camW) then continue; + py := points[i].y * cosa - points[i].x * sina + rcY; + if (py < 0) or (py > camH) then continue; + + Bucket := @buckets[Round(bhs * py)][Round(bws * px)]; + MapColor := @ColorMap[Round(points[i].c * 255)]; + + {$ifdef ENABLEZBUF} + ZBufPos := @zbuffer[Round(bhs * py)][Round(bws * px)]; + if (points[i].z < ZBufPos^) then + begin + ZBufPos^ := points[i].z; + Bucket.Red := Bucket.Red + MapColor.Red; + Bucket.Green := Bucket.Green + MapColor.Green; + Bucket.Blue := Bucket.Blue + MapColor.Blue; + Bucket.Count := Bucket.Count + 1; + end; + {$else} + with Bucket^ do begin + Red := Red + MapColor.Red; + Green := Green + MapColor.Green; + Blue := Blue + MapColor.Blue; + Count := Count + 1; + end; + {$endif} + end; +end; + +//////////////////////////////////////////////////////////////////////////////// +// THREADING +//////////////////////////////////////////////////////////////////////////////// +procedure TRenderWorkerMT.Stop; +var + i: integer; +begin + for i := 0 to High(WorkingThreads) do + WorkingThreads[i].Terminate; + + inherited; +end; + +procedure TRenderWorkerMT.BreakRender; +var + i: integer; +begin + inherited; + + for i := 0 to High(WorkingThreads) do + WorkingThreads[i].Terminate; +end; + +procedure TRenderWorkerMT.Pause; +var + i: integer; +begin + inherited; + + for i := 0 to High(WorkingThreads) do + WorkingThreads[i].Suspend; +end; + +procedure TRenderWorkerMT.UnPause; +var + i: integer; +begin + inherited; + + for i := 0 to High(WorkingThreads) do + WorkingThreads[i].Resume; +end; + +procedure TRenderWorkerMT.SetThreadPriority(p: TThreadPriority); // AV +var + i: integer; +begin + inherited; + + for i := 0 to High(WorkingThreads) do + WorkingThreads[i].Priority := p; +end; + +function TRenderWorkerMT.NewThread: TBucketFillerThread; +begin + Result := TBucketFillerThread.Create(fcp); + assert(Result <> nil); + + if FThreadPriority <> tpNormal then // AV + Result.Priority := {tpLower;} FThreadPriority; + + if FCP.FAngle = 0 then + Result.AddPointsProc := self.AddPointsToBuckets + else + Result.AddPointsProc := self.AddPointsToBucketsAngle; + + Result.CriticalSection := CriticalSection; + Result.Nrbatches := FNumBatches; + Result.batchcounter := @batchcounter; +end; + +end. + diff --git a/Rendering/RenderingInterface.pas b/Rendering/RenderingInterface.pas new file mode 100644 index 0000000..1d06a5b --- /dev/null +++ b/Rendering/RenderingInterface.pas @@ -0,0 +1,1136 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} +unit RenderingInterface; + +interface + +uses + Windows, Graphics, Classes, RenderingCommon, + Controlpoint, ImageMaker, PngImage, Translation; + +/////////////////////////////////////////////////////////////////////////////// +// +// { TBaseRenderer } +// +/////////////////////////////////////////////////////////////////////////////// + +const + opRendering: integer = 0; + opSampling: integer = 1; + opHibernating: integer = 2; + +type + TOnOutput = procedure(s: string) of object; + TOnOperation = procedure(op: integer) of object; + TCopyBufferCallback = procedure(tgr: Pointer; x, y: integer) of object; + +type + TColorMapColor = Record + Red, + Green, + Blue: + + {$ifdef Apo7X64} + double + {$else} + single + {$endif}; + end; + PColorMapColor = ^TColorMapColor; + TColorMapArray = array[0..255] of TColorMapColor; + +{ TPoint3D = Record + X, + Y, + Z, + W: Double; + end; + TPoint3DArray = array of TPoint3D; } + +const + MAX_FILTER_WIDTH = 25; + +//const + //SizeOfBucket: array[0..3] of byte = (32, 32, 32, 32); + +function TimeToString(t: TDateTime): string; + +type + TBaseRenderer = class + private + FOnProgress: TOnProgress; + FOnOperation: TOnOperation; + FCopyBuffer: TCopyBufferCallback; + strOutput: TStrings; + + protected + Buckets: TBucketArray; + // ZBuffer: TZBuffer; + + procedure AllocateBuckets; + procedure ClearBuckets; + procedure SetBucketsPtr(ptr: pointer); + function GetBucketsPtr: pointer; + + protected + camX0, camX1, camY0, camY1, // camera bounds + camW, camH, // camera sizes + bws, bhs, cosa, sina, rcX, rcY: double; + ppux, ppuy: extended; + + BucketWidth, BucketHeight: int64; + BucketSize: int64; + + sample_density: extended; + oversample: integer; + gutter_width: Integer; + max_gutter_width: Integer; + + FCP: TControlPoint; + FStop: integer;//boolean; + FHibernated: boolean; + + FImageMaker: TImageMaker; + + ColorMap: TColorMapArray; + + FMaxMem: integer; + FSlice, FNumSlices: integer; + image_Width, image_Height: Int64; + image_Center_X, image_Center_Y: double; + + FCompatibility: integer; + FNumThreads: integer; + FNumBatches: integer; //int64; + FBatch: integer; + FThreadPriority: TThreadPriority; + + FMinDensity: double; + FMinBatches: integer; + FRenderOver: boolean; + + FBufferPath: string; + FDoExportBuffer: boolean; + + StartTime, RenderTime, PauseTime: TDateTime; + + procedure Progress(value: double); + procedure Operation(op: integer); + + procedure SetMinDensity(const q: double); + + procedure CreateColorMap; virtual; + procedure CreateCamera; + procedure CreateCameraMM; + procedure Prepare; virtual; abstract; + procedure SetPixels; virtual; abstract; + + procedure CalcBufferSize; virtual; + procedure CalcBufferSizeMM; + + procedure InitBuffers; + procedure RenderMM; + + procedure Trace(const str: string); + procedure TimeTrace(const str: string); + public + constructor Create; virtual; + destructor Destroy; override; + + procedure Hibernate(filePath: string); + procedure Resume(filePath: string); + + procedure SetCP(CP: TControlPoint); + procedure Render; virtual; + procedure ProcessBuffer(density: double); + + function GetImage: TBitmap; virtual; + procedure GetImageAndDelete(target:tBitmap); virtual; + function GetTransparentImage: TPngObject; + procedure UpdateImage(CP: TControlPoint); + procedure SaveImage(const FileName: String); + + procedure Stop; virtual; + procedure BreakRender; virtual; + procedure Pause; virtual; + procedure UnPause; virtual; + procedure SetThreadPriority(p: TThreadPriority); virtual; + + function Failed: boolean; + function Hibernated: boolean; + + function EmbedText(CommentStr: String): boolean; //AV + function DoSnapshot: boolean; //AV + + procedure ShowBigStats; + procedure ShowSmallStats; + + property CopyBufferCallback: TCopyBufferCallback + write FCopyBuffer; + property OnProgress: TOnProgress +// read FOnProgress + write FOnProgress; + property OnOperation: TOnOperation + write FOnOperation; + property MaxMem : integer + read FMaxMem + write FMaxMem; + property NrSlices: integer + read FNumSlices; + property Slice: integer + read FSlice; + property NumThreads: integer + read FNumThreads + write FNumThreads; + property Output: TStrings + write strOutput; + property MinDensity: double + write SetMinDensity; + property RenderMore: boolean + write FRenderOver; + property Batch: integer + read FBatch; + property NrBatches: integer + read FNumBatches; + property BufferPath: string + read FBufferPath + write FBufferPath; + property ExportBuffer: boolean + read FDoExportBuffer + write FDoExportBuffer; + end; + +/////////////////////////////////////////////////////////////////////////////// + + { TRenderer } + +/////////////////////////////////////////////////////////////////////////////// + +type + TRenderer = class + private + FRenderer: TBaseRenderer; + + FOnProgress: TOnProgress; + FOnOperation: TOnOperation; + FCopyBuffer: TCopyBufferCallback; + FCP: TControlPoint; + FMaxMem: int64; + FBufferPath: string; + { FNrThreads: integer; + + function GetSlice: integer; + function GetNrSlices: integer; + function GetBatch: integer; + function GetNrBatches: integer; + function GetNrThreads: integer; + + procedure SetNrThreads(v: integer); } + + public + destructor Destroy; override; + + procedure SetCP(CP: TControlPoint); + procedure Render; + procedure ProcessBuffer(density: double); + + function GetImage: TBitmap; + procedure GetImageAndDelete(target: TBitmap); + function GetTransparentImage: TPngObject; + procedure Stop; + + procedure IntermediateSample(imgmkr: TImageMaker); + + function EmbedText(CommentStr: String): boolean; //AV + + property CopyBufferCallback: TCopyBufferCallback + read FCopyBuffer + write FCopyBuffer; + property OnProgress: TOnProgress + read FOnProgress + write FOnProgress; + property OnOperation: TOnOperation + read FOnOperation + write FOnOperation; + + { property Slice: integer + read GetSlice; + property NrSlices: integer + read GetNrSlices; + + property Batch: integer + read GetBatch; + property NrBatches: integer + read GetNrBatches; + property NrThreads: integer + read FNrThreads + write FNrThreads; + property BufferPath: string + read FBufferPath + write FBufferPath; } + + procedure Hibernate(fileName: string); + end; + +implementation + +uses + Math, SysUtils, Forms, + RenderingImplementation, + Binary, Global; + +/////////////////////////////////////////////////////////////////////////////// +// +// { TBaseRenderer } +// +/////////////////////////////////////////////////////////////////////////////// +procedure TBaseRenderer.Hibernate(filePath: string); +begin + // todo +end; +procedure TBaseRenderer.Resume(filePath: string); +begin + // todo +end; + +procedure TBaseRenderer.CalcBufferSizeMM; +begin + oversample := fcp.spatial_oversample; + gutter_width := (FImageMaker.GetFilterSize - oversample) div 2; + BucketHeight := oversample * image_height + 2 * gutter_width; + Bucketwidth := oversample * image_width + 2 * gutter_width; + BucketSize := BucketWidth * BucketHeight; +end; + +procedure TBaseRenderer.RenderMM; +const + Dividers: array[0..15] of integer = (1, 2, 3, 4, 5, 6, 7, 8, 10, 16, 20, 32, 64, 128, 256, 512); +var + ApproxMemory, MaxMemory: int64; + i: integer; + zoom_scale, center_base, center_y: double; + t: TDateTime; +begin + FStop := 0; //False; + + image_Center_X := fcp.center[0]; + image_Center_Y := fcp.center[1]; + + image_Height := fcp.Height; + image_Width := fcp.Width; + oversample := fcp.spatial_oversample; + + // entered memory - imagesize + MaxMemory := FMaxMem * 1024 * 1024 - 4 * image_Height * int64(image_Width); + + if (SingleBuffer) then + ApproxMemory := 16 * sqr(oversample) * image_Height * int64(image_Width) + else + ApproxMemory := 32 * sqr(oversample) * image_Height * int64(image_Width); + + assert(MaxMemory > 0); + if MaxMemory <= 0 then exit; + + FNumSlices := 1 + ApproxMemory div MaxMemory; + + if FNumSlices > Dividers[High(Dividers)] then begin + for i := High(Dividers) downto 0 do begin + if image_height <> (image_height div dividers[i]) * dividers[i] then begin + FNumSlices := dividers[i]; + break; + end; + end; + end else begin + for i := 0 to High(Dividers) do begin + if image_height <> (image_height div dividers[i]) * dividers[i] then + continue; + if FNumSlices <= dividers[i] then begin + FNumSlices := dividers[i]; + break; + end; + end; + end; + + FImageMaker.SetCP(FCP); + FImageMaker.Init; + + fcp.height := fcp.height div FNumSlices; + center_y := fcp.center[1]; + zoom_scale := power(2.0, fcp.zoom); + center_base := center_y - ((FNumSlices - 1) * fcp.height) / (2 * fcp.pixels_per_unit * zoom_scale); + + image_height := fcp.Height; + image_Width := fcp.Width; + + InitBuffers; + CreateColorMap; + Prepare; + + RenderTime := 0; + for i := 0 to FNumSlices - 1 do begin + if FStop <> 0 then Exit; + + FSlice := i; + fcp.center[1] := center_base + fcp.height * slice / (fcp.pixels_per_unit * zoom_scale); + CreateCameraMM; + ClearBuckets; + fcp.actual_density := 0; + + t := Now; + SetPixels; + RenderTime := RenderTime + (Now - t); + + if FStop = 0 then begin + TimeTrace(TextByKey('common-trace-creating-simple')); + FImageMaker.OnProgress := FOnProgress; + FImageMaker.CreateImage(Slice * fcp.height); + end; + end; + + fcp.height := fcp.height * FNumSlices; +end; + +procedure TBaseRenderer.AllocateBuckets; +var + i, j: integer; +begin + SetLength(buckets, BucketHeight, BucketWidth); + + {$ifdef ENABLEZBUF} + SetLength(zbuffer, BucketHeight, BucketWidth); + + for i := 0 to BucketHeight - 1 do + for j := 0 to BucketWidth - 1 do + begin + zbuffer[i, j] := 10e10; + end; + {$endif} +end; + +procedure TBaseRenderer.ClearBuckets; +var + i, j: integer; +begin + for j := 0 to BucketHeight - 1 do + for i := 0 to BucketWidth - 1 do + with buckets[j][i] do begin + Red := 0; + Green := 0; + Blue := 0; + Count := 0; + end; +end; + +procedure TBaseRenderer.SetBucketsPtr(ptr: pointer); +begin + Buckets := TBucketArray(ptr); +end; + +function TBaseRenderer.GetBucketsPtr: pointer; +begin + Result := Buckets; +end; + +constructor TBaseRenderer.Create; +begin + inherited Create; + + FNumSlices := 1; + FSlice := 0; + FStop := 0; // False; + FThreadPriority := tpNormal; + + FImageMaker := TImageMaker.Create; +end; + +//////////////////////////////////////////////////////////////// +function TBaseRenderer.EmbedText(CommentStr: String): boolean; // AV +begin + Result := FImageMaker.EmbedText(CommentStr); +end; + +/////////////////////////////////////////////////////////////////////////////// +destructor TBaseRenderer.Destroy; +begin + FImageMaker.Free; + + SetLength(buckets, 1, 1); + + {$ifdef ENABLEZBUF} + SetLength(zbuffer, 1, 1); + {$endif} + + if assigned(FCP) then + FCP.Free; + + // TrimWorkingSet; + + inherited; +end; + +function TBaseRenderer.DoSnapshot: boolean; // AV +begin + Result := false; + + FImageMaker.CreateImage; + Result := true; +end; + +procedure TBaseRenderer.Operation(op: integer); +begin + if assigned(FOnOperation) then + FOnOperation(op); +end; +{ +function TRenderer.GetSlice: integer; +begin + Result := FRenderer.Slice; +end; + +function TRenderer.GetNrSlices: integer; +begin + Result := FRenderer.NrSlices; +end; + +function TRenderer.GetBatch: integer; +begin + Result := FRenderer.Batch; +end; + +function TRenderer.GetNrBatches: integer; +begin + Result := FRenderer.NrBatches; +end; + +function TRenderer.GetNrThreads: integer; +begin + Result := FRenderer.NumThreads; +end; + +procedure TRenderer.SetNrThreads(v: integer); +begin + FRenderer.NumThreads := v; +end; +} +/////////////////////////////////////////////////////////////////////////////// +procedure TBaseRenderer.SetCP(CP: TControlPoint); +begin + if assigned(FCP) then + FCP.Free; + + FCP := Cp.Clone; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TBaseRenderer.Trace(const str: string); +begin + if assigned(strOutput) then + strOutput.Add(str); +end; + +procedure TBaseRenderer.TimeTrace(const str: string); +begin + if assigned(strOutput) then + strOutput.Add(TimeToStr(Now) + ' : ' + str); +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TBaseRenderer.Pause; +begin + PauseTime := Now; + + TimeTrace(TextByKey('common-trace-pausing')); +end; + +procedure TBaseRenderer.UnPause; +var + tNow: TDateTime; +begin + tNow := Now; + RenderTime := RenderTime + (tNow - PauseTime); + + TimeTrace(TextByKey('common-trace-resuming')); +end; + +procedure TBaseRenderer.SetThreadPriority(p: TThreadPriority); +begin + FThreadPriority := p; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TBaseRenderer.Stop; +begin + TimeTrace(TextByKey('common-trace-terminating')); + + FStop := 1; //True; +end; + +procedure TBaseRenderer.BreakRender; +begin + TimeTrace(TextByKey('common-trace-stopping')); + + FStop := -1; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TBaseRenderer.Progress(value: double); +begin + if assigned(FOnprogress) then + FOnprogress(Value); +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TBaseRenderer.SetMinDensity(const q: double); +begin + if q < fcp.sample_density then FMinDensity := q + else FMinDensity := fcp.sample_density; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TBaseRenderer.Failed: boolean; +begin + Result := (FStop > 0); +end; + +function TBaseRenderer.Hibernated: boolean; +begin + Result := FHibernated; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TBaseRenderer.GetImage: TBitmap; +begin + if FStop > 0 then begin + assert(false); + FImageMaker.OnProgress := FOnProgress; + FImageMaker.CreateImage; + end; + Result := FImageMaker.GetImage; +end; + +procedure TBaseRenderer.GetImageAndDelete(target:tBitmap); +begin + if FStop > 0 then begin + assert(false); + FImageMaker.OnProgress := FOnProgress; + FImageMaker.CreateImage; + end; + FImageMaker.GetImageAndDelete(target); +end; + +procedure TRenderer.GetImageAndDelete(target:tBitmap); +begin + FRenderer.GetImageAndDelete(target); +end; + +/////////////////////////////////////////////////////////////////////////////// +function TBaseRenderer.GetTransparentImage: TPngObject; +begin + if FStop > 0 then begin + // shouldn't happen. and if it does...WTF? + Result := nil; + end + else + Result := FImageMaker.GetTransparentImage; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TBaseRenderer.UpdateImage(CP: TControlPoint); +begin + FCP.background := cp.background; + FCP.spatial_filter_radius := cp.spatial_filter_radius; + FCP.gamma := cp.Gamma; + FCP.vibrancy := cp.vibrancy; + FCP.contrast := cp.contrast; + FCP.brightness := cp.brightness; + FCP.gammaThreshRelative := cp.gammaThreshRelative; // AV: for post-processing + + FImageMaker.SetCP(FCP); + FImageMaker.Init; + + FImageMaker.OnProgress := FOnProgress; + FImageMaker.CreateImage; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TBaseRenderer.SaveImage(const FileName: String); +begin + if FStop > 0 then begin + TimeTrace(Format(TextByKey('common-trace-creating-detailed'), [fcp.actual_density])); + FImageMaker.OnProgress := FOnProgress; + FImageMaker.CreateImage; + end; + TimeTrace(TextByKey('common-trace-saving')); + FImageMaker.SaveImage(FileName); +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TBaseRenderer.CreateColorMap; +var + i: integer; +begin + for i := 0 to 255 do + with ColorMap[i] do begin + Red := (fcp.CMap[i][0] * fcp.white_level) div 256; + Green := (fcp.CMap[i][1] * fcp.white_level) div 256; + Blue := (fcp.CMap[i][2] * fcp.white_level) div 256; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TBaseRenderer.CreateCamera; +var + scale: double; + t0, t1: double; + t2, t3: double; + corner_x, corner_y, Xsize, Ysize: double; + shift: Integer; +begin + scale := power(2, fcp.zoom); + sample_density := fcp.sample_density * scale * scale; + ppux := fcp.pixels_per_unit * scale; + ppuy := fcp.pixels_per_unit * scale; + shift := 0; + + corner_x := fcp.center[0] - fcp.Width / ppux / 2.0; + corner_y := fcp.center[1] - fcp.Height / ppuy / 2.0; + t0 := gutter_width / (oversample * ppux); + t1 := gutter_width / (oversample * ppuy); + t2 := (2 * max_gutter_width - gutter_width) / (oversample * ppux); + t3 := (2 * max_gutter_width - gutter_width) / (oversample * ppuy); + + camX0 := corner_x - t0; + camY0 := corner_y - t1 + shift; + camX1 := corner_x + fcp.Width / ppux + t2; + camY1 := corner_y + fcp.Height / ppuy + t3; //+ shift; + + camW := camX1 - camX0; + if abs(camW) > 0.01 then + Xsize := 1.0 / camW + else + Xsize := 1; + camH := camY1 - camY0; + if abs(camH) > 0.01 then + Ysize := 1.0 / camH + else + Ysize := 1; + bws := (BucketWidth - 0.5) * Xsize; + bhs := (BucketHeight - 0.5) * Ysize; + + if FCP.FAngle <> 0 then + begin + cosa := cos(FCP.FAngle); + sina := sin(FCP.FAngle); + rcX := FCP.Center[0]*(1 - cosa) - FCP.Center[1]*sina - camX0; + rcY := FCP.Center[1]*(1 - cosa) + FCP.Center[0]*sina - camY0; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TBaseRenderer.CreateCameraMM; +var + scale: double; + t0, t1: double; + corner_x, corner_y, Xsize, Ysize: double; + shift: Integer; +begin + scale := power(2, fcp.zoom); + sample_density := fcp.sample_density * scale * scale; + ppux := fcp.pixels_per_unit * scale; + ppuy := fcp.pixels_per_unit * scale; + // todo field stuff + shift := 0; + t0 := gutter_width / (oversample * ppux); + t1 := gutter_width / (oversample * ppuy); + corner_x := fcp.center[0] - image_width / ppux / 2.0; + corner_y := fcp.center[1] - image_height / ppuy / 2.0; + + camX0 := corner_x - t0; + camY0 := corner_y - t1 + shift; + camX1 := corner_x + image_width / ppux + t0; + camY1 := corner_y + image_height / ppuy + t1; //+ shift; + + camW := camX1 - camX0; + if abs(camW) > 0.01 then + Xsize := 1.0 / camW + else + Xsize := 1; + camH := camY1 - camY0; + if abs(camH) > 0.01 then + Ysize := 1.0 / camH + else + Ysize := 1; + bws := (BucketWidth - 0.5) * Xsize; + bhs := (BucketHeight - 0.5) * Ysize; + + if FCP.FAngle <> 0 then + begin + cosa := cos(FCP.FAngle); + sina := sin(FCP.FAngle); + rcX := image_Center_X*(1 - cosa) - image_Center_Y*sina - camX0; + rcY := image_Center_Y*(1 - cosa) + image_Center_X*sina - camY0; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TBaseRenderer.CalcBufferSize; +begin + oversample := fcp.spatial_oversample; + max_gutter_width := (MAX_FILTER_WIDTH - oversample) div 2; + gutter_width := (FImageMaker.GetFilterSize - oversample) div 2; + BucketWidth := oversample * fcp.Width + 2 * max_gutter_width; + BucketHeight := oversample * fcp.Height + 2 * max_gutter_width; + BucketSize := BucketWidth * BucketHeight; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TBaseRenderer.InitBuffers; +var + error_string : string; +begin + error_string := TextByKey('common-trace-notenoughmemory'); + + CalcBufferSize; + + try + // FStop := 0; + // TrimWorkingSet; + if SingleBuffer then + TimeTrace(Format(TextByKey('common-trace-allocating'), [BucketSize * 16 / 1048576])) + else + TimeTrace(Format(TextByKey('common-trace-allocating'), [BucketSize * 32 / 1048576])); + + AllocateBuckets; + + except + on EOutOfMemory do begin + if Assigned(strOutput) then + strOutput.Add(error_string); + FStop := 1; + // TrimWorkingSet; + exit; + end; + end; + + // share the buffer with imagemaker + FImageMaker.SetBucketData(GetBucketsPtr, BucketWidth, BucketHeight, 64); +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TRenderer.IntermediateSample(imgmkr: TImageMaker); +begin + FCP.actual_density := FCP.sample_density * FRenderer.FBatch / FRenderer.FNumBatches; + imgmkr.SetCP(FCP); + imgmkr.Init; + imgmkr.SetBucketData(FRenderer.GetBucketsPtr, FRenderer.BucketWidth, FRenderer.BucketHeight, 64); + imgmkr.CreateImage; +end; + +procedure TBaseRenderer.Render; +begin + if fcp.NumXForms <= 0 then + begin + exit; + end; + FStop := 0; //False; + + FImageMaker.SetCP(FCP); + FImageMaker.Init; + + InitBuffers; + if FStop <> 0 then exit; // memory allocation error? + + CreateColorMap; + Prepare; + + CreateCamera; + if not FRenderOver then ClearBuckets; + + Operation(opRendering); + + StartTime := Now; + RenderTime := Now; + SetPixels; + RenderTime := Now - RenderTime; + + if FStop <= 0 then begin + if fcp.sample_density = fcp.actual_density then + TimeTrace(TextByKey('common-trace-creating-simple')) + else + TimeTrace(Format(TextByKey('common-trace-creating-detailed'), [fcp.actual_density])); + + if (FBufferPath <> '') then begin + Operation(opHibernating); + Hibernate(FBufferPath); + end; + + Operation(opSampling); + FImageMaker.OnProgress := FOnProgress; + FImageMaker.CreateImage; + end; +end; + +procedure TBaseRenderer.ProcessBuffer(density: double); +var + nsamples: int64; + x, y: integer; + bucket : TBucket; + ptr: TBucketArray; +begin + if fcp.NumXForms <= 0 then exit; + FStop := 0; //False; + + FImageMaker.SetCP(FCP); + FImageMaker.Init; + + InitBuffers; + if FStop <> 0 then exit; // memory allocation error? + + CreateColorMap; + Prepare; + + CreateCamera; + if not FRenderOver then ClearBuckets; + + Operation(opSampling); + + StartTime := Now; + RenderTime := Now; + //////////////// + Randomize; + + NSamples := Round(sample_density * NrSlices * bucketSize / (oversample * oversample)); + FNumBatches := Round(nsamples / (fcp.nbatches * SUB_BATCH_SIZE)); + if FNumBatches = 0 then FNumBatches := 1; + FMinBatches := Round(FNumBatches * FMinDensity / fcp.sample_density); + if FMinBatches = 0 then FMinBatches := 1; + + ptr := TBucketArray(GetBucketsPtr); + if (assigned(FCopyBuffer)) then begin + for y := 0 to BucketHeight - 1 do + for x := 0 to BucketWidth - 1 do + begin + FCopyBuffer(@bucket, x, y); + ptr[y, x].red := bucket.red; + ptr[y, x].green := bucket.green; + ptr[y, x].blue := bucket.blue; + ptr[y, x].count := bucket.count; + end; + + end; + FBatch := FNumBatches; + + fcp.actual_density := density; + + Progress(0); + //////////////// + RenderTime := Now - RenderTime; + + if FStop <= 0 then begin + if fcp.sample_density = fcp.actual_density then + TimeTrace(TextByKey('common-trace-creating-simple')) + else + TimeTrace(Format(TextByKey('common-trace-creating-detailed'), [fcp.actual_density])); + + //Operation(opSampling); + FImageMaker.OnProgress := FOnProgress; + FImageMaker.CreateImage; + end; + +end; + +/////////////////////////////////////////////////////////////////////////////// +// +// { TRenderer } +// +/////////////////////////////////////////////////////////////////////////////// + +destructor TRenderer.Destroy; +begin + if assigned(FRenderer) then + FRenderer.Free; + + inherited; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TRenderer.GetImage: TBitmap; +begin + Result := nil; + if assigned(FRenderer) then + Result := FRenderer.GetImage; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TRenderer.SetCP(CP: TControlPoint); +begin + FCP := CP; +end; +/////////////////////////////////////////////////////////////////////////// +function TRenderer.EmbedText(CommentStr: String): boolean; // AV +begin + Result := False; + if assigned(FRenderer) then + Result := FRenderer.EmbedText(CommentStr); +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TRenderer.ProcessBuffer(density: double); +begin + if assigned(FRenderer) then + FRenderer.Free; + + assert(Fmaxmem=0); + // if FNrThreads <= 1 then // AV + FRenderer := TRenderWorkerST.Create; + { else begin // AV + FRenderer := TRenderWorkerMT.Create; + FRenderer.NumThreads := FNrThreads; + end; + } + FRenderer.SetCP(FCP); + FRenderer.OnProgress := FOnProgress; + FRenderer.OnOperation := FOnOperation; + FRenderer.CopyBufferCallback := FCopyBuffer; + FRenderer.BufferPath := ''; + FRenderer.ProcessBuffer(density); +end; + +procedure TRenderer.Render; +begin + if assigned(FRenderer) then + FRenderer.Free; + + assert(Fmaxmem=0); +// if FNrThreads <= 1 then // AV + FRenderer := TRenderWorkerST.Create; + { // AV: we don't need MT for mini-previews, Apo hangs... + else begin + FRenderer := TRenderWorkerMT.Create; + FRenderer.NumThreads := FNrThreads; + end; + } + FRenderer.SetCP(FCP); + FRenderer.OnProgress := FOnProgress; + FRenderer.OnOperation := FOnOperation; + FRenderer.BufferPath := FBufferPath; + FRenderer.Render; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TRenderer.Stop; +begin + if assigned(FRenderer) then + FRenderer.Stop; +end; + +procedure TRenderer.Hibernate(fileName: string); +begin + FRenderer.Hibernate(fileName); +end; + +function TRenderer.GetTransparentImage: TPngObject; +begin + Result := FRenderer.GetTransparentImage; +end; + +function TimeToString(t: TDateTime): string; +var + n: integer; +begin + n := Trunc(t); + Result := ''; + if n > 0 then begin + Result := Result + Format(' %d ' + TextByKey('common-days'), [n]); + //if n <> 1 then Result := Result + 's'; + end; + t := t * 24; + n := Trunc(t) mod 24; + if n > 0 then begin + Result := Result + Format(' %d ' + TextByKey('common-hours'), [n]); + //if n <> 1 then Result := Result + 's'; + end; + t := t * 60; + n := Trunc(t) mod 60; + if n > 0 then begin + Result := Result + Format(' %d ' + TextByKey('common-minutes'), [n]); + //if n <> 1 then Result := Result + 's'; + end; + t := t * 60; + t := t - (Trunc(t) div 60) * 60; + Result := Result + Format(' %.2f ' + TextByKey('common-seconds'), [t]); +end; +procedure TBaseRenderer.ShowBigStats; +var + Stats: TBucketStats; + TotalSamples: int64; + + Rbits, Gbits, Bbits, Abits: double; +begin + if not assigned(strOutput) then exit; + + strOutput.Add(''); + if NrSlices = 1 then + strOutput.Add(TextByKey('common-statistics-title-oneslice')) + else + strOutput.Add(TextByKey('common-statistics-title-multipleslices')); // not really useful :-\ + + TotalSamples := int64(FNumBatches) * SUB_BATCH_SIZE; // * fcp.nbatches ? + if TotalSamples <= 0 then begin + //strOutput.Add(' Nothing to talk about!'); // normally shouldn't happen + exit; + end; + strOutput.Add(Format(' ' + TextByKey('common-statistics-maxpossiblebits'), [8 + log2(TotalSamples)])); + FImageMaker.GetBucketStats(Stats); + with Stats do begin + if MaxR > 0 then Rbits := log2(MaxR) else Rbits := 0; + if MaxG > 0 then Gbits := log2(MaxG) else Gbits := 0; + if MaxB > 0 then Bbits := log2(MaxB) else Bbits := 0; + if MaxA > 0 then Abits := log2(MaxA) else Abits := 0; + strOutput.Add(Format(' ' + TextByKey('common-statistics-maxred'), [Rbits])); + strOutput.Add(Format(' ' + TextByKey('common-statistics-maxgreen'), [Gbits])); + strOutput.Add(Format(' ' + TextByKey('common-statistics-maxblue'), [Bbits])); + strOutput.Add(Format(' ' + TextByKey('common-statistics-maxcounter'), [Abits])); + strOutput.Add(Format(' ' + TextByKey('common-statistics-pointhitratio'), [100.0*(TotalA/TotalSamples)])); + if RenderTime > 0 then // hmm + strOutput.Add(Format(' ' + TextByKey('common-statistics-averagespeed'), [TotalSamples / (RenderTime * 24 * 60 * 60)])); + strOutput.Add(' ' + TextByKey('common-statistics-purerenderingtime') + TimeToString(RenderTime)); + end; +end; + +procedure TBaseRenderer.ShowSmallStats; +var + TotalSamples: int64; +begin + if not assigned(strOutput) then exit; + + TotalSamples := int64(FNumBatches) * SUB_BATCH_SIZE; // * fcp.nbatches ? + if RenderTime > 0 then // hmm + strOutput.Add(Format(' ' + TextByKey('common-statistics-averagespeed'), [TotalSamples / (RenderTime * 24 * 60 * 60)])); + strOutput.Add(' ' + TextByKey('common-statistics-purerenderingtime') + TimeToString(RenderTime)); +end; + + +end. + diff --git a/System/AsmRandom.pas b/System/AsmRandom.pas new file mode 100644 index 0000000..5f72a7e --- /dev/null +++ b/System/AsmRandom.pas @@ -0,0 +1,95 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + This module is (c) Jed Kelsey and originally created for Apophysis JK 2.10. +} + +unit AsmRandom; + +interface + +procedure AsmRandInt; +procedure AsmRandExt; +procedure AsmRandomize; + +var + RandSeed: Longint = 0; { Base for random number generator } + +implementation + +const + advapi32 = 'advapi32.dll'; + kernel = 'kernel32.dll'; + +function QueryPerformanceCounter(var lpPerformanceCount: Int64): LongBool; stdcall; + external kernel name 'QueryPerformanceCounter'; + +function GetTickCount: Cardinal; + external kernel name 'GetTickCount'; + + +procedure AsmRandomize; +{$IFDEF LINUX} +begin + RandSeed := _time(nil); +end; +{$ENDIF} +{$IFDEF MSWINDOWS} +var + Counter: Int64; +begin + if QueryPerformanceCounter(Counter) then + RandSeed := Counter + else + RandSeed := GetTickCount; +end; +{$ENDIF} + +procedure AsmRandInt; +asm +{ ->EAX Range } +{ <-EAX Result } + IMUL EDX,RandSeed,08088405H + INC EDX + MOV RandSeed,EDX + MUL EDX + MOV EAX,EDX +end; + +procedure AsmRandExt; +const two2neg32: double = ((1.0/$10000) / $10000); // 2^-32 +asm +{ FUNCTION _RandExt: Extended; } + + IMUL EDX,RandSeed,08088405H + INC EDX + MOV RandSeed,EDX + + FLD two2neg32 + PUSH 0 + PUSH EDX + FILD qword ptr [ESP] + ADD ESP,8 + FMULP ST(1), ST(0) +end; + +end. diff --git a/System/CurvesControl.dfm b/System/CurvesControl.dfm new file mode 100644 index 0000000..39378a2 --- /dev/null +++ b/System/CurvesControl.dfm @@ -0,0 +1,23 @@ +object CurvesControl: TCurvesControl + Left = 0 + Top = 0 + Width = 542 + Height = 440 + DoubleBuffered = True + Color = clBlack + ParentBackground = False + ParentColor = False + ParentDoubleBuffered = False + TabOrder = 0 + object Host: TPanel + Left = 0 + Top = 0 + Width = 542 + Height = 440 + Align = alClient + BevelOuter = bvNone + Color = clBlack + ParentBackground = False + TabOrder = 0 + end +end diff --git a/System/CurvesControl.pas b/System/CurvesControl.pas new file mode 100644 index 0000000..9947a44 --- /dev/null +++ b/System/CurvesControl.pas @@ -0,0 +1,384 @@ +unit CurvesControl; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Math, ControlPoint, + Graphics, Controls, Forms, Bezier, CustomDrawControl, Vcl.ExtCtrls; + +const + point_size: double = 8; + accurancy: double = 3; + channel_count: integer = 4; + padding = 3; + +const + MAX_CHANNEL = 3; + +type + TCurvesChannel = (ccAll = 0, ccRed = 1, ccGreen = 2, ccBlue = 3); + TCurvesControl = class(TFrame) + Host: TPanel; + private + FRect: BezierRect; + + FPoints: array [0..3] of BezierPoints; + FWeights: array [0..3] of BezierWeights; + + FDragging: boolean; + FDragIndex: integer; + + FActiveChannel : TCurvesChannel; + FChannelIndex : integer; + + FFrame : TCustomDrawControl; + FCP: TControlPoint; + + p: array [0..MAX_CHANNEL] of BezierPoints; + w: array [0..MAX_CHANNEL] of BezierWeights; + wsum: array [0..MAX_CHANNEL] of double; + + procedure SetChannel(value: TCurvesChannel); + procedure SetWeightLeft(value: double); + procedure SetWeightRight(value: double); + + function GetChannel: TCurvesChannel; + function GetWeightLeft: double; + function GetWeightRight: double; + + procedure FrameMouseLeave(Sender: TObject); + procedure FrameMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); + procedure FrameMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); + procedure FrameMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); + procedure FrameResize(Sender: TObject); + procedure FramePaint(Sender: TObject); + procedure FrameCreate; + + procedure PaintCurve(Bitmap: TBitmap; c: integer; p: BezierPoints; w: BezierWeights; widgets: boolean); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + + property WeightLeft : double read GetWeightLeft write SetWeightLeft; + property WeightRight : double read GetWeightRight write SetWeightRight; + property ActiveChannel : TCurvesChannel read GetChannel write SetChannel; + + procedure SetCp(cp: TControlPoint); + procedure UpdateFlame; + end; + +implementation + +{$R *.DFM} + +uses Main, Editor, Mutate, Adjust; + +constructor TCurvesControl.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + + FFrame := TCustomDrawControl.Create(self); + FFrame.TabStop := True; + FFrame.TabOrder := 0; + FFrame.Parent := Host; + FFrame.Align := alClient; + FFrame.Visible := True; + + FFrame.OnPaint := FramePaint; + FFrame.OnMouseDown := FrameMouseDown; + FFrame.OnMouseMove := FrameMouseMove; + FFrame.OnMouseUp := FrameMouseUp; + FFrame.OnMouseLeave := FrameMouseLeave; + + FCP := TControlPoint.Create; + + FrameCreate; +end; +destructor TCurvesControl.Destroy; +begin + FCP.Destroy; + inherited Destroy; +end; + +procedure TCurvesControl.SetCp(cp: TControlPoint); +var i, j: integer; +begin + FCP.Copy(cp, true); + for i := 0 to 3 do + for j := 0 to 3 do begin + FWeights[i,j] := FCP.curveWeights[i,j]; + FPoints[i,j].x := FCP.curvePoints[i,j].x; + FPoints[i,j].y := FCP.curvePoints[i,j].y; + end; + Invalidate; + FFrame.Invalidate; +end; +procedure TCurvesControl.UpdateFlame; +begin + MainForm.StopThread; + MainForm.UpdateUndo; + MainCp.Copy(FCP, true); + + if EditForm.Visible then EditForm.UpdateDisplay; + if MutateForm.Visible then MutateForm.UpdateDisplay; + if AdjustForm.Visible then AdjustForm.UpdateDisplay(true); + + MainForm.RedrawTimer.enabled := true; +end; + +procedure TCurvesControl.FrameMouseLeave(Sender: TObject); +begin + FrameMouseUp(nil, mbLeft, [], 0, 0); +end; +procedure TCurvesControl.FrameMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +var + ps_half: double; + i, n: integer; + p: BezierPoints; +begin + BezierCopy(FPoints[FChannelIndex], p); + BezierSetRect(p, true, FRect); + + FDragIndex := -1; + FDragging := false; + + n := Length(p); + for i := 1 to n - 2 do if + (X >= p[i].x - point_size) and (X <= p[i].x + point_size) and + (Y >= p[i].y - point_size) and (Y <= p[i].y + point_size) then + begin + FDragging := true; + FDragIndex := i; + Break; + end; +end; +procedure TCurvesControl.FrameMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); +var + m: BezierPoints; + tmp: BezierPoint; + i: Integer; + j: Integer; +begin + + if (y < 0) then Exit; + if (x < 0) then Exit; + + m[0].x := x; m[0].y := y; + BezierUnsetRect(m, true, FRect); + + if FDragging then + begin + FPoints[FChannelIndex][FDragIndex] := m[0]; + if (FPoints[FChannelIndex][FDragIndex].x <= 0) + then FPoints[FChannelIndex][FDragIndex].x := 0; + if (FPoints[FChannelIndex][FDragIndex].y <= 0) + then FPoints[FChannelIndex][FDragIndex].y := 0; + if (FPoints[FChannelIndex][FDragIndex].x >= 1) + then FPoints[FChannelIndex][FDragIndex].x := 1; + if (FPoints[FChannelIndex][FDragIndex].y >= 1) + then FPoints[FChannelIndex][FDragIndex].y := 1; + + if (FPoints[FChannelIndex][1].x > FPoints[FChannelIndex][2].x) then + begin + tmp := FPoints[FChannelIndex][1]; + FPoints[FChannelIndex][1] := FPoints[FChannelIndex][2]; + FPoints[FChannelIndex][2] := tmp; + if (FDragIndex = 1) then FDragIndex := 2 + else FDragIndex := 1; + end; + + for i := 0 to 3 do + for j := 0 to 3 do begin + FCP.curveWeights[i,j] := FWeights[i,j]; + FCP.curvePoints[i,j].x := FPoints[i,j].x; + FCP.curvePoints[i,j].y := FPoints[i,j].y; + end; + + + FFrame.Refresh; + end; +end; +procedure TCurvesControl.FrameMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + FDragIndex := -1; + FDragging := false; + + if (sender <> nil) then UpdateFlame; +end; + +procedure TCurvesControl.FrameCreate; +var i: integer; +begin + for i := 0 to channel_count - 1 do + begin + FPoints[i][0].x := 0.00; FPoints[i][0].y := 0.00; FWeights[i][0] := 1; + FPoints[i][1].x := 0.00; FPoints[i][1].y := 0.00; FWeights[i][1] := 1; + FPoints[i][2].x := 1.00; FPoints[i][2].y := 1.00; FWeights[i][2] := 1; + FPoints[i][3].x := 1.00; FPoints[i][3].y := 1.00; FWeights[i][3] := 1; + end; + + FDragIndex := -1; + FDragging := false; +end; +procedure TCurvesControl.FrameResize(Sender: TObject); +begin + FRect.x0 := 0; FRect.y0 := 0; + FRect.x1 := self.Width - 1; + FRect.y1 := self.Height - 1; +end; +procedure TCurvesControl.FramePaint(Sender: TObject); +var + clientRect: TRect; + i, j, x, y, sx, sy: integer; + bitmap: TBitMap; +begin + if (FFrame.Width <= 0) or (FFrame.Height <= 0) then Exit; + FrameResize(Sender); + + Bitmap := TBitmap.Create; + Bitmap.Width := FFrame.Width; + Bitmap.Height := FFrame.Height; + + sx := Bitmap.Width; + sy := Bitmap.Height; + + try + with Bitmap.Canvas do + begin + Brush.Color := $000000; + FillRect(Rect(0, 0, sx, sy)); + + Pen.Color := $555555; + Pen.Style := psSolid; + Pen.Width := 1; + + for x := 1 to 7 do begin + MoveTo(Round(0.125 * x * FRect.x1), Round(FRect.y0)); + LineTo(Round(0.125 * x * FRect.x1), Round(FRect.y1)); + end; + for y := 1 to 3 do begin + MoveTo(Round(FRect.x0), Round(0.25 * y * FRect.y1)); + LineTo(Round(FRect.x1), Round(0.25 * y * FRect.y1)); + end; + + for i := 0 to channel_count - 1 do begin + for j := 0 to 3 do + wsum[i] := wsum[i] + FWeights[i][j]; + for j := 0 to 3 do + w[i][j] := FWeights[i][j] / wsum[i]; + + BezierCopy(FPoints[i], p[i]); + BezierSetRect(p[i], true, FRect); + + if i <> FChannelIndex then PaintCurve(Bitmap, i, p[i], w[i], false); + end; + PaintCurve(Bitmap, FChannelIndex, p[FChannelIndex], w[FChannelIndex], true); + + FFrame.Canvas.Draw(0, 0, Bitmap); + end; + finally + Bitmap.Free; + end; +end; + +procedure TCurvesControl.PaintCurve(Bitmap: TBitmap; c: integer; p: BezierPoints; w: BezierWeights; widgets: boolean); +var + pos0, pos1: BezierPoint; + t, step: Double; + r, g, b: array [0 .. MAX_CHANNEL] of integer; + rgbv: integer; +begin + with Bitmap.Canvas do + begin + if c <> FChannelIndex then begin + r[0] := $aa; r[1] := $aa; r[2] := $40; r[3] := $40; + g[0] := $aa; g[1] := $40; g[2] := $aa; g[3] := $40; + b[0] := $aa; b[1] := $40; b[2] := $40; b[3] := $aa; + end else begin + r[0] := $ff; r[1] := $ff; r[2] := $80; r[3] := $80; + g[0] := $ff; g[1] := $80; g[2] := $ff; g[3] := $80; + b[0] := $ff; b[1] := $80; b[2] := $80; b[3] := $ff; + end; + + rgbv := RGB(r[c], g[c], b[c]); + + t := 0; + step := 0.001; + + BezierSolve(0, p, w, pos1); + pos0.x := 0; pos0.y := pos1.y; + + if widgets then begin + Pen.Color := $808080; Pen.Width := 1; + MoveTo(Round(p[1].x), Round(p[1].y)); + LineTo(Round(p[2].x), Round(p[2].y)); + MoveTo(Round(FRect.x0), Round(FRect.y1)); + LineTo(Round(p[1].x), Round(p[1].y)); + MoveTo(Round(FRect.x1), Round(FRect.y0)); + LineTo(Round(p[2].x), Round(p[2].y)); + end; + + while t < 1 do begin + BezierSolve(t, p, w, pos1); + Pen.Color := rgbv; + Pen.Width := 1; + MoveTo(Round(pos0.x), Round(pos0.y)); + LineTo(Round(pos1.x), Round(pos1.y)); + t := t + step; + pos0 := pos1; + end; + + MoveTo(Round(pos0.x), Round(pos0.y)); + LineTo(Round(FRect.x1), Round(pos0.y)); + + if widgets then begin + Brush.Color := rgbv; + Ellipse( + Round(p[1].x - point_size / 2.0), + Round(p[1].y - point_size / 2.0), + Round(p[1].x + point_size / 2.0), + Round(p[1].y + point_size / 2.0) + ); + Ellipse( + Round(p[2].x - point_size / 2.0), + Round(p[2].y - point_size / 2.0), + Round(p[2].x + point_size / 2.0), + Round(p[2].y + point_size / 2.0) + ); + end; + end; +end; + +procedure TCurvesControl.SetChannel(value: TCurvesChannel); +begin + FActiveChannel := value; + FChannelIndex := Integer(value); + FFrame.Refresh; +end; +procedure TCurvesControl.SetWeightLeft(value: double); +begin + FWeights[FChannelIndex][1] := value; + FCP.curveWeights[FChannelIndex][1] := value; + FFrame.Refresh; +end; +procedure TCurvesControl.SetWeightRight(value: double); +begin + FWeights[FChannelIndex][2] := value; + FCP.curveWeights[FChannelIndex][2] := value; + FFrame.Refresh; +end; + +function TCurvesControl.GetChannel: TCurvesChannel; +begin + Result := FActiveChannel; +end; +function TCurvesControl.GetWeightLeft: double; +begin + Result := FWeights[FChannelIndex][1]; +end; +function TCurvesControl.GetWeightRight: double; +begin + Result := FWeights[FChannelIndex][2]; +end; + +end. diff --git a/System/CustomDrawControl.pas b/System/CustomDrawControl.pas new file mode 100644 index 0000000..d2b687f --- /dev/null +++ b/System/CustomDrawControl.pas @@ -0,0 +1,99 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit CustomDrawControl; + +interface + +uses + Classes, Controls, Messages, Windows, Graphics; + +type + TCustomDrawControl = class(TCustomControl) + private + FOnPaint: TNotifyEvent; + FOnLeave: TNotifyEvent; + + procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND; + procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS; + procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS; + procedure WMGetDlgCode(var Message: TMessage); message WM_GETDLGCODE; + procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; + protected + + public + procedure Paint; override; + + property OnPaint: TNotifyEvent read FOnPaint write FOnPaint; + property Canvas; + + property OnDblClick; + property OnKeyDown; +// property OnKeyPress; + property OnKeyUp; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnMouseWheel; +// property OnMouseWheelDown; +// property OnMouseWheelUp; + property OnEnter; + property OnExit; + property OnMouseLeave: TNotifyEvent read FOnLeave write FOnLeave; + end; + +implementation + +procedure TCustomDrawControl.WMEraseBkgnd(var Message: TWMEraseBkgnd); +begin + Message.Result := 1; +end; + +procedure TCustomDrawControl.WMSetFocus(var Message: TWMSetFocus); +begin + Invalidate; +end; + +procedure TCustomDrawControl.WMKillFocus(var Message: TWMKillFocus); +begin + if assigned(OnExit) then OnExit(self); + Invalidate; +end; + +procedure TCustomDrawControl.WMGetDlgCode(var Message: TMessage); +begin + inherited; + Message.Result := Message.Result or DLGC_WANTARROWS; +end; + +procedure TCustomDrawControl.CMMouseLeave(var Message: TMessage); +begin + if Assigned(FOnLeave) then FOnLeave(Self); +end; + +procedure TCustomDrawControl.Paint; +begin + if Assigned(FOnPaint) then FOnPaint(Self); +end; + +end. diff --git a/System/LibXmlComps.dcr b/System/LibXmlComps.dcr new file mode 100644 index 0000000..ed9cb54 Binary files /dev/null and b/System/LibXmlComps.dcr differ diff --git a/System/LibXmlComps.pas b/System/LibXmlComps.pas new file mode 100644 index 0000000..8026bd9 --- /dev/null +++ b/System/LibXmlComps.pas @@ -0,0 +1,122 @@ +(** +=============================================================================================== +Name : LibXmlComps +=============================================================================================== +Project : All Projects processing XML documents +=============================================================================================== +Subject : XML parser for Delphi's VCL toolbar +=============================================================================================== +Dipl.-Ing. (FH) Stefan Heymann, Softwaresysteme, Tübingen, Germany +=============================================================================================== +Date Author Changes +----------------------------------------------------------------------------------------------- +2000-03-31 HeySt 1.0.0 Start +2000-07-27 HeySt 1.0.1 Added "TAttr" declaration + Moved GetNormalize/SetNormalize to PROTECTED section +2001-02-03 HeySt Changed prototype for the TExternalEvent callback function type + so that C++Builder users should get it compiled better. + +2001-02-28 HeySt 1.0.2 Introduced the "StopParser" property. When you set this property to + TRUE in one of the Parser Events, parsing is stopped and the Execute + method returns. + Introduced Version numbers +2001-07-10 HeySt 1.0.3 Fixed a bug in TScannerXmlParser.DtdElementFound so that the + OnAttList event is correctly fired +2001-07-11 HeySt 1.1.0 Derived from the new TCustomXmlScanner class from LibXmlParser +2005-07-07 HeySt 1.1.1 Published new TranslateCharacter event property +*) + +UNIT LibXmlComps; + +INTERFACE + +USES + Classes, + LibXmlParser; + +TYPE + TXmlScanner = CLASS (TCustomXmlScanner) + PUBLIC + PROPERTY XmlParser; + PROPERTY StopParser; + PUBLISHED + PROPERTY Filename; + PROPERTY Normalize; + PROPERTY OnXmlProlog; + PROPERTY OnComment; + PROPERTY OnPI; + PROPERTY OnDtdRead; + PROPERTY OnStartTag; + PROPERTY OnEmptyTag; + PROPERTY OnEndTag; + PROPERTY OnContent; + PROPERTY OnCData; + PROPERTY OnElement; + PROPERTY OnAttList; + PROPERTY OnEntity; + PROPERTY OnNotation; + PROPERTY OnDtdError; + PROPERTY OnLoadExternal; + PROPERTY OnTranslateEncoding; + PROPERTY OnTranslateCharacter; + END; + + // The "Easy" XML Scanner leaves out events and properties which you are unlikely to use + // for "normal" XML files. + // CDATA sections trigger "OnContent" events + TEasyXmlScanner = CLASS (TCustomXmlScanner) + PROTECTED + PROCEDURE WhenCData (Content : string); OVERRIDE; + PUBLIC + PROPERTY XmlParser; + PROPERTY StopParser; + PUBLISHED + PROPERTY Filename; + PROPERTY Normalize; + PROPERTY OnComment; + PROPERTY OnPI; + PROPERTY OnStartTag; + PROPERTY OnEmptyTag; + PROPERTY OnEndTag; + PROPERTY OnContent; + PROPERTY OnLoadExternal; + PROPERTY OnTranslateEncoding; + END; + +PROCEDURE Register; + +(* +=============================================================================================== +IMPLEMENTATION +=============================================================================================== +*) + +IMPLEMENTATION + + +PROCEDURE Register; +BEGIN + RegisterComponents ('XML', [TXmlScanner, TEasyXmlScanner]); +END; + + +(* +=============================================================================================== +TEasyXmlScanner +=============================================================================================== +*) + +PROCEDURE TEasyXmlScanner.WhenCData (Content : string); +BEGIN + INHERITED WhenContent (Content); +END; + + +(* +=============================================================================================== +INITIALIZATION +=============================================================================================== +*) + +END. + diff --git a/System/LibXmlParser.pas b/System/LibXmlParser.pas new file mode 100644 index 0000000..b68ee6c --- /dev/null +++ b/System/LibXmlParser.pas @@ -0,0 +1,2719 @@ +(** +=============================================================================================== +Name : LibXmlParser + +Project : All Projects + +Subject : Progressive XML 1.0 Parser for all types of XML 1.0 Files +=============================================================================================== +Author : Stefan Heymann + Eschenweg 3 + 72076 Tübingen + Germany + +E-Mail: stefan@destructor.de +URL: www.destructor.de +=============================================================================================== +Source, Legals ("Licence") +-------------------------- +The official site to get this parser is http://www.destructor.de/ + +Usage and Distribution of this Source Code is ruled by the +"Destructor.de Source code Licence" (DSL) which comes with this file or +can be downloaded at http://www.destructor.de/ + +IN SHORT: Usage and distribution of this source code is free. + You use it completely on your own risk. + +Donateware +---------- +This code is donateware. When you think that it is worth it you can give a donation. +When you use the code on this site to earn money, you might think about giving a part of +it to the author. Whether you donate, and how much, is absolutely up to you. +You can find more information about donations on + http://www.destructor.de/donateware.htm +=============================================================================================== +!!! All parts of this code which are not finished or not conforming exactly to + the XmlSpec are marked with three exclamation marks + +-!- Parts where the parser may be able to detect errors in the document's syntax are + marked with the dash-exlamation mark-dash sequence. +=============================================================================================== +Terminology: +------------ +- Start: Start of a buffer part +- Final: End (last character) of a buffer part +- DTD: Document Type Definition +- DTDc: Document Type Declaration +- XMLSpec: The current W3C XML 1.0 Recommendation (version 1.0 TE as of 2004-02-04), Chapter No. +- Cur*: Fields concerning the "Current" part passed back by the "Scan" method +=============================================================================================== +Scanning the XML document +------------------------- +- Create TXmlParser Instance MyXml := TXmlParser.Create; +- Load XML Document MyXml.LoadFromFile (Filename); +- Start Scanning MyXml.StartScan; +- Scan Loop WHILE MyXml.Scan DO +- Test for Part Type CASE MyXml.CurPartType OF +- Handle Parts ... : ;;; +- Handle Parts ... : ;;; +- Handle Parts ... : ;;; + END; +- Destroy MyXml.Free; +=============================================================================================== +Loading the XML document +------------------------ +You can load the XML document from a file with the "LoadFromFile" method. +It is beyond the scope of this parser to perform HTTP or FTP accesses. If you want your +application to handle such requests (URLs), you can load the XML via HTTP or FTP or whatever +protocol and hand over the data buffer using the "LoadFromBuffer" or "SetBuffer" method. +"LoadFromBuffer" loads the internal buffer of TXmlParser with the given null-terminated +string, thereby creating a copy of that buffer. +"SetBuffer" just takes the pointer to another buffer, which means that the given +buffer pointer must be valid while the document is accessed via TXmlParser. +=============================================================================================== +Encodings: +---------- +This XML parser kind of "understands" the following encodings: +- UTF-8 +- ISO-8859-1 +- Windows-1252 ("ANSI") + +Any flavor of multi-byte characters (and this includes UCS-2 and UTF-16) is not supported. +Sorry. + +Every string which has to be passed to the application passes the virtual method +"TranslateEncoding" which translates the string from the current encoding (stored in +"CurEncoding") into the encoding the application wishes to receive. +The "TranslateEncoding" method that is built into TXmlParser assumes that the application +wants to receive Windows ANSI (Windows-1252, about the same as ISO-8859-1) and is able +to convert UTF-8 and ISO-8859-1 encodings. +For other source and target encodings, you will have to override "TranslateEncoding". +=============================================================================================== +Buffer Handling +--------------- +- The document must be loaded completely into a piece of RAM +- All character positions are referenced by PChar pointers +- The TXmlParser instance can either "own" the buffer itself (then, FBufferSize is > 0) + or reference the buffer of another instance or object (then, FBuffersize is 0 and + FBuffer is not NIL) +- The Property DocBuffer passes back a pointer to the first byte of the document. If there + is no document stored (FBuffer is NIL), the DocBuffer returns a pointer to a NULL character. +=============================================================================================== +Whitespace Handling +------------------- +The TXmlParser property "Normalize" determines how Whitespace is returned in Text Content: +While Normalize is true, all leading and trailing whitespace characters are trimmed of, all +Whitespace is converted to Space #x20 characters and contiguous Whitespace characters are +compressed to one. +If the "Scan" method reports a ptContent part, the application can get the original text +with all whitespace characters by extracting the characters from "CurStart" to "CurFinal". +If the application detects an xml:space attribute, it can set "Normalize" accordingly or +use CurStart/CurFinal. +Please note that TXmlParser does _not_ normalize Line Breaks to single LineFeed characters +as the XMLSpec requires (XMLSpec 2.11). +The xml:space attribute is not handled by TXmlParser. This is on behalf of the application. +=============================================================================================== +Non-XML-Conforming +------------------ +TXmlParser does not conform 100 % exactly to the XMLSpec: +- UTF-16 is not supported (XMLSpec 2.2) + (Workaround: Convert UTF-16 to UTF-8 and hand the buffer over to TXmlParser) +- As the parser only works with single byte strings, all Unicode characters > 255 + can currently not be handled correctly. + (Workaround: Use UTF-8 and handle UTF-8 characters by your own code) +- Line breaks are not normalized to single Linefeed #x0A characters (XMLSpec 2.11) + (Workaround: The Application can access the text contents on its own [CurStart, CurFinal], + thereby applying every normalization it wishes to) +- The attribute value normalization does not work exactly as defined in the + Second Edition of the XML 1.0 specification. +- See also the code parts marked with three consecutive exclamation marks. These are + parts which are not finished in the current code release. + +This list may be incomplete, so it may grow if I get to know any other points. +As work on the parser proceeds, this list may also shrink. +=============================================================================================== +Things Todo +----------- +- Introduce a new event/callback which is called when there is an unresolvable + entity or character reference or another error in the XML +- Correctly Support Unicode +- Use Streams instead of reading the whole XML into memory +- Support the new UnicodeString type of Delphi 2009 and onwards +=============================================================================================== +Change History, Version numbers +------------------------------- +The Date is given in ISO Year-Month-Day (YYYY-MM-DD) order. +Versions are counted from 1.0.0 beginning with the version from 2000-03-16. +Unreleased versions don't get a version number. + +Date Author Version Changes +----------------------------------------------------------------------------------------------- +2000-03-16 HeySt 1.0.0 Start +2000-03-28 HeySt 1.0.1 Initial Publishing of TXmlParser on the destructor.de Web Site +2000-03-30 HeySt 1.0.2 TXmlParser.AnalyzeCData: Call "TranslateEncoding" for CurContent +2000-03-31 HeySt 1.0.3 Deleted the StrPosE function (was not needed anyway) +2000-04-04 HeySt 1.0.4 TDtdElementRec modified: Start/Final for all Elements; + Should be backwards compatible. + AnalyzeDtdc: Set CurPartType to ptDtdc +2000-04-23 HeySt 1.0.5 New class TObjectList. Eliminated reference to the Delphi 5 + "Contnrs" unit so LibXmlParser is Delphi 4 compatible. +2000-07-03 HeySt 1.0.6 TNvpNode: Added Constructor +2000-07-11 HeySt 1.0.7 Removed "Windows" from USES clause + Added three-exclamation-mark comments for Utf8ToAnsi/AnsiToUtf8 + Added three-exclamation-mark comments for CHR function calls +2000-07-23 HeySt 1.0.8 TXmlParser.Clear: CurAttr.Clear; EntityStack.Clear; + (This was not a bug; just defensive programming) +2000-07-29 HeySt 1.0.9 TNvpList: Added methods: Node(Index), Value(Index), Name(Index); +2000-10-07 HeySt Introduced Conditional Defines + Uses Contnrs unit and its TObjectList class again for + Delphi 5 and newer versions +2001-01-30 HeySt Introduced Version Numbering + Made LoadFromFile and LoadFromBuffer BOOLEAN functions + Introduced FileMode parameter for LoadFromFile + BugFix: TAttrList.Analyze: Must add CWhitespace to ExtractName call + Comments worked over +2001-02-28 HeySt 1.0.10 Completely worked over and tested the UTF-8 functions + Fixed a bug in TXmlParser.Scan which caused it to start over when it + was called after the end of scanning, resulting in an endless loop + TEntityStack is now a TObjectList instead of TList +2001-07-03 HeySt 1.0.11 Updated Compiler Version IFDEFs for Kylix +2001-07-11 HeySt 1.0.12 New TCustomXmlScanner component (taken over from LibXmlComps.pas) +2001-07-14 HeySt 1.0.13 Bugfix TCustomXmlScanner.FOnTranslateEncoding +2001-10-22 HeySt Don't clear CurName anymore when the parser finds a CDATA section. +2001-12-03 HeySt 1.0.14 TObjectList.Clear: Make call to INHERITED method (fixes a memory leak) +2001-12-05 HeySt 1.0.15 TObjectList.Clear: removed call to INHERITED method + TObjectList.Destroy: Inserted SetCapacity call. + Reduces need for frequent re-allocation of pointer buffer + Dedicated to my father, Theodor Heymann +2002-06-26 HeySt 1.0.16 TXmlParser.Scan: Fixed a bug with PIs whose name is beginning + with 'xml'. Thanks to Uwe Kamm for submitting this bug. + The CurEncoding property is now always in uppercase letters (the XML + spec wants it to be treated case independently so when it's uppercase + comparisons are faster) +2002-03-04 HeySt 1.0.17 Included an IFDEF for Delphi 7 (VER150) and Kylix + There is a new symbol HAS_CONTNRS_UNIT which is used now to + distinguish between IDEs which come with the Contnrs unit and + those that don't. +2005-07-05 HeySt 1.0.18 Changed old comments referring to "PackSpaces" to "Normalize". + (not publicly released) Reworked IFDEF section at the top to better reflect + Kylix, C++Builder, Delphi 8, and Delphi 2005/2006/2007. + Reworked attribute value normalization to completely conform + to XMLSpec 3.3.3. Deleted the ReplaceGeneralEntities method, which + is not needed anymore. + TXmlParser: Added a new virtual method TranslateCharacter to + translate Unicode character references. + TXmlScanner: Added a new event OnTranslateCharacter to + translate Unicode character references. + Handle (i.e. skip) UTF-8 BOMs. + Switch $R and $B off. + Set UTF-8 as default encoding in .Clear +2009-12-31 HeySt 1.0.19 Finished work at the attribute value normalization. + Delphi 2009/2010 compatibility + (no UnicodeString compatibility though, sorry) +2010-10-12 HeySt 1.0.20 Checked Delphi XE compatibility + Included a $DEFINE for FreePascal compatibility + CurContent is not reset to an empty string with every start tag. + I will keep this behaviour so old code doesn't get broken. + In case you need this you can set CurContent yourself at every + start tag. +*) + + +// --- Delphi/Kylix/C++Builder Version Numbers +// As this is no code, this does not blow up your object or executable code at all +// Versions that will not work with this code (Delphi 1-3, .NET) will see invalid code and stop the compiler here +// The defines D4_OR_NEWER and D5_OR_NEWER are only kept for backward compatibility. +// They are not used in this code anymore. + + (*$DEFINE HAS_CONTNRS_UNIT *) // The Contnrs Unit was introduced in Delphi 5 + (*$DEFINE D4_OR_NEWER *) // It's Delphi 4 or newer for backwards compatibility + (*$DEFINE D5_OR_NEWER *) // It's Delphi 5 or newer for backwards compatibility + // Delphi 1, C++Builder 1: + (*$IFDEF VER80 *)This Code will not compile in Delphi 1 (*$ENDIF*) + (*$IFDEF VER83 *)This Code will not compile in C++Builder 1 (*$ENDIF*) + // Delphi 2, C++Builder 2: + (*$IFDEF VER90 *)This Code will not compile in Delphi 2 (*$ENDIF*) + (*$IFDEF VER93 *)This Code will not compile in C++Builder 2 (*$ENDIF*) + // Delphi 3, C++Builder 3: + (*$IFDEF VER100 *)This Code will not compile in Delphi 3 (*$ENDIF*) + (*$IFDEF VER110 *)This Code will not compile in C++Builder 3 (*$ENDIF*) + // Delphi 4, C++Builder 4: + (*$IFDEF VER120 *)(*$UNDEFINE D5_OR_NEWER *) (*$UNDEFINE HAS_CONTNRS_UNIT *) (*$ENDIF *) + (*$IFDEF VER125 *)(*$UNDEFINE D5_OR_NEWER *) (*$UNDEFINE HAS_CONTNRS_UNIT *) (*$ENDIF *) + // Managed Code + (*$IFDEF MANAGEDCODE *)This code will not compile as Managed Code (*$ENDIF *) + (*$IFDEF CLR *) This code will not compile as Managed Code (*$ENDIF *) + (*$IFDEF FPC *) (*$MODE delphi *) (*$ENDIF *) // It's FreePascal + + +(*$R- Switch Range Checking Off *) +(*$B- Switch Complete Boolean Evaluation Off *) + +UNIT LibXmlParser; + +INTERFACE + +USES + SysUtils, Classes, + (*$IFDEF HAS_CONTNRS_UNIT *) + Contnrs, + (*$ENDIF*) + Math; + +CONST + CVersion = '1.0.20'; // This variable will be updated for every release + // (I hope, I won't forget to do it everytime ...) + CUnknownChar = '?'; // Replacement for unknown/untransformable character references + +TYPE + TCharType = PAnsiChar; + TStringType = Utf8String; + + TPartType = // --- Document Part Types + (ptNone, // Nothing + ptXmlProlog, // XML Prolog XmlSpec 2.8 / 4.3.1 + ptComment, // Comment XmlSpec 2.5 + ptPI, // Processing Instruction XmlSpec 2.6 + ptDtdc, // Document Type Declaration XmlSpec 2.8 + ptStartTag, // Start Tag XmlSpec 3.1 + ptEmptyTag, // Empty-Element Tag XmlSpec 3.1 + ptEndTag, // End Tag XmlSpec 3.1 + ptContent, // Text Content between Tags + ptCData); // CDATA Section XmlSpec 2.7 + + TDtdElemType = // --- DTD Elements + (deElement, // !ELEMENT declaration + deAttList, // !ATTLIST declaration + deEntity, // !ENTITY declaration + deNotation, // !NOTATION declaration + dePI, // PI in DTD + deComment, // Comment in DTD + deError); // Error found in the DTD + +TYPE + TAttrList = CLASS; + TEntityStack = CLASS; + TNvpList = CLASS; + TElemDef = CLASS; + TElemList = CLASS; + TEntityDef = CLASS; + TNotationDef = CLASS; + + TDtdElementRec = RECORD // --- This Record is returned by the DTD parser callback function + Start, Final : TCharType; // Start/End of the Element's Declaration + CASE ElementType : TDtdElemType OF // Type of the Element + deElement, // + deAttList : (ElemDef : TElemDef); // + deEntity : (EntityDef : TEntityDef); // + deNotation : (NotationDef : TNotationDef); // + dePI : (Target : TCharType; // + Content : TCharType; + AttrList : TAttrList); + deError : (Pos : TCharType); // Error + // deComment : ((No additional fields here)); // + END; + + TXmlParser = CLASS // --- Internal Properties and Methods + PROTECTED + FBuffer : TCharType; // NIL if there is no buffer available + FBufferSize : INTEGER; // 0 if the buffer is not owned by the Document instance + FSource : STRING; // Name of Source of document. Filename for Documents loaded with LoadFromFile + + FXmlVersion : TStringType; // XML version from Document header. Default is '1.0' + FEncoding : TStringType; // Encoding from Document header. Default is 'UTF-8' + FStandalone : BOOLEAN; // Standalone declaration from Document header. Default is 'yes' + FRootName : TStringType; // Name of the Root Element (= DTD name) + FDtdcFinal : TCharType; // Pointer to the '>' character terminating the DTD declaration + + FNormalize : BOOLEAN; // If true: Pack Whitespace and don't return empty contents + EntityStack : TEntityStack; // Entity Stack for Parameter and General Entities + FCurEncoding : TStringType; // Current Encoding during parsing (always uppercase) + + PROCEDURE AnalyzeProlog; // Analyze XML Prolog or Text Declaration + PROCEDURE AnalyzeComment (Start : TCharType; VAR Final : TCharType); // Analyze Comments + PROCEDURE AnalyzePI (Start : TCharType; VAR Final : TCharType); // Analyze Processing Instructions (PI) + PROCEDURE AnalyzeDtdc; // Analyze Document Type Declaration + PROCEDURE AnalyzeDtdElements (Start : TCharType; VAR Final : TCharType); // Analyze DTD declarations + PROCEDURE AnalyzeTag; // Analyze Start/End/Empty-Element Tags + PROCEDURE AnalyzeCData; // Analyze CDATA Sections + PROCEDURE AnalyzeText (VAR IsDone : BOOLEAN); // Analyze Text Content between Tags + PROCEDURE AnalyzeElementDecl (Start : TCharType; VAR Final : TCharType); + PROCEDURE AnalyzeAttListDecl (Start : TCharType; VAR Final : TCharType); + PROCEDURE AnalyzeEntityDecl (Start : TCharType; VAR Final : TCharType); + PROCEDURE AnalyzeNotationDecl (Start : TCharType; VAR Final : TCharType); + + PROCEDURE PushPE (VAR Start : TCharType); + PROCEDURE ReplaceCharacterEntities (VAR Str : TStringType); + PROCEDURE ReplaceParameterEntities (VAR Str : TStringType); + + FUNCTION GetDocBuffer : TCharType; // Returns FBuffer or a pointer to a NUL char if Buffer is empty + + PUBLIC // --- Document Properties + PROPERTY XmlVersion : TStringType READ FXmlVersion; // XML version from the Document Prolog + PROPERTY Encoding : TStringType READ FEncoding; // Document Encoding from Prolog + PROPERTY Standalone : BOOLEAN READ FStandalone; // Standalone Declaration from Prolog + PROPERTY RootName : TStringType READ FRootName; // Name of the Root Element + PROPERTY Normalize : BOOLEAN READ FNormalize WRITE FNormalize; // True if Content is to be normalized + PROPERTY Source : STRING READ FSource; // Name of Document Source (Filename) + PROPERTY DocBuffer : TCharType READ GetDocBuffer; // Returns document buffer + PUBLIC // --- DTD Objects + Elements : TElemList; // Elements: List of TElemDef (contains Attribute Definitions) + Entities : TNvpList; // General Entities: List of TEntityDef + ParEntities : TNvpList; // Parameter Entities: List of TEntityDef + Notations : TNvpList; // Notations: List of TNotationDef + PUBLIC + CONSTRUCTOR Create; + DESTRUCTOR Destroy; OVERRIDE; + + // --- Document Handling + FUNCTION LoadFromFile (Filename : STRING; + FileMode : INTEGER = fmOpenRead OR fmShareDenyNone) : BOOLEAN; + // Loads Document from given file + FUNCTION LoadFromBuffer (Buffer : TCharType) : BOOLEAN; // Loads Document from another buffer + PROCEDURE SetBuffer (Buffer : TCharType); // References another buffer + PROCEDURE Clear; // Clear Document + + PUBLIC + // --- Scanning through the document + CurPartType : TPartType; // Current Type + CurName : TStringType; // Current Name + CurContent : TStringType; // Current Normalized Content + CurStart : TCharType; // Current First character + CurFinal : TCharType; // Current Last character + CurAttr : TAttrList; // Current Attribute List + PROPERTY CurEncoding : TStringType READ FCurEncoding; // Current Encoding (always uppercase) + PROCEDURE StartScan; + FUNCTION Scan : BOOLEAN; + + // --- Events / Callbacks + FUNCTION LoadExternalEntity (SystemId, PublicId, + Notation : TStringType) : TXmlParser; VIRTUAL; + FUNCTION TranslateEncoding (CONST Source : TStringType) : TStringType; VIRTUAL; + FUNCTION TranslateCharacter (CONST UnicodeValue : INTEGER; + CONST UnknownChar : TStringType = CUnknownChar) : TStringType; VIRTUAL; + PROCEDURE DtdElementFound (DtdElementRec : TDtdElementRec); VIRTUAL; + END; + + TValueType = // --- Attribute Value Type + (vtNormal, // Normal specified Attribute + vtImplied, // #IMPLIED attribute value + vtFixed, // #FIXED attribute value + vtDefault); // Attribute value from default value in !ATTLIST declaration + + TAttrDefault = // --- Attribute Default Type + (adDefault, // Normal default value + adRequired, // #REQUIRED attribute + adImplied, // #IMPLIED attribute + adFixed); // #FIXED attribute + + TAttrType = // --- Type of attribute + (atUnknown, // Unknown type + atCData, // Character data only + atID, // ID + atIdRef, // ID Reference + atIdRefs, // Several ID References, separated by Whitespace + atEntity, // Name of an unparsed Entity + atEntities, // Several unparsed Entity names, separated by Whitespace + atNmToken, // Name Token + atNmTokens, // Several Name Tokens, separated by Whitespace + atNotation, // A selection of Notation names (Unparsed Entity) + atEnumeration); // Enumeration + + TElemType = // --- Element content type + (etEmpty, // Element is always empty + etAny, // Element can have any mixture of PCDATA and any elements + etChildren, // Element must contain only elements + etMixed); // Mixed PCDATA and elements + + (*$IFDEF HAS_CONTNRS_UNIT *) + TObjectList = Contnrs.TObjectList; // Re-Export this identifier + (*$ELSE *) + TObjectList = CLASS (TList) + DESTRUCTOR Destroy; OVERRIDE; + PROCEDURE Delete (Index : INTEGER); + PROCEDURE Clear; OVERRIDE; + END; + (*$ENDIF *) + + TNvpNode = CLASS // Name-Value Pair Node + Name : TStringType; + Value : TStringType; + CONSTRUCTOR Create (TheName : TStringType = ''; TheValue : TStringType = ''); + END; + + TNvpList = CLASS (TObjectList) // Name-Value Pair List + PROCEDURE Add (Node : TNvpNode); + FUNCTION Node (Name : TStringType) : TNvpNode; OVERLOAD; + FUNCTION Node (Index : INTEGER) : TNvpNode; OVERLOAD; + FUNCTION Value (Name : TStringType) : TStringType; OVERLOAD; + FUNCTION Value (Index : INTEGER) : TStringType; OVERLOAD; + FUNCTION Name (Index : INTEGER) : TStringType; + END; + + TAttr = CLASS (TNvpNode) // Attribute of a Start-Tag or Empty-Element-Tag + ValueType : TValueType; + AttrType : TAttrType; + END; + + TAttrList = CLASS (TNvpList) // List of Attributes + PROCEDURE Analyze (Start : TCharType; VAR Final : TCharType); + END; + + TEntityStack = CLASS (TObjectList) // Stack where current position is stored before parsing entities + PROTECTED + Owner : TXmlParser; + PUBLIC + CONSTRUCTOR Create (TheOwner : TXmlParser); + PROCEDURE Push (LastPos : TCharType); OVERLOAD; + PROCEDURE Push (Instance : TObject; LastPos : TCharType); OVERLOAD; + FUNCTION Pop : TCharType; // Returns next char or NIL if EOF is reached. Frees Instance. + END; + + TAttrDef = CLASS (TNvpNode) // Represents a '; + + CUtf8BOM = #$EF#$BB#$BF; // The Byte Order Mark (U+FEFF) coded in UTF-8 + + // --- Name Constants for the above enumeration types + CPartType_Name : ARRAY [TPartType] OF TStringType = + ('', 'XML Prolog', 'Comment', 'PI', + 'DTD Declaration', 'Start Tag', 'Empty Tag', 'End Tag', + 'Text', 'CDATA'); + CValueType_Name : ARRAY [TValueType] OF TStringType = ('Normal', 'Implied', 'Fixed', 'Default'); + CAttrDefault_Name : ARRAY [TAttrDefault] OF TStringType = ('Default', 'Required', 'Implied', 'Fixed'); + CElemType_Name : ARRAY [TElemType] OF TStringType = ('Empty', 'Any', 'Childs only', 'Mixed'); + CAttrType_Name : ARRAY [TAttrType] OF TStringType = ('Unknown', 'CDATA', + 'ID', 'IDREF', 'IDREFS', + 'ENTITY', 'ENTITIES', + 'NMTOKEN', 'NMTOKENS', + 'Notation', 'Enumeration'); + +FUNCTION ConvertWs (Source: TStringType; PackWs: BOOLEAN) : TStringType; // Convert WS to spaces #x20 +PROCEDURE SetStringSF (VAR S : TStringType; BufferStart, BufferFinal : TCharType); // SetString by Start/Final of buffer +FUNCTION StrSFPas (Start, Finish : TCharType) : TStringType; // Convert buffer part to Pascal string +FUNCTION TrimWs (Source : TStringType) : TStringType; // Trim Whitespace + +(* +=============================================================================================== +TCustomXmlScanner: event based component wrapper for TXmlParser +=============================================================================================== +*) + +TYPE + TXmlPrologEvent = PROCEDURE (Sender : TObject; XmlVersion, Encoding: String; Standalone : BOOLEAN) OF OBJECT; + TCommentEvent = PROCEDURE (Sender : TObject; Comment : String) OF OBJECT; + TPIEvent = PROCEDURE (Sender : TObject; Target, Content: String; Attributes : TAttrList) OF OBJECT; + TDtdEvent = PROCEDURE (Sender : TObject; RootElementName : String) OF OBJECT; + TStartTagEvent = PROCEDURE (Sender : TObject; TagName : String; Attributes : TAttrList) OF OBJECT; + TEndTagEvent = PROCEDURE (Sender : TObject; TagName : String) OF OBJECT; + TContentEvent = PROCEDURE (Sender : TObject; Content : String) OF OBJECT; + TElementEvent = PROCEDURE (Sender : TObject; ElemDef : TElemDef) OF OBJECT; + TEntityEvent = PROCEDURE (Sender : TObject; EntityDef : TEntityDef) OF OBJECT; + TNotationEvent = PROCEDURE (Sender : TObject; NotationDef : TNotationDef) OF OBJECT; + TErrorEvent = PROCEDURE (Sender : TObject; ErrorPos : TCharType) OF OBJECT; + TExternalEvent = PROCEDURE (Sender : TObject; SystemId, PublicId, NotationId : String; + VAR Result : TXmlParser) OF OBJECT; + TEncodingEvent = FUNCTION (Sender : TObject; CurrentEncoding, Source : String) : String OF OBJECT; + TEncodeCharEvent = FUNCTION (Sender : TObject; UnicodeValue : INTEGER) : String OF OBJECT; + + TCustomXmlScanner = CLASS (TComponent) + PROTECTED + FXmlParser : TXmlParser; + FOnXmlProlog : TXmlPrologEvent; + FOnComment : TCommentEvent; + FOnPI : TPIEvent; + FOnDtdRead : TDtdEvent; + FOnStartTag : TStartTagEvent; + FOnEmptyTag : TStartTagEvent; + FOnEndTag : TEndTagEvent; + FOnContent : TContentEvent; + FOnCData : TContentEvent; + FOnElement : TElementEvent; + FOnAttList : TElementEvent; + FOnEntity : TEntityEvent; + FOnNotation : TNotationEvent; + FOnDtdError : TErrorEvent; + FOnLoadExternal : TExternalEvent; + FOnTranslateEncoding : TEncodingEvent; + FOnTranslateCharacter : TEncodeCharEvent; + FStopParser : BOOLEAN; + FUNCTION GetNormalize : BOOLEAN; + PROCEDURE SetNormalize (Value : BOOLEAN); + + PROCEDURE WhenXmlProlog(XmlVersion, Encoding: String; Standalone : BOOLEAN); VIRTUAL; + PROCEDURE WhenComment (Comment : String); VIRTUAL; + PROCEDURE WhenPI (Target, Content: String; Attributes : TAttrList); VIRTUAL; + PROCEDURE WhenDtdRead (RootElementName : String); VIRTUAL; + PROCEDURE WhenStartTag (TagName : String; Attributes : TAttrList); VIRTUAL; + PROCEDURE WhenEmptyTag (TagName : String; Attributes : TAttrList); VIRTUAL; + PROCEDURE WhenEndTag (TagName : String); VIRTUAL; + PROCEDURE WhenContent (Content : String); VIRTUAL; + PROCEDURE WhenCData (Content : String); VIRTUAL; + PROCEDURE WhenElement (ElemDef : TElemDef); VIRTUAL; + PROCEDURE WhenAttList (ElemDef : TElemDef); VIRTUAL; + PROCEDURE WhenEntity (EntityDef : TEntityDef); VIRTUAL; + PROCEDURE WhenNotation (NotationDef : TNotationDef); VIRTUAL; + PROCEDURE WhenDtdError (ErrorPos : TCharType); VIRTUAL; + + PUBLIC + CONSTRUCTOR Create (AOwner: TComponent); OVERRIDE; + DESTRUCTOR Destroy; OVERRIDE; + + PROCEDURE LoadFromFile (Filename : TFilename); // Load XML Document from file + PROCEDURE LoadFromBuffer (Buffer : TCharType); // Load XML Document from buffer + PROCEDURE SetBuffer (Buffer : TCharType); // Refer to Buffer + FUNCTION GetFilename : TFilename; + + PROCEDURE Execute; // Perform scanning + + PROTECTED + PROPERTY XmlParser : TXmlParser READ FXmlParser; + PROPERTY StopParser : BOOLEAN READ FStopParser WRITE FStopParser; + PROPERTY Filename : TFilename READ GetFilename WRITE LoadFromFile; + PROPERTY Normalize : BOOLEAN READ GetNormalize WRITE SetNormalize; + PROPERTY OnXmlProlog : TXmlPrologEvent READ FOnXmlProlog WRITE FOnXmlProlog; + PROPERTY OnComment : TCommentEvent READ FOnComment WRITE FOnComment; + PROPERTY OnPI : TPIEvent READ FOnPI WRITE FOnPI; + PROPERTY OnDtdRead : TDtdEvent READ FOnDtdRead WRITE FOnDtdRead; + PROPERTY OnStartTag : TStartTagEvent READ FOnStartTag WRITE FOnStartTag; + PROPERTY OnEmptyTag : TStartTagEvent READ FOnEmptyTag WRITE FOnEmptyTag; + PROPERTY OnEndTag : TEndTagEvent READ FOnEndTag WRITE FOnEndTag; + PROPERTY OnContent : TContentEvent READ FOnContent WRITE FOnContent; + PROPERTY OnCData : TContentEvent READ FOnCData WRITE FOnCData; + PROPERTY OnElement : TElementEvent READ FOnElement WRITE FOnElement; + PROPERTY OnAttList : TElementEvent READ FOnAttList WRITE FOnAttList; + PROPERTY OnEntity : TEntityEvent READ FOnEntity WRITE FOnEntity; + PROPERTY OnNotation : TNotationEvent READ FOnNotation WRITE FOnNotation; + PROPERTY OnDtdError : TErrorEvent READ FOnDtdError WRITE FOnDtdError; + PROPERTY OnLoadExternal : TExternalEvent READ FOnLoadExternal WRITE FOnLoadExternal; + PROPERTY OnTranslateEncoding : TEncodingEvent READ FOnTranslateEncoding WRITE FOnTranslateEncoding; + PROPERTY OnTranslateCharacter : TEncodeCharEvent READ FOnTranslateCharacter WRITE FOnTranslateCharacter; + END; + +(* +=============================================================================================== +IMPLEMENTATION +=============================================================================================== +*) + +IMPLEMENTATION + +(* +=============================================================================================== +"Special" Helper Functions + +Don't ask me why. But including these functions makes the parser *DRAMATICALLY* faster +on my K6-233 and Pentium-M machine. You can test it yourself just by commenting them out. +They do exactly the same as the Assembler routines defined in SysUtils. +(This is where you can see how great the Delphi compiler really is. The compiled code is +faster than hand-coded assembler! :-) +=============================================================================================== +--> Just move this line below the StrScan function --> *) + +FUNCTION StrPos (CONST Str, SearchStr : TCharType) : TCharType; + // Same functionality as SysUtils.StrPos +VAR + First : ANSICHAR; + Len : INTEGER; +BEGIN + First := SearchStr^; + Len := StrLen (SearchStr); + Result := Str; + REPEAT + IF Result^ = First THEN + IF StrLComp (Result, SearchStr, Len) = 0 THEN BREAK; + IF Result^ = #0 THEN BEGIN + Result := NIL; + BREAK; + END; + INC (Result); + UNTIL FALSE; +END; + + +FUNCTION StrScan (CONST Start : TCharType; CONST Ch : ANSICHAR) : TCharType; + // Same functionality as SysUtils.StrScan +BEGIN + Result := Start; + WHILE Result^ <> Ch DO BEGIN + IF Result^ = #0 THEN BEGIN + Result := NIL; + EXIT; + END; + INC (Result); + END; +END; + + +(* +=============================================================================================== +Helper Functions +=============================================================================================== +*) + +FUNCTION DelChars (Source : TStringType; CharsToDelete : TCharset) : TStringType; + // Delete all "CharsToDelete" from the string +VAR + I : INTEGER; +BEGIN + Result := Source; + FOR I := Length (Result) DOWNTO 1 DO + IF Result [I] IN CharsToDelete THEN + Delete (Result, I, 1); +END; + +FUNCTION TrimWs (Source : TStringType) : TStringType; + // Trimms off Whitespace characters from both ends of the string +VAR + I : INTEGER; +BEGIN + // --- Trim Left + I := 1; + WHILE (I <= Length (Source)) AND (Source [I] IN CWhitespace) DO + INC (I); + Result := Copy (Source, I, MaxInt); + + // --- Trim Right + I := Length (Result); + WHILE (I > 1) AND (Result [I] IN CWhitespace) DO + DEC (I); + Delete (Result, I+1, Length (Result)-I); +END; + + +FUNCTION TrimAndPackSpace (Source : TStringType) : TStringType; + // Trim and pack contiguous space (#x20) characters + // Needed for attribute value normalization of non-CDATA attributes (XMLSpec 3.3.3) +VAR + I, T : INTEGER; +BEGIN + // --- Trim Left + T := 1; + FOR I := 1 to Length (Source) DO + IF Source [I] = #32 + THEN INC (T) + ELSE BREAK; + IF T > 1 + THEN Result := Copy (Source, T, MaxInt) + ELSE Result := Source; + + // --- Trim Right + I := Length (Result); + WHILE (I > 1) AND (Result [I] = #32) DO + DEC (I); + Delete (Result, I+1, Length (Result)-I); + + // --- Pack + FOR I := Length (Result) DOWNTO 2 DO + IF (Result [I] = #32) AND (Result [I-1] = #32) THEN + Delete (Result, I, 1); +END; + + +FUNCTION ConvertWs (Source: TStringType; PackWs: BOOLEAN) : TStringType; + // Converts all Whitespace characters to the Space #x20 character + // If "PackWs" is true, contiguous Whitespace characters are packed to one +VAR + I : INTEGER; +BEGIN + Result := Source; + FOR I := Length (Result) DOWNTO 1 DO + IF (Result [I] IN CWhitespace) THEN + IF PackWs AND (I > 1) AND (Result [I-1] IN CWhitespace) + THEN Delete (Result, I, 1) + ELSE Result [I] := #32; +END; + + + + +PROCEDURE SetStringSF (VAR S : TStringType; BufferStart, BufferFinal : TCharType); +BEGIN + SetString (S, BufferStart, BufferFinal-BufferStart+1); +END; + + +FUNCTION StrLPas (Start : TCharType; Len : INTEGER) : TStringType; +BEGIN + SetString (Result, Start, Len); +END; + + +FUNCTION StrSFPas (Start, Finish : TCharType) : TStringType; +BEGIN + SetString (Result, Start, Finish-Start+1); +END; + + +FUNCTION StrScanE (CONST Source : TCharType; CONST CharToScanFor : ANSICHAR) : TCharType; + // If "CharToScanFor" is not found, StrScanE returns the last char of the + // buffer instead of NIL +BEGIN + Result := StrScan (Source, CharToScanFor); + IF Result = NIL THEN + Result := StrEnd (Source)-1; +END; + + +PROCEDURE ExtractName (Start : TCharType; Terminators : TCharset; VAR Final : TCharType); + (* Extracts the complete Name beginning at "Start". + It is assumed that the name is contained in Markup, so the '>' character is + always a Termination. + Start: IN Pointer to first char of name. Is always considered to be valid + Terminators: IN Characters which terminate the name + Final: OUT Pointer to last char of name *) +BEGIN + Final := Start; + Include (Terminators, #0); + Include (Terminators, '>'); + WHILE NOT ((Final + 1)^ IN Terminators) DO + INC (Final); +END; + + +PROCEDURE ExtractQuote (Start : TCharType; VAR Content : TStringType; VAR Final : TCharType); + (* Extract a string which is contained in single or double Quotes. + Start: IN Pointer to opening quote + Content: OUT The quoted string + Final: OUT Pointer to closing quote *) +BEGIN + Final := StrScan (Start+1, Start^); + IF Final = NIL THEN BEGIN + Final := StrEnd (Start+1)-1; + SetString (Content, Start+1, Final-Start); + END + ELSE + SetString (Content, Start+1, Final-1-Start); +END; + + +(* +=============================================================================================== +TEntityStackNode +This Node is pushed to the "Entity Stack" whenever the parser parses entity replacement text. +The "Instance" field holds the Instance pointer of an External Entity buffer. When it is +popped, the Instance is freed. +The "Encoding" field holds the name of the Encoding. External Parsed Entities may have +another encoding as the document entity (XmlSpec 4.3.3). So when there is an " 0 THEN BEGIN + ESN := TEntityStackNode (Items [Count-1]); + Result := ESN.LastPos; + IF ESN.Instance <> NIL THEN + ESN.Instance.Free; + IF ESN.Encoding <> '' THEN + Owner.FCurEncoding := ESN.Encoding; // Restore current Encoding + Delete (Count-1); + END + ELSE + Result := NIL; +END; + + +(* +=============================================================================================== +TExternalID +----------- +XmlSpec 4.2.2: ExternalID ::= 'SYSTEM' S SystemLiteral | + 'PUBLIC' S PubidLiteral S SystemLiteral +XmlSpec 4.7: PublicID ::= 'PUBLIC' S PubidLiteral +SystemLiteral and PubidLiteral are quoted +=============================================================================================== +*) + +TYPE + TExternalID = CLASS + PublicId : TStringType; + SystemId : TStringType; + Final : TCharType; + CONSTRUCTOR Create (Start : TCharType); + END; + +CONSTRUCTOR TExternalID.Create (Start : TCharType); +BEGIN + INHERITED Create; + Final := Start; + IF StrLComp (Start, 'SYSTEM', 6) = 0 THEN BEGIN + WHILE NOT (Final^ IN (CQuoteChar + [#0, '>', '['])) DO INC (Final); + IF NOT (Final^ IN CQuoteChar) THEN EXIT; + ExtractQuote (Final, SystemID, Final); + END + ELSE IF StrLComp (Start, 'PUBLIC', 6) = 0 THEN BEGIN + WHILE NOT (Final^ IN (CQuoteChar + [#0, '>', '['])) DO INC (Final); + IF NOT (Final^ IN CQuoteChar) THEN EXIT; + ExtractQuote (Final, PublicID, Final); + INC (Final); + WHILE NOT (Final^ IN (CQuoteChar + [#0, '>', '['])) DO INC (Final); + IF NOT (Final^ IN CQuoteChar) THEN EXIT; + ExtractQuote (Final, SystemID, Final); + END; +END; + + +(* +=============================================================================================== +TXmlParser +=============================================================================================== +*) + +CONSTRUCTOR TXmlParser.Create; +BEGIN + INHERITED Create; + FBuffer := NIL; + FBufferSize := 0; + Elements := TElemList.Create; + Entities := TNvpList.Create; + ParEntities := TNvpList.Create; + Notations := TNvpList.Create; + CurAttr := TAttrList.Create; + EntityStack := TEntityStack.Create (Self); + Clear; +END; + + +DESTRUCTOR TXmlParser.Destroy; +BEGIN + Clear; + Elements.Free; + Entities.Free; + ParEntities.Free; + Notations.Free; + CurAttr.Free; + EntityStack.Free; + INHERITED Destroy; +END; + + +PROCEDURE TXmlParser.Clear; + // Free Buffer and clear all object attributes +BEGIN + IF (FBufferSize > 0) AND (FBuffer <> NIL) THEN + FreeMem (FBuffer); + FBuffer := NIL; + FBufferSize := 0; + FSource := ''; + FXmlVersion := ''; + FEncoding := 'UTF-8'; + FCurEncoding := 'UTF-8'; + FStandalone := FALSE; + FRootName := ''; + FDtdcFinal := NIL; + FNormalize := TRUE; + Elements.Clear; + Entities.Clear; + ParEntities.Clear; + Notations.Clear; + CurAttr.Clear; + EntityStack.Clear; +END; + + +FUNCTION TXmlParser.LoadFromFile (Filename : string; FileMode : INTEGER = fmOpenRead OR fmShareDenyNone) : BOOLEAN; + // Loads Document from given file + // Returns TRUE if successful +VAR + f : FILE; + ReadIn : INTEGER; + OldFileMode : INTEGER; +BEGIN + Result := FALSE; + Clear; + + // --- Open File + OldFileMode := SYSTEM.FileMode; + TRY + SYSTEM.FileMode := FileMode; + TRY + AssignFile (f, Filename); + Reset (f, 1); + EXCEPT + EXIT; + END; + + TRY + // --- Allocate Memory + TRY + FBufferSize := Filesize (f) + 1; + GetMem (FBuffer, FBufferSize); + EXCEPT + Clear; + EXIT; + END; + + // --- Read File + TRY + BlockRead (f, FBuffer^, FBufferSize, ReadIn); + (FBuffer+ReadIn)^ := #0; // NULL termination + EXCEPT + Clear; + EXIT; + END; + FINALLY + CloseFile (f); + END; + + FSource := Filename; + Result := TRUE; + + FINALLY + SYSTEM.FileMode := OldFileMode; + END; +END; + + +FUNCTION TXmlParser.LoadFromBuffer (Buffer : TCharType) : BOOLEAN; + // Loads Document from another buffer + // Returns TRUE if successful + // The "Source" property becomes '' if successful +BEGIN + Result := FALSE; + Clear; + FBufferSize := StrLen (Buffer) + 1; + TRY + GetMem (FBuffer, FBufferSize); + EXCEPT + Clear; + EXIT; + END; + StrCopy (FBuffer, Buffer); + FSource := ''; + Result := TRUE; +END; + + +PROCEDURE TXmlParser.SetBuffer (Buffer : TCharType); // References another buffer +BEGIN + Clear; + FBuffer := Buffer; + FBufferSize := 0; + FSource := ''; +END; + + +//----------------------------------------------------------------------------------------------- +// Scanning through the document +//----------------------------------------------------------------------------------------------- + +PROCEDURE TXmlParser.StartScan; +BEGIN + CurPartType := ptNone; + CurName := ''; + CurContent := ''; + CurStart := NIL; + CurFinal := NIL; + CurAttr.Clear; + EntityStack.Clear; +END; + + +FUNCTION TXmlParser.Scan : BOOLEAN; + // Scans the next Part + // Returns TRUE if a part could be found, FALSE if there is no part any more + // + // "IsDone" can be set to FALSE by AnalyzeText in order to go to the next part + // if there is no Content due to normalization +VAR + IsDone : BOOLEAN; +BEGIN + REPEAT + IsDone := TRUE; + + // --- Start of next Part + IF CurStart = NIL THEN BEGIN + CurStart := DocBuffer; + IF StrLComp (CurStart, CUtf8BOM, 3) = 0 THEN BEGIN + INC (CurStart, 3); // Skip UTF-8 BOM + FEncoding := 'UTF-8'; + END; + END + ELSE + CurStart := CurFinal+1; + CurFinal := CurStart; + + // --- End of Document or Pop off a new part from the Entity stack? + IF CurStart^ = #0 THEN + CurStart := EntityStack.Pop; + + // --- No Document or End Of Document: Terminate Scan + IF (CurStart = NIL) OR (CurStart^ = #0) THEN BEGIN + CurStart := StrEnd (DocBuffer); + CurFinal := CurStart-1; + EntityStack.Clear; + Result := FALSE; + EXIT; + END; + + IF (StrLComp (CurStart, ''); + IF CurFinal <> NIL + THEN INC (CurFinal) + ELSE CurFinal := StrEnd (CurStart)-1; + FCurEncoding := CurAttr.Value ('encoding'); + IF FCurEncoding = '' THEN + FCurEncoding := 'UTF-8'; // Default XML Encoding is UTF-8 + AnsiStrupper (TCharType (FCurEncoding)); + CurPartType := ptXmlProlog; + CurName := ''; + CurContent := ''; +END; + + +PROCEDURE TXmlParser.AnalyzeComment (Start : TCharType; VAR Final : TCharType); + // Analyze Comments +BEGIN + Final := StrPos (Start+4, '-->'); + IF Final = NIL + THEN Final := StrEnd (Start)-1 + ELSE INC (Final, 2); + CurPartType := ptComment; +END; + + +PROCEDURE TXmlParser.AnalyzePI (Start : TCharType; VAR Final : TCharType); + // Analyze Processing Instructions (PI) +VAR + F : TCharType; +BEGIN + CurPartType := ptPI; + Final := StrPos (Start+2, '?>'); + IF Final = NIL + THEN Final := StrEnd (Start)-1 + ELSE INC (Final); + ExtractName (Start+2, CWhitespace + ['?', '>'], F); + SetStringSF (CurName, Start+2, F); + SetStringSF (CurContent, F+1, Final-2); + CurAttr.Analyze (F+1, F); +END; + + +PROCEDURE TXmlParser.AnalyzeDtdc; + (* Analyze Document Type Declaration + doctypedecl ::= '' + markupdecl ::= elementdecl | AttlistDecl | EntityDecl | NotationDecl | PI | Comment + PEReference ::= '%' Name ';' + + elementdecl ::= '' + AttlistDecl ::= '' + EntityDecl ::= '' | + '' + NotationDecl ::= '' + PI ::= '' Char* )))? '?>' + Comment ::= '' *) +TYPE + TPhase = (phName, phDtd, phInternal, phFinishing); +VAR + Phase : TPhase; + F : TCharType; + ExternalID : TExternalID; + ExternalDTD : TXmlParser; + DER : TDtdElementRec; +BEGIN + DER.Start := CurStart; + EntityStack.Clear; // Clear stack for Parameter Entities + CurPartType := ptDtdc; + + // --- Don't read DTDc twice + IF FDtdcFinal <> NIL THEN BEGIN + CurFinal := FDtdcFinal; + EXIT; + END; + + // --- Scan DTDc + CurFinal := CurStart + 9; // First char after '' : BREAK; + ELSE IF NOT (CurFinal^ IN CWhitespace) THEN BEGIN + CASE Phase OF + phName : IF (CurFinal^ IN CNameStart) THEN BEGIN + ExtractName (CurFinal, CWhitespace + ['[', '>'], F); + SetStringSF (FRootName, CurFinal, F); + CurFinal := F; + Phase := phDtd; + END; + phDtd : IF (StrLComp (CurFinal, 'SYSTEM', 6) = 0) OR + (StrLComp (CurFinal, 'PUBLIC', 6) = 0) THEN BEGIN + ExternalID := TExternalID.Create (CurFinal); + ExternalDTD := NIL; + TRY + ExternalDTD := LoadExternalEntity (ExternalId.SystemId, ExternalID.PublicId, ''); + F := StrPos (ExternalDtd.DocBuffer, ' NIL THEN + AnalyzeDtdElements (F, F); + CurFinal := ExternalID.Final; + FINALLY + ExternalDTD.Free; + ExternalID.Free; + END; + END; + ELSE BEGIN + DER.ElementType := deError; + DER.Pos := CurFinal; + DER.Final := CurFinal; + DtdElementFound (DER); + END; + END; + + END; + END; + INC (CurFinal); + UNTIL FALSE; + + CurPartType := ptDtdc; + CurName := ''; + CurContent := ''; + + // -!- It is an error in the document if "EntityStack" is not empty now + IF EntityStack.Count > 0 THEN BEGIN + DER.ElementType := deError; + DER.Final := CurFinal; + DER.Pos := CurFinal; + DtdElementFound (DER); + END; + + EntityStack.Clear; // Clear stack for General Entities + FDtdcFinal := CurFinal; +END; + + +PROCEDURE TXmlParser.AnalyzeDtdElements (Start : TCharType; VAR Final : TCharType); + // Analyze the "Elements" of a DTD contained in the external or + // internal DTD subset. +VAR + DER : TDtdElementRec; +BEGIN + Final := Start; + REPEAT + CASE Final^ OF + '%' : BEGIN + PushPE (Final); + CONTINUE; + END; + #0 : IF EntityStack.Count = 0 THEN + BREAK + ELSE BEGIN + CurFinal := EntityStack.Pop; + CONTINUE; + END; + ']', + '>' : BREAK; + '<' : IF StrLComp (Final, ' NIL then begin + EntLen := PSemi - TCharType (Str) - i; + EntName := Copy (Str, i + 1, EntLen); + IF EntName = 'lt' THEN Repl := '<' + ELSE IF EntName = 'gt' THEN Repl := '>' + ELSE IF EntName = 'amp' THEN Repl := '&' + ELSE IF EntName = 'apos' THEN Repl := '''' + ELSE IF EntName = 'quot' THEN Repl := '"' + ELSE IF Copy (EntName, 1, 1) = '#' THEN BEGIN // Character Reference + IF EntName [2] = 'x' + THEN Repl := TranslateCharacter(StrToIntDef ('$' + Copy (string (EntName), 3, MaxInt), ord (CUnknownChar))) + ELSE Repl := TranslateCharacter(StrToIntDef ( Copy (string (EntName), 2, MaxInt), ord (CUnknownChar))); + END + ELSE BEGIN // Resolve General Entity Reference + EntityDef := TEntityDef (Entities.Node (EntName)); + IF EntityDef = NIL THEN // Unknown Entity + Repl := EntName + ELSE BEGIN // Known Entity + IF EntityDef.Value <> '' then // Internal Entity + Repl := NormalizeAttrValStr (EntityDef.Value, FALSE) + ELSE BEGIN // External Entity + ExternalEntity := NIL; + TRY + ExternalEntity := LoadExternalEntity (EntityDef.SystemId, EntityDef.PublicId, EntityDef.NotationName); + ExternalEntity.Normalize := Self.Normalize; + Repl := ''; // External Entity can have a different encoding than parent entity + ExternalEntity.StartScan; + WHILE ExternalEntity.Scan DO + if (ExternalEntity.CurPartType = ptContent) or (ExternalEntity.CurPartType = ptCData) then + Repl := Repl + ExternalEntity.CurContent; // CurContent is already encoded + Repl := NormalizeAttrValStr (Repl, TRUE); // Recursively resolve Entity References + FINALLY + ExternalEntity.Free; + END; + END; + END + END; + end + else + EntLen := 0; + if IsEncoded + then Result := Result + Copy (Str, i - EncLen, EncLen) + Repl + else Result := Result + TranslateEncoding (Copy (Str, i - EncLen, EncLen)) + Repl; + EncLen := 0; + i := i + EntLen + 1; + end; + else inc (EncLen); + end; + inc (i); + end; + if IsEncoded + then Result := Result + Copy (Str, Len - EncLen + 1, EncLen) + else Result := Result + TranslateEncoding (Copy (Str, Len - EncLen + 1, EncLen)); + end; + + begin + if (Attr.AttrType in [atCData, atUnknown]) + then Attr.Value := NormalizeAttrValStr (Attr.Value, FALSE) + else Attr.Value := TrimAndPackSpace (NormalizeAttrValStr (Attr.Value, FALSE)); + end; + +VAR + S, F : TCharType; + Attr : TAttr; + ElemDef : TElemDef; + AttrDef : TAttrDef; + I : INTEGER; +BEGIN + CurPartType := ptStartTag; + S := CurStart+1; + IF S^ = '/' THEN BEGIN + CurPartType := ptEndTag; + INC (S); + END; + ExtractName (S, CWhitespace + ['/'], F); + SetStringSF (CurName, S, F); + CurAttr.Analyze (F+1, CurFinal); + IF CurFinal^ = '/' THEN + CurPartType := ptEmptyTag; + CurFinal := StrScanE (CurFinal, '>'); + + // --- Set Default Attribute values for nonexistent attributes + IF (CurPartType = ptStartTag) OR (CurPartType = ptEmptyTag) THEN BEGIN + ElemDef := Elements.Node (CurName); + IF ElemDef <> NIL THEN BEGIN + FOR I := 0 TO ElemDef.Count-1 DO BEGIN + AttrDef := TAttrDef (ElemDef [I]); + Attr := TAttr (CurAttr.Node (AttrDef.Name)); + IF (Attr = NIL) AND (AttrDef.Value <> '') THEN BEGIN + Attr := TAttr.Create (AttrDef.Name, AttrDef.Value); + Attr.ValueType := vtDefault; + CurAttr.Add (Attr); + END; + IF Attr <> NIL THEN BEGIN + CASE AttrDef.DefaultType OF + adDefault : ; + adRequired : ; // -!- It is an error in the document if "Attr.Value" is an empty string + adImplied : Attr.ValueType := vtImplied; + adFixed : BEGIN + Attr.ValueType := vtFixed; + Attr.Value := AttrDef.Value; + END; + END; + Attr.AttrType := AttrDef.AttrType; + END; + END; + END; + + // --- Normalize Attribute Values + FOR I := 0 TO CurAttr.Count-1 DO + NormalizeAttrValue (TAttr (CurAttr [I])); + END; +END; + + +PROCEDURE TXmlParser.AnalyzeCData; + // Analyze CDATA Sections +BEGIN + CurPartType := ptCData; + CurFinal := StrPos (CurStart, CDEnd); + IF CurFinal = NIL THEN BEGIN + CurFinal := StrEnd (CurStart)-1; + CurContent := TranslateEncoding (TStringType(StrPas (CurStart+Length (CDStart)))); + END + ELSE BEGIN + SetStringSF (CurContent, CurStart+Length (CDStart), CurFinal-1); + INC (CurFinal, Length (CDEnd)-1); + CurContent := TranslateEncoding (CurContent); + END; +END; + + +PROCEDURE TXmlParser.AnalyzeText (VAR IsDone : BOOLEAN); + (* Analyzes Text Content between Tags. CurFinal will point to the last content character. + Content ends at a '<' character or at the end of the document. + Entity References and Character References are resolved. + If Normalize is TRUE, contiguous Whitespace Characters will be compressed to + one Space #x20 character, Whitespace at the beginning and end of content will + be trimmed off and content which is or becomes empty is not returned to + the application (in this case, "IsDone" is set to FALSE which causes the + Scan method to proceed directly to the next part. *) + + PROCEDURE ProcessEntity; + (* Is called if there is an ampsersand '&' character found in the document. + IN "CurFinal" points to the ampersand + OUT "CurFinal" points to the first character after the semi-colon ';' *) + VAR + P : TCharType; + Name : TStringType; + EntityDef : TEntityDef; + ExternalEntity : TXmlParser; + BEGIN + P := StrScan (CurFinal, ';'); + IF P <> NIL THEN BEGIN + SetStringSF (Name, CurFinal+1, P-1); + + // Is it a Character Reference? + IF (CurFinal+1)^ = '#' THEN BEGIN + IF (CurFinal+2)^ = 'x' + THEN CurContent := CurContent + TranslateCharacter (StrToIntDef ('$' + Copy (string (Name), 3, MaxInt), 32)) + ELSE CurContent := CurContent + TranslateCharacter (StrToIntDef ( Copy (string (Name), 2, MaxInt), 32)); + CurFinal := P+1; + EXIT; + END + + // Is it a Predefined Entity? + ELSE IF Name = 'lt' THEN BEGIN CurContent := CurContent + '<'; CurFinal := P+1; EXIT; END + ELSE IF Name = 'gt' THEN BEGIN CurContent := CurContent + '>'; CurFinal := P+1; EXIT; END + ELSE IF Name = 'amp' THEN BEGIN CurContent := CurContent + '&'; CurFinal := P+1; EXIT; END + ELSE IF Name = 'apos' THEN BEGIN CurContent := CurContent + ''''; CurFinal := P+1; EXIT; END + ELSE IF Name = 'quot' THEN BEGIN CurContent := CurContent + '"'; CurFinal := P+1; EXIT; END; + + // Replace with Entity from DTD + EntityDef := TEntityDef (Entities.Node (Name)); + IF EntityDef <> NIL THEN BEGIN + IF EntityDef.Value <> '' THEN BEGIN + EntityStack.Push (P+1); + CurFinal := TCharType (EntityDef.Value); + END + ELSE BEGIN + ExternalEntity := LoadExternalEntity (EntityDef.SystemId, EntityDef.PublicId, EntityDef.NotationName); + EntityStack.Push (ExternalEntity, P+1); + CurFinal := ExternalEntity.DocBuffer; + END; + END + ELSE BEGIN + CurContent := CurContent + Name; + CurFinal := P+1; + END; + END + ELSE BEGIN + INC (CurFinal); + END; + END; + +VAR + C : INTEGER; +BEGIN + CurFinal := CurStart; + CurPartType := ptContent; + CurContent := ''; + C := 0; + REPEAT + CASE CurFinal^ OF + '&' : BEGIN + CurContent := CurContent + TranslateEncoding (StrLPas (CurFinal-C, C)); + C := 0; + ProcessEntity; + CONTINUE; + END; + #0 : BEGIN + IF EntityStack.Count = 0 THEN + BREAK + ELSE BEGIN + CurContent := CurContent + TranslateEncoding (StrLPas (CurFinal-C, C)); + C := 0; + CurFinal := EntityStack.Pop; + CONTINUE; + END; + END; + '<' : BREAK; + ELSE INC (C); + END; + INC (CurFinal); + UNTIL FALSE; + CurContent := CurContent + TranslateEncoding (StrLPas (CurFinal-C, C)); + DEC (CurFinal); + + IF FNormalize THEN BEGIN + CurContent := ConvertWs (TrimWs (CurContent), TRUE); + IsDone := CurContent <> ''; // IsDone will only get FALSE if Normalize is TRUE + END; +END; + + +PROCEDURE TXmlParser.AnalyzeElementDecl (Start : TCharType; VAR Final : TCharType); + (* Parse ' character + XmlSpec 3.2: + elementdecl ::= '' + contentspec ::= 'EMPTY' | 'ANY' | Mixed | children + Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*' | + '(' S? '#PCDATA' S? ')' + children ::= (choice | seq) ('?' | '*' | '+')? + choice ::= '(' S? cp ( S? '|' S? cp )* S? ')' + cp ::= (Name | choice | seq) ('?' | '*' | '+')? + seq ::= '(' S? cp ( S? ',' S? cp )* S? ')' + + More simply: + contentspec ::= EMPTY + ANY + '(#PCDATA)' + '(#PCDATA | A | B)*' + '(A, B, C)' + '(A | B | C)' + '(A?, B*, C+), + '(A, (B | C | D)* )' *) +VAR + Element : TElemDef; + Elem2 : TElemDef; + F : TCharType; + DER : TDtdElementRec; +BEGIN + Element := TElemDef.Create; + Final := Start + 9; + DER.Start := Start; + REPEAT + IF Final^ = '>' THEN BREAK; + IF (Final^ IN CNameStart) AND (Element.Name = '') THEN BEGIN + ExtractName (Final, CWhitespace, F); + SetStringSF (Element.Name, Final, F); + Final := F; + F := StrScan (Final+1, '>'); + IF F = NIL THEN BEGIN + Element.Definition := TStringType (Final); + Final := StrEnd (Final); + BREAK; + END + ELSE BEGIN + SetStringSF (Element.Definition, Final+1, F-1); + Final := F; + BREAK; + END; + END; + INC (Final); + UNTIL FALSE; + Element.Definition := DelChars (Element.Definition, CWhitespace); + ReplaceParameterEntities (Element.Definition); + IF Element.Definition = 'EMPTY' THEN Element.ElemType := etEmpty + ELSE IF Element.Definition = 'ANY' THEN Element.ElemType := etAny + ELSE IF Copy (Element.Definition, 1, 8) = '(#PCDATA' THEN Element.ElemType := etMixed + ELSE IF Copy (Element.Definition, 1, 1) = '(' THEN Element.ElemType := etChildren + ELSE Element.ElemType := etAny; + + Elem2 := Elements.Node (Element.Name); + IF Elem2 <> NIL THEN + Elements.Delete (Elements.IndexOf (Elem2)); + Elements.Add (Element); + Final := StrScanE (Final, '>'); + DER.ElementType := deElement; + DER.ElemDef := Element; + DER.Final := Final; + DtdElementFound (DER); +END; + + +PROCEDURE TXmlParser.AnalyzeAttListDecl (Start : TCharType; VAR Final : TCharType); + (* Parse ' character + XmlSpec 3.3: + AttlistDecl ::= '' + AttDef ::= S Name S AttType S DefaultDecl + AttType ::= StringType | TokenizedType | EnumeratedType + StringType ::= 'CDATA' + TokenizedType ::= 'ID' | 'IDREF' | 'IDREFS' | 'ENTITY' | 'ENTITIES' | 'NMTOKEN' | 'NMTOKENS' + EnumeratedType ::= NotationType | Enumeration + NotationType ::= 'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')' + Enumeration ::= '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')' + DefaultDecl ::= '#REQUIRED' | '#IMPLIED' | (('#FIXED' S)? AttValue) + AttValue ::= '"' ([^<&"] | Reference)* '"' | "'" ([^<&'] | Reference)* "'" + Examples: + *) +TYPE + TPhase = (phElementName, phName, phType, phNotationContent, phDefault); +VAR + Phase : TPhase; + F : TCharType; + ElementName : TStringType; + ElemDef : TElemDef; + AttrDef : TAttrDef; + AttrDef2 : TAttrDef; + Strg : TStringType; + DER : TDtdElementRec; +BEGIN + Final := Start + 9; // The character after ' : BREAK; + ELSE CASE Phase OF + phElementName : BEGIN + ExtractName (Final, CWhitespace + CQuoteChar + ['#'], F); + SetStringSF (ElementName, Final, F); + Final := F; + ElemDef := Elements.Node (ElementName); + IF ElemDef = NIL THEN BEGIN + ElemDef := TElemDef.Create; + ElemDef.Name := ElementName; + ElemDef.Definition := 'ANY'; + ElemDef.ElemType := etAny; + Elements.Add (ElemDef); + END; + Phase := phName; + END; + phName : BEGIN + AttrDef := TAttrDef.Create; + ExtractName (Final, CWhitespace + CQuoteChar + ['#'], F); + SetStringSF (AttrDef.Name, Final, F); + Final := F; + AttrDef2 := TAttrDef (ElemDef.Node (AttrDef.Name)); + IF AttrDef2 <> NIL THEN + ElemDef.Delete (ElemDef.IndexOf (AttrDef2)); + ElemDef.Add (AttrDef); + Phase := phType; + END; + phType : BEGIN + IF Final^ = '(' THEN BEGIN + F := StrScan (Final+1, ')'); + IF F <> NIL + THEN SetStringSF (AttrDef.TypeDef, Final+1, F-1) + ELSE AttrDef.TypeDef := TStringType (Final+1); + AttrDef.TypeDef := DelChars (AttrDef.TypeDef, CWhitespace); + AttrDef.AttrType := atEnumeration; + ReplaceParameterEntities (AttrDef.TypeDef); + ReplaceCharacterEntities (AttrDef.TypeDef); + Phase := phDefault; + END + ELSE IF StrLComp (Final, 'NOTATION', 8) = 0 THEN BEGIN + INC (Final, 8); + AttrDef.AttrType := atNotation; + Phase := phNotationContent; + END + ELSE BEGIN + ExtractName (Final, CWhitespace+CQuoteChar+['#'], F); + SetStringSF (AttrDef.TypeDef, Final, F); + IF AttrDef.TypeDef = 'CDATA' THEN AttrDef.AttrType := atCData + ELSE IF AttrDef.TypeDef = 'ID' THEN AttrDef.AttrType := atId + ELSE IF AttrDef.TypeDef = 'IDREF' THEN AttrDef.AttrType := atIdRef + ELSE IF AttrDef.TypeDef = 'IDREFS' THEN AttrDef.AttrType := atIdRefs + ELSE IF AttrDef.TypeDef = 'ENTITY' THEN AttrDef.AttrType := atEntity + ELSE IF AttrDef.TypeDef = 'ENTITIES' THEN AttrDef.AttrType := atEntities + ELSE IF AttrDef.TypeDef = 'NMTOKEN' THEN AttrDef.AttrType := atNmToken + ELSE IF AttrDef.TypeDef = 'NMTOKENS' THEN AttrDef.AttrType := atNmTokens; + Phase := phDefault; + END + END; + phNotationContent : BEGIN + F := StrScan (Final, ')'); + IF F <> NIL THEN + SetStringSF (AttrDef.Notations, Final+1, F-1) + ELSE BEGIN + AttrDef.Notations := TStringType (Final+1); + Final := StrEnd (Final); + END; + ReplaceParameterEntities (AttrDef.Notations); + AttrDef.Notations := DelChars (AttrDef.Notations, CWhitespace); + Phase := phDefault; + END; + phDefault : BEGIN + IF Final^ = '#' THEN BEGIN + ExtractName (Final, CWhiteSpace + CQuoteChar, F); + SetStringSF (Strg, Final, F); + Final := F; + ReplaceParameterEntities (Strg); + IF Strg = '#REQUIRED' THEN BEGIN AttrDef.DefaultType := adRequired; Phase := phName; END + ELSE IF Strg = '#IMPLIED' THEN BEGIN AttrDef.DefaultType := adImplied; Phase := phName; END + ELSE IF Strg = '#FIXED' THEN AttrDef.DefaultType := adFixed; + END + ELSE IF (Final^ IN CQuoteChar) THEN BEGIN + ExtractQuote (Final, AttrDef.Value, Final); + ReplaceParameterEntities (AttrDef.Value); + ReplaceCharacterEntities (AttrDef.Value); + Phase := phName; + END; + IF Phase = phName THEN BEGIN + AttrDef := NIL; + END; + END; + + END; + END; + INC (Final); + UNTIL FALSE; + + Final := StrScan (Final, '>'); + + DER.ElementType := deAttList; + DER.ElemDef := ElemDef; + DER.Final := Final; + DtdElementFound (DER); +END; + + +PROCEDURE TXmlParser.AnalyzeEntityDecl (Start : TCharType; VAR Final : TCharType); + (* Parse ' character + XmlSpec 4.2: + EntityDecl ::= '' | + '' + EntityDef ::= EntityValue | (ExternalID NDataDecl?) + PEDef ::= EntityValue | ExternalID + NDataDecl ::= S 'NDATA' S Name + EntityValue ::= '"' ([^%&"] | PEReference | EntityRef | CharRef)* '"' | + "'" ([^%&'] | PEReference | EntityRef | CharRef)* "'" + PEReference ::= '%' Name ';' + + Examples + + + + "> + + + Dies ist ein Test-Absatz

"> + *) +TYPE + TPhase = (phName, phContent, phNData, phNotationName, phFinalGT); +VAR + Phase : TPhase; + IsParamEntity : BOOLEAN; + F : TCharType; + ExternalID : TExternalID; + EntityDef : TEntityDef; + EntityDef2 : TEntityDef; + DER : TDtdElementRec; +BEGIN + Final := Start + 8; // First char after ' : BREAK; + ELSE CASE Phase OF + phName : IF Final^ IN CNameStart THEN BEGIN + ExtractName (Final, CWhitespace + CQuoteChar, F); + SetStringSF (EntityDef.Name, Final, F); + Final := F; + Phase := phContent; + END; + phContent : IF Final^ IN CQuoteChar THEN BEGIN + ExtractQuote (Final, EntityDef.Value, Final); + Phase := phFinalGT; + END + ELSE IF (StrLComp (Final, 'SYSTEM', 6) = 0) OR + (StrLComp (Final, 'PUBLIC', 6) = 0) THEN BEGIN + ExternalID := TExternalID.Create (Final); + EntityDef.SystemId := ExternalID.SystemId; + EntityDef.PublicId := ExternalID.PublicId; + Final := ExternalID.Final; + Phase := phNData; + ExternalID.Free; + END; + phNData : IF StrLComp (Final, 'NDATA', 5) = 0 THEN BEGIN + INC (Final, 4); + Phase := phNotationName; + END; + phNotationName : IF Final^ IN CNameStart THEN BEGIN + ExtractName (Final, CWhitespace + ['>'], F); + SetStringSF (EntityDef.NotationName, Final, F); + Final := F; + Phase := phFinalGT; + END; + phFinalGT : ; // -!- There is an error in the document if this branch is called + END; + END; + INC (Final); + UNTIL FALSE; + IF IsParamEntity THEN BEGIN + EntityDef2 := TEntityDef (ParEntities.Node (EntityDef.Name)); + IF EntityDef2 <> NIL THEN + ParEntities.Delete (ParEntities.IndexOf (EntityDef2)); + ParEntities.Add (EntityDef); + ReplaceCharacterEntities (EntityDef.Value); + END + ELSE BEGIN + EntityDef2 := TEntityDef (Entities.Node (EntityDef.Name)); + IF EntityDef2 <> NIL THEN + Entities.Delete (Entities.IndexOf (EntityDef2)); + Entities.Add (EntityDef); + ReplaceParameterEntities (EntityDef.Value); // Create replacement texts (see XmlSpec 4.5) + ReplaceCharacterEntities (EntityDef.Value); + END; + Final := StrScanE (Final, '>'); + + DER.ElementType := deEntity; + DER.EntityDef := EntityDef; + DER.Final := Final; + DtdElementFound (DER); +END; + + +PROCEDURE TXmlParser.AnalyzeNotationDecl (Start : TCharType; VAR Final : TCharType); + // Parse ' character + // XmlSpec 4.7: NotationDecl ::= '' +TYPE + TPhase = (phName, phExtId, phEnd); +VAR + ExternalID : TExternalID; + Phase : TPhase; + F : TCharType; + NotationDef : TNotationDef; + DER : TDtdElementRec; +BEGIN + Final := Start + 10; // Character after ', + #0 : BREAK; + ELSE CASE Phase OF + phName : BEGIN + ExtractName (Final, CWhitespace + ['>'], F); + SetStringSF (NotationDef.Name, Final, F); + Final := F; + Phase := phExtId; + END; + phExtId : BEGIN + ExternalID := TExternalID.Create (Final); + NotationDef.Value := ExternalID.SystemId; + NotationDef.PublicId := ExternalID.PublicId; + Final := ExternalId.Final; + ExternalId.Free; + Phase := phEnd; + END; + phEnd : ; // -!- There is an error in the document if this branch is called + END; + END; + INC (Final); + UNTIL FALSE; + Notations.Add (NotationDef); + Final := StrScanE (Final, '>'); + + DER.ElementType := deNotation; + DER.NotationDef := NotationDef; + DER.Final := Final; + DtdElementFound (DER); +END; + + +PROCEDURE TXmlParser.PushPE (VAR Start : TCharType); + (* If there is a parameter entity reference found in the data stream, + the current position will be pushed to the entity stack. + Start: IN Pointer to the '%' character starting the PE reference + OUT Pointer to first character of PE replacement text *) +VAR + P : TCharType; + EntityDef : TEntityDef; +BEGIN + P := StrScan (Start, ';'); + IF P <> NIL THEN BEGIN + EntityDef := TEntityDef (ParEntities.Node (StrSFPas (Start+1, P-1))); + IF EntityDef <> NIL THEN BEGIN + EntityStack.Push (P+1); + Start := TCharType (EntityDef.Value); + END + ELSE + Start := P+1; + END; +END; + + +PROCEDURE TXmlParser.ReplaceCharacterEntities (VAR Str : TStringType); + // Replaces all Character References in the String +VAR + Start : INTEGER; + PAmp : TCharType; + PSemi : TCharType; + PosAmp : INTEGER; + Len : INTEGER; // Length of complete Character Reference + Repl : TStringType; // Replacement Text +BEGIN + IF Str = '' THEN EXIT; + Start := 1; + REPEAT + PAmp := StrPos (TCharType (Str) + Start-1, '&#'); + IF PAmp = NIL THEN BREAK; + PSemi := StrScan (PAmp + 3, ';'); + IF PSemi = NIL THEN BREAK; + PosAmp := PAmp - TCharType (Str) + 1; + Len := PSemi - PAmp + 1; + IF (PAmp + 2)^ = 'x' + THEN Repl := TranslateCharacter (StrToIntDef ('$' + Copy (string (Str), PosAmp + 3, Len - 4), 32)) + ELSE Repl := TranslateCharacter (StrToIntDef ( Copy (string (Str), PosAmp + 2, Len - 3), 32)); + Delete (Str, PosAmp, Len); + Insert (Repl, Str, PosAmp); + Start := PosAmp + Length (Repl); + UNTIL FALSE; +END; + + +PROCEDURE TXmlParser.ReplaceParameterEntities (VAR Str : TStringType); + // Recursively replaces all Parameter Entity References in the String + PROCEDURE ReplaceEntities (VAR Str : TStringType); + VAR + Start : INTEGER; + PAmp : TCharType; + PSemi : TCharType; + PosAmp : INTEGER; + Len : INTEGER; + Entity : TEntityDef; + Repl : TStringType; // Replacement + BEGIN + IF Str = '' THEN EXIT; + Start := 1; + REPEAT + PAmp := StrPos (TCharType (Str)+Start-1, '%'); + IF PAmp = NIL THEN BREAK; + PSemi := StrScan (PAmp+2, ';'); + IF PSemi = NIL THEN BREAK; + PosAmp := PAmp - TCharType (Str) + 1; + Len := PSemi-PAmp+1; + Entity := TEntityDef (ParEntities.Node (Copy (Str, PosAmp+1, Len-2))); + IF Entity <> NIL THEN BEGIN + Repl := Entity.Value; + ReplaceEntities (Repl); // Recursion + END + ELSE + Repl := Copy (Str, PosAmp, Len); + Delete (Str, PosAmp, Len); + Insert (Repl, Str, PosAmp); + Start := PosAmp + Length (Repl); + UNTIL FALSE; + END; +BEGIN + ReplaceEntities (Str); +END; + + +FUNCTION TXmlParser.LoadExternalEntity (SystemId, PublicId, Notation : TStringType) : TXmlParser; + // This will be called whenever there is a Parsed External Entity or + // the DTD External Subset has to be loaded. + // It must create a TXmlParser instance and load the desired Entity. + // This instance of LoadExternalEntity assumes that "SystemId" is a valid + // file name (relative to the Document source) and loads this file using + // the LoadFromFile method. +VAR + Filename : string; +BEGIN + // --- Convert System ID to complete filename + Filename := StringReplace (string (SystemId), '/', '\', [rfReplaceAll]); + IF Copy (FSource, 1, 1) <> '<' THEN + IF (Copy (Filename, 1, 2) = '\\') OR (Copy (Filename, 2, 1) = ':') THEN + // Already has an absolute Path + ELSE BEGIN + Filename := ExtractFilePath (FSource) + Filename; + END; + + // --- Load the File + Result := TXmlParser.Create; + Result.LoadFromFile (Filename); +END; + + +FUNCTION TXmlParser.TranslateEncoding (CONST Source : TStringType) : TStringType; + // The member variable "CurEncoding" always holds the name of the current + // encoding, e.g. 'UTF-8' or 'ISO-8859-1' (always uppercase). + // This virtual method "TranslateEncoding" is responsible for translating + // the content passed in the "Source" parameter to the target encoding which + // is expected by the application. + // This instance of "TranlateEncoding" assumes that the Application expects + // Windows ANSI (windows-1252) strings. It is able to transform UTF-8 or ISO-8859-1 + // encodings. + // Override this function when you want your application to understand other + // source encodings or create other target encodings. +BEGIN + Result := Source;//Utf8ToAnsi (Source) +END; + +FUNCTION TXmlParser.TranslateCharacter (CONST UnicodeValue : INTEGER; + CONST UnknownChar : TStringType = CUnknownChar) : TStringType; + // Corresponding to TranslateEncoding, the task of TranslateCharacter is + // to translate a given Character value to the representation in the target charset. + // This instance of TranslateCharacter assumes that the application expects + // Windows ANSI (windows-1252) strings. All unknown characters will be transformed + // to UnknownChar +var + I : integer; +begin + if (UnicodeValue <= 255) then begin + Result := TCharType(UnicodeValue); + exit; + end; + Result := CUnknownChar; +END; + + +procedure TXmlParser.DtdElementFound (DtdElementRec : TDtdElementRec); + // This method is called for every element which is found in the DTD + // declaration. The variant record TDtdElementRec is passed which + // holds informations about the element. + // You can override this function to handle DTD declarations. + // Note that when you parse the same document instance a second time, + // the DTD will not get parsed again. +BEGIN +END; + + +FUNCTION TXmlParser.GetDocBuffer: TCharType; + // Returns FBuffer or a pointer to a NUL char if Buffer is empty +BEGIN + IF FBuffer = NIL + THEN Result := #0 + ELSE Result := FBuffer; +END; + + +(*$IFNDEF HAS_CONTNRS_UNIT +=============================================================================================== +TObjectList +=============================================================================================== +*) + +DESTRUCTOR TObjectList.Destroy; +BEGIN + Clear; + SetCapacity(0); + INHERITED Destroy; +END; + + +PROCEDURE TObjectList.Delete (Index : INTEGER); +BEGIN + IF (Index < 0) OR (Index >= Count) THEN EXIT; + TObject (Items [Index]).Free; + INHERITED Delete (Index); +END; + + +PROCEDURE TObjectList.Clear; +BEGIN + WHILE Count > 0 DO + Delete (Count-1); +END; + +(*$ENDIF *) + +(* +=============================================================================================== +TNvpNode +-------- +Node base class for the TNvpList +=============================================================================================== +*) + +CONSTRUCTOR TNvpNode.Create (TheName, TheValue : TStringType); +BEGIN + INHERITED Create; + Name := TheName; + Value := TheValue; +END; + + +(* +=============================================================================================== +TNvpList +-------- +A generic List of Name-Value Pairs, based on the TObjectList introduced in Delphi 5 +=============================================================================================== +*) + +PROCEDURE TNvpList.Add (Node : TNvpNode); +VAR + I : INTEGER; +BEGIN + FOR I := Count-1 DOWNTO 0 DO + IF Node.Name > TNvpNode (Items [I]).Name THEN BEGIN + Insert (I+1, Node); + EXIT; + END; + Insert (0, Node); +END; + + + +FUNCTION TNvpList.Node (Name : TStringType) : TNvpNode; + // Binary search for Node +VAR + L, H : INTEGER; // Low, High Limit + T, C : INTEGER; // Test Index, Comparison result + Last : INTEGER; // Last Test Index +BEGIN + IF Count=0 THEN BEGIN + Result := NIL; + EXIT; + END; + + L := 0; + H := Count; + Last := -1; + REPEAT + T := (L+H) DIV 2; + IF T=Last THEN BREAK; + Result := TNvpNode (Items [T]); + C := CompareStr (string (Result.Name), string (Name)); + IF C = 0 THEN EXIT + ELSE IF C < 0 THEN L := T + ELSE H := T; + Last := T; + UNTIL FALSE; + Result := NIL; +END; + + +FUNCTION TNvpList.Node (Index : INTEGER) : TNvpNode; +BEGIN + IF (Index < 0) OR (Index >= Count) + THEN Result := NIL + ELSE Result := TNvpNode (Items [Index]); +END; + + +FUNCTION TNvpList.Value (Name : TStringType) : TStringType; +VAR + Nvp : TNvpNode; +BEGIN + Nvp := TNvpNode (Node (Name)); + IF Nvp <> NIL + THEN Result := Nvp.Value + ELSE Result := ''; +END; + + +FUNCTION TNvpList.Value (Index : INTEGER) : TStringType; +BEGIN + IF (Index < 0) OR (Index >= Count) + THEN Result := '' + ELSE Result := TNvpNode (Items [Index]).Value; +END; + + +FUNCTION TNvpList.Name (Index : INTEGER) : TStringType; +BEGIN + IF (Index < 0) OR (Index >= Count) + THEN Result := '' + ELSE Result := TNvpNode (Items [Index]).Name; +END; + + +(* +=============================================================================================== +TAttrList +List of Attributes. The "Analyze" method extracts the Attributes from the given Buffer. +Is used for extraction of Attributes in Start-Tags, Empty-Element Tags and the "pseudo" +attributes in XML Prologs, Text Declarations and PIs. +=============================================================================================== +*) + +PROCEDURE TAttrList.Analyze (Start : TCharType; VAR Final : TCharType); + // Analyze the Buffer for Attribute=Name pairs. + // Terminates when there is a character which is not IN CNameStart + // (e.g. '?>' or '>' or '/>') +TYPE + TPhase = (phName, phEq, phValue); +VAR + Phase : TPhase; + F : TCharType; + Name : TStringType; + Value : TStringType; + Attr : TAttr; +BEGIN + Clear; + Phase := phName; + Final := Start; + REPEAT + IF (Final^ = #0) OR (Final^ = '>') THEN BREAK; + IF NOT (Final^ IN CWhitespace) THEN + CASE Phase OF + phName : BEGIN + IF NOT (Final^ IN CNameStart) THEN BREAK; + ExtractName (Final, CWhitespace + ['=', '/'], F); + SetStringSF (Name, Final, F); + Final := F; + Phase := phEq; + END; + phEq : BEGIN + IF Final^ = '=' THEN + Phase := phValue + END; + phValue : BEGIN + IF Final^ IN CQuoteChar THEN BEGIN + ExtractQuote (Final, Value, F); + Attr := TAttr.Create; + Attr.Name := Name; + Attr.Value := Value; + Attr.ValueType := vtNormal; + Add (Attr); + Final := F; + Phase := phName; + END; + END; + END; + INC (Final); + UNTIL FALSE; +END; + + +(* +=============================================================================================== +TElemList +List of TElemDef nodes. +=============================================================================================== +*) + +FUNCTION TElemList.Node (Name : TStringType) : TElemDef; + // Binary search for the Node with the given Name +VAR + L, H : INTEGER; // Low, High Limit + T, C : INTEGER; // Test Index, Comparison result + Last : INTEGER; // Last Test Index +BEGIN + IF Count=0 THEN BEGIN + Result := NIL; + EXIT; + END; + + L := 0; + H := Count; + Last := -1; + REPEAT + T := (L+H) DIV 2; + IF T=Last THEN BREAK; + Result := TElemDef (Items [T]); + C := CompareStr (string (Result.Name), string (Name)); + IF C = 0 THEN EXIT + ELSE IF C < 0 THEN L := T + ELSE H := T; + Last := T; + UNTIL FALSE; + Result := NIL; +END; + + +PROCEDURE TElemList.Add (Node : TElemDef); +VAR + I : INTEGER; +BEGIN + FOR I := Count-1 DOWNTO 0 DO + IF Node.Name > TElemDef (Items [I]).Name THEN BEGIN + Insert (I+1, Node); + EXIT; + END; + Insert (0, Node); +END; + + +(* +=============================================================================================== +TScannerXmlParser +A TXmlParser descendant for the TCustomXmlScanner component +=============================================================================================== +*) + +TYPE + TScannerXmlParser = CLASS (TXmlParser) + Scanner : TCustomXmlScanner; + CONSTRUCTOR Create (TheScanner : TCustomXmlScanner); + FUNCTION LoadExternalEntity (SystemId, PublicId, + Notation : TStringType) : TXmlParser; OVERRIDE; + FUNCTION TranslateEncoding (CONST Source : TStringType) : TStringType; OVERRIDE; + FUNCTION TranslateCharacter (CONST UnicodeValue : INTEGER; + CONST UnknownChar : TStringType = CUnknownChar) : TStringType; OVERRIDE; + PROCEDURE DtdElementFound (DtdElementRec : TDtdElementRec); OVERRIDE; + END; + +CONSTRUCTOR TScannerXmlParser.Create (TheScanner : TCustomXmlScanner); +BEGIN + INHERITED Create; + Scanner := TheScanner; +END; + + +FUNCTION TScannerXmlParser.LoadExternalEntity (SystemId, PublicId, Notation : TStringType) : TXmlParser; +BEGIN + IF Assigned (Scanner.FOnLoadExternal) + THEN Scanner.FOnLoadExternal (Scanner, string (SystemId), string (PublicId), string (Notation), Result) + ELSE Result := INHERITED LoadExternalEntity (SystemId, PublicId, Notation); +END; + + +FUNCTION TScannerXmlParser.TranslateEncoding (CONST Source : TStringType) : TStringType; +BEGIN + IF Assigned (Scanner.FOnTranslateEncoding) + THEN Result := TStringType (Scanner.FOnTranslateEncoding (Scanner, string (CurEncoding), string (Source))) + ELSE Result := TStringType (INHERITED TranslateEncoding (Source)); +END; + + +FUNCTION TScannerXmlParser.TranslateCharacter (CONST UnicodeValue : INTEGER; + CONST UnknownChar : TStringType = CUnknownChar) : TStringType; +BEGIN + IF Assigned (Scanner.FOnTranslateCharacter) + THEN Result := TStringType (Scanner.FOnTranslateCharacter (Scanner, UnicodeValue)) + ELSE Result := TStringType (INHERITED TranslateCharacter (UnicodeValue, UnknownChar)); +END; + + +PROCEDURE TScannerXmlParser.DtdElementFound (DtdElementRec : TDtdElementRec); +BEGIN + WITH DtdElementRec DO + CASE ElementType OF + deElement : Scanner.WhenElement (ElemDef); + deAttList : Scanner.WhenAttList (ElemDef); + deEntity : Scanner.WhenEntity (EntityDef); + deNotation : Scanner.WhenNotation (NotationDef); + dePI : Scanner.WhenPI (string (Target), string (Content), AttrList); + deComment : Scanner.WhenComment (string (StrSFPas (Start, Final))); + deError : Scanner.WhenDtdError (Pos); + END; +END; + + +(* +=============================================================================================== +TCustomXmlScanner +=============================================================================================== +*) + +CONSTRUCTOR TCustomXmlScanner.Create (AOwner: TComponent); +BEGIN + INHERITED; + FXmlParser := TScannerXmlParser.Create (Self); +END; + + +DESTRUCTOR TCustomXmlScanner.Destroy; +BEGIN + FXmlParser.Free; + INHERITED; +END; + + +PROCEDURE TCustomXmlScanner.LoadFromFile (Filename : TFilename); + // Load XML Document from file +BEGIN + FXmlParser.LoadFromFile (Filename); +END; + + +PROCEDURE TCustomXmlScanner.LoadFromBuffer (Buffer : TCharType); + // Load XML Document from buffer +BEGIN + FXmlParser.LoadFromBuffer (Buffer); +END; + + +PROCEDURE TCustomXmlScanner.SetBuffer (Buffer : TCharType); + // Refer to Buffer +BEGIN + FXmlParser.SetBuffer (Buffer); +END; + + +FUNCTION TCustomXmlScanner.GetFilename : TFilename; +BEGIN + Result := FXmlParser.Source; +END; + + +FUNCTION TCustomXmlScanner.GetNormalize : BOOLEAN; +BEGIN + Result := FXmlParser.Normalize; +END; + + +PROCEDURE TCustomXmlScanner.SetNormalize (Value : BOOLEAN); +BEGIN + FXmlParser.Normalize := Value; +END; + + +PROCEDURE TCustomXmlScanner.WhenXmlProlog(XmlVersion, Encoding: String; Standalone : BOOLEAN); + // Is called when the parser has parsed the declaration of the prolog +BEGIN + IF Assigned (FOnXmlProlog) THEN FOnXmlProlog (Self, XmlVersion, Encoding, Standalone); +END; + + +PROCEDURE TCustomXmlScanner.WhenComment (Comment : String); + // Is called when the parser has parsed a +BEGIN + IF Assigned (FOnComment) THEN FOnComment (Self, Comment); +END; + + +PROCEDURE TCustomXmlScanner.WhenPI (Target, Content: String; Attributes : TAttrList); + // Is called when the parser has parsed a +BEGIN + IF Assigned (FOnPI) THEN FOnPI (Self, Target, Content, Attributes); +END; + + +PROCEDURE TCustomXmlScanner.WhenDtdRead (RootElementName : String); + // Is called when the parser has completely parsed the DTD +BEGIN + IF Assigned (FOnDtdRead) THEN FOnDtdRead (Self, RootElementName); +END; + + +PROCEDURE TCustomXmlScanner.WhenStartTag (TagName : String; Attributes : TAttrList); + // Is called when the parser has parsed a start tag like

+BEGIN + IF Assigned (FOnStartTag) THEN FOnStartTag (Self, TagName, Attributes); +END; + + +PROCEDURE TCustomXmlScanner.WhenEmptyTag (TagName : String; Attributes : TAttrList); + // Is called when the parser has parsed an Empty Element Tag like
+BEGIN + IF Assigned (FOnEmptyTag) THEN FOnEmptyTag (Self, TagName, Attributes); +END; + + +PROCEDURE TCustomXmlScanner.WhenEndTag (TagName : String); + // Is called when the parser has parsed an End Tag like

+BEGIN + IF Assigned (FOnEndTag) THEN FOnEndTag (Self, TagName); +END; + + +PROCEDURE TCustomXmlScanner.WhenContent (Content : String); + // Is called when the parser has parsed an element's text content +BEGIN + IF Assigned (FOnContent) THEN FOnContent (Self, Content); +END; + + +PROCEDURE TCustomXmlScanner.WhenCData (Content : String); + // Is called when the parser has parsed a CDATA section +BEGIN + IF Assigned (FOnCData) THEN FOnCData (Self, Content); +END; + + +PROCEDURE TCustomXmlScanner.WhenElement (ElemDef : TElemDef); + // Is called when the parser has parsed an definition + // inside the DTD +BEGIN + IF Assigned (FOnElement) THEN FOnElement (Self, ElemDef); +END; + + +PROCEDURE TCustomXmlScanner.WhenAttList (ElemDef : TElemDef); + // Is called when the parser has parsed an definition + // inside the DTD +BEGIN + IF Assigned (FOnAttList) THEN FOnAttList (Self, ElemDef); +END; + + +PROCEDURE TCustomXmlScanner.WhenEntity (EntityDef : TEntityDef); + // Is called when the parser has parsed an definition + // inside the DTD +BEGIN + IF Assigned (FOnEntity) THEN FOnEntity (Self, EntityDef); +END; + + +PROCEDURE TCustomXmlScanner.WhenNotation (NotationDef : TNotationDef); + // Is called when the parser has parsed a definition + // inside the DTD +BEGIN + IF Assigned (FOnNotation) THEN FOnNotation (Self, NotationDef); +END; + + +PROCEDURE TCustomXmlScanner.WhenDtdError (ErrorPos : TCharType); + // Is called when the parser has found an Error in the DTD +BEGIN + IF Assigned (FOnDtdError) THEN FOnDtdError (Self, ErrorPos); +END; + + +PROCEDURE TCustomXmlScanner.Execute; + // Perform scanning + // Scanning is done synchronously, i.e. you can expect events to be triggered + // in the order of the XML data stream. Execute will finish when the whole XML + // document has been scanned or when the StopParser property has been set to TRUE. +BEGIN + FStopParser := FALSE; + FXmlParser.StartScan; + WHILE FXmlParser.Scan AND (NOT FStopParser) DO + CASE FXmlParser.CurPartType OF + ptNone : ; + ptXmlProlog : WhenXmlProlog (string (FXmlParser.XmlVersion), string (FXmlParser.Encoding), FXmlParser.Standalone); + ptComment : WhenComment (string (StrSFPas (FXmlParser.CurStart, FXmlParser.CurFinal))); + ptPI : WhenPI (string (FXmlParser.CurName), string (FXmlParser.CurContent), FXmlParser.CurAttr); + ptDtdc : WhenDtdRead (string (FXmlParser.RootName)); + ptStartTag : WhenStartTag (string (FXmlParser.CurName), FXmlParser.CurAttr); + ptEmptyTag : WhenEmptyTag (string (FXmlParser.CurName), FXmlParser.CurAttr); + ptEndTag : WhenEndTag (string (FXmlParser.CurName)); + ptContent : WhenContent (string (FXmlParser.CurContent)); + ptCData : WhenCData (string (FXmlParser.CurContent)); + END; +END; + + +END. diff --git a/System/RegexHelper.pas b/System/RegexHelper.pas new file mode 100644 index 0000000..c3279cd --- /dev/null +++ b/System/RegexHelper.pas @@ -0,0 +1,90 @@ +unit RegexHelper; + +interface + uses Global, SysUtils, StrUtils, RegularExpressionsCore; + + type T2Int = record + i1, i2: integer; + end; + type T2Float = record + f1, f2: extended; + end; + type TRgb = record + r, g, b: integer; + end; + +function GetStringPart(text, expression: string; group: integer; def: string): string; +function GetBoolPart(text, expression: string; group: integer; def: boolean): boolean; +function GetIntPart(text, expression: string; group: integer; def: integer): integer; +function GetFloatPart(text, expression: string; group: integer; def: extended): extended; +function Get2IntPart(text, expression: string; group: integer; def: integer): T2Int; +function Get2FloatPart(text, expression: string; group: integer; def: extended): T2Float; +function GetRGBPart(text, expression: string; group: integer; def: integer): TRGB; + +implementation + +(* ***************************** Extract functions ******************************* *) +function GetStringPart(text, expression: string; group: integer; def: string): string; +var Regex: TPerlRegEx; +begin + Regex := TPerlRegEx.Create; + Regex.RegEx := expression; + Regex.Options := [preSingleLine, preCaseless]; + Regex.Subject := text; + + if Regex.Match and (Regex.GroupCount >= group) then + Result := String(Regex.Groups[group]) + else Result := def; + + Regex.Free; +end; +function GetBoolPart(text, expression: string; group: integer; def: boolean): boolean; +begin + Result := GetFloatPart(text, expression, group, StrToFloat(IfThen(def, '1', '0'))) <> 0; +end; +function GetIntPart(text, expression: string; group: integer; def: integer): integer; +var str: string; +begin + str := GetStringPart(text, expression, group, ''); + Result := StrToIntDef(str, def); +end; +function GetFloatPart(text, expression: string; group: integer; def: extended): extended; +var str: string; +begin + str := GetStringPart(text, expression, group, ''); + Result := StrToFloatDef(str, def); +end; +function Get2IntPart(text, expression: string; group: integer; def: integer): T2Int; +const expr : string = '(\d+)\s+(\d+)'; +var str, s1, s2: string; +begin + str := GetStringPart(text, expression, group, IntToStr(def) + ' ' + IntToStr(def)); + s1 := GetStringPart(str, expr, 1, IntToStr(def)); + s2 := GetStringPart(str, expr, 2, IntToStr(def)); + Result.i1 := StrToIntDef(s1, def); + Result.i2 := StrToIntDef(s2, def); +end; +function Get2FloatPart(text, expression: string; group: integer; def: extended): T2Float; +const expr : string = '([\d.eE+-]+)\s+([\d.eE+-]+)'; +var str, s1, s2: string; +begin + str := GetStringPart(text, expression, group, FloatToStr(def) + ' ' + FloatToStr(def)); + s1 := GetStringPart(str, expr, 1, FloatToStr(def)); + s2 := GetStringPart(str, expr, 2, FloatToStr(def)); + Result.f1 := StrToFloatDef(s1, def); + Result.f2 := StrToFloatDef(s2, def); +end; +function GetRGBPart(text, expression: string; group: integer; def: integer): TRGB; +const expr : string = '(\d+)\s+(\d+)\s+(\d+)'; +var str, s1, s2, s3: string; +begin + str := GetStringPart(text, expression, group, IntToStr(def) + ' ' + IntToStr(def) + ' ' + IntToStr(def)); + s1 := GetStringPart(str, expr, 1, IntToStr(def)); + s2 := GetStringPart(str, expr, 2, IntToStr(def)); + s3 := GetStringPart(str, expr, 3, IntToStr(def)); + Result.r := StrToIntDef(s1, def); + Result.g := StrToIntDef(s2, def); + Result.b := StrToIntDef(s3, def); +end; + +end. diff --git a/System/sdStringTable.pas b/System/sdStringTable.pas new file mode 100644 index 0000000..1b31cca --- /dev/null +++ b/System/sdStringTable.pas @@ -0,0 +1,633 @@ +{ unit sdStringTable + + Author: Nils Haeck M.Sc. (n.haeck@simdesign.nl) + Original Date: 28 May 2007 + Version: 1.1 + Copyright (c) 2007 - 2010 Simdesign BV + + It is NOT allowed under ANY circumstances to publish or copy this code + without accepting the license conditions in accompanying LICENSE.txt + first! + + This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF + ANY KIND, either express or implied. + + Please visit http://www.simdesign.nl/xml.html for more information. +} +unit sdStringTable; + +interface + +{$i NativeXml.inc} + +uses + Classes, SysUtils, Contnrs; + +type + + // A record describing a string by its first position and length (Count) + TsdStringRec = record + First: Pbyte; + Count: integer; + end; + + // A string reference item used in string reference lists (do not use directly) + TsdRefString = class + private + FID: integer; + FFrequency: integer; + FFirst: Pbyte; + FCharCount: integer; + protected + procedure SetString(const SR: TsdStringRec); + function CompareToSR(const SR: TsdStringRec): integer; + function StringRec: TsdStringRec; + public + destructor Destroy; override; + function AsString: UTF8String; + property CharCount: integer read FCharCount; + property Frequency: integer read FFrequency; + end; + + // A list of string reference items (do not use directly) + TsdRefStringList = class(TObjectList) + private + function GetItems(Index: integer): TsdRefString; + protected + // Assumes list is sorted by StringID + function IndexOfID(AID: integer; var Index: integer): boolean; + // Assumes list is sorted by string rec + function IndexOfSR(const AStringRec: TsdStringRec; var Index: integer): boolean; + public + property Items[Index: integer]: TsdRefString read GetItems; default; + end; + + // A string table, holding a collection of unique strings, sorted in 2 ways + // for fast access. Strings can be added with AddString or AddStringRec, + // and should be updated with SetString. When a string is added or updated, + // an ID is returned which the application can use to retrieve the string, + // using GetString. + TsdStringTable = class(TPersistent) + private + FByID: TsdRefStringList; + FBySR: TsdRefStringList; + protected + procedure DecFrequency(AItem: TsdRefString; ByIdIndex: integer); + function NextUniqueID: integer; + public + constructor Create; + destructor Destroy; override; + procedure Clear; + // Add a new string rec, return fresh ID or ID of existing item, and increase + // the existing item's ref count + function AddStringRec(const SR: TsdStringRec): integer; + // Add a new string S to the table, the function returns its ID. + function AddString(const S: UTF8String): integer; + // Get the refstring by ID + function ById(index: integer): TsdRefString; + // Delete refstring by ID + procedure Delete(ByIdIndex: integer); + // determine if the stringrec exists + function ExistStringRec(const SR: TsdStringRec): boolean; + // Get the string of refstring with ID + function GetString(ID: integer): UTF8String; + // Set the string value of refstring with ID. + procedure SetString(var ID: integer; const S: UTF8String); + // Number of refstrings + function StringCount: integer; + procedure SaveToFile(const AFileName: string); + procedure SaveToStream(S: TStream); + end; + +{utility functions} + +// convert a string into a string rec +function sdStringToSR(const S: Utf8String): TsdStringRec; + +// convert a string rec into a string +function sdSRToString(const SR: TsdStringRec): Utf8String; + +// compare two string recs. This is NOT an alphabetic compare. SRs are first +// compared by length, then by first byte, then last byte then second, then +// N-1, until all bytes are compared. +function sdCompareSR(const SR1, SR2: TsdStringRec): integer; + +// compare 2 bytes +function sdCompareByte(Byte1, Byte2: byte): integer; + +// compare 2 integers +function sdCompareInteger(Int1, Int2: integer): integer; + +function sdUtf16ToUtf8Mem(Src: Pword; Dst: Pbyte; Count: integer): integer; +function sdUtf8ToUtf16Mem(var Src: Pbyte; Dst: Pword; Count: integer): integer; +procedure sdStreamWrite(S: TStream; const AString: AnsiString); +procedure sdStreamWriteStringRec(S: TStream; const AStringRec: TsdStringRec); +procedure sdStreamWriteRefString(S: TStream; ARefString: TsdRefString); + +implementation + +{ TsdRefString } + +function TsdRefString.AsString: UTF8String; +begin + Result := sdSRToString(StringRec); +end; + +function TsdRefString.CompareToSR(const SR: TsdStringRec): integer; +begin + if SR.Count = 0 then + begin + // shortcut + Result := 1; + exit; + end; + Result := sdCompareSR(StringRec, SR); +end; + +destructor TsdRefString.Destroy; +begin + FreeMem(FFirst); + inherited; +end; + +procedure TsdRefString.SetString(const SR: TsdStringRec); +begin + FCharCount := SR.Count; + ReallocMem(FFirst, FCharCount); + Move(SR.First^, FFirst^, FCharCount); +end; + +function TsdRefString.StringRec: TsdStringRec; +begin + Result.First := FFirst; + Result.Count := FCharCount; +end; + +{ TsdRefStringList } + +function TsdRefStringList.GetItems(Index: integer): TsdRefString; +begin + Result := Get(Index); +end; + +function TsdRefStringList.IndexOfID(AID: integer; var Index: integer): boolean; +var + Min, Max: integer; +begin + Result := False; + + // Find position - binary method + Index := 0; + Min := 0; + Max := Count; + while Min < Max do + begin + Index := (Min + Max) div 2; + case sdCompareInteger(Items[Index].FID, AID) of + -1: Min := Index + 1; + 0: begin + Result := True; + exit; + end; + 1: Max := Index; + end; + end; + + Index := Min; +end; + +function TsdRefStringList.IndexOfSR(const AStringRec: TsdStringRec; var Index: integer): boolean; +var + Min, Max: integer; + SR: TsdStringRec; +begin + Result := False; + + // Find position - binary method + Index := 0; + Min := 0; + Max := Count; + while Min < Max do + begin + Index := (Min + Max) div 2; + SR := TsdRefString(Get(Index)).StringRec; + case sdCompareSR(SR, AStringRec) of + -1: Min := Index + 1; + 0: begin + Result := True; + exit; + end; + 1: Max := Index; + end; + end; + + Index := Min; +end; + +{ TsdStringTable } + +function TsdStringTable.AddString(const S: UTF8String): integer; +var + SR: TsdStringRec; +begin + SR := sdStringToSR(S); + Result := AddStringRec(SR); +end; + +function TsdStringTable.AddStringRec(const SR: TsdStringRec): integer; +var + BySRIndex: integer; + Item: TsdRefString; + NewSR: TsdStringRec; + Res: boolean; +begin + // zero-length string + if SR.Count = 0 then + begin + Result := 0; + exit; + end; + + // Try to find the new string + if FBySR.IndexOfSR(SR, BySRIndex) then + begin + Item := FBySR.Items[BySRIndex]; + inc(Item.FFrequency); + Result := Item.FID; + exit; + end; + + // Not found.. must make new item + Item := TsdRefString.Create; + Item.SetString(SR); + NewSR := Item.StringRec; + Item.FID := NextUniqueID; + FById.Add(Item); + Item.FFrequency := 1; + + // debug: + //SetLength(Item.FValue, Item.FCount); + //Move(Item.FirstPtr(FBase)^, Item.FValue[1], Item.FCount); + + // Insert in BySR lists + Res := FBySR.IndexOfSR(NewSR, BySRIndex); + assert(Res = False); + FBySR.Insert(BySRIndex, Item); + Result := Item.FID; +end; + +function TsdStringTable.ById(index: integer): TsdRefString; +begin + Result := FById[Index]; +end; + +procedure TsdStringTable.Clear; +begin + FByID.Clear; + FBySR.Clear; +end; + +constructor TsdStringTable.Create; +begin + inherited Create; + FByID := TsdRefStringList.Create(False); + FBySR := TsdRefStringList.Create(True); +end; + +procedure TsdStringTable.DecFrequency(AItem: TsdRefString; ByIdIndex: integer); +var + BySRIndex: integer; + Res: boolean; +begin + dec(AItem.FFrequency); + assert(AItem.FFrequency >= 0); + + if AItem.FFrequency = 0 then + begin + // We must remove it + FById.Delete(ByIdIndex); + Res := FBySR.IndexOfSR(AItem.StringRec, BySRIndex); + assert(Res = True); + FBySR.Delete(BySRIndex); + end; +end; + +procedure TsdStringTable.Delete(ByIdIndex: integer); +var + Item: TsdRefString; + BySRIndex: integer; + Res: boolean; +begin + Item := FById[ByIdIndex]; + if Item = nil then + exit; + FById.Delete(ByIdIndex); + Res := FBySR.IndexOfSR(Item.StringRec, BySRIndex); + assert(Res = True); + FBySR.Delete(BySRIndex); +end; + +destructor TsdStringTable.Destroy; +begin + FreeAndNil(FByID); + FreeAndNil(FBySR); + inherited; +end; + +function TsdStringTable.ExistStringRec(const SR: TsdStringRec): boolean; +var + BySRIndex: integer; +begin + // zero-length string + if SR.Count = 0 then + begin + Result := False; + exit; + end; + + // Try to find the new string + Result := FBySR.IndexOfSR(SR, BySRIndex); + +end; + +function TsdStringTable.GetString(ID: integer): UTF8String; +var + Index, Count: integer; + Item: TsdRefString; +begin + if ID = 0 then + begin + Result := ''; + exit; + end; + + // Find the ID + if FByID.IndexOfID(ID, Index) then + begin + Item := FById[Index]; + Count := Item.FCharCount; + SetLength(Result, Count); + Move(Item.FFirst^, Result[1], Count); + exit; + end; + + Result := ''; +end; + +function TsdStringTable.NextUniqueID: integer; +begin + if FById.Count = 0 then + Result := 1 + else + Result := FByID[FByID.Count - 1].FID + 1; +end; + +procedure TsdStringTable.SaveToFile(const AFileName: string); +var + F: TFileStream; +begin + F := TFileStream.Create(AFileName, fmCreate); + try + SaveToStream(F); + finally + F.Free; + end; +end; + +procedure TsdStringTable.SaveToStream(S: TStream); +var + i: integer; + R: UTF8String; +begin + for i := 0 to FBySR.Count - 1 do + begin + R := FBySR[i].AsString + #13#10; + S.Write(R[1], length(R)); + end; +end; + +procedure TsdStringTable.SetString(var ID: integer; const S: UTF8String); +var + ByIdIndex: integer; + Item: TsdRefString; + SR: TsdStringRec; +begin + // Make temp string record + SR := sdStringtoSR(S); + + // Do we have a ref string with this ID? + if (ID > 0) and FByID.IndexOfID(ID, ByIdIndex) then + begin + // Is the string still the same? + Item := FById[ByIdIndex]; + if Item.CompareToSR(SR) = 0 then + exit; + // The string changed.. + DecFrequency(Item, ByIdIndex); + end; + + ID := AddStringRec(SR); +end; + +{utility functions} + +function TsdStringTable.StringCount: integer; +begin + Result := FBySR.Count; +end; + +function sdStringToSR(const S: UTF8String): TsdStringRec; +begin + Result.Count := length(S); + if Result.Count = 0 then + Result.First := nil + else + Result.First := @S[1]; +end; + +function sdSRToString(const SR: TsdStringRec): UTF8String; +begin + SetLength(Result, SR.Count); + if SR.Count > 0 then + Move(SR.First^, Result[1], SR.Count); +end; + +function sdCompareByte(Byte1, Byte2: byte): integer; +begin + if Byte1 < Byte2 then + Result := -1 + else + if Byte1 > Byte2 then + Result := 1 + else + Result := 0; +end; + +function sdCompareInteger(Int1, Int2: integer): integer; +begin + if Int1 < Int2 then + Result := -1 + else + if Int1 > Int2 then + Result := 1 + else + Result := 0; +end; + +function sdCompareSR(const SR1, SR2: TsdStringRec): integer; +var + Count: integer; + First1, First2, Last1, Last2: Pbyte; +begin + // Compare string length first + Result := sdCompareInteger(SR1.Count, SR2.Count); + if Result <> 0 then + exit; + + // Compare first + Result := sdCompareByte(SR1.First^, SR2.First^); + if Result <> 0 then + exit; + Count := SR1.Count; + + // Setup First & Last pointers + First1 := SR1.First; + First2 := SR2.First; + Last1 := First1; inc(Last1, Count); + Last2 := First2; inc(Last2, Count); + + // Compare each time last ptrs then first ptrs, until they meet in the middle + repeat + dec(Last1); + dec(Last2); + if First1 = Last1 then + exit; + Result := sdCompareByte(Last1^, Last2^); + if Result <> 0 then + exit; + inc(First1); inc(First2); + if First1 = Last1 then + exit; + Result := sdCompareByte(First1^, First2^); + if Result <> 0 then + exit; + until False; +end; + +function sdUtf16ToUtf8Mem(Src: Pword; Dst: Pbyte; Count: integer): integer; +// Convert an Unicode (UTF16 LE) memory block to UTF8. This routine will process +// Count wide characters (2 bytes size) to Count UTF8 characters (1-3 bytes). +// Therefore, the block at Dst must be at least 1.5 the size of the source block. +// The function returns the number of *bytes* written. +var + W: word; + DStart: Pbyte; +begin + DStart := Dst; + while Count > 0 do + begin + W := Src^; + inc(Src); + if W <= $7F then + begin + Dst^ := byte(W); + inc(Dst); + end else + begin + if W > $7FF then + begin + Dst^ := byte($E0 or (W shr 12)); + inc(Dst); + Dst^ := byte($80 or ((W shr 6) and $3F)); + inc(Dst); + Dst^ := byte($80 or (W and $3F)); + inc(Dst); + end else + begin // $7F < W <= $7FF + Dst^ := byte($C0 or (W shr 6)); + inc(Dst); + Dst^ := byte($80 or (W and $3F)); + inc(Dst); + end; + end; + dec(Count); + end; + Result := integer(Dst) - integer(DStart); +end; + +function sdUtf8ToUtf16Mem(var Src: Pbyte; Dst: Pword; Count: integer): integer; +// Convert an UTF8 memory block to Unicode (UTF16 LE). This routine will process +// Count *bytes* of UTF8 (each character 1-3 bytes) into UTF16 (each char 2 bytes). +// Therefore, the block at Dst must be at least 2 times the size of Count, since +// many UTF8 characters consist of just one byte, and are mapped to 2 bytes. The +// function returns the number of *wide chars* written. Note that the Src block must +// have an exact number of UTF8 characters in it, if Count doesn't match then +// the last character will be converted anyway (going past the block boundary!) +var + W: word; + C: byte; + DStart: Pword; + SClose: Pbyte; +begin + DStart := Dst; + SClose := Src; + inc(SClose, Count); + while integer(Src) < integer(SClose) do + begin + // 1st byte + W := Src^; + inc(Src); + if W and $80 <> 0 then + begin + W := W and $3F; + if W and $20 <> 0 then + begin + // 2nd byte + C := Src^; + inc(Src); + if C and $C0 <> $80 then + // malformed trail byte or out of range char + Continue; + W := (W shl 6) or (C and $3F); + end; + // 2nd or 3rd byte + C := Src^; + inc(Src); + if C and $C0 <> $80 then + // malformed trail byte + Continue; + Dst^ := (W shl 6) or (C and $3F); + inc(Dst); + end else + begin + Dst^ := W; + inc(Dst); + end; + end; + Result := (integer(Dst) - integer(DStart)) div 2; +end; + +procedure sdStreamWrite(S: TStream; const AString: AnsiString); +var + L: integer; +begin + L := Length(AString); + if L > 0 then + begin + S.Write(AString[1], L); + end; +end; + +procedure sdStreamWriteStringRec(S: TStream; const AStringRec: TsdStringRec); +begin + S.Write(PAnsiChar(AStringRec.First)^, AStringRec.Count); +end; + +procedure sdStreamWriteRefString(S: TStream; ARefString: TsdRefString); +begin + if ARefString = nil then + exit; + S.Write(PAnsiChar(ARefString.FFirst)^, ARefString.FCharCount); +end; + +end. diff --git a/Variations/varAffine3D.pas b/Variations/varAffine3D.pas new file mode 100644 index 0000000..763a2c8 --- /dev/null +++ b/Variations/varAffine3D.pas @@ -0,0 +1,325 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit varAffine3D; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationAffine3D = class(TBaseVariation) + private + affine3D_a00, affine3D_a01, affine3D_a02, + affine3D_a10, affine3D_a11, affine3D_a12, + affine3D_a20, affine3D_a21, affine3D_a22, + affine3D_bx, affine3D_by, affine3D_bz: double; + x0, y0, z0: double; + affine3D_mode: byte; + procedure CalcPre; + procedure CalcPost; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure GetCalcFunction(var f: TCalcFunction); override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationAffine3D.GetCalcFunction(var f: TCalcFunction); +begin + case affine3D_mode of + 0: f := CalcPre; + 1: f := CalcFunction; + else f := CalcPost; + end; +end; + +procedure TVariationAffine3D.CalcPre; +var x, y, z, dn: double; +begin + x := affine3D_a00 * FTx^ - affine3D_a01 * FTy^ + affine3D_a02 * FTz^ + affine3D_bx; + y := -(affine3D_a10 * FTx^ - affine3D_a11 * FTy^ + affine3D_a12 * FTz^ + affine3D_by); + z := affine3D_a20 * FTx^ - affine3D_a21 * FTy^ + affine3D_a22 * FTz^ + affine3D_bz; + + FTx^ := VVAR * x; + FTy^ := VVAR * y; + FTz^ := VVAR * z; + + dn := hypot(x - x0, y - y0, z - z0); + if (dn <> 0) then color^ := abs(cos(hypot(x - x0, y - y0) / dn)) + else color^ := 0; +end; + +procedure TVariationAffine3D.CalcFunction; +var x, y, z, dn: double; +begin + + x := affine3D_a00 * FTx^ - affine3D_a01 * FTy^ + affine3D_a02 * FTz^ + affine3D_bx; + y := -(affine3D_a10 * FTx^ - affine3D_a11 * FTy^ + affine3D_a12 * FTz^ + affine3D_by); + z := affine3D_a20 * FTx^ - affine3D_a21 * FTy^ + affine3D_a22 * FTz^ + affine3D_bz; + + FPx^ := FPx^ + VVAR * x; + FPy^ := FPy^ + VVAR * y; + FPz^ := FPz^ + VVAR * z; + + dn := hypot(x - x0, y - y0, z - z0); + if (dn <> 0) then color^ := abs(cos(hypot(x - x0, y - y0) / dn)) + else color^ := 0; +end; + +procedure TVariationAffine3D.CalcPost; +var x, y, z, dn: double; +begin + + x := affine3D_a00 * FPx^ - affine3D_a01 * FPy^ + affine3D_a02 * FPz^ + affine3D_bx; + y := -(affine3D_a10 * FPx^ - affine3D_a11 * FPy^ + affine3D_a12 * FPz^ + affine3D_by); + z := affine3D_a20 * FPx^ - affine3D_a21 * FPy^ + affine3D_a22 * FPz^ + affine3D_bz; + + FPx^ := VVAR * x; + FPy^ := VVAR * y; + FPz^ := VVAR * z; + + dn := hypot(x - x0, y - y0, z - z0); + if (dn <> 0) then color^ := abs(cos(hypot(x - x0, y - y0) / dn)) + else color^ := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationAffine3D.Create; +begin + affine3D_a00 := 1; affine3D_a01 := 0; affine3D_a02 := 0; + affine3D_a10 := 0; affine3D_a11 := 1; affine3D_a12 := 0; + affine3D_a20 := 0; affine3D_a21 := 0; affine3D_a22 := 1; + affine3D_bx := 0; affine3D_by := 0; affine3D_bz := 0; + x0 := 0; y0 := 0; z0 := 0; + affine3D_mode := 1; // order of applying +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationAffine3D.GetInstance: TBaseVariation; +begin + Result := TVariationAffine3D.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationAffine3D.GetName: string; +begin + Result := 'affine3D'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationAffine3D.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'affine3D_a00'; + 1: Result := 'affine3D_a01'; + 2: Result := 'affine3D_a02'; + 3: Result := 'affine3D_a10'; + 4: Result := 'affine3D_a11'; + 5: Result := 'affine3D_a12'; + 6: Result := 'affine3D_a20'; + 7: Result := 'affine3D_a21'; + 8: Result := 'affine3D_a22'; + 9: Result := 'affine3D_bx'; + 10: Result := 'affine3D_by'; + 11: Result := 'affine3D_bz'; + 12: Result := 'affine3D_dc_x0'; + 13: Result := 'affine3D_dc_y0'; + 14: Result := 'affine3D_dc_z0'; + 15: Result := 'affine3D_mode'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationAffine3D.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'affine3D_a00' then begin + affine3D_a00 := Value; + Result := True; + end else if Name = 'affine3D_a01' then begin + affine3D_a01 := Value; + Result := True; + end else if Name = 'affine3D_a02' then begin + affine3D_a02 := Value; + Result := True; + end else if Name = 'affine3D_a10' then begin + affine3D_a10 := Value; + Result := True; + end else if Name = 'affine3D_a11' then begin + affine3D_a11 := Value; + Result := True; + end else if Name = 'affine3D_a12' then begin + affine3D_a12 := Value; + Result := True; + end else if Name = 'affine3D_a20' then begin + affine3D_a20 := Value; + Result := True; + end else if Name = 'affine3D_a21' then begin + affine3D_a21 := Value; + Result := True; + end else if Name = 'affine3D_a22' then begin + affine3D_a22 := Value; + Result := True; + end else if Name = 'affine3D_bx' then begin + affine3D_bx := Value; + Result := True; + end else if Name = 'affine3D_by' then begin + affine3D_by := Value; + Result := True; + end else if Name = 'affine3D_bz' then begin + affine3D_bz := Value; + Result := True; + end else if Name = 'affine3D_dc_x0' then begin + x0 := Value; + Result := True; + end else if Name = 'affine3D_dc_y0' then begin + y0 := Value; + Result := True; + end else if Name = 'affine3D_dc_z0' then begin + z0 := Value; + Result := True; + end else if Name = 'affine3D_mode' then begin + if (Value < 0) then Value := 0; + if (Value > 2) then Value := 2; + affine3D_mode := Round(Value); + Result := True; + end +end; +function TVariationAffine3D.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'affine3D_a00' then begin + affine3D_a00 := 1; + Result := True; + end else if Name = 'affine3D_a01' then begin + affine3D_a01 := 0; + Result := True; + end else if Name = 'affine3D_a02' then begin + affine3D_a02 := 0; + Result := True; + end else if Name = 'affine3D_a10' then begin + affine3D_a10 := 0; + Result := True; + end else if Name = 'affine3D_a11' then begin + affine3D_a11 := 1; + Result := True; + end else if Name = 'affine3D_a12' then begin + affine3D_a12 := 0; + Result := True; + end else if Name = 'affine3D_a20' then begin + affine3D_a20 := 0; + Result := True; + end else if Name = 'affine3D_a21' then begin + affine3D_a21:= 0; + Result := True; + end else if Name = 'affine3D_a22' then begin + affine3D_a22 := 1; + Result := True; + end else if Name = 'affine3D_bx' then begin + affine3D_bx := 0; + Result := True; + end else if Name = 'affine3D_by' then begin + affine3D_by := 0; + Result := True; + end else if Name = 'affine3D_bz' then begin + affine3D_bz := 0; + Result := True; + end else if Name = 'affine3D_dc_x0' then begin + x0 := 0; + Result := True; + end else if Name = 'affine3D_dc_y0' then begin + y0 := 0; + Result := True; + end else if Name = 'affine3D_dc_z0' then begin + z0 := 0; + Result := True; + end else if Name = 'affine3D_mode' then begin + affine3D_mode := 1; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationAffine3D.GetNrVariables: integer; +begin + Result := 16 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationAffine3D.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'affine3D_a00' then begin + Value := affine3D_a00; + Result := True; + end else if Name = 'affine3D_a01' then begin + Value := affine3D_a01; + Result := True; + end else if Name = 'affine3D_a02' then begin + Value := affine3D_a02; + Result := True; + end else if Name = 'affine3D_a10' then begin + Value := affine3D_a10; + Result := True; + end else if Name = 'affine3D_a11' then begin + Value := affine3D_a11; + Result := True; + end else if Name = 'affine3D_a12' then begin + Value := affine3D_a12; + Result := True; + end else if Name = 'affine3D_a20' then begin + Value := affine3D_a20; + Result := True; + end else if Name = 'affine3D_a21' then begin + Value := affine3D_a21; + Result := True; + end else if Name = 'affine3D_a22' then begin + Value := affine3D_a22; + Result := True; + end else if Name = 'affine3D_bx' then begin + Value := affine3D_bx; + Result := True; + end else if Name = 'affine3D_by' then begin + Value := affine3D_by; + Result := True; + end else if Name = 'affine3D_bz' then begin + Value := affine3D_bz; + Result := True; + end else if Name = 'affine3D_dc_x0' then begin + Value:= x0; + Result := True; + end else if Name = 'affine3D_dc_y0' then begin + Value := y0; + Result := True; + end else if Name = 'affine3D_dc_z0' then begin + Value := z0; + Result := True; + end else if Name = 'affine3D_mode' then begin + Value := affine3D_mode; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationAffine3D), true, true); +end. \ No newline at end of file diff --git a/Variations/varArch.pas b/Variations/varArch.pas new file mode 100644 index 0000000..8a75efb --- /dev/null +++ b/Variations/varArch.pas @@ -0,0 +1,119 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit varArch; + +interface +uses + BaseVariation, XFormMan; + +const + sweight = 'Z_arch_weight'; + +type + TVariationArch = class(TBaseVariation) + private + vpi, weight: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + + +implementation + +uses + Math; + +//////////////////////// +procedure TVariationArch.Prepare; +begin + vpi := pi * weight; // arch behavior +end; + +procedure TVariationArch.CalcFunction; +var + sinr, cosr: double; +begin + SinCos(random * vpi, sinr, cosr); + if cosr = 0 then exit; + + FPx^ := FPx^ + vvar * sinr; + FPy^ := FPy^ + sqr(sinr) / cosr * vvar; +end; + +constructor TVariationArch.Create; +begin + inherited Create; + weight := 1; +end; + +class function TVariationArch.GetInstance: TBaseVariation; +begin + Result := TVariationArch.Create; +end; + +class function TVariationArch.GetName: string; +begin + Result := 'Z_arch'; +end; + +{ ////////////////////////////////////////////////////////////////////// } + +function TVariationArch.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := sweight; + else + Result := ''; + end; +end; + +function TVariationArch.GetNrVariables: integer; +begin + Result := 1; +end; + +function TVariationArch.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = sweight then begin + Value := weight; + Result := True; + end; +end; + +function TVariationArch.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = sweight then begin + weight := Value; + Result := True; + end; +end; + +function TVariationArch.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = sweight then begin + weight := 1; + Result := True; + end; +end; + +{ ///////////////////////////////////////////////////////////////////////////// } +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationArch), false, false); + +end. diff --git a/Variations/varAuger.pas b/Variations/varAuger.pas new file mode 100644 index 0000000..90dc9c4 --- /dev/null +++ b/Variations/varAuger.pas @@ -0,0 +1,176 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varAuger; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationAuger = class(TBaseVariation) + private + auger_freq, auger_weight, auger_scale, auger_sym: double; + + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationAuger.Prepare; +begin +end; + +procedure TVariationAuger.CalcFunction; +var x, y, s, t, dx, dy: double; +begin + x := FTx^; + y := FTy^; + + s := sin(auger_freq * x); + t := sin(auger_freq * y); + + dx := x + auger_weight * (0.5 * auger_scale * t + abs(x) * t); + dy := y + auger_weight * (0.5 * auger_scale * s + abs(y) * s); + + FPx^ := FPx^ + VVAR * (x + auger_sym * (dx - x)); + FPy^ := FPy^ + VVAR * dy; + FPz^ := FPz^ + VVAR * FTz^; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationAuger.Create; +begin + auger_freq := 5; auger_weight := 0.5; + auger_scale := 0.1; auger_sym := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationAuger.GetInstance: TBaseVariation; +begin + Result := TVariationAuger.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationAuger.GetName: string; +begin + Result := 'auger'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationAuger.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'auger_freq'; + 1: Result := 'auger_weight'; + 2: Result := 'auger_scale'; + 3: Result := 'auger_sym'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationAuger.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'auger_freq' then begin + auger_freq := Value; + Result := True; + end else if Name = 'auger_weight' then begin + auger_weight := Value; + Result := True; + end else if Name = 'auger_scale' then begin + auger_scale := Value; + Result := True; + end else if Name = 'auger_sym' then begin + auger_sym := Value; + Result := True; + end +end; +function TVariationAuger.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'auger_freq' then begin + auger_freq := 5; + Result := True; + end else if Name = 'auger_weight' then begin + auger_weight := 0.5; + Result := True; + end else if Name = 'auger_scale' then begin + auger_scale := 0.1; + Result := True; + end else if Name = 'auger_sym' then begin + auger_sym := 0; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationAuger.GetNrVariables: integer; +begin + Result := 4 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationAuger.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'auger_freq' then begin + Value := auger_freq; + Result := True; + end else if Name = 'auger_weight' then begin + Value := auger_weight; + Result := True; + end else if Name = 'auger_scale' then begin + Value := auger_scale; + Result := True; + end else if Name = 'auger_sym' then begin + Value := auger_sym; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationAuger), true, false); +end. \ No newline at end of file diff --git a/Variations/varBent2.pas b/Variations/varBent2.pas new file mode 100644 index 0000000..b88ef7c --- /dev/null +++ b/Variations/varBent2.pas @@ -0,0 +1,152 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit varBent2; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationBent2 = class(TBaseVariation) + private + b2x, b2y, b2z, vvarx, vvary, vvarz: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +{ TVariationBent2 } + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationBent2.Prepare; +begin + vvarx := vvar * b2x; + vvary := vvar * b2y; + vvarz := vvar * b2z; +end; + +procedure TVariationBent2.CalcFunction; +begin + if(FTx^ < 0.0) then + FPx^ := FPx^ + vvarx * FTx^ + else + FPx^ := FPx^ + vvar * FTx^; + if (FTy^ < 0) then + FPy^ := FPy^ + vvary * FTy^ + else + FPy^ := FPy^ + vvar * FTy^; + // AV: added 3D-support + if (FTz^ < 0) then + FPz^ := FPz^ + vvarz * FTz^ + else + FPz^ := FPz^ + vvar * FTz^; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationBent2.GetName: string; +begin + Result := 'bent2'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationBent2.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'bent2_x'; + 1: Result := 'bent2_y'; + 2: Result := 'bent2_z'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationBent2.GetNrVariables: integer; +begin + Result := 3; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationBent2.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'bent2_x' then begin + b2x := Value; + Result := True; + end else if Name = 'bent2_y' then begin + b2y := Value; + Result := True; + end else if Name = 'bent2_z' then begin + b2z := Value; + Result := True; + end; +end; + +function TVariationBent2.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'bent2_x' then begin + b2x := 1; + Result := True; + end else if Name = 'bent2_y' then begin + b2y := 1; + Result := True; + end else if Name = 'bent2_z' then begin + b2z := 1; + Result := True; + end; +end; + + +/////////////////////////////////////////////////////////////////////////////// +function TVariationBent2.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'bent2_x' then begin + Value := b2x; + Result := True; + end else if Name = 'bent2_y' then begin + Value := b2y; + Result := True; + end else if Name = 'bent2_z' then begin + Value := b2z; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationBent2.Create; +begin + b2x := 2; + b2y := 0.5; + b2z := 1; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationBent2.GetInstance: TBaseVariation; +begin + Result := TVariationBent2.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationBent2), true, false); +end. diff --git a/Variations/varBipolar.pas b/Variations/varBipolar.pas new file mode 100644 index 0000000..9e73bc5 --- /dev/null +++ b/Variations/varBipolar.pas @@ -0,0 +1,163 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varBipolar; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationBipolar = class(TBaseVariation) + private + bipolar_shift, v_4, v, s: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationBipolar.Prepare; +begin + v_4 := VVAR * 0.15915494309189533576888376337251; // AV: 1/(2*PI) + v := VVAR * 0.636619772367581343075535053490061; // AV: 2/PI + s := -1.57079632679489661923 * (bipolar_shift); // AV: -PI/2 +end; + +procedure TVariationBipolar.CalcFunction; +var x2y2, y, t, x2, f, g : double; +begin + x2y2 := sqr(FTx^) + sqr(FTy^); + y := 0.5 * ArcTan2(2.0 * FTy^, x2y2 - 1.0) + (s); + + if (y > 1.57079632679489661923) then + y := -1.57079632679489661923 + fmod(y + 1.57079632679489661923, PI) + else if (y < -1.57079632679489661923) then + y := 1.57079632679489661923 - fmod(1.57079632679489661923 - y, PI); + + t := x2y2 + 1.0; + x2 := 2.0 * FTx^; + + f := t + x2; + g := t - x2; + + if (g = 0) or (f/g <= 0) then + Exit; + + FPx^ := FPx^ + (v_4) * Ln((t+x2) / (t-x2)); + FPy^ := FPy^ + (v) * y; + + FPz^ := FPz^ + vvar * FTz^; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationBipolar.Create; +begin + bipolar_shift := 0; + v_4 := 0; + v := 0; + s := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationBipolar.GetInstance: TBaseVariation; +begin + Result := TVariationBipolar.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationBipolar.GetName: string; +begin + Result := 'bipolar'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationBipolar.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'bipolar_shift'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationBipolar.SetVariable(const Name: string; var value: double): boolean; +var temp: double; +begin + Result := False; + if Name = 'bipolar_shift' then begin + temp := frac(0.5 * (value + 1.0)); + value := 2.0 * temp - 1.0; + bipolar_shift := Value; + Result := True; + end +end; + +function TVariationBipolar.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'bipolar_shift' then begin + bipolar_shift := 0; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationBipolar.GetNrVariables: integer; +begin + Result := 1 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationBipolar.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'bipolar_shift' then begin + Value := bipolar_shift; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationBipolar), true, false); +end. \ No newline at end of file diff --git a/Variations/varBlade.pas b/Variations/varBlade.pas new file mode 100644 index 0000000..b20e7fa --- /dev/null +++ b/Variations/varBlade.pas @@ -0,0 +1,61 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit varBlade; + +interface +uses + BaseVariation, XFormMan; + +type + TVariationBlade = class(TBaseVariation) + private + + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +//////////////////////// + +procedure TVariationBlade.CalcFunction; +var + r, sinr, cosr: double; +begin + r := sqrt(sqr(FTx^) + sqr(FTy^)) * vvar; + SinCos(r * random, sinr, cosr); + r := vvar * FTx^; + FPx^ := FPx^ + r * (cosr + sinr); + FPy^ := FPy^ + r * (cosr - sinr); + // AV: added real 3D support + FPz^ := FPz^ + vvar * FTy^ * (sinr - cosr); +end; + +constructor TVariationBlade.Create; +begin + inherited Create; +end; + +class function TVariationBlade.GetInstance: TBaseVariation; +begin + Result := TVariationBlade.Create; +end; + +class function TVariationBlade.GetName: string; +begin + Result := 'blade'; +end; + +////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationBlade), true, false); + +end. diff --git a/Variations/varBlob.pas b/Variations/varBlob.pas new file mode 100644 index 0000000..def8edf --- /dev/null +++ b/Variations/varBlob.pas @@ -0,0 +1,131 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit varBlob; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationBlob = class(TBaseVariation) + private + FLow, FHigh, FWaves: double; + VLow, VHeight: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +{ TVariationBlob } + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationBlob.Prepare; +begin + VHeight := vvar * (FHigh - FLow) / 2; + VLow := vvar * FLow + VHeight; +end; + +procedure TVariationBlob.CalcFunction; +var + r : double; +begin + r := VLow + VHeight * sin(FWaves * arctan2(FTx^, FTy^)); + + FPx^ := FPx^ + r * FTx^; + FPy^ := FPy^ + r * FTy^; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationBlob.GetName: string; +begin + Result := 'blob'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationBlob.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'blob_low'; + 1: Result := 'blob_high'; + 2: Result := 'blob_waves'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationBlob.GetNrVariables: integer; +begin + Result := 3; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationBlob.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'blob_low' then begin + FLow := Value; + Result := True; + end else if Name = 'blob_high' then begin + FHigh := Value; + Result := True; + end else if Name = 'blob_waves' then begin + // Value := Round(Value); + FWaves := Value; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationBlob.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'blob_low' then begin + Value := FLow; + Result := True; + end else if Name = 'blob_high' then begin + Value := FHigh; + Result := True; + end else if Name = 'blob_waves' then begin + Value := FWaves; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationBlob.Create; +begin + inherited Create; + + FWaves := Round(2 + 5 * Random); + FLow := 0.2 + 0.5 * random; + FHigh := 0.8 + 0.4 * random; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationBlob.GetInstance: TBaseVariation; +begin + Result := TVariationBlob.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationBlob), false, false); +end. diff --git a/Variations/varBlurCircle.pas b/Variations/varBlurCircle.pas new file mode 100644 index 0000000..9b4b6d3 --- /dev/null +++ b/Variations/varBlurCircle.pas @@ -0,0 +1,154 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varBlurCircle; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationBlurCircle = class(TBaseVariation) + private + PI_4, hole: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationBlurCircle.Prepare; +begin + //VVAR4_PI := VVAR * 4.0 / PI; // AV: it's useless + PI_4 := PI / 4.0; +end; + +procedure TVariationBlurCircle.CalcFunction; +var + x, y, absx, absy, side, perimeter, r, sina, cosa: double; +begin + x := 2.0 * random - 1.0; + y := 2.0 * random - 1.0; + + absx := abs(x); //if absx < 0 then absx := absx * -1.0; + absy := abs(y); //if absy < 0 then absy := absy * -1.0; + + if (absx >= absy) then + begin + if (x >= absy) then + perimeter := absx + y + else perimeter := 5.0 * absx - y; + side := absx; + end else + begin + if (y >= absx) then + perimeter := 3.0 * absy - x + else perimeter := 7.0 * absy + x; + side := absy; + end; + + r := VVAR * (side + hole); + SinCos(PI_4 * perimeter / side - PI_4, sina, cosa); + + FPx^ := FPx^ + r * cosa; + FPy^ := FPy^ + r * sina; + FPz^ := FPz^ + vvar * FTz^; +end; + + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationBlurCircle.Create; +begin + hole := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationBlurCircle.GetInstance: TBaseVariation; +begin + Result := TVariationBlurCircle.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationBlurCircle.GetName: string; +begin + Result := 'blur_circle'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationBlurCircle.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'blur_circle_hole'; + else + Result := ''; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationBlurCircle.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'blur_circle_hole' then begin + hole := Value; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationBlurCircle.GetNrVariables: integer; +begin + Result := 1; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationBlurCircle.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'blur_circle_hole' then begin + Value := hole; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationBlurCircle), true, false); +end. \ No newline at end of file diff --git a/Variations/varBlurPixelize.pas b/Variations/varBlurPixelize.pas new file mode 100644 index 0000000..c1b29b5 --- /dev/null +++ b/Variations/varBlurPixelize.pas @@ -0,0 +1,153 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varBlurPixelize; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationBlurPixelize = class(TBaseVariation) + private + blur_pixelize_size, blur_pixelize_scale: double; + inv_size, v: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationBlurPixelize.Prepare; +begin + inv_size := 1.0 / blur_pixelize_size; + v := vvar * blur_pixelize_size; +end; + +procedure TVariationBlurPixelize.CalcFunction; +var x, y: double; +begin + x := floor(FTx^*(inv_size)); + y := floor(FTy^*(inv_size)); + + FPx^ := FPx^ + (v) * (x + (blur_pixelize_scale) * (random - 0.5) + 0.5); + FPy^ := FPy^ + (v) * (y + (blur_pixelize_scale) * (random - 0.5) + 0.5); + FPz^ := FPz^ + vvar * FTz^; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationBlurPixelize.Create; +begin + blur_pixelize_size := 0.1; + blur_pixelize_scale := 1; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationBlurPixelize.GetInstance: TBaseVariation; +begin + Result := TVariationBlurPixelize.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationBlurPixelize.GetName: string; +begin + Result := 'blur_pixelize'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationBlurPixelize.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'blur_pixelize_size'; + 1: Result := 'blur_pixelize_scale'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationBlurPixelize.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'blur_pixelize_size' then begin + if (value < 1e-6) then value := 1e-6; + blur_pixelize_size := Value; + Result := True; + end else if Name = 'blur_pixelize_scale' then begin + blur_pixelize_scale := Value; + Result := True; + end +end; +function TVariationBlurPixelize.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'blur_pixelize_size' then begin + blur_pixelize_size := 0.1; + Result := True; + end else if Name = 'blur_pixelize_scale' then begin + blur_pixelize_size := 1; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationBlurPixelize.GetNrVariables: integer; +begin + Result := 2 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationBlurPixelize.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'blur_pixelize_size' then begin + Value := blur_pixelize_size; + Result := True; + end else if Name = 'blur_pixelize_scale' then begin + Value := blur_pixelize_scale; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationBlurPixelize), true, false); +end. \ No newline at end of file diff --git a/Variations/varBlurZoom.pas b/Variations/varBlurZoom.pas new file mode 100644 index 0000000..165abd7 --- /dev/null +++ b/Variations/varBlurZoom.pas @@ -0,0 +1,144 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varBlurZoom; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationBlurZoom = class(TBaseVariation) + private + blur_zoom_length, blur_zoom_x, blur_zoom_y: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationBlurZoom.Prepare; +begin +end; + +procedure TVariationBlurZoom.CalcFunction; +var z: double; +begin + + z := 1.0 + blur_zoom_length * random; + FPx^ := FPx^ + vvar * ((FTx^ - blur_zoom_x) * z + blur_zoom_x); + FPy^ := FPy^ + vvar * ((FTy^ - blur_zoom_y) * z - blur_zoom_y); + FPz^ := FPz^ + vvar * FTz^; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationBlurZoom.Create; +begin + blur_zoom_length := 0; + blur_zoom_x := 0; + blur_zoom_y := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationBlurZoom.GetInstance: TBaseVariation; +begin + Result := TVariationBlurZoom.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationBlurZoom.GetName: string; +begin + Result := 'blur_zoom'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationBlurZoom.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'blur_zoom_length'; + 1: Result := 'blur_zoom_x'; + 2: Result := 'blur_zoom_y'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationBlurZoom.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'blur_zoom_length' then begin + blur_zoom_length := Value; + Result := True; + end else if Name = 'blur_zoom_x' then begin + blur_zoom_y := Value; + Result := True; + end else if Name = 'blur_zoom_y' then begin + blur_zoom_y := Value; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationBlurZoom.GetNrVariables: integer; +begin + Result := 3 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationBlurZoom.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'blur_zoom_length' then begin + Value := blur_zoom_length; + Result := True; + end else if Name = 'blur_zoom_x' then begin + Value := blur_zoom_x; + Result := True; + end else if Name = 'blur_zoom_y' then begin + Value := blur_zoom_y; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationBlurZoom), true, false); +end. \ No newline at end of file diff --git a/Variations/varBoarders2.pas b/Variations/varBoarders2.pas new file mode 100644 index 0000000..83721f1 --- /dev/null +++ b/Variations/varBoarders2.pas @@ -0,0 +1,188 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit varBoarders2; + +interface + +uses + BaseVariation, XFormMan; + +const + sb2c = 'boarders2_c'; + sleft = 'boarders2_left'; + sright = 'boarders2_right'; + eps: double = 1e-30; +type + TVariationBoarders2 = class(TBaseVariation) + private + b2c, left, right, cc, cl, cr: double; + + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +{ TVariationBoarders2 } + +////////////////////////////////////////// +procedure TVariationBoarders2.Prepare; +begin + cc := abs(b2c); + cl := cc * abs(left); + cr := cc + (cc * abs(right)); +end; + +////////////////////////////////////////// +procedure TVariationBoarders2.CalcFunction; +var + roundX, roundY, offsetX, offsetY: double; +begin + roundX := round(FTx^); + roundY := round(FTy^); + offsetX := FTx^ - roundX; + offsetY := FTy^ - roundY; + + if (random >= cr) then + begin + FPx^ := FPx^ + VVAR * (offsetX * cc + roundX); + FPy^ := FPy^ + VVAR * (offsetY * cc + roundY); + end + else begin + if (abs(offsetX) >= abs(offsetY)) then + begin + if(offsetX >= 0.0) then + begin + FPx^ := FPx^ + VVAR * (offsetX * cc + roundX + cl); + FPy^ := FPy^ + VVAR * (offsetY * cc + roundY + cl * offsetY / offsetX); + end + else begin + FPx^ := FPx^ + VVAR * (offsetX * cc + roundX - cl); + FPy^ := FPy^ + VVAR * (offsetY * cc + roundY - cl * offsetY / offsetX); + end; + end + else begin + if(offsetY >= 0.0) then + begin + FPy^ := FPy^ + VVAR * (offsetY * cc + roundY + cl); + FPx^ := FPx^ + VVAR * (offsetX * cc + roundX + offsetX / offsetY * cl); + end + else begin + FPy^ := FPy^ + VVAR * (offsetY * cc + roundY - cl); + FPx^ := FPx^ + VVAR * (offsetX * cc + roundX - offsetX / offsetY * cl); + end; + end; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// + +constructor TVariationBoarders2.Create; +begin + b2c := 0.5; + left := 0.5; + right := 0.5; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationBoarders2.GetInstance: TBaseVariation; +begin + Result := TVariationBoarders2.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationBoarders2.GetName: string; +begin + Result := 'boarders2'; +end; + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +function TVariationBoarders2.GetVariableNameAt(const Index: integer): string; +begin + case Index of + 0: Result := sb2c; + 1: Result := sleft; + 2: Result := sright; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationBoarders2.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = sb2c then begin + if abs(value) = 0 then value := eps; + b2c := value; + Result := True; + end else if Name = sleft then begin + if abs(value) = 0 then value := eps; + left := Value; + Result := True; + end else if Name = sright then begin + if abs(value) = 0 then value := eps; + right := Value; + Result := True; + end; +end; + +function TVariationBoarders2.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = sb2c then begin + b2c := 0.5; + Result := True; + end else if Name = sleft then begin + left := 0.5; + Result := True; + end else if Name = sright then begin + right := 0.5; + Result := True; + end; +end; + +///////////////////////////////////////////////////////////////////// + +function TVariationBoarders2.GetNrVariables: integer; +begin + Result := 3; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationBoarders2.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = sb2c then begin + Value := b2c; + Result := True; + end else if Name = sleft then begin + Value := left; + Result := True; + end else if Name = sright then begin + Value := right; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationBoarders2), false, false); +end. \ No newline at end of file diff --git a/Variations/varButterfly.pas b/Variations/varButterfly.pas new file mode 100644 index 0000000..fba331b --- /dev/null +++ b/Variations/varButterfly.pas @@ -0,0 +1,160 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit varButterfly; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationButterfly = class(TBaseVariation) + const + str_sx: string = 'butterfly_scale_negX'; + str_sy: string = 'butterfly_scale_negY'; + str_sz: string = 'butterfly_3D_shift'; + private + sx, sy, sz, vpi: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +{ TVariationButterfly } + +/////////////////////////////////////////////////////////////////////////////// + +procedure TVariationButterfly.Prepare; +begin + vpi := vvar * 4.0 / sqrt(3.0 * pi); +end; + +procedure TVariationButterfly.CalcFunction; +var r, y2: double; +begin + y2 := FTy^ * 2.0; + r := vpi * sqrt(abs(FTy^ * FTx^)/(sqr(FTx^) + sqr(y2) + 1E-20)); + + if (FTy^ < 0) then begin + FPx^ := FPx^ + FTx^ * r; + FPy^ := FPy^ + r * y2; + end else begin + FPx^ := FPx^ + sx * FTx^ * r; + FPy^ := FPy^ + sy * r * y2; + end; + + if (sz <> 0) then + FPz^ := FPz^ + sz * r * abs(FTx^); //* Hypot(FTx^, FTy^); +end; + + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationButterfly.Create; +begin + sx := 1; + sy := 1; + sz := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationButterfly.GetInstance: TBaseVariation; +begin + Result := TVariationButterfly.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationButterfly.GetName: string; +begin + Result := 'butterfly'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationButterfly.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := str_sx; + 1: Result := str_sy; + 2: Result := str_sz; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationButterfly.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = str_sx then begin + if (value < 0) then value := abs(value); + sx := Value; + Result := True; + end else if Name = str_sy then begin + if (value < 0) then value := abs(value); + sy := Value; + Result := True; + end else if Name = str_sz then begin + if (value < -0.1) then value := -0.1; + sz := Value; + Result := True; + end; +end; + +function TVariationButterfly.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = str_sx then begin + sx := 1; + Result := True; + end else if Name = str_sy then begin + sy := 1; + Result := True; + end else if Name = str_sz then begin + sz := 0; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationButterfly.GetNrVariables: integer; +begin + Result := 3; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationButterfly.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = str_sx then begin + Value := sx; + Result := True; + end else if Name = str_sy then begin + Value := sy; + Result := True; + end else if Name = str_sz then begin + Value := sz; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationButterfly), true, false); +end. diff --git a/Variations/varBwraps.pas b/Variations/varBwraps.pas new file mode 100644 index 0000000..49ca0c2 --- /dev/null +++ b/Variations/varBwraps.pas @@ -0,0 +1,238 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varBwraps; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationBwraps = class(TBaseVariation) + private + bwraps_cellsize, bwraps_space, bwraps_gain, + bwraps_inner_twist, bwraps_outer_twist, + g2, r2, rfactor: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationBwraps.Prepare; +var + max_bubble, radius: double; +begin + radius := 0.5 * (bwraps_cellsize / (1.0 + sqr(bwraps_space))); + g2 := sqr(bwraps_gain) / (radius + 1e-6) + 1e-6; + max_bubble := g2 * radius; + + if (max_bubble > 2.0) then max_bubble := 1.0 + else max_bubble := max_bubble * (1.0 / (sqr(max_bubble)/4.0 + 1.0)); + + r2 := sqr(radius); + rfactor := radius / max_bubble; +end; + +procedure TVariationBwraps.CalcFunction; +var + Vx, Vy, + Cx, Cy, + Lx, Ly, + r, theta, s, c : double; +begin + Vx := FTx^; + Vy := FTy^; + + if (bwraps_cellsize = 0.0) then + begin + FPx^ := FPx^ + VVAR * FTx^; + FPy^ := FPy^ + VVAR * FTy^; + FPz^ := FPz^ + VVAR * FTz^; + end else + begin + Cx := (floor(Vx / bwraps_cellsize) + 0.5) * bwraps_cellsize; + Cy := (floor(Vy / bwraps_cellsize) + 0.5) * bwraps_cellsize; + + Lx := Vx - Cx; + Ly := Vy - Cy; + + if ((sqr(Lx) + sqr(Ly)) > r2) then + begin + FPx^ := FPx^ + VVAR * FTx^; + FPy^ := FPy^ + VVAR * FTy^; + FPz^ := FPz^ + VVAR * FTz^; + end else + begin + Lx := Lx * g2; + Ly := Ly * g2; + + r := rfactor / ((sqr(Lx) + sqr(Ly)) / 4.0 + 1); + + Lx := Lx * r; + Ly := Ly * r; + + r := (sqr(Lx) + sqr(Ly)) / r2; + theta := bwraps_inner_twist * (1.0 - r) + bwraps_outer_twist * r; + SinCos(theta, s, c); + + Vx := Cx + c * Lx + s * Ly; + Vy := Cy - s * Lx + c * Ly; + + FPx^ := FPx^ + VVAR * Vx; + FPy^ := FPy^ + VVAR * Vy; + FPz^ := FPz^ + VVAR * FTz^; + end; + end; + +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationBwraps.Create; +begin + bwraps_cellsize := 1; + bwraps_space := 0; + bwraps_gain := 1; + bwraps_inner_twist := 0; + bwraps_outer_twist := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationBwraps.GetInstance: TBaseVariation; +begin + Result := TVariationBwraps.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationBwraps.GetName: string; +begin + Result := 'bwraps'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationBwraps.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'bwraps_cellsize'; + 1: Result := 'bwraps_space'; + 2: Result := 'bwraps_gain'; + 3: Result := 'bwraps_inner_twist'; + 4: Result := 'bwraps_outer_twist'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationBwraps.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'bwraps_cellsize' then begin + bwraps_cellsize := Value; + Result := True; + end else if Name = 'bwraps_space' then begin + bwraps_space := Value; + Result := True; + end else if Name = 'bwraps_gain' then begin + bwraps_gain := Value; + Result := True; + end else if Name = 'bwraps_inner_twist' then begin + bwraps_inner_twist := Value; + Result := True; + end else if Name = 'bwraps_outer_twist' then begin + bwraps_outer_twist := Value; + Result := True; + end +end; +function TVariationBwraps.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'bwraps_cellsize' then begin + bwraps_cellsize := 1; + Result := True; + end else if Name = 'bwraps_space' then begin + bwraps_space := 0; + Result := True; + end else if Name = 'bwraps_gain' then begin + bwraps_gain := 1; + Result := True; + end else if Name = 'bwraps_inner_twist' then begin + bwraps_inner_twist := 0; + Result := True; + end else if Name = 'bwraps_outer_twist' then begin + bwraps_outer_twist := 0; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationBwraps.GetNrVariables: integer; +begin + Result := 5 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationBwraps.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'bwraps_cellsize' then begin + if Value = 0 then Value := 1e-6; + Value := bwraps_cellsize; + Result := True; + end else if Name = 'bwraps_space' then begin + Value := bwraps_space; + Result := True; + end else if Name = 'bwraps_gain' then begin + Value := bwraps_gain; + Result := True; + end else if Name = 'bwraps_inner_twist' then begin + Value := bwraps_inner_twist; + Result := True; + end else if Name = 'bwraps_outer_twist' then begin + Value := bwraps_outer_twist; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationBwraps), true, false); +end. \ No newline at end of file diff --git a/Variations/varCircleCrop.pas b/Variations/varCircleCrop.pas new file mode 100644 index 0000000..15cdd7e --- /dev/null +++ b/Variations/varCircleCrop.pas @@ -0,0 +1,233 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit varCircleCrop; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationCircleCrop = class(TBaseVariation) + + const + sx : string = 'circlecrop_x'; + sy : string = 'circlecrop_y'; + sradius : string = 'circlecrop_radius'; + szero : string = 'circlecrop_zero'; + sarea : string = 'circlecrop_scatter_area'; + srewrite: string = 'circlecrop_rewrite_xy'; // AV + + private + x0, y0, radius, scatter_area, ca: double; + zero, rewrite: byte; + resetpoint: boolean; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + + +implementation +uses + Math; + +{ TVariationCircleCrop } + +////////////////////////////////////////// + +procedure TVariationCircleCrop.Prepare; +begin + ca := max(-1.0, min(scatter_area, 1.0)); + resetpoint := (rewrite = 1); +end; + +procedure TVariationCircleCrop.CalcFunction; +var + x, y, rad, ang, rdc, sn, cn: double; +begin + x := FTx^ - x0; + y := FTy^ - y0; + rad := Hypot(x, y); + + if resetpoint then + begin + FTx^ := x; + FTy^ := y; + end; + + if (rad > radius) then + begin + if (zero = 1) then + begin + if resetpoint then + begin + FPx^ := 0; + FPy^ := 0; + end else + begin + FPx^ := FPx^; + FPy^ := FPy^; + end; + end else + begin + ang := arctan2(y, x); + SinCos(ang, sn, cn); + rdc := radius + (random * 0.5 * ca); + + FPx^ := FPx^ + vvar * rdc * cn + x0; + FPy^ := FPy^ + vvar * rdc * sn + y0; + end; + end else + begin + FPx^ := FPx^ + vvar * x + x0; + FPy^ := FPy^ + vvar * y + y0; + end; + FPz^ := FPz^ + vvar * FTz^; +end; + +constructor TVariationCircleCrop.Create; +begin + x0 := 0; + y0 := 0; + radius := 1; + scatter_area := 0; + zero := 0; + rewrite := 1; +end; + +class function TVariationCircleCrop.GetInstance: TBaseVariation; +begin + Result := TVariationCircleCrop.Create; +end; + +class function TVariationCircleCrop.GetName: string; +begin + Result := 'circlecrop'; +end; + +function TVariationCircleCrop.GetNrVariables: integer; +begin + Result := 6; +end; + +function TVariationCircleCrop.GetVariable(const Name: string; + var value: double): boolean; +begin + Result := False; + if Name = sx then begin + Value := x0; + Result := True; + end + else if Name = sy then begin + Value := y0; + Result := True; + end + else if Name = sradius then begin + Value := radius; + Result := True; + end + else if Name = sarea then begin + Value := scatter_area; + Result := True; + end + else if Name = szero then begin + Value := zero; + Result := True; + end else if Name = srewrite then begin + Value := rewrite; + Result := True; + end; +end; + +function TVariationCircleCrop.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := sradius; + 1: Result := sx; + 2: Result := sy; + 3: Result := sarea; + 4: Result := szero; + 5: Result := srewrite; + else + Result := ''; + end; +end; + +function TVariationCircleCrop.ResetVariable(const Name: string): boolean; +begin +Result := False; + if Name = sx then begin + x0 := 0; + Result := True; + end + else if Name = sy then begin + y0 := 0; + Result := True; + end + else if Name = sradius then begin + radius := 1; + Result := True; + end + else if Name = sarea then begin + scatter_area := 0; + Result := True; + end + else if Name = szero then begin + zero := 0; + Result := True; + end else if Name = srewrite then begin + rewrite := 1; + Result := True; + end; +end; + +function TVariationCircleCrop.SetVariable(const Name: string; + var value: double): boolean; +begin +Result := False; + if Name = sx then begin + x0 := Value; + Result := True; + end + else if Name = sy then begin + y0 := Value; + Result := True; + end + else if Name = sradius then begin + radius := Value; + Result := True; + end + else if Name = sarea then begin + scatter_area := Value; + Result := True; + end + else if Name = szero then begin + if Value < 0 then Value := 0; + if Value > 1 then Value := 1; + zero := Round(Value); + Result := True; + end else if Name = srewrite then begin + if Value < 0 then Value := 0; + if Value > 1 then Value := 1; + rewrite := Round(Value); + Result := True; + end; +end; +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationCircleCrop), true, false); + +end. diff --git a/Variations/varCirclize.pas b/Variations/varCirclize.pas new file mode 100644 index 0000000..e5aec76 --- /dev/null +++ b/Variations/varCirclize.pas @@ -0,0 +1,151 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varCirclize; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationCirclize = class(TBaseVariation) + private + PI_4, hole: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationCirclize.Prepare; +begin + PI_4 := PI * 0.25; +end; + +procedure TVariationCirclize.CalcFunction; +var + absx, absy, side, perimeter, r, sina, cosa: double; +begin + + absx := abs(FTx^); + absy := abs(FTy^); + + if (absx >= absy) then + begin + if (FTx^ >= absy) then + perimeter := absx + FTy^ + else perimeter := 5.0 * absx - FTy^; + side := absx; + end else + begin + if (FTy^ >= absx) then + perimeter := 3.0 * absy - FTx^ + else perimeter := 7.0 * absy + FTx^; + side := absy; + end; + + r := VVAR * (side + hole); + SinCos(PI_4 * perimeter / side - PI_4, sina, cosa); + + FPx^ := FPx^ + r * cosa; + FPy^ := FPy^ + r * sina; + //FPz^ := FPz^ + vvar * FTz^; +end; + + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationCirclize.Create; +begin + hole := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationCirclize.GetInstance: TBaseVariation; +begin + Result := TVariationCirclize.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationCirclize.GetName: string; +begin + Result := 'circlize2'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationCirclize.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'circlize2_hole'; + else + Result := ''; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationCirclize.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'circlize2_hole' then begin + hole := Value; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationCirclize.GetNrVariables: integer; +begin + Result := 1; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationCirclize.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'circlize2_hole' then begin + Value := hole; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationCirclize), false, false); +end. \ No newline at end of file diff --git a/Variations/varCosine.pas b/Variations/varCosine.pas new file mode 100644 index 0000000..53c4b6e --- /dev/null +++ b/Variations/varCosine.pas @@ -0,0 +1,137 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit varCosine; + +interface +uses + BaseVariation, XFormMan; + +type + TVariationCosine = class(TBaseVariation) + private + old: byte; + procedure CalcPlugin; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure CalcFunction; override; + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + + +implementation + +uses + Math; +//////////////////////// +procedure TVariationCosine.GetCalcFunction(var f: TCalcFunction); +begin + if old = 1 then f := CalcFunction // Apo 2.09 version + else f := CalcPlugin; // cosine.dll +end; + +procedure TVariationCosine.CalcFunction; +var + sinx, cosx, sinhy, coshy: double; +begin + SinCos(FTx^ * PI, sinx, cosx); + if FTy^ = 0 then + // sinh(0) = 0, cosh(0) = 1 + FPx^ := FPx^ + vvar * cosx + else begin + SinhCosh(FTy^, sinhy, coshy); + FPx^ := FPx^ + vvar * cosx * coshy; + FPy^ := FPy^ - vvar * sinx * sinhy; + end; +end; + +procedure TVariationCosine.CalcPlugin; +var + sinx, cosx, sinhy, coshy: double; +begin + SinCos(FTx^ * PI, sinx, cosx); + if FTy^ = 0 then + // sinh(0) = 0, cosh(0) = 1 + FPx^ := FPx^ + vvar * cosx + else begin + SinhCosh(FTy^, sinhy, coshy); + FPx^ := FPx^ + vvar * cosx * coshy; + FPy^ := FPy^ + vvar * sinx * sinhy; + end; +end; + +constructor TVariationCosine.Create; +begin + old := 1; +end; + +class function TVariationCosine.GetInstance: TBaseVariation; +begin + Result := TVariationCosine.Create; +end; + +class function TVariationCosine.GetName: string; +begin + Result := 'cosine'; +end; + +function TVariationCosine.GetNrVariables: integer; +begin + Result := 1; +end; + +function TVariationCosine.GetVariable(const Name: string; + var value: double): boolean; +begin + Result := False; + if Name = 'cosine_old' then begin + value := old; + Result := True; + end; +end; + +function TVariationCosine.GetVariableNameAt(const Index: integer): string; +begin + case Index of + 0: Result := 'cosine_old'; + else + Result := ''; + end; +end; + +function TVariationCosine.SetVariable(const Name: string; + var value: double): boolean; +begin + Result := False; + if Name = 'cosine_old' then begin + if Value < 0 then Value := 0; + if Value > 1 then Value := 1; + old := Round(value); + Result := True; + end; +end; + +function TVariationCosine.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'cosine_old' then begin + old := 1; + Result := True; + end; +end; + +////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationCosine), false, false); + +end. diff --git a/Variations/varCothSpiral.pas b/Variations/varCothSpiral.pas new file mode 100644 index 0000000..53154b7 --- /dev/null +++ b/Variations/varCothSpiral.pas @@ -0,0 +1,117 @@ +{ + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + "Chaotica" Copyright (C) 2019 Glare Technologies Limited +} + +unit varCothSpiral; + +interface +uses + BaseVariation, XFormMan; + +type + TVariationCothSpiral = class(TBaseVariation) + private + ta: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +//////////////////////// + +procedure TVariationCothSpiral.CalcFunction; +var + t, aux, sn, cn, snh, cnh: double; +begin + t := (random - 0.5) * 6.28318530717959; + + SinCos(ta * t, sn, cn); + SinhCosh(t, snh, cnh); + + aux := (cn - cnh); + if aux = 0 then aux := 1e-20; + aux := vvar / aux; + + FPx^ := FPx^ - snh * aux; + FPy^ := FPy^ + sn * aux; +end; + +constructor TVariationCothSpiral.Create; +begin + inherited Create; + ta := 4; +end; + +class function TVariationCothSpiral.GetInstance: TBaseVariation; +begin + Result := TVariationCothSpiral.Create; +end; + +class function TVariationCothSpiral.GetName: string; +begin + Result := 'coth_spiral'; +end; + +function TVariationCothSpiral.GetNrVariables: integer; +begin + Result := 1; +end; + +function TVariationCothSpiral.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'coth_spiral_a'; + else + Result := ''; + end; +end; + +function TVariationCothSpiral.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'coth_spiral_a' then begin + Value := ta; + Result := True; + end; +end; + +function TVariationCothSpiral.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'coth_spiral_a' then begin + ta := Value; + Result := True; + end; +end; + +function TVariationCothSpiral.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'coth_spiral_a' then begin + ta := 4; + Result := True; + end; +end; + +////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationCothSpiral), false, false); + +end. diff --git a/Variations/varCpow3.pas b/Variations/varCpow3.pas new file mode 100644 index 0000000..d37a655 --- /dev/null +++ b/Variations/varCpow3.pas @@ -0,0 +1,192 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit varCpow3; + +interface + +uses + BaseVariation, XFormMan; + +const + sr = 'cpow3_r'; + sd = 'cpow3_d'; + sdivisor = 'cpow3_divisor'; + sspread = 'cpow3_spread'; + +type + TVariationCpow3 = class(TBaseVariation) + private + r, d1, spread: double; + divisor: integer; + + ang, a2, d2, half_d, c2, half_c, coeff: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +{ TVariationCpow3 } + +////////////////////////////////////////// +procedure TVariationCpow3.Prepare; +var ca, sa: double; +begin + ang := PI2 / divisor; + if (d1 < 0) then + a2 := arctan2(-ln(-d1) * r, PI2) + else + a2 := arctan2(ln(d1) * r, PI2); + SinCos(a2, sa, ca); + c2 := ca * r * ca / divisor; + d2 := ca * r * sa / divisor; + half_c := c2 * 0.5; + half_d := d2 * 0.5; + if (d2 = 0) then + coeff := 0 + else + coeff := -0.095 * spread / d2; +end; + +////////////////////////////////////////// +procedure TVariationCpow3.CalcFunction; +var t, sn, cn, r2, lnr2: double; +begin + t := arctan2(FTy^, FTx^); + if (t < 0) then t := t + PI2; + if (cos(t * 0.5) < (2 * random - 1)) then + t := t - PI2; + if (random < 0.5) then + t := t + PI2 * round(ln(random) * coeff) + else + t := t - PI2 * round(ln(random) * coeff); + lnr2 := ln(FTx^ * FTx^ + FTy^ * FTy^); + r2 := vvar * exp(half_c * lnr2 - d2 * t); + SinCos(c2 * t + half_d * lnr2 + ang * random(32767), sn, cn); + + FPx^ := FPx^ + r2 * cn; + FPy^ := FPy^ + r2 * sn; +end; + +/////////////////////////////////////////////////////////////////////////////// + +constructor TVariationCpow3.Create; +begin + r := 1; + d1 := 1; + divisor := 1; + spread := 1; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationCpow3.GetInstance: TBaseVariation; +begin + Result := TVariationCpow3.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationCpow3.GetName: string; +begin + Result := 'cpow3'; +end; + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +function TVariationCpow3.GetVariableNameAt(const Index: integer): string; +begin + case Index of + 0: Result := sr; + 1: Result := sd; + 2: Result := sdivisor; + 3: Result := sspread; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationCpow3.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = sr then begin + r := Value; + Result := True; + end else if Name = sd then begin + if (Value = 0) then Value := 1; + d1 := value; + Result := True; + end else if Name = sdivisor then begin + if (Value = 0) then Value := 1; + divisor := Round(Value); + Result := True; + end else if Name = sspread then begin + spread := Value; + Result := True; + end; +end; + +function TVariationCpow3.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = sr then begin + r := 1; + Result := True; + end else if Name = sd then begin + d1 := 1; + Result := True; + end else if Name = sspread then begin + spread := 1; + Result := True; + end else if Name = sdivisor then begin + divisor := 1; + Result := True; + end; +end; + +///////////////////////////////////////////////////////////////////// + +function TVariationCpow3.GetNrVariables: integer; +begin + Result := 4; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationCpow3.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = sr then begin + Value := r; + Result := true; + end + else if Name = sd then begin + Value := d1; + Result := true; + end else if Name = sspread then begin + Value := spread; + Result := true; + end else if Name = sdivisor then begin + Value := divisor; + Result := true; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationCpow3), false, false); +end. diff --git a/Variations/varCrop.pas b/Variations/varCrop.pas new file mode 100644 index 0000000..510a26d --- /dev/null +++ b/Variations/varCrop.pas @@ -0,0 +1,314 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varCrop; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationCrop = class(TBaseVariation) + const + n_x0 : string = 'crop_left'; + n_y0 : string = 'crop_top'; + n_x1 : string = 'crop_right'; + n_y1 : string = 'crop_bottom'; + n_s : string = 'crop_scatter_area'; + n_z : string = 'crop_zero'; + n : string = 'crop'; + n_z1 : string = 'crop_high'; // AV + n_z0 : string = 'crop_low'; //AV + n_3D : string = 'crop_use3D'; // AV + private + x0, y0, x1, y1, z0, z1, s, w, h, l: double; + _x0, _y0, _x1, _y1, _z0, _z1: double; + z, c3D: byte; + + procedure Calc2D; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationCrop.Prepare; +begin + if (x0 < x1) then begin + _x0 := x0; + _x1 := x1; + end else begin + _x0 := x1; + _x1 := x0; + end; + + if (y0 < y1) then begin + _y0 := y0; + _y1 := y1; + end else begin + _y0 := y1; + _y1 := y0; + end; + + if (z0 < z1) then begin + _z0 := z0; + _z1 := z1; + end else begin + _z0 := z1; + _z1 := z0; + end; + + w := (_x1 - _x0) * 0.5 * s; + h := (_y1 - _y0) * 0.5 * s; + l := (_z1 - _z0) * 0.5 * s; +end; + +/////////////////////////////////////////////////////// +procedure TVariationCrop.GetCalcFunction(var f: TCalcFunction); +begin + if (c3D = 0) then f := Calc2D + else f := CalcFunction; +end; +///////////////////////////////////////////////// + +procedure TVariationCrop.CalcFunction; +var x, y, tz: double; +begin + x := FTx^; + y := FTy^; + tz := FTz^; + + if ((x < _x0) or (x > _x1) or (y < _y0) or (y > _y1) or (tz < _z0) or (tz > _z1)) + and (z <> 0) then begin + x := 0; y := 0; tz := 0; + end else + begin + if x < _x0 then x := _x0 + random * w + else if x > _x1 then x := _x1 - random * w; + if y < _y0 then y := _y0 + random * h + else if y > _y1 then y := _y1 - random * h; + if tz < _z0 then tz := _z0 + random * l + else if tz > _z1 then tz := _z1 - random * l; + end; + + FPx^ := FPx^ + VVAR * x; + FPy^ := FPy^ + VVAR * y; + FPz^ := FPz^ + VVAR * tz; // AV +end; + +procedure TVariationCrop.Calc2D; +var x, y: double; +begin + x := FTx^; + y := FTy^; + + if ((x < _x0) or (x > _x1) or (y < _y0) or (y > _y1)) and (z <> 0) then begin + x := 0; y := 0; + end else + begin + if x < _x0 then x := _x0 + random * w + else if x > _x1 then x := _x1 - random * w; + if y < _y0 then y := _y0 + random * h + else if y > _y1 then y := _y1 - random * h; + end; + + FPx^ := FPx^ + VVAR * x; + FPy^ := FPy^ + VVAR * y; + FPz^ := FPz^ + vvar * FTz^; // AV: for backward compatibility only +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationCrop.Create; +begin + x0 := -1; x1 := 1; + y0 := -1; y1 := 1; + z0 := -1; z1 := 1; + c3D := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationCrop.GetInstance: TBaseVariation; +begin + Result := TVariationCrop.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationCrop.GetName: string; +begin + Result := n; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationCrop.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := n_x0; + 1: Result := n_y0; + 2: Result := n_x1; + 3: Result := n_y1; + 4: Result := n_z0; + 5: Result := n_z1; + 6: Result := n_s; + 7: Result := n_z; + 8: Result := n_3D; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationCrop.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = n_x0 then begin + x0 := Value; + Result := True; + end else if Name = n_y0 then begin + y0 := Value; + Result := True; + end else if Name = n_x1 then begin + x1 := Value; + Result := True; + end else if Name = n_y1 then begin + y1 := Value; + Result := True; + end else if Name = n_z0 then begin + z0 := Value; + Result := True; + end else if Name = n_z1 then begin + z1 := Value; + Result := True; + end else if Name = n_s then begin + if (Value < -1) then Value := -1; + if (Value > 1) then Value := 1; + s := Value; + Result := True; + end else if Name = n_z then begin + if (Value > 1) then Value := 1; + if (Value < 0) then Value := 0; + z := Round(Value); + Result := True; + end else if Name = n_3D then begin + if (Value > 1) then Value := 1; + if (Value < 0) then Value := 0; + c3D := Round(Value); + Result := True; + end +end; +function TVariationCrop.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = n_x0 then begin + x0 := -1; + Result := True; + end else if Name = n_y0 then begin + y0 := -1; + Result := True; + end else if Name = n_x1 then begin + x1 := 1; + Result := True; + end else if Name = n_y1 then begin + y1 := 1; + Result := True; + end else if Name = n_z0 then begin + z0 := -1; + Result := True; + end else if Name = n_z1 then begin + z1 := 1; + Result := True; + end else if Name = n_s then begin + s := 0; + Result := True; + end else if Name = n_z then begin + z := 0; + Result := True; + end else if Name = n_3D then begin + c3D := 0; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationCrop.GetNrVariables: integer; +begin + Result := 9 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationCrop.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = n_x0 then begin + Value := x0; + Result := True; + end else if Name = n_y0 then begin + Value := y0; + Result := True; + end else if Name = n_x1 then begin + Value := x1; + Result := True; + end else if Name = n_y1 then begin + Value := y1; + Result := True; + end else if Name = n_z0 then begin + Value := z0; + Result := True; + end else if Name = n_z1 then begin + Value := z1; + Result := True; + end else if Name = n_s then begin + Value := s; + Result := True; + end else if Name = n_z then begin + Value := z; + Result := True; + end else if Name = n_3D then begin + Value := c3D; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationCrop), true, false); +end. \ No newline at end of file diff --git a/Variations/varCurl.pas b/Variations/varCurl.pas new file mode 100644 index 0000000..08321da --- /dev/null +++ b/Variations/varCurl.pas @@ -0,0 +1,418 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varCurl; + +interface + +uses + BaseVariation, XFormMan; + +const + variation_name = 'curl'; + num_vars = 2; + var_c1_name='curl_c1'; + var_c2_name='curl_c2'; + +{$ifdef Apo7X64} +{$else} + {$define _ASM_} +{$endif} + +// z +// The formula is: f(z) = ------------------- , where z = complex (x + i*y) +// c2*(z^2) + c1*z + 1 + +type + TVariationCurl = class(TBaseVariation) + private + c2, c1: double; + + c2x2: double; + + procedure CalcZeroC2; + procedure CalcZeroC1; + procedure CalcZeroC2C1; + + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + +implementation + +uses + math; + +// TVariationCurl + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationCurl.Create; +begin + // seriously? + (*c1 := random; + c2 := random; + + case random(3) of + 0: c1 := 0; + 1: c2 := 0; + {else: do nothing} + end;*) + c1 := 0; + c2 := 0; +end; + +procedure TVariationCurl.Prepare; +begin + c2x2 := 2 * c2; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationCurl.GetCalcFunction(var f: TCalcFunction); +begin + if IsZero(c1) then begin + if IsZero(c2) then + f := CalcZeroC2C1 + else + f := CalcZeroC1 + end + else begin + if IsZero(c2) then + f := CalcZeroC2 + else + f := CalcFunction + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationCurl.CalcFunction; +{$ifndef _ASM_} +var + r: double; + re, im: double; +begin + re := 1 + c1*FTx^ + c2*(sqr(FTx^) - sqr(FTy^)); + im := c1*FTy^ + c2x2*FTx^*FTy^; + + r := vvar / (sqr(re) + sqr(im)); + + FPx^ := FPx^ + (FTx^*re + FTy^*im) * r; + FPy^ := FPy^ + (FTy^*re - FTx^*im) * r; + FPz^ := FPz^ + vvar * FTz^; + {$else} +asm + mov edx, [eax + FTx] + // AV: for Apo7X.15C compatibility + fld qword ptr [eax + vvar] + fmul qword ptr [edx + 32] // FTz + fadd qword ptr [edx + 40] // FPz + fstp qword ptr [edx + 40] + // main code + fld qword ptr [edx + 8] // FTy + fld qword ptr [edx] // FTx + fld st(1) + fmul st, st(1) + fmul qword ptr [eax + c2x2] + fld st(2) + fmul qword ptr [eax + c1] + faddp + fld st(2) + fmul st, st + fld st(2) + fmul st, st + fsubrp + fmul qword ptr [eax + c2] + fld1 + faddp + fld st(2) + fmul qword ptr [eax + c1] + faddp + + fld st(1) + fmul st, st + fld st(1) + fmul st, st + faddp + fdivr qword ptr [eax + vvar] + + fld st(3) + fmul st, st(2) + fld st(5) + fmul st, st(4) + faddp + fmul st, st(1) + fadd qword ptr [edx + 16] // FPx + fstp qword ptr [edx + 16] + + fxch st(4) + fmulp + fxch st(2) + fmulp + fsubp + fmulp + fadd qword ptr [edx + 24] // FPy + fstp qword ptr [edx + 24] +{$endif} +end; + +procedure TVariationCurl.CalcZeroC2; // AV: Mobius case +{$ifndef _ASM_} +var + r: double; + re, im: double; +begin + re := 1 + c1*FTx^; + im := c1*FTy^; + + r := vvar / (sqr(re) + sqr(im)); + + FPx^ := FPx^ + (FTx^*re + FTy^*im) * r; + FPy^ := FPy^ + (FTy^*re - FTx^*im) * r; + FPz^ := FPz^ + vvar * FTz^; +{$else} +asm + mov edx, [eax + FTx] + // AV: for Apo7X.15C compatibility + fld qword ptr [eax + vvar] + fmul qword ptr [edx + 32] // FTz + fadd qword ptr [edx + 40] // FPz + fstp qword ptr [edx + 40] + // main code + fld qword ptr [edx + 8] // FTy + fld qword ptr [edx] // FTx + fld st(1) + fld qword ptr [eax + c1] + fmul st(1), st + fmul st, st(2) + fld1 + faddp + + fld st(1) + fmul st, st + fld st(1) + fmul st, st + faddp + fdivr qword ptr [eax + vvar] + + fld st(3) + fmul st, st(2) + fld st(5) + fmul st, st(4) + faddp + fmul st, st(1) + fadd qword ptr [edx + 16] // FPx + fstp qword ptr [edx + 16] + + fxch st(4) + fmulp + fxch st(2) + fmulp + fsubp + fmulp + fadd qword ptr [edx + 24] // FPy + fstp qword ptr [edx + 24] +{$endif} +end; + +procedure TVariationCurl.CalcZeroC1; +{$ifndef _ASM_} +var + r: double; + re, im: double; +begin + re := 1 + c2*(sqr(FTx^) - sqr(FTy^)); + im := c2x2*FTx^*FTy^; + + r := vvar / (sqr(re) + sqr(im)); + + FPx^ := FPx^ + (FTx^*re + FTy^*im) * r; + FPy^ := FPy^ + (FTy^*re - FTx^*im) * r; + FPz^ := FPz^ + vvar * FTz^; +{$else} +asm + mov edx, [eax + FTx] + // AV: for Apo7X.15C compatibility + fld qword ptr [eax + vvar] + fmul qword ptr [edx + 32] // FTz + fadd qword ptr [edx + 40] // FPz + fstp qword ptr [edx + 40] + // main code + fld qword ptr [edx + 8] // FTy + fld qword ptr [edx] // FTx + fld st(1) + fmul st, st(1) + fmul qword ptr [eax + c2x2] + fld st(2) + fmul st, st + fld st(2) + fmul st, st + fsubrp + fmul qword ptr [eax + c2] + fld1 + faddp + + fld st(1) + fmul st, st + fld st(1) + fmul st, st + faddp + fdivr qword ptr [eax + vvar] + + fld st(3) + fmul st, st(2) + fld st(5) + fmul st, st(4) + faddp + fmul st, st(1) + fadd qword ptr [edx + 16] // FPx + fstp qword ptr [edx + 16] + + fxch st(4) + fmulp + fxch st(2) + fmulp + fsubp + fmulp + fadd qword ptr [edx + 24] // FPy + fstp qword ptr [edx + 24] + //fwait +{$endif} +end; + +procedure TVariationCurl.CalcZeroC2C1; // AV: linear case +{$ifndef _ASM_} +var + r: double; +begin + FPx^ := FPx^ + vvar * FTx^; + FPy^ := FPy^ + vvar * FTy^; + FPz^ := FPz^ + vvar * FTz^; +{$else} +asm + fld qword ptr [eax + vvar] + mov edx, [eax + FTx] + fld qword ptr [edx] // FTx + fmul st, st(1) + fadd qword ptr [edx + 16] // FPx + fstp qword ptr [edx + 16] + + fld qword ptr [edx + 8] // FTy + fmul st, st(1) + fadd qword ptr [edx + 24] // FPy + fstp qword ptr [edx + 24] + + fmul qword ptr [edx + 32] // FTz + fadd qword ptr [edx + 40] // FPz + fstp qword ptr [edx + 40] + //fwait +{$endif} +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationCurl.GetInstance: TBaseVariation; +begin + Result := TVariationCurl.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationCurl.GetName: string; +begin + Result := variation_name; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationCurl.GetVariableNameAt(const Index: integer): string; +begin + case Index of + 0: Result := var_c1_name; + 1: Result := var_c2_name; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationCurl.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = var_c1_name then begin + c1 := value; + Result := True; + end + else if Name = var_c2_name then begin + c2 := value; + Result := True; + end; +end; + +function TVariationCurl.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = var_c1_name then begin + c1 := 0; + Result := True; + end + else if Name = var_c2_name then begin + c2 := 0; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationCurl.GetNrVariables: integer; +begin + Result := num_vars; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationCurl.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = var_c1_name then begin + value := c1; + Result := True; + end + else if Name = var_c2_name then begin + value := c2; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationCurl), true, false); +end. diff --git a/Variations/varCurl3D.pas b/Variations/varCurl3D.pas new file mode 100644 index 0000000..1d58aaf --- /dev/null +++ b/Variations/varCurl3D.pas @@ -0,0 +1,294 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varCurl3D; + +interface + +uses + BaseVariation, XFormMan; + +const + variation_name = 'curl3D'; + num_vars = 3; + var_cx_name = 'curl3D_cx'; + var_cy_name = 'curl3D_cy'; + var_cz_name = 'curl3D_cz'; + +type + TVariationCurl3D = class(TBaseVariation) + private + cx, cy, cz: double; + + cx2, cy2, cz2, c2, + c2x, c2y, c2z: double; + + procedure CalcCx; + procedure CalcCy; + procedure CalcCz; + procedure CalcLinear; + + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + +implementation + +uses + Math; + +// TVariationCurl3D + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationCurl3D.Create; +//var rnd: double; +begin + //rnd := 2*random - 1; + + // which maniac made this?? + {case random(3) of + 0: cx := rnd; + 1: cy := rnd; + 2: cz := rnd; + end;} + cy := 0; cy := 0; cz := 0; +end; + +procedure TVariationCurl3D.Prepare; +begin + c2x := 2 * cx; + c2y := 2 * cy; + c2z := 2 * cz; + + cx2 := sqr(cx); + cy2 := sqr(cy); + cz2 := sqr(cz); + + c2 := cx2 + cy2 + cz2; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationCurl3D.GetCalcFunction(var f: TCalcFunction); +begin +{ + if IsZero(cx) and IsZero(cy) and IsZero(cz) then f := CalcLinear + else + if IsZero(cx) and IsZero(cy) then f := CalcCz + else + if IsZero(cy) and IsZero(cz) then f := CalcCx + else + if IsZero(cz) and IsZero(cx) then f := CalcCy + else + f := CalcFunction; +} + if IsZero(cx) then begin + if IsZero(cy) then begin + if IsZero(cz) then + f := CalcLinear + else + f := CalcCz; + end + else begin + if IsZero(cz) then + f := CalcCy + else + f := CalcFunction; + end + end + else begin + if IsZero(cy) and IsZero(cz) then + f := CalcCx + else + f := CalcFunction; + end; + + f := CalcFunction; // AV: always? + +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationCurl3D.CalcFunction; +var + r, r2: double; +begin + r2 := sqr(FTx^) + sqr(FTy^) + sqr(Ftz^); + r := vvar / (r2*c2 + c2x*FTx^ - c2y*FTy^ + c2z*FTz^ + 1); + + FPx^ := FPx^ + r * (FTx^ + cx*r2); + FPy^ := FPy^ + r * (FTy^ - cy*r2); + FPz^ := FPz^ + r * (FTz^ + cz*r2); +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationCurl3D.CalcCx; +var + x, r, r2: double; +begin + r2 := sqr(FTx^) + sqr(FTy^) + sqr(Ftz^); + + r := vvar / (cx2*r2 + c2x*FTx^ + 1); + + FPx^ := FPx^ + r * (FTx^ + cx*r2); + FPy^ := FPy^ + r * FTy^; + FPz^ := FPz^ + r * FTz^; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationCurl3D.CalcCy; +var + r, r2: double; +begin + r2 := sqr(FTx^) + sqr(FTy^) + sqr(Ftz^); + + r := vvar / (cy2*r2 - c2y*FTy^ + 1); + + FPx^ := FPx^ + r * FTx^; + FPy^ := FPy^ + r * (FTy^ - cy*r2); + FPz^ := FPz^ + r * FTz^; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationCurl3D.CalcCz; +var + r, r2: double; +begin + r2 := sqr(FTx^) + sqr(FTy^) + sqr(Ftz^); + + r := vvar / (cz2*r2 + c2z*FTz^ + 1); + + FPx^ := FPx^ + r * FTx^; + FPy^ := FPy^ + r * FTy^; + FPz^ := FPz^ + r * (FTz^ + cz*r2); +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationCurl3D.CalcLinear; +var + r: double; +begin + FPx^ := FPx^ + vvar * FTx^; + FPy^ := FPy^ + vvar * FTy^; + FPz^ := FPz^ + vvar * FTz^; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationCurl3D.GetInstance: TBaseVariation; +begin + Result := TVariationCurl3D.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationCurl3D.GetName: string; +begin + Result := variation_name; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationCurl3D.GetVariableNameAt(const Index: integer): string; +begin + case Index of + 0: Result := var_cx_name; + 1: Result := var_cy_name; + 2: Result := var_cz_name; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationCurl3D.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = var_cx_name then begin + cx := value; + Result := True; + end + else if Name = var_cy_name then begin + cy := value; + Result := True; + end + else if Name = var_cz_name then begin + cz := value; + Result := True; + end; +end; + +function TVariationCurl3D.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = var_cx_name then begin + cx := 0; + Result := True; + end + else if Name = var_cy_name then begin + cy := 0; + Result := True; + end + else if Name = var_cz_name then begin + cz := 0; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationCurl3D.GetNrVariables: integer; +begin + Result := num_vars; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationCurl3D.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = var_cx_name then begin + value := cx; + Result := True; + end + else if Name = var_cy_name then begin + value := cy; + Result := True; + end + else if Name = var_cz_name then begin + value := cz; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationCurl3D), true, false); +end. diff --git a/Variations/varDCBubble.pas b/Variations/varDCBubble.pas new file mode 100644 index 0000000..f5835a3 --- /dev/null +++ b/Variations/varDCBubble.pas @@ -0,0 +1,256 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varDCBubble; + +interface + +uses + BaseVariation, XFormMan; + +{$ifndef Apo7X64} + {$define _ASM_} +{$endif} + +type + TVariationDCBubble = class(TBaseVariation) + private + centerx, centery, scale, bdcs, cden: double; + style: byte; + + procedure CalcBubble; + procedure CalcNewStyle; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + +implementation + +uses + Math; + +{ TVariationDCBubble } + +/////////////////////////////////////////////////////////////////////////////// + +procedure TVariationDCBubble.Prepare; +begin + if (scale = 0) then + bdcs := 10E-6 + else + bdcs := 1 / scale; + cden := bdcs /(2 * pi); +end; + +procedure TVariationDCBubble.GetCalcFunction(var f: TCalcFunction); +begin + if style = 0 then + f := CalcFunction + else + f := CalcNewStyle; +end; + +procedure TVariationDCBubble.CalcBubble; +{$ifndef _ASM_} +var + r: double; +begin + r := (sqr(FTx^) + sqr(FTy^))/4 + 1; + FPz^ := FPz^ + VVAR * (2 / r - 1); // AV: fixed inversion + + r := VVAR / r; + + FPx^ := FPx^ + r * FTx^; + FPy^ := FPy^ + r * FTy^; +{$else} + asm // AV: added asm-code for speed + mov edx, [eax + FTx] + fld qword ptr [edx + 8] + fld qword ptr [edx] + fld st(1) + fmul st, st + fld st(1) + fmul st, st + faddp + fld1 + fadd st, st + fadd st, st + fdivp st(1), st + + fld qword ptr [eax + vvar] + fld1 + fadd st(2), st + fdivr st(2), st + + fld st(2) + fadd st, st + fsubrp st(1), st + fmul st, st(1) + fadd qword ptr [edx + 40] + fstp qword ptr [edx + 40] + + fmulp + + fmul st(2), st + fmulp + fadd qword ptr [edx + 16] + fstp qword ptr [edx + 16] + fadd qword ptr [edx + 24] + fstp qword ptr [edx + 24] + fwait +{$endif} +end; + +procedure TVariationDCBubble.CalcFunction; +begin + CalcBubble; + color^ := fmod(abs(bdcs * (sqr(FPx^ + centerx) + sqr(FPy^ + centery))), 1.0); +end; + +procedure TVariationDCBubble.CalcNewStyle; +begin + CalcBubble; + color^ := fmod(abs(cden * arctan2(FPy^ + centery, FPx^ - centerx)), 1.0); +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationDCBubble.Create; +begin + centerx := 0; + centery := 0; + scale := 1.0; + style := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationDCBubble.GetInstance: TBaseVariation; +begin + Result := TVariationDCBubble.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationDCBubble.GetName: string; +begin + Result := 'dc_bubble'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationDCBubble.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'dc_bubble_centerx'; + 1: Result := 'dc_bubble_centery'; + 2: Result := 'dc_bubble_scale'; + 3: Result := 'dc_bubble_style'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationDCBubble.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'dc_bubble_centerx' then begin + centerx := Value; + Result := True; + end else if Name = 'dc_bubble_centery' then begin + centery := Value; + Result := True; + end + else if Name = 'dc_bubble_scale' then begin + scale := Value; + Result := True; + end + else if Name = 'dc_bubble_style' then begin + if (Value < 0) then Value := 0; + if (Value > 1) then Value := 1; + style := Round(Value); + Result := True; + end +end; + +function TVariationDCBubble.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'dc_bubble_centerx' then begin + centerx:= 0; + Result := True; + end else if Name = 'dc_bubble_centery' then begin + centery := 0; + Result := True; + end else if Name = 'dc_bubble_scale' then begin + scale := 1; + Result := True; + end else if Name = 'dc_bubble_style' then begin + style := 0; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationDCBubble.GetNrVariables: integer; +begin + Result := 4; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationDCBubble.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'dc_bubble_centerx' then begin + Value := centerx; + Result := True; + end else if Name = 'dc_bubble_centery' then begin + Value := centery; + Result := True; + end + else if Name = 'dc_bubble_scale' then begin + Value := scale; + Result := True; + end + else if Name = 'dc_bubble_style' then begin + Value := style; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationDCBubble), true, true); +end. diff --git a/Variations/varDisc2.pas b/Variations/varDisc2.pas new file mode 100644 index 0000000..18d47c9 --- /dev/null +++ b/Variations/varDisc2.pas @@ -0,0 +1,164 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit varDisc2; + +interface + +uses + BaseVariation, XFormMan; + +{$ifdef Apo7X64} +{$else} + {$define _ASM_} +{$endif} + +type + TVariationDisc2 = class(TBaseVariation) + private + rot, add, c, k, sinadd, cosadd: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +{ TVariationDisc2 } + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationDisc2.Create; +begin + rot := random + 0.5; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationDisc2.Prepare; +var t: double; +begin + c := vvar / PI; + k := rot * PI; + SinCos(add, sinadd, cosadd); + cosadd := cosadd - 1; + if (add > PI2) then begin + t := 1 + add - PI2; + cosadd := cosadd * t; + sinadd := sinadd * t; + end + else if (add < -PI2) then begin + t := 1 + add + PI2; + cosadd := cosadd * t; + sinadd := sinadd * t; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// + +procedure TVariationDisc2.CalcFunction; +{$ifndef _ASM_} +var + r, sinr, cosr: extended; +begin + SinCos(k * (FTx^ + FTy^), sinr, cosr); + r := c * arctan2(FTx^, FTy^); + FPx^ := FPx^ + (sinr + cosadd) * r; + FPy^ := FPy^ + (cosr + sinadd) * r; +{$else} +asm + mov edx, [eax + FTx] + fld qword ptr [edx] + fld qword ptr [edx + 8] + fpatan + fmul qword ptr [eax + c] + fld qword ptr [edx] + fadd qword ptr [edx + 8] + fmul qword ptr [eax + k] + fsincos + fadd qword ptr [eax + sinadd] + fmul st, st(2) + fadd qword ptr [edx + 24] + fstp qword ptr [edx + 24] + fadd qword ptr [eax + cosadd] + fmulp + fadd qword ptr [edx + 16] + fstp qword ptr [edx + 16] +{$endif} +end; + + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationDisc2.GetInstance: TBaseVariation; +begin + Result := TVariationDisc2.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationDisc2.GetName: string; +begin + Result := 'disc2'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationDisc2.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'disc2_rot'; + 1: Result := 'disc2_twist'; + else + Result := ''; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationDisc2.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'disc2_rot' then + begin + rot := Value; + Result := True end + else if Name = 'disc2_twist' then + begin + add := Value; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationDisc2.GetNrVariables: integer; +begin + Result := 2; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationDisc2.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'disc2_rot' then + begin + Value := rot; + Result := True end + else if Name = 'disc2_twist' then + begin + Value := add; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationDisc2), false, false); +end. diff --git a/Variations/varElliptic.pas b/Variations/varElliptic.pas new file mode 100644 index 0000000..1517759 --- /dev/null +++ b/Variations/varElliptic.pas @@ -0,0 +1,132 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varElliptic; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationElliptic = class(TBaseVariation) + private + v: double; + + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + + + procedure CalcFunction; override; + procedure Prepare; override; + end; + +implementation + +uses + Math; + + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationElliptic.Prepare; +begin + v := VVAR / (PI_2); +end; + +procedure TVariationElliptic.CalcFunction; +function sqrt_safe(x: double): double; + begin + if x < 0.0 then Result := 0.0 + else Result := sqrt(x); + end; +var + a, b, tmp, x2, xmax: double; +begin + tmp := sqr(FTy^) + sqr(FTx^) + 1.0; + x2 := 2.0 * FTx^; + xmax := 0.5 * (sqrt(tmp + x2) + sqrt(tmp - x2)); + + a := FTx^ / xmax; + b := sqrt_safe(1.0 - sqr(a)); + + FPz^ := FPz^ + vvar * FTz^; + FPx^ := FPx^ + v * ArcTan2(a, b); + + if (FTy^ > 0) then FPy^ := FPy^ + v * Ln(xmax + sqrt_safe(xmax - 1.0)) + else FPy^ := FPy^ - v * Ln(xmax + sqrt_safe(xmax - 1.0)) +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationElliptic.Create; +begin +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationElliptic.GetInstance: TBaseVariation; +begin + Result := TVariationElliptic.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationElliptic.GetName: string; +begin + Result := 'elliptic'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationElliptic.GetVariableNameAt(const Index: integer): string; +begin + Result := ''; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationElliptic.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationElliptic.GetNrVariables: integer; +begin + Result := 0 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationElliptic.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationElliptic), true, false); +end. diff --git a/Variations/varEpispiral.pas b/Variations/varEpispiral.pas new file mode 100644 index 0000000..f72ebfe --- /dev/null +++ b/Variations/varEpispiral.pas @@ -0,0 +1,202 @@ + { + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + } + +unit varEpispiral; + +interface + +uses + BaseVariation, XFormMan; + +const + EPS: double = 1E-6; +type + TVariationEpispiral = class(TBaseVariation) + private + n, thickness, holes : double; + compatible : byte; + procedure Calc7X; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure CalcFunction; override; + procedure GetCalcFunction(var f: TCalcFunction); override; // AV: for speed + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationEpispiral.Create; +begin + n := 6.0; + thickness := 0.0; + holes := 1.0; + compatible := 1; +end; + +procedure TVariationEpispiral.GetCalcFunction(var f: TCalcFunction); +begin + if compatible = 1 then + f := CalcFunction + else + f := Calc7X; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationEpispiral.CalcFunction; +var + t, theta, da: double; +begin + theta := arctan2(FTy^, FTx^); + da := cos(n * theta); + if (abs(da) < EPS) then da := EPS; + da := 1/da; + + // classic version + if (abs(thickness) > EPS) then + t := (random * thickness * da) - holes + else + t := da - holes; + FPx^ := FPx^ + vvar * t * cos(theta); + FPy^ := FPy^ + vvar * t * sin(theta); +end; + +procedure TVariationEpispiral.Calc7X; +var + t, theta, da: double; +begin + theta := arctan2(FTy^, FTx^); + da := cos(n * theta); + if (abs(da) < EPS) then da := EPS; + da := 1/da; + + // 7X.15D version + t := (random * thickness * da) - holes; + if (t = 0) then + begin + FPx^ := FPx^; + FPy^ := FPy^; + end + else + begin + FPx^ := FPx^ + vvar * t * cos(theta); + FPy^ := FPy^ + vvar * t * sin(theta); + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationEpispiral.GetInstance: TBaseVariation; +begin + Result := TVariationEpispiral.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationEpispiral.GetName: string; +begin + Result := 'Epispiral'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationEpispiral.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'Epispiral_n'; + 1: Result := 'Epispiral_thickness'; + 2: Result := 'Epispiral_holes'; + 3: Result := 'Epispiral_old'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationEpispiral.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'Epispiral_n' then begin + n := Value; + Result := True; + end else if Name = 'Epispiral_thickness' then begin + thickness := Value; + Result := True; + end + else if Name = 'Epispiral_holes' then begin + holes := Value; + Result := True; + end + else if Name = 'Epispiral_old' then begin + if (Value > 1) then Value := 1; + if (Value < 0) then Value := 0; + compatible := Round(Value); + Result := True; + end +end; + +function TVariationEpispiral.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'Epispiral_n' then begin + n := 6.0; + Result := True; + end else if Name = 'Epispiral_thickness' then begin + thickness := 0.0; + Result := True; + end + else if Name = 'Epispiral_holes' then begin + holes := 0.0; + Result := True; + end + else if Name = 'Epispiral_old' then begin + compatible := 1; + Result := True; + end +end; + + +/////////////////////////////////////////////////////////////////////////////// +function TVariationEpispiral.GetNrVariables: integer; +begin + Result := 4; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationEpispiral.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'Epispiral_n' then begin + Value := n; + Result := True; + end else if Name = 'Epispiral_thickness' then begin + Value := thickness; + Result := True; + end + else if Name = 'Epispiral_holes' then begin + Value := holes; + Result := True; + end + else if Name = 'Epispiral_old' then begin + Value := compatible; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationEpispiral), false, false); +end. + diff --git a/Variations/varEscher.pas b/Variations/varEscher.pas new file mode 100644 index 0000000..f62a5de --- /dev/null +++ b/Variations/varEscher.pas @@ -0,0 +1,147 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varEscher; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationEscher = class(TBaseVariation) + private + escher_beta, bc, bd: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationEscher.Prepare; +begin + sincos(escher_beta, bd, bc); + bc := 0.5 * (1.0 + bc); + bd := 0.5 * bd; +end; + +procedure TVariationEscher.CalcFunction; +var sn, cs, ang, lnr, m : double; +begin + ang := arctan2(FTy^, FTx^); // Angular polar dimension + lnr := 0.5 * ln(FTx^*FTx^ + FTy^*FTy^); // Natural logarithm of the radial polar dimension. + + m := VVAR * exp(bc * lnr - bd * ang); + + sincos(bc * ang + bd * lnr, sn, cs); + + FPx^ := FPx^ + m * cs; + FPy^ := FPy^ + m * sn; + + FPz^ := FPz^ + vvar * FTz^; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationEscher.Create; +begin + escher_beta := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationEscher.GetInstance: TBaseVariation; +begin + Result := TVariationEscher.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationEscher.GetName: string; +begin + Result := 'escher'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationEscher.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'escher_beta'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationEscher.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'escher_beta' then begin + value := frac((value + PI) / PI2) * PI2 - PI; // AV: added 2*pi precalc + escher_beta := Value; + Result := True; + end +end; +function TVariationEscher.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'escher_beta' then begin + escher_beta := 0; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationEscher.GetNrVariables: integer; +begin + Result := 1 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationEscher.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'escher_beta' then begin + Value := escher_beta; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationEscher), true, false); +end. \ No newline at end of file diff --git a/Variations/varEx.pas b/Variations/varEx.pas new file mode 100644 index 0000000..608762b --- /dev/null +++ b/Variations/varEx.pas @@ -0,0 +1,141 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit varEx; + +interface +uses + BaseVariation, XFormMan; + +type + TVariationEx = class(TBaseVariation) + private + old: byte; + procedure CalcPlugin; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure CalcFunction; override; + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + + +implementation + +uses + Math; +//////////////////////// +procedure TVariationEx.GetCalcFunction(var f: TCalcFunction); +begin + if old = 1 then f := CalcFunction + else f := CalcPlugin; +end; + +procedure TVariationEx.CalcFunction; +var + r: double; + n0, n1, m0, m1: double; + FAngle: double; +begin + FAngle := arctan2(FTx^, FTy^); + r := sqrt(sqr(FTx^) + sqr(FTy^)); + n0 := sin(FAngle + r); + n1 := cos(FAngle - r); + m0 := sqr(n0) * n0; + m1 := sqr(n1) * n1; + r := r * vvar; + FPx^ := FPx^ + r * (m0 + m1); + FPy^ := FPy^ + r * (m0 - m1); +end; + +procedure TVariationEx.CalcPlugin; +var + r: double; + n0, n1, m0, m1: double; + FAngle: double; +begin + FAngle := arctan2(FTy^, FTx^); + r := sqrt(sqr(FTx^) + sqr(FTy^)); + n0 := sin(FAngle + r); + n1 := cos(FAngle - r); + m0 := sqr(n0) * n0; + m1 := sqr(n1) * n1; + r := r * vvar; + FPx^ := FPx^ + r * (m0 + m1); + FPy^ := FPy^ + r * (m0 - m1); +end; + +constructor TVariationEx.Create; +begin + old := 1; +end; + +class function TVariationEx.GetInstance: TBaseVariation; +begin + Result := TVariationEx.Create; +end; + +class function TVariationEx.GetName: string; +begin + Result := 'ex'; +end; + +function TVariationEx.GetNrVariables: integer; +begin + Result := 1; +end; + +function TVariationEx.GetVariable(const Name: string; + var value: double): boolean; +begin + Result := False; + if Name = 'ex_old' then begin + value := old; + Result := True; + end; +end; + +function TVariationEx.GetVariableNameAt(const Index: integer): string; +begin + case Index of + 0: Result := 'ex_old'; + else + Result := ''; + end; +end; + +function TVariationEx.SetVariable(const Name: string; + var value: double): boolean; +begin + Result := False; + if Name = 'ex_old' then begin + if Value < 0 then Value := 0; + if Value > 1 then Value := 1; + old := Round(value); + Result := True; + end; +end; + +function TVariationEx.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'ex_old' then begin + old := 1; + Result := True; + end; +end; + +////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationEx), false, false); + +end. diff --git a/Variations/varExponential.pas b/Variations/varExponential.pas new file mode 100644 index 0000000..1565456 --- /dev/null +++ b/Variations/varExponential.pas @@ -0,0 +1,98 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit varExponential; + +interface +uses + BaseVariation, XFormMan; + + {$ifdef Apo7X64} +{$else} + {$define _ASM_} +{$endif} + +type + TVariationExponential = class(TBaseVariation) + private + + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + procedure CalcFunction; override; + end; + + +implementation + +uses + Math; + +//////////////////////// + +procedure TVariationExponential.CalcFunction; +{$ifndef _ASM_} +var + vex: double; + siny, cosy: double; +begin + SinCos(PI * FTy^, siny, cosy); + vex := vvar * exp(FTx^ - 1); + FPx^ := FPx^ + cosy * vex; + FPy^ := FPy^ + siny * vex; +{$else} +asm + mov edx, [eax + FTx] + fld qword ptr [edx] + fld1 + fsubp st(1), st + // here goes exp(x) code from System.pas + FLDL2E + FMUL + FLD ST(0) + FRNDINT + FSUB ST(1), ST + FXCH ST(1) + F2XM1 + FLD1 + FADD + FSCALE + FSTP ST(1) + // ----- + fmul qword ptr [eax + vvar] + fld qword ptr [edx + 8] + fldpi + fmulp + fsincos + fmul st, st(2) + fadd qword ptr [edx + 16] + fstp qword ptr [edx + 16] + fmulp + fadd qword ptr [edx + 24] + fstp qword ptr [edx + 24] + fwait +{$endif} +end; + +constructor TVariationExponential.Create; +begin + inherited Create; +end; + +class function TVariationExponential.GetInstance: TBaseVariation; +begin + Result := TVariationExponential.Create; +end; + +class function TVariationExponential.GetName: string; +begin + Result := 'exponential'; +end; + +////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationExponential), false, false); + +end. diff --git a/Variations/varFalloff2.pas b/Variations/varFalloff2.pas new file mode 100644 index 0000000..df1d0d1 --- /dev/null +++ b/Variations/varFalloff2.pas @@ -0,0 +1,348 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varFalloff2; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationFalloff2 = class(TBaseVariation) + const + n_scatter : string = 'falloff2_scatter'; + n_mindist : string = 'falloff2_mindist'; + n_mul_x : string = 'falloff2_mul_x'; + n_mul_y : string = 'falloff2_mul_y'; + n_mul_z : string = 'falloff2_mul_z'; + n_mul_c : string = 'falloff2_mul_c'; + n_x0 : string = 'falloff2_x0'; + n_y0 : string = 'falloff2_y0'; + n_z0 : string = 'falloff2_z0'; + n_invert : string = 'falloff2_invert'; + n_blurtype : string = 'falloff2_type'; + + private + rmax: double; + x0, y0, z0: double; + scatter, mindist: double; + invert, blurtype: integer; + mul_x, mul_y, mul_z, mul_c: double; + + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + procedure CalcFunctionRadial; + procedure CalcFunctionGaussian; + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationFalloff2.Prepare; +begin + rmax := 0.04 * scatter; +end; + +procedure TVariationFalloff2.GetCalcFunction(var f: TCalcFunction); +begin + if blurtype = 1 then f := CalcFunctionRadial + else if blurtype = 2 then f := CalcFunctionGaussian + else f := CalcFunction; +end; +procedure TVariationFalloff2.CalcFunction; +var + in_x, in_y, in_z, d: double; +begin + in_x := FTx^; + in_y := FTy^; + in_z := FTz^; + + d := sqrt(sqr(in_x - x0) + sqr(in_y - y0) + sqr(in_z - z0)); + if (invert <> 0) then d := 1 - d; if (d < 0) then d := 0; + d := (d - mindist) * rmax; if (d < 0) then d := 0; + + FPx^ := FPx^ + VVAR * (in_x + mul_x * random * d); + FPy^ := FPy^ + VVAR * (in_y + mul_y * random * d); + FPz^ := FPz^ + VVAR * (in_z + mul_z * random * d); + color^ := Abs(Frac(color^ + mul_c * random * d)); +end; +procedure TVariationFalloff2.CalcFunctionRadial; +var + in_x, in_y, in_z, d, r_in: double; + sigma, phi, r, sins, coss, sinp, cosp: double; +begin + in_x := FTx^; + in_y := FTy^; + in_z := FTz^; + + r_in := sqrt(sqr(in_x) + sqr(in_y) + sqr(in_z)) + 1e-6; + d := sqrt(sqr(in_x - x0) + sqr(in_y - y0) + sqr(in_z - z0)); + if (invert <> 0) then d := 1 - d; if (d < 0) then d := 0; + d := (d - mindist) * rmax; if (d < 0) then d := 0; + + sigma := ArcSin(in_z / r_in) + mul_z * random * d; + phi := ArcTan2(in_y, in_x) + mul_y * random * d; + r := r_in + mul_x * random * d; + + SinCos(sigma, sins, coss); + SinCos(phi, sinp, cosp); + + FPx^ := FPx^ + VVAR * (r * coss * cosp); + FPy^ := FPy^ + VVAR * (r * coss * sinp); + FPz^ := FPz^ + VVAR * (sins); + color^ := Abs(Frac(color^ + mul_c * random * d)); +end; +procedure TVariationFalloff2.CalcFunctionGaussian; +var + in_x, in_y, in_z, d: double; + sigma, phi, r, sins, coss, sinp, cosp: double; +begin + in_x := FTx^; + in_y := FTy^; + in_z := FTz^; + + d := sqrt(sqr(in_x - x0) + sqr(in_y - y0) + sqr(in_z - z0)); + if (invert <> 0) then d := 1 - d; if (d < 0) then d := 0; + d := (d - mindist) * rmax; if (d < 0) then d := 0; + + sigma := d * random * 2 * PI; + phi := d * random * PI; + r := d * random; + + SinCos(sigma, sins, coss); + SinCos(phi, sinp, cosp); + + FPx^ := FPx^ + VVAR * (in_x + mul_x * r * coss * cosp); + FPy^ := FPy^ + VVAR * (in_y + mul_y * r * coss * sinp); + FPz^ := FPz^ + VVAR * (in_z + mul_z * r * sins); + color^ := Abs(Frac(color^ + mul_c * random * d)); +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationFalloff2.Create; +begin + scatter := 1; + mindist := 0.5; + mul_x := 1; + mul_y := 1; + mul_z := 0; + mul_c := 0; + x0 := 0; + y0 := 0; + z0 := 0; + invert := 0; + blurtype := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationFalloff2.GetInstance: TBaseVariation; +begin + Result := TVariationFalloff2.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationFalloff2.GetName: string; +begin + Result := 'falloff2'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationFalloff2.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := n_scatter; + 1: Result := n_mindist; + 2: Result := n_mul_x; + 3: Result := n_mul_y; + 4: Result := n_mul_z; + 5: Result := n_mul_c; + 6: Result := n_x0; + 7: Result := n_y0; + 8: Result := n_z0; + 9: Result := n_invert; + 10: Result := n_blurtype; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationFalloff2.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = n_scatter then begin + if Value < 1e-6 then Value := 1e-6; + scatter := Value; + Result := True; + end else if Name = n_mindist then begin + if Value < 0 then Value := 0; + mindist := Value; + Result := True; + end else if Name = n_mul_x then begin + if Value < 0 then Value := 0 + else if Value > 1 then Value := 1; + mul_x := Value; + Result := True; + end else if Name = n_mul_y then begin + if Value < 0 then Value := 0 + else if Value > 1 then Value := 1; + mul_y := Value; + Result := True; + end else if Name = n_mul_z then begin + if Value < 0 then Value := 0 + else if Value > 1 then Value := 1; + mul_z := Value; + Result := True; + end else if Name = n_mul_c then begin + if Value < 0 then Value := 0 + else if Value > 1 then Value := 1; + mul_c := Value; + Result := True; + end else if Name = n_x0 then begin + x0 := Value; + Result := True; + end else if Name = n_y0 then begin + y0 := Value; + Result := True; + end else if Name = n_z0 then begin + z0 := Value; + Result := True; + end else if Name = n_invert then begin + if (Value > 1) then Value := 1; + if (Value < 0) then Value := 0; + invert := Round(Value); + Result := True; + end else if Name = n_blurtype then begin + if (Value > 2) then Value := 2; + if (Value < 0) then Value := 0; + blurtype := Round(Value); + Result := True; + end +end; +function TVariationFalloff2.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = n_scatter then begin + scatter := 1; + Result := True; + end else if Name = n_mindist then begin + mindist := 0.5; + Result := True; + end else if Name = n_mul_x then begin + mul_x := 1; + Result := True; + end else if Name = n_mul_y then begin + mul_y := 1; + Result := True; + end else if Name = n_mul_z then begin + mul_z := 0; + Result := True; + end else if Name = n_mul_c then begin + mul_c := 0; + Result := True; + end else if Name = n_x0 then begin + x0 := 0; + Result := True; + end else if Name = n_y0 then begin + y0 := 0; + Result := True; + end else if Name = n_z0 then begin + z0 := 0; + Result := True; + end else if Name = n_invert then begin + invert := 0; + Result := True; + end else if Name = n_blurtype then begin + blurtype := 0; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationFalloff2.GetNrVariables: integer; +begin + Result := 11 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationFalloff2.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = n_scatter then begin + Value := scatter; + Result := True; + end else if Name = n_mindist then begin + Value := mindist; + Result := True; + end else if Name = n_mul_x then begin + Value := mul_x; + Result := True; + end else if Name = n_mul_y then begin + Value := mul_y; + Result := True; + end else if Name = n_mul_z then begin + Value := mul_z; + Result := True; + end else if Name = n_mul_c then begin + Value := mul_c; + Result := True; + end else if Name = n_x0 then begin + Value := x0; + Result := True; + end else if Name = n_y0 then begin + Value := y0; + Result := True; + end else if Name = n_z0 then begin + Value := z0; + Result := True; + end else if Name = n_invert then begin + Value := invert; + Result := True; + end else if Name = n_blurtype then begin + Value := blurtype; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationFalloff2), true, true); +end. \ No newline at end of file diff --git a/Variations/varFan2.pas b/Variations/varFan2.pas new file mode 100644 index 0000000..aaab564 --- /dev/null +++ b/Variations/varFan2.pas @@ -0,0 +1,206 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varFan2; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationFan2 = class(TBaseVariation) + private + FX, FY: double; + dy, dx, dx2: double; + old: byte; + procedure CalcNew; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + +implementation + +uses + Math; + +{ TVariationFan2 } + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationFan2.Prepare; +const + EPS = 1E-10; +begin + dy := FY; + dx := pi * (sqr(FX) + EPS); + dx2 := dx/2; +end; + +procedure TVariationFan2.GetCalcFunction(var f: TCalcFunction); +begin + if old = 1 then f := CalcFunction + else f := CalcNew; +end; + +procedure TVariationFan2.CalcFunction; +var + r, a : double; + sinr, cosr: double; + Angle: double; +begin + Angle := arctan2(FTx^, FTy^); + if System.Frac((Angle + dy)/dx) > 0.5 then + a := Angle - dx2 + else + a := Angle + dx2; + SinCos(a, sinr, cosr); + r := vvar * sqrt(sqr(FTx^) + sqr(FTy^)); + FPx^ := FPx^ + r * sinr; + FPy^ := FPy^ + r * cosr; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationFan2.CalcNew; +var + r, a : double; + sinr, cosr: double; + Angle: double; +begin + Angle := arctan2(FTx^, FTy^); + if System.Frac((Angle + dy)/dx) > 0.5 then + a := Angle - dx2 + else + a := Angle + dx2; + SinCos(a, sinr, cosr); + r := vvar * sqrt(sqr(FTx^) + sqr(FTy^)); + FPx^ := FPx^ + r * cosr; + FPy^ := FPy^ + r * sinr; + FPz^ := FPz^ + vvar * FTz^; +end; + +constructor TVariationFan2.Create; +begin + FX := 2 * Random - 1; + FY := 2 * Random - 1; + old := 1; +end; + +/////////////////////////////////////////////////////////////////////////////// + +class function TVariationFan2.GetInstance: TBaseVariation; +begin + Result := TVariationFan2.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationFan2.GetName: string; +begin + Result := 'fan2'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationFan2.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'fan2_x'; + 1: Result := 'fan2_y'; + 2: Result := 'fan2_old'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationFan2.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'fan2_x' then begin + FX := Value; + Result := True; + end else if Name = 'fan2_y' then begin + FY := Value; + Result := True; + end else if Name = 'fan2_old' then begin + if (Value < 0) then Value := 0; + if (Value > 1) then Value := 1; + old := Round(Value); + Result := True; + end +end; + +function TVariationFan2.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'fan2_x' then begin + FX := 0; + Result := True; + end else if Name = 'fan2_y' then begin + FY := 0; + Result := True; + end else if Name = 'fan2_old' then begin + old := 1; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationFan2.GetNrVariables: integer; +begin + Result := 3 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationFan2.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'fan2_x' then begin + Value := FX; + Result := True; + end else if Name = 'fan2_y' then begin + Value := FY; + Result := True; + end else if Name = 'fan2_old' then begin + Value := old; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationFan2), true, false); +end. diff --git a/Variations/varFlux.pas b/Variations/varFlux.pas new file mode 100644 index 0000000..27c3107 --- /dev/null +++ b/Variations/varFlux.pas @@ -0,0 +1,148 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varFlux; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationFlux = class(TBaseVariation) + private + spread, spr: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationFlux.Prepare; +begin + spr := 2 + spread; +end; + +/////////////////////////////////////// +procedure TVariationFlux.CalcFunction; +var + avgr, avga, xmv, xpv, frc, + x, y, y2, s, c: double; + +begin + // Avoid reduant calculations by precalculating everything what is used at least twice + x := FTx^; + xpv := x + VVAR; + xmv := x - VVAR; + y := FTy^; + y2 := sqr(y); + + // We have a division by zero problem in the original flux + // (What if y + (x-vvar) == 0 ????) + frc := sqrt(y2 + sqr(xmv)); + if (frc = 0) then frc := 1.0; + + avgr := VVAR * (spr * sqrt(sqrt(y2 + sqr(xpv) ) / frc)); + avga := (arctan2(y, xmv) - arctan2(y, xpv)) / 2.0; + SinCos(avga, s, c); + + FPx^ := FPx^ + avgr * c; + FPy^ := FPy^ + avgr * s; + FPz^ := FPz^ + vvar * FTz^; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationFlux.Create; +begin + spread := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationFlux.GetInstance: TBaseVariation; +begin + Result := TVariationFlux.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationFlux.GetName: string; +begin + Result := 'flux'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationFlux.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'flux_spread'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationFlux.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'flux_spread' then begin + spread := Value; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationFlux.GetNrVariables: integer; +begin + Result := 1 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationFlux.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'flux_spread' then begin + Value := spread; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationFlux), true, false); +end. diff --git a/Variations/varFoci.pas b/Variations/varFoci.pas new file mode 100644 index 0000000..7758229 --- /dev/null +++ b/Variations/varFoci.pas @@ -0,0 +1,118 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varFoci; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationFoci = class(TBaseVariation) + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + + + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationFoci.CalcFunction; +var + expx, expnx, siny, cosy, tmp: double; +begin + expx := exp(FTx^) * 0.5; + expnx := 0.25 / expx; + sincos(FTy^, siny, cosy); + + tmp := ( expx + expnx - cosy ); + if (tmp = 0) then tmp := 1e-6; + tmp := VVAR / tmp; + + FPx^ := FPx^ + (expx - expnx) * tmp; + FPy^ := FPy^ + siny * tmp; + + FPz^ := FPz^ + vvar * FTz^; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationFoci.Create; +begin +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationFoci.GetInstance: TBaseVariation; +begin + Result := TVariationFoci.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationFoci.GetName: string; +begin + Result := 'foci'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationFoci.GetVariableNameAt(const Index: integer): string; +begin + Result := ''; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationFoci.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationFoci.GetNrVariables: integer; +begin + Result := 0 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationFoci.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationFoci), true, false); +end. diff --git a/Variations/varGenericPlugin.pas b/Variations/varGenericPlugin.pas new file mode 100644 index 0000000..ee2f2c0 --- /dev/null +++ b/Variations/varGenericPlugin.pas @@ -0,0 +1,359 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +{ + Variation Plugin DLL support for Apophysis: + Generic Plugin Support Unit + Started by Jed Kelsey, June 2007 + + + Portions Copyright (C) 2008 Joel Faber + + February 2008: + - Remove 30 plugin limit + - Reset variables +} + +unit varGenericPlugin; + +interface + +uses + BaseVariation, XFormMan, Settings, // Translation, + Classes, //TStrings/TStringList + SysUtils, //FindFirst/FindNext/FindClose + Forms; //MessageBox + +type + TPluginVariationClass = class of TPluginVariation; + + TPluginData = record + Instance: Integer; + PluginHandle: THandle; + PluginClass: TPluginVariationClass; + + PluginVarGetName: function: PAnsiChar; cdecl; + PluginVarGetNrVariables: function: Integer; cdecl; + PluginVarGetVariableNameAt: function(const Index: integer): PAnsiChar; cdecl; + + PluginVarCreate: function: Pointer; cdecl; + PluginVarDestroy: function(var MyVariation: Pointer): LongBool; cdecl; + PluginVarInit: function(MyVariation, FPx, FPy, FTx, FTy: Pointer; vvar: double): LongBool; cdecl; + PluginVarInit3D: function(MyVariation, FPx, FPy, FPz, FTx, FTy, FTz: Pointer; vvar: double): LongBool; cdecl; + PluginVarInitDC: function(MyVariation, FPx, FPy, FPz, FTx, FTy, FTz, color: Pointer; vvar, a, b, c, d, e, f: double): LongBool; cdecl; + PluginVarPrepare: function(MyVariation: Pointer): LongBool; cdecl; + PluginVarCalc: function(MyVariation: Pointer): LongBool; cdecl; + PluginVarGetVariable: function(MyVariation: Pointer; const Name: PAnsiChar; var value: double): LongBool; cdecl; + PluginVarSetVariable: function(MyVariation: Pointer; const Name: PAnsiChar; var value: double): LongBool; cdecl; + PluginVarResetVariable:function(MyVariation: Pointer; const Name: PAnsiChar) : LongBool; cdecl; + end; + PPluginData = ^TPluginData; + + // This class serves as a proxy for the plugin variations. + TPluginVariation = class(TBaseVariation) + + private + PluginData : TPluginData; + MyVariation : Pointer; + public + constructor Create(varData : TPluginData); + destructor Destroy; override; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +type + TVariationPluginLoader = class (TVariationLoader) + public + constructor Create(varData : TPluginData); + destructor Destroy; override; + + function GetName: string; override; + function GetInstance: TBaseVariation; override; + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + private + PluginData : TPluginData; + end; + +procedure InitializePlugins; + +const CurrentPlatform = +{$ifdef Apo7X64} + $00000040 +{$else} + $00000020 +{$endif}; + + ////////////////////////////////////////////////////////////////////// + +implementation + +uses + Windows, //LoadLibrary + Global; + +{ TPluginVariation } + +/////////////////////////////////////////////////////////////////////////////// + +constructor TVariationPluginLoader.Create(varData : TPluginData); +begin + PluginData := varData; +end; + +destructor TVariationPluginLoader.Destroy; +begin + FreeLibrary(PluginData.PluginHandle); +end; + +function TVariationPluginLoader.GetName : string; +begin + Result := String(PluginData.PluginVarGetName); +end; + +function TVariationPluginLoader.GetInstance: TBaseVariation; +begin + Result := TPluginVariation.Create(PluginData); +end; + +function TVariationPluginLoader.GetNrVariables: integer; +begin + Result := PluginData.PluginVarGetNrVariables; +end; + +function TVariationPluginLoader.GetVariableNameAt(const Index: integer): string; +begin + Result := String(PluginData.PluginVarGetVariableNameAt(Index)); +end; + +/////////////////////////////////////////////////////////////////////////////// + +procedure TPluginVariation.Prepare; +begin + with PluginData do begin + if @PluginVarInitDC <> nil then + PluginVarInitDC(MyVariation, Pointer(FPX), Pointer(FPy), Pointer(FPz), Pointer(FTx), Pointer(FTy), Pointer(FTz), Pointer(color), vvar, a, b, c, d, e, f) + else if @PluginVarInit3D <> nil then + PluginVarInit3D(MyVariation, Pointer(FPX), Pointer(FPy), Pointer(FPz), Pointer(FTx), Pointer(FTy), Pointer(FTz), vvar) + else + PluginVarInit(MyVariation, Pointer(FPX), Pointer(FPy), Pointer(FTx), Pointer(FTy), vvar); + PluginVarPrepare(MyVariation); + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TPluginVariation.CalcFunction; +begin + PluginData.PluginVarCalc(MyVariation); +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TPluginVariation.Create(varData : TPluginData); +begin + PluginData := varData; + MyVariation := PluginData.PluginVarCreate; +end; + +/////////////////////////////////////////////////////////////////////////////// +destructor TPluginVariation.Destroy; +begin + PluginData.PluginVarDestroy(MyVariation); + inherited; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TPluginVariation.GetInstance: TBaseVariation; +begin + Result := nil; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TPluginVariation.GetName: string; +begin + Result := ''; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TPluginVariation.GetNrVariables: integer; +begin + Result := PluginData.PluginVarGetNrVariables; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TPluginVariation.GetVariableNameAt(const Index: integer): string; +begin + Result := String(PluginData.PluginVarGetVariableNameAt(Index)); +end; + +/////////////////////////////////////////////////////////////////////////////// +function TPluginVariation.SetVariable(const Name: string; var value: double): boolean; +begin + Result := PluginData.PluginVarSetVariable(MyVariation,PAnsiChar(AnsiString(Name)),value); +end; + +/////////////////////////////////////////////////////////////////////////////// +function TPluginVariation.GetVariable(const Name: string; var value: double): boolean; +begin + Result := PluginData.PluginVarGetVariable(MyVariation,PAnsiChar(AnsiString(Name)),value); +end; + +/////////////////////////////////////////////////////////////////////////////// +function TPluginVariation.ResetVariable(const Name: string) : boolean; +var + dummy: double; +begin + if @PluginData.PluginVarResetVariable <> nil then + Result := PluginData.PluginVarResetVariable(MyVariation, PAnsiChar(AnsiString(Name))) + else begin + dummy := 0; + Result := PluginData.PluginVarSetVariable(MyVariation,PAnsiChar(AnsiString(Name)), dummy); + end; +end; + +function GetPlatformOf(dllPath: string): integer; +var + fs: TFilestream; + signature: DWORD; + dos_header: IMAGE_DOS_HEADER; + pe_header: IMAGE_FILE_HEADER; + opt_header: IMAGE_OPTIONAL_HEADER; +begin + fs := TFilestream.Create(dllPath, fmOpenread or fmShareDenyNone); + try + fs.read(dos_header, SizeOf(dos_header)); + if dos_header.e_magic <> IMAGE_DOS_SIGNATURE then + begin + Result := 0; + Exit; + end; + + fs.seek(dos_header._lfanew, soFromBeginning); + fs.read(signature, SizeOf(signature)); + if signature <> IMAGE_NT_SIGNATURE then + begin + Result := 0; + Exit; + end; + + fs.read(pe_header, SizeOf(pe_header)); + case pe_header.Machine of + IMAGE_FILE_MACHINE_I386: Result := $00000020; + IMAGE_FILE_MACHINE_AMD64: Result := $00000040; + else + Result := 0; + end; { Case } + + finally + fs.Free; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure InitializePlugins; +var + searchResult: TSearchRec; + dllPath, name, msg: string; + PluginData: TPluginData; + errno: integer; + errstr: string; +begin + NumBuiltinVars := NRLOCVAR + GetNrRegisteredVariations; + PluginPath := ReadPluginDir; + + // Try to find regular files matching *.dll in the plugins dir + if FindFirst(PluginPath + '*.dll', faAnyFile, searchResult) = 0 then + begin + repeat + with PluginData do begin + dllPath := PluginPath + searchResult.Name; + + //Check plugin platform + if CurrentPlatform <> GetPlatformOf(dllPath) + then continue; + + //Load DLL and initialize plugins! + PluginHandle := LoadLibrary(PChar(dllPath)); + if PluginHandle<>0 then begin + @PluginVarGetName := GetProcAddress(PluginHandle,'PluginVarGetName'); + if @PluginVarGetName = nil then begin // Must not be a valid plugin! + FreeLibrary(PluginHandle); + msg := msg + 'Invalid plugin type: "' + searchResult.Name + '" is not a plugin' + #13#10; + continue; + end; + name := String(PluginVarGetName); + if GetVariationIndex(name) >= 0 then begin + FreeLibrary(PluginHandle); + msg := msg + 'Cannot load plugin from ' + searchResult.Name + ': variation "' + name + '" already exists!' + #13#10; + // msg := msg + Format(TextByKey('common-loaderror') + #13#10, [searchResult.Name, name]); + end + else begin + @PluginVarGetNrVariables := GetProcAddress(PluginHandle,'PluginVarGetNrVariables'); + @PluginVarGetVariableNameAt := GetProcAddress(PluginHandle,'PluginVarGetVariableNameAt'); + @PluginVarCreate := GetProcAddress(PluginHandle,'PluginVarCreate'); + @PluginVarDestroy := GetProcAddress(PluginHandle,'PluginVarDestroy'); + @PluginVarInit := GetProcAddress(PluginHandle,'PluginVarInit'); + @PluginVarInit3D := GetProcAddress(PluginHandle,'PluginVarInit3D'); + @PluginVarInitDC := GetProcAddress(PluginHandle,'PluginVarInitDC'); + @PluginVarPrepare := GetProcAddress(PluginHandle,'PluginVarPrepare'); + @PluginVarCalc := GetProcAddress(PluginHandle,'PluginVarCalc'); + @PluginVarGetVariable := GetProcAddress(PluginHandle,'PluginVarGetVariable'); + @PluginVarSetVariable := GetProcAddress(PluginHandle,'PluginVarSetVariable'); + @PluginVarResetVariable := GetProcAddress(PluginHandle,'PluginVarResetVariable'); + + RegisterVariation(TVariationPluginLoader.Create(PluginData), @PluginVarInit3D <> nil, @PluginVarInitDC <> nil); + //RegisterVariationFile(ExtractFilePath(Application.ExeName) + 'Plugins\' + searchResult.Name, name); + RegisterVariationFile(PluginPath + searchResult.Name, name); // AV: fixed! + end; + end else begin + errno := GetLastError; + errstr := SysErrorMessage(errno); + msg := msg + 'Cannot open plugin file: ' + searchResult.Name + ' (Error #' + IntToStr(GetLastError) + ' - ' + errstr + ')' + #13#10; + end; + end; + until (FindNext(searchResult) <> 0); + SysUtils.FindClose(searchResult); //Since we use Windows unit (LoadLibrary) + + if msg <> '' then + Application.MessageBox( + PChar('There were problems with some of the plugins:' + #13#10#13#10 + msg), + 'Warning', MB_ICONWARNING or MB_OK); // TextByKey('common-loaderror1') + end; +end; + +/////////////////////////////////////////////////////////////////////////////// + +end. + diff --git a/Variations/varGlynnSim1.pas b/Variations/varGlynnSim1.pas new file mode 100644 index 0000000..d5c20e8 --- /dev/null +++ b/Variations/varGlynnSim1.pas @@ -0,0 +1,245 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varGlynnSim1; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationGlynnSim1 = class(TBaseVariation) + private + radius, radius1, thickness, contrast, pow, + Phi1, abspow, x1, y1: double; + procedure FilledCircle(var x: double; var y: double); + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +{ TVariationGlynnSim1 } + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationGlynnSim1.Prepare; +var sPhi1, cPhi1: double; +begin + SinCos(Phi1 * Pi / 180, sPhi1, cPhi1); + x1 := radius * cPhi1; + y1 := radius * sPhi1; + abspow := abs(pow); +end; + +procedure TVariationGlynnSim1.FilledCircle(var x: double; var y: double); +var r, Phi, sPhi, cPhi: double; +begin + Randomize; + r := radius1 * (thickness + (1 - thickness) * random); + Phi := 2 * Pi * random; + SinCos(Phi, sPhi, cPhi); + x := r * cPhi + x1; + y := r * sPhi + y1; +end; + +procedure TVariationGlynnSim1.CalcFunction; +var r, r2, x, y, px, py, Alpha: double; +begin + x := FTx^; y := FTy^; + r := hypot(x, y); + Alpha := radius / r; + + if (r < radius) then + begin + FilledCircle(px, py); + FPx^ := FPx^ + vvar * px; + FPy^ := FPy^ + vvar * py; + end else + begin + if (random > contrast * power(Alpha, abspow)) then + begin + px := x; + py := y; + end else + begin + px := sqr(Alpha) * x; + py := sqr(Alpha) * y; + end; + r2 := sqr(px - x1) +sqr(py - y1); + if (r2 < sqr(radius1)) then + begin + FilledCircle(px,py); + FPx^ := FPx^ + vvar * px; + FPy^ := FPy^ + vvar * py; + end else + begin + FPx^ := FPx^ + vvar * px; + FPy^ := FPy^ + vvar * py; + end; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationGlynnSim1.Create; +begin + radius := 1; + radius1 := 0.1; + thickness := 0.1; + contrast := 0.5; + pow := 1.5; + Phi1 := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationGlynnSim1.GetInstance: TBaseVariation; +begin + Result := TVariationGlynnSim1.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationGlynnSim1.GetName: string; +begin + Result := 'GlynnSim1'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationGlynnSim1.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'GlynnSim1_radius'; + 1: Result := 'GlynnSim1_radius1'; + 2: Result := 'GlynnSim1_Phi1'; + 3: Result := 'GlynnSim1_thickness'; + 4: Result := 'GlynnSim1_pow'; + 5: Result := 'GlynnSim1_contrast'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationGlynnSim1.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'GlynnSim1_radius' then begin + radius := Value; + Result := True; + end else if Name = 'GlynnSim1_thickness' then begin + if Value < 0 then Value := 0; + if Value > 1 then Value := 1; + thickness := Value; + Result := True; + end else if Name = 'GlynnSim1_contrast' then begin + if Value < 0 then Value := 0; + if Value > 1 then Value := 1; + contrast := Value; + Result := True; + end else if Name = 'GlynnSim1_pow' then begin + pow := Value; + Result := True; + end else if Name = 'GlynnSim1_Phi1' then begin + Phi1 := Value; + Result := True; + end else if Name = 'GlynnSim1_radius1' then begin + radius1 := Value; + Result := True; + end +end; + +function TVariationGlynnSim1.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'GlynnSim1_radius' then begin + radius:= 1; + Result := True; + end else if Name = 'GlynnSim1_thickness' then begin + thickness := 0.1; + Result := True; + end else if Name = 'GlynnSim1_contrast' then begin + contrast := 0.5; + Result := True; + end else if Name = 'GlynnSim1_pow' then begin + pow := 1.5; + Result := True; + end else if Name = 'GlynnSim1_Phi1' then begin + Phi1 := 0; + Result := True; + end else if Name = 'GlynnSim1_radius1' then begin + radius1 := 0.1; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationGlynnSim1.GetNrVariables: integer; +begin + Result := 6 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationGlynnSim1.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'GlynnSim1_radius' then begin + Value := radius; + Result := True; + end else if Name = 'GlynnSim1_thickness' then begin + Value := thickness; + Result := True; + end else if Name = 'GlynnSim1_contrast' then begin + Value := contrast; + Result := True; + end else if Name = 'GlynnSim1_pow' then begin + Value := pow; + Result := True; + end else if Name = 'GlynnSim1_Phi1' then begin + Value := Phi1; + Result := True; + end else if Name = 'GlynnSim1_radius1' then begin + Value := radius1; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationGlynnSim1), false, false); +end. diff --git a/Variations/varGlynnSim2.pas b/Variations/varGlynnSim2.pas new file mode 100644 index 0000000..8933e7a --- /dev/null +++ b/Variations/varGlynnSim2.pas @@ -0,0 +1,234 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varGlynnSim2; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationGlynnSim2 = class(TBaseVariation) + private + radius, thickness, contrast, pow, + Phi1, Phi2, Phi10, Phi20, + gamma, delta, abspow: double; + procedure Circle(var x: double; var y: double); + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + + end; + +implementation + +uses + Math; + +{ TVariationGlynnSim2 } + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationGlynnSim2.Prepare; +begin + Phi10 := Phi1 * Pi / 180; + Phi20 := Phi2 * Pi / 180; + delta := Phi20 - Phi10; + gamma := thickness * (2 * radius + thickness) / (radius + thickness); + abspow := abs(pow); +end; + +procedure TVariationGlynnSim2.Circle(var x: double; var y: double); +var r, Phi, sPhi, cPhi: double; +begin + Randomize; + r := radius + thickness - gamma * random; + Phi := Phi10 + delta * random; + SinCos(Phi, sPhi, cPhi); + x := r * cPhi; + y := r * sPhi; +end; + +procedure TVariationGlynnSim2.CalcFunction; +var r, x, y, px, py, Alpha: double; +begin + x := FTx^; y := FTy^; + r := hypot(x, y); + Alpha := radius / r; + + if (r < radius) then + begin + Circle(px, py); + FPx^ := FPx^ + vvar * px; + FPy^ := FPy^ + vvar * py; + end else + if (random > contrast * power(Alpha, abspow)) then + begin + FPx^ := FPx^ + vvar * x; + FPy^ := FPy^ + vvar * y; + end else + begin + FPx^ := FPx^ + vvar * sqr(Alpha) * x; + FPy^ := FPy^ + vvar * sqr(Alpha) * y; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationGlynnSim2.Create; +begin + radius := 1; + thickness := 0.1; + contrast := 0.5; + pow := 1.5; + Phi1 := 0; + Phi2 := 360; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationGlynnSim2.GetInstance: TBaseVariation; +begin + Result := TVariationGlynnSim2.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationGlynnSim2.GetName: string; +begin + Result := 'GlynnSim2'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationGlynnSim2.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'GlynnSim2_radius'; + 1: Result := 'GlynnSim2_thickness'; + 2: Result := 'GlynnSim2_contrast'; + 3: Result := 'GlynnSim2_pow'; + 4: Result := 'GlynnSim2_Phi1'; + 5: Result := 'GlynnSim2_Phi2'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationGlynnSim2.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'GlynnSim2_radius' then begin + radius := Value; + Result := True; + end else if Name = 'GlynnSim2_thickness' then begin + if Value < 0 then Value := 0; + if Value > 1 then Value := 1; + thickness := Value; + Result := True; + end else if Name = 'GlynnSim2_contrast' then begin + if Value < 0 then Value := 0; + if Value > 1 then Value := 1; + contrast := Value; + Result := True; + end else if Name = 'GlynnSim2_pow' then begin + pow := Value; + Result := True; + end else if Name = 'GlynnSim2_Phi1' then begin + Phi1 := Value; + Result := True; + end else if Name = 'GlynnSim2_Phi2' then begin + Phi2 := Value; + Result := True; + end +end; + +function TVariationGlynnSim2.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'GlynnSim2_radius' then begin + radius:= 1; + Result := True; + end else if Name = 'GlynnSim2_thickness' then begin + thickness := 0.1; + Result := True; + end else if Name = 'GlynnSim2_contrast' then begin + contrast := 0.5; + Result := True; + end else if Name = 'GlynnSim2_pow' then begin + pow := 1.5; + Result := True; + end else if Name = 'GlynnSim2_Phi1' then begin + Phi1 := 0; + Result := True; + end else if Name = 'GlynnSim2_Phi2' then begin + Phi2 := 360; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationGlynnSim2.GetNrVariables: integer; +begin + Result := 6 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationGlynnSim2.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'GlynnSim2_radius' then begin + Value := radius; + Result := True; + end else if Name = 'GlynnSim2_thickness' then begin + Value := thickness; + Result := True; + end else if Name = 'GlynnSim2_contrast' then begin + Value := contrast; + Result := True; + end else if Name = 'GlynnSim2_pow' then begin + Value := pow; + Result := True; + end else if Name = 'GlynnSim2_Phi1' then begin + Value := Phi1; + Result := True; + end else if Name = 'GlynnSim2_Phi2' then begin + Value := Phi2; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationGlynnSim2), false, false); +end. diff --git a/Variations/varGlynnSim3.pas b/Variations/varGlynnSim3.pas new file mode 100644 index 0000000..45f7cff --- /dev/null +++ b/Variations/varGlynnSim3.pas @@ -0,0 +1,210 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varGlynnSim3; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationGlynnSim3 = class(TBaseVariation) + private + radius, thickness, contrast, pow, + radius1, radius2, gamma: double; + procedure DoubleCircle(var x: double; var y: double); + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + + end; + +implementation + +uses + Math; + +{ TVariationGlynnSim2 } + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationGlynnSim3.Prepare; +begin + radius1 := radius + thickness; + radius2 := sqr(radius) / radius1; + gamma := radius1 / (radius1 + radius2); +end; + +procedure TVariationGlynnSim3.DoubleCircle(var x: double; var y: double); +var r, Phi, sPhi, cPhi: double; +begin + Randomize; + Phi := 2 * Pi * random; + SinCos(Phi, sPhi, cPhi); + if (random < gamma) then r := radius1 + else r := radius2; + x := r * cPhi; + y := r * sPhi; +end; + +procedure TVariationGlynnSim3.CalcFunction; +var r, r2, x, y, px, py, Alpha: double; +begin + x := FTx^; y := FTy^; + r := hypot(x, y); + Alpha := radius / r; + + if (r < radius1) then + begin + DoubleCircle(px, py); + FPx^ := FPx^ + vvar * px; + FPy^ := FPy^ + vvar * py; + end else + begin + if (random > contrast * power(Alpha, pow)) then + begin + FPx^ := FPx^ + vvar * x; + FPy^ := FPy^ + vvar * y; + end else + begin + FPx^ := FPx^ + vvar * sqr(Alpha) * x; + FPy^ := FPy^ + vvar * sqr(Alpha) * y; + end; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationGlynnSim3.Create; +begin + radius := 1; + thickness := 0.1; + contrast := 0.5; + pow := 1.5; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationGlynnSim3.GetInstance: TBaseVariation; +begin + Result := TVariationGlynnSim3.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationGlynnSim3.GetName: string; +begin + Result := 'GlynnSim3'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationGlynnSim3.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'GlynnSim3_radius'; + 1: Result := 'GlynnSim3_thickness'; + 2: Result := 'GlynnSim3_contrast'; + 3: Result := 'GlynnSim3_pow'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationGlynnSim3.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'GlynnSim3_radius' then begin + radius := Value; + Result := True; + end else if Name = 'GlynnSim3_thickness' then begin + thickness := Value; + Result := True; + end else if Name = 'GlynnSim3_contrast' then begin + if Value < 0 then Value := 0; + if Value > 1 then Value := 1; + contrast := Value; + Result := True; + end else if Name = 'GlynnSim3_pow' then begin + pow := Value; + Result := True; + end +end; + +function TVariationGlynnSim3.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'GlynnSim3_radius' then begin + radius:= 1; + Result := True; + end else if Name = 'GlynnSim3_thickness' then begin + thickness := 0.1; + Result := True; + end else if Name = 'GlynnSim3_contrast' then begin + contrast := 0.5; + Result := True; + end else if Name = 'GlynnSim3_pow' then begin + pow := 1.5; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationGlynnSim3.GetNrVariables: integer; +begin + Result := 4 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationGlynnSim3.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'GlynnSim3_radius' then begin + Value := radius; + Result := True; + end else if Name = 'GlynnSim3_thickness' then begin + Value := thickness; + Result := True; + end else if Name = 'GlynnSim3_contrast' then begin + Value := contrast; + Result := True; + end else if Name = 'GlynnSim3_pow' then begin + Value := pow; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationGlynnSim3), false, false); +end. diff --git a/Variations/varHandkerchief.pas b/Variations/varHandkerchief.pas new file mode 100644 index 0000000..56629f3 --- /dev/null +++ b/Variations/varHandkerchief.pas @@ -0,0 +1,127 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit varHandkerchief; + +interface +uses + BaseVariation, XFormMan; + +type + TVariationHandkerchief = class(TBaseVariation) + private + old: byte; + procedure CalcPlugin; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure CalcFunction; override; + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + + +implementation + +uses + Math; +//////////////////////// +procedure TVariationHandkerchief.GetCalcFunction(var f: TCalcFunction); +begin + if old = 1 then f := CalcFunction + else f := CalcPlugin; +end; + +procedure TVariationHandkerchief.CalcFunction; +var + r, FAngle: double; +begin + FAngle := arctan2(FTx^, FTy^); + r := sqrt(sqr(FTx^) + sqr(FTy^)); + FPx^ := FPx^ + vvar * sin(FAngle + r) * r; + FPy^ := FPy^ + vvar * cos(FAngle - r) * r; +end; + +procedure TVariationHandkerchief.CalcPlugin; +var + r, FAngle: double; +begin + FAngle := arctan2(FTy^, FTx^); + r := sqrt(sqr(FTx^) + sqr(FTy^)); + FPx^ := FPx^ + vvar * sin(FAngle + r) * r; + FPy^ := FPy^ + vvar * cos(FAngle - r) * r; +end; + +constructor TVariationHandkerchief.Create; +begin + old := 1; +end; + +class function TVariationHandkerchief.GetInstance: TBaseVariation; +begin + Result := TVariationHandkerchief.Create; +end; + +class function TVariationHandkerchief.GetName: string; +begin + Result := 'handkerchief'; +end; + +function TVariationHandkerchief.GetNrVariables: integer; +begin + Result := 1; +end; + +function TVariationHandkerchief.GetVariable(const Name: string; + var value: double): boolean; +begin + Result := False; + if Name = 'handkerchief_old' then begin + value := old; + Result := True; + end; +end; + +function TVariationHandkerchief.GetVariableNameAt(const Index: integer): string; +begin + case Index of + 0: Result := 'handkerchief_old'; + else + Result := ''; + end; +end; + +function TVariationHandkerchief.SetVariable(const Name: string; + var value: double): boolean; +begin + Result := False; + if Name = 'handkerchief_old' then begin + if Value < 0 then Value := 0; + if Value > 1 then Value := 1; + old := Round(value); + Result := True; + end; +end; + +function TVariationHandkerchief.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'handkerchief_old' then begin + old := 1; + Result := True; + end; +end; + +////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationHandkerchief), false, false); + +end. diff --git a/Variations/varHeart.pas b/Variations/varHeart.pas new file mode 100644 index 0000000..1022ee2 --- /dev/null +++ b/Variations/varHeart.pas @@ -0,0 +1,61 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit varHeart; + +interface +uses + BaseVariation, XFormMan; + +type + TVariationHeart = class(TBaseVariation) + private + + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + procedure CalcFunction; override; + end; + + +implementation + +uses + Math; + +//////////////////////// + +procedure TVariationHeart.CalcFunction; +var + FAngle, r, sinr, cosr: double; +begin + FAngle := arctan2(FTx^, FTy^); + r := sqrt(sqr(FTx^) + sqr(FTy^)); + Sincos(r * FAngle, sinr, cosr); + r := r * vvar; + FPx^ := FPx^ + r * sinr; + FPy^ := FPy^ - r * cosr; +end; + +constructor TVariationHeart.Create; +begin + inherited Create; +end; + +class function TVariationHeart.GetInstance: TBaseVariation; +begin + Result := TVariationHeart.Create; +end; + +class function TVariationHeart.GetName: string; +begin + Result := 'heart'; +end; + +////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationHeart), false, false); + +end. diff --git a/Variations/varHyperboloid.pas b/Variations/varHyperboloid.pas new file mode 100644 index 0000000..0bcc207 --- /dev/null +++ b/Variations/varHyperboloid.pas @@ -0,0 +1,240 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit varHyperboloid; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationHyperboloid = class(TBaseVariation) + private + kx, ky, kz, maxheight, h, hb: double; + vkx, vky, vkz: double; + limit, zero: byte; + + procedure CalcCut; + procedure CalcCutBoarder; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + +implementation + +uses + Math; + +{ TVariationHyperboloid } + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationHyperboloid.Prepare; +begin + vkx := VVAR * kx; + vky := VVAR * ky; + vkz := VVAR * kz; + h := sqrt(1 + sqr(maxheight / ky)); + hb := sqrt(sqr(h) - 1); +end; + +procedure TVariationHyperboloid.GetCalcFunction(var f: TCalcFunction); +begin + if (limit = 0) then + f := CalcFunction + else if (zero = 0) then + f := CalcCutBoarder + else + f := CalcCut; +end; + +procedure TVariationHyperboloid.CalcFunction; +var + sn, cn, sh, ch: double; +begin + SinCos(FTx^, sn, cn); + SinhCosh(FTy^, sh, ch); + + FPx^ := FPx^ + vkx * ch * sn; + FPy^ := FPy^ + vky * sh; + FPz^ := FPz^ + vkz * ch * cn; +end; + +procedure TVariationHyperboloid.CalcCut; +var + sn, cn, sh, ch: double; +begin + SinhCosh(FTy^, sh, ch); + + if (ch <= h) then // cut the surface + begin + SinCos(FTx^, sn, cn); + FPx^ := FPx^ + vkx * ch * sn; + FPy^ := FPy^ + vky * sh; + FPz^ := FPz^ + vkz * ch * cn; + end; +end; + +procedure TVariationHyperboloid.CalcCutBoarder; +var + sn, cn, sh, ch: double; +begin + SinCos(FTx^, sn, cn); + SinhCosh(FTy^, sh, ch); + + if (ch <= h) then // cut the surface + begin + FPx^ := FPx^ + vkx * ch * sn; + FPy^ := FPy^ + vky * sh; + FPz^ := FPz^ + vkz * ch * cn; + end + else begin // place the point on it's boarder + FPx^ := FPx^ + vkx * h * sn; + FPy^ := FPy^ + vky * sign(sh) * hb; + FPz^ := FPz^ + vkz * h * cn; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationHyperboloid.Create; +begin + kx := 1; + ky := 1; + kz := 1; + maxheight := RandomRange(3, 6); + limit := 1; + zero := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationHyperboloid.GetInstance: TBaseVariation; +begin + Result := TVariationHyperboloid.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationHyperboloid.GetName: string; +begin + Result := 'hourglass3D'; // AV: hyperbolic hyperboloid :) +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationHyperboloid.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'hourglass3D_kx'; + 1: Result := 'hourglass3D_ky'; + 2: Result := 'hourglass3D_kz'; + 3: Result := 'hourglass3D_maxheight'; + 4: Result := 'hourglass3D_uselimit'; + 5: Result := 'hourglass3D_zero_edges'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationHyperboloid.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'hourglass3D_kx' then begin + if (value < 1E-5) then Value := 1E-5; + kx := Value; + Result := True; + end else if Name = 'hourglass3D_ky' then begin + if (value < 1E-5) then Value := 1E-5; + ky := Value; + Result := True; + end else if Name = 'hourglass3D_kz' then begin + if (value < 1E-5) then Value := 1E-5; + kz := Value; + Result := True; + end else if Name = 'hourglass3D_maxheight' then begin + if (value < 0.1) then Value := 0.1; + maxheight := Value; + Result := True; + end else if Name = 'hourglass3D_uselimit' then begin + if (value < 0) then Value := 0; + if (value > 1) then Value := 1; + limit := Round(Value); + Result := True; + end else if Name = 'hourglass3D_zero_edges' then begin + if (value < 0) then Value := 0; + if (value > 1) then Value := 1; + zero := Round(Value); + Result := True; + end; +end; + +function TVariationHyperboloid.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'hourglass3D_kx' then begin + kx:= 1; + Result := True; + end else if Name = 'hourglass3D_ky' then begin + ky := 1; + Result := True; + end else if Name = 'hourglass3D_kz' then begin + kz := 1; + Result := True; + end else if Name = 'hourglass3D_maxheight' then begin + maxheight := 3; + Result := True; + end else if Name = 'hourglass3D_uselimit' then begin + limit := IfThen(limit = 0, 1, 0); + Result := True; + end else if Name = 'hourglass3D_zero_edges' then begin + zero := IfThen(zero = 0, 1, 0); + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationHyperboloid.GetNrVariables: integer; +begin + Result := 6; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationHyperboloid.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'hourglass3D_kx' then begin + Value := kx; + Result := True; + end else if Name = 'hourglass3D_ky' then begin + Value := ky; + Result := True; + end else if Name = 'hourglass3D_kz' then begin + Value := kz; + Result := True; + end else if Name = 'hourglass3D_maxheight' then begin + Value := maxheight; + Result := True; + end else if Name = 'hourglass3D_uselimit' then begin + Value := limit; + Result := True; + end else if Name = 'hourglass3D_zero_edges' then begin + Value := zero; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationHyperboloid), true, false); +end. diff --git a/Variations/varHypertile.pas b/Variations/varHypertile.pas new file mode 100644 index 0000000..a377c3d --- /dev/null +++ b/Variations/varHypertile.pas @@ -0,0 +1,185 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varHypertile; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationHypertile = class(TBaseVariation) + private + hypertile_p, hypertile_q, hypertile_n: integer; + re, im: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationHypertile.Prepare; +var + t, pa, qa, r: double; +begin + pa := PI2 / hypertile_p; + qa := PI2 / hypertile_q; + t := cos(pa); + r := (1 - t) / (t + cos(qa)) + 1; + if (r > 0) then + r := 1 / sqrt(r) + else + r := 1; + t := hypertile_n * pa; + SinCos(t, pa, qa); + re := r * qa; + im := r * pa; +end; + +procedure TVariationHypertile.CalcFunction; +var + u, v, s, t, vr: double; +begin + u := FTx^ + re; + v := FTy^ - im; + + s := re * FTx^ - im * FTy^ + 1; + t := re * FTy^ + im * FTx^; + + vr := vvar / (sqr(s) + sqr(t)); + + FPx^ := FPx^ + vr * (u * s + v * t); + FPy^ := FPy^ + vr * (v * s - u * t); + // FPz^ := FPz^ + VVAR * FTz^; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationHypertile.Create; +begin + hypertile_p := 3; + hypertile_q := 7; + hypertile_n := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationHypertile.GetInstance: TBaseVariation; +begin + Result := TVariationHypertile.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationHypertile.GetName: string; +begin + Result := 'hypertile'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationHypertile.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'hypertile_p'; + 1: Result := 'hypertile_q'; + 2: Result := 'hypertile_n'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationHypertile.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'hypertile_p' then begin + if Value < 3 then Value := 3; + hypertile_p := Round(Value); + Result := True; + end else if Name = 'hypertile_q' then begin + if Value < 3 then Value := 3; + hypertile_q := Round(Value); + Result := True; + end else if Name = 'hypertile_n' then begin + hypertile_n := Round(Value); + Result := True; + end; +end; + +function TVariationHypertile.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'hypertile_p' then begin + hypertile_p := 3; + Result := True; + end else if Name = 'hypertile_q' then begin + hypertile_q := 7; + Result := True; + end else if Name = 'hypertile_n' then begin + hypertile_n := 0; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationHypertile.GetNrVariables: integer; +begin + Result := 3; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationHypertile.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'hypertile_p' then begin + Value := hypertile_p; + Result := True; + end else if Name = 'hypertile_q' then begin + Value := hypertile_q; + Result := True; + end else if Name = 'hypertile_n' then begin + Value := hypertile_n; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationHypertile), false, false); +end. \ No newline at end of file diff --git a/Variations/varHypertile1.pas b/Variations/varHypertile1.pas new file mode 100644 index 0000000..6ea0d2e --- /dev/null +++ b/Variations/varHypertile1.pas @@ -0,0 +1,173 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varHypertile1; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationHypertile1 = class(TBaseVariation) + private + hypertile1_p, hypertile1_q: integer; + pa, r: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationHypertile1.Prepare; +var + cp, r2: double; +begin + pa := PI2 / hypertile1_p; + cp := cos(pa); + r2 := 1 - (cp - 1) / (cp + cos(PI2 / hypertile1_q)); + if (r2 > 0) then + r := 1 / sqrt(r2) + else + r := 1; +end; + +procedure TVariationHypertile1.CalcFunction; +var + sina, cosa, re, im, u, v, s, t, vr: double; +begin + SinCos(random(32767) * pa, sina, cosa); + re := r * cosa; + im := r * sina; + + u := FTx^ + re; + v := FTy^ - im; + + s := re * FTx^ - im * FTy^ + 1; + t := re * FTy^ + im * FTx^; + + vr := vvar / (sqr(s) + sqr(t)); + + FPx^ := FPx^ + vr * (u * s + v * t); + FPy^ := FPy^ + vr * (v * s - u * t); + // FPz^ := FPz^ + VVAR * FTz^; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationHypertile1.Create; +begin + hypertile1_p := 3; + hypertile1_q := 7; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationHypertile1.GetInstance: TBaseVariation; +begin + Result := TVariationHypertile1.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationHypertile1.GetName: string; +begin + Result := 'hypertile1'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationHypertile1.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'hypertile1_p'; + 1: Result := 'hypertile1_q'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationHypertile1.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'hypertile1_p' then begin + if Value < 3 then Value := 3; + hypertile1_p := Round(Value); + Result := True; + end else if Name = 'hypertile1_q' then begin + if Value < 3 then Value := 3; + hypertile1_q := Round(Value); + Result := True; + end; +end; + +function TVariationHypertile1.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'hypertile1_p' then begin + hypertile1_p := 3; + Result := True; + end else if Name = 'hypertile1_q' then begin + hypertile1_q := 7; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationHypertile1.GetNrVariables: integer; +begin + Result := 2; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationHypertile1.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'hypertile1_p' then begin + Value := hypertile1_p; + Result := True; + end else if Name = 'hypertile1_q' then begin + Value := hypertile1_q; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationHypertile1), false, false); +end. \ No newline at end of file diff --git a/Variations/varHypertile2.pas b/Variations/varHypertile2.pas new file mode 100644 index 0000000..6cd8698 --- /dev/null +++ b/Variations/varHypertile2.pas @@ -0,0 +1,172 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varHypertile2; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationHypertile2 = class(TBaseVariation) + private + hypertile2_p, hypertile2_q: integer; + pa, r: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationHypertile2.Prepare; +var + cp, r2: double; +begin + pa := PI2 / hypertile2_p; + cp := cos(pa); + r2 := 1 - (cp - 1) / (cp + cos(PI2 / hypertile2_q)); + if (r2 > 0) then + r := 1 / sqrt(r2) + else + r := 1; +end; + +procedure TVariationHypertile2.CalcFunction; +var + sina, cosa, x, y, u, v, s, t, vr: double; +begin + u := FTx^ + r; + v := FTy^; + s := r * FTx^ + 1; + t := r * FTy^; + + vr := vvar / (sqr(s) + sqr(t)); + x := u * s + v * t; + y := v * s - u * t; + + SinCos(random(32767) * pa, sina, cosa); + + FPx^ := FPx^ + vr * (x * cosa + y * sina); + FPy^ := FPy^ + vr * (y * cosa - x * sina); + // FPz^ := FPz^ + VVAR * FTz^; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationHypertile2.Create; +begin + hypertile2_p := 3; + hypertile2_q := 7; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationHypertile2.GetInstance: TBaseVariation; +begin + Result := TVariationHypertile2.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationHypertile2.GetName: string; +begin + Result := 'hypertile2'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationHypertile2.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'hypertile2_p'; + 1: Result := 'hypertile2_q'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationHypertile2.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'hypertile2_p' then begin + if Value < 3 then Value := 3; + hypertile2_p := Round(Value); + Result := True; + end else if Name = 'hypertile2_q' then begin + if Value < 3 then Value := 3; + hypertile2_q := Round(Value); + Result := True; + end; +end; + +function TVariationHypertile2.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'hypertile2_p' then begin + hypertile2_p := 3; + Result := True; + end else if Name = 'hypertile2_q' then begin + hypertile2_q := 7; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationHypertile2.GetNrVariables: integer; +begin + Result := 2; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationHypertile2.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'hypertile2_p' then begin + Value := hypertile2_p; + Result := True; + end else if Name = 'hypertile2_q' then begin + Value := hypertile2_q; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationHypertile2), false, false); +end. \ No newline at end of file diff --git a/Variations/varHypertile3D.pas b/Variations/varHypertile3D.pas new file mode 100644 index 0000000..febe28a --- /dev/null +++ b/Variations/varHypertile3D.pas @@ -0,0 +1,193 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varHypertile3D; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationHypertile3D = class(TBaseVariation) + private + hypertile3D_p, hypertile3D_q, hypertile3D_n: integer; + cx, cy, c2x, c2y, c2, s2x, s2y, s2z: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationHypertile3D.Prepare; +var + t, pa, qa, r: double; +begin + pa := PI2 / hypertile3D_p; + qa := PI2 / hypertile3D_q; + t := cos(pa); + r := -(t - 1) / (t + cos(qa)); + if (r > 0) then + r := 1 / sqrt(1 + r) + else + r := 1; + + t := hypertile3D_n * pa; + SinCos(t, pa, qa); + + cx := r * qa; + cy := r * pa; + c2x := 2 * cx; + c2y := 2 * cy; + c2 := sqr(cx) + sqr(cy); + + s2x := 1 + sqr(cx) - sqr(cy); + s2y := 1 + sqr(cy) - sqr(cx); + s2z := 1 - sqr(cy) - sqr(cx); +end; + +procedure TVariationHypertile3D.CalcFunction; +var + r2, x2cx, y2cy, vr: double; +begin + r2 := sqr(FTx^) + sqr(FTy^) + sqr(FTz^); + + x2cx := c2x * FTx^; + y2cy := c2y * FTy^; + + vr := vvar / (c2 * r2 + x2cx - y2cy + 1); + + FPx^ := FPx^ + vr * (FTx^ * s2x - cx * ( y2cy - r2 - 1)); + FPy^ := FPy^ + vr * (FTy^ * s2y + cy * (-x2cx - r2 - 1)); + FPz^ := FPz^ + vr * (FTz^ * s2z); +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationHypertile3D.Create; +begin + hypertile3D_p := 3; + hypertile3D_q := 7; + hypertile3D_n := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationHypertile3D.GetInstance: TBaseVariation; +begin + Result := TVariationHypertile3D.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationHypertile3D.GetName: string; +begin + Result := 'hypertile3D'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationHypertile3D.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'hypertile3D_p'; + 1: Result := 'hypertile3D_q'; + 2: Result := 'hypertile3D_n'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationHypertile3D.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'hypertile3D_p' then begin + if Value < 3 then Value := 3; + hypertile3D_p := Round(Value); + Result := True; + end else if Name = 'hypertile3D_q' then begin + if Value < 3 then Value := 3; + hypertile3D_q := Round(Value); + Result := True; + end else if Name = 'hypertile3D_n' then begin + hypertile3D_n := Round(Value); + Result := True; + end; +end; + +function TVariationHypertile3D.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'hypertile3D_p' then begin + hypertile3D_p := 3; + Result := True; + end else if Name = 'hypertile3D_q' then begin + hypertile3D_q := 7; + Result := True; + end else if Name = 'hypertile3D_n' then begin + hypertile3D_n := 0; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationHypertile3D.GetNrVariables: integer; +begin + Result := 3; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationHypertile3D.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'hypertile3D_p' then begin + Value := hypertile3D_p; + Result := True; + end else if Name = 'hypertile3D_q' then begin + Value := hypertile3D_q; + Result := True; + end else if Name = 'hypertile3D_n' then begin + Value := hypertile3D_n; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationHypertile3D), true, false); +end. \ No newline at end of file diff --git a/Variations/varHypertile3D1.pas b/Variations/varHypertile3D1.pas new file mode 100644 index 0000000..1590b69 --- /dev/null +++ b/Variations/varHypertile3D1.pas @@ -0,0 +1,178 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varHypertile3D1; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationHypertile3D1 = class(TBaseVariation) + private + hypertile3D1_p, hypertile3D1_q: integer; + pa, r, c2, s2z: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationHypertile3D1.Prepare; +var + t, qa: double; +begin + pa := PI2 / hypertile3D1_p; + qa := PI2 / hypertile3D1_q; + t := cos(pa); + r := -(t - 1) / (t + cos(qa)); + if (r > 0) then + r := 1 / sqrt(1 + r) + else + r := 1; + + c2 := sqr(r); + s2z := 1 - c2; +end; + +procedure TVariationHypertile3D1.CalcFunction; +var + sina, cosa, cx, cy, s2x, s2y, x2cx, y2cy, r2, vr: double; +begin + SinCos(random(32767) * pa, sina, cosa); + cx := r * cosa; + cy := r * sina; + s2x := 1 + sqr(cx) - sqr(cy); + s2y := 1 + sqr(cy) - sqr(cx); + + r2 := sqr(FTx^) + sqr(FTy^) + sqr(FTz^); + + x2cx := 2 * cx * FTx^; + y2cy := 2 * cy * FTy^; + + vr := vvar / (c2 * r2 + x2cx - y2cy + 1); + + FPx^ := FPx^ + vr * (FTx^ * s2x - cx * ( y2cy - r2 - 1)); + FPy^ := FPy^ + vr * (FTy^ * s2y + cy * (-x2cx - r2 - 1)); + FPz^ := FPz^ + vr * (FTz^ * s2z); +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationHypertile3D1.Create; +begin + hypertile3D1_p := 3; + hypertile3D1_q := 7; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationHypertile3D1.GetInstance: TBaseVariation; +begin + Result := TVariationHypertile3D1.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationHypertile3D1.GetName: string; +begin + Result := 'hypertile3D1'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationHypertile3D1.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'hypertile3D1_p'; + 1: Result := 'hypertile3D1_q'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationHypertile3D1.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'hypertile3D1_p' then begin + if Value < 3 then Value := 3; + hypertile3D1_p := Round(Value); + Result := True; + end else if Name = 'hypertile3D1_q' then begin + if Value < 3 then Value := 3; + hypertile3D1_q := Round(Value); + Result := True; + end; +end; + +function TVariationHypertile3D1.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'hypertile3D1_p' then begin + hypertile3D1_p := 3; + Result := True; + end else if Name = 'hypertile3D1_q' then begin + hypertile3D1_q := 7; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationHypertile3D1.GetNrVariables: integer; +begin + Result := 2; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationHypertile3D1.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'hypertile3D1_p' then begin + Value := hypertile3D1_p; + Result := True; + end else if Name = 'hypertile3D1_q' then begin + Value := hypertile3D1_q; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationHypertile3D1), true, false); +end. \ No newline at end of file diff --git a/Variations/varHypertile3D2.pas b/Variations/varHypertile3D2.pas new file mode 100644 index 0000000..8108925 --- /dev/null +++ b/Variations/varHypertile3D2.pas @@ -0,0 +1,179 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varHypertile3D2; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationHypertile3D2 = class(TBaseVariation) + private + hypertile3D2_p, hypertile3D2_q: integer; + pa, cx, c2, c2x, s2x, s2y, s2z: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationHypertile3D2.Prepare; +var + t, qa, r: double; +begin + pa := PI2 / hypertile3D2_p; + qa := PI2 / hypertile3D2_q; + t := cos(pa); + r := -(t - 1) / (t + cos(qa)); + if (r > 0) then + r := 1 / sqrt(1 + r) + else + r := 1; + + cx := r; + c2 := sqr(cx); + c2x := 2 * cx; + + s2x := 1 + c2; + s2y := 1 - c2; + s2z := 1 - c2; +end; + +procedure TVariationHypertile3D2.CalcFunction; +var + r2, sina, cosa, x2cx, x, y, vr: double; +begin + r2 := sqr(FTx^) + sqr(FTy^) + sqr(FTz^); + + x2cx := c2x * FTx^; + x := FTx^ * s2x - cx * (-r2 - 1); + y := FTy^ * s2y; + + vr := vvar / (c2 * r2 + x2cx + 1); + SinCos(random(32767) * pa, sina, cosa); + + FPx^ := FPx^ + vr * (x * cosa + y * sina); + FPy^ := FPy^ + vr * (y * cosa - x * sina); + FPz^ := FPz^ + vr * (FTz^ * s2z); +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationHypertile3D2.Create; +begin + hypertile3D2_p := 3; + hypertile3D2_q := 7; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationHypertile3D2.GetInstance: TBaseVariation; +begin + Result := TVariationHypertile3D2.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationHypertile3D2.GetName: string; +begin + Result := 'hypertile3D2'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationHypertile3D2.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'hypertile3D2_p'; + 1: Result := 'hypertile3D2_q'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationHypertile3D2.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'hypertile3D2_p' then begin + if Value < 3 then Value := 3; + hypertile3D2_p := Round(Value); + Result := True; + end else if Name = 'hypertile3D2_q' then begin + if Value < 3 then Value := 3; + hypertile3D2_q := Round(Value); + Result := True; + end; +end; + +function TVariationHypertile3D2.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'hypertile3D2_p' then begin + hypertile3D2_p := 3; + Result := True; + end else if Name = 'hypertile3D2_q' then begin + hypertile3D2_q := 7; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationHypertile3D2.GetNrVariables: integer; +begin + Result := 2; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationHypertile3D2.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'hypertile3D2_p' then begin + Value := hypertile3D2_p; + Result := True; + end else if Name = 'hypertile3D2_q' then begin + Value := hypertile3D2_q; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationHypertile3D2), true, false); +end. \ No newline at end of file diff --git a/Variations/varInversion3D.pas b/Variations/varInversion3D.pas new file mode 100644 index 0000000..1f45ce2 --- /dev/null +++ b/Variations/varInversion3D.pas @@ -0,0 +1,169 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit varInversion3D; + +interface + +uses + BaseVariation, XFormMan; + +const + sr = 'inversion3D_radius'; + sx0 = 'inversion3D_x0'; + sy0 = 'inversion3D_y0'; + sz0 = 'inversion3D_z0'; + +type + TVariationInversion3D = class(TBaseVariation) + private + r, r2, x0, y0, z0: double; + + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +{ TVariationInversion3D } + +////////////////////////////////////////// +procedure TVariationInversion3D.Prepare; +begin + r2 := sqr(r); +end; + +////////////////////////////////////////// +procedure TVariationInversion3D.CalcFunction; +var x, y, z, dist: double; +begin + x := FTx^ - x0; + y := FTy^ - y0; + z := FTz^ - z0; + + dist := sqr(x) + sqr(y) + sqr(z) + 1E-30; + + FPx^ := FPx^ + vvar * (r2 * x / dist + x0); + FPy^ := FPy^ + vvar * (r2 * y / dist + y0); + FPz^ := FPz^ + vvar * (r2 * z / dist + z0); +end; + +/////////////////////////////////////////////////////////////////////////////// + +constructor TVariationInversion3D.Create; +begin + r := 1; + x0 := 0; + y0 := 0; + z0 := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationInversion3D.GetInstance: TBaseVariation; +begin + Result := TVariationInversion3D.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationInversion3D.GetName: string; +begin + Result := 'inversion3D'; +end; + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +function TVariationInversion3D.GetVariableNameAt(const Index: integer): string; +begin + case Index of + 0: Result := sr; + 1: Result := sx0; + 2: Result := sy0; + 3: Result := sz0; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationInversion3D.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = sr then begin + if (Value < 1E-6) then Value := 1E-6; + r := value; + Result := True; + end else if Name = sx0 then begin + x0 := Value; + Result := True; + end else if Name = sy0 then begin + y0 := Value; + Result := True; + end else if Name = sz0 then begin + z0 := Value; + Result := True; + end; +end; + +function TVariationInversion3D.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = sr then begin + r := 1; + Result := True; + end else if Name = sx0 then begin + x0 := 0; + Result := True; + end else if Name = sy0 then begin + y0 := 0; + Result := True; + end else if Name = sz0 then begin + z0 := 0; + Result := True; + end; +end; + +///////////////////////////////////////////////////////////////////// + +function TVariationInversion3D.GetNrVariables: integer; +begin + Result := 4; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationInversion3D.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = sr then begin + Value := r; + Result := True; + end else if Name = sx0 then begin + Value := x0; + Result := True; + end else if Name = sy0 then begin + Value := y0; + Result := True; + end else if Name = sz0 then begin + Value := z0; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationInversion3D), true, false); +end. \ No newline at end of file diff --git a/Variations/varJulia.pas b/Variations/varJulia.pas new file mode 100644 index 0000000..7a4feda --- /dev/null +++ b/Variations/varJulia.pas @@ -0,0 +1,237 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit varJulia; + +interface +uses +{$ifdef Apo7X64} +{$else} +AsmRandom, +{$endif} + BaseVariation, XFormMan; + +{$ifdef Apo7X64} +{$else} + {$define _ASM_} +{$endif} + +type + TVariationJulia = class(TBaseVariation) + private + old: byte; + vvar2: double; + procedure CalcPlugin; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const IndJulia: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + + +implementation + +uses + Math; +//////////////////////// +procedure TVariationJulia.Prepare; +begin + vvar2 := vvar * sqrt(2) * 0.5; +end; + +procedure TVariationJulia.GetCalcFunction(var f: TCalcFunction); +begin + if old = 1 then f := CalcFunction + else f := CalcPlugin; +end; + +procedure TVariationJulia.CalcFunction; + {$ifndef _ASM_} +var + r: double; +begin +(* + // AV: oriiginal code was: + + FAngle := arctan2(FTx^, FTy^) / 2; + SinCos(FAngle + pi * random(2), sina, cosa); + r := vvar * sqrt(sqrt(sqrt(sqr(FTx^) + sqr(FTy^))); + FPx^ := FPx^ + r * cosa; + FPy^ := FPy^ + r * sina; + + // AV: I simplified calculations +*) + + r := sqrt(sqrt(sqr(FTx^) + sqr(FTy^)) + FTy^ ); + + if random(2) = 0 then begin + FPx^ := FPx^ + vvar2 * r; + FPy^ := FPy^ + vvar2 / r * FTx^; + end + else begin + FPx^ := FPx^ - vvar2 * r; + FPy^ := FPy^ - vvar2 / r * FTx^; + end; +{$else} + asm + mov edx, [eax + FTx] + fld qword ptr [edx] // FTx + fld qword ptr [edx + 8] // FTy + fld st(1) // FTx + fmul st,st // sqr(FTx) + fld st(1) // FTy + fmul st,st // sqr(FTy) + faddp + fsqrt + faddp + fsqrt + + fld qword ptr [eax + vvar2] + mov ecx,eax + mov eax,2 + call AsmRandInt + shr eax,1 + jc @skip + fchs +@skip: + + fmul st(2),st + fmul st,st(1) + + mov edx, [ecx + FPx] + fadd qword ptr [edx] + fstp qword ptr [edx] + fdivp st(1),st + fadd qword ptr [edx + 8] + fstp qword ptr [edx + 8] + fwait +{$endif} + end; + +procedure TVariationJulia.CalcPlugin; +{$ifndef _ASM_} +var + r: double; +begin + r := sqrt(sqrt(sqr(FTx^) + sqr(FTy^)) + FTx^ ); + + if random(2) = 0 then begin + FPx^ := FPx^ + vvar2 * r; + FPy^ := FPy^ + vvar2 / r * FTy^; + end + else begin + FPx^ := FPx^ - vvar2 * r; + FPy^ := FPy^ - vvar2 / r * FTy^; + end; +{$else} + asm + mov edx, [eax + FTx] + fld qword ptr [edx + 8] // FTy + fld qword ptr [edx] // FTx + fld st(1) + fmul st,st + fld st(1) + fmul st,st + faddp + fsqrt + faddp + fsqrt + + fld qword ptr [eax + vvar2] + mov ecx,eax + mov eax,2 + call AsmRandInt + shr eax,1 + jc @skip + fchs +@skip: + + fmul st(2),st + fmul st,st(1) + + mov edx, [ecx + FPx] + fadd qword ptr [edx] + fstp qword ptr [edx] + fdivp st(1),st + fadd qword ptr [edx + 8] + fstp qword ptr [edx + 8] + fwait +{$endif} +end; + +constructor TVariationJulia.Create; +begin + old := 1; +end; + +class function TVariationJulia.GetInstance: TBaseVariation; +begin + Result := TVariationJulia.Create; +end; + +class function TVariationJulia.GetName: string; +begin + Result := 'julia'; +end; + +function TVariationJulia.GetNrVariables: integer; +begin + Result := 1; +end; + +function TVariationJulia.GetVariable(const Name: string; + var value: double): boolean; +begin + Result := False; + if Name = 'julia_old' then begin + value := old; + Result := True; + end; +end; + +function TVariationJulia.GetVariableNameAt(const IndJulia: integer): string; +begin + case IndJulia of + 0: Result := 'julia_old'; + else + Result := ''; + end; +end; + +function TVariationJulia.SetVariable(const Name: string; + var value: double): boolean; +begin + Result := False; + if Name = 'julia_old' then begin + if Value < 0 then Value := 0; + if Value > 1 then Value := 1; + old := Round(value); + Result := True; + end; +end; + +function TVariationJulia.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'julia_old' then begin + old := 1; + Result := True; + end; +end; + +////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationJulia), false, false); + +end. diff --git a/Variations/varJulia3Djf.pas b/Variations/varJulia3Djf.pas new file mode 100644 index 0000000..289b18e --- /dev/null +++ b/Variations/varJulia3Djf.pas @@ -0,0 +1,462 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varJulia3Djf; // original variation code by Joel Faber, modified & optimized by Peter Sdobnov + +interface + +uses +{$ifdef Apo7X64} +{$else} +AsmRandom, +{$endif} + BaseVariation, XFormMan; + +const + var_name = 'julia3D'; + var_n_name='julia3D_power'; + +{$ifdef Apo7X64} +{$else} + {$define _ASM_} +{$endif} + +type + TVariationJulia3DJF = class(TBaseVariation) + private + N: integer; + + absN: integer; + cN: double; + + procedure CalcPower1; + procedure CalcPowerMinus1; + procedure CalcPower2; + procedure CalcPowerMinus2; + + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + +implementation + +uses + Math; + +// TVariationJulia3DJF + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationJulia3DJF.Create; +begin + N := random(5) + 2; + if random(2) = 0 then N := -N; +end; + +procedure TVariationJulia3DJF.Prepare; +begin + absN := abs(N); + cN := (1/N - 1) / 2; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationJulia3DJF.GetCalcFunction(var f: TCalcFunction); +begin + if N = 2 then f := CalcPower2 + else if N = -2 then f := CalcPowerMinus2 + else if N = 1 then f := CalcPower1 + else if N = -1 then f := CalcPowerMinus1 + else f := CalcFunction; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationJulia3DJF.CalcFunction; +{$ifndef _ASM_} +var + r, r2d, z, tmp: double; + sina, cosa: extended; +begin + z := FTz^ / absN; + r2d := sqr(FTx^) + sqr(FTy^); + r := vvar * Math.Power(r2d + sqr(z), cN); // r^n / sqrt(r) --> r^(n-0.5) + + FPz^ := FPz^ + r * z; + + tmp := r * sqrt(r2d); + sincos((arctan2(FTy^, FTx^) + 2*pi*random(absN)) / N, sina, cosa); + + FPx^ := FPx^ + tmp * cosa; + FPy^ := FPy^ + tmp * sina; +{$else} +asm + mov edx, [eax + FTx] + fld qword ptr [edx + 32] // FTz + fidiv dword ptr [eax + absN] + fld qword ptr [edx] // FTx + fld qword ptr [edx + 8] // FTy + fld st(1) + fmul st, st + fld st(1) + fmul st, st + faddp + fld qword ptr [eax + cN] + fld st(4) + fmul st, st + fadd st, st(2) +// --- x^y = 2^(y*log2(x)) + fyl2x + fld st + frndint + fsub st(1), st + fxch st(1) + f2xm1 + fld1 + fadd + fscale + fstp st(1) +// --- + fmul qword ptr [eax + vvar] + + fmul st(4), st + fxch st(1) + fsqrt + fmulp + + fxch st(2) + fpatan + mov ecx, eax + mov eax, dword ptr [eax + absN] + call AsmRandInt + push eax + fild dword ptr [esp] + add esp, 4 + fldpi + fadd st, st + fmulp + faddp + fidiv dword ptr [ecx + N] + + fsincos + mov edx, [ecx + FPx] + fmul st, st(2) + fadd qword ptr [edx] // FPx + fstp qword ptr [edx] + fmulp + fadd qword ptr [edx + 8] // FPy + fstp qword ptr [edx + 8] + fadd qword ptr [edx + $18] // FPz + fstp qword ptr [edx + $18] + fwait +{$endif} +end; + +procedure TVariationJulia3DJF.CalcPower2; +{$ifndef _ASM_} +var + r, r2d, z, tmp: double; + sina, cosa: extended; +begin + z := FTz^ / 2; + r2d := sqr(FTx^) + sqr(FTy^); + r := vvar / sqrt(sqrt(r2d + sqr(z))); // vvar * sqrt(r3d) / r3d --> vvar / sqrt(r3d) + + FPz^ := FPz^ + r * z; + + tmp := r * sqrt(r2d); + sincos(arctan2(FTy^, FTx^) / 2 + pi*random(2), sina, cosa); + + FPx^ := FPx^ + tmp * cosa; + FPy^ := FPy^ + tmp * sina; +{$else} +asm + mov edx, [eax + FTx] + fld qword ptr [edx + 32] // FTz + fld1 + fadd st, st + fdiv st(1), st + fld qword ptr [edx + 8] // FTy + fld qword ptr [edx] // FTx + fld st(1) + fld st(1) + fpatan + fdivrp st(3), st + + fmul st, st + fxch st(1) + fmul st, st + faddp + fld st(2) + fmul st, st + fadd st, st(1) + fsqrt + fsqrt + fdivr qword ptr [eax + vvar] + fmul st(3), st + + fxch st(1) + fsqrt + fmulp + fxch st(1) + + mov ecx, eax + mov eax, 2 + call AsmRandInt + fldpi + push eax + fimul dword ptr [esp] + add esp, 4 + faddp + + fsincos + mov edx, [ecx + FPx] + fmul st, st(2) + fadd qword ptr [edx] // FPx + fstp qword ptr [edx] + fmulp + fadd qword ptr [edx + 8] // FPy + fstp qword ptr [edx + 8] + fadd qword ptr [edx + $18] // FPz + fstp qword ptr [edx + $18] + fwait +{$endif} +end; + +procedure TVariationJulia3DJF.CalcPowerMinus2; +{$ifndef _ASM_} +var + r, r2d, r3d, z, tmp: double; + sina, cosa: extended; +begin + z := FTz^ / 2; + r2d := sqr(FTx^) + sqr(FTy^); + r3d := sqrt(r2d + sqr(z)); + r := vvar / (sqrt(r3d) * r3d); + + FPz^ := FPz^ + r * z; + + tmp := r * sqrt(r2d); + sincos(arctan2(FTy^, FTx^) / 2 + pi*random(2), sina, cosa); + + FPx^ := FPx^ + tmp * cosa; + FPy^ := FPy^ - tmp * sina; +{$else} +asm + mov edx, [eax + FTx] + fld qword ptr [edx + 32] // FTz + fld1 + fadd st, st + fdiv st(1), st + fld qword ptr [edx + 8] // FTy + fld qword ptr [edx] // FTx + fld st(1) + fld st(1) + fpatan + fdivrp st(3), st + + fmul st, st + fxch st(1) + fmul st, st + faddp + fld st(2) + fmul st, st + fadd st, st(1) + fsqrt + fld st + fsqrt + fmulp + fdivr qword ptr [eax + vvar] + fmul st(3), st + + fxch st(1) + fsqrt + fmulp + fxch st(1) + + mov ecx, eax + mov eax, 2 + call AsmRandInt + fldpi + push eax + fimul dword ptr [esp] + add esp, 4 + faddp + + fsincos + mov edx, [ecx + FPx] + fmul st, st(2) + fadd qword ptr [edx] // FPx + fstp qword ptr [edx] + fmulp + fsubr qword ptr [edx + 8] // FPy + fstp qword ptr [edx + 8] + fadd qword ptr [edx + $18] // FPz + fstp qword ptr [edx + $18] + fwait +{$endif} +end; + +procedure TVariationJulia3DJF.CalcPower1; +{$ifndef _ASM_} +begin + FPx^ := FPx^ + vvar * FTx^; + FPy^ := FPy^ + vvar * FTy^; + FPz^ := FPz^ + vvar * FTz^; +{$else} +asm + fld qword ptr [eax + vvar] + mov edx, [eax + FTx] + fld qword ptr [edx] // FTx + fmul st, st(1) + fadd qword ptr [edx + 16] // FPx + fstp qword ptr [edx + 16] + + fld qword ptr [edx + 8] // FTy + fmul st, st(1) + fadd qword ptr [edx + 24] // FPy + fstp qword ptr [edx + 24] + + fmul qword ptr [edx + 32] // FTz + fadd qword ptr [edx + 40] // FPz + fstp qword ptr [edx + 40] + + fwait +{$endif} +end; + +procedure TVariationJulia3DJF.CalcPowerMinus1; +{$ifndef _ASM_} +var + r: double; +begin + r := vvar / (sqr(FTx^) + sqr(FTy^) + sqr(FTz^)); + + FPx^ := FPx^ + r * FTx^; + FPy^ := FPy^ - r * FTy^; + FPz^ := FPz^ + r * FTz^; +{$else} +asm + mov edx, [eax + FTx] + fld qword ptr [edx + 32] // FTz + fld qword ptr [edx + 8] // FTy + fld qword ptr [edx] // FTx + fld st(2) + fmul st, st + fld st(2) + fmul st, st + faddp + fld st(1) + fmul st, st + faddp + fdivr qword ptr [eax + vvar] + + fmul st(3), st + fmul st(2), st + fmulp + fadd qword ptr [edx + 16] // FPx + fstp qword ptr [edx + 16] + fsubr qword ptr [edx + 24] // FPy + fstp qword ptr [edx + 24] + fadd qword ptr [edx + 40] // FPz + fstp qword ptr [edx + 40] + fwait +{$endif} +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationJulia3DJF.GetInstance: TBaseVariation; +begin + Result := TVariationJulia3DJF.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationJulia3DJF.GetName: string; +begin + Result := var_name; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationJulia3DJF.GetVariableNameAt(const Index: integer): string; +begin + case Index of + 0: Result := var_n_name; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationJulia3DJF.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = var_n_name then begin + N := Round(Value); + if N = 0 then N := 1; + Value := N; + Result := True; + end; +end; + +function TVariationJulia3DJF.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = var_n_name then begin + if N = 2 then N := -2 + else N := 2; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationJulia3DJF.GetNrVariables: integer; +begin + Result := 1; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationJulia3DJF.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = var_n_name then begin + Value := N; + Result := true; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationJulia3DJF), true, false); +end. + diff --git a/Variations/varJulia3Dz.pas b/Variations/varJulia3Dz.pas new file mode 100644 index 0000000..86bb865 --- /dev/null +++ b/Variations/varJulia3Dz.pas @@ -0,0 +1,445 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varJulia3Dz; + +interface + +uses +{$ifdef Apo7X64} +{$else} +AsmRandom, +{$endif} + BaseVariation, XFormMan; + +const + var_name = 'julia3Dz'; + var_n_name='julia3Dz_power'; + +{$ifdef Apo7X64} +{$else} + {$define _ASM_} +{$endif} + +type + TVariationJulia3D = class(TBaseVariation) + private + N: integer; + + absN: integer; + cN: double; + + procedure CalcPower1; + procedure CalcPowerMinus1; + procedure CalcPower2; + procedure CalcPowerMinus2; + + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + +implementation + +uses + Math; + +// TVariationJulia3D + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationJulia3D.Create; +begin + N := random(5) + 2; + if random(2) = 0 then N := -N; +end; + +procedure TVariationJulia3D.Prepare; +begin + absN := abs(N); + cN := 1 / N / 2; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationJulia3D.GetCalcFunction(var f: TCalcFunction); +begin + if N = 2 then f := CalcPower2 + else if N = -2 then f := CalcPowerMinus2 + else if N = 1 then f := CalcPower1 + else if N = -1 then f := CalcPowerMinus1 + else f := CalcFunction; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationJulia3D.CalcFunction; +{$ifndef _ASM_} +var + r, r2d: double; + sina, cosa: extended; +begin + r2d := sqr(FTx^) + sqr(FTy^); + r := vvar * Math.Power(r2d, cN); + + FPz^ := FPz^ + r * FTz^ / (sqrt(r2d) * absN); + + sincos((arctan2(FTy^, FTx^) + 2*pi*random(absN)) / N, sina, cosa); + FPx^ := FPx^ + r * cosa; + FPy^ := FPy^ + r * sina; +{$else} +asm + mov edx, [eax + FTx] + fld qword ptr [edx] // FTx + fld qword ptr [edx + 8] // FTy + fld st(1) + fmul st, st + fld st(1) + fmul st, st + faddp + fld qword ptr [eax + cN] + fld st(1) +// --- x^y = 2^(y*log2(x)) + fyl2x + fld st + frndint + fsub st(1), st + fxch st(1) + f2xm1 + fld1 + fadd + fscale + fstp st(1) +// --- + fmul qword ptr [eax + vvar] + + fxch st(1) + fsqrt + fimul dword ptr [eax + absN] + fdivr st, st(1) + fmul qword ptr [edx + 32] // FTz + fadd qword ptr [edx + 40] // FPz + fstp qword ptr [edx + 40] + + fxch st(2) + fpatan + mov ecx, eax + mov eax, dword ptr [eax + absN] + call AsmRandInt + push eax + fild dword ptr [esp] + add esp, 4 + fldpi + fadd st, st + fmulp + faddp + fidiv dword ptr [ecx + N] + + fsincos + fmul st, st(2) + + mov edx, [ecx + FPx] + fadd qword ptr [edx] // FPx + fstp qword ptr [edx] + fmulp + fadd qword ptr [edx + 8] // FPy + fstp qword ptr [edx + 8] + fwait +{$endif} +end; + +procedure TVariationJulia3D.CalcPower2; +{$ifndef _ASM_} +var + r, r2d: double; + sina, cosa: extended; +begin + r2d := sqrt(sqr(FTx^) + sqr(FTy^)); + r := vvar * sqrt(r2d); + + FPz^ := FPz^ + r * FTz^ / r2d / 2; + + sincos((arctan2(FTy^, FTx^)/2 + pi*random(2)), sina, cosa); + FPx^ := FPx^ + r * cosa; + FPy^ := FPy^ + r * sina; +{$else} +asm + mov edx, [eax + FTx] + fld qword ptr [edx + 8] // FTy + fld qword ptr [edx] // FTx + fld st(1) + fld st(1) + fpatan + fld1 + fadd st, st + fdivp st(1), st + mov ecx, eax + mov eax, 2 + call AsmRandInt + fldpi + push eax + fimul dword ptr [esp] + add esp, 4 + faddp + + fxch st(2) + fmul st, st + fxch st(1) + fmul st, st + faddp + fsqrt + + fld st + + fsqrt + fmul qword ptr [ecx + vvar] + + fxch st(1) + fadd st, st + fdivr st, st(1) + + mov edx, [ecx + FPx] + fmul qword ptr [edx + $10] // FTz + fadd qword ptr [edx + $18] // FPz + fstp qword ptr [edx + $18] + + fxch st(1) + + fsincos + + fmul st, st(2) + fadd qword ptr [edx] // FPx + fstp qword ptr [edx] + fmulp + fadd qword ptr [edx + 8] // FPy + fstp qword ptr [edx + 8] + fwait +{$endif} +end; + +procedure TVariationJulia3D.CalcPowerMinus2; +{$ifndef _ASM_} +var + r, r2d: double; + sina, cosa: extended; +begin + r2d := sqrt(sqr(FTx^) + sqr(FTy^)); + r := vvar / sqrt(r2d); + + FPz^ := FPz^ + r * FTz^ / r2d / 2; + + sincos(pi*random(2) - arctan2(FTy^, FTx^)/2, sina, cosa); + FPx^ := FPx^ + r * cosa; + FPy^ := FPy^ + r * sina; +{$else} +asm + mov edx, [eax + FTx] + fld qword ptr [edx + 8] // FTy + fld qword ptr [edx] // FTx + fld st(1) + fld st(1) + fpatan + fld1 + fadd st, st + fdivp st(1), st + mov ecx, eax + mov eax, 2 + call AsmRandInt + fldpi + push eax + fimul dword ptr [esp] + add esp, 4 + faddp + + fxch st(2) + fmul st, st + fxch st(1) + fmul st, st + faddp + fsqrt + + fld st + + fsqrt + fdivr qword ptr [ecx + vvar] + + fxch st(1) + fadd st, st + fdivr st, st(1) + mov edx, [ecx + FPx] + fmul qword ptr [edx + $10] // FTz + fadd qword ptr [edx + $18] + fstp qword ptr [edx + $18] + + fxch st(1) + fsincos + + fmul st, st(2) + mov edx, [ecx + FPx] + fadd qword ptr [edx] // FPx + fstp qword ptr [edx] + fmulp + fsubr qword ptr [edx + 8] // FPy + fstp qword ptr [edx + 8] + fwait +{$endif} +end; + +procedure TVariationJulia3D.CalcPower1; +{$ifndef _ASM_} +begin + FPx^ := FPx^ + vvar * FTx^; + FPy^ := FPy^ + vvar * FTy^; + FPz^ := FPz^ + vvar * FTz^; +{$else} +asm + fld qword ptr [eax + vvar] + mov edx, [eax + FTx] + fld qword ptr [edx] // FTx + fmul st, st(1) + fadd qword ptr [edx + 16] // FPx + fstp qword ptr [edx + 16] + + fld qword ptr [edx + 8] // FTy + fmul st, st(1) + fadd qword ptr [edx + 24] // FPy + fstp qword ptr [edx + 24] + + fmul qword ptr [edx + 32] // FTz + fadd qword ptr [edx + 40] // FPz + fstp qword ptr [edx + 40] + + fwait +{$endif} +end; + +procedure TVariationJulia3D.CalcPowerMinus1; +{$ifndef _ASM_} +var + r: double; +begin + r := vvar / (sqr(FTx^) + sqr(FTy^)); + + FPx^ := FPx^ + r * FTx^; + FPy^ := FPy^ - r * FTy^; + FPz^ := FPz^ + r * FTz^; +{$else} +asm + mov edx, [eax + FTx] + fld qword ptr [edx + 8] // FTy + fld qword ptr [edx] // FTx + fld st(1) + fmul st, st + fld st(1) + fmul st, st + faddp + fdivr qword ptr [eax + vvar] + + fmul st(2), st + fmul st(1), st + fmul qword ptr [edx + 32] // FTz + fadd qword ptr [edx + 40] // FPz + fstp qword ptr [edx + 40] + + fadd qword ptr [edx + 16] // FPx + fstp qword ptr [edx + 16] + fsubr qword ptr [edx + 24] // FPy + fstp qword ptr [edx + 24] + fwait +{$endif} +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationJulia3D.GetInstance: TBaseVariation; +begin + Result := TVariationJulia3D.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationJulia3D.GetName: string; +begin + Result := var_name; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationJulia3D.GetVariableNameAt(const Index: integer): string; +begin + case Index of + 0: Result := var_n_name; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationJulia3D.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = var_n_name then begin + N := Round(Value); + if N = 0 then N := 1; + Value := N; + Result := True; + end; +end; + +function TVariationJulia3D.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = var_n_name then begin + if N = 2 then N := -2 + else N := 2; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationJulia3D.GetNrVariables: integer; +begin + Result := 1; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationJulia3D.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = var_n_name then begin + Value := N; + Result := true; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationJulia3D), true, false); +end. diff --git a/Variations/varJuliaN.pas b/Variations/varJuliaN.pas new file mode 100644 index 0000000..7afa266 --- /dev/null +++ b/Variations/varJuliaN.pas @@ -0,0 +1,432 @@ +unit varJuliaN; + +interface + +uses +{$ifdef Apo7X64} +{$else} +AsmRandom, +{$endif} + BaseVariation, XFormMan; + +const + var_name = 'julian'; + var_n_name='julian_power'; + var_c_name='julian_dist'; + +{$ifdef Apo7X64} +{$else} + {$define _ASM_} +{$endif} + +type + TVariationJulian = class(TBaseVariation) + private + N: integer; + c: double; + + absN: integer; + cN, vvar2: double; + + procedure CalcPower1; + procedure CalcPowerMinus1; + procedure CalcPower2; + procedure CalcPowerMinus2; + + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + +implementation + +uses + Math; + +// TVariationJulian + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationJulian.Create; +begin + N := random(5) + 2; + c := 1.0; +end; + +procedure TVariationJulian.Prepare; +begin + absN := abs(N); + cN := c / N / 2; + + vvar2 := vvar * sqrt(2)/2; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationJulian.GetCalcFunction(var f: TCalcFunction); +begin + if c = 1 then begin + if N = 2 then f := CalcPower2 + else if N = -2 then f := CalcPowerMinus2 + else if N = 1 then f := CalcPower1 + else if N = -1 then f := CalcPowerMinus1 + else f := CalcFunction; + end + else f := CalcFunction; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationJulian.CalcFunction; +{$ifndef _ASM_} +var + r: double; + sina, cosa: extended; +begin + sincos((arctan2(FTy^, FTx^) + 2 * pi * random(absN)) / N, sina, cosa); + r := vvar * Math.Power(sqr(FTx^) + sqr(FTy^), cN); + + FPx^ := FPx^ + r * cosa; + FPy^ := FPy^ + r * sina; + FPz^ := FPz^ + vvar * FTz^; + {$else} +const + epsval: double = 1.0e-12; +asm + mov edx, [eax + FTx] + // AV: for Apo7X.15C compatibility + fld qword ptr [eax + vvar] + fmul qword ptr [edx + 32] // FTz + fadd qword ptr [edx + 40] // FPz + fstp qword ptr [edx + 40] + // main code + fld qword ptr [edx] // FTx + fld qword ptr [edx + 8] // FTy + fld qword ptr [eax + cN] + fld st(2) + fmul st, st + fld st(2) + fmul st, st + faddp + // x^y = 2^(y*log2(x)) + // Add small value to prevent divide-by-zero error + // in case x =(FTx^2+FTy^2) = 0 + fld epsval + faddp st(1), st + fyl2x + fld st + frndint + fsub st(1), st + fxch st(1) + f2xm1 + fld1 + fadd + fscale + fstp st(1) + + fmul qword ptr [eax + vvar] + + fxch st(2) + fpatan + mov ecx, eax + mov eax, dword ptr [eax + absN] + call AsmRandInt + push eax + fild dword ptr [esp] + add esp, 4 + fldpi + fadd st, st + fmulp + faddp + fidiv dword ptr [ecx + N] + fsincos + + fmul st, st(2) + mov edx, [ecx + FPx] + fadd qword ptr [edx] // FPx + fstp qword ptr [edx] + fmulp + fadd qword ptr [edx + 8] // FPy + fstp qword ptr [edx + 8] + fwait + {$endif} +end; + +procedure TVariationJulian.CalcPower2; +{$ifndef _ASM_} +var + d: double; +begin + d := sqrt( sqrt(sqr(FTx^) + sqr(FTy^)) + FTx^ ); + + if random(2) = 0 then begin + FPx^ := FPx^ + vvar2 * d; + FPy^ := FPy^ + vvar2 / d * FTy^; + end + else begin + FPx^ := FPx^ - vvar2 * d; + FPy^ := FPy^ - vvar2 / d * FTy^; + end; + FPz^ := FPz^ + vvar * FTz^; +{$else} + asm + mov edx, [eax + FTx] + // AV: for Apo7X.15C compatibility + fld qword ptr [eax + vvar] + fmul qword ptr [edx + 32] // FTz + fadd qword ptr [edx + 40] // FPz + fstp qword ptr [edx + 40] + // main code + fld qword ptr [edx + 8] // FTy + fld qword ptr [edx] // FTx + fld st(1) + fmul st,st + fld st(1) + fmul st,st + faddp + fsqrt + faddp + fsqrt + + fld qword ptr [eax + vvar2] + mov ecx,eax + mov eax,2 + call AsmRandInt + shr eax,1 + jc @skip + fchs +@skip: + + fmul st(2),st + fmul st,st(1) + + mov edx, [ecx + FPx] + fadd qword ptr [edx] + fstp qword ptr [edx] + fdivp st(1),st + fadd qword ptr [edx + 8] + fstp qword ptr [edx + 8] + fwait +{$endif} +end; + +procedure TVariationJulian.CalcPowerMinus2; +{$ifndef _ASM_} +var + r, xd: double; +begin + r := sqrt(sqr(FTx^) + sqr(FTy^)); + xd := r + FTx^; + + r := vvar / sqrt(r * (sqr(Fty^) + sqr(xd)) ); + + if random(2) = 0 then begin + FPx^ := FPx^ + r * xd; + FPy^ := FPy^ - r * FTy^; + end + else begin + FPx^ := FPx^ - r * xd; + FPy^ := FPy^ + r * FTy^; + end; + FPz^ := FPz^ + vvar * FTz^; +{$else} +asm + mov edx, [eax + FTx] + // AV: for Apo7X.15C compatibility + fld qword ptr [eax + vvar] + fmul qword ptr [edx + 32] // FTz + fadd qword ptr [edx + 40] // FPz + fstp qword ptr [edx + 40] + // main code + fld qword ptr [edx + 8] + fld qword ptr [edx] + fld st(1) + fmul st,st + fld st(1) + fmul st,st + faddp + fsqrt + fadd st(1),st + fld st(1) + fmul st,st + fld st(3) + fmul st,st + faddp + fmulp + fsqrt + + fdivr qword ptr [eax + vvar] + + mov ecx,eax + mov eax,2 + call AsmRandInt + shr eax,1 + jc @skip + fchs +@skip: + + fmul st(1),st + fmulp st(2),st + + mov edx, [ecx + FPx] + fsubr qword ptr [edx] + fstp qword ptr [edx] + fadd qword ptr [edx + 8] + fstp qword ptr [edx + 8] + fwait +{$endif} +end; + +procedure TVariationJulian.CalcPower1; + {$ifndef _ASM_} +begin + FPx^ := FPx^ + vvar * FTx^; + FPy^ := FPy^ + vvar * FTy^; + FPz^ := FPz^ + vvar * FTz^; + {$else} +asm + fld qword ptr [eax + vvar] + mov edx, [eax + FTx] + fld qword ptr [edx] // FTx + fmul st, st(1) + fadd qword ptr [edx + 16] // FPx + fstp qword ptr [edx + 16] + + fld qword ptr [edx + 8] // FTy + fmul st, st(1) + fadd qword ptr [edx + 24] // FPy + fstp qword ptr [edx + 24] + + fmul qword ptr [edx + 32] // FTz + fadd qword ptr [edx + 40] // FPz + fstp qword ptr [edx + 40] + fwait +{$endif} +end; + +procedure TVariationJulian.CalcPowerMinus1; +{$ifndef _ASM_} +var + r: double; +begin + r := vvar / (sqr(FTx^) + sqr(FTy^)); + + FPx^ := FPx^ + r * FTx^; + FPy^ := FPy^ - r * FTy^; + FPz^ := FPz^ + vvar * FTz^; +{$else} +asm + mov edx, [eax + FTx] + // AV: for Apo7X.15C compatibility + fld qword ptr [eax + vvar] + fmul qword ptr [edx + 32] // FTz + fadd qword ptr [edx + 40] // FPz + fstp qword ptr [edx + 40] + + // main code + fld qword ptr [edx + 8] // FTy + fld qword ptr [edx] // FTx + fld st(1) + fmul st, st + fld st(1) + fmul st, st + faddp + fdivr qword ptr [eax + vvar] + fmul st(2), st + fmulp + fadd qword ptr [edx + 16] // FPx + fstp qword ptr [edx + 16] + fsubr qword ptr [edx + 24] // FPy + fstp qword ptr [edx + 24] + fwait +{$endif} +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationJulian.GetInstance: TBaseVariation; +begin + Result := TVariationJulian.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationJulian.GetName: string; +begin + Result := var_name; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationJulian.GetVariableNameAt(const Index: integer): string; +begin + case Index of + 0: Result := var_n_name; + 1: Result := var_c_name; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationJulian.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = var_n_name then begin + N := Round(Value); + if N = 0 then N := 1; + Value := N; + Result := True; + end + else if Name = var_c_name then begin + c := value; + Result := True; + end; +end; + +function TVariationJulian.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = var_n_name then begin + if N = 2 then N := -2 + else N := 2; + Result := True; + end + else if Name = var_c_name then begin + c := 1; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationJulian.GetNrVariables: integer; +begin + Result := 2; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationJulian.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = var_n_name then begin + Value := N; + Result := true; + end + else if Name = var_c_name then begin + Value := c; + Result := true; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationJulian), true, false); +end. + diff --git a/Variations/varJuliaN3Dx.pas b/Variations/varJuliaN3Dx.pas new file mode 100644 index 0000000..db04da0 --- /dev/null +++ b/Variations/varJuliaN3Dx.pas @@ -0,0 +1,252 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varJuliaN3Dx; + +interface + +uses + BaseVariation, XFormMan; + +const + j3power = 'julian3Dx_power'; + j3dist = 'julian3Dx_dist'; + j3a = 'julian3Dx_a'; + j3b = 'julian3Dx_b'; + j3c = 'julian3Dx_c'; + j3d = 'julian3Dx_d'; + j3e = 'julian3Dx_e'; + j3f = 'julian3Dx_f'; + +type + TVariationJulian3Dx = class(TBaseVariation) + private + jdist, ja, jb, jc, jd, je, jf: double; + jpower, absN: integer; + cN, pi2: double; + + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +{ TVariationJulian3Dx } + +{ Based on standart Julia3D by Joel Faber, + with additional pre-affine parameters and JuliaN_dist variable } + +////////////////////////////////////////// +procedure TVariationJulian3Dx.Prepare; +var ca, sa: double; +begin + absN := abs(jpower); + cN := (jdist / jpower - 1.0) / 2.0; + pi2 := pi * 2; +end; + +////////////////////////////////////////// +procedure TVariationJulian3Dx.CalcFunction; +var x, y, z, r, r2, alpha, sina, cosa: double; +begin + x := ja * FTx^ + jb * FTy^ + je; + y := jc * FTx^ + jd * FTy^ + jf; + z := FTz^ / absN; + + r2 := sqr(x) + sqr(y); // AV: replaced FTx^ * FTx^ + FTy^ * FTy^; + r := vvar * Math.power(r2 + z * z, cN); + FPz^ := FPz^ + r * z; + + alpha := (arctan2(y, x) + pi2 * random(absN))/ jpower; + SinCos(alpha, sina, cosa); + r := r * sqrt(r2); + FPx^ := FPx^ + r * cosa; + FPy^ := FPy^ + r * sina; +end; + +/////////////////////////////////////////////////////////////////////////////// + +constructor TVariationJulian3Dx.Create; +begin + jpower := 2 + random(5); + jdist := 1; + ja := 1; + jb := 0; + jc := 0; + jd := 1; + je := 0; + jf := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationJulian3Dx.GetInstance: TBaseVariation; +begin + Result := TVariationJulian3Dx.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationJulian3Dx.GetName: string; +begin + Result := 'julian3Dx'; +end; + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +function TVariationJulian3Dx.GetVariableNameAt(const Index: integer): string; +begin + case Index of + 0: Result := j3power; + 1: Result := j3dist; + 2: Result := j3a; + 3: Result := j3b; + 4: Result := j3c; + 5: Result := j3d; + 6: Result := j3e; + 7: Result := j3f; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationJulian3Dx.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = j3power then begin + jpower := Round(Value); + if jpower = 0 then jpower := 1; + Value := jpower; + Result := True; + end else if Name = j3dist then begin + jdist := value; + Result := True; + end else if Name = j3a then begin + ja := Value; + Result := True; + end else if Name = j3b then begin + jb := Value; + Result := True; + end else if Name = j3c then begin + jc := Value; + Result := True; + end else if Name = j3d then begin + jd := Value; + Result := True; + end else if Name = j3e then begin + je := Value; + Result := True; + end else if Name = j3f then begin + jf := Value; + Result := True; + end; +end; + +function TVariationJulian3Dx.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = j3power then begin + jpower := 2; + Result := True; + end else if Name = j3dist then begin + jdist := 1; + Result := True; + end else if Name = j3a then begin + ja := 1; + Result := True; + end else if Name = j3b then begin + jb := 0; + Result := True; + end else if Name = j3c then begin + jc := 0; + Result := True; + end else if Name = j3d then begin + jd := 1; + Result := True; + end else if Name = j3e then begin + je := 0; + Result := True; + end else if Name = j3f then begin + jf := 0; + Result := True; + end; +end; + +///////////////////////////////////////////////////////////////////// + +function TVariationJulian3Dx.GetNrVariables: integer; +begin + Result := 8; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationJulian3Dx.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = j3power then begin + Value := jpower; + Result := True; + end else if Name = j3dist then begin + Value := jdist; + Result := True; + end else if Name = j3a then begin + Value := ja; + Result := True; + end else if Name = j3b then begin + Value := jb; + Result := True; + end else if Name = j3c then begin + Value := jc; + Result := True; + end else if Name = j3d then begin + Value := jd; + Result := True; + end else if Name = j3e then begin + Value := je; + Result := True; + end else if Name = j3f then begin + Value := jf; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationJulian3Dx), true, false); +end. \ No newline at end of file diff --git a/Variations/varJuliaScope.pas b/Variations/varJuliaScope.pas new file mode 100644 index 0000000..0238c8c --- /dev/null +++ b/Variations/varJuliaScope.pas @@ -0,0 +1,472 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varJuliaScope; + +interface + +uses +{$ifdef Apo7X64} +{$else} +AsmRandom, +{$endif} + BaseVariation, XFormMan; + +const + variation_name='juliascope'; + var_n_name='juliascope_power'; + var_c_name='juliascope_dist'; + +{$ifdef Apo7X64} +{$else} + {$define _ASM_} +{$endif} + +type + TVariationJuliaScope = class(TBaseVariation) + private + N: integer; + c: double; + + rN: integer; + cn: double; + + procedure CalcPower1; + procedure CalcPowerMinus1; + procedure CalcPower2; + procedure CalcPowerMinus2; + + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + +implementation + +uses + math; + +// TVariationJuliaScope + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationJuliaScope.Create; +begin + N := random(5) + 2; + c := 1.0; +end; + +procedure TVariationJuliaScope.Prepare; +begin + rN := abs(N); + cn := c / N / 2; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationJuliaScope.GetCalcFunction(var f: TCalcFunction); +begin + if c = 1 then begin + if N = 2 then f := CalcPower2 + else if N = -2 then f := CalcPowerMinus2 + else if N = 1 then f := CalcPower1 + else if N = -1 then f := CalcPowerMinus1 + else f := CalcFunction; + end + else f := CalcFunction; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationJuliaScope.CalcFunction; +{$ifndef _ASM_} +var + rnd: integer; + r: double; + sina, cosa: extended; +begin + rnd := random(rN); + if (rnd and 1) = 0 then + sincos( (2*pi*rnd + arctan2(FTy^, FTx^)) / N, sina, cosa) + else + sincos( (2*pi*rnd - arctan2(FTy^, FTx^)) / N, sina, cosa); + r := vvar * Math.Power(sqr(FTx^) + sqr(FTy^), cn); + FPx^ := FPx^ + r * cosa; + FPy^ := FPy^ + r * sina; + FPz^ := FPz^ + vvar * FTz^; +{$else} +asm + mov edx, [eax + FTy] + fld qword ptr [edx] + fld qword ptr [eax + cn] + mov edx, [eax + FTx] + + // AV: for Apo7X.15C compatibility + fld qword ptr [eax + vvar] + fmul qword ptr [edx + 32] // FTz + fadd qword ptr [edx + 40] // FPz + fstp qword ptr [edx + 40] + + // main code + fld qword ptr [edx] + fld st(2) + fld st(1) + fpatan + mov ecx, eax + mov eax, dword ptr [eax + rN] + call AsmRandInt + push eax + + shr eax, 1 + jnc @even + fchs +@even: + + fldpi + fadd st, st + fimul dword ptr [esp] + add esp, 4 + faddp + fidiv dword ptr [ecx + N] + + fxch st(3) + fmul st, st + fxch st(1) + fmul st, st + faddp +// --- x^y = 2^(y*log2(x)) + fyl2x + fld st + frndint + fsub st(1), st + fxch st(1) + f2xm1 + fld1 + fadd + fscale + fstp st(1) + + fmul qword ptr [ecx + vvar] + fxch st(1) + fsincos + fmul st, st(2) + + mov edx, [ecx + FPx] + fadd qword ptr [edx] + fstp qword ptr [edx] + fmulp + mov edx, [ecx + FPy] + fadd qword ptr [edx] + fstp qword ptr [edx] + fwait +{$endif} +end; + +procedure TVariationJuliaScope.CalcPower2; + {$ifndef _ASM_} +var + r: double; + sina, cosa: extended; +begin + if random(2) = 0 then + sincos(arctan2(FTy^, FTx^)/2, sina, cosa) + else + sincos(pi - arctan2(FTy^, FTx^)/2, sina, cosa); + + r := vvar * sqrt(sqrt(sqr(FTx^) + sqr(FTy^))); + + FPx^ := FPx^ + r * cosa; + FPy^ := FPy^ + r * sina; + FPz^ := FPz^ + vvar * FTz^; + {$else} +asm + mov edx, [eax + FTy] + fld qword ptr [edx] + mov edx, [eax + FTx] + + // AV: for Apo7X.15C compatibility + fld qword ptr [eax + vvar] + fmul qword ptr [edx + 32] // FTz + fadd qword ptr [edx + 40] // FPz + fstp qword ptr [edx + 40] + + // main code + fld qword ptr [edx] + fld st(1) + fld st(1) + fpatan + fld1 + fadd st, st + fdivp st(1), st + mov ecx, eax + call AsmRandInt + + shr eax, 1 + jnc @skip + fldpi + fsubrp st(1), st +@skip: + fxch st(2) + fmul st, st + fxch st(1) + fmul st, st + faddp + fsqrt + fsqrt + fmul qword ptr [ecx + vvar] + fxch st(1) + + fsincos + + fmul st, st(2) + mov edx, [ecx + FPx] + fadd qword ptr [edx] + fstp qword ptr [edx] + fmulp + mov edx, [ecx + FPy] + fadd qword ptr [edx] + fstp qword ptr [edx] + fwait +{$endif} +end; + +procedure TVariationJuliaScope.CalcPowerMinus2; +{$ifndef _ASM_} +var + r: double; + sina, cosa: extended; +begin + if random(2) = 0 then + sincos(arctan2(FTy^, FTx^)/2, sina, cosa) + else + sincos(pi - arctan2(FTy^, FTx^)/2, sina, cosa); + r := vvar / sqrt(sqrt(sqr(FTx^) + sqr(FTy^))); + + FPx^ := FPx^ + r * cosa; + FPy^ := FPy^ - r * sina; + FPz^ := FPz^ + vvar * FTz^; +{$else} +asm + mov edx, [eax + FTy] + fld qword ptr [edx] + mov edx, [eax + FTx] + + // AV: for Apo7X.15C compatibility + fld qword ptr [eax + vvar] + fmul qword ptr [edx + 32] // FTz + fadd qword ptr [edx + 40] // FPz + fstp qword ptr [edx + 40] + + // main code + fld qword ptr [edx] + fld st(1) + fld st(1) + fpatan + fld1 + fadd st, st + fdivp st(1), st + mov ecx, eax + mov eax, 2 + call AsmRandInt + + shr eax, 1 + jnc @skip + fldpi + fsubrp st(1), st +@skip: + fxch st(2) + fmul st, st + fxch st(1) + fmul st, st + faddp + fsqrt + fsqrt + fdivr qword ptr [ecx + vvar] + fxch st(1) + + fsincos + + fmul st, st(2) + mov edx, [ecx + FPx] + fadd qword ptr [edx] + fstp qword ptr [edx] + fmulp + mov edx, [ecx + FPy] + fsubr qword ptr [edx] + fstp qword ptr [edx] + fwait +{$endif} +end; + +procedure TVariationJuliaScope.CalcPower1; + {$ifndef _ASM_} +begin + FPx^ := FPx^ + vvar * FTx^; + FPy^ := FPy^ + vvar * FTy^; + FPz^ := FPz^ + vvar * FTz^; + {$else} +asm + fld qword ptr [eax + vvar] + mov edx, [eax + FTx] + fld qword ptr [edx] // FTx + fmul st, st(1) + fadd qword ptr [edx + 16] // FPx + fstp qword ptr [edx + 16] + + fld qword ptr [edx + 8] // FTy + fmul st, st(1) + fadd qword ptr [edx + 24] // FPy + fstp qword ptr [edx + 24] + + fmul qword ptr [edx + 32] // FTz + fadd qword ptr [edx + 40] // FPz + fstp qword ptr [edx + 40] + fwait +{$endif} +end; + +procedure TVariationJuliaScope.CalcPowerMinus1; + {$ifndef _ASM_} +var + r: double; +begin + r := vvar / (sqr(FTx^) + sqr(FTy^)); + + FPx^ := FPx^ + r * FTx^; + FPy^ := FPy^ - r * FTy^; + FPz^ := FPz^ + vvar * FTz^; +{$else} +asm + mov edx, [eax + FTx] + // AV: for Apo7X.15C compatibility + fld qword ptr [eax + vvar] + fmul qword ptr [edx + 32] // FTz + fadd qword ptr [edx + 40] // FPz + fstp qword ptr [edx + 40] + + // main code + fld qword ptr [edx + 8] // FTy + fld qword ptr [edx] // FTx + fld st(1) + fmul st, st + fld st(1) + fmul st, st + faddp + fdivr qword ptr [eax + vvar] + fmul st(2), st + fmulp + fadd qword ptr [edx + 16] // FPx + fstp qword ptr [edx + 16] + fsubr qword ptr [edx + 24] // FPy + fstp qword ptr [edx + 24] + fwait +{$endif} +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationJuliaScope.GetInstance: TBaseVariation; +begin + Result := TVariationJuliaScope.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationJuliaScope.GetName: string; +begin + Result := variation_name; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationJuliaScope.GetVariableNameAt(const Index: integer): string; +begin + case Index of + 0: Result := var_n_name; + 1: Result := var_c_name; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationJuliaScope.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = var_n_name then begin + N := Round(Value); + if N = 0 then N := 1; + Value := N; + Result := True; + end + else if Name = var_c_name then begin + c := value; + Result := True; + end; +end; + +function TVariationJuliaScope.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = var_n_name then begin + if N = 2 then N := -2 + else N := 2; + Result := True; + end + else if Name = var_c_name then begin + c := 1; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationJuliaScope.GetNrVariables: integer; +begin + Result := 2; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationJuliaScope.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = var_n_name then begin + Value := N; + Result := true; + end + else if Name = var_c_name then begin + Value := c; + Result := true; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationJuliaScope), true, false); +end. diff --git a/Variations/varJulian2DC.pas b/Variations/varJulian2DC.pas new file mode 100644 index 0000000..f6ea368 --- /dev/null +++ b/Variations/varJulian2DC.pas @@ -0,0 +1,269 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varJulian2DC; + +interface + +uses + BaseVariation, XFormMan; + +const + j2power = 'julian2dc_power'; + j2dist = 'julian2dc_dist'; + j2col = 'julian2dc_col'; + j2a = 'julian2dc_a'; + j2b = 'julian2dc_b'; + j2c = 'julian2dc_c'; + j2d = 'julian2dc_d'; + j2e = 'julian2dc_e'; + j2f = 'julian2dc_f'; + + jeps: double = 1E-5; + +type + TVariationJulian2DC = class(TBaseVariation) + private + jdist, jcol, jpower, ja, jb, jc, jd, je, jf: double; + cN, pi2, jps, absN, den: double; + psn: smallint; + + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +{ TVariationJulian2DC } + +////////////////////////////////////////// +procedure TVariationJulian2DC.Prepare; +begin + absN := abs(jpower); + if (jpower > 0) then psn := 1 else psn := -1; + den := jpower + psn * jeps; + if (absN < 1) then + jps := 1 / den + else jps := jpower; + cN := jdist / jps / 2; + pi2 := pi * 2; +end; + +////////////////////////////////////////// +procedure TVariationJulian2DC.CalcFunction; +var + x, y, r, angle, sina, cosa: double; + ra: integer; +begin + x := ja * FTx^ + jb * FTy^ + je; + y := jc * FTx^ + jd * FTy^ + jf; + + ra := Trunc(random * (absN - jeps)); + angle := (arctan2(y, x) + pi2 * ra)/ den; + r := vvar * Math.power(sqr(x) + sqr(y), cN); + + SinCos(angle, sina, cosa); + FPx^ := FPx^ + r * cosa; + FPy^ := FPy^ + r * sina; + color^ := fmod(abs(r * jcol + (angle / pi2) * (1 - jcol)), 1.0); +end; + +/////////////////////////////////////////////////////////////////////////////// + +constructor TVariationJulian2DC.Create; +var beta, sinb, cosb: double; +begin + beta := pi / RandomRange(1, 6); + SinCos(beta, sinb, cosb); + jpower := 2 + random(5); + jdist := 1; + jcol := random; + ja := cosb; + jb := sinb; + jc := -sinb; + jd := cosb; + je := 2 * random - 1; + jf := 2 * random - 1; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationJulian2DC.GetInstance: TBaseVariation; +begin + Result := TVariationJulian2DC.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationJulian2DC.GetName: string; +begin + Result := 'julian2dc'; +end; + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +function TVariationJulian2DC.GetVariableNameAt(const Index: integer): string; +begin + case Index of + 0: Result := j2power; + 1: Result := j2dist; + 2: Result := j2col; + 3: Result := j2a; + 4: Result := j2b; + 5: Result := j2c; + 6: Result := j2d; + 7: Result := j2e; + 8: Result := j2f; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationJulian2DC.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = j2power then begin + if abs(Value) < jeps then Value := jeps; + jpower := Value; + Result := True; + end else if Name = j2dist then begin + jdist := value; + Result := True; + end else if Name = j2col then begin + jcol := Value; + Result := True; + end else if Name = j2a then begin + ja := Value; + Result := True; + end else if Name = j2b then begin + jb := Value; + Result := True; + end else if Name = j2c then begin + jc := Value; + Result := True; + end else if Name = j2d then begin + jd := Value; + Result := True; + end else if Name = j2e then begin + je := Value; + Result := True; + end else if Name = j2f then begin + jf := Value; + Result := True; + end; +end; + +function TVariationJulian2DC.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = j2power then begin + jpower := 2; + Result := True; + end else if Name = j2dist then begin + jdist := 1; + Result := True; + end else if Name = j2col then begin + jcol := 0; + Result := True; + end else if Name = j2a then begin + ja := 1; + Result := True; + end else if Name = j2b then begin + jb := 0; + Result := True; + end else if Name = j2c then begin + jc := 0; + Result := True; + end else if Name = j2d then begin + jd := 1; + Result := True; + end else if Name = j2e then begin + je := 0; + Result := True; + end else if Name = j2f then begin + jf := 0; + Result := True; + end; +end; + +///////////////////////////////////////////////////////////////////// + +function TVariationJulian2DC.GetNrVariables: integer; +begin + Result := 9; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationJulian2DC.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = j2power then begin + Value := jpower; + Result := True; + end else if Name = j2dist then begin + Value := jdist; + Result := True; + end else if Name = j2col then begin + Value := jcol; + Result := True; + end else if Name = j2a then begin + Value := ja; + Result := True; + end else if Name = j2b then begin + Value := jb; + Result := True; + end else if Name = j2c then begin + Value := jc; + Result := True; + end else if Name = j2d then begin + Value := jd; + Result := True; + end else if Name = j2e then begin + Value := je; + Result := True; + end else if Name = j2f then begin + Value := jf; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationJulian2DC), false, true); +end. diff --git a/Variations/varLazysusan.pas b/Variations/varLazysusan.pas new file mode 100644 index 0000000..a02a634 --- /dev/null +++ b/Variations/varLazysusan.pas @@ -0,0 +1,195 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + You should have received a copy of the GNU General Public License + GNU General Public License for more details. + + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varLazysusan; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationLazysusan = class(TBaseVariation) + private + lazysusan_spin, lazysusan_space, lazysusan_twist : double; + lazysusan_x, lazysusan_y : double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationLazysusan.Prepare; +begin +end; +procedure TVariationLazysusan.CalcFunction; +var + a, r, sina, cosa, x, y: double; +begin + x := FTx^ - lazysusan_x; + y := FTy^ + lazysusan_y; + r := sqrt(x*x + y*y); + + if (r < VVAR) then + begin + a := ArcTan2(y, x) + lazysusan_spin + lazysusan_twist*(VVAR-r); + sincos(a, sina, cosa); + FPx^ := FPx^ + VVAR * (r*cosa + lazysusan_x); + FPy^ := FPy^ + VVAR * (r*sina - lazysusan_y); + end else begin + r := 1.0 + lazysusan_space / (r + 1E-6); + FPx^ := FPx^ + VVAR * (r*x + lazysusan_x); + FPy^ := FPy^ + VVAR * (r*y - lazysusan_y); + end; + + FPz^ := FPz^ + VVAR * FTz^; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationLazysusan.Create; +begin + lazysusan_spin := PI; + lazysusan_space := 0; + lazysusan_twist := 0; + lazysusan_x := 0; + lazysusan_y := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationLazysusan.GetInstance: TBaseVariation; +begin + Result := TVariationLazysusan.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationLazysusan.GetName: string; +begin + Result := 'lazysusan'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationLazysusan.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'lazysusan_spin'; + 1: Result := 'lazysusan_space'; + 2: Result := 'lazysusan_twist'; + 3: Result := 'lazysusan_x'; + 4: Result := 'lazysusan_y'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationLazysusan.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'lazysusan_spin' then begin + Value := frac(value / (2 * PI)) * (2 * PI); + lazysusan_spin := value; + Result := True; + end else if Name = 'lazysusan_space' then begin + lazysusan_space := Value; + Result := True; + end else if Name = 'lazysusan_twist' then begin + lazysusan_twist := Value; + Result := True; + end else if Name = 'lazysusan_x' then begin + lazysusan_x := Value; + Result := True; + end else if Name = 'lazysusan_y' then begin + lazysusan_y := Value; + Result := True; + end; +end; +function TVariationLazysusan.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'lazysusan_spin' then begin + lazysusan_spin := PI; + Result := True; + end else if Name = 'lazysusan_space' then begin + lazysusan_space := 0; + Result := True; + end else if Name = 'lazysusan_twist' then begin + lazysusan_twist := 0; + Result := True; + end else if Name = 'lazysusan_x' then begin + lazysusan_x := 0; + Result := True; + end else if Name = 'lazysusan_y' then begin + lazysusan_x := 0; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationLazysusan.GetNrVariables: integer; +begin + Result := 5 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationLazysusan.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'lazysusan_spin' then begin + Value := lazysusan_spin; + Result := True; + end else if Name = 'lazysusan_space' then begin + Value := lazysusan_space; + Result := True; + end else if Name = 'lazysusan_twist' then begin + Value := lazysusan_twist; + Result := True; + end else if Name = 'lazysusan_x' then begin + Value := lazysusan_x; + Result := True; + end else if Name = 'lazysusan_y' then begin + Value := lazysusan_y; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationLazysusan), true, false); +end. diff --git a/Variations/varLog.pas b/Variations/varLog.pas new file mode 100644 index 0000000..1846e55 --- /dev/null +++ b/Variations/varLog.pas @@ -0,0 +1,143 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varLog; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationLog = class(TBaseVariation) + private + base, denom: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +{ TVariationLog } + + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationLog.Prepare; +begin + denom := 0.5 / Ln(base); +end; + +procedure TVariationLog.CalcFunction; +begin + FPx^ := FPx^ + vvar * Ln(sqr(FTx^) + sqr(FTy^)) * denom; + FPy^ := FPy^ + vvar * ArcTan2(FTy^, FTx^); + FPz^ := FPz^ + vvar * FTz^; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationLog.Create; +begin + base := 2.71828182845905; // AV: Euler number +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationLog.GetInstance: TBaseVariation; +begin + Result := TVariationLog.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationLog.GetName: string; +begin + Result := 'log'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationLog.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'log_base'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationLog.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'log_base' then begin + base := Value; + if (base < 1E-6) then // AV: log_base > 0 + base := 1E-6; + if (RoundTo(base, -6) = 1) then // AV: log_base <> 1 + base := 1.000001; + Result := True; + end; +end; +function TVariationLog.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'log_base' then begin + base := 2.71828182845905; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationLog.GetNrVariables: integer; +begin + Result := 1 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationLog.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'log_base' then begin + Value := base; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationLog), true, false); +end. diff --git a/Variations/varLoonie.pas b/Variations/varLoonie.pas new file mode 100644 index 0000000..f99bdb5 --- /dev/null +++ b/Variations/varLoonie.pas @@ -0,0 +1,170 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varLoonie; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationLoonie = class(TBaseVariation) + private + sqrvar: double; + use3D: byte; + procedure Calc3D; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + + procedure Prepare; override; + procedure GetCalcFunction(var f: TCalcFunction); override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationLoonie.Prepare; +begin + sqrvar := VVAR * VVAR; +end; + +procedure TVariationLoonie.GetCalcFunction(var f: TCalcFunction); +begin + if use3D <> 0 then + f := Calc3D + else f := CalcFunction; +end; + +/////////////////////////////////////////// +procedure TVariationLoonie.CalcFunction; +var r, r2 : double; +begin + r2 := sqr(FTx^) + sqr(FTy^); + + if (r2 < (sqrvar)) and (r2 <> 0) then + begin + r := VVAR * sqrt((sqrvar) / r2 - 1.0); + FPx^ := FPx^ + r * FTx^; + FPy^ := FPy^ + r * FTy^; + end else begin + FPx^ := FPx^ + VVAR * FTx^; + FPy^ := FPy^ + VVAR * FTy^; + end; + + FPz^ := FPz^ + vvar * FTz^; +end; + +procedure TVariationLoonie.Calc3D; +var r, r2 : double; +begin + r2 := sqr(FTx^) + sqr(FTy^) + sqr(FTz^); + + if (r2 < (sqrvar)) and (r2 <> 0) then + begin + r := VVAR * sqrt((sqrvar) / r2 - 1.0); + FPx^ := FPx^ + r * FTx^; + FPy^ := FPy^ + r * FTy^; + FPz^ := FPz^ + r * FTz^; + end else begin + FPx^ := FPx^ + VVAR * FTx^; + FPy^ := FPy^ + VVAR * FTy^; + FPz^ := FPz^ + vvar * FTz^; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationLoonie.Create; +begin + sqrvar := 0; + use3D := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationLoonie.GetInstance: TBaseVariation; +begin + Result := TVariationLoonie.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationLoonie.GetName: string; +begin + Result := 'loonie'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationLoonie.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'loonie_use3D'; + else + Result := ''; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationLoonie.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'loonie_use3D' then begin + if Value < 0 then Value := 0; + if Value > 1 then Value := 1; + use3D := Round(Value); + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationLoonie.GetNrVariables: integer; +begin + Result := 1; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationLoonie.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'loonie_use3D' then begin + Value := use3D; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationLoonie), true, false); +end. \ No newline at end of file diff --git a/Variations/varMobius.pas b/Variations/varMobius.pas new file mode 100644 index 0000000..497f79f --- /dev/null +++ b/Variations/varMobius.pas @@ -0,0 +1,256 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varMobius; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationMobius = class(TBaseVariation) + private + Re_A, Im_A, Re_B, Im_B, Re_C, Im_C, Re_D, Im_D: double; + mobius_invert : byte; + procedure CalcInvert; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure CalcFunction; override; + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationMobius.GetCalcFunction(var f: TCalcFunction); +begin // AV: this helps to increase the calc speed + if (mobius_invert <> 0) then + f := CalcInvert + else f := CalcFunction; +end; + +procedure TVariationMobius.CalcFunction; +const EPS = 1E-100; +var + uRe, uIm, vRe, vIm, vDenom : double; +begin + uRe := (Re_A) * FTX^ - (Im_A) * FTY^ + (Re_B); + uIm := (Re_A) * FTY^ + (Im_A) * FTX^ + (Im_B); + vRe := (Re_C) * FTX^ - (Im_C) * FTY^ + (Re_D); + vIm := (Re_C) * FTY^ + (Im_C) * FTX^ + (Im_D); + + vDenom := vRe * vRe + vIm * vIm; + if abs(vDenom) < EPS then vDenom := EPS; + + FPx^ := FPx^ + VVAR * (uRe*vRe + uIm*vIm) / vDenom; + FPy^ := FPy^ + VVAR * (uIm*vRe - uRe*vIm) / vDenom; + FPz^ := FPz^ + VVAR * FTz^; // for Apo7x.15C compatibility only +end; + +procedure TVariationMobius.CalcInvert; // inverse Mobius transformation +const EPS = 1E-100; +var + uRe, uIm, vRe, vIm, vDenom : double; +begin + uRe := (Re_D) * FTX^ - (Im_D) * FTY^ - (Re_B); + uIm := (Re_D) * FTY^ + (Im_D) * FTX^ - (Im_B); + vRe := -(Re_C) * FTX^ + (Im_C) * FTY^ + (Re_A); + vIm := -(Re_C) * FTY^ - (Im_C) * FTX^ + (Im_A); + + vDenom := vRe * vRe + vIm * vIm; + if abs(vDenom) < EPS then vDenom := EPS; + + FPx^ := FPx^ + VVAR * (uRe*vRe + uIm*vIm) / vDenom; + FPy^ := FPy^ + VVAR * (uIm*vRe - uRe*vIm) / vDenom; + FPz^ := FPz^ + VVAR * FTz^; +end; + + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationMobius.Create; +begin + Re_A := 1; Im_A := 0; + Re_B := 0; Im_B := 0; + Re_C := 0; Im_C := 0; + Re_D := 1; Im_D := 0; + mobius_invert := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationMobius.GetInstance: TBaseVariation; +begin + Result := TVariationMobius.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationMobius.GetName: string; +begin + Result := 'mobius'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationMobius.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'Re_A'; + 1: Result := 'Im_A'; + 2: Result := 'Re_B'; + 3: Result := 'Im_B'; + 4: Result := 'Re_C'; + 5: Result := 'Im_C'; + 6: Result := 'Re_D'; + 7: Result := 'Im_D'; + 8: Result := 'mobius_invert'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationMobius.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'Re_A' then begin + Re_A := Value; + Result := True; + end else if Name = 'Im_A' then begin + Im_A := Value; + Result := True; + end else if Name = 'Re_B' then begin + Re_B := Value; + Result := True; + end else if Name = 'Im_B' then begin + Im_B := Value; + Result := True; + end else if Name = 'Re_C' then begin + Re_C := Value; + Result := True; + end else if Name = 'Im_C' then begin + Im_C := Value; + Result := True; + end else if Name = 'Re_D' then begin + Re_D := Value; + Result := True; + end else if Name = 'Im_D' then begin + Im_D := Value; + Result := True; + end else if Name = 'mobius_invert' then begin + if (Value > 1) then Value := 1; + if (Value < 0) then Value := 0; + mobius_invert := Round(Value); + Result := True; + end +end; +function TVariationMobius.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'Re_A' then begin + Re_A := 1; + Result := True; + end else if Name = 'Im_A' then begin + Im_A := 0; + Result := True; + end else if Name = 'Re_B' then begin + Re_B := 0; + Result := True; + end else if Name = 'Im_B' then begin + Im_B := 0; + Result := True; + end else if Name = 'Re_C' then begin + Re_C := 0; + Result := True; + end else if Name = 'Im_C' then begin + Im_C := 0; + Result := True; + end else if Name = 'Re_D' then begin + Re_D := 1; + Result := True; + end else if Name = 'Im_D' then begin + Im_D := 0; + Result := True; + end else if Name = 'mobius_invert' then begin + mobius_invert := 0; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationMobius.GetNrVariables: integer; +begin + Result := 9 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationMobius.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'Re_A' then begin + Value := Re_A; + Result := True; + end else if Name = 'Im_A' then begin + Value := Im_A; + Result := True; + end else if Name = 'Re_B' then begin + Value := Re_B; + Result := True; + end else if Name = 'Im_B' then begin + Value := Im_B; + Result := True; + end else if Name = 'Re_C' then begin + Value := Re_C; + Result := True; + end else if Name = 'Im_C' then begin + Value := Im_C; + Result := True; + end else if Name = 'Re_D' then begin + Value := Re_D; + Result := True; + end else if Name = 'Im_D' then begin + Value := Im_D; + Result := True; + end else if Name = 'mobius_invert' then begin + Value := mobius_invert; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationMobius), true, false); +end. \ No newline at end of file diff --git a/Variations/varModulus.pas b/Variations/varModulus.pas new file mode 100644 index 0000000..0f3dac7 --- /dev/null +++ b/Variations/varModulus.pas @@ -0,0 +1,208 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varModulus; + +interface + +uses + BaseVariation, XFormMan; + +const + modx = 'modulus_x'; + mody = 'modulus_y'; + modz = 'modulus_z'; + mod3D = 'modulus_use3D'; +type + TVariationModulus = class(TBaseVariation) + private + mx, my, mz, xrange, yrange, zrange: double; + m3D: byte; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +{ TVariationModulus } + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationModulus.Prepare; +begin + xrange := 2.0 * mx; + yrange := 2.0 * my; + zrange := 2.0 * mz; +end; + +////////////////////////////////////////// +procedure TVariationModulus.CalcFunction; +begin + if (FTx^ > mx) then + FPx^ := FPx^ + VVAR * (-mx + fmod(FTx^ + mx, xrange)) + else if (FTx^ < -mx) then + FPx^ := FPx^ + VVAR * (mx - fmod(mx - FTx^, xrange)) + else + FPx^ := FPx^ + VVAR * FTx^; + + if (FTy^ > my) then + FPy^ := FPy^ + VVAR * (-my + fmod(FTy^ + my, yrange)) + else if (FTy^ < -my) then + FPy^ := FPy^ + VVAR * (my - fmod(my - FTy^, yrange)) + else + FPy^ := FPy^ + VVAR * FTy^; + + + if (m3D <> 0) then + begin + if (FTz^ > mz) then + FPz^ := FPz^ + VVAR * (-mz + fmod(FTz^ + mz, zrange)) + else if (FTz^ < -mz) then + FPz^ := FPz^ + VVAR * (mz - fmod(mz - FTz^, zrange)) + else + FPz^ := FPz^ + VVAR * FTz^; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationModulus.Create; +begin + mx := 1; + my := 1; + mz := 1; + m3D := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationModulus.GetInstance: TBaseVariation; +begin + Result := TVariationModulus.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationModulus.GetName: string; +begin + Result := 'modulus'; +end; + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +function TVariationModulus.GetVariableNameAt(const Index: integer): string; +begin + case Index of + 0: Result := modx; + 1: Result := mody; + 2: Result := modz; + 3: Result := mod3D; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationModulus.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = modx then begin + mx := Value; + Result := True; + end + else if Name = mody then begin + my := value; + Result := True; + end else if Name = modz then begin + mz := value; + Result := True; + end else if Name = mod3D then begin + if (value < 0) then Value := 0; + if (value > 1) then Value := 1; + m3D := Round(Value); + Result := True; + end; +end; + +function TVariationModulus.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = modx then begin + mx := 1; + Result := True; + end + else if Name = mody then begin + my := 1; + Result := True; + end else if Name = modz then begin + mz := 1; + Result := True; + end else if Name = mod3D then begin + m3D := 0; + Result := True; + end; +end; + +///////////////////////////////////////////////////////////////////// + +function TVariationModulus.GetNrVariables: integer; +begin + Result := 4; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationModulus.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = modx then begin + Value := mx; + Result := true; + end + else if Name = mody then begin + Value := my; + Result := true; + end else if Name = modz then begin + Value := mz; + Result := true; + end else if Name = mod3D then begin + Value := m3D; + Result := true; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationModulus), true, false); +end. diff --git a/Variations/varNBlur.pas b/Variations/varNBlur.pas new file mode 100644 index 0000000..3458304 --- /dev/null +++ b/Variations/varNBlur.pas @@ -0,0 +1,535 @@ +{ + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + Original nBlur plugin by FractalDesire: + http://fractaldesire.deviantart.com/art/nBlur-plugin-190401515, + Optimized and translated into Delphi by Alice V. Koryagina +} + +unit varNBlur; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationNBlur = class(TBaseVariation) + private + numEdges, numStripes: integer; + circumCircle, adjustToLinear, equalBlur, exactCalc: byte; + ratioStripes, ratioHole, highlightEdges, ratioComplement, maxStripes, angStripes, midAngle, angStart, + tan90_m_2, sina, cosa, arc_tan1, arc_tan2, speedCalc1, speedCalc2, nStripes: double; + hasStripes, negStripes: boolean; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +{ TVariationNBlur } + +/////////////////////////////////////////////////////////////////////////////// + +procedure TVariationNBlur.Prepare; +begin + //*********Prepare stripes related stuff********* + nStripes := numStripes; // AV: to fix a bug with negative stripes count + if (nStripes <> 0) then + begin + hasStripes := True; + if (nStripes < 0) then + begin + negStripes := True; + nStripes := -nStripes; + end else + negStripes := False; + end else begin + hasStripes := False; + negStripes := False; + end; + + //**********Prepare angle related stuff********** + midAngle := 2 * pi / numEdges; + if hasStripes then + begin + angStripes := midAngle / (2 * nStripes); + angStart := angStripes * 0.5; + ratioComplement := 2 - ratioStripes; + end; + + //**********Prepare hole related stuff*********** + if (ratioHole > 0.95) and (exactCalc = 1) and (circumCircle = 0) then ratioHole := 0.95; + + //*********Prepare edge calculation related stuff********* + tan90_m_2 := tan((pi + midAngle) * 0.5); + SinCos(midAngle * 0.5, sina, cosa); + + //*********Adjustment of width of shape********* + if (adjustToLinear = 1) then + begin + if((numEdges mod 4) = 0) then + VVAR := VVAR / (sqrt(2 - 2 * cos(midAngle *(numEdges * 0.5 - 1))) * 0.5) + else + VVAR := VVAR / (sqrt(2 - 2 * cos(midAngle * floor(numEdges * 0.5))) * 0.5); + end; + + //*********Prepare circumCircle-calculation********* + if (circumCircle = 1) then + begin + exactCalc := 0; + highlightEdges := 0.1; + end; + + //*********Prepare speed up related stuff********* + speedCalc1 := ratioComplement * angStart; + speedCalc2 := ratioStripes * angStart; + maxStripes := 2 * numStripes; + if(negStripes = False) then + arc_tan1 := 13.0 / power(numEdges, 1.3) * highlightEdges + else + arc_tan1 := 7.5 / power(numEdges, 1.3) * highlightEdges; + arc_tan2 := 2 * arctan(arc_tan1 *(-0.5)); +end; + + + +procedure TVariationNBlur.CalcFunction; +var + x, y, xTmp, yTmp, lenOuterEdges, lenInnerEdges, lenXY: double; + + procedure RandXY; + var + angXY, ranTmp, angTmp, angMem, rotTmp, + ratioTmp, ratioTmpNum, ratioTmpDen, step, speedCalcTmp: double; + count: integer; + begin + if (exactCalc = 1) then + angXY := random * PI2 + else + angXY := (arctan(arc_tan1 * (random - 0.5)) / arc_tan2 + 0.5 + Random(numEdges)) * midAngle; + SinCos(angXY, x, y); + angMem := angXY; + while (angXY > midAngle) do angXY := angXY - midAngle; + + //********Begin of xy-calculation of radial stripes******** + if hasStripes then + begin + angTmp := angStart; + count := 0; + while(angXY > angTmp) do + begin + angTmp := angTmp + angStripes; + if (angTmp > midAngle) then angTmp := midAngle; + inc(count); + end; + if (angTmp <> midAngle) then angTmp := angTmp - angStart; + + if (not negStripes) then + begin + if Odd(count) then + begin + if(angXY > angTmp) then + begin + angXY := angXY + angStart; + angMem := angMem + angStart; + SinCos(angMem, x, y); + angTmp := angTmp + angStripes; + inc(count); + end + else begin + angXY := angXY - angStart; + angMem := angMem - angStart; + SinCos(angMem, x, y); + angTmp := angTmp - angStripes; + dec(count); + end; + end; + + if (not Odd(count)) and (ratioStripes > 1.0) then + begin + if (angXY > angTmp) and (count <> maxStripes) then + begin + angMem := angMem - angXY + angTmp + (angXY - angTmp) / angStart * ratioStripes * angStart; + angXY := angTmp + (angXY - angTmp) / angStart * ratioStripes * angStart; + SinCos(angMem, x, y); + end + else begin + angMem := angMem - angXY + angTmp - (angTmp - angXY)/ angStart * ratioStripes * angStart; + angXY := angTmp + (angXY - angTmp)/ angStart * ratioStripes * angStart; + SinCos(angMem, x, y); + end; + end; + + if (not Odd(count)) and (ratioStripes < 1.0) then + begin + if (abs(angXY - angTmp) > speedCalc2) and (count <> maxStripes) then + begin + if (angXY - angTmp) > speedCalc2 then + begin + ratioTmpNum := (angXY -(angTmp + speedCalc2)) * speedCalc2; + ratioTmpDen := angStart - speedCalc2; + ratioTmp := ratioTmpNum / ratioTmpDen; + SinCos((angMem - angXY + angTmp + ratioTmp), x, y); + angXY := angTmp + ratioTmp; + end; + if (angTmp - angXY) > speedCalc2 then + begin + ratioTmpNum := (angTmp - speedCalc2 - angXY) * speedCalc2; + ratioTmpDen := angStart - speedCalc2; + ratioTmp := ratioTmpNum / ratioTmpDen; + SinCos((angMem - angXY + angTmp - ratioTmp), x, y); + angXY := angTmp - ratioTmp; + end; + end; + + if (count = maxStripes) then + if (angTmp - angXY) > speedCalc2 then + begin + ratioTmpNum := (angTmp - speedCalc2 - angXY) * speedCalc2; + ratioTmpDen := angStart - speedCalc2; + ratioTmp := ratioTmpNum / ratioTmpDen; + SinCos((angMem - angXY + angTmp - ratioTmp), x, y); + angXY := angTmp - ratioTmp; + end; + end; + end + else begin + //********Change ratio and ratioComplement******** + ratioTmp := ratioStripes; + ratioStripes := ratioComplement; + ratioComplement := ratioTmp; + speedCalcTmp := speedCalc1; + speedCalc1 := speedCalc2; + speedCalc2 := speedCalcTmp; + //************************************************ + if not Odd(count) then + begin + if (angXY > angTmp) and (count <> maxStripes) then + begin + angXY := angXY + angStart; + angMem := angMem + angStart; + SinCos(angMem, x, y); + angTmp := angTmp + angStripes; + inc(count); + end + else begin + angXY := angXY - angStart; + angMem := angMem - angStart; + SinCos(angMem, x, y); + angTmp := angTmp - angStripes; + dec(count); + end; + end; + + if Odd(count) and (ratioStripes > 1.0) then + begin + if (angXY > angTmp) and (count <> maxStripes) then + begin + angMem := angMem - angXY + angTmp + (angXY - angTmp) / angStart * ratioStripes * angStart; + angXY := angTmp + (angXY - angTmp) / angStart * ratioStripes * angStart; + SinCos(angMem, x, y); + end + else begin + angMem := angMem - angXY + angTmp - (angTmp - angXY)/ angStart * ratioStripes * angStart; + angXY := angTmp + (angXY - angTmp)/ angStart * ratioStripes * angStart; + SinCos(angMem, x, y); + end; + end; + + + if Odd(count) and (ratioStripes < 1.0) then + begin + if (abs(angXY - angTmp) > speedCalc2) and (count <> maxStripes) then + begin + if (angXY - angTmp) > speedCalc2 then + begin + ratioTmpNum := (angXY -(angTmp + speedCalc2)) * speedCalc2; + ratioTmpDen := angStart - speedCalc2; + ratioTmp := ratioTmpNum / ratioTmpDen; + SinCos((angMem - angXY + angTmp + ratioTmp), x, y); + angXY := angTmp + ratioTmp; + end; + if (angTmp - angXY) > speedCalc2 then + begin + ratioTmpNum := (angTmp - speedCalc2 - angXY) * speedCalc2; + ratioTmpDen := angStart - speedCalc2; + ratioTmp := ratioTmpNum / ratioTmpDen; + SinCos((angMem - angXY + angTmp - ratioTmp), x, y); + angXY := angTmp - ratioTmp; + end; + end; + + if (count = maxStripes) then + begin + angTmp := midAngle; + if (angTmp - angXY) > speedCalc2 then + begin + ratioTmpNum := (angTmp - speedCalc2 - angXY) * speedCalc2; + ratioTmpDen := angStart - speedCalc2; + ratioTmp := ratioTmpNum / ratioTmpDen; + SinCos((angMem - angXY + angTmp - ratioTmp), x, y); + angXY := angTmp - ratioTmp; + end; + end; + end; + + //********Restore ratio and ratioComplement******* + ratioTmp := ratioStripes; + ratioStripes := ratioComplement; + ratioComplement := ratioTmp; + speedCalcTmp := speedCalc1; + speedCalc1 := speedCalc2; + speedCalc2 := speedCalcTmp; + //************************************************ + end; + end; + //********End of xy-calculation of radial stripes******** + + //********Begin of calculation of edge limits******** + xTmp := tan90_m_2 / (tan90_m_2 - tan(angXY)); + yTmp := xTmp * tan(angXY); + lenOuterEdges := hypot(xTmp, yTmp); + //*********End of calculation of edge limits******** + + //********Begin of radius-calculation (optionally hole)******** + if(exactCalc = 1) then + if (equalBlur = 1) then ranTmp := sqrt(random) + else ranTmp := random + else begin + if(circumCircle = 1) then + if (equalBlur = 1) then ranTmp := sqrt(random) + else ranTmp := random + else + if (equalBlur = 1) then ranTmp := sqrt(random) * lenOuterEdges + else ranTmp := random * lenOuterEdges; + end; + lenInnerEdges := ratioHole * lenOuterEdges; + + if (exactCalc = 0) then + begin + if(ranTmp < lenInnerEdges) then + begin + if (circumCircle = 1) then + if (equalBlur = 1) then ranTmp := lenInnerEdges + sqrt(random) * (1.0 - lenInnerEdges + 1e-300) + else ranTmp := lenInnerEdges + random * (1.0 - lenInnerEdges + 1e-300) + else + if (equalBlur = 1) then ranTmp := lenInnerEdges + sqrt(random) * (lenOuterEdges - lenInnerEdges) + else ranTmp := lenInnerEdges + random * (lenOuterEdges - lenInnerEdges); + end; + end; + + x := x * ranTmp; + y := y * ranTmp; + lenXY := hypot(x, y); + //*********End of radius-calculation (optionally hole)********* + end; // of procedure + +begin + + RandXY; + + //********Exact calculation slower - interpolated calculation faster******** + if (exactCalc = 1) and (circumCircle = 0) then + while ((lenXY < lenInnerEdges) or (lenXY > lenOuterEdges)) do RandXY; + if (exactCalc = 1) and (circumCircle = 1) then + while (lenXY < lenInnerEdges) do RandXY; + xTmp := x; + yTmp := y; + //************************************************************************** + + //********Begin of horizontal adjustment (rotation)******** + x := cosa * xTmp - sina * yTmp; + y := sina * xTmp + cosa * yTmp; + //*********End of horizontal adjustment (rotation)********* + + FPx^ := FPx^ + VVAR * x; + FPy^ := FPy^ + VVAR * y; +end; + + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationNBlur.Create; +begin + numEdges := 3; + numStripes := 0; + ratioStripes := 1.0; + ratioHole := 0; + circumCircle := 0; + adjustToLinear := 1; + equalBlur := 1; + exactCalc := 0; + highlightEdges := 1.0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationNBlur.GetInstance: TBaseVariation; +begin + Result := TVariationNBlur.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationNBlur.GetName: string; +begin + Result := 'nBlur'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationNBlur.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'nb_numEdges'; + 1: Result := 'nb_numStripes'; + 2: Result := 'nb_ratioStripes'; + 3: Result := 'nb_ratioHole'; + 4: Result := 'nb_circumCircle'; + 5: Result := 'nb_adjustToLinear'; + 6: Result := 'nb_equalBlur'; + 7: Result := 'nb_exactCalc'; + 8: Result := 'nb_highlightEdges'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationNBlur.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'nb_numEdges' then begin + if (value < 3) then Value := 3; + numEdges := Round(Value); + Result := True; + end else if Name = 'nb_numStripes' then begin + numStripes := Round(Value); + Result := True; + end else if Name = 'nb_ratioStripes' then begin + if (value < 0) then Value := 0; + if (value > 2) then Value := 2; + ratioStripes := Value; + Result := True; + end else if Name = 'nb_ratioHole' then begin + if (value < 0) then Value := 0; + if (value > 1) then Value := 1; + ratioHole := Value; + Result := True; + end else if Name = 'nb_circumCircle' then begin + if (value < 0) then Value := 0; + if (value > 1) then Value := 1; + circumCircle := Round(Value); + Result := True; + end else if Name = 'nb_adjustToLinear' then begin + if (value < 0) then Value := 0; + if (value > 1) then Value := 1; + adjustToLinear := Round(Value); + Result := True; + end else if Name = 'nb_equalBlur' then begin + if (value < 0) then Value := 0; + if (value > 1) then Value := 1; + equalBlur := Round(Value); + Result := True; + end else if Name = 'nb_exactCalc' then begin + if (value < 0) then Value := 0; + if (value > 1) then Value := 1; + exactCalc := Round(Value); + Result := True; + end else if Name = 'nb_highlightEdges' then begin + if (value < 0.1) then Value := 0.1; + highlightEdges := Value; + Result := True; + end +end; + +function TVariationNBlur.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'nb_numEdges' then begin + numEdges:= 3; + Result := True; + end else if Name = 'nb_numStripes' then begin + numStripes := 0; + Result := True; + end else if Name = 'nb_highlightEdges' then begin + highlightEdges := 1; + Result := True; + end else if Name = 'nb_ratioStripes' then begin + ratioStripes := 1; + Result := True; + end else if Name = 'nb_ratioHole' then begin + ratioHole := 0; + Result := True; + end else if Name = 'nb_circumCircle' then begin + circumCircle := 0; + Result := True; + end else if Name = 'nb_adjustToLinear' then begin + adjustToLinear := 1; + Result := True; + end else if Name = 'nb_equalBlur' then begin + equalBlur := 1; + Result := True; + end else if Name = 'nb_exactCalc' then begin + exactCalc := 0; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationNBlur.GetNrVariables: integer; +begin + Result := 9; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationNBlur.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'nb_numEdges' then begin + Value := numEdges; + Result := True; + end else if Name = 'nb_numStripes' then begin + Value := numStripes; + Result := True; + end else if Name = 'nb_ratioStripes' then begin + Value := ratioStripes; + Result := True; + end else if Name = 'nb_ratioHole' then begin + Value := ratioHole; + Result := True; + end else if Name = 'nb_circumCircle' then begin + Value := circumCircle; + Result := True; + end else if Name = 'nb_adjustToLinear' then begin + Value := adjustToLinear; + Result := True; + end else if Name = 'nb_equalBlur' then begin + Value := equalBlur; + Result := True; + end else if Name = 'nb_exactCalc' then begin + Value := exactCalc; + Result := True; + end else if Name = 'nb_highlightEdges' then begin + Value := highlightEdges; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationNBlur), false, false); +end. + diff --git a/Variations/varNGon.pas b/Variations/varNGon.pas new file mode 100644 index 0000000..6efcebe --- /dev/null +++ b/Variations/varNGon.pas @@ -0,0 +1,188 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + You should have received a copy of the GNU General Public License + GNU General Public License for more details. + + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varNGon; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationNGon = class(TBaseVariation) + private + ngon_sides : integer; + ngon_power, ngon_circle, ngon_corners : double; + cpower, csides, csidesinv : double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationNGon.Prepare; +begin + cpower := -0.5 * ngon_power; + csides := 2.0 * PI / ngon_sides; + csidesinv := 1.0 / csides; +end; + +procedure TVariationNGon.CalcFunction; +var + r_factor, theta, phi, amp: double; +begin + + if (FTX^ = 0) and (FTY^ = 0) then r_factor := 0 + else r_factor := Power(FTx^ * FTx^ + FTy^ * FTy^, cpower); + + theta := ArcTan2(FTy^, FTx^); + + phi := theta - csides * floor(theta * csidesinv); + if (phi > 0.5 * csides) then + phi := phi - csides; + + amp := (ngon_corners * (1.0 / cos(phi) - 1.0) + ngon_circle) * VVAR * r_factor; + + FPx^ := FPx^ + amp * FTx^; + FPy^ := FPy^ + amp * FTy^; + FPz^ := FPz^ + VVAR * FTz^; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationNGon.Create; +begin + ngon_sides := 4; + ngon_power := 2; + ngon_circle := 1; + ngon_corners := 1; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationNGon.GetInstance: TBaseVariation; +begin + Result := TVariationNGon.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationNGon.GetName: string; +begin + Result := 'ngon'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationNGon.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'ngon_sides'; + 1: Result := 'ngon_power'; + 2: Result := 'ngon_circle'; + 3: Result := 'ngon_corners'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationNGon.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'ngon_sides' then begin + if (value < 0) and (value > -1) then Value := -1 + else if (value >= 0) and (value < 1) then Value := 1; + ngon_sides := Round(value); + Result := True; + end else if Name = 'ngon_power' then begin + ngon_power := Value; + Result := True; + end else if Name = 'ngon_circle' then begin + ngon_circle := Value; + Result := True; + end else if Name = 'ngon_corners' then begin + ngon_corners := Value; + Result := True; + end; +end; +function TVariationNGon.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'ngon_sides' then begin + ngon_sides := 4; + Result := True; + end else if Name = 'ngon_power' then begin + ngon_power := 2; + Result := True; + end else if Name = 'ngon_circle' then begin + ngon_circle := 1; + Result := True; + end else if Name = 'ngon_corners' then begin + ngon_corners := 1; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationNGon.GetNrVariables: integer; +begin + Result := 4 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationNGon.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'ngon_sides' then begin + Value := ngon_sides; + Result := True; + end else if Name = 'ngon_power' then begin + Value := ngon_power; + Result := True; + end else if Name = 'ngon_circle' then begin + Value := ngon_circle; + Result := True; + end else if Name = 'ngon_corners' then begin + Value := ngon_corners; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationNGon), true, false); +end. diff --git a/Variations/varPDJ.pas b/Variations/varPDJ.pas new file mode 100644 index 0000000..5fe73e3 --- /dev/null +++ b/Variations/varPDJ.pas @@ -0,0 +1,316 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varPDJ; + +interface + +uses + BaseVariation, XFormMan; + +{$ifdef Apo7X64} +{$else} + {$define _ASM_} +{$endif} + +type + TVariationPDJ = class(TBaseVariation) + private + FA,FB,FC,FD: double; + + procedure CalcABC0; + procedure CalcAB00; + procedure CalcA000; + + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + + procedure GetCalcFunction(var f: TCalcFunction); override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +{ TVariationPDJ } + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationPDJ.GetCalcFunction(var f: TCalcFunction); +begin + if FD = 0 then begin + if FC = 0 then begin + if FB = 0 then + f := CalcA000 + else + f := CalcAB00; + end + else f := CalcABC0; + end + else f := CalcFunction; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationPDJ.CalcFunction; +{$ifndef _ASM_} +begin + FPx^ := FPx^ + vvar * (sin(FA * FTy^) - cos(FB * FTx^)); + FPy^ := FPy^ + vvar * (sin(FC * FTx^) - cos(FD * FTy^)); + FPz^ := FPz^ + vvar * FTz^; +{$else} +asm + fld qword ptr [eax + vvar] + mov edx, [eax + FTx] + // AV: 3D stuff, for Apo7X.15C compatibility + fld st + fmul qword ptr [edx + 32] // FTz + fadd qword ptr [edx + 40] // FPz + fstp qword ptr [edx + 40] + // main code + fld qword ptr [edx + 8] // FTy + fld qword ptr [edx] // FTx + + fld st(1) + fmul qword ptr [eax + Fa] + fsin + fld st(1) + fmul qword ptr [eax + Fb] + fcos + fsubp st(1), st + fmul st, st(3) + fadd qword ptr [edx + 16] // FPx + fstp qword ptr [edx + 16] + + fmul qword ptr [eax + Fc] + fsin + fxch st(1) + fmul qword ptr [eax + Fd] + fcos + fsubp st(1), st + fmulp + fadd qword ptr [edx + 24] // FPy + fstp qword ptr [edx + 24] +{$endif} +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationPDJ.CalcABC0; +{$ifndef _ASM_} +begin + FPx^ := FPx^ + vvar * (sin(FA * FTy^) - cos(FB * FTx^)); + FPy^ := FPy^ + vvar * (sin(FC * FTx^) - 1); + FPz^ := FPz^ + vvar * FTz^; +{$else} +asm + fld qword ptr [eax + vvar] + mov edx, [eax + FTx] + // AV: for Apo7X.15C compatibility + fld st + fmul qword ptr [edx + 32] // FTz + fadd qword ptr [edx + 40] // FPz + fstp qword ptr [edx + 40] + // main code + fld qword ptr [edx + 8] // FTy + fld qword ptr [edx] // FTx + + fld st(1) + fmul qword ptr [eax + Fa] + fsin + fld st(1) + fmul qword ptr [eax + Fb] + fcos + fsubp st(1), st + fmul st, st(3) + fadd qword ptr [edx + 16] // FPx + fstp qword ptr [edx + 16] + + fmul qword ptr [eax + Fc] + fsin + fstp st(1) + fld1 + fsubp st(1), st + fmulp + fadd qword ptr [edx + 24] // FPy + fstp qword ptr [edx + 24] +{$endif} +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationPDJ.CalcAB00; +{$ifndef _ASM_} +begin + FPx^ := FPx^ + vvar * (sin(FA * FTy^) - cos(FB * FTx^)); + FPy^ := FPy^ - vvar; + FPz^ := FPz^ + vvar * FTz^; +{$else} +asm + fld qword ptr [eax + vvar] + mov edx, [eax + FTx] + // AV: for Apo7X.15C compatibility + fld st + fmul qword ptr [edx + 32] // FTz + fadd qword ptr [edx + 40] // FPz + fstp qword ptr [edx + 40] + // main code + fld qword ptr [edx + 8] // FTy + fmul qword ptr [eax + Fa] + fsin + fld qword ptr [edx] // FTx + fmul qword ptr [eax + Fb] + fcos + fsubp st(1), st + fmul st, st(1) + fadd qword ptr [edx + 16] // FPx + fstp qword ptr [edx + 16] + + fsubr qword ptr [edx + 24] // FPy + fstp qword ptr [edx + 24] +{$endif} +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationPDJ.CalcA000; +{$ifndef _ASM_} +begin + FPx^ := FPx^ + vvar * (sin(FA * FTy^) - 1); + FPy^ := FPy^ - vvar; + FPz^ := FPz^ + vvar * FTz^; +{$else} +asm + fld qword ptr [eax + vvar] + mov edx, [eax + FTx] + // AV: for Apo7X.15C compatibility + fld st + fmul qword ptr [edx + 32] // FTz + fadd qword ptr [edx + 40] // FPz + fstp qword ptr [edx + 40] + // main code + fld qword ptr [edx + 8] // FTy + fmul qword ptr [eax + Fa] + fsin + fld1 + fsubp st(1), st + fmul st, st(1) + + fadd qword ptr [edx + 16] // FPx + fstp qword ptr [edx + 16] + + fsubr qword ptr [edx + 24] // FPy + fstp qword ptr [edx + 24] +{$endif} +end; + + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationPDJ.Create; +begin + FA := PI * (2 * Random - 1); + FB := PI * (2 * Random - 1); + FC := PI * (2 * Random - 1); + FD := PI * (2 * Random - 1); +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPDJ.GetInstance: TBaseVariation; +begin + Result := TVariationPDJ.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPDJ.GetName: string; +begin + Result := 'pdj'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPDJ.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'pdj_a'; + 1: Result := 'pdj_b'; + 2: Result := 'pdj_c'; + 3: Result := 'pdj_d'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPDJ.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'pdj_a' then begin + FA := Value; + Result := True; + end else if Name = 'pdj_b' then begin + FB := Value; + Result := True; + end else if Name = 'pdj_c' then begin + FC := Value; + Result := True; + end else if Name = 'pdj_d' then begin + FD := Value; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPDJ.GetNrVariables: integer; +begin + Result := 4 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPDJ.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'pdj_a' then begin + Value := FA; + Result := True; + end else if Name = 'pdj_b' then begin + Value := FB; + Result := True; + end else if Name = 'pdj_c' then begin + Value := FC; + Result := True; + end else if Name = 'pdj_d' then begin + Value := FD; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationPDJ), true, false); +end. diff --git a/Variations/varPopcorn2.pas b/Variations/varPopcorn2.pas new file mode 100644 index 0000000..346f0b5 --- /dev/null +++ b/Variations/varPopcorn2.pas @@ -0,0 +1,146 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit varPopcorn2; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationPopcorn2 = class(TBaseVariation) + private + p2x, p2y, p2c: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +{ TVariationPopcorn2 } + +/////////////////////////////////////////////////////////////////////////////// + +procedure TVariationPopcorn2.CalcFunction; +var + sn, cn : double; +begin + SinCos(p2c * FTy^, sn, cn); + if cn <> 0 then // AV: safety tangent + sn := sin(sn / cn) + else + sn := 0; + FPx^ := FPx^ + vvar * (FTx^ + p2x * sn); + SinCos(p2c * FTx^, sn, cn); + if cn <> 0 then // AV: safety tangent + sn := sin(sn / cn) + else + sn := 0; + FPy^ := FPy^ + vvar * (FTy^ + p2y * sn); +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPopcorn2.GetName: string; +begin + Result := 'popcorn2'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPopcorn2.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'popcorn2_x'; + 1: Result := 'popcorn2_y'; + 2: Result := 'popcorn2_c'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPopcorn2.GetNrVariables: integer; +begin + Result := 3; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPopcorn2.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'popcorn2_x' then begin + p2x := Value; + Result := True; + end else if Name = 'popcorn2_y' then begin + p2y := Value; + Result := True; + end else if Name = 'popcorn2_c' then begin + p2c := Value; + Result := True; + end; +end; + +function TVariationPopcorn2.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'popcorn2_x' then begin + p2x := 0.1; + Result := True; + end else if Name = 'popcorn2_y' then begin + p2y := 0.1; + Result := True; + end else if Name = 'popcorn2_c' then begin + p2c := 3; + Result := True; + end; +end; + + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPopcorn2.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'popcorn2_x' then begin + Value := p2x; + Result := True; + end else if Name = 'popcorn2_y' then begin + Value := p2y; + Result := True; + end else if Name = 'popcorn2_c' then begin + Value := p2c; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationPopcorn2.Create; +begin + p2c := 3; + p2x := 0.1; + p2y := 0.1; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPopcorn2.GetInstance: TBaseVariation; +begin + Result := TVariationPopcorn2.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationPopcorn2), false, false); +end. diff --git a/Variations/varPostBoarders2.pas b/Variations/varPostBoarders2.pas new file mode 100644 index 0000000..6777336 --- /dev/null +++ b/Variations/varPostBoarders2.pas @@ -0,0 +1,188 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit varPostBoarders2; + +interface + +uses + BaseVariation, XFormMan; + +const + sb2c = 'post_boarders2_c'; + sleft = 'post_boarders2_left'; + sright = 'post_boarders2_right'; + eps: double = 1e-30; +type + TVariationPostBoarders2 = class(TBaseVariation) + private + b2c, left, right, cc, cl, cr: double; + + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +{ TVariationPostBoarders2 } + +////////////////////////////////////////// +procedure TVariationPostBoarders2.Prepare; +begin + cc := abs(b2c); + cl := cc * abs(left); + cr := cc + (cc * abs(right)); +end; + +////////////////////////////////////////// +procedure TVariationPostBoarders2.CalcFunction; +var + roundX, roundY, offsetX, offsetY: double; +begin + roundX := round(FPx^); + roundY := round(FPy^); + offsetX := FPx^ - roundX; + offsetY := FPy^ - roundY; + + if (random >= cr) then + begin + FPx^ := VVAR * (offsetX * cc + roundX); + FPy^ := VVAR * (offsetY * cc + roundY); + end + else begin + if (abs(offsetX) >= abs(offsetY)) then + begin + if(offsetX >= 0.0) then + begin + FPx^ := VVAR * (offsetX * cc + roundX + cl); + FPy^ := VVAR * (offsetY * cc + roundY + cl * offsetY / offsetX); + end + else begin + FPx^ := VVAR * (offsetX * cc + roundX - cl); + FPy^ := VVAR * (offsetY * cc + roundY - cl * offsetY / offsetX); + end; + end + else begin + if(offsetY >= 0.0) then + begin + FPy^ := VVAR * (offsetY * cc + roundY + cl); + FPx^ := VVAR * (offsetX * cc + roundX + offsetX / offsetY * cl); + end + else begin + FPy^ := VVAR * (offsetY * cc + roundY - cl); + FPx^ := VVAR * (offsetX * cc + roundX - offsetX / offsetY * cl); + end; + end; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// + +constructor TVariationPostBoarders2.Create; +begin + b2c := 0.5; + left := 0.5; + right := 0.5; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPostBoarders2.GetInstance: TBaseVariation; +begin + Result := TVariationPostBoarders2.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPostBoarders2.GetName: string; +begin + Result := 'post_boarders2'; +end; + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +function TVariationPostBoarders2.GetVariableNameAt(const Index: integer): string; +begin + case Index of + 0: Result := sb2c; + 1: Result := sleft; + 2: Result := sright; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPostBoarders2.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = sb2c then begin + if abs(value) = 0 then value := eps; + b2c := value; + Result := True; + end else if Name = sleft then begin + if abs(value) = 0 then value := eps; + left := Value; + Result := True; + end else if Name = sright then begin + if abs(value) = 0 then value := eps; + right := Value; + Result := True; + end; +end; + +function TVariationPostBoarders2.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = sb2c then begin + b2c := 0.5; + Result := True; + end else if Name = sleft then begin + left := 0.5; + Result := True; + end else if Name = sright then begin + right := 0.5; + Result := True; + end; +end; + +///////////////////////////////////////////////////////////////////// + +function TVariationPostBoarders2.GetNrVariables: integer; +begin + Result := 3; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPostBoarders2.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = sb2c then begin + Value := b2c; + Result := True; + end else if Name = sleft then begin + Value := left; + Result := True; + end else if Name = sright then begin + Value := right; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationPostBoarders2), false, false); +end. \ No newline at end of file diff --git a/Variations/varPostBwraps.pas b/Variations/varPostBwraps.pas new file mode 100644 index 0000000..69807a2 --- /dev/null +++ b/Variations/varPostBwraps.pas @@ -0,0 +1,228 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varPostBwraps; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationPostBwraps = class(TBaseVariation) + private + post_bwraps_cellsize, post_bwraps_space, post_bwraps_gain, + post_bwraps_inner_twist, post_bwraps_outer_twist, + g2, r2, rfactor: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationPostBwraps.Prepare; +var + max_bubble, radius: double; +begin + radius := 0.5 * (post_bwraps_cellsize / (1.0 + sqr(post_bwraps_space))); + g2 := sqr(post_bwraps_gain) / (radius + 1e-6) + 1e-6; + max_bubble := g2 * radius; + + if (max_bubble > 2.0) then max_bubble := 1.0 + else max_bubble := max_bubble * (1.0 / (sqr(max_bubble)/4.0 + 1.0)); + + r2 := sqr(radius); + rfactor := radius / max_bubble; +end; + +procedure TVariationPostBwraps.CalcFunction; +var + Vx, Vy, + Cx, Cy, + Lx, Ly, + r, theta, s, c : double; +begin + Vx := FPx^; + Vy := FPy^; + + if (post_bwraps_cellsize <> 0.0) then + begin + Cx := (floor(Vx / post_bwraps_cellsize) + 0.5) * post_bwraps_cellsize; + Cy := (floor(Vy / post_bwraps_cellsize) + 0.5) * post_bwraps_cellsize; + + Lx := Vx - Cx; + Ly := Vy - Cy; + + if ((sqr(Lx) + sqr(Ly)) <= r2) then + begin + Lx := Lx * g2; + Ly := Ly * g2; + + r := rfactor / ((sqr(Lx) + sqr(Ly)) / 4.0 + 1); + + Lx := Lx * r; + Ly := Ly * r; + + r := (sqr(Lx) + sqr(Ly)) / r2; + theta := post_bwraps_inner_twist * (1.0 - r) + post_bwraps_outer_twist * r; + SinCos(theta, s, c); + + Vx := Cx + c * Lx + s * Ly; + Vy := Cy - s * Lx + c * Ly; + + FPx^ := VVAR * Vx; + FPy^ := VVAR * Vy; + FPz^ := VVAR * FPz^; + end; + end; + +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationPostBwraps.Create; +begin + post_bwraps_cellsize := 1; + post_bwraps_space := 0; + post_bwraps_gain := 1; + post_bwraps_inner_twist := 0; + post_bwraps_outer_twist := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPostBwraps.GetInstance: TBaseVariation; +begin + Result := TVariationPostBwraps.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPostBwraps.GetName: string; +begin + Result := 'post_bwraps'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPostBwraps.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'post_bwraps_cellsize'; + 1: Result := 'post_bwraps_space'; + 2: Result := 'post_bwraps_gain'; + 3: Result := 'post_bwraps_inner_twist'; + 4: Result := 'post_bwraps_outer_twist'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPostBwraps.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'post_bwraps_cellsize' then begin + if Value = 0 then Value := 1e-6; + post_bwraps_cellsize := Value; + Result := True; + end else if Name = 'post_bwraps_space' then begin + post_bwraps_space := Value; + Result := True; + end else if Name = 'post_bwraps_gain' then begin + post_bwraps_gain := Value; + Result := True; + end else if Name = 'post_bwraps_inner_twist' then begin + post_bwraps_inner_twist := Value; + Result := True; + end else if Name = 'post_bwraps_outer_twist' then begin + post_bwraps_outer_twist := Value; + Result := True; + end +end; +function TVariationPostBwraps.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'post_bwraps_cellsize' then begin + post_bwraps_cellsize := 1; + Result := True; + end else if Name = 'post_bwraps_space' then begin + post_bwraps_space := 0; + Result := True; + end else if Name = 'post_bwraps_gain' then begin + post_bwraps_gain := 1; + Result := True; + end else if Name = 'post_bwraps_inner_twist' then begin + post_bwraps_inner_twist := 0; + Result := True; + end else if Name = 'post_bwraps_outer_twist' then begin + post_bwraps_outer_twist := 0; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPostBwraps.GetNrVariables: integer; +begin + Result := 5 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPostBwraps.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'post_bwraps_cellsize' then begin + Value := post_bwraps_cellsize; + Result := True; + end else if Name = 'post_bwraps_space' then begin + Value := post_bwraps_space; + Result := True; + end else if Name = 'post_bwraps_gain' then begin + Value := post_bwraps_gain; + Result := True; + end else if Name = 'post_bwraps_inner_twist' then begin + Value := post_bwraps_inner_twist; + Result := True; + end else if Name = 'post_bwraps_outer_twist' then begin + Value := post_bwraps_outer_twist; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationPostBwraps), true, false); +end. \ No newline at end of file diff --git a/Variations/varPostCircleCrop.pas b/Variations/varPostCircleCrop.pas new file mode 100644 index 0000000..9ffe551 --- /dev/null +++ b/Variations/varPostCircleCrop.pas @@ -0,0 +1,203 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit varPostCircleCrop; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationPostCircleCrop = class(TBaseVariation) + + const + sx : string = 'post_circlecrop_x'; + sy : string = 'post_circlecrop_y'; + sradius : string = 'post_circlecrop_radius'; + szero : string = 'post_circlecrop_zero'; + sarea : string = 'post_circlecrop_scatter_area'; + + private + x0, y0, radius, scatter_area, ca: double; + zero: byte; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + + +implementation +uses + Math; + +{ TVariationPostCircleCrop } + +////////////////////////////////////////// + +procedure TVariationPostCircleCrop.Prepare; +begin + ca := max(-1.0, min(scatter_area, 1.0)); +end; + +procedure TVariationPostCircleCrop.CalcFunction; +var + x, y, rad, ang, rdc, sn, cn: double; +begin + x := FPx^ - x0; + y := FPy^ - y0; + rad := Hypot(x, y); + + if (rad > radius) then + begin + if (zero = 1) then + begin + FPx^ := 0; + FPy^ := 0; + end else + begin + ang := arctan2(y, x); + SinCos(ang, sn, cn); + rdc := radius + (random * 0.5 * ca); + + FPx^ := vvar * rdc * cn + x0; + FPy^ := vvar * rdc * sn + y0; + end; + end else + begin + FPx^ := vvar * x + x0; + FPy^ := vvar * y + y0; + end; +end; + +constructor TVariationPostCircleCrop.Create; +begin + x0 := 0; + y0 := 0; + radius := 1; + scatter_area := 0; + zero := 0; +end; + +class function TVariationPostCircleCrop.GetInstance: TBaseVariation; +begin + Result := TVariationPostCircleCrop.Create; +end; + +class function TVariationPostCircleCrop.GetName: string; +begin + Result := 'post_circlecrop'; +end; + +function TVariationPostCircleCrop.GetNrVariables: integer; +begin + Result := 5; +end; + +function TVariationPostCircleCrop.GetVariable(const Name: string; + var value: double): boolean; +begin + Result := False; + if Name = sx then begin + Value := x0; + Result := True; + end + else if Name = sy then begin + Value := y0; + Result := True; + end + else if Name = sradius then begin + Value := radius; + Result := True; + end + else if Name = sarea then begin + Value := scatter_area; + Result := True; + end + else if Name = szero then begin + Value := zero; + Result := True; + end; +end; + +function TVariationPostCircleCrop.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := sradius; + 1: Result := sx; + 2: Result := sy; + 3: Result := sarea; + 4: Result := szero; + else + Result := ''; + end; +end; + +function TVariationPostCircleCrop.ResetVariable(const Name: string): boolean; +begin +Result := False; + if Name = sx then begin + x0 := 0; + Result := True; + end + else if Name = sy then begin + y0 := 0; + Result := True; + end + else if Name = sradius then begin + radius := 1; + Result := True; + end + else if Name = sarea then begin + scatter_area := 0; + Result := True; + end + else if Name = szero then begin + zero := 0; + Result := True; + end; +end; + +function TVariationPostCircleCrop.SetVariable(const Name: string; + var value: double): boolean; +begin +Result := False; + if Name = sx then begin + x0 := Value; + Result := True; + end + else if Name = sy then begin + y0 := Value; + Result := True; + end + else if Name = sradius then begin + radius := Value; + Result := True; + end + else if Name = sarea then begin + scatter_area := Value; + Result := True; + end + else if Name = szero then begin + if Value < 0 then Value := 0; + if Value > 1 then Value := 1; + zero := Round(Value); + Result := True; + end; +end; +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationPostCircleCrop), false, false); + +end. diff --git a/Variations/varPostCrop.pas b/Variations/varPostCrop.pas new file mode 100644 index 0000000..3995e84 --- /dev/null +++ b/Variations/varPostCrop.pas @@ -0,0 +1,311 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varPostCrop; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationPostCrop = class(TBaseVariation) + const + n_x0 : string = 'post_crop_left'; + n_y0 : string = 'post_crop_top'; + n_x1 : string = 'post_crop_right'; + n_y1 : string = 'post_crop_bottom'; + n_s : string = 'post_crop_scatter_area'; + n_z : string = 'post_crop_zero'; + n : string = 'post_crop'; + n_z1 : string = 'post_crop_high'; // AV + n_z0 : string = 'post_crop_low'; //AV + n_3D : string = 'post_crop_use3D'; // AV + private + x0, y0, x1, y1, z0, z1, s, w, h, l: double; + _x0, _y0, _x1, _y1, _z0, _z1: double; + z, c3D: byte; + + procedure Calc2D; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationPostCrop.Prepare; +begin + if (x0 < x1) then begin + _x0 := x0; + _x1 := x1; + end else begin + _x0 := x1; + _x1 := x0; + end; + + if (y0 < y1) then begin + _y0 := y0; + _y1 := y1; + end else begin + _y0 := y1; + _y1 := y0; + end; + + if (z0 < z1) then begin + _z0 := z0; + _z1 := z1; + end else begin + _z0 := z1; + _z1 := z0; + end; + + w := (_x1 - _x0) * 0.5 * s; + h := (_y1 - _y0) * 0.5 * s; + l := (_z1 - _z0) * 0.5 * s; +end; + +///////////////////////////////////////////////// +procedure TVariationPostCrop.GetCalcFunction(var f: TCalcFunction); +begin + if (c3D = 0) then f := Calc2D + else f := CalcFunction; +end; + +//////////////////////////////////////////////////////// +procedure TVariationPostCrop.CalcFunction; +var x, y, tz: double; +begin + x := FPx^; + y := FPy^; + tz := FPz^; + + if ((x < _x0) or (x > _x1) or (y < _y0) or (y > _y1) or (tz < _z0) or (tz > _z1)) + and (z <> 0) then begin + x := 0; y := 0; tz := 0; + end else begin + if x < _x0 then x := _x0 + random * w + else if x > _x1 then x := _x1 - random * w; + if y < _y0 then y := _y0 + random * h + else if y > _y1 then y := _y1 - random * h; + if tz < _z0 then tz := _z0 + random * l + else if tz > _z1 then tz := _z1 - random * l; + end; + + FPx^ := VVAR * x; + FPy^ := VVAR * y; + FPz^ := VVAR * tz; +end; + +procedure TVariationPostCrop.Calc2D; +var x, y: double; +begin + x := FPx^; + y := FPy^; + + if ((x < _x0) or (x > _x1) or (y < _y0) or (y > _y1)) and (z <> 0) then begin + x := 0; y := 0; + end else begin + if x < _x0 then x := _x0 + random * w + else if x > _x1 then x := _x1 - random * w; + if y < _y0 then y := _y0 + random * h + else if y > _y1 then y := _y1 - random * h; + end; + + FPx^ := VVAR * x; + FPy^ := VVAR * y; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationPostCrop.Create; +begin + x0 := -1; x1 := 1; + y0 := -1; y1 := 1; + z0 := -1; z1 := 1; + c3D := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPostCrop.GetInstance: TBaseVariation; +begin + Result := TVariationPostCrop.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPostCrop.GetName: string; +begin + Result := n; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPostCrop.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := n_x0; + 1: Result := n_y0; + 2: Result := n_x1; + 3: Result := n_y1; + 4: Result := n_z0; + 5: Result := n_z1; + 6: Result := n_s; + 7: Result := n_z; + 8: Result := n_3D; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPostCrop.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = n_x0 then begin + x0 := Value; + Result := True; + end else if Name = n_y0 then begin + y0 := Value; + Result := True; + end else if Name = n_x1 then begin + x1 := Value; + Result := True; + end else if Name = n_y1 then begin + y1 := Value; + Result := True; + end else if Name = n_z0 then begin + z0 := Value; + Result := True; + end else if Name = n_z1 then begin + z1 := Value; + Result := True; + end else if Name = n_s then begin + if (Value < -1) then Value := -1; + if (Value > 1) then Value := 1; + s := Value; + Result := True; + end else if Name = n_z then begin + if (Value > 1) then Value := 1; + if (Value < 0) then Value := 0; + z := Round(Value); + Result := True; + end else if Name = n_3d then begin + if (Value > 1) then Value := 1; + if (Value < 0) then Value := 0; + c3D := Round(Value); + Result := True; + end +end; +function TVariationPostCrop.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = n_x0 then begin + x0 := -1; + Result := True; + end else if Name = n_y0 then begin + y0 := -1; + Result := True; + end else if Name = n_x1 then begin + x1 := 1; + Result := True; + end else if Name = n_y1 then begin + y1 := 1; + Result := True; + end else if Name = n_z0 then begin + z0 := -1; + Result := True; + end else if Name = n_z1 then begin + z1 := 1; + Result := True; + end else if Name = n_s then begin + s := 0; + Result := True; + end else if Name = n_z then begin + z := 0; + Result := True; + end else if Name = n_3D then begin + c3D := 0; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPostCrop.GetNrVariables: integer; +begin + Result := 9 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPostCrop.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = n_x0 then begin + Value := x0; + Result := True; + end else if Name = n_y0 then begin + Value := y0; + Result := True; + end else if Name = n_x1 then begin + Value := x1; + Result := True; + end else if Name = n_y1 then begin + Value := y1; + Result := True; + end else if Name = n_z0 then begin + Value := z0; + Result := True; + end else if Name = n_z1 then begin + Value := z1; + Result := True; + end else if Name = n_s then begin + Value := s; + Result := True; + end else if Name = n_z then begin + Value := z; + Result := True; + end else if Name = n_3D then begin + Value := c3D; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationPostCrop), true, false); +end. \ No newline at end of file diff --git a/Variations/varPostCurl.pas b/Variations/varPostCurl.pas new file mode 100644 index 0000000..cae1a85 --- /dev/null +++ b/Variations/varPostCurl.pas @@ -0,0 +1,376 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varPostCurl; + +interface + +uses + BaseVariation, XFormMan; + +const + variation_name = 'post_curl'; + num_vars = 2; + + {$ifdef Apo7X64} +{$else} + {$define _ASM_} +{$endif} + +type + TVariationPostCurl = class(TBaseVariation) + private + c1, c2, c2x2: double; + + procedure CalcZeroC2; + procedure CalcZeroC1; + procedure CalcZeroC2C1; + public + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + +implementation + +uses + Math; + +// TVariationPostCurl + +/////////////////////////////// +procedure TVariationPostCurl.Prepare; +begin + // AV: fixed - it's wrong when vvar <> 1 + //c1 := c1 * VVAR; + //c2 := c2 * VVAR; + c2x2 := 2 * c2; +end; + +//////////////////////////////////////////////////////////////////// +procedure TVariationPostCurl.GetCalcFunction(var f: TCalcFunction); +begin + if IsZero(c1) then begin + if IsZero(c2) then + f := CalcZeroC2C1 + else + f := CalcZeroC1 + end + else begin + if IsZero(c2) then + f := CalcZeroC2 + else + f := CalcFunction + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationPostCurl.CalcFunction; +{$ifndef _ASM_} +var + x, y, r, re, im: double; +begin + x := FPx^; + y := FPy^; + + re := 1 + c1 * x + c2 * (sqr(x) - sqr(y)); + im := c1 * y + c2x2 * x * y; + + r := vvar / (sqr(re) + sqr(im)); + FPx^ := (x * re + y * im) * r; + FPy^ := (y * re - x * im) * r; +{$else} +asm + mov edx, [eax + FTx] + + fld qword ptr [edx + 24] // FPy + fld qword ptr [edx + 16] // FPx + fld st(1) + fmul st, st(1) + fmul qword ptr [eax + c2x2] + fld st(2) + fmul qword ptr [eax + c1] + faddp + fld st(2) + fmul st, st + fld st(2) + fmul st, st + fsubrp + fmul qword ptr [eax + c2] + fld1 + faddp + fld st(2) + fmul qword ptr [eax + c1] + faddp + + fld st(1) + fmul st, st + fld st(1) + fmul st, st + faddp + fdivr qword ptr [eax + vvar] + + fld st(3) + fmul st, st(2) + fld st(5) + fmul st, st(4) + faddp + fmul st, st(1) + + fstp qword ptr [edx + 16] // FPx + + fxch st(4) + fmulp + fxch st(2) + fmulp + fsubp + fmulp + + fstp qword ptr [edx + 24] // FPy +{$endif} +end; +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationPostCurl.CalcZeroC2; // AV: Mobius case +{$ifndef _ASM_} +var + r, x, y: double; + re, im: double; +begin + x := FPx^; + y := FPy^; + re := 1 + c1 * x; + im := c1 * y; + + r := vvar / (sqr(re) + sqr(im)); + + FPx^ := (x*re + y*im) * r; + FPy^ := (y*re - x*im) * r; + //FPz^ := vvar * FPz^; +{$else} +asm + mov edx, [eax + FTx] + + fld qword ptr [edx + 24] // FPy + fld qword ptr [edx + 16] // FPx + fld st(1) + fld qword ptr [eax + c1] + fmul st(1), st + fmul st, st(2) + fld1 + faddp + + fld st(1) + fmul st, st + fld st(1) + fmul st, st + faddp + fdivr qword ptr [eax + vvar] + + fld st(3) + fmul st, st(2) + fld st(5) + fmul st, st(4) + faddp + fmul st, st(1) + + fstp qword ptr [edx + 16] // FPx + + fxch st(4) + fmulp + fxch st(2) + fmulp + fsubp + fmulp + + fstp qword ptr [edx + 24] // FPy +{$endif} +end; + +procedure TVariationPostCurl.CalcZeroC1; +{$ifndef _ASM_} +var + r, x, y: double; + re, im: double; +begin + x := FPx^; + y := FPy^; + re := 1 + c2*(sqr(x) - sqr(y)); + im := c2x2 * x * y; + + r := vvar / (sqr(re) + sqr(im)); + + FPx^ := (x*re + y*im) * r; + FPy^ := (y*re - x*im) * r; + +{$else} +asm + mov edx, [eax + FTx] + + fld qword ptr [edx + 24] // FPy + fld qword ptr [edx + 16] // FPx + fld st(1) + fmul st, st(1) + fmul qword ptr [eax + c2x2] + fld st(2) + fmul st, st + fld st(2) + fmul st, st + fsubrp + fmul qword ptr [eax + c2] + fld1 + faddp + + fld st(1) + fmul st, st + fld st(1) + fmul st, st + faddp + fdivr qword ptr [eax + vvar] + + fld st(3) + fmul st, st(2) + fld st(5) + fmul st, st(4) + faddp + fmul st, st(1) + + fstp qword ptr [edx + 16] // FPx + + fxch st(4) + fmulp + fxch st(2) + fmulp + fsubp + fmulp + + fstp qword ptr [edx + 24] // FPy + //fwait +{$endif} +end; + +procedure TVariationPostCurl.CalcZeroC2C1; // AV: linear case +{$ifndef _ASM_} +var + r: double; +begin + FPx^ := vvar * FPx^; + FPy^ := vvar * FPy^; +{$else} +asm + fld qword ptr [eax + vvar] + mov edx, [eax + FTx] + fld qword ptr [edx + 16] // FPx + fmul st, st(1) + fstp qword ptr [edx + 16] + + fld qword ptr [edx + 24] // FPy + fmulp + fstp qword ptr [edx + 24] + //fwait +{$endif} +end; + + +class function TVariationPostCurl.GetInstance: TBaseVariation; +begin + Result := TVariationPostCurl.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPostCurl.GetName: string; +begin + Result := variation_name; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPostCurl.GetVariableNameAt(const Index: integer): string; +begin + case Index of + 0: Result := 'post_curl_c1'; + 1: Result := 'post_curl_c2'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPostCurl.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'post_curl_c1' then begin + c1 := value; + Result := True; + end + else if Name = 'post_curl_c2' then begin + c2 := value; + Result := True; + end; +end; + +function TVariationPostCurl.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'post_curl_c1' then begin + c1 := 0; + Result := True; + end + else if Name = 'post_curl_c2' then begin + c2 := 0; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPostCurl.GetNrVariables: integer; +begin + Result := num_vars; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPostCurl.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'post_curl_c1' then begin + value := c1; + Result := True; + end + else if Name = 'post_curl_c2' then begin + value := c2; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationPostCurl), false, false); +end. diff --git a/Variations/varPostCurl3D.pas b/Variations/varPostCurl3D.pas new file mode 100644 index 0000000..62cb203 --- /dev/null +++ b/Variations/varPostCurl3D.pas @@ -0,0 +1,276 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varPostCurl3D; + +interface + +uses + BaseVariation, XFormMan; + +const + variation_name = 'post_curl3D'; + num_vars = 3; + var_cx_name = 'post_curl3D_cx'; + var_cy_name = 'post_curl3D_cy'; + var_cz_name = 'post_curl3D_cz'; + +type + TVariationPostCurl3D = class(TBaseVariation) + private + cx, cy, cz: double; + //_cx, _cy, _cz, // AV: now unused + cx2, cy2, cz2, c2, + c2x, c2y, c2z: double; + + procedure CalcCx; + procedure CalcCy; + procedure CalcCz; + procedure CalcLinear; + public + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + +implementation + +uses + Math; + +// TVariationCurl3D + +procedure TVariationPostCurl3D.Prepare; +begin + // AV : fixed when VVAR <> 1 + //_cx := VVAR * cx; + //_cy := VVAR * cy; + //_cz := VVAR * cz; + + c2x := 2 * cx; + c2y := 2 * cy; + c2z := 2 * cz; + + cx2 := sqr(cx); + cy2 := sqr(cy); + cz2 := sqr(cz); + + c2 := cx2 + cy2 + cz2; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationPostCurl3D.GetCalcFunction(var f: TCalcFunction); +begin + + if IsZero(cx) then begin + if IsZero(cy) then begin + if IsZero(cz) then + f := CalcLinear + else + f := CalcCz; + end + else begin + if IsZero(cz) then + f := CalcCy + else + f := CalcFunction; + end + end + else begin + if IsZero(cy) and IsZero(cz) then + f := CalcCx + else + f := CalcFunction; + end; + + f := CalcFunction; + +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationPostCurl3D.CalcFunction; +var + x, y, z, r, r2: double; +begin + x := Max(-1e100, Min(FPx^, 1e100)); // <--- got weird FP overflow there... + y := Max(-1e100, Min(FPy^, 1e100)); + z := Max(-1e100, Min(FPz^, 1e100)); + + r2 := sqr(x) + sqr(y) + sqr(z); + r := vvar / (r2 * c2 + c2x * x - c2y * y + c2z * z + 1); + + FPx^ := r * (x + cx * r2); + FPy^ := r * (y - cy * r2); // AV: fixed the sign + FPz^ := r * (z + cz * r2); +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationPostCurl3D.CalcCx; +var + x, r, r2: double; +begin + r2 := sqr(FPx^) + sqr(FPy^) + sqr(FPz^); + + r := vvar / (cx2*r2 + c2x*FPx^ + 1); + + FPx^ := r * (FPx^ + cx*r2); + FPy^ := r * FPy^; + FPz^ := r * FPz^; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationPostCurl3D.CalcCy; +var + r, r2: double; +begin + r2 := sqr(FPx^) + sqr(FPy^) + sqr(FPz^); + + r := vvar / (cy2*r2 - c2y*FPy^ + 1); + + FPx^ := r * FPx^; + FPy^ := r * (FPy^ - cy*r2); + FPz^ := r * FPz^; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationPostCurl3D.CalcCz; +var + r, r2: double; +begin + r2 := sqr(FPx^) + sqr(FPy^) + sqr(FPz^); + + r := vvar / (cz2*r2 + c2z*FPz^ + 1); + + FPx^ := r * FPx^; + FPy^ := r * FPy^; + FPz^ := r * (FPz^ + cz*r2); +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationPostCurl3D.CalcLinear; +var + r: double; +begin + FPx^ := vvar * FTx^; + FPy^ := vvar * FTy^; + FPz^ := vvar * FTz^; +end; + +/////////////////////////////////////////////////////////////////////////////// + +class function TVariationPostCurl3D.GetInstance: TBaseVariation; +begin + Result := TVariationPostCurl3D.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPostCurl3D.GetName: string; +begin + Result := variation_name; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPostCurl3D.GetVariableNameAt(const Index: integer): string; +begin + case Index of + 0: Result := var_cx_name; + 1: Result := var_cy_name; + 2: Result := var_cz_name; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPostCurl3D.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = var_cx_name then begin + cx := value; + Result := True; + end + else if Name = var_cy_name then begin + cy := value; + Result := True; + end + else if Name = var_cz_name then begin + cz := value; + Result := True; + end; +end; + +function TVariationPostCurl3D.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = var_cx_name then begin + cx := 0; + Result := True; + end + else if Name = var_cy_name then begin + cy := 0; + Result := True; + end + else if Name = var_cz_name then begin + cz := 0; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPostCurl3D.GetNrVariables: integer; +begin + Result := num_vars; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPostCurl3D.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = var_cx_name then begin + value := cx; + Result := True; + end + else if Name = var_cy_name then begin + value := cy; + Result := True; + end + else if Name = var_cz_name then begin + value := cz; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationPostCurl3D), true, false); +end. diff --git a/Variations/varPostFalloff2.pas b/Variations/varPostFalloff2.pas new file mode 100644 index 0000000..948c31f --- /dev/null +++ b/Variations/varPostFalloff2.pas @@ -0,0 +1,348 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varPostFalloff2; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationPostFalloff2 = class(TBaseVariation) + const + n_scatter : string = 'post_falloff2_scatter'; + n_mindist : string = 'post_falloff2_mindist'; + n_mul_x : string = 'post_falloff2_mul_x'; + n_mul_y : string = 'post_falloff2_mul_y'; + n_mul_z : string = 'post_falloff2_mul_z'; + n_mul_c : string = 'post_falloff2_mul_c'; + n_x0 : string = 'post_falloff2_x0'; + n_y0 : string = 'post_falloff2_y0'; + n_z0 : string = 'post_falloff2_z0'; + n_invert : string = 'post_falloff2_invert'; + n_blurtype : string = 'post_falloff2_type'; + + private + rmax: double; + x0, y0, z0: double; + scatter, mindist: double; + invert, blurtype: integer; + mul_x, mul_y, mul_z, mul_c: double; + + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + procedure CalcFunctionRadial; + procedure CalcFunctionGaussian; + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationPostFalloff2.Prepare; +begin + rmax := 0.04 * scatter; +end; + +procedure TVariationPostFalloff2.GetCalcFunction(var f: TCalcFunction); +begin + if blurtype = 1 then f := CalcFunctionRadial + else if blurtype = 2 then f := CalcFunctionGaussian + else f := CalcFunction; +end; +procedure TVariationPostFalloff2.CalcFunction; +var + in_x, in_y, in_z, d: double; +begin + in_x := FPx^; + in_y := FPy^; + in_z := FPz^; + + d := sqrt(sqr(in_x - x0) + sqr(in_y - y0) + sqr(in_z - z0)); + if (invert <> 0) then d := 1 - d; if (d < 0) then d := 0; + d := (d - mindist) * rmax; if (d < 0) then d := 0; + + FPx^ := VVAR * (in_x + mul_x * random * d); + FPy^ := VVAR * (in_y + mul_y * random * d); + FPz^ := VVAR * (in_z + mul_z * random * d); + color^ := Abs(Frac(color^ + mul_c * random * d)); +end; +procedure TVariationPostFalloff2.CalcFunctionRadial; +var + in_x, in_y, in_z, d, r_in: double; + sigma, phi, r, sins, coss, sinp, cosp: double; +begin + in_x := FPx^; + in_y := FPy^; + in_z := FPz^; + + r_in := sqrt(sqr(in_x) + sqr(in_y) + sqr(in_z)) + 1e-6; + d := sqrt(sqr(in_x - x0) + sqr(in_y - y0) + sqr(in_z - z0)); + if (invert <> 0) then d := 1 - d; if (d < 0) then d := 0; + d := (d - mindist) * rmax; if (d < 0) then d := 0; + + sigma := ArcSin(in_z / r_in) + mul_z * random * d; + phi := ArcTan2(in_y, in_x) + mul_y * random * d; + r := r_in + mul_x * random * d; + + SinCos(sigma, sins, coss); + SinCos(phi, sinp, cosp); + + FPx^ := VVAR * (r * coss * cosp); + FPy^ := VVAR * (r * coss * sinp); + FPz^ := VVAR * (sins); + color^ := Abs(Frac(color^ + mul_c * random * d)); +end; +procedure TVariationPostFalloff2.CalcFunctionGaussian; +var + in_x, in_y, in_z, d: double; + sigma, phi, r, sins, coss, sinp, cosp: double; +begin + in_x := FPx^; + in_y := FPy^; + in_z := FPz^; + + d := sqrt(sqr(in_x - x0) + sqr(in_y - y0) + sqr(in_z - z0)); + if (invert <> 0) then d := 1 - d; if (d < 0) then d := 0; + d := (d - mindist) * rmax; if (d < 0) then d := 0; + + sigma := d * random * 2 * PI; + phi := d * random * PI; + r := d * random; + + SinCos(sigma, sins, coss); + SinCos(phi, sinp, cosp); + + FPx^ := VVAR * (in_x + mul_x * r * coss * cosp); + FPy^ := VVAR * (in_y + mul_y * r * coss * sinp); + FPz^ := VVAR * (in_z + mul_z * r * sins); + color^ := Abs(Frac(color^ + mul_c * random * d)); +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationPostFalloff2.Create; +begin + scatter := 1; + mindist := 0.5; + mul_x := 1; + mul_y := 1; + mul_z := 0; + mul_c := 0; + x0 := 0; + y0 := 0; + z0 := 0; + invert := 0; + blurtype := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPostFalloff2.GetInstance: TBaseVariation; +begin + Result := TVariationPostFalloff2.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPostFalloff2.GetName: string; +begin + Result := 'post_falloff2'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPostFalloff2.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := n_scatter; + 1: Result := n_mindist; + 2: Result := n_mul_x; + 3: Result := n_mul_y; + 4: Result := n_mul_z; + 5: Result := n_mul_c; + 6: Result := n_x0; + 7: Result := n_y0; + 8: Result := n_z0; + 9: Result := n_invert; + 10: Result := n_blurtype; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPostFalloff2.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = n_scatter then begin + if Value < 1e-6 then Value := 1e-6; + scatter := Value; + Result := True; + end else if Name = n_mindist then begin + if Value < 0 then Value := 0; + mindist := Value; + Result := True; + end else if Name = n_mul_x then begin + if Value < 0 then Value := 0 + else if Value > 1 then Value := 1; + mul_x := Value; + Result := True; + end else if Name = n_mul_y then begin + if Value < 0 then Value := 0 + else if Value > 1 then Value := 1; + mul_y := Value; + Result := True; + end else if Name = n_mul_z then begin + if Value < 0 then Value := 0 + else if Value > 1 then Value := 1; + mul_z := Value; + Result := True; + end else if Name = n_mul_c then begin + if Value < 0 then Value := 0 + else if Value > 1 then Value := 1; + mul_c := Value; + Result := True; + end else if Name = n_x0 then begin + x0 := Value; + Result := True; + end else if Name = n_y0 then begin + y0 := Value; + Result := True; + end else if Name = n_z0 then begin + z0 := Value; + Result := True; + end else if Name = n_invert then begin + if (Value > 1) then Value := 1; + if (Value < 0) then Value := 0; + invert := Round(Value); + Result := True; + end else if Name = n_blurtype then begin + if (Value > 2) then Value := 2; + if (Value < 0) then Value := 0; + blurtype := Round(Value); + Result := True; + end +end; +function TVariationPostFalloff2.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = n_scatter then begin + scatter := 1; + Result := True; + end else if Name = n_mindist then begin + mindist := 0.5; + Result := True; + end else if Name = n_mul_x then begin + mul_x := 1; + Result := True; + end else if Name = n_mul_y then begin + mul_y := 1; + Result := True; + end else if Name = n_mul_z then begin + mul_z := 0; + Result := True; + end else if Name = n_mul_c then begin + mul_c := 0; + Result := True; + end else if Name = n_x0 then begin + x0 := 0; + Result := True; + end else if Name = n_y0 then begin + y0 := 0; + Result := True; + end else if Name = n_z0 then begin + z0 := 0; + Result := True; + end else if Name = n_invert then begin + invert := 0; + Result := True; + end else if Name = n_blurtype then begin + blurtype := 0; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPostFalloff2.GetNrVariables: integer; +begin + Result := 11 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPostFalloff2.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = n_scatter then begin + Value := scatter; + Result := True; + end else if Name = n_mindist then begin + Value := mindist; + Result := True; + end else if Name = n_mul_x then begin + Value := mul_x; + Result := True; + end else if Name = n_mul_y then begin + Value := mul_y; + Result := True; + end else if Name = n_mul_z then begin + Value := mul_z; + Result := True; + end else if Name = n_mul_c then begin + Value := mul_c; + Result := True; + end else if Name = n_x0 then begin + Value := x0; + Result := True; + end else if Name = n_y0 then begin + Value := y0; + Result := True; + end else if Name = n_z0 then begin + Value := z0; + Result := True; + end else if Name = n_invert then begin + Value := invert; + Result := True; + end else if Name = n_blurtype then begin + Value := blurtype; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationPostFalloff2), true, true); +end. \ No newline at end of file diff --git a/Variations/varPostSinusoidal.pas b/Variations/varPostSinusoidal.pas new file mode 100644 index 0000000..bd3bcce --- /dev/null +++ b/Variations/varPostSinusoidal.pas @@ -0,0 +1,162 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit varPostSinusoidal; + +interface + +uses + BaseVariation, XFormMan; + + {$ifdef Apo7X64} +{$else} + {$define _ASM_} +{$endif} + +type + TVariationPostSinusoidal = class(TBaseVariation) + private + use3D: byte; + procedure CalcFlat; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + + procedure CalcFunction; override; + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + +implementation + +uses + Math; + +{ TVariationPostSinusoidal } + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationPostSinusoidal.GetCalcFunction(var f: TCalcFunction); +begin + if use3D = 0 then + f := CalcFlat + else f := CalcFunction; +end; + +procedure TVariationPostSinusoidal.CalcFlat; +{$ifndef _ASM_} +begin + FPx^ := vvar * sin(FPx^); + FPy^ := vvar * sin(FPy^); +{$else} +asm // AV: added inline asm code + fld qword ptr [eax + vvar] + mov edx, [eax + FTx] + fld qword ptr [edx + 16] // FPx + fsin + fmul st, st(1) + fstp qword ptr [edx + 16] + + fld qword ptr [edx + 24] // FPy + fsin + fmulp + fstp qword ptr [edx + 24] + + fwait +{$endif} +end; + +procedure TVariationPostSinusoidal.CalcFunction; +{$ifndef _ASM_} +begin + FPx^ := vvar * sin(FPx^); + FPy^ := vvar * sin(FPy^); + FPz^ := vvar * sin(FPz^); // AV: changed from linear scale +{$else} +asm // AV: added inline asm code + fld qword ptr [eax + vvar] + mov edx, [eax + FTx] + fld qword ptr [edx + 16] // FPx + fsin + fmul st, st(1) + fstp qword ptr [edx + 16] + + fld qword ptr [edx + 24] // FPy + fsin + fmul st, st(1) + fstp qword ptr [edx + 24] + + fld qword ptr [edx + 40] // FPz + fsin + fmulp + fstp qword ptr [edx + 40] + + fwait +{$endif} +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationPostSinusoidal.Create; +begin + use3D := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPostSinusoidal.GetInstance: TBaseVariation; +begin + Result := TVariationPostSinusoidal.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPostSinusoidal.GetName: string; +begin + Result := 'post_sinusoidal'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPostSinusoidal.GetVariableNameAt(const Index: integer): string; +begin + case Index of + 0: Result := 'post_sinusoidal_use3D'; + else + Result := ''; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPostSinusoidal.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'post_sinusoidal_use3D' then begin + if (Value > 1) then Value := 1; + if (Value < 0) then Value := 0; + use3D := Round(Value); + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPostSinusoidal.GetNrVariables: integer; +begin + Result := 1; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPostSinusoidal.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'post_sinusoidal_use3D' then begin + Value := use3D; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationPostSinusoidal), true, false); +end. diff --git a/Variations/varPostSpherical.pas b/Variations/varPostSpherical.pas new file mode 100644 index 0000000..4b578ff --- /dev/null +++ b/Variations/varPostSpherical.pas @@ -0,0 +1,80 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varPostSpherical; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationPostSpherical = class(TBaseVariation) + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +{ TVariationPostSpherical } + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationPostSpherical.CalcFunction; +var r: double; +begin + r := vvar / (sqr(FPx^) + sqr(FPy^) + 10e-300); + FPx^ := FPx^ * r; + FPy^ := FPy^ * r; + // FPz^ := VVAR * FPz^; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationPostSpherical.Create; +begin +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPostSpherical.GetInstance: TBaseVariation; +begin + Result := TVariationPostSpherical.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPostSpherical.GetName: string; +begin + Result := 'post_spherical'; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationPostSpherical), false, false); +end. diff --git a/Variations/varPower.pas b/Variations/varPower.pas new file mode 100644 index 0000000..dc2aa40 --- /dev/null +++ b/Variations/varPower.pas @@ -0,0 +1,61 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit varPower; + +interface +uses + BaseVariation, XFormMan; + +type + TVariationPower = class(TBaseVariation) + private + + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + procedure CalcFunction; override; + end; + + +implementation + +uses + Math; + +//////////////////////// + +procedure TVariationPower.CalcFunction; +var + r, FLength, FSinA, FCosA: double; +begin + FLength := sqrt(sqr(FTx^) + sqr(FTy^)) + 1E-300; + FSinA := FTx^ / FLength; + FCosA := FTy^ / FLength; + r := vvar * Math.Power(FLength, FSinA); + FPx^ := FPx^ + r * FCosA; + FPy^ := FPy^ + r * FSinA; +end; + +constructor TVariationPower.Create; +begin + inherited Create; +end; + +class function TVariationPower.GetInstance: TBaseVariation; +begin + Result := TVariationPower.Create; +end; + +class function TVariationPower.GetName: string; +begin + Result := 'power'; +end; + +////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationPower), false, false); + +end. diff --git a/Variations/varPreBoarders2.pas b/Variations/varPreBoarders2.pas new file mode 100644 index 0000000..0abed2e --- /dev/null +++ b/Variations/varPreBoarders2.pas @@ -0,0 +1,188 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit varPreBoarders2; + +interface + +uses + BaseVariation, XFormMan; + +const + sb2c = 'pre_boarders2_c'; + sleft = 'pre_boarders2_left'; + sright = 'pre_boarders2_right'; + eps: double = 1e-30; +type + TVariationPreBoarders2 = class(TBaseVariation) + private + b2c, left, right, cc, cl, cr: double; + + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +{ TVariationPreBoarders2 } + +////////////////////////////////////////// +procedure TVariationPreBoarders2.Prepare; +begin + cc := abs(b2c); + cl := cc * abs(left); + cr := cc + (cc * abs(right)); +end; + +////////////////////////////////////////// +procedure TVariationPreBoarders2.CalcFunction; +var + roundX, roundY, offsetX, offsetY: double; +begin + roundX := round(FTx^); + roundY := round(FTy^); + offsetX := FTx^ - roundX; + offsetY := FTy^ - roundY; + + if (random >= cr) then + begin + FTx^ := VVAR * (offsetX * cc + roundX); + FTy^ := VVAR * (offsetY * cc + roundY); + end + else begin + if (abs(offsetX) >= abs(offsetY)) then + begin + if(offsetX >= 0.0) then + begin + FTx^ := VVAR * (offsetX * cc + roundX + cl); + FTy^ := VVAR * (offsetY * cc + roundY + cl * offsetY / offsetX); + end + else begin + FTx^ := VVAR * (offsetX * cc + roundX - cl); + FTy^ := VVAR * (offsetY * cc + roundY - cl * offsetY / offsetX); + end; + end + else begin + if(offsetY >= 0.0) then + begin + FTy^ := VVAR * (offsetY * cc + roundY + cl); + FTx^ := VVAR * (offsetX * cc + roundX + offsetX / offsetY * cl); + end + else begin + FTy^ := VVAR * (offsetY * cc + roundY - cl); + FTx^ := VVAR * (offsetX * cc + roundX - offsetX / offsetY * cl); + end; + end; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// + +constructor TVariationPreBoarders2.Create; +begin + b2c := 0.5; + left := 0.5; + right := 0.5; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPreBoarders2.GetInstance: TBaseVariation; +begin + Result := TVariationPreBoarders2.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPreBoarders2.GetName: string; +begin + Result := 'pre_boarders2'; +end; + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +function TVariationPreBoarders2.GetVariableNameAt(const Index: integer): string; +begin + case Index of + 0: Result := sb2c; + 1: Result := sleft; + 2: Result := sright; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPreBoarders2.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = sb2c then begin + if abs(value) = 0 then value := eps; + b2c := value; + Result := True; + end else if Name = sleft then begin + if abs(value) = 0 then value := eps; + left := Value; + Result := True; + end else if Name = sright then begin + if abs(value) = 0 then value := eps; + right := Value; + Result := True; + end; +end; + +function TVariationPreBoarders2.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = sb2c then begin + b2c := 0.5; + Result := True; + end else if Name = sleft then begin + left := 0.5; + Result := True; + end else if Name = sright then begin + right := 0.5; + Result := True; + end; +end; + +///////////////////////////////////////////////////////////////////// + +function TVariationPreBoarders2.GetNrVariables: integer; +begin + Result := 3; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPreBoarders2.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = sb2c then begin + Value := b2c; + Result := True; + end else if Name = sleft then begin + Value := left; + Result := True; + end else if Name = sright then begin + Value := right; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationPreBoarders2), false, false); +end. \ No newline at end of file diff --git a/Variations/varPreBwraps.pas b/Variations/varPreBwraps.pas new file mode 100644 index 0000000..60fe3a7 --- /dev/null +++ b/Variations/varPreBwraps.pas @@ -0,0 +1,227 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varPreBwraps; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationPreBwraps = class(TBaseVariation) + private + pre_bwraps_cellsize, pre_bwraps_space, pre_bwraps_gain, + pre_bwraps_inner_twist, pre_bwraps_outer_twist, + g2, r2, rfactor: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationPreBwraps.Prepare; +var + max_bubble, radius: double; +begin + radius := 0.5 * (pre_bwraps_cellsize / (1.0 + sqr(pre_bwraps_space))); + g2 := sqr(pre_bwraps_gain) / (radius + 1e-6) + 1e-6; + max_bubble := g2 * radius; + + if (max_bubble > 2.0) then max_bubble := 1.0 + else max_bubble := max_bubble * (1.0 / (sqr(max_bubble)/4.0 + 1.0)); + + r2 := sqr(radius); + rfactor := radius / max_bubble; +end; + +procedure TVariationPreBwraps.CalcFunction; +var + Vx, Vy, + Cx, Cy, + Lx, Ly, + r, theta, s, c : double; +begin + Vx := FTx^; + Vy := FTy^; + + if (pre_bwraps_cellsize <> 0.0) then + begin + Cx := (floor(Vx / pre_bwraps_cellsize) + 0.5) * pre_bwraps_cellsize; + Cy := (floor(Vy / pre_bwraps_cellsize) + 0.5) * pre_bwraps_cellsize; + + Lx := Vx - Cx; + Ly := Vy - Cy; + + if ((sqr(Lx) + sqr(Ly)) <= r2) then + begin + Lx := Lx * g2; + Ly := Ly * g2; + + r := rfactor / ((sqr(Lx) + sqr(Ly)) / 4.0 + 1); + + Lx := Lx * r; + Ly := Ly * r; + + r := (sqr(Lx) + sqr(Ly)) / r2; + theta := pre_bwraps_inner_twist * (1.0 - r) + pre_bwraps_outer_twist * r; + SinCos(theta, s, c); + + Vx := Cx + c * Lx + s * Ly; + Vy := Cy - s * Lx + c * Ly; + + FTx^ := VVAR * Vx; + FTy^ := VVAR * Vy; + FTz^ := VVAR * FTz^; + end; + end; + +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationPreBwraps.Create; +begin + pre_bwraps_cellsize := 1; + pre_bwraps_space := 0; + pre_bwraps_gain := 1; + pre_bwraps_inner_twist := 0; + pre_bwraps_outer_twist := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPreBwraps.GetInstance: TBaseVariation; +begin + Result := TVariationPreBwraps.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPreBwraps.GetName: string; +begin + Result := 'pre_bwraps'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPreBwraps.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'pre_bwraps_cellsize'; + 1: Result := 'pre_bwraps_space'; + 2: Result := 'pre_bwraps_gain'; + 3: Result := 'pre_bwraps_inner_twist'; + 4: Result := 'pre_bwraps_outer_twist'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPreBwraps.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'pre_bwraps_cellsize' then begin + pre_bwraps_cellsize := Value; + Result := True; + end else if Name = 'pre_bwraps_space' then begin + pre_bwraps_space := Value; + Result := True; + end else if Name = 'pre_bwraps_gain' then begin + pre_bwraps_gain := Value; + Result := True; + end else if Name = 'pre_bwraps_inner_twist' then begin + pre_bwraps_inner_twist := Value; + Result := True; + end else if Name = 'pre_bwraps_outer_twist' then begin + pre_bwraps_outer_twist := Value; + Result := True; + end +end; +function TVariationPreBwraps.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'pre_bwraps_cellsize' then begin + pre_bwraps_cellsize := 1; + Result := True; + end else if Name = 'pre_bwraps_space' then begin + pre_bwraps_space := 0; + Result := True; + end else if Name = 'pre_bwraps_gain' then begin + pre_bwraps_gain := 1; + Result := True; + end else if Name = 'pre_bwraps_inner_twist' then begin + pre_bwraps_inner_twist := 0; + Result := True; + end else if Name = 'pre_bwraps_outer_twist' then begin + pre_bwraps_outer_twist := 0; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPreBwraps.GetNrVariables: integer; +begin + Result := 5 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPreBwraps.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'pre_bwraps_cellsize' then begin + if Value = 0 then Value := 1e-6; + Value := pre_bwraps_cellsize; + Result := True; + end else if Name = 'pre_bwraps_space' then begin + Value := pre_bwraps_space; + Result := True; + end else if Name = 'pre_bwraps_gain' then begin + Value := pre_bwraps_gain; + Result := True; + end else if Name = 'pre_bwraps_inner_twist' then begin + Value := pre_bwraps_inner_twist; + Result := True; + end else if Name = 'pre_bwraps_outer_twist' then begin + Value := pre_bwraps_outer_twist; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationPreBwraps), true, false); +end. \ No newline at end of file diff --git a/Variations/varPreCircleCrop.pas b/Variations/varPreCircleCrop.pas new file mode 100644 index 0000000..c4f6f98 --- /dev/null +++ b/Variations/varPreCircleCrop.pas @@ -0,0 +1,202 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit varPreCircleCrop; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationPreCircleCrop = class(TBaseVariation) + + const + sx : string = 'pre_circlecrop_x'; + sy : string = 'pre_circlecrop_y'; + sradius : string = 'pre_circlecrop_radius'; + szero : string = 'pre_circlecrop_zero'; + sarea : string = 'pre_circlecrop_scatter_area'; + private + x0, y0, radius, scatter_area, ca: double; + zero: byte; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + + +implementation +uses + Math; + +{ TVariationPreCircleCrop } + +////////////////////////////////////////// + +procedure TVariationPreCircleCrop.Prepare; +begin + ca := max(-1.0, min(scatter_area, 1.0)); +end; + +procedure TVariationPreCircleCrop.CalcFunction; +var + x, y, rad, ang, rdc, sn, cn: double; +begin + x := FTx^ - x0; + y := FTy^ - y0; + rad := Hypot(x, y); + + if (rad > radius) then + begin + if (zero = 1) then + begin + FTx^ := 0; + FTy^ := 0; + end else + begin + ang := arctan2(y, x); + SinCos(ang, sn, cn); + rdc := radius + (random * 0.5 * ca); + + FTx^ := vvar * rdc * cn + x0; + FTy^ := vvar * rdc * sn + y0; + end; + end else + begin + FTx^ := vvar * x + x0; + FTy^ := vvar * y + y0; + end; +end; + +constructor TVariationPreCircleCrop.Create; +begin + x0 := 0; + y0 := 0; + radius := 1; + scatter_area := 0; + zero := 0; +end; + +class function TVariationPreCircleCrop.GetInstance: TBaseVariation; +begin + Result := TVariationPreCircleCrop.Create; +end; + +class function TVariationPreCircleCrop.GetName: string; +begin + Result := 'pre_circlecrop'; +end; + +function TVariationPreCircleCrop.GetNrVariables: integer; +begin + Result := 5; +end; + +function TVariationPreCircleCrop.GetVariable(const Name: string; + var value: double): boolean; +begin + Result := False; + if Name = sx then begin + Value := x0; + Result := True; + end + else if Name = sy then begin + Value := y0; + Result := True; + end + else if Name = sradius then begin + Value := radius; + Result := True; + end + else if Name = sarea then begin + Value := scatter_area; + Result := True; + end + else if Name = szero then begin + Value := zero; + Result := True; + end; +end; + +function TVariationPreCircleCrop.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := sradius; + 1: Result := sx; + 2: Result := sy; + 3: Result := sarea; + 4: Result := szero; + else + Result := ''; + end; +end; + +function TVariationPreCircleCrop.ResetVariable(const Name: string): boolean; +begin +Result := False; + if Name = sx then begin + x0 := 0; + Result := True; + end + else if Name = sy then begin + y0 := 0; + Result := True; + end + else if Name = sradius then begin + radius := 1; + Result := True; + end + else if Name = sarea then begin + scatter_area := 0; + Result := True; + end + else if Name = szero then begin + zero := 0; + Result := True; + end; +end; + +function TVariationPreCircleCrop.SetVariable(const Name: string; + var value: double): boolean; +begin +Result := False; + if Name = sx then begin + x0 := Value; + Result := True; + end + else if Name = sy then begin + y0 := Value; + Result := True; + end + else if Name = sradius then begin + radius := Value; + Result := True; + end + else if Name = sarea then begin + scatter_area := Value; + Result := True; + end + else if Name = szero then begin + if Value < 0 then Value := 0; + if Value > 1 then Value := 1; + zero := Round(Value); + Result := True; + end; +end; +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationPreCircleCrop), false, false); + +end. diff --git a/Variations/varPreCrop.pas b/Variations/varPreCrop.pas new file mode 100644 index 0000000..1ce74fc --- /dev/null +++ b/Variations/varPreCrop.pas @@ -0,0 +1,311 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varPreCrop; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationPreCrop = class(TBaseVariation) + const + n_x0 : string = 'pre_crop_left'; + n_y0 : string = 'pre_crop_top'; + n_x1 : string = 'pre_crop_right'; + n_y1 : string = 'pre_crop_bottom'; + n_s : string = 'pre_crop_scatter_area'; + n_z : string = 'pre_crop_zero'; + n : string = 'pre_crop'; + n_z1 : string = 'pre_crop_high'; // AV + n_z0 : string = 'pre_crop_low'; //AV + n_3D : string = 'pre_crop_use3D'; // AV + private + x0, y0, x1, y1, z0, z1, s, w, h, l: double; + _x0, _y0, _x1, _y1, _z0, _z1: double; + z, c3D: byte; + + procedure Calc2D; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationPreCrop.Prepare; +begin + if (x0 < x1) then begin + _x0 := x0; + _x1 := x1; + end else begin + _x0 := x1; + _x1 := x0; + end; + + if (y0 < y1) then begin + _y0 := y0; + _y1 := y1; + end else begin + _y0 := y1; + _y1 := y0; + end; + + if (z0 < z1) then begin + _z0 := z0; + _z1 := z1; + end else begin + _z0 := z1; + _z1 := z0; + end; + + w := (_x1 - _x0) * 0.5 * s; + h := (_y1 - _y0) * 0.5 * s; + l := (_z1 - _z0) * 0.5 * s; +end; + +///////////////////////////////////////////////// +procedure TVariationPreCrop.GetCalcFunction(var f: TCalcFunction); +begin + if (c3D = 0) then f := Calc2D + else f := CalcFunction; +end; + +//////////////////////////////////////////////////////// + +procedure TVariationPreCrop.CalcFunction; +var x, y, tz: double; +begin + x := FTx^; + y := FTy^; + tz := FTz^; + + if ((x < _x0) or (x > _x1) or (y < _y0) or (y > _y1) or (tz < _z0) or (tz > _z1)) + and (z <> 0) then begin + x := 0; y := 0; tz := 0; + end else begin + if x < _x0 then x := _x0 + random * w + else if x > _x1 then x := _x1 - random * w; + if y < _y0 then y := _y0 + random * h + else if y > _y1 then y := _y1 - random * h; + if tz < _z0 then tz := _z0 + random * l + else if tz > _z1 then tz := _z1 - random * l; + end; + + FTx^ := VVAR * x; + FTy^ := VVAR * y; + FTz^ := VVAR * tz; +end; + +procedure TVariationPreCrop.Calc2D; +var x, y: double; +begin + x := FTx^; + y := FTy^; + + if ((x < _x0) or (x > _x1) or (y < _y0) or (y > _y1)) and (z <> 0) then begin + x := 0; y := 0; + end else begin + if x < _x0 then x := _x0 + random * w + else if x > _x1 then x := _x1 - random * w; + if y < _y0 then y := _y0 + random * h + else if y > _y1 then y := _y1 - random * h; + end; + + FTx^ := VVAR * x; + FTy^ := VVAR * y; +end; +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationPreCrop.Create; +begin + x0 := -1; x1 := 1; + y0 := -1; y1 := 1; + z0 := -1; z1 := 1; + c3D := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPreCrop.GetInstance: TBaseVariation; +begin + Result := TVariationPreCrop.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPreCrop.GetName: string; +begin + Result := n; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPreCrop.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := n_x0; + 1: Result := n_y0; + 2: Result := n_x1; + 3: Result := n_y1; + 4: Result := n_z0; + 5: Result := n_z1; + 6: Result := n_s; + 7: Result := n_z; + 8: Result := n_3D; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPreCrop.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = n_x0 then begin + x0 := Value; + Result := True; + end else if Name = n_y0 then begin + y0 := Value; + Result := True; + end else if Name = n_x1 then begin + x1 := Value; + Result := True; + end else if Name = n_y1 then begin + y1 := Value; + Result := True; + end else if Name = n_z0 then begin + z0 := Value; + Result := True; + end else if Name = n_z1 then begin + z1 := Value; + Result := True; + end else if Name = n_s then begin + if (Value < -1) then Value := -1; + if (Value > 1) then Value := 1; + s := Value; + Result := True; + end else if Name = n_z then begin + if (Value > 1) then Value := 1; + if (Value < 0) then Value := 0; + z := Round(Value); + Result := True; + end else if Name = n_3D then begin + if (Value > 1) then Value := 1; + if (Value < 0) then Value := 0; + c3D := Round(Value); + Result := True; + end +end; +function TVariationPreCrop.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = n_x0 then begin + x0 := -1; + Result := True; + end else if Name = n_y0 then begin + y0 := -1; + Result := True; + end else if Name = n_x1 then begin + x1 := 1; + Result := True; + end else if Name = n_y1 then begin + y1 := 1; + Result := True; + end else if Name = n_z0 then begin + z0 := -1; + Result := True; + end else if Name = n_z1 then begin + z1 := 1; + Result := True; + end else if Name = n_s then begin + s := 0; + Result := True; + end else if Name = n_z then begin + z := 0; + Result := True; + end else if Name = n_3D then begin + c3D := 0; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPreCrop.GetNrVariables: integer; +begin + Result := 9 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPreCrop.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = n_x0 then begin + Value := x0; + Result := True; + end else if Name = n_y0 then begin + Value := y0; + Result := True; + end else if Name = n_x1 then begin + Value := x1; + Result := True; + end else if Name = n_y1 then begin + Value := y1; + Result := True; + end else if Name = n_z0 then begin + Value := z0; + Result := True; + end else if Name = n_z1 then begin + Value := z1; + Result := True; + end else if Name = n_s then begin + Value := s; + Result := True; + end else if Name = n_z then begin + Value := z; + Result := True; + end else if Name = n_3D then begin + Value := c3D; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationPreCrop), true, false); +end. \ No newline at end of file diff --git a/Variations/varPreDisc.pas b/Variations/varPreDisc.pas new file mode 100644 index 0000000..c5faa3d --- /dev/null +++ b/Variations/varPreDisc.pas @@ -0,0 +1,120 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varPreDisc; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationPreDisc = class(TBaseVariation) + private + vvar_by_pi: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +{ TVariationPreDisc } + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationPreDisc.Prepare; +begin + vvar_by_pi := vvar / PI; +end; + +procedure TVariationPreDisc.CalcFunction; +var + r, sinr, cosr: double; +begin + SinCos(PI * sqrt(sqr(FTx^) + sqr(FTy^)), sinr, cosr); + r := vvar_by_pi * arctan2(FTx^, FTy^); + FTx^ := sinr * r; + FTy^ := cosr * r; + // FTz^ := VVAR * FTz^; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationPreDisc.Create; +begin +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPreDisc.GetInstance: TBaseVariation; +begin + Result := TVariationPreDisc.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPreDisc.GetName: string; +begin + Result := 'pre_disc'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPreDisc.GetVariableNameAt(const Index: integer): string; +begin + Result := ''; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPreDisc.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPreDisc.GetNrVariables: integer; +begin + Result := 0 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPreDisc.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationPreDisc), false, false); +end. diff --git a/Variations/varPreFalloff2.pas b/Variations/varPreFalloff2.pas new file mode 100644 index 0000000..95247c3 --- /dev/null +++ b/Variations/varPreFalloff2.pas @@ -0,0 +1,348 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varPreFalloff2; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationPreFalloff2 = class(TBaseVariation) + const + n_scatter : string = 'pre_falloff2_scatter'; + n_mindist : string = 'pre_falloff2_mindist'; + n_mul_x : string = 'pre_falloff2_mul_x'; + n_mul_y : string = 'pre_falloff2_mul_y'; + n_mul_z : string = 'pre_falloff2_mul_z'; + n_mul_c : string = 'pre_falloff2_mul_c'; + n_x0 : string = 'pre_falloff2_x0'; + n_y0 : string = 'pre_falloff2_y0'; + n_z0 : string = 'pre_falloff2_z0'; + n_invert : string = 'pre_falloff2_invert'; + n_blurtype : string = 'pre_falloff2_type'; + + private + rmax: double; + x0, y0, z0: double; + scatter, mindist: double; + invert, blurtype: integer; + mul_x, mul_y, mul_z, mul_c: double; + + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + procedure CalcFunctionRadial; + procedure CalcFunctionGaussian; + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationPreFalloff2.Prepare; +begin + rmax := 0.04 * scatter; +end; + +procedure TVariationPreFalloff2.GetCalcFunction(var f: TCalcFunction); +begin + if blurtype = 1 then f := CalcFunctionRadial + else if blurtype = 2 then f := CalcFunctionGaussian + else f := CalcFunction; +end; +procedure TVariationPreFalloff2.CalcFunction; +var + in_x, in_y, in_z, d: double; +begin + in_x := FTx^; + in_y := FTy^; + in_z := FTz^; + + d := sqrt(sqr(in_x - x0) + sqr(in_y - y0) + sqr(in_z - z0)); + if (invert <> 0) then d := 1 - d; if (d < 0) then d := 0; + d := (d - mindist) * rmax; if (d < 0) then d := 0; + + FTx^ := VVAR * (in_x + mul_x * random * d); + FTy^ := VVAR * (in_y + mul_y * random * d); + FTz^ := VVAR * (in_z + mul_z * random * d); + color^ := Abs(Frac(color^ + mul_c * random * d)); +end; +procedure TVariationPreFalloff2.CalcFunctionRadial; +var + in_x, in_y, in_z, d, r_in: double; + sigma, phi, r, sins, coss, sinp, cosp: double; +begin + in_x := FTx^; + in_y := FTy^; + in_z := FTz^; + + r_in := sqrt(sqr(in_x) + sqr(in_y) + sqr(in_z)) + 1e-6; + d := sqrt(sqr(in_x - x0) + sqr(in_y - y0) + sqr(in_z - z0)); + if (invert <> 0) then d := 1 - d; if (d < 0) then d := 0; + d := (d - mindist) * rmax; if (d < 0) then d := 0; + + sigma := ArcSin(in_z / r_in) + mul_z * random * d; + phi := ArcTan2(in_y, in_x) + mul_y * random * d; + r := r_in + mul_x * random * d; + + SinCos(sigma, sins, coss); + SinCos(phi, sinp, cosp); + + FTx^ := VVAR * (r * coss * cosp); + FTy^ := VVAR * (r * coss * sinp); + FTz^ := VVAR * (sins); + color^ := Abs(Frac(color^ + mul_c * random * d)); +end; +procedure TVariationPreFalloff2.CalcFunctionGaussian; +var + in_x, in_y, in_z, d: double; + sigma, phi, r, sins, coss, sinp, cosp: double; +begin + in_x := FTx^; + in_y := FTy^; + in_z := FTz^; + + d := sqrt(sqr(in_x - x0) + sqr(in_y - y0) + sqr(in_z - z0)); + if (invert <> 0) then d := 1 - d; if (d < 0) then d := 0; + d := (d - mindist) * rmax; if (d < 0) then d := 0; + + sigma := d * random * 2 * PI; + phi := d * random * PI; + r := d * random; + + SinCos(sigma, sins, coss); + SinCos(phi, sinp, cosp); + + FTx^ := VVAR * (in_x + mul_x * r * coss * cosp); + FTy^ := VVAR * (in_y + mul_y * r * coss * sinp); + FTz^ := VVAR * (in_z + mul_z * r * sins); + color^ := Abs(Frac(color^ + mul_c * random * d)); +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationPreFalloff2.Create; +begin + scatter := 1; + mindist := 0.5; + mul_x := 1; + mul_y := 1; + mul_z := 0; + mul_c := 0; + x0 := 0; + y0 := 0; + z0 := 0; + invert := 0; + blurtype := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPreFalloff2.GetInstance: TBaseVariation; +begin + Result := TVariationPreFalloff2.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPreFalloff2.GetName: string; +begin + Result := 'pre_falloff2'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPreFalloff2.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := n_scatter; + 1: Result := n_mindist; + 2: Result := n_mul_x; + 3: Result := n_mul_y; + 4: Result := n_mul_z; + 5: Result := n_mul_c; + 6: Result := n_x0; + 7: Result := n_y0; + 8: Result := n_z0; + 9: Result := n_invert; + 10: Result := n_blurtype; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPreFalloff2.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = n_scatter then begin + if Value < 1e-6 then Value := 1e-6; + scatter := Value; + Result := True; + end else if Name = n_mindist then begin + if Value < 0 then Value := 0; + mindist := Value; + Result := True; + end else if Name = n_mul_x then begin + if Value < 0 then Value := 0 + else if Value > 1 then Value := 1; + mul_x := Value; + Result := True; + end else if Name = n_mul_y then begin + if Value < 0 then Value := 0 + else if Value > 1 then Value := 1; + mul_y := Value; + Result := True; + end else if Name = n_mul_z then begin + if Value < 0 then Value := 0 + else if Value > 1 then Value := 1; + mul_z := Value; + Result := True; + end else if Name = n_mul_c then begin + if Value < 0 then Value := 0 + else if Value > 1 then Value := 1; + mul_c := Value; + Result := True; + end else if Name = n_x0 then begin + x0 := Value; + Result := True; + end else if Name = n_y0 then begin + y0 := Value; + Result := True; + end else if Name = n_z0 then begin + z0 := Value; + Result := True; + end else if Name = n_invert then begin + if (Value > 1) then Value := 1; + if (Value < 0) then Value := 0; + invert := Round(Value); + Result := True; + end else if Name = n_blurtype then begin + if (Value > 2) then Value := 2; + if (Value < 0) then Value := 0; + blurtype := Round(Value); + Result := True; + end +end; +function TVariationPreFalloff2.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = n_scatter then begin + scatter := 1; + Result := True; + end else if Name = n_mindist then begin + mindist := 0.5; + Result := True; + end else if Name = n_mul_x then begin + mul_x := 1; + Result := True; + end else if Name = n_mul_y then begin + mul_y := 1; + Result := True; + end else if Name = n_mul_z then begin + mul_z := 0; + Result := True; + end else if Name = n_mul_c then begin + mul_c := 0; + Result := True; + end else if Name = n_x0 then begin + x0 := 0; + Result := True; + end else if Name = n_y0 then begin + y0 := 0; + Result := True; + end else if Name = n_z0 then begin + z0 := 0; + Result := True; + end else if Name = n_invert then begin + invert := 0; + Result := True; + end else if Name = n_blurtype then begin + blurtype := 0; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPreFalloff2.GetNrVariables: integer; +begin + Result := 11 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPreFalloff2.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = n_scatter then begin + Value := scatter; + Result := True; + end else if Name = n_mindist then begin + Value := mindist; + Result := True; + end else if Name = n_mul_x then begin + Value := mul_x; + Result := True; + end else if Name = n_mul_y then begin + Value := mul_y; + Result := True; + end else if Name = n_mul_z then begin + Value := mul_z; + Result := True; + end else if Name = n_mul_c then begin + Value := mul_c; + Result := True; + end else if Name = n_x0 then begin + Value := x0; + Result := True; + end else if Name = n_y0 then begin + Value := y0; + Result := True; + end else if Name = n_z0 then begin + Value := z0; + Result := True; + end else if Name = n_invert then begin + Value := invert; + Result := True; + end else if Name = n_blurtype then begin + Value := blurtype; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationPreFalloff2), true, true); +end. \ No newline at end of file diff --git a/Variations/varPreSinusoidal.pas b/Variations/varPreSinusoidal.pas new file mode 100644 index 0000000..03d7bc6 --- /dev/null +++ b/Variations/varPreSinusoidal.pas @@ -0,0 +1,184 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varPreSinusoidal; + +interface + +uses + BaseVariation, XFormMan; + + {$ifdef Apo7X64} +{$else} + {$define _ASM_} +{$endif} + +type + TVariationPreSinusoidal = class(TBaseVariation) + private + use3D: byte; + procedure CalcFlat; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + + procedure CalcFunction; override; + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + +implementation + +uses + Math; + +{ TVariationPreSinusoidal } + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationPreSinusoidal.GetCalcFunction(var f: TCalcFunction); +begin + if use3D = 0 then + f := CalcFlat + else f := CalcFunction; +end; + +procedure TVariationPreSinusoidal.CalcFlat; +{$ifndef _ASM_} +begin + FTx^ := vvar * sin(FTx^); + FTy^ := vvar * sin(FTy^); +{$else} +asm // AV: added inline asm code + fld qword ptr [eax + vvar] + mov edx, [eax + FTx] + fld qword ptr [edx] // FTx + fsin + fmul st, st(1) + fstp qword ptr [edx] + + fld qword ptr [edx + 8] // FTy + fsin + fmulp + fstp qword ptr [edx + 8] + + fwait +{$endif} +end; + +procedure TVariationPreSinusoidal.CalcFunction; +{$ifndef _ASM_} +begin + FTx^ := vvar * sin(FTx^); + FTy^ := vvar * sin(FTy^); + FTz^ := vvar * sin(FTz^); // AV: changed from linear scale +{$else} +asm // AV: added inline asm code + fld qword ptr [eax + vvar] + mov edx, [eax + FTx] + fld qword ptr [edx] // FTx + fsin + fmul st, st(1) + fstp qword ptr [edx] + + fld qword ptr [edx + 8] // FTy + fsin + fmul st, st(1) + fstp qword ptr [edx + 8] + + fld qword ptr [edx + 32] // FTz + fsin + fmulp + fstp qword ptr [edx + 32] + + fwait +{$endif} +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationPreSinusoidal.Create; +begin + use3D := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPreSinusoidal.GetInstance: TBaseVariation; +begin + Result := TVariationPreSinusoidal.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPreSinusoidal.GetName: string; +begin + Result := 'pre_sinusoidal'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPreSinusoidal.GetVariableNameAt(const Index: integer): string; +begin + case Index of + 0: Result := 'pre_sinusoidal_use3D'; + else + Result := ''; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPreSinusoidal.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'pre_sinusoidal_use3D' then begin + if (Value > 1) then Value := 1; + if (Value < 0) then Value := 0; + use3D := Round(Value); + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPreSinusoidal.GetNrVariables: integer; +begin + Result := 1; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationPreSinusoidal.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'pre_sinusoidal_use3D' then begin + Value := use3D; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationPreSinusoidal), true, false); +end. diff --git a/Variations/varPreSpherical.pas b/Variations/varPreSpherical.pas new file mode 100644 index 0000000..5e5461b --- /dev/null +++ b/Variations/varPreSpherical.pas @@ -0,0 +1,80 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varPreSpherical; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationPreSpherical = class(TBaseVariation) + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +{ TVariationPreSpherical } + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationPreSpherical.CalcFunction; +var r: double; +begin + r := vvar / (sqr(FTx^) + sqr(FTy^) + 10e-300); + FTx^ := FTx^ * r; + FTy^ := FTy^ * r; + // FTz^ := VVAR * FTz^; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationPreSpherical.Create; +begin +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPreSpherical.GetInstance: TBaseVariation; +begin + Result := TVariationPreSpherical.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationPreSpherical.GetName: string; +begin + Result := 'pre_spherical'; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationPreSpherical), false, false); +end. diff --git a/Variations/varProjective.pas b/Variations/varProjective.pas new file mode 100644 index 0000000..30cfef6 --- /dev/null +++ b/Variations/varProjective.pas @@ -0,0 +1,274 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varProjective; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationProjective = class(TBaseVariation) + private + pr_A, pr_B, pr_C, pr_A1, pr_B1, pr_C1, pr_A2, pr_B2, pr_C2: double; + pr_mode: byte; + procedure CalcPre; + procedure CalcPost; + + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure GetCalcFunction(var f: TCalcFunction); override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationProjective.GetCalcFunction(var f: TCalcFunction); +begin + case pr_mode of + 0: f := CalcPre; + 1: f := CalcFunction; + else f := CalcPost; + end; +end; + +procedure TVariationProjective.CalcPost; +var x, y, denom: double; +begin + x := FPx^; + y := FPy^; + + denom := pr_A * x + pr_B * y + pr_C; + if (abs(denom) < 1E-20) then denom := 1E-20; + + FPx^ := VVAR * (pr_A1 * x + pr_B1 * y + pr_C1) / denom; + FPy^ := VVAR * (pr_A2 * x + pr_B2 * y + pr_C2) / denom; + //FPz^ := VVAR * FPz^; +end; + +procedure TVariationProjective.CalcFunction; +var x, y, denom: double; +begin + x := FTx^; + y := FTy^; + + denom := pr_A * x + pr_B * y + pr_C; + if (abs(denom) < 1E-20) then denom := 1E-20; + + FPx^ := FPx^ + VVAR * (pr_A1 * x + pr_B1 * y + pr_C1) / denom; + FPy^ := FPy^ + VVAR * (pr_A2 * x + pr_B2 * y + pr_C2) / denom; + //FPz^ := FPz^ + VVAR * FTz^; +end; + +procedure TVariationProjective.CalcPre; +var x, y, denom: double; +begin + x := FTx^; + y := FTy^; + + denom := pr_A * x + pr_B * y + pr_C; + if (abs(denom) < 1E-20) then denom := 1E-20; + + FTx^ := VVAR * (pr_A1 * x + pr_B1 * y + pr_C1) / denom; + FTy^ := VVAR * (pr_A2 * x + pr_B2 * y + pr_C2) / denom; + //FTz^ := VVAR * FTz^; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationProjective.Create; +begin + pr_A := 0; pr_B := 0; pr_C := 1; // denominator coefs + pr_A1 := 1; pr_B1 := 0; pr_C1 := 0; // x-enumerator coefs + pr_A2 := 0; pr_B2 := 1; pr_C2 := 0; // y-enumerator coefs + pr_mode := 1; // order of applying +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationProjective.GetInstance: TBaseVariation; +begin + Result := TVariationProjective.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationProjective.GetName: string; +begin + Result := 'projective'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationProjective.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'pr_A'; + 1: Result := 'pr_B'; + 2: Result := 'pr_C'; + 3: Result := 'pr_A1'; + 4: Result := 'pr_B1'; + 5: Result := 'pr_C1'; + 6: Result := 'pr_A2'; + 7: Result := 'pr_B2'; + 8: Result := 'pr_C2'; + 9: Result := 'projective_mode'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationProjective.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'pr_A' then begin + pr_A := Value; + Result := True; + end else if Name = 'pr_B' then begin + pr_B := Value; + Result := True; + end else if Name = 'pr_C' then begin + pr_C := Value; + Result := True; + end else if Name = 'pr_A1' then begin + pr_A1 := Value; + Result := True; + end else if Name = 'pr_B1' then begin + pr_B1 := Value; + Result := True; + end else if Name = 'pr_C1' then begin + pr_C1 := Value; + Result := True; + end else if Name = 'pr_A2' then begin + pr_A2 := Value; + Result := True; + end else if Name = 'pr_B2' then begin + pr_B2 := Value; + Result := True; + end else if Name = 'pr_C2' then begin + pr_C2 := Value; + Result := True; + end else if Name = 'projective_mode' then begin + if (Value < 0) then Value := 0; + if (Value > 2) then Value := 2; + pr_mode := Round(Value); + Result := True; + end +end; +function TVariationProjective.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'pr_A' then begin + pr_A := 0; + Result := True; + end else if Name = 'pr_B' then begin + pr_B := 0; + Result := True; + end else if Name = 'pr_C' then begin + pr_C := 1; + Result := True; + end else if Name = 'pr_A1' then begin + pr_A1 := 1; + Result := True; + end else if Name = 'pr_B1' then begin + pr_B1 := 0; + Result := True; + end else if Name = 'pr_C1' then begin + pr_C1 := 0; + Result := True; + end else if Name = 'pr_A2' then begin + pr_A2 := 0; + Result := True; + end else if Name = 'pr_B2' then begin + pr_B2:= 1; + Result := True; + end else if Name = 'pr_C2' then begin + pr_C2 := 0; + Result := True; + end else if Name = 'projective_mode' then begin + pr_mode := 1; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationProjective.GetNrVariables: integer; +begin + Result := 10 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationProjective.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'pr_A' then begin + Value := pr_A; + Result := True; + end else if Name = 'pr_B' then begin + Value := pr_B; + Result := True; + end else if Name = 'pr_C' then begin + Value := pr_C; + Result := True; + end else if Name = 'pr_A1' then begin + Value := pr_A1; + Result := True; + end else if Name = 'pr_B1' then begin + Value := pr_B1; + Result := True; + end else if Name = 'pr_C1' then begin + Value := pr_C1; + Result := True; + end else if Name = 'pr_A2' then begin + Value := pr_A2; + Result := True; + end else if Name = 'pr_B2' then begin + Value := pr_B2; + Result := True; + end else if Name = 'pr_C2' then begin + Value := pr_C2; + Result := True; + end else if Name = 'projective_mode' then begin + Value := pr_mode; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationProjective), false, false); +end. \ No newline at end of file diff --git a/Variations/varRadialBlur.pas b/Variations/varRadialBlur.pas new file mode 100644 index 0000000..c59f960 --- /dev/null +++ b/Variations/varRadialBlur.pas @@ -0,0 +1,372 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varRadialBlur; + +interface + +uses + {$ifdef Apo7X64} +{$else} +AsmRandom, +{$endif} + BaseVariation, XFormMan; + +const + var_name = 'radial_blur'; + var_a_name = 'radial_blur_angle'; + +{$ifdef Apo7X64} +{$else} + {$define _ASM_} +{$endif} + +type + TVariationRadialBlur = class(TBaseVariation) + private + angle, + spin_var, zoom_var: double; + + rnd: array[0..3] of double; + N: integer; + + procedure CalcZoom; + procedure CalcSpin; + + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function GetVariable(const Name: string; var value: double): boolean; override; + function SetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + +implementation + +uses + math; + +// TVariationRadialBlur + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationRadialBlur.Create; +begin + angle := random * 2 - 1; +end; + +procedure TVariationRadialBlur.Prepare; +begin + spin_var := vvar * sin(angle * pi/2); + zoom_var := vvar * cos(angle * pi/2); + + N := 0; + rnd[0] := random; + rnd[1] := random; + rnd[2] := random; + rnd[3] := random; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationRadialBlur.GetCalcFunction(var f: TCalcFunction); +begin + if IsZero(spin_var) then f := CalcZoom + else if IsZero(zoom_var) then f := CalcSpin + else f := CalcFunction; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationRadialBlur.CalcFunction; +{$ifndef _ASM_} +var + rndG, rz, ra: double; + sina, cosa: extended; +begin + rndG := (rnd[0] + rnd[1] + rnd[2] + rnd[3] - 2); + rnd[N] := random; + N := (N+1) and $3; + + ra := sqrt(sqr(FTx^) + sqr(FTy^)); + SinCos(arctan2(FTy^, FTx^) + spin_var * rndG, sina, cosa); + rz := zoom_var * rndG - 1; + + FPx^ := FPx^ + ra * cosa + rz * FTx^; + FPy^ := FPy^ + ra * sina + rz * FTy^; + FPz^ := FPz^ + vvar * FTz^; +{$else} +asm + mov edx, [eax + FTx] + // AV: for Apo7X.15C compatibility + fld qword ptr [eax + vvar] + fmul qword ptr [edx + 32] // FTz + fadd qword ptr [edx + 40] // FPz + fstp qword ptr [edx + 40] + // main code + fld qword ptr [edx + 8] // FTy + fld qword ptr [edx] // FTx + + fld st(1) + fmul st, st + fld st(1) + fmul st, st + faddp + fsqrt + + fld st(2) + fld st(2) + fpatan + + fld qword ptr [eax + rnd] + fadd qword ptr [eax + rnd+8] + fadd qword ptr [eax + rnd+16] + fadd qword ptr [eax + rnd+24] + fld1 + fsub st(1), st + fsub st(1), st + + fld st(1) + fmul qword ptr [eax + zoom_var] + fsubrp + + fmul st(4), st + fmulp st(5), st + + fmul qword ptr [eax + spin_var] + faddp + + call AsmRandExt + mov edx, [eax + N] + fstp qword ptr [eax + rnd + edx*8] + inc edx + and edx,$03 + mov [eax + N], edx + + fsincos + + fmul st, st(2) + faddp st(3), st + fmulp + faddp st(2), st + mov edx, [eax + FPx] + fadd qword ptr [edx] + fstp qword ptr [edx] + fadd qword ptr [edx + 8] + fstp qword ptr [edx + 8] + fwait +{$endif} +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationRadialBlur.CalcZoom; +{$ifndef _ASM_} +var + r: double; +begin + r := zoom_var * (rnd[0] + rnd[1] + rnd[2] + rnd[3] - 2); + + rnd[N] := random; + N := (N+1) and $3; + + FPx^ := FPx^ + r * FTx^; + FPy^ := FPy^ + r * FTy^; + FPz^ := FPz^ + vvar * FTz^; +{$else} +asm + fld qword ptr [eax + rnd] + fadd qword ptr [eax + rnd+8] + fadd qword ptr [eax + rnd+16] + fadd qword ptr [eax + rnd+24] + fld1 + fadd st, st + fsubp st(1), st + fmul qword ptr [eax + zoom_var] + + call AsmRandExt + mov edx, [eax + N] + fstp qword ptr [eax + rnd + edx*8] + inc edx + and edx,$03 + mov [eax + N], edx + + mov edx, [eax + FTx] + // AV: for Apo7X.15C compatibility + fld qword ptr [eax + vvar] + fmul qword ptr [edx + 32] // FTz + fadd qword ptr [edx + 40] // FPz + fstp qword ptr [edx + 40] + // main code + fld qword ptr [edx + 8] // FTy + fld qword ptr [edx] + + fmul st, st(2) + fadd qword ptr [edx + 16] + fstp qword ptr [edx + 16] + fmulp + fadd qword ptr [edx + 24] + fstp qword ptr [edx + 24] + fwait +{$endif} +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationRadialBlur.CalcSpin; +{$ifndef _ASM_} +var + r: double; + sina, cosa: extended; +begin + SinCos(arctan2(FTy^, FTx^) + spin_var * (rnd[0] + rnd[1] + rnd[2] + rnd[3] - 2), + sina, cosa); + r := sqrt(sqr(FTx^) + sqr(FTy^)); + + rnd[N] := random; + N := (N+1) and $3; + + FPx^ := FPx^ + r * cosa - FTx^; + FPy^ := FPy^ + r * sina - FTy^; + FPz^ := FPz^ + vvar * FTz^; + {$else} +asm + mov edx, [eax + FTx] + // AV: for Apo7X.15C compatibility + fld qword ptr [eax + vvar] + fmul qword ptr [edx + 32] // FTz + fadd qword ptr [edx + 40] // FPz + fstp qword ptr [edx + 40] + + // main code + fld qword ptr [edx + 8] + fld qword ptr [edx] + fld st(1) + fld st(1) + fpatan + + fld qword ptr [eax + rnd] + fadd qword ptr [eax + rnd+8] + fadd qword ptr [eax + rnd+16] + fadd qword ptr [eax + rnd+24] + fld1 + fadd st, st + fsubp st(1), st + fmul qword ptr [eax + spin_var] + + call AsmRandExt + mov edx, [eax + N] + fstp qword ptr [eax + rnd + edx*8] + inc edx + and edx,$03 + mov [eax + N], edx + + faddp + fsincos + + fld st(3) + fmul st,st + fld st(3) + fmul st,st + faddp + fsqrt + fmul st(2), st + fmulp st(1), st + mov edx, [eax + FPx] + fadd qword ptr [edx] + fsubrp st(2),st + + fadd qword ptr [edx + 8] + fsubrp st(2), st + fstp qword ptr [edx] + fstp qword ptr [edx + 8] + fwait +{$endif} +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationRadialBlur.GetInstance: TBaseVariation; +begin + Result := TVariationRadialBlur.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationRadialBlur.GetName: string; +begin + Result := var_name; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationRadialBlur.GetVariableNameAt(const Index: integer): string; +begin + case Index of + 0: Result := var_a_name; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationRadialBlur.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = var_a_name then begin + Value := angle; + Result := true; + end; +end; + +function TVariationRadialBlur.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = var_a_name then begin + angle := Value; + Result := True; + end; +end; + +function TVariationRadialBlur.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = var_a_name then begin + if angle <> 0 then angle := 0 + else if angle = 0 then angle := 1; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationRadialBlur.GetNrVariables: integer; +begin + Result := 1; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationRadialBlur), true, false); +end. diff --git a/Variations/varRectangles.pas b/Variations/varRectangles.pas new file mode 100644 index 0000000..e7678ad --- /dev/null +++ b/Variations/varRectangles.pas @@ -0,0 +1,220 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} +{ + This variation was started by Michael Faber +} + +unit varRectangles; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationRectangles = class(TBaseVariation) + private + FRectanglesX, FRectanglesY, FRectanglesZ: double; + r3D: byte; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + + procedure GetCalcFunction(var f: TCalcFunction); override; + procedure CalcFunction; override; + procedure CalcZeroX; + procedure CalcZeroY; + procedure CalcZeroXY; + + end; + +implementation + +uses + Math; + +{ TVariationRectangles } + +/////////////////////////////////////////////////////////////////////////////// + +procedure TVariationRectangles.GetCalcFunction(var f: TCalcFunction); +begin + if IsZero(FRectanglesX) then begin + if IsZero(FRectanglesY) then + f := CalcZeroXY + else + f := CalcZeroX; + end + else if IsZero(FRectanglesY) then + f := CalcZeroY + else f := CalcFunction; +end; + +procedure TVariationRectangles.CalcFunction; +begin + FPx^ := FPx^ + vvar * ((2*floor(FTx^/FRectanglesX) + 1)*FRectanglesX - FTx^); + FPy^ := FPy^ + vvar * ((2*floor(FTy^/FRectanglesY) + 1)*FRectanglesY - FTy^); + if (r3D <> 0) then + begin + if IsZero(FRectanglesZ) then + FPz^ := FPz^ + vvar * FTz^ + else + FPz^ := FPz^ + vvar * ((2*floor(FTz^/FRectanglesZ) + 1) * FRectanglesZ - FTz^);; + end; +end; + +procedure TVariationRectangles.CalcZeroX; +begin + FPx^ := FPx^ + vvar * FTx^; + FPy^ := FPy^ + vvar * ((2*floor(FTy^/FRectanglesY) + 1)*FRectanglesY - FTy^); + if (r3D <> 0) then + begin + if IsZero(FRectanglesZ) then + FPz^ := FPz^ + vvar * FTz^ + else + FPz^ := FPz^ + vvar * ((2*floor(FTz^/FRectanglesZ) + 1) * FRectanglesZ - FTz^);; + end; +end; + +procedure TVariationRectangles.CalcZeroY; +begin + FPx^ := FPx^ + vvar * ((2*floor(FTx^/FRectanglesX) + 1)*FRectanglesX - FTx^); + FPy^ := FPy^ + vvar * FTy^; + if (r3D <> 0) then + begin + if IsZero(FRectanglesZ) then + FPz^ := FPz^ + vvar * FTz^ + else + FPz^ := FPz^ + vvar * ((2*floor(FTz^/FRectanglesZ) + 1) * FRectanglesZ - FTz^);; + end; +end; + +procedure TVariationRectangles.CalcZeroXY; +begin + FPx^ := FPx^ + vvar * FTx^; + FPy^ := FPy^ + vvar * FTy^; + if (r3D <> 0) then + begin + if IsZero(FRectanglesZ) then + FPz^ := FPz^ + vvar * FTz^ + else + FPz^ := FPz^ + vvar * ((2*floor(FTz^/FRectanglesZ) + 1) * FRectanglesZ - FTz^);; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationRectangles.GetName: string; +begin + Result := 'rectangles'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationRectangles.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'rectangles_x'; + 1: Result := 'rectangles_y'; + 2: Result := 'rectangles_z'; + 3: Result := 'rectangles_use3D'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationRectangles.GetNrVariables: integer; +begin + Result := 4; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationRectangles.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'rectangles_x' then begin + FRectanglesX := Value; + Result := True; + end else if Name = 'rectangles_y' then begin + FRectanglesY := Value; + Result := True; + end else if Name = 'rectangles_z' then begin + FRectanglesZ := Value; + Result := True; + end else if Name = 'rectangles_use3D' then begin + if (Value > 1) then Value := 1; + if (Value < 0) then Value := 0; + r3D := Round(Value); + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationRectangles.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'rectangles_x' then begin + Value := FRectanglesX; + Result := True; + end else if Name = 'rectangles_y' then begin + Value := FRectanglesY; + Result := True; + end else if Name = 'rectangles_z' then begin + Value := FRectanglesZ; + Result := True; + end else if Name = 'rectangles_use3D' then begin + Value := r3D; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationRectangles.Create; +begin + inherited Create; + + FRectanglesX := 1.0; + FRectanglesY := 1.0; + FRectanglesZ := 0.0; + r3D := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationRectangles.GetInstance: TBaseVariation; +begin + Result := TVariationRectangles.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationRectangles), true, false); +end. + diff --git a/Variations/varRings2.pas b/Variations/varRings2.pas new file mode 100644 index 0000000..5e47bc0 --- /dev/null +++ b/Variations/varRings2.pas @@ -0,0 +1,180 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varRings2; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationRings2 = class(TBaseVariation) + private + FVal, dx: double; + old: byte; + procedure CalcRings; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + +implementation + +uses + Math; + +{ TVariationRings2 } + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationRings2.Prepare; +begin + dx := sqr(FVal) + 1E-10; +end; + +procedure TVariationRings2.GetCalcFunction(var f: TCalcFunction); +begin + if old = 1 then + f := CalcRings + else f := CalcFunction; +end; + +procedure TVariationRings2.CalcRings; +var + r: double; + Length: double; +begin + Length := sqrt(sqr(FTx^) + sqr(FTy^)) + 1E-300; // AV: avoid division by zero + + r := vvar * (2 - dx * (System.Int((Length/dx + 1)/2) * 2 / Length + 1)); + + // AV: conversion into 'rings', which swaps X and Y + FPx^ := FPx^ + r * FTy^; + FPy^ := FPy^ + r * FTx^; +end; + +procedure TVariationRings2.CalcFunction; +var + r: double; + Length: double; +begin + Length := sqrt(sqr(FTx^) + sqr(FTy^)) + 1E-300; // AV: avoid division by zero +{ // all this range-checking crap only slows us down... + if (FTx^ < -EPS) or (FTx^ > EPS) or (FTy^ < -EPS) or (FTy^ > EPS) then + Angle := arctan2(FTx^, FTy^) + else + Angle := 0.0; +} // ...and besides, we don't need arctan() if we have Length! + +// dx := sqr(FVal) + EPS; - we can precalc it!!! +// r := Length + dx - System.Int((Length + dx)/(2 * dx)) * 2 * dx - dx + Length * (1-dx); +// ^^^^......he he, lots of useless calculations......^^^^ + r := vvar * (2 - dx * (System.Int((Length/dx + 1)/2) * 2 / Length + 1)); + + FPx^ := FPx^ + r * FTx^; + FPy^ := FPy^ + r * FTy^; + FPz^ := FPz^ + vvar * FTz^; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationRings2.Create; +begin + FVal := Random * 2; + old := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationRings2.GetInstance: TBaseVariation; +begin + Result := TVariationRings2.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationRings2.GetName: string; +begin + Result := 'rings2'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationRings2.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'rings2_val'; + 1: Result := 'rings2_old'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationRings2.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'rings2_val' then begin + FVal := Value; + Result := True; + end else if Name = 'rings2_old' then begin + if (Value < 0) then Value := 0; + if (Value > 1) then Value := 1; + old := Round(Value); + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationRings2.GetNrVariables: integer; +begin + Result := 2 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationRings2.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'rings2_val' then begin + Value := FVal; + Result := True; + end else if Name = 'rings2_old' then begin + Value := old; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationRings2), true, false); +end. diff --git a/Variations/varScry.pas b/Variations/varScry.pas new file mode 100644 index 0000000..cb696a9 --- /dev/null +++ b/Variations/varScry.pas @@ -0,0 +1,127 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varScry; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationScry = class(TBaseVariation) + private + v: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationScry.Prepare; +begin + if (VVAR = 0) then + v := 1.0 / 1e-6 + else v := 1.0 / vvar; +end; + +procedure TVariationScry.CalcFunction; +var t, r : double; +begin + t := sqr(FTx^) + sqr(FTy^); + r := 1.0 / (sqrt(t) * (t + v)); + + FPx^ := FPx^ + FTx^ * r; + FPy^ := FPy^ + FTy^ * r; + + FPz^ := FPz^ + vvar * FTz^; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationScry.Create; +begin + v := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationScry.GetInstance: TBaseVariation; +begin + Result := TVariationScry.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationScry.GetName: string; +begin + Result := 'scry'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationScry.GetVariableNameAt(const Index: integer): string; +begin + Result := ''; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationScry.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; +end; + +function TVariationScry.ResetVariable(const Name: string): boolean; +begin + Result := False; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationScry.GetNrVariables: integer; +begin + Result := 0 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationScry.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationScry), true, false); +end. \ No newline at end of file diff --git a/Variations/varSecant.pas b/Variations/varSecant.pas new file mode 100644 index 0000000..f7f4a02 --- /dev/null +++ b/Variations/varSecant.pas @@ -0,0 +1,133 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit varSecant; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationSecant = class(TBaseVariation) + private + old: byte; + procedure CalcSecant2; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + + procedure CalcFunction; override; + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + +implementation + +uses + Math; + +{ TVariationSecant } + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationSecant.Create; +begin + old := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationSecant.GetCalcFunction(var f: TCalcFunction); +begin + if old = 1 then f := CalcFunction + else f := CalcSecant2; +end; + +/////////////////////////////////////////////////////////////////////////////// + +procedure TVariationSecant.CalcFunction; +var + r: double; +begin + r := sqrt(sqr(FTx^) + sqr(FTy^)) * vvar; + r := cos(r); + if (r = 0) then exit; + FPx^ := FPx^ + FTx^ * vvar; + FPy^ := FPy^ + 1 / r; +end; + +procedure TVariationSecant.CalcSecant2; +var + r: double; +begin + r := sqrt(sqr(FTx^) + sqr(FTy^)) * vvar; + r := cos(r); + if (r = 0) then exit; + FPx^ := FPx^ + FTx^ * vvar; + if (r < 0) then + FPy^ := FPy^ + (1 / r + 1) * vvar + else + FPy^ := FPy^ + (1 / r - 1) * vvar; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationSecant.GetInstance: TBaseVariation; +begin + Result := TVariationSecant.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationSecant.GetName: string; +begin + Result := 'secant2'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationSecant.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'secant2_old'; + else + Result := ''; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationSecant.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'secant2_old' then + begin + if Value < 0 then Value := 0; + if Value > 1 then Value := 1; + old := Round(value); + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationSecant.GetNrVariables: integer; +begin + Result := 1; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationSecant.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'secant2_old' then + begin + Value := old; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationSecant), false, false); +end. diff --git a/Variations/varSeparation.pas b/Variations/varSeparation.pas new file mode 100644 index 0000000..9fb427e --- /dev/null +++ b/Variations/varSeparation.pas @@ -0,0 +1,223 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varSeparation; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationSeparation = class(TBaseVariation) + private + separation_x, separation_y, separation_z: double; + separation_xinside, separation_yinside, separation_zinside: double; + sqx, sqy, sqz: double; + s3D: byte; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationSeparation.Prepare; +begin + sqx := sqr(separation_x); + sqy := sqr(separation_y); + sqz := sqr(separation_z); +end; + +///////////////////////////////////////////// +procedure TVariationSeparation.CalcFunction; +begin + if(FTx^ > 0.0) then + FPx^ := FPx^ + VVAR * (sqrt(sqr(FTx^) + sqx)- FTx^ * (separation_xinside)) + else + FPx^ := FPx^ - VVAR * (sqrt(sqr(FTx^) + sqx)+ FTx^ * (separation_xinside)); + + if(FTy^ > 0.0) then + FPy^ := FPy^ + VVAR * (sqrt(sqr(FTy^) + sqy)- FTy^ * (separation_yinside)) + else + FPy^ := FPy^ - VVAR * (sqrt(sqr(FTy^) + sqy)+ FTy^ * (separation_yinside)); + + if (s3D <> 0) then begin + if(FTz^ > 0.0) then + FPz^ := FPz^ + VVAR * (sqrt(sqr(FTz^) + sqz) - FTz^ * (separation_zinside)) + else + FPz^ := FPz^ - VVAR * (sqrt(sqr(FTz^) + sqz) + FTz^ * (separation_zinside)); + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationSeparation.Create; +begin + separation_x := 1; + separation_y := 1; + separation_xinside := 0; + separation_yinside := 0; + separation_z := 0; + separation_zinside := 0; + s3D := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationSeparation.GetInstance: TBaseVariation; +begin + Result := TVariationSeparation.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationSeparation.GetName: string; +begin + Result := 'separation'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationSeparation.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'separation_x'; + 1: Result := 'separation_y'; + 2: Result := 'separation_xinside'; + 3: Result := 'separation_yinside'; + 4: Result := 'separation_z'; + 5: Result := 'separation_zinside'; + 6: Result := 'separation_use3D'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationSeparation.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'separation_x' then begin + separation_x := Value; + Result := True; + end else if Name = 'separation_y' then begin + separation_y := Value; + Result := True; + end else if Name = 'separation_xinside' then begin + separation_xinside := Value; + Result := True; + end else if Name = 'separation_yinside' then begin + separation_yinside := Value; + Result := True; + end else if Name = 'separation_z' then begin + separation_z := Value; + Result := True; + end else if Name = 'separation_zinside' then begin + separation_zinside := Value; + Result := True; + end else if Name = 'separation_use3D' then begin + if (Value > 1) then Value := 1; + if (Value < 0) then Value := 0; + s3D := Round(Value); + Result := True; + end +end; +function TVariationSeparation.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'separation_x' then begin + separation_x := 1; + Result := True; + end else if Name = 'separation_y' then begin + separation_y := 1; + Result := True; + end else if Name = 'separation_xinside' then begin + separation_xinside := 0; + Result := True; + end else if Name = 'separation_yinside' then begin + separation_yinside := 0; + Result := True; + end else if Name = 'separation_z' then begin + separation_z := 0; + Result := True; + end else if Name = 'separation_zinside' then begin + separation_zinside := 0; + Result := True; + end else if Name = 'separation_use3D' then begin + s3D := 0; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationSeparation.GetNrVariables: integer; +begin + Result := 7 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationSeparation.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'separation_x' then begin + Value := separation_x; + Result := True; + end else if Name = 'separation_y' then begin + Value := separation_y; + Result := True; + end else if Name = 'separation_xinside' then begin + Value := separation_xinside; + Result := True; + end else if Name = 'separation_yinside' then begin + Value := separation_yinside; + Result := True; + end else if Name = 'separation_z' then begin + Value := separation_z; + Result := True; + end else if Name = 'separation_zinside' then begin + Value := separation_zinside; + Result := True; + end else if Name = 'separation_use3D' then begin + Value := s3D; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationSeparation), true, false); +end. \ No newline at end of file diff --git a/Variations/varSinusoidal.pas b/Variations/varSinusoidal.pas new file mode 100644 index 0000000..fdbcb1a --- /dev/null +++ b/Variations/varSinusoidal.pas @@ -0,0 +1,188 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varSinusoidal; + +interface + +uses + BaseVariation, XFormMan; + + {$ifdef Apo7X64} +{$else} + {$define _ASM_} +{$endif} + +type + TVariationSinusoidal = class(TBaseVariation) + private + use3D: byte; + procedure CalcFlat; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + + procedure CalcFunction; override; + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + +implementation + +uses + Math; + +{ TVariationSinusoidal } + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationSinusoidal.GetCalcFunction(var f: TCalcFunction); +begin + if use3D = 0 then + f := CalcFlat + else f := CalcFunction; +end; + +procedure TVariationSinusoidal.CalcFlat; +{$ifndef _ASM_} +begin + FPx^ := FPx^ + vvar * sin(FTx^); + FPy^ := FPy^ + vvar * sin(FTy^); +{$else} +asm + fld qword ptr [eax + vvar] + mov edx, [eax + FTx] + fld qword ptr [edx] // FTx + fsin + fmul st, st(1) + fadd qword ptr [edx + 16] // FPx + fstp qword ptr [edx + 16] + + fld qword ptr [edx + 8] // FTy + fsin + fmulp + fadd qword ptr [edx + 24] // FPy + fstp qword ptr [edx + 24] + + fwait +{$endif} +end; + +procedure TVariationSinusoidal.CalcFunction; +{$ifndef _ASM_} +begin + FPx^ := FPx^ + vvar * sin(FTx^); + FPy^ := FPy^ + vvar * sin(FTy^); + FPz^ := FPz^ + vvar * sin(FTz^); // AV: changed from linear scale +{$else} +asm // AV: added inline asm code + fld qword ptr [eax + vvar] + mov edx, [eax + FTx] + fld qword ptr [edx] // FTx + fsin + fmul st, st(1) + fadd qword ptr [edx + 16] // FPx + fstp qword ptr [edx + 16] + + fld qword ptr [edx + 8] // FTy + fsin + fmul st, st(1) + fadd qword ptr [edx + 24] // FPy + fstp qword ptr [edx + 24] + + fld qword ptr [edx + 32] // FTz + fsin + fmulp + fadd qword ptr [edx + 40] // FPz + fstp qword ptr [edx + 40] + + fwait +{$endif} +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationSinusoidal.Create; +begin + use3D := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationSinusoidal.GetInstance: TBaseVariation; +begin + Result := TVariationSinusoidal.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationSinusoidal.GetName: string; +begin + Result := 'sinusoidal'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationSinusoidal.GetVariableNameAt(const Index: integer): string; +begin + case Index of + 0: Result := 'sinusoidal_use3D'; + else + Result := ''; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationSinusoidal.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'sinusoidal_use3D' then begin + if (Value > 1) then Value := 1; + if (Value < 0) then Value := 0; + use3D := Round(Value); + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationSinusoidal.GetNrVariables: integer; +begin + Result := 1; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationSinusoidal.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'sinusoidal_use3D' then begin + Value := use3D; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationSinusoidal), true, false); +end. diff --git a/Variations/varSphereCrop.pas b/Variations/varSphereCrop.pas new file mode 100644 index 0000000..8f0d02a --- /dev/null +++ b/Variations/varSphereCrop.pas @@ -0,0 +1,328 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit varSphereCrop; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationSphereCrop = class(TBaseVariation) + + const + sx : string = 'spherecrop_x'; + sy : string = 'spherecrop_y'; + sz : string = 'spherecrop_z'; + sradius : string = 'spherecrop_radius'; + szero : string = 'spherecrop_zero'; + sarea : string = 'spherecrop_scatter_area'; + smode: string = 'spherecrop_mode'; + private + x0, y0, z0, radius, scatter_area, ca: double; + zero, mode: byte; + + procedure CalcPre; + procedure CalcPost; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + + +implementation +uses + Math; + +{ TVariationSphereCrop } + +////////////////////////////////////////// + +procedure TVariationSphereCrop.Prepare; +begin + ca := max(-1.0, min(scatter_area, 1.0)); +end; + +procedure TVariationSphereCrop.GetCalcFunction(var f: TCalcFunction); +begin + case mode of + 0: f := CalcPre; + 1: f := CalcFunction; + else f := CalcPost; + end; +end; + +procedure TVariationSphereCrop.CalcFunction; +var + x, y, z, rad, rdc: double; + ang, phi, sn, cn, sz, cz: double; +begin + x := FTx^ - x0; + y := FTy^ - y0; + z := FTz^ - z0; + rad := Math.Hypot(x, y, z); + + if (rad > radius) then + begin + if (zero = 1) then + begin + FPx^ := FPx^; + FPy^ := FPy^; + FPz^ := FPz^; + end else + begin + ang := arctan2(y, x); + SinCos(ang, sn, cn); + phi := arcsin(z / rad); + SinCos(phi, sz, cz); + rdc := radius + (random * 0.5 * ca); + + FPx^ := FPx^ + vvar * rdc * cn * cz + x0; + FPy^ := FPy^ + vvar * rdc * sn * cz + y0; + FPz^ := FPz^ + vvar * rdc * sz + z0; + end; + end else + begin + FPx^ := FPx^ + vvar * x + x0; + FPy^ := FPy^ + vvar * y + y0; + FPz^ := FPz^ + vvar * z + z0; + end; +end; + +procedure TVariationSphereCrop.CalcPost; +var + x, y, z, rad, rdc: double; + ang, phi, sn, cn, sz, cz: double; +begin + x := FPx^ - x0; + y := FPy^ - y0; + z := FPz^ - z0; + rad := Math.Hypot(x, y, z); + + if (rad > radius) then + begin + if (zero = 1) then + begin + FPx^ := 0; + FPy^ := 0; + FPz^ := 0; + end else + begin + ang := arctan2(y, x); + SinCos(ang, sn, cn); + phi := arcsin(z / rad); + SinCos(phi, sz, cz); + rdc := radius + (random * 0.5 * ca); + + FPx^ := vvar * rdc * cn * cz + x0; + FPy^ := vvar * rdc * sn * cz + y0; + FPz^ := vvar * rdc * sz + z0; + end; + end else + begin + FPx^ := vvar * x + x0; + FPy^ := vvar * y + y0; + FPz^ := vvar * z + z0; + end; +end; + +procedure TVariationSphereCrop.CalcPre; +var + x, y, z, rad, rdc: double; + ang, phi, sn, cn, sz, cz: double; +begin + x := FTx^ - x0; + y := FTy^ - y0; + z := FTz^ - z0; + rad := Math.Hypot(x, y, z); + + if (rad > radius) then + begin + if (zero = 1) then + begin + FTx^ := 0; + FTy^ := 0; + FTz^ := 0; + end else + begin + ang := arctan2(y, x); + SinCos(ang, sn, cn); + phi := arcsin(z / rad); + SinCos(phi, sz, cz); + rdc := radius + (random * 0.5 * ca); + + FTx^ := vvar * rdc * cn * cz + x0; + FTy^ := vvar * rdc * sn * cz + y0; + FTz^ := vvar * rdc * sz + z0; + end; + end else + begin + FTx^ := vvar * x + x0; + FTy^ := vvar * y + y0; + FTz^ := vvar * z + z0; + end; +end; + +constructor TVariationSphereCrop.Create; +begin + x0 := 0; + y0 := 0; + z0 := 0; + radius := 1; + scatter_area := 0; + zero := 0; + mode := 1; +end; + +class function TVariationSphereCrop.GetInstance: TBaseVariation; +begin + Result := TVariationSphereCrop.Create; +end; + +class function TVariationSphereCrop.GetName: string; +begin + Result := 'spherecrop'; +end; + +function TVariationSphereCrop.GetNrVariables: integer; +begin + Result := 7; +end; + +function TVariationSphereCrop.GetVariable(const Name: string; + var value: double): boolean; +begin + Result := False; + if Name = sx then begin + Value := x0; + Result := True; + end + else if Name = sy then begin + Value := y0; + Result := True; + end + else if Name = sz then begin + Value := z0; + Result := True; + end + else if Name = sradius then begin + Value := radius; + Result := True; + end + else if Name = sarea then begin + Value := scatter_area; + Result := True; + end + else if Name = szero then begin + Value := zero; + Result := True; + end + else if Name = smode then begin + Value := mode; + Result := True; + end; +end; + +function TVariationSphereCrop.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := sradius; + 1: Result := sx; + 2: Result := sy; + 3: Result := sz; + 4: Result := sarea; + 5: Result := szero; + 6: Result := smode; + else + Result := ''; + end; +end; + +function TVariationSphereCrop.ResetVariable(const Name: string): boolean; +begin +Result := False; + if Name = sx then begin + x0 := 0; + Result := True; + end + else if Name = sy then begin + y0 := 0; + Result := True; + end + else if Name = sz then begin + z0 := 0; + Result := True; + end + else if Name = sradius then begin + radius := 1; + Result := True; + end + else if Name = sarea then begin + scatter_area := 0; + Result := True; + end + else if Name = szero then begin + zero := 0; + Result := True; + end + else if Name = smode then begin + mode := 1; + Result := True; + end; +end; + +function TVariationSphereCrop.SetVariable(const Name: string; + var value: double): boolean; +begin +Result := False; + if Name = sx then begin + x0 := Value; + Result := True; + end + else if Name = sy then begin + y0 := Value; + Result := True; + end + else if Name = sz then begin + z0 := Value; + Result := True; + end + else if Name = sradius then begin + radius := Value; + Result := True; + end + else if Name = sarea then begin + scatter_area := Value; + Result := True; + end + else if Name = szero then begin + if Value < 0 then Value := 0; + if Value > 1 then Value := 1; + zero := Round(Value); + Result := True; + end + else if Name = smode then begin + if Value < 0 then Value := 0; + if Value > 2 then Value := 2; + mode := Round(Value); + Result := True; + end; +end; +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationSphereCrop), true, false); + +end. diff --git a/Variations/varSphyp3D.pas b/Variations/varSphyp3D.pas new file mode 100644 index 0000000..bdb63e3 --- /dev/null +++ b/Variations/varSphyp3D.pas @@ -0,0 +1,263 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varSphyp3D; + +interface + +uses + BaseVariation, XFormMan; + +const + ssx = 'sphyp3D_stretchX'; + ssy = 'sphyp3D_stretchY'; + ssz = 'sphyp3D_stretchZ'; + szon = 'sphyp3D_zOn'; + + EPS: double = 1E-100; + +type + TVariationSphyp3D = class(TBaseVariation) + private + sx, sy, sz: double; + zon: byte; + + procedure CalcLinear; + procedure CalcSpherical; + procedure CalcHyperbolicX; + procedure CalcHyperbolicY; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure CalcFunction; override; + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + +implementation + +uses + Math; + +{ TVariationSphyp3D } + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationSphyp3D.GetCalcFunction(var f: TCalcFunction); +begin + if (sx = 1) and (sy = 1) and (sz = 1) then f := CalcSpherical + else if (sx = 0) and (sy = 0) and (sz = 0) then f := CalcLinear + else if (sx = 1) and (sy = 0) then f := CalcHyperbolicX + else if (sx = 0) and (sy = 1) then f := CalcHyperbolicY + else f := CalcFunction; +end; + +////////////////////////////////////////// +procedure TVariationSphyp3D.CalcFunction; +var t, rx, ry, rz: double; +begin + t := sqr(FTx^) + sqr(FTy^) + sqr(FTz^) + EPS; + + rx := vvar * power(t, -sx); + ry := vvar * power(t, -sy); + + FPx^ := FPx^ + FTx^ * rx; + FPy^ := FPy^ + FTy^ * ry; + // Optional 3D calculation + if (zon = 1) then begin + rz := vvar * power(t, -sz); + FPz^ := FPz^ + FTz^ * rz; + end; +end; + +////////////////////////////////////////// +procedure TVariationSphyp3D.CalcHyperbolicX; +var t, r: double; +begin + t := sqr(FTx^) + sqr(FTy^) + sqr(FTz^) + EPS; + r := vvar / t; + + FPx^ := FPx^ + FTx^ * r; + FPy^ := FPy^ + FTy^ * vvar; + // Optional 3D calculation + if (zon = 1) then begin + r := vvar * power(t, -sz); + FPz^ := FPz^ + FTz^ * r; + end; +end; +////////////////////////////////////////// +procedure TVariationSphyp3D.CalcHyperbolicY; +var t, r: double; +begin + t := sqr(FTx^) + sqr(FTy^) + sqr(FTz^) + EPS; + r := vvar / t; + + FPx^ := FPx^ + FTx^ * vvar; + FPy^ := FPy^ + FTy^ * r; + // Optional 3D calculation + if (zon = 1) then begin + r := vvar * power(t, -sz); + FPz^ := FPz^ + FTz^ * r; + end; +end; +////////////////////////////////////////// +procedure TVariationSphyp3D.CalcSpherical; // default case +var t: double; +begin + t := sqr(FTx^) + sqr(FTy^) + sqr(FTz^) + EPS; + t := vvar / t; + + FPx^ := FPx^ + FTx^ * t; + FPy^ := FPy^ + FTy^ * t; + // Optional 3D calculation + if (zon = 1) then + FPz^ := FPz^ + FTz^ * t; + +end; + +////////////////////////////////////////// +procedure TVariationSphyp3D.CalcLinear; +begin + + FPx^ := FPx^ + FTx^ * vvar; + FPy^ := FPy^ + FTy^ * vvar; + // Optional 3D calculation + if (zon = 1) then + FPz^ := FPz^ + FTz^ * vvar; +end; +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationSphyp3D.Create; +begin + sx := 1; + sy := 1; + sz := 1; + zon := 1; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationSphyp3D.GetInstance: TBaseVariation; +begin + Result := TVariationSphyp3D.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationSphyp3D.GetName: string; +begin + Result := 'sphyp3D'; +end; + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +function TVariationSphyp3D.GetVariableNameAt(const Index: integer): string; +begin + case Index of + 0: Result := ssx; + 1: Result := ssy; + 2: Result := ssz; + 3: Result := szon; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationSphyp3D.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = ssx then begin + sx := Value; + Result := True; + end + else if Name = ssy then begin + sy := value; + Result := True; + end else if Name = ssz then begin + sz := value; + Result := True; + end else if Name = szon then begin + if (Value > 1) then Value := 1; + if (Value < 0) then Value := 0; + zon := Round(Value); + Result := True; + end; +end; + +function TVariationSphyp3D.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = ssx then begin + sx := 1; + Result := True; + end + else if Name = ssy then begin + sy := 1; + Result := True; + end else if Name = ssz then begin + sz := 1; + Result := True; + end else if Name = szon then begin + zon := IfThen(zon = 0, 1, 0); + Result := True; + end; +end; + +///////////////////////////////////////////////////////////////////// + +function TVariationSphyp3D.GetNrVariables: integer; +begin + Result := 4; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationSphyp3D.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = ssx then begin + Value := sx; + Result := true; + end + else if Name = ssy then begin + Value := sy; + Result := true; + end else if Name = ssz then begin + Value := sz; + Result := true; + end else if Name = szon then begin + Value := zon; + Result := true; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationSphyp3D), true, false); +end. + diff --git a/Variations/varSplits.pas b/Variations/varSplits.pas new file mode 100644 index 0000000..40ee8a4 --- /dev/null +++ b/Variations/varSplits.pas @@ -0,0 +1,163 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varSplits; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationSplits = class(TBaseVariation) + private + splits_x, splits_y, splits_z: double; + splits_use3D: byte; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// + +procedure TVariationSplits.CalcFunction; +begin + if(FTx^ >= 0.0) then + FPx^ := FPx^ + VVAR * (FTx^ + splits_x) + else + FPx^ := FPx^ + VVAR * (FTx^ - splits_x); + + if(FTy^ >= 0.0) then + FPy^ := FPy^ + VVAR * (FTy^ + splits_y) + else + FPy^ := FPy^ + VVAR * (FTy^ - splits_y); + + if (splits_use3D <> 0) then + begin + if(FTz^ >= 0.0) then + FPz^ := FPz^ + VVAR * (FTz^ + splits_z) + else + FPz^ := FPz^ + VVAR * (FTz^ - splits_z); + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationSplits.Create; +begin + splits_x := 0; + splits_y := 0; + splits_z := 0; + splits_use3D := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationSplits.GetInstance: TBaseVariation; +begin + Result := TVariationSplits.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationSplits.GetName: string; +begin + Result := 'splits'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationSplits.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'splits_x'; + 1: Result := 'splits_y'; + 2: Result := 'splits_z'; + 3: Result := 'splits_use3D'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationSplits.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'splits_x' then begin + splits_x := Value; + Result := True; + end else if Name = 'splits_y' then begin + splits_y := Value; + Result := True; + end else if Name = 'splits_z' then begin + splits_z := Value; + Result := True; + end else if Name = 'splits_use3D' then begin + if (value < 0) then Value := 0; + if (value > 1) then Value := 1; + splits_use3D := Round(Value); + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationSplits.GetNrVariables: integer; +begin + Result := 4 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationSplits.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'splits_x' then begin + Value := splits_x; + Result := True; + end else if Name = 'splits_y' then begin + Value := splits_y; + Result := True; + end else if Name = 'splits_z' then begin + Value := splits_z; + Result := True; + end else if Name = 'splits_use3D' then begin + Value := splits_use3D; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationSplits), true, false); +end. \ No newline at end of file diff --git a/Variations/varSuperShape.pas b/Variations/varSuperShape.pas new file mode 100644 index 0000000..1c6eb80 --- /dev/null +++ b/Variations/varSuperShape.pas @@ -0,0 +1,323 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varSuperShape; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationSuperShape = class(TBaseVariation) + private + m, n1, n2, n3, rnd, holes, pa, pb: double; + inv, p: double; + + procedure CalcRnd; + public + constructor Create; + + procedure Prepare; override; + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure CalcFunction; override; + procedure GetCalcFunction(var f: TCalcFunction); override; // AV: for speed + end; + +implementation + +uses + Math; + +{ TVariationSuperShape } + +{ Optimized by Alice V. Koryagina } + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationSuperShape.Prepare; // AV: added some precalc +begin + inv := 1.0 - rnd; + p := -1 / n1; // assert (n1 <> 0) +end; + +procedure TVariationSuperShape.GetCalcFunction(var f: TCalcFunction); +begin + if rnd < 1.0 then + f := CalcFunction + else + f := CalcRnd; +end; + +procedure TVariationSuperShape.CalcFunction; +var + r, theta : double; + t1, t2, dist: double; + t1a, t2a: double; +begin +(* + theta := 0; // AV: why? + if n1 = 0 then // AV: we can check it at startup + r := 0 // AV: why? + else begin + theta := ArcTan2(FTy^, FTx^); + SinCos((m * theta + pi)/4, t2, t1); + + t1 := abs(t1); + t1 := power(t1, n2); + + t2 := abs(t2); + t2 := power(t2, n3); + + dist := power(t1 + t2, -1 / n1); // AV: we can precalc it + + // AV: why do we we check this const value at every point? + if rnd < 1.0 then + r := (rnd * random + (1.0 - rnd) * sqrt(sqr(FTx^) + sqr(FTy^))- holes) * dist + else + r := (rnd * random - holes) * dist; + end; + + if (r = 0) then // AV: useless assignments... + begin + FPx^ := FPx^; + FPy^ := FPy^; + end + else + begin + SinCos(theta, t2a, t1a); + FPx^ := FPx^ + vvar * r * t1a; + FPy^ := FPy^ + vvar * r * t2a; + end; +*) + + theta := ArcTan2(FTy^, FTx^); + SinCos((m * theta + pi)/4, t2, t1); + + t1 := abs(t1 / pa); // AV: added missng super_shape_a + t1 := power(t1, n2); + + t2 := abs(t2 / pb); // AV: added missng super_shape_b + t2 := power(t2, n3); + + dist := power(t1 + t2, p); + r := (rnd * random + inv * sqrt(sqr(FTx^) + sqr(FTy^))- holes) * dist; + + SinCos(theta, t2a, t1a); + FPx^ := FPx^ + vvar * r * t1a; + FPy^ := FPy^ + vvar * r * t2a; +end; + +procedure TVariationSuperShape.CalcRnd; // AV +var + r, theta : double; + t1, t2, dist: double; + t1a, t2a: double; +begin + theta := ArcTan2(FTy^, FTx^); + SinCos((m * theta + pi)/4, t2, t1); + + t1 := abs(t1 / pa); + t1 := power(t1, n2); + + t2 := abs(t2 / pb); + t2 := power(t2, n3); + + dist := power(t1 + t2, p); + + r := (rnd * random - holes) * dist; + + SinCos(theta, t2a, t1a); + FPx^ := FPx^ + vvar * r * t1a; + FPy^ := FPy^ + vvar * r * t2a; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationSuperShape.Create; +begin + m := 5.0; + n1 := 2.0; + n2 := 0.3; + n3 := 0.3; + rnd := 0.0; + holes := 1.0; + pa := 1; + pb := 1; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationSuperShape.GetInstance: TBaseVariation; +begin + Result := TVariationSuperShape.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationSuperShape.GetName: string; +begin + Result := 'super_shape'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationSuperShape.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'super_shape_m'; + 1: Result := 'super_shape_n1'; + 2: Result := 'super_shape_n2'; + 3: Result := 'super_shape_n3'; + 4: Result := 'super_shape_rnd'; + 5: Result := 'super_shape_holes'; + 6: Result := 'super_shape_a'; + 7: Result := 'super_shape_b'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationSuperShape.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'super_shape_m' then begin + m := Value; + Result := True; + end else if Name = 'super_shape_n1' then begin + if abs(Value) < 1E-6 then Value := 1E-6; // AV: prevent useless checks + n1 := Value; + Result := True; + end + else if Name = 'super_shape_n2' then begin + n2 := Value; + Result := True; + end + else if Name = 'super_shape_n3' then begin + n3 := Value; + Result := True; + end + else if Name = 'super_shape_rnd' then begin + if Value > 1.0 then + rnd := 1.0 + else if Value < 0.0 then + rnd := 0.0 + else + rnd := Value; + Result := True; + end + else if Name = 'super_shape_holes' then begin + holes := Value; + Result := True; + end else if Name = 'super_shape_a' then begin + if abs(Value) < 1E-4 then Value := 1E-4; + pa := Value; + Result := True; + end else if Name = 'super_shape_b' then begin + if abs(Value) < 1E-4 then Value := 1E-4; + pb := Value; + Result := True; + end; +end; + +function TVariationSuperShape.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'super_shape_m' then begin + m:= 5; + Result := True; + end else if Name = 'super_shape_n1' then begin + n1 := 2; + Result := True; + end else if Name = 'super_shape_n2' then begin + n2 := 0.3; + Result := True; + end else if Name = 'super_shape_n3' then begin + n3 := 0.3; + Result := True; + end else if Name = 'super_shape_rnd' then begin + rnd := 0; + Result := True; + end else if Name = 'super_shape_holes' then begin + holes := 1; + Result := True; + end else if Name = 'super_shape_a' then begin + pa := 1; + Result := True; + end else if Name = 'super_shape_b' then begin + pb := 1; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationSuperShape.GetNrVariables: integer; +begin + Result := 8; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationSuperShape.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'super_shape_m' then begin + Value := m; + Result := True; + end else if Name = 'super_shape_n1' then begin + Value := n1; + Result := True; + end + else if Name = 'super_shape_n2' then begin + Value := n2; + Result := True; + end + else if Name = 'super_shape_n3' then begin + Value := n3; + Result := True; + end + else if Name = 'super_shape_rnd' then begin + Value := rnd; + Result := True; + end + else if Name = 'super_shape_holes' then begin + Value := holes; + Result := True; + end else if Name = 'super_shape_a' then begin + Value := pa; + Result := True; + end else if Name = 'super_shape_b' then begin + Value := pb; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationSuperShape), false, false); +end. diff --git a/Variations/varTangent.pas b/Variations/varTangent.pas new file mode 100644 index 0000000..82f4b7c --- /dev/null +++ b/Variations/varTangent.pas @@ -0,0 +1,62 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit varTangent; + +interface +uses + BaseVariation, XFormMan; + +type + TVariationTangent = class(TBaseVariation) + private + + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +//////////////////////// + +procedure TVariationTangent.CalcFunction; +var + sx, cx, sy, cy: double; +begin + SinCos(FTx^, sx, cx); + SinCos(FTy^, sy, cy); + if cx = 0 then cx := 1e-20; + if cy = 0 then cy := 1e-20; + FPx^ := FPx^ + vvar * sx / cy; + FPy^ := FPy^ + vvar * sy / cy; + // AV: added real 3D support + FPz^ := FPz^ + vvar * sx / cx; +end; + +constructor TVariationTangent.Create; +begin + inherited Create; +end; + +class function TVariationTangent.GetInstance: TBaseVariation; +begin + Result := TVariationTangent.Create; +end; + +class function TVariationTangent.GetName: string; +begin + Result := 'tangent'; +end; + +////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationTangent), true, false); + +end. diff --git a/Variations/varTanhSpiral.pas b/Variations/varTanhSpiral.pas new file mode 100644 index 0000000..c7be793 --- /dev/null +++ b/Variations/varTanhSpiral.pas @@ -0,0 +1,117 @@ +{ + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + "Chaotica" Copyright (C) 2019 Glare Technologies Limited +} + +unit varTanhSpiral; + +interface +uses + BaseVariation, XFormMan; + +type + TVariationTanhSpiral = class(TBaseVariation) + private + ta: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +//////////////////////// + +procedure TVariationTanhSpiral.CalcFunction; +var + t, aux, sn, cn, snh, cnh: double; +begin + t := (random - 0.5) * 6.28318530717959; + + SinCos(ta * t, sn, cn); + SinhCosh(t, snh, cnh); + + aux := (cn + cnh); + if aux = 0 then aux := 1e-20; + aux := vvar / aux; + + FPx^ := FPx^ + snh * aux; + FPy^ := FPy^ + sn * aux; +end; + +constructor TVariationTanhSpiral.Create; +begin + inherited Create; + ta := 4; +end; + +class function TVariationTanhSpiral.GetInstance: TBaseVariation; +begin + Result := TVariationTanhSpiral.Create; +end; + +class function TVariationTanhSpiral.GetName: string; +begin + Result := 'tanh_spiral'; +end; + +function TVariationTanhSpiral.GetNrVariables: integer; +begin + Result := 1; +end; + +function TVariationTanhSpiral.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'tanh_spiral_a'; + else + Result := ''; + end; +end; + +function TVariationTanhSpiral.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'tanh_spiral_a' then begin + Value := ta; + Result := True; + end; +end; + +function TVariationTanhSpiral.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'tanh_spiral_a' then begin + ta := Value; + Result := True; + end; +end; + +function TVariationTanhSpiral.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'tanh_spiral_a' then begin + ta := 4; + Result := True; + end; +end; + +////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationTanhSpiral), false, false); + +end. diff --git a/Variations/varTaurus.pas b/Variations/varTaurus.pas new file mode 100644 index 0000000..2a4985f --- /dev/null +++ b/Variations/varTaurus.pas @@ -0,0 +1,179 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varTaurus; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationTaurus = class(TBaseVariation) + private + r, n, inv, sor: double; + invr, inv1, sor1: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + + procedure CalcFunction; override; + procedure Prepare; override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationTaurus.Prepare; +begin + invr := inv * r; + inv1 := (1 - inv) * r; + sor1 := 1 - sor; +end; + +procedure TVariationTaurus.CalcFunction; +var + sx, cx, sy, cy, ir: double; +begin + SinCos(FTx^, sx, cx); + SinCos(FTy^, sy, cy); + ir := invr + inv1 * cos(n * FTx^); + + FPx^ := FPx^ + VVAR * (cx * (ir + sy)); + FPy^ := FPy^ + VVAR * (sx * (ir + sy)); + FPz^ := FPz^ + VVAR * (sor * cy) + (sor1 * FTy^); +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationTaurus.Create; +begin + r := 3; + n := 5; + inv := 0; + sor := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationTaurus.GetInstance: TBaseVariation; +begin + Result := TVariationTaurus.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationTaurus.GetName: string; +begin + Result := 'taurus'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationTaurus.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'taurus_r'; + 1: Result := 'taurus_n'; + 2: Result := 'taurus_inv'; + 3: Result := 'taurus_sor'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationTaurus.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'taurus_r' then begin + r := Value; + Result := True; + end else if Name = 'taurus_n' then begin + n := Value; + Result := True; + end else if Name = 'taurus_inv' then begin + inv := Value; + Result := True; + end else if Name = 'taurus_sor' then begin + sor := Value; + Result := True; + end; +end; + +function TVariationTaurus.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'taurus_r' then begin + r := 3; + Result := True; + end else if Name = 'taurus_n' then begin + n := 5; + Result := True; + end else if Name = 'taurus_inv' then begin + inv := 0; + Result := True; + end else if Name = 'taurus_sor' then begin + sor := IfThen(sor = 0, 1, 0); + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationTaurus.GetNrVariables: integer; +begin + Result := 4; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationTaurus.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'taurus_r' then begin + Value := r; + Result := True; + end else if Name = 'taurus_n' then begin + Value := n; + Result := True; + end else if Name = 'taurus_inv' then begin + Value := inv; + Result := True; + end else if Name = 'taurus_sor' then begin + Value := sor; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationTaurus), true, false); +end. \ No newline at end of file diff --git a/Variations/varTriangleCrop.pas b/Variations/varTriangleCrop.pas new file mode 100644 index 0000000..3c73a98 --- /dev/null +++ b/Variations/varTriangleCrop.pas @@ -0,0 +1,311 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit varTriangleCrop; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationTriangleCrop = class(TBaseVariation) + private + alpha, beta, Cx, Cy, Ax, Ay: double; + mode, zero: byte; + function IsP_Inside(Cx, Cy, Px, Py: double): boolean; + procedure CalcPre; + procedure CalcPost; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + procedure GetCalcFunction(var f: TCalcFunction); override; + end; + +implementation + +uses + Math; + +{ TVariationTriangleCrop } + +/////////////////////////////////////////////////////////////////////////////// + +procedure TVariationTriangleCrop.Prepare; +var + side, gamma, sa, ca: double; +begin + gamma := (180 - alpha - beta) * pi / 180; + side := sin(beta * pi / 180) / sin(gamma); + SinCos(alpha * pi / 180, sa, ca); + Cx := side * ca; + Cy := -side * sa; +end; + +procedure TVariationTriangleCrop.GetCalcFunction(var f: TCalcFunction); +begin + case mode of + 0: f := CalcPre; + 1: f := CalcFunction; + else f := CalcPost; + end; +end; + +function TVariationTriangleCrop.IsP_Inside(Cx, Cy, Px, Py: double): boolean; +var + m, n : double; +begin + Result := False; + + m := Py / Cy; + if (m >= 0) and (m <= 1) then + begin + n := Px - m * Cx; + if (n >= 0) and ((m + n) <= 1) then + Result := True; + end; +end; + +procedure TVariationTriangleCrop.CalcPre; +var x, y, k: double; +begin + x := FTx^ - Ax; + y := FTy^ + Ay; + + if not IsP_Inside(Cx, Cy, x, y) then + begin + if (zero = 1) then + begin + x := 0; y := 0; // put the point into origin + end + else begin // put it on triangle's edge + k := random; + if (random(2) = 1) then + begin + x := k * Cx + random(2)*(1 - k); + y := k * Cy; + end else + begin + x := random(2)* k; + y := 0; + end; + end; + end; + + FTx^ := vvar * x + Ax; + FTy^ := vvar * y - Ay; +end; + +procedure TVariationTriangleCrop.CalcFunction; +var x, y, k: double; +begin + x := FTx^ - Ax; + y := FTy^ + Ay; + + if not IsP_Inside(Cx, Cy, x, y) then + begin + if (zero = 1) then + begin + x := 0; y := 0; // put the point into origin + end + else begin // put it on triangle's edge + k := random; + if (random(2) = 1) then + begin + x := k * Cx + random(2)*(1 - k); + y := k * Cy; + end else + begin + x := random(2)* k; + y := 0; + end; + end; + end; + + FPx^ := FPx^ + vvar * x + Ax; + FPy^ := FPy^ + vvar * y - Ay; +end; + +procedure TVariationTriangleCrop.CalcPost; +var x, y, k: double; +begin + x := FPx^ - Ax; + y := FPy^ + Ay; + + if not IsP_Inside(Cx, Cy, x, y) then + begin + if (zero = 1) then + begin + x := 0; y := 0; // put the point into origin + end + else begin // put it on triangle's edge + k := random; + if (random(2) = 1) then + begin + x := k * Cx + random(2)*(1 - k); + y := k * Cy; + end else + begin + x := random(2)* k; + y := 0; + end; + end; + end; + + FPx^ := vvar * x + Ax; + FPy^ := vvar * y - Ay; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationTriangleCrop.Create; +begin + alpha := 60; + beta := 60; + mode := 1; + zero := 0; + Ax := 0; + Ay := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationTriangleCrop.GetInstance: TBaseVariation; +begin + Result := TVariationTriangleCrop.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationTriangleCrop.GetName: string; +begin + Result := 'trianglecrop'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationTriangleCrop.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'trianglecrop_alpha'; + 1: Result := 'trianglecrop_beta'; + 2: Result := 'trianglecrop_Ax'; + 3: Result := 'trianglecrop_Ay'; + 4: Result := 'trianglecrop_zero_edges'; + 5: Result := 'trianglecrop_mode'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationTriangleCrop.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'trianglecrop_alpha' then begin + if (value < 1) then Value := 1; + if (value > (179 - beta)) then Value := 179 - beta; + alpha := Value; + Result := True; + end else if Name = 'trianglecrop_beta' then begin + if (value < 1) then Value := 1; + if (value > (179 - alpha)) then Value := 179 - alpha; + beta := Value; + Result := True; + end + else if Name = 'trianglecrop_mode' then begin + if (value < 0) then Value := 0; + if (value > 2) then Value := 2; + mode := Round(Value); + Result := True; + end + else if Name = 'trianglecrop_zero_edges' then begin + if (value < 0) then Value := 0; + if (value > 1) then Value := 1; + zero := Round(Value); + Result := True; + end + else if Name = 'trianglecrop_Ax' then begin + Ax := Value; + Result := True; + end + else if Name = 'trianglecrop_Ay' then begin + Ay := Value; + Result := True; + end; +end; + +function TVariationTriangleCrop.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'trianglecrop_alpha' then + begin + alpha:= 60; + Result := True; + end else if Name = 'trianglecrop_beta' then + begin + beta := 60; + Result := True; + end else if Name = 'trianglecrop_mode' then + begin + mode := 1; + Result := True; + end else if Name = 'trianglecrop_zero_edges' then + begin + zero := IfThen(zero = 1, 0, 1); + Result := True; + end + else if Name = 'trianglecrop_Ax' then begin + Ax := 0; + Result := True; + end + else if Name = 'trianglecrop_Ay' then begin + Ay := 0; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationTriangleCrop.GetNrVariables: integer; +begin + Result := 6; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationTriangleCrop.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'trianglecrop_alpha' then begin + Value := alpha; + Result := True; + end else if Name = 'trianglecrop_beta' then begin + Value := beta; + Result := True; + end else if Name = 'trianglecrop_mode' then begin + Value := mode; + Result := True; + end else if Name = 'trianglecrop_zero_edges' then begin + Value := zero; + Result := True; + end + else if Name = 'trianglecrop_Ax' then begin + Value := Ax; + Result := True; + end + else if Name = 'trianglecrop_Ay' then begin + Value := Ay; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationTriangleCrop), false, false); +end. diff --git a/Variations/varTwinTrian.pas b/Variations/varTwinTrian.pas new file mode 100644 index 0000000..48e12d8 --- /dev/null +++ b/Variations/varTwinTrian.pas @@ -0,0 +1,112 @@ +{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina } + +unit varTwinTrian; + +interface +uses + BaseVariation, XFormMan; + +type + TVariationTwinTrian = class(TBaseVariation) + private + angle: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +//////////////////////// + +procedure TVariationTwinTrian.CalcFunction; +var + r, diff, sinr, cosr: double; +begin + r := sqrt(sqr(FTx^) + sqr(FTy^)) * vvar; + SinCos(r * random, sinr, cosr); + if sinr <> 0 then + diff := Math.Log10(sinr * sinr) + cosr + else + diff := -30; + r := vvar * FTx^; + FPx^ := FPx^ + r * diff; + FPy^ := FPy^ + r * (diff - sinr * angle); +end; + +constructor TVariationTwinTrian.Create; +begin + inherited Create; + angle := pi; +end; + +class function TVariationTwinTrian.GetInstance: TBaseVariation; +begin + Result := TVariationTwinTrian.Create; +end; + +class function TVariationTwinTrian.GetName: string; +begin + Result := 'twintrian'; +end; + +function TVariationTwinTrian.GetNrVariables: integer; +begin + Result := 1; +end; + +function TVariationTwinTrian.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'twintrian_angle'; + else + Result := ''; + end; +end; + +function TVariationTwinTrian.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'twintrian_angle' then begin + Value := angle; + Result := True; + end; +end; + +function TVariationTwinTrian.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'twintrian_angle' then begin + angle := Value; + Result := True; + end; +end; + +function TVariationTwinTrian.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'twintrian_angle' then begin + angle := pi; + Result := True; + end; +end; + +////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationTwinTrian), false, false); + +end. diff --git a/Variations/varUnpolar.pas b/Variations/varUnpolar.pas new file mode 100644 index 0000000..9e21837 --- /dev/null +++ b/Variations/varUnpolar.pas @@ -0,0 +1,90 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varUnpolar; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationUnpolar = class(TBaseVariation) + private + vvar_pi: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationUnpolar.Prepare; +begin + vvar_pi := vvar / pi * 0.5; +end; + +procedure TVariationUnpolar.CalcFunction; +var + r, sn, cn: double; +begin + r := exp(FTy^); + sincos(FTx^, sn, cn); + + FPx^ := FPx^ + vvar_pi * r * sn; + FPy^ := FPy^ + vvar_pi * r * cn; + // FPz^ := FPz^ + vvar * FTz^; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationUnpolar.Create; +begin +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationUnpolar.GetInstance: TBaseVariation; +begin + Result := TVariationUnpolar.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationUnpolar.GetName: string; +begin + Result := 'unpolar'; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationUnpolar), false, false); +end. diff --git a/Variations/varWaves2.pas b/Variations/varWaves2.pas new file mode 100644 index 0000000..fa74a64 --- /dev/null +++ b/Variations/varWaves2.pas @@ -0,0 +1,188 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varWaves2; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationWaves2 = class(TBaseVariation) + private + waves2_freqx, waves2_freqy, waves2_freqz: double; + waves2_scalex, waves2_scaley, waves2_scalez: double; + + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationWaves2.Prepare; +begin +end; + +procedure TVariationWaves2.CalcFunction; +begin + FPx^ := FPx^ + VVAR * (FTx^ + waves2_scalex * sin(FTy^ * waves2_freqx)); + FPy^ := FPy^ + VVAR * (FTy^ + waves2_scaley * sin(FTx^ * waves2_freqy)); + FPz^ := FPz^ + VVAR * (FTz^ + waves2_scalez * sin(sqrt(sqr(FTx^)+sqr(FTy^)) * waves2_freqz)); +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationWaves2.Create; +begin + waves2_freqx := 2; waves2_scalex := 1; + waves2_freqy := 2; waves2_scaley := 1; + waves2_freqz := 0; waves2_scalez := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationWaves2.GetInstance: TBaseVariation; +begin + Result := TVariationWaves2.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationWaves2.GetName: string; +begin + Result := 'waves2'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationWaves2.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'waves2_freqx'; + 1: Result := 'waves2_freqy'; + 2: Result := 'waves2_freqz'; + 3: Result := 'waves2_scalex'; + 4: Result := 'waves2_scaley'; + 5: Result := 'waves2_scalez'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationWaves2.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'waves2_freqx' then begin + waves2_freqx := Value; + Result := True; + end else if Name = 'waves2_freqy' then begin + waves2_freqy := Value; + Result := True; + end else if Name = 'waves2_freqz' then begin + waves2_freqz := Value; + Result := True; + end else if Name = 'waves2_scalex' then begin + waves2_scalex := Value; + Result := True; + end else if Name = 'waves2_scaley' then begin + waves2_scaley := Value; + Result := True; + end else if Name = 'waves2_scalez' then begin + waves2_scalez := Value; + Result := True; + end +end; +function TVariationWaves2.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'waves2_freqx' then begin + waves2_freqx := 2; + Result := True; + end else if Name = 'waves2_freqy' then begin + waves2_freqy := 2; + Result := True; + end else if Name = 'waves2_freqz' then begin + waves2_freqz := 0; + Result := True; + end else if Name = 'waves2_scalex' then begin + waves2_scalex := 1; + Result := True; + end else if Name = 'waves2_scaley' then begin + waves2_scaley := 1; + Result := True; + end else if Name = 'waves2_scalez' then begin + waves2_scalez := 0; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationWaves2.GetNrVariables: integer; +begin + Result := 6 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationWaves2.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'waves2_freqx' then begin + Value := waves2_freqx; + Result := True; + end else if Name = 'waves2_freqy' then begin + Value := waves2_freqy; + Result := True; + end else if Name = 'waves2_freqz' then begin + Value := waves2_freqz; + Result := True; + end else if Name = 'waves2_scalex' then begin + Value := waves2_scalex; + Result := True; + end else if Name = 'waves2_scaley' then begin + Value := waves2_scaley; + Result := True; + end else if Name = 'waves2_scalez' then begin + Value := waves2_scalez; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationWaves2), true, false); +end. \ No newline at end of file diff --git a/Variations/varWedge.pas b/Variations/varWedge.pas new file mode 100644 index 0000000..0819e60 --- /dev/null +++ b/Variations/varWedge.pas @@ -0,0 +1,183 @@ +{ + Apophysis Copyright (C) 2001-2004 Mark Townsend + Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov + Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov + + Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov + Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + You should have received a copy of the GNU General Public License + GNU General Public License for more details. + + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +} + +unit varWedge; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationWedge = class(TBaseVariation) + private + wedge_angle, wedge_hole, wedge_swirl: double; + wedge_count : integer; + C1_2PI, comp_fac: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + +implementation + +uses + Math; + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationWedge.Prepare; +begin + C1_2PI := 0.15915494309189533576888376337251; + comp_fac := 1.0 - wedge_angle * wedge_count * C1_2PI; +end; +procedure TVariationWedge.CalcFunction; +var + r, a, cosa, sina: double; + c: integer; +begin + + r := sqrt(sqr(FTx^) + sqr(FTy^)); + a := ArcTan2(FTy^, FTx^) + wedge_swirl * r; + c := floor((wedge_count * a + PI) * C1_2PI); + a := a * comp_fac + c * wedge_angle; + SinCos(a, sina, cosa); + + r := vvar * (r + wedge_hole); + FPx^ := FPx^ + r * cosa; + FPy^ := FPy^ + r * sina; + FPz^ := FPz^ + VVAR * FTz^; +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationWedge.Create; +begin + wedge_angle := PI / 2.0; + wedge_hole := 0; + wedge_count := 2; + wedge_swirl := 0; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationWedge.GetInstance: TBaseVariation; +begin + Result := TVariationWedge.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationWedge.GetName: string; +begin + Result := 'wedge'; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationWedge.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'wedge_angle'; + 1: Result := 'wedge_hole'; + 2: Result := 'wedge_count'; + 3: Result := 'wedge_swirl'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationWedge.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'wedge_angle' then begin + wedge_angle := Value; + Result := True; + end else if Name = 'wedge_hole' then begin + wedge_hole := Value; + Result := True; + end else if Name = 'wedge_count' then begin + if (Value < 1) then Value := 1; + Value := Round(value); + wedge_count := Round(Value); + Result := True; + end else if Name = 'wedge_swirl' then begin + wedge_swirl := Value; + Result := True; + end; +end; +function TVariationWedge.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'wedge_angle' then begin + wedge_angle := PI / 2; + Result := True; + end else if Name = 'wedge_hole' then begin + wedge_hole := 0; + Result := True; + end else if Name = 'wedge_count' then begin + wedge_count := 2; + Result := True; + end else if Name = 'wedge_swirl' then begin + wedge_swirl := 0; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationWedge.GetNrVariables: integer; +begin + Result := 4 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationWedge.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'wedge_angle' then begin + Value := wedge_angle; + Result := True; + end else if Name = 'wedge_hole' then begin + Value := wedge_hole; + Result := True; + end else if Name = 'wedge_count' then begin + Value := wedge_count; + Result := True; + end else if Name = 'wedge_swirl' then begin + Value := wedge_swirl; + Result := True; + end; +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationWedge), true, false); +end. diff --git a/Variations/varZVortex.pas b/Variations/varZVortex.pas new file mode 100644 index 0000000..0c0ca26 --- /dev/null +++ b/Variations/varZVortex.pas @@ -0,0 +1,160 @@ +{ + Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina + Restored Z_ZVortex variation from Apophysis Cothe's plugin pack +} + +unit varZVortex; + +interface +uses + BaseVariation, XFormMan; + +type + TVariationZVortex = class(TBaseVariation) + private + sides: integer; + angle, spin: double; + sds2, ang2: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + function GetNrVariables: integer; override; + function GetVariableNameAt(const Index: integer): string; override; + + function SetVariable(const Name: string; var value: double): boolean; override; + function GetVariable(const Name: string; var value: double): boolean; override; + function ResetVariable(const Name: string): boolean; override; + + procedure Prepare; override; + procedure CalcFunction; override; + end; + + +implementation + +uses + Math; +//////////////////////// +procedure TVariationZVortex.Prepare; +begin + sds2 := sides * 0.5 / pi; + ang2 := angle * 0.5 * pi; +end; + +procedure TVariationZVortex.CalcFunction; +var + r, phi, t, sn, cn, sn1, cn1: double; +begin + r := Math.Hypot(FTx^, FTy^); + phi := arctan2(FTy^, FTx^); + + if (r = 0) then r := 1E-300; + t := sds2 * phi + spin * Math.log2(r); + // AV: these Z+ variations with lost sources are drive me crazy: + // they are always use vvar in a non-linear way! + t := vvar * (t - floor(t)) / sds2; + + sn := sin(ang2) * t + phi; + cn := cos(ang2) * t - 1; + + SinCos(sn, sn1, cn1); + + FPx^ := FPx^ + (r * cn1 + FTx^ * cn); + FPy^ := FPy^ + (r * sn1 + FTy^ * cn); +end; + +constructor TVariationZVortex.Create; +begin + sides := random(12) + 1; + angle := 2 * random - 1; + spin := 2 * random - 1; +end; + +class function TVariationZVortex.GetInstance: TBaseVariation; +begin + Result := TVariationZVortex.Create; +end; + +class function TVariationZVortex.GetName: string; +begin + Result := 'Z_vortex'; +end; + +function TVariationZVortex.GetNrVariables: integer; +begin + Result := 3; +end; + +function TVariationZVortex.GetVariable(const Name: string; + var value: double): boolean; +begin + Result := False; + if Name = 'Z_vortex_sides' then begin + value := sides; + Result := True; + end + else if Name = 'Z_vortex_angle' then begin + value := angle; + Result := True; + end + else if Name = 'Z_vortex_spin' then begin + value := spin; + Result := True; + end; +end; + +function TVariationZVortex.GetVariableNameAt(const Index: integer): string; +begin + case Index of + 0: Result := 'Z_vortex_sides'; + 1: Result := 'Z_vortex_angle'; + 2: Result := 'Z_vortex_spin'; + else + Result := ''; + end; +end; + +function TVariationZVortex.SetVariable(const Name: string; + var value: double): boolean; +begin + Result := False; + if Name = 'Z_vortex_sides' then begin + if Value = 0 then Value := 1; + sides := Round(value); + Result := True; + end + else if Name = 'Z_vortex_angle' then begin + angle := value; + Result := True; + end + else if Name = 'Z_vortex_spin' then begin + spin := value; + Result := True; + end; +end; + +function TVariationZVortex.ResetVariable(const Name: string): boolean; +begin + Result := False; + if Name = 'Z_vortex_sides' then begin + sides := 1; + Result := True; + end + else if Name = 'Z_vortex_angle' then begin + angle := 0; + Result := True; + end + else if Name = 'Z_vortex_spin' then begin + spin := 0; + Result := True; + end; +end; + +////////////////////////////// +initialization + RegisterVariation(TVariationClassLoader.Create(TVariationZVortex), false, false); + +end.